--- /dev/null
+Makefile
+Makefile.in
+*.lo
+*.o
+*.gmo
+*.la
+*.edj
+.deps
+.libs
+/aclocal.m4
+/arm-linux.cache
+/build-stamp
+/config.guess
+/config.h
+/config.h.in
+/config.log
+/config.status
+/config.sub
+/configure
+/debian/files
+/debian/*.debhelper.log
+/debian/*.debhelper
+/debian/*.substvars
+/debian/libisf-bin/
+/debian/libisf-dbg/
+/debian/libisf-dev/
+/debian/tmp/
+/idm/src/idm_core
+/intltool-extract
+/intltool-merge
+/intltool-update
+/isf.pc
+/ism/data/pixmaps/isf_candidate_theme1.edj
+/ism/data/pixmaps/isf_candidate_theme2.edj
+/ism/demos/isf-demo-efl
+/ism/extras/efl_panel/isf-panel-efl
+/ism/m4/argz.m4
+/ism/m4/libtool.m4
+/ism/m4/ltdl.m4
+/ism/m4/ltoptions.m4
+/ism/m4/ltsugar.m4
+/ism/m4/ltversion.m4
+/ism/m4/lt~obsolete.m4
+/ism/src/isf-log
+/ism/src/isf-query-engines
+/ism/src/scim
+/ism/src/scim-helper-launcher
+/ism/src/scim-launcher
+/ism/src/scim_types.h
+/libltdl/
+/libtool
+/ltmain.sh
+/po/isfsetting_efl/POTFILES
+/po/kbwizard_efl/POTFILES
+/po/scim/POTFILES
+/scim-gtkutils.pc
+/scim.pc
+/scim.spec
+/stamp-h1
--- /dev/null
+Notes on the Free Translation Project
+*************************************
+
+Free software is going international! The Free Translation Project is
+a way to get maintainers of free software, translators, and users all
+together, so that will gradually become able to speak many languages.
+A few packages already provide translations for their messages.
+
+ If you found this `ABOUT-NLS' file inside a distribution, you may
+assume that the distributed package does use GNU `gettext' internally,
+itself available at your nearest GNU archive site. But you do _not_
+need to install GNU `gettext' prior to configuring, installing or using
+this package with messages translated.
+
+ Installers will find here some useful hints. These notes also
+explain how users should proceed for getting the programs to use the
+available translations. They tell how people wanting to contribute and
+work at translations should contact the appropriate team.
+
+ When reporting bugs in the `intl/' directory or bugs which may be
+related to internationalization, you should tell about the version of
+`gettext' which is used. The information can be found in the
+`intl/VERSION' file, in internationalized packages.
+
+Quick configuration advice
+==========================
+
+If you want to exploit the full power of internationalization, you
+should configure it using
+
+ ./configure --with-included-gettext
+
+to force usage of internationalizing routines provided within this
+package, despite the existence of internationalizing capabilities in the
+operating system where this package is being installed. So far, only
+the `gettext' implementation in the GNU C library version 2 provides as
+many features (such as locale alias, message inheritance, automatic
+charset conversion or plural form handling) as the implementation here.
+It is also not possible to offer this additional functionality on top
+of a `catgets' implementation. Future versions of GNU `gettext' will
+very likely convey even more functionality. So it might be a good idea
+to change to GNU `gettext' as soon as possible.
+
+ So you need _not_ provide this option if you are using GNU libc 2 or
+you have installed a recent copy of the GNU gettext package with the
+included `libintl'.
+
+INSTALL Matters
+===============
+
+Some packages are "localizable" when properly installed; the programs
+they contain can be made to speak your own native language. Most such
+packages use GNU `gettext'. Other packages have their own ways to
+internationalization, predating GNU `gettext'.
+
+ By default, this package will be installed to allow translation of
+messages. It will automatically detect whether the system already
+provides the GNU `gettext' functions. If not, the GNU `gettext' own
+library will be used. This library is wholly contained within this
+package, usually in the `intl/' subdirectory, so prior installation of
+the GNU `gettext' package is _not_ required. Installers may use
+special options at configuration time for changing the default
+behaviour. The commands:
+
+ ./configure --with-included-gettext
+ ./configure --disable-nls
+
+will respectively bypass any pre-existing `gettext' to use the
+internationalizing routines provided within this package, or else,
+_totally_ disable translation of messages.
+
+ When you already have GNU `gettext' installed on your system and run
+configure without an option for your new package, `configure' will
+probably detect the previously built and installed `libintl.a' file and
+will decide to use this. This might be not what is desirable. You
+should use the more recent version of the GNU `gettext' library. I.e.
+if the file `intl/VERSION' shows that the library which comes with this
+package is more recent, you should use
+
+ ./configure --with-included-gettext
+
+to prevent auto-detection.
+
+ The configuration process will not test for the `catgets' function
+and therefore it will not be used. The reason is that even an
+emulation of `gettext' on top of `catgets' could not provide all the
+extensions of the GNU `gettext' library.
+
+ Internationalized packages have usually many `po/LL.po' files, where
+LL gives an ISO 639 two-letter code identifying the language. Unless
+translations have been forbidden at `configure' time by using the
+`--disable-nls' switch, all available translations are installed
+together with the package. However, the environment variable `LINGUAS'
+may be set, prior to configuration, to limit the installed set.
+`LINGUAS' should then contain a space separated list of two-letter
+codes, stating which languages are allowed.
+
+Using This Package
+==================
+
+As a user, if your language has been installed for this package, you
+only have to set the `LANG' environment variable to the appropriate
+`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code,
+and `CC' is an ISO 3166 two-letter country code. For example, let's
+suppose that you speak German and live in Germany. At the shell
+prompt, merely execute `setenv LANG de_DE' (in `csh'),
+`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash').
+This can be done from your `.login' or `.profile' file, once and for
+all.
+
+ You might think that the country code specification is redundant.
+But in fact, some languages have dialects in different countries. For
+example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The
+country code serves to distinguish the dialects.
+
+ The locale naming convention of `LL_CC', with `LL' denoting the
+language and `CC' denoting the country, is the one use on systems based
+on GNU libc. On other systems, some variations of this scheme are
+used, such as `LL' or `LL_CC.ENCODING'. You can get the list of
+locales supported by your system for your country by running the command
+`locale -a | grep '^LL''.
+
+ Not all programs have translations for all languages. By default, an
+English message is shown in place of a nonexistent translation. If you
+understand other languages, you can set up a priority list of languages.
+This is done through a different environment variable, called
+`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG'
+for the purpose of message handling, but you still need to have `LANG'
+set to the primary language; this is required by other parts of the
+system libraries. For example, some Swedish users who would rather
+read translations in German than English for when Swedish is not
+available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'.
+
+ Special advice for Norwegian users: The language code for Norwegian
+bokma*l changed from `no' to `nb' recently (in 2003). During the
+transition period, while some message catalogs for this language are
+installed under `nb' and some older ones under `no', it's recommended
+for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and
+older translations are used.
+
+ In the `LANGUAGE' environment variable, but not in the `LANG'
+environment variable, `LL_CC' combinations can be abbreviated as `LL'
+to denote the language's main dialect. For example, `de' is equivalent
+to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
+(Portuguese as spoken in Portugal) in this context.
+
+Translating Teams
+=================
+
+For the Free Translation Project to be a success, we need interested
+people who like their own language and write it well, and who are also
+able to synergize with other translators speaking the same language.
+Each translation team has its own mailing list. The up-to-date list of
+teams can be found at the Free Translation Project's homepage,
+`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams"
+area.
+
+ If you'd like to volunteer to _work_ at translating messages, you
+should become a member of the translating team for your own language.
+The subscribing address is _not_ the same as the list itself, it has
+`-request' appended. For example, speakers of Swedish can send a
+message to `sv-request@li.org', having this message body:
+
+ subscribe
+
+ Keep in mind that team members are expected to participate
+_actively_ in translations, or at solving translational difficulties,
+rather than merely lurking around. If your team does not exist yet and
+you want to start one, or if you are unsure about what to do or how to
+get started, please write to `translation@iro.umontreal.ca' to reach the
+coordinator for all translator teams.
+
+ The English team is special. It works at improving and uniformizing
+the terminology in use. Proven linguistic skill are praised more than
+programming skill, here.
+
+Available Packages
+==================
+
+Languages are not equally supported in all packages. The following
+matrix shows the current state of internationalization, as of January
+2004. The matrix shows, in regard of each package, for which languages
+PO files have been submitted to translation coordination, with a
+translation percentage of at least 50%.
+
+ Ready PO files af am ar az be bg bs ca cs da de el en en_GB eo es
+ +----------------------------------------------------+
+ a2ps | [] [] [] [] |
+ aegis | () |
+ ant-phone | () |
+ anubis | |
+ ap-utils | |
+ aspell | [] |
+ bash | [] [] [] [] |
+ batchelor | |
+ bfd | [] [] |
+ binutils | [] [] |
+ bison | [] [] [] |
+ bluez-pin | [] [] [] |
+ clisp | |
+ clisp | [] [] [] |
+ console-tools | [] [] |
+ coreutils | [] [] [] [] |
+ cpio | [] [] [] |
+ darkstat | [] () [] |
+ diffutils | [] [] [] [] [] [] [] |
+ e2fsprogs | [] [] [] |
+ enscript | [] [] [] [] |
+ error | [] [] [] [] [] |
+ fetchmail | [] () [] [] [] [] |
+ fileutils | [] [] [] |
+ findutils | [] [] [] [] [] [] [] |
+ flex | [] [] [] [] |
+ fslint | |
+ gas | [] |
+ gawk | [] [] [] [] |
+ gbiff | [] |
+ gcal | [] |
+ gcc | [] [] |
+ gettext | [] [] [] [] [] |
+ gettext-examples | [] [] [] [] |
+ gettext-runtime | [] [] [] [] [] |
+ gettext-tools | [] [] [] |
+ gimp-print | [] [] [] [] [] |
+ gliv | |
+ glunarclock | [] [] |
+ gnubiff | [] |
+ gnucash | [] () [] [] |
+ gnucash-glossary | [] () [] |
+ gnupg | [] () [] [] [] [] |
+ gpe-aerial | [] |
+ gpe-beam | [] [] |
+ gpe-calendar | [] [] |
+ gpe-clock | [] [] |
+ gpe-conf | [] [] |
+ gpe-contacts | [] [] |
+ gpe-edit | [] |
+ gpe-go | [] |
+ gpe-login | [] [] |
+ gpe-ownerinfo | [] [] |
+ gpe-sketchbook | [] [] |
+ gpe-su | [] [] |
+ gpe-taskmanager | [] [] |
+ gpe-timesheet | [] |
+ gpe-today | [] [] |
+ gpe-todo | [] [] |
+ gphoto2 | [] [] [] [] |
+ gprof | [] [] [] |
+ gpsdrive | () () () |
+ gramadoir | [] |
+ grep | [] [] [] [] [] [] |
+ gretl | [] |
+ gtick | [] () |
+ hello | [] [] [] [] [] [] |
+ id-utils | [] [] |
+ indent | [] [] [] [] |
+ iso_3166 | [] [] [] [] [] [] [] [] [] [] |
+ iso_3166_1 | [] [] [] [] [] [] |
+ iso_3166_2 | |
+ iso_3166_3 | [] |
+ iso_4217 | [] [] [] [] |
+ iso_639 | |
+ jpilot | [] [] [] |
+ jtag | |
+ jwhois | [] |
+ kbd | [] [] [] [] [] |
+ latrine | () |
+ ld | [] [] |
+ libc | [] [] [] [] [] [] |
+ libgpewidget | [] [] |
+ libiconv | [] [] [] [] [] |
+ lifelines | [] () |
+ lilypond | [] |
+ lingoteach | |
+ lingoteach_lessons | () () |
+ lynx | [] [] [] [] |
+ m4 | [] [] [] [] |
+ mailutils | [] [] |
+ make | [] [] [] |
+ man-db | [] () [] [] () |
+ minicom | [] [] [] |
+ mysecretdiary | [] [] [] |
+ nano | [] () [] [] [] |
+ nano_1_0 | [] () [] [] [] |
+ opcodes | [] |
+ parted | [] [] [] [] [] |
+ ptx | [] [] [] [] [] |
+ python | |
+ radius | [] |
+ recode | [] [] [] [] [] [] [] |
+ rpm | [] [] |
+ screem | |
+ scrollkeeper | [] [] [] [] [] [] |
+ sed | [] [] [] [] [] [] |
+ sh-utils | [] [] [] |
+ shared-mime-info | |
+ sharutils | [] [] [] [] [] [] |
+ silky | () |
+ skencil | [] () [] |
+ sketch | [] () [] |
+ soundtracker | [] [] [] |
+ sp | [] |
+ tar | [] [] [] [] |
+ texinfo | [] [] [] |
+ textutils | [] [] [] [] |
+ tin | () () |
+ tp-robot | |
+ tuxpaint | [] [] [] [] [] [] [] |
+ unicode-han-tra... | |
+ unicode-transla... | |
+ util-linux | [] [] [] [] [] |
+ vorbis-tools | [] [] [] [] |
+ wastesedge | () |
+ wdiff | [] [] [] [] |
+ wget | [] [] [] [] [] [] |
+ xchat | [] [] [] [] |
+ xfree86_xkb_xml | [] [] |
+ xpad | [] |
+ +----------------------------------------------------+
+ af am ar az be bg bs ca cs da de el en en_GB eo es
+ 4 0 0 1 9 4 1 40 41 60 78 17 1 5 13 68
+
+ et eu fa fi fr ga gl he hr hu id is it ja ko lg
+ +-------------------------------------------------+
+ a2ps | [] [] [] () () |
+ aegis | |
+ ant-phone | [] |
+ anubis | [] |
+ ap-utils | [] |
+ aspell | [] [] |
+ bash | [] [] |
+ batchelor | [] [] |
+ bfd | [] |
+ binutils | [] [] |
+ bison | [] [] [] [] |
+ bluez-pin | [] [] [] [] [] |
+ clisp | |
+ clisp | [] |
+ console-tools | |
+ coreutils | [] [] [] [] [] [] |
+ cpio | [] [] [] [] |
+ darkstat | () [] [] [] |
+ diffutils | [] [] [] [] [] [] [] |
+ e2fsprogs | |
+ enscript | [] [] |
+ error | [] [] [] [] |
+ fetchmail | [] |
+ fileutils | [] [] [] [] [] [] |
+ findutils | [] [] [] [] [] [] [] [] [] [] [] |
+ flex | [] [] [] |
+ fslint | [] |
+ gas | [] |
+ gawk | [] [] [] |
+ gbiff | [] |
+ gcal | [] |
+ gcc | [] |
+ gettext | [] [] [] |
+ gettext-examples | [] [] |
+ gettext-runtime | [] [] [] [] [] |
+ gettext-tools | [] [] [] |
+ gimp-print | [] [] |
+ gliv | () |
+ glunarclock | [] [] [] [] |
+ gnubiff | [] |
+ gnucash | () [] |
+ gnucash-glossary | [] |
+ gnupg | [] [] [] [] [] [] [] |
+ gpe-aerial | [] |
+ gpe-beam | [] |
+ gpe-calendar | [] [] [] |
+ gpe-clock | [] |
+ gpe-conf | [] |
+ gpe-contacts | [] [] |
+ gpe-edit | [] [] |
+ gpe-go | [] |
+ gpe-login | [] [] |
+ gpe-ownerinfo | [] [] [] |
+ gpe-sketchbook | [] |
+ gpe-su | [] |
+ gpe-taskmanager | [] |
+ gpe-timesheet | [] [] [] |
+ gpe-today | [] [] |
+ gpe-todo | [] [] |
+ gphoto2 | [] [] [] |
+ gprof | [] [] |
+ gpsdrive | () () () |
+ gramadoir | [] [] |
+ grep | [] [] [] [] [] [] [] [] [] [] [] |
+ gretl | [] [] |
+ gtick | [] [] [] |
+ hello | [] [] [] [] [] [] [] [] [] [] [] [] [] |
+ id-utils | [] [] [] [] |
+ indent | [] [] [] [] [] [] [] [] [] |
+ iso_3166 | [] [] [] [] [] [] [] |
+ iso_3166_1 | [] [] [] [] [] |
+ iso_3166_2 | |
+ iso_3166_3 | |
+ iso_4217 | [] [] [] [] [] [] |
+ iso_639 | |
+ jpilot | [] () |
+ jtag | [] |
+ jwhois | [] [] [] [] |
+ kbd | [] |
+ latrine | [] |
+ ld | [] |
+ libc | [] [] [] [] [] [] |
+ libgpewidget | [] [] [] [] |
+ libiconv | [] [] [] [] [] [] [] [] [] |
+ lifelines | () |
+ lilypond | [] |
+ lingoteach | [] [] |
+ lingoteach_lessons | |
+ lynx | [] [] [] [] |
+ m4 | [] [] [] [] |
+ mailutils | |
+ make | [] [] [] [] [] [] |
+ man-db | () () |
+ minicom | [] [] [] [] |
+ mysecretdiary | [] [] |
+ nano | [] [] [] [] |
+ nano_1_0 | [] [] [] [] |
+ opcodes | [] |
+ parted | [] [] [] |
+ ptx | [] [] [] [] [] [] [] |
+ python | |
+ radius | [] |
+ recode | [] [] [] [] [] [] |
+ rpm | [] [] |
+ screem | |
+ scrollkeeper | [] |
+ sed | [] [] [] [] [] [] [] [] [] |
+ sh-utils | [] [] [] [] [] [] [] |
+ shared-mime-info | [] [] [] |
+ sharutils | [] [] [] [] [] |
+ silky | () [] () () |
+ skencil | [] |
+ sketch | [] |
+ soundtracker | [] [] |
+ sp | [] () |
+ tar | [] [] [] [] [] [] [] [] [] |
+ texinfo | [] [] [] [] |
+ textutils | [] [] [] [] [] [] |
+ tin | [] () |
+ tp-robot | [] |
+ tuxpaint | [] [] [] [] [] [] [] [] [] |
+ unicode-han-tra... | |
+ unicode-transla... | [] [] |
+ util-linux | [] [] [] [] () [] |
+ vorbis-tools | [] |
+ wastesedge | () |
+ wdiff | [] [] [] [] [] [] |
+ wget | [] [] [] [] [] [] [] |
+ xchat | [] [] [] |
+ xfree86_xkb_xml | [] [] |
+ xpad | [] [] |
+ +-------------------------------------------------+
+ et eu fa fi fr ga gl he hr hu id is it ja ko lg
+ 22 2 1 26 106 28 24 8 10 41 33 1 26 33 12 0
+
+ lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru
+ +-----------------------------------------------------+
+ a2ps | [] [] () () [] [] [] |
+ aegis | () () () |
+ ant-phone | [] [] |
+ anubis | [] [] [] [] [] [] |
+ ap-utils | [] () [] |
+ aspell | [] |
+ bash | [] [] [] |
+ batchelor | [] |
+ bfd | [] |
+ binutils | [] |
+ bison | [] [] [] [] [] |
+ bluez-pin | [] [] [] |
+ clisp | |
+ clisp | [] |
+ console-tools | [] |
+ coreutils | [] [] |
+ cpio | [] [] [] [] [] |
+ darkstat | [] [] [] [] |
+ diffutils | [] [] [] [] [] [] |
+ e2fsprogs | [] |
+ enscript | [] [] [] [] |
+ error | [] [] [] |
+ fetchmail | [] [] () [] |
+ fileutils | [] [] [] |
+ findutils | [] [] [] [] [] |
+ flex | [] [] [] [] |
+ fslint | [] [] |
+ gas | |
+ gawk | [] [] [] |
+ gbiff | [] [] |
+ gcal | |
+ gcc | |
+ gettext | [] [] [] |
+ gettext-examples | [] [] [] |
+ gettext-runtime | [] [] [] [] |
+ gettext-tools | [] [] |
+ gimp-print | [] |
+ gliv | [] [] [] |
+ glunarclock | [] [] [] [] |
+ gnubiff | [] |
+ gnucash | [] [] () [] |
+ gnucash-glossary | [] [] |
+ gnupg | [] |
+ gpe-aerial | [] [] [] [] |
+ gpe-beam | [] [] [] [] |
+ gpe-calendar | [] [] [] [] |
+ gpe-clock | [] [] [] [] |
+ gpe-conf | [] [] [] [] |
+ gpe-contacts | [] [] [] [] |
+ gpe-edit | [] [] [] [] |
+ gpe-go | [] [] [] |
+ gpe-login | [] [] [] [] |
+ gpe-ownerinfo | [] [] [] [] |
+ gpe-sketchbook | [] [] [] [] |
+ gpe-su | [] [] [] [] |
+ gpe-taskmanager | [] [] [] [] |
+ gpe-timesheet | [] [] [] [] |
+ gpe-today | [] [] [] [] |
+ gpe-todo | [] [] [] [] |
+ gphoto2 | [] |
+ gprof | [] [] |
+ gpsdrive | () () [] |
+ gramadoir | () [] |
+ grep | [] [] [] [] [] |
+ gretl | |
+ gtick | [] [] [] |
+ hello | [] [] [] [] [] [] [] [] [] [] |
+ id-utils | [] [] [] [] |
+ indent | [] [] [] [] |
+ iso_3166 | [] [] [] |
+ iso_3166_1 | [] [] |
+ iso_3166_2 | |
+ iso_3166_3 | [] |
+ iso_4217 | [] [] [] [] [] [] [] [] |
+ iso_639 | [] |
+ jpilot | () () |
+ jtag | |
+ jwhois | [] [] [] [] () |
+ kbd | [] [] [] |
+ latrine | [] |
+ ld | |
+ libc | [] [] [] [] |
+ libgpewidget | [] [] [] |
+ libiconv | [] [] [] [] [] |
+ lifelines | |
+ lilypond | |
+ lingoteach | |
+ lingoteach_lessons | |
+ lynx | [] [] [] |
+ m4 | [] [] [] [] [] |
+ mailutils | [] [] [] |
+ make | [] [] [] [] |
+ man-db | [] |
+ minicom | [] [] [] [] |
+ mysecretdiary | [] [] [] |
+ nano | [] [] [] [] [] |
+ nano_1_0 | [] [] [] [] [] [] |
+ opcodes | [] [] |
+ parted | [] [] [] [] |
+ ptx | [] [] [] [] [] [] [] [] |
+ python | |
+ radius | [] [] |
+ recode | [] [] [] [] |
+ rpm | [] [] [] |
+ screem | |
+ scrollkeeper | [] [] [] [] [] |
+ sed | [] [] [] |
+ sh-utils | [] [] |
+ shared-mime-info | [] [] |
+ sharutils | [] [] |
+ silky | () |
+ skencil | [] [] |
+ sketch | [] [] |
+ soundtracker | |
+ sp | |
+ tar | [] [] [] [] [] [] |
+ texinfo | [] [] [] [] |
+ textutils | [] [] |
+ tin | |
+ tp-robot | [] |
+ tuxpaint | [] [] [] [] [] [] [] [] |
+ unicode-han-tra... | |
+ unicode-transla... | |
+ util-linux | [] [] [] |
+ vorbis-tools | [] [] [] |
+ wastesedge | |
+ wdiff | [] [] [] [] [] |
+ wget | [] [] [] |
+ xchat | [] [] [] |
+ xfree86_xkb_xml | [] [] |
+ xpad | [] [] |
+ +-----------------------------------------------------+
+ lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru
+ 1 2 0 3 12 0 10 69 6 7 1 40 26 36 76 63
+
+ sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu
+ +-----------------------------------------------------+
+ a2ps | [] [] [] [] | 16
+ aegis | | 0
+ ant-phone | | 3
+ anubis | [] [] | 9
+ ap-utils | () | 3
+ aspell | | 4
+ bash | | 9
+ batchelor | | 3
+ bfd | [] [] | 6
+ binutils | [] [] [] | 8
+ bison | [] [] | 14
+ bluez-pin | [] [] [] | 14
+ clisp | | 0
+ clisp | | 5
+ console-tools | | 3
+ coreutils | [] [] [] [] | 16
+ cpio | [] [] | 14
+ darkstat | [] [] [] () () | 12
+ diffutils | [] [] [] | 23
+ e2fsprogs | [] [] | 6
+ enscript | [] [] | 12
+ error | [] [] [] | 15
+ fetchmail | [] [] | 11
+ fileutils | [] [] [] [] [] | 17
+ findutils | [] [] [] [] [] [] | 29
+ flex | [] [] | 13
+ fslint | | 3
+ gas | [] | 3
+ gawk | [] [] | 12
+ gbiff | | 4
+ gcal | [] [] | 4
+ gcc | [] | 4
+ gettext | [] [] [] [] [] | 16
+ gettext-examples | [] [] [] [] [] | 14
+ gettext-runtime | [] [] [] [] [] [] [] [] | 22
+ gettext-tools | [] [] [] [] [] [] | 14
+ gimp-print | [] [] | 10
+ gliv | | 3
+ glunarclock | [] [] [] | 13
+ gnubiff | | 3
+ gnucash | [] [] | 9
+ gnucash-glossary | [] [] [] | 8
+ gnupg | [] [] [] [] | 17
+ gpe-aerial | [] | 7
+ gpe-beam | [] | 8
+ gpe-calendar | [] [] [] [] | 13
+ gpe-clock | [] [] [] | 10
+ gpe-conf | [] [] | 9
+ gpe-contacts | [] [] [] | 11
+ gpe-edit | [] [] [] [] [] | 12
+ gpe-go | | 5
+ gpe-login | [] [] [] [] [] | 13
+ gpe-ownerinfo | [] [] [] [] | 13
+ gpe-sketchbook | [] [] | 9
+ gpe-su | [] [] [] | 10
+ gpe-taskmanager | [] [] [] | 10
+ gpe-timesheet | [] [] [] [] | 12
+ gpe-today | [] [] [] [] [] | 13
+ gpe-todo | [] [] [] [] | 12
+ gphoto2 | [] [] [] | 11
+ gprof | [] [] | 9
+ gpsdrive | [] [] | 3
+ gramadoir | [] | 5
+ grep | [] [] [] [] | 26
+ gretl | | 3
+ gtick | | 7
+ hello | [] [] [] [] [] | 34
+ id-utils | [] [] | 12
+ indent | [] [] [] [] | 21
+ iso_3166 | [] [] [] [] [] [] [] | 27
+ iso_3166_1 | [] [] [] | 16
+ iso_3166_2 | | 0
+ iso_3166_3 | | 2
+ iso_4217 | [] [] [] [] [] [] | 24
+ iso_639 | | 1
+ jpilot | [] [] [] [] [] | 9
+ jtag | [] | 2
+ jwhois | () [] [] | 11
+ kbd | [] [] | 11
+ latrine | | 2
+ ld | [] [] | 5
+ libc | [] [] [] [] | 20
+ libgpewidget | [] [] [] [] | 13
+ libiconv | [] [] [] [] [] [] [] [] | 27
+ lifelines | [] | 2
+ lilypond | [] | 3
+ lingoteach | | 2
+ lingoteach_lessons | () | 0
+ lynx | [] [] [] | 14
+ m4 | [] [] | 15
+ mailutils | | 5
+ make | [] [] [] | 16
+ man-db | [] | 5
+ minicom | | 11
+ mysecretdiary | [] [] | 10
+ nano | [] [] [] [] | 17
+ nano_1_0 | [] [] [] | 17
+ opcodes | [] [] | 6
+ parted | [] [] [] | 15
+ ptx | [] [] | 22
+ python | | 0
+ radius | | 4
+ recode | [] [] [] | 20
+ rpm | [] [] | 9
+ screem | [] [] | 2
+ scrollkeeper | [] [] [] | 15
+ sed | [] [] [] [] [] [] | 24
+ sh-utils | [] [] | 14
+ shared-mime-info | [] [] | 7
+ sharutils | [] [] [] [] | 17
+ silky | () | 3
+ skencil | [] | 6
+ sketch | [] | 6
+ soundtracker | [] [] | 7
+ sp | [] | 3
+ tar | [] [] [] [] [] | 24
+ texinfo | [] [] [] | 14
+ textutils | [] [] [] [] | 16
+ tin | | 1
+ tp-robot | | 2
+ tuxpaint | [] [] [] [] [] | 29
+ unicode-han-tra... | | 0
+ unicode-transla... | | 2
+ util-linux | [] [] | 15
+ vorbis-tools | | 8
+ wastesedge | | 0
+ wdiff | [] [] [] | 18
+ wget | [] [] [] [] [] [] [] [] | 24
+ xchat | [] [] [] [] [] | 15
+ xfree86_xkb_xml | [] [] [] [] [] | 11
+ xpad | | 5
+ +-----------------------------------------------------+
+ 63 teams sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu
+ 131 domains 47 19 28 83 0 0 59 13 1 1 11 0 22 22 0 1373
+
+ Some counters in the preceding matrix are higher than the number of
+visible blocks let us expect. This is because a few extra PO files are
+used for implementing regional variants of languages, or language
+dialects.
+
+ For a PO file in the matrix above to be effective, the package to
+which it applies should also have been internationalized and
+distributed as such by its maintainer. There might be an observable
+lag between the mere existence a PO file and its wide availability in a
+distribution.
+
+ If January 2004 seems to be old, you may fetch a more recent copy of
+this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date
+matrix with full percentage details can be found at
+`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'.
+
+Using `gettext' in new packages
+===============================
+
+If you are writing a freely available program and want to
+internationalize it you are welcome to use GNU `gettext' in your
+package. Of course you have to respect the GNU Library General Public
+License which covers the use of the GNU `gettext' library. This means
+in particular that even non-free programs can use `libintl' as a shared
+library, whereas only free software can use `libintl' as a static
+library or use modified versions of `libintl'.
+
+ Once the sources are changed appropriately and the setup can handle
+the use of `gettext' the only thing missing are the translations. The
+Free Translation Project is also available for packages which are not
+developed inside the GNU project. Therefore the information given above
+applies also for every other Free Software Project. Contact
+`translation@iro.umontreal.ca' to make the `.pot' files available to
+the translation teams.
+
--- /dev/null
+
+Main authors:
+=============
+ James Su <suzhe@tsinghua.org.cn>
+
+Developers:
+===========
+ LiuCougar <liucougar@gmail.com>
+ Sehwan Park <sehwan@samsung.com>
+ Hengliang Luo <hl.luo@samsung.com>
+ Haifeng Deng <haifeng.deng@samsung.com>
+ Shuo Liu <shuo0805.liu@samsung.com>
+ Jihoon Kim <jihoon48.kim@samsung.com>
+ Jihoon Lee <dalton.lee@samsung.com>
+
+zh_TW.po:
+=========
+ Tetralet <tetralet@pchome.com.tw>
+ Jim Huang <jserv@kaffe.org>
+
+ja.po:
+======
+Yukiko Bando <ybando@k6.dion.ne.jp>
+
+ko.po:
+======
+Kitae <kitae@spymac.com>
+
+de.po:
+======
+Jan Hefti <j.hefti@hamburg.de>
+
+fr.po:
+======
+Damien Menanteau <damien.menanteau@cegetel.net>
+
+it.po:
+======
+Federico Zenith <zenith@chemeng.ntnu.no>
+
+pa.po
+======
+Amanpreet Singh Alam <amanpreetsinghalam@yahoo.com>
--- /dev/null
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+\f
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+\f
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+\f
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+\f
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+\f
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+\f
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+\f
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+\f
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+\f
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
--- /dev/null
+2008-08-22 16:30 Haifeng Deng <haifeng.deng@samsung.com>
+
+ 1. : Add NewISE
+ 2. : Add IDM\src into ISF
+
+2008-08-15 10:30 Haifeng Deng <haifeng.deng@samsung.com>
+
+ 1. : Add SConscript and control.in for xo build
+ 2. : Add IDM\input_driver\IDM_Camera into ISF
+
+2008-07-18 17:03 Wei Ye <wei.ye@samsung.com>
+
+ Merge the function of helper manager server into SocketFrontEnd.
+
+2008-07-16 14:30 Haifeng Deng <haifeng.deng@samsung.com>
+
+ 1. : Delete docs, tests, X11 FrontEnd, X11 Utility, RawCode IMEngine, FrontEnd Setup, Panel Setup and IMEngine Setup
+ 2. : Move SetupUI into Panel process£¬delete Setup Helper£¬only reserve setup function for each ISE
+
+2007-06-26 14:25 James Su <suzhe@tsinghua.org.cn>
+
+ * .: Make 1.4.7 branch.
+
+2007-06-26 03:40 James Su <suzhe@tsinghua.org.cn>
+
+ * : Bump verison to 1.4.7.
+
+2007-06-26 02:37 James Su <suzhe@tsinghua.org.cn>
+
+ * : Fix include file issue.
+
+2007-06-22 18:44 James Su <suzhe@tsinghua.org.cn>
+
+ * : Update po files.
+
+2007-06-22 17:15 James Su <suzhe@tsinghua.org.cn>
+
+ * : Fix high power consumption issue.
+
+2007-06-22 02:35 James Su <suzhe@tsinghua.org.cn>
+
+ * : Add missing headers.
+
+2007-06-22 02:33 James Su <suzhe@tsinghua.org.cn>
+
+ * : Add missing header.
+
+2007-06-22 00:10 James Su <suzhe@tsinghua.org.cn>
+
+ * : Use svn2cl to generate ChangeLog.
+
+2007-06-21 23:47 James Su <suzhe@tsinghua.org.cn>
+
+ * : Fix buggy implementation of Socket read/write/wait methods.
+ copied from trunk.
+
+2007-06-19 06:21 James Su <suzhe@tsinghua.org.cn>
+
+ * : Add some debug message. Avoid a already focused IC to be
+ focused again.
+
+2007-06-17 07:18 James Su <suzhe@tsinghua.org.cn>
+
+ * : Make 1.4 branch.
+
+2007-06-17 07:15 James Su <suzhe@tsinghua.org.cn>
+
+ * : Move scim-trunk (the head) to scim/trunk.
+
+2007-06-17 07:13 James Su <suzhe@tsinghua.org.cn>
+
+ * : Rename scim to trunk.
+
+2007-06-17 07:09 James Su <suzhe@tsinghua.org.cn>
+
+ * : Initial import scim 1.4 branch into svn as trunk.
+
--- /dev/null
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
+2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved. This file is offered as-is,
+without warranty of any kind.
+
+Basic Installation
+==================
+
+ Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package. The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package. Some packages provide this
+`INSTALL' file but do not implement all of the features documented
+below. The lack of an optional feature in a given package is not
+necessarily a bug. More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+ It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring. Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+ The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'. You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+ The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system.
+
+ Running `configure' might take a while. While running, it prints
+ some messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package, generally using the just-built uninstalled binaries.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation. When installing into a prefix owned by root, it is
+ recommended that the package be configured and built as a regular
+ user, and only the `make install' phase executed with root
+ privileges.
+
+ 5. Optionally, type `make installcheck' to repeat any self-tests, but
+ this time using the binaries in their final installed location.
+ This target does not install anything. Running this target as a
+ regular user, particularly if the prior `make install' required
+ root privileges, verifies that the installation completed
+ correctly.
+
+ 6. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+ 7. Often, you can also type `make uninstall' to remove the installed
+ files again. In practice, not all packages have tested that
+ uninstallation works correctly, even though it is required by the
+ GNU Coding Standards.
+
+ 8. Some packages, particularly those that use Automake, provide `make
+ distcheck', which can by used by developers to test that all other
+ targets like `make install' and `make uninstall' work correctly.
+ This target is generally not run by end users.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+ You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment. Here
+is an example:
+
+ ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you can use GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'. This
+is known as a "VPATH" build.
+
+ With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory. After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+ On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor. Like
+this:
+
+ ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CPP="gcc -E" CXXCPP="g++ -E"
+
+ This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
+Installation Names
+==================
+
+ By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc. You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX', where PREFIX must be an
+absolute file name.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them. In general, the
+default for these options is expressed in terms of `${prefix}', so that
+specifying just `--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+ The most portable way to affect installation locations is to pass the
+correct locations to `configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+`make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+ The first method involves providing an override variable for each
+affected directory. For example, `make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+`${prefix}'. Any directories that were specified during `configure',
+but not in terms of `${prefix}', must each be overridden at install
+time for the entire installation to be relocated. The approach of
+makefile variable overrides for each directory variable is required by
+the GNU Coding Standards, and ideally causes no recompilation.
+However, some platforms have known limitations with the semantics of
+shared libraries that end up requiring recompilation when using this
+method, particularly noticeable in packages that use GNU Libtool.
+
+ The second method involves providing the `DESTDIR' variable. For
+example, `make install DESTDIR=/alternate/directory' will prepend
+`/alternate/directory' before all installation names. The approach of
+`DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters. On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of `${prefix}'
+at `configure' time.
+
+Optional Features
+=================
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+ Some packages offer the ability to configure how verbose the
+execution of `make' will be. For these packages, running `./configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with `make V=1'; while running `./configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with `make V=0'.
+
+Particular systems
+==================
+
+ On HP-UX, the default C compiler is not ANSI C compatible. If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+ ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+ On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file. The option `-nodtk' can be used as
+a workaround. If GNU CC is not installed, it is therefore recommended
+to try
+
+ ./configure CC="cc"
+
+and if that doesn't work, try
+
+ ./configure CC="cc -nodtk"
+
+ On Solaris, don't put `/usr/ucb' early in your `PATH'. This
+directory contains several dysfunctional programs; working variants of
+these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
+in your `PATH', put it _after_ `/usr/bin'.
+
+ On Haiku, software installed for all users goes in `/boot/common',
+not `/usr/local'. It is recommended to use the following options:
+
+ ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on. Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS
+ KERNEL-OS
+
+ See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+ Variables not defined in a site shell script can be set in the
+environment passed to `configure'. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf bug. Until the bug is fixed you can use this workaround:
+
+ CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+`configure' Invocation
+======================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+ Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+ Print a summary of the options unique to this package's
+ `configure', and exit. The `short' variant lists options used
+ only in the top level, while the `recursive' variant lists options
+ also present in any nested packages.
+
+`--version'
+`-V'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`--cache-file=FILE'
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally `config.cache'. FILE defaults to `/dev/null' to
+ disable caching.
+
+`--config-cache'
+`-C'
+ Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--prefix=DIR'
+ Use DIR as the installation prefix. *note Installation Names::
+ for more details, including other options available for fine-tuning
+ the installation locations.
+
+`--no-create'
+`-n'
+ Run the configure checks, but stop before creating any output
+ files.
+
+`configure' also accepts some other, not widely useful, options. Run
+`configure --help' for more details.
+
--- /dev/null
+## Makefile.am -- Process this file with automake to produce Makefile.in
+## Copyright (C) 2002 James Su
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+AUX_DIST = $(ac_aux_dir)/config.guess \
+ $(ac_aux_dir)/config.sub \
+ $(ac_aux_dir)/compile \
+ $(ac_aux_dir)/depcomp \
+ $(ac_aux_dir)/install-sh \
+ $(ac_aux_dir)/ltconfig \
+ $(ac_aux_dir)/ltmain.sh \
+ $(ac_aux_dir)/missing
+
+EXTRA_DIST = config.rpath \
+ mkinstalldirs \
+ bootstrap \
+ scim.spec \
+ intltool-extract.in \
+ intltool-merge.in \
+ intltool-update.in
+
+AUTOMAKE_OPTIONS = gnu
+SUBDIRS = ism/m4 ism/src ism/utils ism/modules ism/configs po/scim po/isfsetting_efl po/kbwizard_efl ism/extras ism/data ism/demos
+
+MAINTAINERCLEANFILES = Makefile.in \
+ aclocal.m4 \
+ configure \
+ config.h.in \
+ $(AUX_DIST)
+
+DISTCLEANFILES = isf.pc scim.pc scim-gtkutils.pc intltool-extract intltool-merge intltool-update
+
+CLEANFILES = *.bak
+
+ACLOCAL = aclocal -I $(ac_aux_dir)/ism
+
+pkgconfigdir = $(libdir)/pkgconfig
+
+if SCIM_BUILD_GTK_UTILS
+GTK_UTILS_PKGCONFIG = scim-gtkutils.pc
+endif
+
+pkgconfig_DATA = isf.pc scim.pc \
+ $(GTK_UTILS_PKGCONFIG)
+
+ACLOCAL_AMFLAGS = -I ism/m4
+
+.PHONY: update-ChangeLog
+
+update-ChangeLog:
+ /bin/sh $(top_srcdir)/svn2cl.sh --authors=$(top_srcdir)/developers -f $(top_srcdir)/ChangeLog
+
+uninstall-local:
+ rm -rf @SCIM_MODULE_PATH@
--- /dev/null
+#! /bin/sh
+# bootstrap -- Use this script to create generated files from the CVS dist
+# Copyright (C) 2000 Gary V. Vaughan
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+## @start 1
+#! /bin/sh
+
+set -x
+aclocal -I ism/m4
+autoheader
+libtoolize -c --automake
+automake --add-missing --copy --include-deps
+autoconf
+if [ -f "arm-linux.cache" ]
+then
+ rm arm-linux.cache
+fi
+echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
+## @end 1
--- /dev/null
+#! /bin/sh
+# Wrapper for compilers which do not understand `-c -o'.
+
+scriptversion=2005-05-14.22
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand `-c -o'.
+Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file `INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "compile $scriptversion"
+ exit $?
+ ;;
+esac
+
+ofile=
+cfile=
+eat=
+
+for arg
+do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as `compile cc -o foo foo.c'.
+ # So we strip `-o arg' only if arg is an object.
+ eat=1
+ case $2 in
+ *.o | *.obj)
+ ofile=$2
+ ;;
+ *)
+ set x "$@" -o "$2"
+ shift
+ ;;
+ esac
+ ;;
+ *.c)
+ cfile=$1
+ set x "$@" "$1"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+ # If no `-o' option was seen then we might have been invoked from a
+ # pattern rule where we don't need one. That is ok -- this is a
+ # normal compilation that the losing compiler can handle. If no
+ # `.c' file was seen then we are probably linking. That is also
+ # ok.
+ exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use `[/.-]' here to ensure that we don't use the same name
+# that we are using for the .o file. Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d
+while true; do
+ if mkdir "$lockdir" >/dev/null 2>&1; then
+ break
+ fi
+ sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+ mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+ mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
--- /dev/null
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+# Copyright 1996-2003 Free Software Foundation, Inc.
+# Taken from GNU libtool, 2001
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+# than 256 bytes, otherwise the compiler driver will dump core. The only
+# known workaround is to choose shorter directory names for the build
+# directory and/or the installation directory.
+
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+ wl='-Wl,'
+else
+ case "$host_os" in
+ aix*)
+ wl='-Wl,'
+ ;;
+ mingw* | pw32* | os2*)
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ wl='-Wl,'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ wl='-Wl,'
+ ;;
+ newsos6)
+ ;;
+ linux*)
+ case $CC in
+ icc|ecc)
+ wl='-Wl,'
+ ;;
+ ccc)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ osf3* | osf4* | osf5*)
+ wl='-Wl,'
+ ;;
+ sco3.2v5*)
+ ;;
+ solaris*)
+ wl='-Wl,'
+ ;;
+ sunos4*)
+ wl='-Qoption ld '
+ ;;
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ wl='-Wl,'
+ ;;
+ sysv4*MP*)
+ ;;
+ uts4*)
+ ;;
+ esac
+fi
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+ case "$host_os" in
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs=no
+ fi
+ ;;
+ amigaos*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can use
+ # them.
+ ld_shlibs=no
+ ;;
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ cygwin* | mingw* | pw32*)
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ netbsd*)
+ ;;
+ solaris* | sysv5*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ sunos4*)
+ hardcode_direct=yes
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ if test "$ld_shlibs" = yes; then
+ # Unlike libtool, we use -rpath here, not --rpath, since the documented
+ # option of GNU ld is called -rpath, not --rpath.
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ fi
+else
+ case "$host_os" in
+ aix3*)
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$GCC" = yes; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ else
+ aix_use_runtimelinking=no
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ esac
+ fi
+ hardcode_direct=yes
+ hardcode_libdir_separator=':'
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ hardcode_direct=yes
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ esac
+ fi
+ # Begin _LT_AC_SYS_LIBPATH_AIX.
+ echo 'int main () { return 0; }' > conftest.c
+ ${CC} ${LDFLAGS} conftest.c -o conftest
+ aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ fi
+ if test -z "$aix_libpath"; then
+ aix_libpath="/usr/lib:/lib"
+ fi
+ rm -f conftest.c conftest
+ # End _LT_AC_SYS_LIBPATH_AIX.
+ if test "$aix_use_runtimelinking" = yes; then
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+ else
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ fi
+ fi
+ ;;
+ amigaos*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs=no
+ ;;
+ bsdi4*)
+ ;;
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ libext=lib
+ ;;
+ darwin* | rhapsody*)
+ if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then
+ hardcode_direct=no
+ fi
+ ;;
+ dgux*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ freebsd1*)
+ ld_shlibs=no
+ ;;
+ freebsd2.2*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ freebsd2*)
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ freebsd*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ hpux9*)
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ hpux10* | hpux11*)
+ if test "$with_gnu_ld" = no; then
+ case "$host_cpu" in
+ hppa*64*)
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=no
+ ;;
+ ia64*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=no
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ *)
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+ irix5* | irix6* | nonstopux*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ netbsd*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ newsos6)
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ openbsd*)
+ hardcode_direct=yes
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ else
+ case "$host_os" in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ *)
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ osf3*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ osf4* | osf5*)
+ if test "$GCC" = yes; then
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ else
+ # Both cc and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ hardcode_libdir_separator=:
+ ;;
+ sco3.2v5*)
+ ;;
+ solaris*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ sunos4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ sysv4)
+ case $host_vendor in
+ sni)
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ hardcode_direct=no
+ ;;
+ motorola)
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ ;;
+ sysv4.3*)
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ ld_shlibs=yes
+ fi
+ ;;
+ sysv4.2uw2*)
+ hardcode_direct=yes
+ hardcode_minus_L=no
+ ;;
+ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*)
+ ;;
+ sysv5*)
+ hardcode_libdir_flag_spec=
+ ;;
+ uts4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.
+libname_spec='lib$name'
+case "$host_os" in
+ aix3*)
+ ;;
+ aix4* | aix5*)
+ ;;
+ amigaos*)
+ ;;
+ beos*)
+ ;;
+ bsdi4*)
+ ;;
+ cygwin* | mingw* | pw32*)
+ shrext=.dll
+ ;;
+ darwin* | rhapsody*)
+ shrext=.dylib
+ ;;
+ dgux*)
+ ;;
+ freebsd1*)
+ ;;
+ freebsd*)
+ ;;
+ gnu*)
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case "$host_cpu" in
+ ia64*)
+ shrext=.so
+ ;;
+ hppa*64*)
+ shrext=.sl
+ ;;
+ *)
+ shrext=.sl
+ ;;
+ esac
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case "$host_os" in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+ *) libsuff= shlibsuff= ;;
+ esac
+ ;;
+ esac
+ ;;
+ linux*oldld* | linux*aout* | linux*coff*)
+ ;;
+ linux*)
+ ;;
+ netbsd*)
+ ;;
+ newsos6)
+ ;;
+ nto-qnx)
+ ;;
+ openbsd*)
+ ;;
+ os2*)
+ libname_spec='$name'
+ shrext=.dll
+ ;;
+ osf3* | osf4* | osf5*)
+ ;;
+ sco3.2v5*)
+ ;;
+ solaris*)
+ ;;
+ sunos4*)
+ ;;
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ ;;
+ sysv4*MP*)
+ ;;
+ uts4*)
+ ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
--- /dev/null
+# Process this file with autoconf to produce a configure script
+#AC_INIT(scim, 1.4.7, suzhe@tsinghua.org.cn)
+AC_INIT(isf, 2.3.4821, isf@samsung.com)
+AC_CONFIG_SRCDIR([ism/src/scim.h])
+m4_pattern_allow([^AS_])
+
+###########################################################
+## Some definitions of Version macros. ##
+###########################################################
+
+# ISF version
+ISF_MAJOR_VERSION=2
+ISF_MINOR_VERSION=3
+ISF_MICRO_VERSION=4821
+
+ISF_VERSION=$ISF_MAJOR_VERSION.$ISF_MINOR_VERSION.$ISF_MICRO_VERSION
+
+AC_SUBST(ISF_MAJOR_VERSION)
+AC_SUBST(ISF_MINOR_VERSION)
+AC_SUBST(ISF_MICRO_VERSION)
+AC_SUBST(ISF_VERSION)
+
+# SCIM version
+SCIM_MAJOR_VERSION=1
+SCIM_MINOR_VERSION=4
+SCIM_MICRO_VERSION=7
+
+SCIM_VERSION=$SCIM_MAJOR_VERSION.$SCIM_MINOR_VERSION.$SCIM_MICRO_VERSION
+
+AC_SUBST(SCIM_MAJOR_VERSION)
+AC_SUBST(SCIM_MINOR_VERSION)
+AC_SUBST(SCIM_MICRO_VERSION)
+AC_SUBST(SCIM_VERSION)
+
+# libtool versioning for SCIM
+
+# increment if the interface has additions, changes, removals.
+SCIM_CURRENT=10
+
+# increment any time the source changes; set to 0 if you increment CURRENT
+SCIM_REVISION=3
+
+# increment if any interfaces have been added; set to 0
+# if any interfaces have been removed. removal has
+# precedence over adding, so set to 0 if both happened.
+SCIM_AGE=2
+
+AC_SUBST(SCIM_CURRENT)
+AC_SUBST(SCIM_REVISION)
+AC_SUBST(SCIM_AGE)
+
+# Define a string for the earliest version that this release cannot
+# coexist with. This is used for directory hierarchies.
+#
+SCIM_EPOCH=-1.0
+AC_SUBST(SCIM_EPOCH)
+
+# Define a string for the earliest version that this release has
+# binary compatibility with. This is used for module locations.
+#
+SCIM_BINARY_VERSION=1.4.0
+AC_SUBST(SCIM_BINARY_VERSION)
+
+AC_DEFINE_UNQUOTED(SCIM_BINARY_VERSION, "$SCIM_BINARY_VERSION", [The binary version of SCIM library.])
+AC_DEFINE_UNQUOTED(SCIM_VERSION, "$SCIM_VERSION", [The release version of SCIM library.])
+AC_DEFINE_UNQUOTED(SCIM_MAJOR_VERSION, $SCIM_MAJOR_VERSION, [The Major version of SCIM library.])
+AC_DEFINE_UNQUOTED(SCIM_MINOR_VERSION, $SCIM_MINOR_VERSION, [The Minor version of SCIM library.])
+AC_DEFINE_UNQUOTED(SCIM_MICRO_VERSION, $SCIM_MICRO_VERSION, [The Micro version of SCIM library.])
+
+GETTEXT_PACKAGE=scim
+AC_SUBST(GETTEXT_PACKAGE)
+AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [The gettext domain])
+
+###########################################################
+## Start Configuration. ##
+###########################################################
+AC_CANONICAL_HOST
+
+# Init automake stuff
+AM_INIT_AUTOMAKE
+AM_CONFIG_HEADER([config.h])
+
+# Init platform
+PLATFORM_INIT
+
+# Init gettext
+ALL_LINGUAS="zh_CN zh_TW zh_HK ja ko de fr it cs pa fi sv nl"
+AM_GNU_GETTEXT
+
+# Init libtool
+AC_LIBTOOL_DLOPEN
+AC_PROG_LIBTOOL
+AC_LIB_LTDL
+AC_SUBST(LIBTOOL_DEPS)
+
+# libtool option to control which symbols are exported
+# right now, symbols starting with _ are not exported
+# !!! DO NOT USE IT !!!
+LIBTOOL_EXPORT_OPTIONS=''
+AC_SUBST(LIBTOOL_EXPORT_OPTIONS)
+
+# Checks for programs.
+AC_PROG_CXX
+AC_PROG_CC
+AC_LANG(C++)
+
+# Checks if doxygen is avaiable
+
+DOXYGEN=no
+if test "x$with_doxygen" != "xno"; then
+ AC_PATH_PROG(DOXYGEN, doxygen, no)
+fi
+
+AM_CONDITIONAL(HAVE_DOXYGEN, test x$DOXYGEN != xno)
+AC_SUBST(DOXYGEN)
+
+# Checks if graphviz is available
+AC_CHECK_PROG(HAVE_GRAPHVIZ, dot, YES, NO)
+AC_PATH_PROG(DOT, dot)
+DOT=`dirname $DOT`
+AC_SUBST(DOT)
+
+AC_PATH_PROG(PERL, perl)
+AC_SUBST(PERL)
+
+# Check intltool
+IT_PROG_INTLTOOL([0.33], [no-xml])
+
+# Checks for libraries.
+AC_HEADER_STDC
+AC_HEADER_TIME
+AC_CHECK_HEADERS([langinfo.h libintl.h string.h dirent.h hash_map ext/hash_map])
+AC_CHECK_HEADERS([stdio.h ctype.h errno.h assert.h])
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_C_INLINE
+AC_TYPE_SIZE_T
+
+if test x$ac_cv_type_size_t != xyes; then
+ AC_MSG_ERROR([No type size_t, but SCIM needs it!])
+fi
+
+AC_CHECK_SIZEOF(char)
+AC_CHECK_SIZEOF(unsigned short int)
+AC_CHECK_SIZEOF(unsigned int)
+AC_CHECK_SIZEOF(unsigned long int)
+AC_CHECK_SIZEOF(unsigned long long int)
+AC_CHECK_HEADERS([stdint.h],[has_stdint=yes],[has_stdint=no])
+
+if test x$ac_cv_sizeof_unsigned_short_int = x2 && test x$ac_cv_sizeof_char = x1 ; then
+ :
+else
+ AC_MSG_ERROR([
+*** SCIM requires
+*** sizeof (unsigned short int) == 2
+*** sizeof (char) == 1
+*** You might want to consider using the GNU C compiler.
+])
+fi
+
+if test x$ac_cv_sizeof_wchar_t = x0 ; then
+ AC_MSG_ERROR([
+*** SCIM requires a compiler that supports wchar_t,
+*** You might want to consider using the GNU C compiler.
+])
+fi
+
+if test x$has_stdint = xyes; then
+ INCLUDE_STDINT="#include <stdint.h>"
+ UINT16="uint16_t"
+ UINT32="uint32_t"
+ UINT64="uint64_t"
+else
+ INCLUDE_STDINT="//#include <stdint.h>"
+ UINT16="unsigned short int"
+ if test x$ac_cv_sizeof_unsigned_int = x4; then
+ UINT32="unsigned int"
+ else
+ if test x$ac_cv_sizeof_unsigned_long_int = x4; then
+ UINT32="unsigned long int"
+ else
+ AC_MSG_ERROR([*** No suitable integer type for uint32 found.])
+ fi
+ fi
+ if test x$ac_cv_sizeof_unsigned_long_long_int = x8; then
+ UINT64="unsigned long long int"
+ else
+ AC_MSG_ERROR([*** No suitable integer type for uint64 found.])
+ fi
+fi
+AC_SUBST(INCLUDE_STDINT)
+AC_SUBST(UINT16)
+AC_SUBST(UINT32)
+AC_SUBST(UINT64)
+
+# Checks for library functions.
+AC_FUNC_MALLOC
+AC_CHECK_FUNCS([gettimeofday memmove memset nl_langinfo setlocale daemon])
+AC_CHECK_FUNCS([memcpy strcmp strchr strrchr])
+AC_CHECK_FUNCS([opendir closedir readdir])
+AC_CHECK_FUNCS([usleep nanosleep])
+AC_CHECK_FUNCS([gethostbyname gethostbyname_r socket bind accept connect listen],
+ [socket_ok=yes],
+ [socket_ok=no])
+
+AM_ICONV
+
+# Check if we should build scim-panel-gtk with gconf
+PKG_CHECK_MODULES(GCONF, [gconf-2.0 phonestatus noti-service],
+ [ISF_HAS_GCONF=yes],
+ [ISF_HAS_GCONF=no])
+
+if test "$ISF_HAS_GCONF" = "yes"; then
+ AC_DEFINE(HAVE_GCONF,1,[Have GConf functions.])
+fi
+
+# Check if we should build isf-panel-efl daemon
+PKG_CHECK_MODULES(EFL, [elementary ecore-x evas ecore ecore-evas ecore-file edje ecore-input ecore-imf],
+ [ISF_HAS_EFL=yes],
+ [ISF_HAS_EFL=no])
+
+if test "$ISF_HAS_EFL" = "yes"; then
+ EFL_LIBDIR=`$PKG_CONFIG --variable=libdir ecore-imf`
+ if test -z "$EFL_LIBDIR)"; then
+ EFL_LIBDIR="$libdir"
+ fi
+ EFL_IM_MODULEDIR=$EFL_LIBDIR/ecore/immodules
+ AC_SUBST(EFL_LIBDIR)
+ AC_SUBST(EFL_IM_MODULEDIR)
+fi
+
+# Check x11 library
+PKG_CHECK_MODULES(X11, [x11])
+
+# Check ui-gadget library
+PKG_CHECK_MODULES(UIGADGET, [ui-gadget])
+
+# Check utilX library
+PKG_CHECK_MODULES(UTILX, [utilX])
+
+# Check appcore-efl library
+PKG_CHECK_MODULES(APPCORE_EFL, [appcore-efl])
+
+# Check HEYNOTI library
+PKG_CHECK_MODULES(HEYNOTI, [heynoti])
+
+# Check dlog library
+PKG_CHECK_MODULES(DLOG, [dlog >= 0])
+
+# Check if we should build isf-setting-efl
+PKG_CHECK_MODULES(VCONF, [vconf],
+ [ISF_HAS_VCONF=yes],
+ [ISF_HAS_VCONF=no])
+
+if test "$ISF_HAS_VCONF" = "yes"; then
+ AC_DEFINE(HAVE_VCONF,1,[Have VConf functions.])
+fi
+
+# Check if we should build scim-panel-gtk daemon
+PKG_CHECK_MODULES(GTK2, [gtk+-2.0 >= 2.4.0 pango >= 1.1.0 gdk-pixbuf-2.0 >= 2.4.0],
+ [SCIM_HAS_GTK2=yes],
+ [SCIM_HAS_GTK2=no])
+
+SCIM_HAS_GTK2_2=no
+if test "$SCIM_HAS_GTK2" = "yes"; then
+ if $PKG_CONFIG --exists "gtk+-2.0 >= 2.2" ; then
+ SCIM_HAS_GTK2_2=yes
+ GTK_VERSION=2.2.0
+ AC_DEFINE(GDK_MULTIHEAD_SAFE,1,[Force use of GDK's multihead-safe APIs.])
+ fi
+ if $PKG_CONFIG --exists "gtk+-2.0 >= 2.3.5" ; then
+ SCIM_HAS_GTK2_4=yes
+ GTK_VERSION=2.3.5
+ AC_DEFINE(HAVE_GTK_DRAW_INSERTION_CURSOR,1,[Have gtk_draw_insertion_cursor ().])
+ fi
+ GTK_BINARY_VERSION=`$PKG_CONFIG --variable=gtk_binary_version gtk+-2.0`
+ GTK_LIBDIR=`$PKG_CONFIG --variable=libdir gtk+-2.0`
+ if test -z "$GTK_LIBDIR)"; then
+ GTK_LIBDIR="$libdir"
+ fi
+ GTK_IM_MODULEDIR=$GTK_LIBDIR/gtk-2.0/immodules
+ AC_SUBST(GTK_LIBDIR)
+ AC_SUBST(GTK_IM_MODULEDIR)
+ AC_SUBST(GTK_VERSION)
+ AC_SUBST(GTK_BINARY_VERSION)
+fi
+
+# Check if we have gthread
+PKG_CHECK_MODULES(GTHREAD2,[gthread-2.0 >= 2.0.0],
+ [SCIM_HAS_GTHREAD2=yes],
+ [SCIM_HAS_GTHREAD2=no])
+
+# Checks for X11 header files.
+AC_PATH_XTRA
+
+# Add -lX11 to X_LIBS
+if test "$have_x" = "yes"; then
+ X_LIBS="$X_LIBS -lX11"
+fi
+
+case $host_cpu in
+ *arm* ) TARGET=ARM;;
+ * ) TARGET=X86;;
+esac
+AM_CONDITIONAL(ARM, test x$TARGET = xARM)
+
+###########################################################
+## Definiation of compile args. ##
+###########################################################
+AC_ARG_WITH(gtk-im-module-dir,
+ AS_HELP_STRING([--with-gtk-im-module-dir=dir],
+ [Select gtk immodule dir]),
+ GTK_IM_MODULEDIR=$with_gtk_im_module_dir)
+
+AC_ARG_WITH(efl-im-module-dir,
+ AS_HELP_STRING([--with-efl-im-module-dir=dir],
+ [Select efl immodule dir]),
+ EFL_IM_MODULEDIR=$with_efl_im_module_dir)
+
+AC_ARG_ENABLE(ld-version-script,
+ [ --enable-ld-version-script Use ld version script to limit exported symbols],
+ enable_ld_version_script=yes,
+ enable_ld_version_script=no)
+
+AC_ARG_ENABLE(debug,
+ [ --enable-debug Turn on debugging],
+ enable_debug=yes,
+ enable_debug=no)
+
+AC_ARG_ENABLE(x86,
+ [ --enable-x86 Build for x86 host],
+ enable_x86=yes,
+ enable_x86=no)
+
+AC_ARG_ENABLE(hash-map,
+ [ --enable-hash-map Use hast_map instead of std::map internally],
+ enable_hash_map=yes,
+ enable_hash_map=no)
+
+AC_ARG_ENABLE(config-simple,
+ [ --disable-config-simple Do not build Simple Config module],
+ enable_config_simple=no,
+ enable_config_simple=yes)
+
+AC_ARG_ENABLE(config-socket,
+ [ --disable-config-socket Do not build Socket Config module],
+ enable_config_socket=no,
+ enable_config_socket=yes)
+
+AC_ARG_ENABLE(frontend-socket,
+ [ --disable-frontend-socket Do not build Socket FrontEnd module],
+ enable_frontend_socket=no,
+ enable_frontend_socket=yes)
+
+AC_ARG_ENABLE(im-socket,
+ [ --disable-im-socket Do not build Socket IMEngine module],
+ enable_im_socket=no,
+ enable_im_socket=yes)
+
+AC_ARG_ENABLE(filter-sctc,
+ [ --disable-filter-sctc Do not build Simplified/Traditional Chinese conversion Filter module],
+ enable_filter_sctc=no,
+ enable_filter_sctc=yes)
+
+AC_ARG_ENABLE(gtk2-immodule,
+ [ --disable-gtk2-immodule Do not build GTK2 IMModule],
+ enable_gtk2_immodule=no,
+ enable_gtk2_immodule=yes)
+
+AC_ARG_ENABLE(panel-gtk,
+ [ --disable-panel-gtk Do not build GTK2 Panel],
+ enable_panel_gtk=no,
+ enable_panel_gtk=check)
+
+AC_ARG_ENABLE(efl-immodule,
+ [ --disable-efl-immodule Do not build EFL IMModule],
+ enable_efl_immodule=no,
+ enable_efl_immodule=yes)
+
+AC_ARG_ENABLE(panel-efl,
+ [ --disable-panel-efl Do not build EFL Panel],
+ enable_panel_efl=no,
+ enable_panel_efl=check)
+
+AC_ARG_ENABLE(setting-efl,
+ [ --disable-setting-efl Do not build EFL Setting],
+ enable_setting_efl=no,
+ enable_setting_efl=check)
+
+AC_ARG_ENABLE(tray-icon,
+ [ --disable-tray-icon Do not build Tray Icon],
+ enable_tray_icon=no,
+ enable_tray_icon=yes)
+
+if test "$enable_hash_map" = "yes"; then
+ AC_DEFINE(ENABLE_HASH_MAP,1,[Use hash map instead of map in libscim])
+fi
+
+if test "$enable_debug" = "yes"; then
+ AC_DEFINE(ENABLE_DEBUG,1,[Define this to enable the debug facility in libscim])
+ CFLAGS="$CFLAGS -g"
+ CXXFLAGS="$CXXFLAGS -g"
+fi
+
+if test "$enable_x86" = "yes"; then
+ AC_DEFINE(ENABLE_X86_HOST,1,[Build for x86 host])
+fi
+
+if test "$enable_tests" = "yes"; then
+ SCIM_BUILD_TESTS=1
+else
+ SCIM_BUILD_TESTS=0
+ enable_tests=no
+fi
+
+if test "$enable_config_simple" = "yes"; then
+ SCIM_BUILD_CONFIG_SIMPLE=1
+else
+ SCIM_BUILD_CONFIG_SIMPLE=0
+ enable_config_simple=no
+fi
+
+if test "$enable_config_socket" = "yes" -a "$socket_ok" = "yes"; then
+ SCIM_BUILD_CONFIG_SOCKET=1
+else
+ SCIM_BUILD_CONFIG_SOCKET=0
+ enable_config_socket=no
+fi
+
+if test "$enable_frontend_socket" = "yes" -a "$socket_ok" = "yes"; then
+ SCIM_BUILD_FRONTEND_SOCKET=1
+else
+ SCIM_BUILD_FRONTEND_SOCKET=0
+ enable_frontend_socket=no
+fi
+
+if test "$enable_im_rawcode" = "yes"; then
+ SCIM_BUILD_IMENGINE_RAWCODE=1
+else
+ SCIM_BUILD_IMENGINE_RAWCODE=0
+ enable_im_rawcode=no
+fi
+
+if test "$enable_im_socket" = "yes" -a "$socket_ok" = "yes"; then
+ SCIM_BUILD_IMENGINE_SOCKET=1
+else
+ SCIM_BUILD_IMENGINE_SOCKET=0
+ enable_im_socket=no
+fi
+
+if test "$enable_filter_sctc" = "yes"; then
+ SCIM_BUILD_FILTER_SCTC=1
+else
+ SCIM_BUILD_FILTER_SCTC=0
+ enable_filter_sctc=no
+fi
+
+if test "$enable_gtk2_immodule" = "yes" -a "$SCIM_HAS_GTK2" = "yes"; then
+ SCIM_BUILD_GTK2_IMMODULE=1
+else
+ SCIM_BUILD_GTK2_IMMODULE=0
+ enable_gtk2_immodule=no
+fi
+
+if test "$SCIM_HAS_GTK2" = "yes"; then
+ enable_gtk_utils=yes
+ SCIM_BUILD_GTK_UTILS=1
+else
+ enable_gtk_utils=no
+ SCIM_BUILD_GTK_UTILS=0
+fi
+
+if test "$enable_tray_icon" = "yes"; then
+ if test "$SCIM_HAS_GTK2_2" = "yes" -a "$no_x" != "yes"; then
+ enable_tray_icon=yes
+ AC_DEFINE(ENABLE_TRAY_ICON,1,[Enable the TrayIcon code.])
+ fi
+else
+ enable_tray_icon=no
+fi
+
+SCIM_BUILD_PANEL_GTK=0
+if test "$enable_panel_gtk" != "no"; then
+ enable_panel_gtk=no
+ if test "$SCIM_HAS_GTHREAD2" = "yes" -a "$SCIM_HAS_GTK2" = "yes"; then
+ SCIM_BUILD_PANEL_GTK=1
+ enable_panel_gtk=yes
+ fi
+fi
+
+if test "$enable_efl_immodule" = "yes" -a "$ISF_HAS_EFL" = "yes"; then
+ ISF_BUILD_EFL_IMMODULE=1
+else
+ ISF_BUILD_EFL_IMMODULE=0
+ enable_efl_immodule=no
+fi
+
+ISF_BUILD_PANEL_EFL=0
+if test "$enable_panel_efl" != "no"; then
+ enable_panel_efl=no
+ if test "$ISF_HAS_EFL" = "yes"; then
+ ISF_BUILD_PANEL_EFL=1
+ enable_panel_efl=yes
+ fi
+fi
+
+ISF_BUILD_SETTING_EFL=0
+if test "$enable_setting_efl" != "no"; then
+ enable_setting_efl=no
+ if test "$ISF_HAS_EFL" = "yes" -a "$ISF_HAS_VCONF" = "yes"; then
+ ISF_BUILD_SETTING_EFL=1
+ enable_setting_efl=yes
+ fi
+fi
+
+#if nothing needs libscim-gtkutils, just disable it
+if test "$enable_panel_gtk" != "yes"; then
+ enable_gtk_utils=no
+ SCIM_BUILD_GTK_UTILS=0
+fi
+
+AM_CONDITIONAL(SCIM_LD_VERSION_SCRIPT,
+ [test "$enable_ld_version_script" = "yes"])
+
+AM_CONDITIONAL(SCIM_BUILD_TESTS,
+ [test "$enable_tests" = "yes"])
+
+AM_CONDITIONAL(SCIM_BUILD_CONFIG_SIMPLE,
+ [test "$enable_config_simple" = "yes"])
+
+AM_CONDITIONAL(SCIM_BUILD_CONFIG_SOCKET,
+ [test "$enable_config_socket" = "yes"])
+
+AM_CONDITIONAL(SCIM_BUILD_FRONTEND_SOCKET,
+ [test "$enable_frontend_socket" = "yes"])
+
+AM_CONDITIONAL(SCIM_BUILD_IMENGINE_SOCKET,
+ [test "$enable_im_socket" = "yes"])
+
+AM_CONDITIONAL(SCIM_BUILD_IMENGINE_RAWCODE,
+ [test "$enable_im_rawcode" = "yes"])
+
+AM_CONDITIONAL(SCIM_BUILD_GTK2_IMMODULE,
+ [test "$enable_gtk2_immodule" = "yes"])
+
+AM_CONDITIONAL(SCIM_BUILD_FILTER_SCTC,
+ [test "$enable_filter_sctc" = "yes"])
+
+AM_CONDITIONAL(SCIM_BUILD_GTK_UTILS,
+ [test "$enable_gtk_utils" = "yes"])
+
+AM_CONDITIONAL(SCIM_BUILD_TRAY_ICON,
+ [test "$enable_tray_icon" = "yes"])
+
+AM_CONDITIONAL(SCIM_BUILD_PANEL_GTK,
+ [test "$enable_panel_gtk" = "yes"])
+
+AM_CONDITIONAL(ISF_BUILD_EFL_IMMODULE,
+ [test "$enable_efl_immodule" = "yes"])
+
+AM_CONDITIONAL(ISF_BUILD_PANEL_EFL,
+ [test "$enable_panel_efl" = "yes"])
+
+AM_CONDITIONAL(ISF_BUILD_SETTING_EFL,
+ [test "$enable_setting_efl" = "yes"])
+
+AM_CONDITIONAL(ISF_BUILD_WITH_GCONF,
+ [test "$ISF_HAS_GCONF" = "yes"])
+
+AC_SUBST(SCIM_BUILD_TESTS)
+AC_SUBST(SCIM_BUILD_CONFIG_SIMPLE)
+AC_SUBST(SCIM_BUILD_CONFIG_SOCKET)
+AC_SUBST(SCIM_BUILD_FRONTEND_SOCKET)
+AC_SUBST(SCIM_BUILD_IMENGINE_RAWCODE)
+AC_SUBST(SCIM_BUILD_IMENGINE_TABLE)
+AC_SUBST(SCIM_BUILD_IMENGINE_SOCKET)
+AC_SUBST(SCIM_BUILD_FILTER_SCTC)
+AC_SUBST(SCIM_BUILD_GTK2_IMMODULE)
+AC_SUBST(SCIM_BUILD_SCIM_SETUP)
+AC_SUBST(SCIM_BUILD_PANEL_GTK)
+AC_SUBST(SCIM_BUILD_GTK_UTILS)
+AC_SUBST(ISF_BUILD_EFL_IMMODULE)
+AC_SUBST(ISF_BUILD_PANEL_EFL)
+AC_SUBST(ISF_BUILD_SETTING_EFL)
+AC_SUBST(ISF_BUILD_WITH_GCONF)
+
+# Output All necessary Paths.
+SCIM_BINDIR="$prefix/bin"
+SCIM_DATADIR="$datadir/scim"
+SCIM_SYSCONFDIR="$sysconfdir"
+SCIM_ICONDIR="$datadir/scim/icons"
+SCIM_MODULE_PATH="$libdir/scim$SCIM_EPOCH"
+SCIM_LIBEXECDIR="$libdir/scim$SCIM_EPOCH"
+SCIM_LOCALEDIR="/usr/share/locale"
+SCIM_TEMPDIR="/tmp"
+
+AC_SUBST(SCIM_BINDIR)
+AC_SUBST(SCIM_DATADIR)
+AC_SUBST(SCIM_SYSCONFDIR)
+AC_SUBST(SCIM_ICONDIR)
+AC_SUBST(SCIM_MODULE_PATH)
+AC_SUBST(SCIM_LIBEXECDIR)
+AC_SUBST(SCIM_LOCALEDIR)
+AC_SUBST(SCIM_TEMPDIR)
+
+###########################################################
+## Output files. ##
+###########################################################
+AC_SUBST(ac_aux_dir)
+AC_CONFIG_FILES([Makefile
+ ism/m4/Makefile
+ po/scim/Makefile.in
+ po/isfsetting_efl/Makefile.in
+ po/kbwizard_efl/Makefile.in
+ ism/src/Makefile
+ ism/src/scim_types.h
+ ism/utils/Makefile
+ ism/data/Makefile
+ ism/data/icons/Makefile
+ ism/data/pixmaps/Makefile
+ ism/modules/Makefile
+ ism/modules/frontend/Makefile
+ ism/modules/imengine/Makefile
+ ism/modules/filter/Makefile
+ ism/modules/config/Makefile
+ ism/configs/Makefile
+ ism/extras/Makefile
+ ism/extras/gtk2_immodule/Makefile
+ ism/extras/gtk_panel/Makefile
+ ism/extras/efl_immodule/Makefile
+ ism/extras/efl_panel/Makefile
+ ism/extras/efl_setting/Makefile
+ ism/demos/Makefile
+ intltool-extract
+ intltool-merge
+ intltool-update
+ isf.pc
+ scim.pc
+ scim-gtkutils.pc
+ scim.spec])
+AC_OUTPUT
+
+AC_MSG_RESULT([
+Build options:
+ Version $ISF_VERSION
+ Install prefix $prefix
+ Build shared libs $enable_shared
+ Build static libs $enable_static
+ Enable debug $enable_debug
+ Build for x86 host $enable_x86
+ Enable ld version script $enable_ld_version_script
+
+Module options:
+ Simple config module $enable_config_simple
+ Socket config module $enable_config_socket
+
+ Socket FrontEnd module $enable_frontend_socket
+
+ Socket IMEngine module $enable_im_socket
+
+ SCTC Filter module $enable_filter_sctc
+
+ GTK2 Utility Library $enable_gtk_utils
+ GTK2 IMModule $enable_gtk2_immodule
+ GTK2 IMModule dir $GTK_IM_MODULEDIR
+ GTK2 Panel GUI $enable_panel_gtk
+
+ EFL IMModule $enable_efl_immodule
+ EFL IMModule dir $EFL_IM_MODULEDIR
+ EFL Panel GUI $enable_panel_efl
+ EFL Setting $enable_setting_efl
+
+ Enable TrayIcon $enable_tray_icon
+])
+
--- /dev/null
+isf (2.3.4821-1slp2+1) unstable; urgency=low
+
+ * code cleanup
+ * Git: slp/pkgs/i/isf
+ * Tag: isf_2.3.4821-1slp2+1
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com> Wed, 21 Dec 2011 09:44:04 +0900
+
+isf (2.3.4816-1slp2+1) unstable; urgency=low
+
+ * [immodule] support autocapital in webkit editor
+ * [panel] change theme name
+ * Git: slp/pkgs/i/isf
+ * Tag: isf_2.3.4816-1slp2+1
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com> Fri, 16 Dec 2011 08:58:25 +0900
+
+isf (2.3.4809-1slp2+2) unstable; urgency=low
+ * [gtk_panel] codes cleanup
+ * Git: pkgs/i/isf
+ * Tag: isf_2.3.4809-1slp2+2
+
+ -- Haifeng Deng <haifeng.deng@samsung.com> Fri, 9 Dec 2011 20:15:00 +0900
+
+isf (2.3.4809-1slp2+1) unstable; urgency=low
+ * [isf-panel-efl/isfsetting] codes cleanup
+ * Git: pkgs/i/isf
+ * Tag: isf_2.3.4809-1slp2+1
+
+ -- Shuo Liu <shuo0805.liu@samsung.com> Fri, 9 Dec 2011 19:59:00 +0900
+
+isf (2.3.4807-1slp2+3) unstable; urgency=low
+
+ * [isf-panel-efl] Fix rotation defect
+ * Git: pkgs/i/isf
+ * Tag: isf_2.3.4807-1slp2+3
+
+ -- Haifeng Deng <haifeng.deng@samsung.com> Wed, 07 Dec 2011 15:29:00 +0900
+
+isf (2.3.4807-1slp2+2) unstable; urgency=low
+
+ * remove CommonISE UUID
+ * Git: pkgs/i/isf
+ * Tag: isf_2.3.4807-1slp2+2
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com> Wed, 07 Dec 2011 10:40:11 +0900
--- /dev/null
+Source: isf
+Section: libs
+Priority: standard
+Maintainer: Sehwan Park <sehwan@samsung.com>, Haifeng Deng <haifeng.deng@samsung.com>, Hengliang Luo <hl.luo@samsung.com>, Shuo Liu <shuo0805.liu@samsung.com>, Jihoon Kim <jihoon48.kim@samsung.com>, Yanjie Hu <yanjie.hu@samsung.com>
+Uploaders: Ji-hoon Lee <dalton.lee@samsung.com>
+Build-Depends: debhelper (>= 5), autotools-dev, pkg-config, libelm-dev, libglib2.0-dev,
+ libappcore-efl-dev, libslp-utilx-dev, libslp-setting-dev, libui-gadget-dev, libheynoti-dev,
+ libecore-dev, libevas-dev, libx11-dev, dlog-dev
+Standards-Version: 3.7.2
+Homepage: http://www.scim-im.org
+
+Package: libisf-bin
+Section: libs
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: Input Service Framework
+ An input service framework for TIZEN. It is based on SCIM 1.4.7 and
+ has been enhanced to fit in a mobile environment such as supporting softkeyboard
+Version: 2.3
+
+Package: libisf-dev
+Section: libdevel
+Architecture: any
+Depends: ${misc:Depends}, libisf-bin, libelm-dev, libglib2.0-dev
+Description: ISF header files and static libraries
+ This package contains ISF header files and static libraries for ISE development.
+
+Package: libisf-dbg
+Section: debug
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: Input Service Framework (unstripped)
+ This package contains ISF unstripped files.
--- /dev/null
+This package was debianized by Anthony Fok <foka@debian.org> on Sat,
+05 Apr 2003 23:38:30 +0800. The current package maintainers are Ming Hua
+<minghua-guest@users.alioth.debian.org> and Osamu Aoki <osamu@debian.org>.
+
+The upstream release was downloaded from:
+ http://prdownloads.sourceforge.net/scim/scim-1.4.7.tar.gz
+on 28 Jun 2007.
+
+Upstream Home Page: http://www.scim-im.org/
+
+Upstream Authors: James Su <suzhe@tsinghua.org.cn>
+ LIU Cougar <liucougar@gmail.com>
+ and many developers and translators
+
+Upstream Copyright and License:
+
+ The whole scim software is licensed under GNU Lesser General Public
+ License, version 2 (or any later version). Some of the files are
+ under an MIT/BSD like permissive license.
+
+- The file FrameMgr.c and FrameMgr.h in modules/FrontEnd/IMdkit/:
+
+ Copyright (C) 1993,1994 Digital Equipment Corporation, Maynard,
+ Massachusetts.
+
+ Permission to use, copy, modify, and distribute this software and its
+ documentation for any purpose and without fee is hereby granted,
+ provided that the above copyright notice appear in all copies and that
+ both that copyright notice and this permission notice appear in
+ supporting documentation, and that the names of Digital or MIT not be
+ used in advertising or publicity pertaining to distribution of the
+ software without specific, written prior permission.
+
+ DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ SOFTWARE.
+
+- The file IMConn.c, IMMethod.c, IMValues.c, IMdkit.h, Xi18n.h, Xi18nX.h,
+ XimFunc.h, i18nAttr.c, i18nClbk.c, i18nIc.c, i18nMethod.c, i18nPtHdr.c,
+ i18nUtil.c and i18nX.c in modules/FrontEnd/IMdkit/:
+
+ Copyright (C) 1994,1995 Sun Microsystems, Inc.
+ Copyright (C) 1993,1994 Hewlett-Packard Company.
+
+ Permission to use, copy, modify, distribute, and sell this software
+ and its documentation for any purpose is hereby granted without fee,
+ provided that the above copyright notice appear in all copies and
+ that both that copyright notice and this permission notice appear
+ in supporting documentation, and that the name of Sun Microsystems, Inc.
+ and Hewlett-Packard not be used in advertising or publicity pertaining to
+ distribution of the software without specific, written prior permission.
+ Sun Microsystems, Inc. and Hewlett-Packard make no representations about
+ the suitability of this software for any purpose. It is provided "as is"
+ without express or implied warranty.
+
+ SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL
+ WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY
+ SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+- The file modules/FrontEnd/IMdkit/XimProto.h:
+
+ Copyright (C) 1992,1993,1994 FUJITSU LIMITED.
+
+ Permission to use, copy, modify, distribute, and sell this software
+ and its documentation for any purpose is hereby granted without fee,
+ provided that the above copyright notice appear in all copies and
+ that both that copyright notice and this permission notice appear
+ in supporting documentation, and that the name of FUJITSU LIMITED
+ not be used in advertising or publicity pertaining to distribution
+ of the software without specific, written prior permission.
+ FUJITSU LIMITED makes no representations about the suitability of
+ this software for any purpose.
+ It is provided "as is" without express or implied warranty.
+
+ FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ EVENT SHALL FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+ USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ PERFORMANCE OF THIS SOFTWARE.
+
+- The file modules/FrontEnd/IMdkit/Xtrans.h:
+
+ Copyright (c) 1993,1994 X Consortium.
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS IN THE SOFTWARE.
+
+ Except as contained in this notice, the name of the X Consortium shall
+ not be used in advertising or otherwise to promote the sale, use or
+ other dealings in this Software without prior written authorization
+ from the X Consortium.
+
+ Copyright (c) 1993,1994 NCR Corporation - Dayton, Ohio, USA.
+
+ Permission to use, copy, modify, and distribute this software and its
+ documentation for any purpose and without fee is hereby granted, provided
+ that the above copyright notice appear in all copies and that both that
+ copyright notice and this permission notice appear in supporting
+ documentation, and that the name NCR not be used in advertising
+ or publicity pertaining to distribution of the software without specific,
+ written prior permission. NCR makes no representations about the
+ suitability of this software for any purpose. It is provided "as is"
+ without express or implied warranty.
+
+ NCR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+ NO EVENT SHALL NCR BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+- The file modules/FrontEnd/IMdkit/i18nIMProto.c:
+
+ Copyright (C) 1993,1994 Digital Equipment Corporation, Maynard,
+ Massachusetts.
+ Copyright (C) 1993,1994 Hewlett-Packard Company.
+ Copyright (C) 1994,1995 Sun Microsystems, Inc.
+
+ Permission to use, copy, modify, and distribute this software and its
+ documentation for any purpose and without fee is hereby granted,
+ provided that the above copyright notice appear in all copies and that
+ both that copyright notice and this permission notice appear in
+ supporting documentation, and that the names of Digital or MIT not be
+ used in advertising or publicity pertaining to distribution of the
+ software without specific, written prior permission.
+
+ DIGITAL AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD
+ TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS, IN NO EVENT SHALL DIGITAL AND HEWLETT-PACKARD COMPANY BE LIABLE
+ FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+- Everything else:
+
+ Copyright (C) 2002-2007 James Su and other contributors.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Debian packaging and license:
+
+ The Debian packaging is:
+
+ Copyright (C) 2003,2004 Anthony Fok
+ Copyright (C) 2004-2008 Ming Hua
+ Copyright (C) 2004-2007 Osamu Aoki
+
+ The packaging is license under the same license as scim, i.e., GNU
+ Lesser General Public License, version 2 or later.
+
+On Debian systems, the complete text of the version 2.1 of GNU Lesser General
+Public License can be found in `/usr/share/common-licenses/LGPL-2.1'.
--- /dev/null
+NEWS
+releasenote.txt
--- /dev/null
+usr/bin/*
+usr/etc/*
+usr/share/*
+usr/lib/*.so*
+usr/lib/*/immodules/*.so
+opt/ug/lib/*.so
+opt/ug/res/*
+usr/lib/scim-1.0/scim-launcher
+usr/lib/scim-1.0/scim-helper-launcher
+usr/lib/scim-1.0/1.4.0/Config/*.so
+usr/lib/scim-1.0/1.4.0/FrontEnd/*.so
+usr/lib/scim-1.0/1.4.0/IMEngine/*.so
+etc/*
--- /dev/null
+#!/bin/sh
+
+if [ ${USER} = "root" ]
+then
+ /usr/bin/vconftool set -t string db/isf/input_lang "Automatic" -g 6514
+ /usr/bin/vconftool set -t string db/setting/autocapital_allow 0 -g 6514
+ chmod 755 /etc/profile.d/isf.sh
+ chmod 755 /etc/init.d/isf-panel-efl
+ ln -sf /etc/init.d/isf-panel-efl /etc/rc.d/rc3.d/S42isf-panel-efl
+ ln -sf /etc/init.d/isf-panel-efl /etc/rc.d/rc4.d/S81isf-panel-efl
+else
+ /usr/bin/vconftool set -t string db/isf/input_lang "Automatic"
+ /usr/bin/vconftool set -t string db/setting/autocapital_allow 0
+fi
+
--- /dev/null
+usr/include/*
+usr/lib/*.a
+usr/lib/*.la
+usr/lib/*/immodules/*.a
+usr/lib/*/immodules/*.la
+usr/lib/scim-1.0/1.4.0/Config/*.a
+usr/lib/scim-1.0/1.4.0/Config/*.la
+usr/lib/scim-1.0/1.4.0/FrontEnd/*.a
+usr/lib/scim-1.0/1.4.0/FrontEnd/*.la
+usr/lib/scim-1.0/1.4.0/IMEngine/*.a
+usr/lib/scim-1.0/1.4.0/IMEngine/*.la
+usr/lib/pkgconfig/*.pc
--- /dev/null
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+
+CFLAGS += -Wall -g
+CXXFLAGS += -Wall -g
+PREFIX ?= /usr
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+ CFLAGS += -O0
+ CXXFLAGS += -O0
+else
+ CFLAGS += -O2
+ CXXFLAGS += -O2
+endif
+
+CFLAGS += -fPIC
+CXXFLAGS += -fPIC
+
+LDFLAGS += -Wl,--hash-style=both -Wl,--as-needed
+
+config.status:
+ dh_testdir
+ # Add here commands to configure the package.
+ ./bootstrap
+ CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" PREFIX=$(PREFIX) \
+ ./configure --host=$(DEB_HOST_GNU_TYPE) --prefix=$(PREFIX) --disable-tray-icon --disable-filter-sctc --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info
+
+build: build-stamp
+
+build-stamp: config.status
+ dh_testdir
+
+ # Add here commands to compile the package.
+ $(MAKE)
+ #docbook-to-man debian/isf.sgml > isf.1
+
+ touch $@
+
+clean:
+ dh_testdir
+ dh_testroot
+ rm -f build-stamp
+
+ # Add here commands to clean up after the build process.
+ -$(MAKE) distclean
+ifneq "$(wildcard /usr/share/misc/config.sub)" ""
+ cp -f /usr/share/misc/config.sub config.sub
+endif
+ifneq "$(wildcard /usr/share/misc/config.guess)" ""
+ cp -f /usr/share/misc/config.guess config.guess
+endif
+
+
+ dh_clean
+
+install: build
+ dh_testdir
+ dh_testroot
+ dh_clean -k
+ dh_installdirs
+
+ # Add here commands to install the package into debian/isf.
+ $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install
+
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+ dh_testdir
+ dh_testroot
+ dh_installchangelogs ChangeLog
+ dh_installdocs
+ dh_installexamples
+ dh_install --sourcedir=debian/tmp
+# dh_installmenu
+# dh_installdebconf
+# dh_installlogrotate
+# dh_installemacsen
+# dh_installpam
+# dh_installmime
+# dh_python
+# dh_installinit
+# dh_installcron
+# dh_installinfo
+ dh_installman
+ dh_link
+ dh_strip --dbg-package=libisf-dbg
+ dh_compress
+ dh_fixperms
+# dh_perl
+ dh_makeshlibs
+ dh_installdeb
+ dh_shlibdeps
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install
--- /dev/null
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2005-07-09.11
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+ depmode Dependency tracking mode.
+ source Source file read by `PROGRAMS ARGS'.
+ object Object file output by `PROGRAMS ARGS'.
+ DEPDIR directory where to store dependencies.
+ depfile Dependency file to output.
+ tmpdepfile Temporary file to use when outputing dependencies.
+ libtool Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "depcomp $scriptversion"
+ exit $?
+ ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+ echo "depcomp: Variables source, object and depmode must be set" 1>&2
+ exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+ sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags. We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write. Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+ # HP compiler uses -M and no extra arg.
+ gccflag=-M
+ depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want. Yay! Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff. Hmm.
+ "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## There are various ways to get dependency output from gcc. Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+## up in a subdir. Having to rename by hand is ugly.
+## (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+## -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+## than renaming).
+ if test -z "$gccflag"; then
+ gccflag=-MD,
+ fi
+ "$@" -Wp,"$gccflag$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+ sed -e 's/^[^:]*: / /' \
+ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header). We avoid this by adding
+## dummy dependencies for each header file. Too bad gcc doesn't do
+## this for us directly.
+ tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'. On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like `#:fec' to the end of the
+ # dependency line.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+ tr '
+' ' ' >> $depfile
+ echo >> $depfile
+
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> $depfile
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+aix)
+ # The C for AIX Compiler uses -M and outputs the dependencies
+ # in a .u file. In older versions, this file always lives in the
+ # current directory. Also, the AIX compiler puts `$object:' at the
+ # start of each line; $object doesn't have directory information.
+ # Version 6 uses the directory in both cases.
+ stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
+ tmpdepfile="$stripped.u"
+ if test "$libtool" = yes; then
+ "$@" -Wc,-M
+ else
+ "$@" -M
+ fi
+ stat=$?
+
+ if test -f "$tmpdepfile"; then :
+ else
+ stripped=`echo "$stripped" | sed 's,^.*/,,'`
+ tmpdepfile="$stripped.u"
+ fi
+
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile"; then
+ outname="$stripped.o"
+ # Each line is of the form `foo.o: dependent.h'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+ sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+icc)
+ # Intel's C compiler understands `-MD -MF file'. However on
+ # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+ # ICC 7.0 will fill foo.d with something like
+ # foo.o: sub/foo.c
+ # foo.o: sub/foo.h
+ # which is wrong. We want:
+ # sub/foo.o: sub/foo.c
+ # sub/foo.o: sub/foo.h
+ # sub/foo.c:
+ # sub/foo.h:
+ # ICC 7.1 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using \ :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each line is of the form `foo.o: dependent.h',
+ # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+ sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+tru64)
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in `foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+ if test "$libtool" = yes; then
+ # With Tru64 cc, shared objects can also be used to make a
+ # static library. This mecanism is used in libtool 1.4 series to
+ # handle both shared and static libraries in a single compilation.
+ # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+ #
+ # With libtool 1.5 this exception was removed, and libtool now
+ # generates 2 separate objects for the 2 libraries. These two
+ # compilations output dependencies in in $dir.libs/$base.o.d and
+ # in $dir$base.o.d. We have to check for both files, because
+ # one of the two compilations can be disabled. We should prefer
+ # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+ # automatically cleaned when .libs/ is deleted, while ignoring
+ # the former would cause a distcleancheck panic.
+ tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
+ tmpdepfile2=$dir$base.o.d # libtool 1.5
+ tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
+ tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1=$dir$base.o.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ tmpdepfile4=$dir$base.d
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+#nosideeffect)
+ # This comment above is used by automake to tell side-effect
+ # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ test -z "$dashmflag" && dashmflag=-M
+ # Require at least two characters before searching for `:'
+ # in the target name. This is to cope with DOS-style filenames:
+ # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+ "$@" $dashmflag |
+ sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+dashXmstdout)
+ # This case only exists to satisfy depend.m4. It is never actually
+ # run, as this mode is specially recognized in the preamble.
+ exit 1
+ ;;
+
+makedepend)
+ "$@" || exit $?
+ # Remove any Libtool call
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no
+ for arg in "$@"; do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ case "$arg" in
+ -D*|-I*)
+ set fnord "$@" "$arg"; shift ;;
+ # Strip any option that makedepend may not understand. Remove
+ # the object too, otherwise makedepend will parse it as a source file.
+ -*|$object)
+ ;;
+ *)
+ set fnord "$@" "$arg"; shift ;;
+ esac
+ done
+ obj_suffix="`echo $object | sed 's/^.*\././'`"
+ touch "$tmpdepfile"
+ ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile" "$tmpdepfile".bak
+ ;;
+
+cpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ "$@" -E |
+ sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+ sed '$ s: \\$::' > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ cat < "$tmpdepfile" >> "$depfile"
+ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvisualcpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o,
+ # because we must use -o when running libtool.
+ "$@" || exit $?
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ echo " " >> "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
--- /dev/null
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2005-05-14.22
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
+
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+-c (ignored)
+-d create directories instead of installing files.
+-g GROUP $chgrpprog installed files to GROUP.
+-m MODE $chmodprog installed files to MODE.
+-o USER $chownprog installed files to USER.
+-s $stripprog installed files.
+-t DIRECTORY install into DIRECTORY.
+-T report an error if DSTFILE is a directory.
+--help display this help and exit.
+--version display version info and exit.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+ case $1 in
+ -c) shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ --help) echo "$usage"; exit $?;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd=$stripprog
+ shift
+ continue;;
+
+ -t) dstarg=$2
+ shift
+ shift
+ continue;;
+
+ -T) no_target_directory=true
+ shift
+ continue;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ *) # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ test -n "$dir_arg$dstarg" && break
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dstarg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dstarg"
+ shift # fnord
+ fi
+ shift # arg
+ dstarg=$arg
+ done
+ break;;
+ esac
+done
+
+if test -z "$1"; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call `install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+for src
+do
+ # Protect names starting with `-'.
+ case $src in
+ -*) src=./$src ;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ src=
+
+ if test -d "$dst"; then
+ mkdircmd=:
+ chmodcmd=
+ else
+ mkdircmd=$mkdirprog
+ fi
+ else
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dstarg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+
+ dst=$dstarg
+ # Protect names starting with `-'.
+ case $dst in
+ -*) dst=./$dst ;;
+ esac
+
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
+ if test -d "$dst"; then
+ if test -n "$no_target_directory"; then
+ echo "$0: $dstarg: Is a directory" >&2
+ exit 1
+ fi
+ dst=$dst/`basename "$src"`
+ fi
+ fi
+
+ # This sed command emulates the dirname command.
+ dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
+
+ # Make sure that the destination directory exists.
+
+ # Skip lots of stat calls in the usual case.
+ if test ! -d "$dstdir"; then
+ defaultIFS='
+ '
+ IFS="${IFS-$defaultIFS}"
+
+ oIFS=$IFS
+ # Some sh's can't handle IFS=/ for some reason.
+ IFS='%'
+ set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+ shift
+ IFS=$oIFS
+
+ pathcomp=
+
+ while test $# -ne 0 ; do
+ pathcomp=$pathcomp$1
+ shift
+ if test ! -d "$pathcomp"; then
+ $mkdirprog "$pathcomp"
+ # mkdir can fail with a `File exist' error in case several
+ # install-sh are creating the directory concurrently. This
+ # is OK.
+ test -d "$pathcomp" || exit
+ fi
+ pathcomp=$pathcomp/
+ done
+ fi
+
+ if test -n "$dir_arg"; then
+ $doit $mkdircmd "$dst" \
+ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+ else
+ dstfile=`basename "$dst"`
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+ trap '(exit $?); exit' 1 2 13 15
+
+ # Copy the file name to the temp name.
+ $doit $cpprog "$src" "$dsttmp" &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+ # Now rename the file to the real destination.
+ { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
+ || {
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ if test -f "$dstdir/$dstfile"; then
+ $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+ || {
+ echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+ (exit 1); exit 1
+ }
+ else
+ :
+ fi
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+ }
+ }
+ fi || { (exit 1); exit 1; }
+done
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+ (exit 0); exit 0
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
--- /dev/null
+#!@INTLTOOL_PERL@ -w
+# -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+
+#
+# The Intltool Message Extractor
+#
+# Copyright (C) 2000-2001, 2003 Free Software Foundation.
+#
+# Intltool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+#
+# Intltool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+#
+# Authors: Kenneth Christiansen <kenneth@gnu.org>
+# Darin Adler <darin@bentspoon.com>
+#
+
+## Release information
+my $PROGRAM = "intltool-extract";
+my $PACKAGE = "intltool";
+my $VERSION = "0.33";
+
+## Loaded modules
+use strict;
+use File::Basename;
+use Getopt::Long;
+
+## Scalars used by the option stuff
+my $TYPE_ARG = "0";
+my $LOCAL_ARG = "0";
+my $HELP_ARG = "0";
+my $VERSION_ARG = "0";
+my $UPDATE_ARG = "0";
+my $QUIET_ARG = "0";
+my $SRCDIR_ARG = ".";
+
+my $FILE;
+my $OUTFILE;
+
+my $gettext_type = "";
+my $input;
+my %messages = ();
+my %loc = ();
+my %count = ();
+my %comments = ();
+my $strcount = 0;
+
+## Use this instead of \w for XML files to handle more possible characters.
+my $w = "[-A-Za-z0-9._:]";
+
+## Always print first
+$| = 1;
+
+## Handle options
+GetOptions (
+ "type=s" => \$TYPE_ARG,
+ "local|l" => \$LOCAL_ARG,
+ "help|h" => \$HELP_ARG,
+ "version|v" => \$VERSION_ARG,
+ "update" => \$UPDATE_ARG,
+ "quiet|q" => \$QUIET_ARG,
+ "srcdir=s" => \$SRCDIR_ARG,
+ ) or &error;
+
+&split_on_argument;
+
+
+## Check for options.
+## This section will check for the different options.
+
+sub split_on_argument {
+
+ if ($VERSION_ARG) {
+ &version;
+
+ } elsif ($HELP_ARG) {
+ &help;
+
+ } elsif ($LOCAL_ARG) {
+ &place_local;
+ &extract;
+
+ } elsif ($UPDATE_ARG) {
+ &place_normal;
+ &extract;
+
+ } elsif (@ARGV > 0) {
+ &place_normal;
+ &message;
+ &extract;
+
+ } else {
+ &help;
+
+ }
+}
+
+sub place_normal {
+ $FILE = $ARGV[0];
+ $OUTFILE = "$FILE.h";
+}
+
+sub place_local {
+ $FILE = $ARGV[0];
+ $OUTFILE = fileparse($FILE, ());
+ if (!-e "tmp/") {
+ system("mkdir tmp/");
+ }
+ $OUTFILE = "./tmp/$OUTFILE.h"
+}
+
+sub determine_type {
+ if ($TYPE_ARG =~ /^gettext\/(.*)/) {
+ $gettext_type=$1
+ }
+}
+
+## Sub for printing release information
+sub version{
+ print <<_EOF_;
+${PROGRAM} (${PACKAGE}) $VERSION
+Copyright (C) 2000, 2003 Free Software Foundation, Inc.
+Written by Kenneth Christiansen, 2000.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+_EOF_
+ exit;
+}
+
+## Sub for printing usage information
+sub help {
+ print <<_EOF_;
+Usage: ${PROGRAM} [OPTION]... [FILENAME]
+Generates a header file from an XML source file.
+
+It grabs all strings between <_translatable_node> and its end tag in
+XML files. Read manpage (man ${PROGRAM}) for more info.
+
+ --type=TYPE Specify the file type of FILENAME. Currently supports:
+ "gettext/glade", "gettext/ini", "gettext/keys"
+ "gettext/rfc822deb", "gettext/schemas",
+ "gettext/scheme", "gettext/xml"
+ -l, --local Writes output into current working directory
+ (conflicts with --update)
+ --update Writes output into the same directory the source file
+ reside (conflicts with --local)
+ --srcdir Root of the source tree
+ -v, --version Output version information and exit
+ -h, --help Display this help and exit
+ -q, --quiet Quiet mode
+
+Report bugs to http://bugzilla.gnome.org/ (product name "$PACKAGE")
+or send email to <xml-i18n-tools\@gnome.org>.
+_EOF_
+ exit;
+}
+
+## Sub for printing error messages
+sub error{
+ print STDERR "Try `${PROGRAM} --help' for more information.\n";
+ exit;
+}
+
+sub message {
+ print "Generating C format header file for translation.\n" unless $QUIET_ARG;
+}
+
+sub extract {
+ &determine_type;
+
+ &convert;
+
+ open OUT, ">$OUTFILE";
+ &msg_write;
+ close OUT;
+
+ print "Wrote $OUTFILE\n" unless $QUIET_ARG;
+}
+
+sub convert {
+
+ ## Reading the file
+ {
+ local (*IN);
+ local $/; #slurp mode
+ open (IN, "<$SRCDIR_ARG/$FILE") || die "can't open $SRCDIR_ARG/$FILE: $!";
+ $input = <IN>;
+ }
+
+ &type_ini if $gettext_type eq "ini";
+ &type_keys if $gettext_type eq "keys";
+ &type_xml if $gettext_type eq "xml";
+ &type_glade if $gettext_type eq "glade";
+ &type_scheme if $gettext_type eq "scheme";
+ &type_schemas if $gettext_type eq "schemas";
+ &type_rfc822deb if $gettext_type eq "rfc822deb";
+}
+
+sub entity_decode_minimal
+{
+ local ($_) = @_;
+
+ s/'/'/g; # '
+ s/"/"/g; # "
+ s/&/&/g;
+
+ return $_;
+}
+
+sub entity_decode
+{
+ local ($_) = @_;
+
+ s/'/'/g; # '
+ s/"/"/g; # "
+ s/&/&/g;
+ s/</</g;
+ s/>/>/g;
+
+ return $_;
+}
+
+sub escape_char
+{
+ return '\"' if $_ eq '"';
+ return '\n' if $_ eq "\n";
+ return '\\' if $_ eq '\\';
+
+ return $_;
+}
+
+sub escape
+{
+ my ($string) = @_;
+ return join "", map &escape_char, split //, $string;
+}
+
+sub type_ini {
+ ### For generic translatable desktop files ###
+ while ($input =~ /^_.*=(.*)$/mg) {
+ $messages{$1} = [];
+ }
+}
+
+sub type_keys {
+ ### For generic translatable mime/keys files ###
+ while ($input =~ /^\s*_\w+=(.*)$/mg) {
+ $messages{$1} = [];
+ }
+}
+
+sub type_xml {
+ ### For generic translatable XML files ###
+
+ while ($input =~ /(?:<!--([^>]*?)-->[^\n]*\n?[^\n]*)?\s_$w+\s*=\s*\"([^"]*)\"/sg) { # "
+ $messages{entity_decode_minimal($2)} = [];
+ $comments{entity_decode_minimal($2)} = $1 if (defined($1));
+ }
+
+ while ($input =~ /(?:<!--([^>]*?)-->\s*)?<_($w+)(?: xml:space="($w+)")?[^>]*>(.*?)<\/_\2>/sg) {
+ $_ = $4;
+ if (!defined($3) || $3 ne "preserve") {
+ s/\s+/ /g;
+ s/^ //;
+ s/ $//;
+ }
+ $messages{$_} = [];
+ $comments{$_} = $1 if (defined($1));
+ }
+}
+
+sub type_schemas {
+ ### For schemas XML files ###
+
+ # FIXME: We should handle escaped < (less than)
+ while ($input =~ /
+ <locale\ name="C">\s*
+ (<default>\s*(?:<!--([^>]*?)-->\s*)?(.*?)\s*<\/default>\s*)?
+ (<short>\s*(?:<!--([^>]*?)-->\s*)?(.*?)\s*<\/short>\s*)?
+ (<long>\s*(?:<!--([^>]*?)-->\s*)?(.*?)\s*<\/long>\s*)?
+ <\/locale>
+ /sgx) {
+ my @totranslate = ($3,$6,$9);
+ my @eachcomment = ($2,$5,$8);
+ foreach (@totranslate) {
+ my $currentcomment = shift @eachcomment;
+ next if !$_;
+ s/\s+/ /g;
+ $messages{entity_decode_minimal($_)} = [];
+ $comments{entity_decode_minimal($_)} = $currentcomment if (defined($currentcomment));
+ }
+ }
+}
+
+sub type_rfc822deb {
+ ### For rfc822-style Debian configuration files ###
+
+ my $lineno = 1;
+ my $type = '';
+ while ($input =~ /\G(.*?)(^|\n)(_+)([^:]+):[ \t]*(.*?)(?=\n\S|$)/sg)
+ {
+ my ($pre, $newline, $underscore, $tag, $text) = ($1, $2, $3, $4, $5);
+ while ($pre =~ m/\n/g)
+ {
+ $lineno ++;
+ }
+ $lineno += length($newline);
+ my @str_list = rfc822deb_split(length($underscore), $text);
+ for my $str (@str_list)
+ {
+ $strcount++;
+ $messages{$str} = [];
+ $loc{$str} = $lineno;
+ $count{$str} = $strcount;
+ my $usercomment = '';
+ while($pre =~ s/(^|\n)#([^\n]*)$//s)
+ {
+ $usercomment = "\n" . $2 . $usercomment;
+ }
+ $comments{$str} = $tag . $usercomment;
+ }
+ $lineno += ($text =~ s/\n//g);
+ }
+}
+
+sub rfc822deb_split {
+ # Debian defines a special way to deal with rfc822-style files:
+ # when a value contain newlines, it consists of
+ # 1. a short form (first line)
+ # 2. a long description, all lines begin with a space,
+ # and paragraphs are separated by a single dot on a line
+ # This routine returns an array of all paragraphs, and reformat
+ # them.
+ # When first argument is 2, the string is a comma separated list of
+ # values.
+ my $type = shift;
+ my $text = shift;
+ $text =~ s/^[ \t]//mg;
+ return (split(/, */, $text, 0)) if $type ne 1;
+ return ($text) if $text !~ /\n/;
+
+ $text =~ s/([^\n]*)\n//;
+ my @list = ($1);
+ my $str = '';
+ for my $line (split (/\n/, $text))
+ {
+ chomp $line;
+ if ($line =~ /^\.\s*$/)
+ {
+ # New paragraph
+ $str =~ s/\s*$//;
+ push(@list, $str);
+ $str = '';
+ }
+ elsif ($line =~ /^\s/)
+ {
+ # Line which must not be reformatted
+ $str .= "\n" if length ($str) && $str !~ /\n$/;
+ $line =~ s/\s+$//;
+ $str .= $line."\n";
+ }
+ else
+ {
+ # Continuation line, remove newline
+ $str .= " " if length ($str) && $str !~ /\n$/;
+ $str .= $line;
+ }
+ }
+ $str =~ s/\s*$//;
+ push(@list, $str) if length ($str);
+ return @list;
+}
+
+sub type_glade {
+ ### For translatable Glade XML files ###
+
+ my $tags = "label|title|text|format|copyright|comments|preview_text|tooltip|message";
+
+ while ($input =~ /<($tags)>([^<]+)<\/($tags)>/sg) {
+ # Glade sometimes uses tags that normally mark translatable things for
+ # little bits of non-translatable content. We work around this by not
+ # translating strings that only includes something like label4 or window1.
+ $messages{entity_decode($2)} = [] unless $2 =~ /^(window|label|dialog)[0-9]+$/;
+ }
+
+ while ($input =~ /<items>(..[^<]*)<\/items>/sg) {
+ for my $item (split (/\n/, $1)) {
+ $messages{entity_decode($item)} = [];
+ }
+ }
+
+ ## handle new glade files
+ while ($input =~ /<(property|atkproperty)\s+[^>]*translatable\s*=\s*"yes"(?:\s+[^>]*comments\s*=\s*"([^"]*)")?[^>]*>([^<]+)<\/\1>/sg) {
+ $messages{entity_decode($3)} = [] unless $3 =~ /^(window|label)[0-9]+$/;
+ if (defined($2) and !($3 =~ /^(window|label)[0-9]+$/)) {
+ $comments{entity_decode($3)} = entity_decode($2) ;
+ }
+ }
+ while ($input =~ /<atkaction\s+action_name="([^>]*)"\s+description="([^>]+)"\/>/sg) {
+ $messages{entity_decode_minimal($2)} = [];
+ }
+}
+
+sub type_scheme {
+ my ($line, $i, $state, $str, $trcomment, $char);
+ for $line (split(/\n/, $input)) {
+ $i = 0;
+ $state = 0; # 0 - nothing, 1 - string, 2 - translatable string
+ while ($i < length($line)) {
+ if (substr($line,$i,1) eq "\"") {
+ if ($state == 2) {
+ $comments{$str} = $trcomment if ($trcomment);
+ $messages{$str} = [];
+ $str = '';
+ $state = 0; $trcomment = "";
+ } elsif ($state == 1) {
+ $str = '';
+ $state = 0; $trcomment = "";
+ } else {
+ $state = 1;
+ $str = '';
+ if ($i>0 && substr($line,$i-1,1) eq '_') {
+ $state = 2;
+ }
+ }
+ } elsif (!$state) {
+ if (substr($line,$i,1) eq ";") {
+ $trcomment = substr($line,$i+1);
+ $trcomment =~ s/^;*\s*//;
+ $i = length($line);
+ } elsif ($trcomment && substr($line,$i,1) !~ /\s|\(|\)|_/) {
+ $trcomment = "";
+ }
+ } else {
+ if (substr($line,$i,1) eq "\\") {
+ $char = substr($line,$i+1,1);
+ if ($char ne "\"" && $char ne "\\") {
+ $str = $str . "\\";
+ }
+ $i++;
+ }
+ $str = $str . substr($line,$i,1);
+ }
+ $i++;
+ }
+ }
+}
+
+sub msg_write {
+ my @msgids;
+ if (%count)
+ {
+ @msgids = sort { $count{$a} <=> $count{$b} } keys %count;
+ }
+ else
+ {
+ @msgids = sort keys %messages;
+ }
+ for my $message (@msgids)
+ {
+ my $offsetlines = 1;
+ $offsetlines++ if $message =~ /%/;
+ if (defined ($comments{$message}))
+ {
+ while ($comments{$message} =~ m/\n/g)
+ {
+ $offsetlines++;
+ }
+ }
+ print OUT "# ".($loc{$message} - $offsetlines). " \"$FILE\"\n"
+ if defined $loc{$message};
+ print OUT "/* ".$comments{$message}." */\n"
+ if defined $comments{$message};
+ print OUT "/* xgettext:no-c-format */\n" if $message =~ /%/;
+
+ my @lines = split (/\n/, $message, -1);
+ for (my $n = 0; $n < @lines; $n++)
+ {
+ if ($n == 0)
+ {
+ print OUT "char *s = N_(\"";
+ }
+ else
+ {
+ print OUT " \"";
+ }
+
+ print OUT escape($lines[$n]);
+
+ if ($n < @lines - 1)
+ {
+ print OUT "\\n\"\n";
+ }
+ else
+ {
+ print OUT "\");\n";
+ }
+ }
+ }
+}
+
--- /dev/null
+#!@INTLTOOL_PERL@ -w
+# -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+
+#
+# The Intltool Message Merger
+#
+# Copyright (C) 2000, 2003 Free Software Foundation.
+# Copyright (C) 2000, 2001 Eazel, Inc
+#
+# Intltool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# version 2 published by the Free Software Foundation.
+#
+# Intltool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+#
+# Authors: Maciej Stachowiak <mjs@noisehavoc.org>
+# Kenneth Christiansen <kenneth@gnu.org>
+# Darin Adler <darin@bentspoon.com>
+#
+# Proper XML UTF-8'ification written by Cyrille Chepelov <chepelov@calixo.net>
+#
+
+## Release information
+my $PROGRAM = "intltool-merge";
+my $PACKAGE = "intltool";
+my $VERSION = "0.33";
+
+## Loaded modules
+use strict;
+use Getopt::Long;
+use Text::Wrap;
+use File::Basename;
+
+my $must_end_tag = -1;
+my $last_depth = -1;
+my $translation_depth = -1;
+my @tag_stack = ();
+my @entered_tag = ();
+my @translation_strings = ();
+my $leading_space = "";
+
+## Scalars used by the option stuff
+my $HELP_ARG = 0;
+my $VERSION_ARG = 0;
+my $BA_STYLE_ARG = 0;
+my $XML_STYLE_ARG = 0;
+my $KEYS_STYLE_ARG = 0;
+my $DESKTOP_STYLE_ARG = 0;
+my $SCHEMAS_STYLE_ARG = 0;
+my $RFC822DEB_STYLE_ARG = 0;
+my $QUIET_ARG = 0;
+my $PASS_THROUGH_ARG = 0;
+my $UTF8_ARG = 0;
+my $MULTIPLE_OUTPUT = 0;
+my $cache_file;
+
+## Handle options
+GetOptions
+(
+ "help" => \$HELP_ARG,
+ "version" => \$VERSION_ARG,
+ "quiet|q" => \$QUIET_ARG,
+ "oaf-style|o" => \$BA_STYLE_ARG, ## for compatibility
+ "ba-style|b" => \$BA_STYLE_ARG,
+ "xml-style|x" => \$XML_STYLE_ARG,
+ "keys-style|k" => \$KEYS_STYLE_ARG,
+ "desktop-style|d" => \$DESKTOP_STYLE_ARG,
+ "schemas-style|s" => \$SCHEMAS_STYLE_ARG,
+ "rfc822deb-style|r" => \$RFC822DEB_STYLE_ARG,
+ "pass-through|p" => \$PASS_THROUGH_ARG,
+ "utf8|u" => \$UTF8_ARG,
+ "multiple-output|m" => \$MULTIPLE_OUTPUT,
+ "cache|c=s" => \$cache_file
+ ) or &error;
+
+my $PO_DIR;
+my $FILE;
+my $OUTFILE;
+
+my %po_files_by_lang = ();
+my %translations = ();
+my $iconv = $ENV{"ICONV"} || $ENV{"INTLTOOL_ICONV"} || "/usr/bin/iconv";
+
+# Use this instead of \w for XML files to handle more possible characters.
+my $w = "[-A-Za-z0-9._:]";
+
+# XML quoted string contents
+my $q = "[^\\\"]*";
+
+## Check for options.
+
+if ($VERSION_ARG)
+{
+ &print_version;
+}
+elsif ($HELP_ARG)
+{
+ &print_help;
+}
+elsif ($BA_STYLE_ARG && @ARGV > 2)
+{
+ &utf8_sanity_check;
+ &preparation;
+ &print_message;
+ &ba_merge_translations;
+ &finalize;
+}
+elsif ($XML_STYLE_ARG && @ARGV > 2)
+{
+ &utf8_sanity_check;
+ &preparation;
+ &print_message;
+ &xml_merge_output;
+ &finalize;
+}
+elsif ($KEYS_STYLE_ARG && @ARGV > 2)
+{
+ &utf8_sanity_check;
+ &preparation;
+ &print_message;
+ &keys_merge_translations;
+ &finalize;
+}
+elsif ($DESKTOP_STYLE_ARG && @ARGV > 2)
+{
+ &utf8_sanity_check;
+ &preparation;
+ &print_message;
+ &desktop_merge_translations;
+ &finalize;
+}
+elsif ($SCHEMAS_STYLE_ARG && @ARGV > 2)
+{
+ &utf8_sanity_check;
+ &preparation;
+ &print_message;
+ &schemas_merge_translations;
+ &finalize;
+}
+elsif ($RFC822DEB_STYLE_ARG && @ARGV > 2)
+{
+ &preparation;
+ &print_message;
+ &rfc822deb_merge_translations;
+ &finalize;
+}
+else
+{
+ &print_help;
+}
+
+exit;
+
+## Sub for printing release information
+sub print_version
+{
+ print <<_EOF_;
+${PROGRAM} (${PACKAGE}) ${VERSION}
+Written by Maciej Stachowiak, Darin Adler and Kenneth Christiansen.
+
+Copyright (C) 2000-2003 Free Software Foundation, Inc.
+Copyright (C) 2000-2001 Eazel, Inc.
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+_EOF_
+ exit;
+}
+
+## Sub for printing usage information
+sub print_help
+{
+ print <<_EOF_;
+Usage: ${PROGRAM} [OPTION]... PO_DIRECTORY FILENAME OUTPUT_FILE
+Generates an output file that includes some localized attributes from an
+untranslated source file.
+
+Mandatory options: (exactly one must be specified)
+ -b, --ba-style includes translations in the bonobo-activation style
+ -d, --desktop-style includes translations in the desktop style
+ -k, --keys-style includes translations in the keys style
+ -s, --schemas-style includes translations in the schemas style
+ -r, --rfc822deb-style includes translations in the RFC822 style
+ -x, --xml-style includes translations in the standard xml style
+
+Other options:
+ -u, --utf8 convert all strings to UTF-8 before merging
+ (default for everything except RFC822 style)
+ -p, --pass-through deprecated, does nothing and issues a warning
+ -m, --multiple-output output one localized file per locale, instead of
+ a single file containing all localized elements
+ -c, --cache=FILE specify cache file name
+ (usually \$top_builddir/po/.intltool-merge-cache)
+ -q, --quiet suppress most messages
+ --help display this help and exit
+ --version output version information and exit
+
+Report bugs to http://bugzilla.gnome.org/ (product name "$PACKAGE")
+or send email to <xml-i18n-tools\@gnome.org>.
+_EOF_
+ exit;
+}
+
+
+## Sub for printing error messages
+sub print_error
+{
+ print STDERR "Try `${PROGRAM} --help' for more information.\n";
+ exit;
+}
+
+
+sub print_message
+{
+ print "Merging translations into $OUTFILE.\n" unless $QUIET_ARG;
+}
+
+
+sub preparation
+{
+ $PO_DIR = $ARGV[0];
+ $FILE = $ARGV[1];
+ $OUTFILE = $ARGV[2];
+
+ &gather_po_files;
+ &get_translation_database;
+}
+
+# General-purpose code for looking up translations in .po files
+
+sub po_file2lang
+{
+ my ($tmp) = @_;
+ $tmp =~ s/^.*\/(.*)\.po$/$1/;
+ return $tmp;
+}
+
+sub gather_po_files
+{
+ for my $po_file (glob "$PO_DIR/*.po") {
+ $po_files_by_lang{po_file2lang($po_file)} = $po_file;
+ }
+}
+
+sub get_local_charset
+{
+ my ($encoding) = @_;
+ my $alias_file = $ENV{"G_CHARSET_ALIAS"} || "/usr/lib/charset.alias";
+
+ # seek character encoding aliases in charset.alias (glib)
+
+ if (open CHARSET_ALIAS, $alias_file)
+ {
+ while (<CHARSET_ALIAS>)
+ {
+ next if /^\#/;
+ return $1 if (/^\s*([-._a-zA-Z0-9]+)\s+$encoding\b/i)
+ }
+
+ close CHARSET_ALIAS;
+ }
+
+ # if not found, return input string
+
+ return $encoding;
+}
+
+sub get_po_encoding
+{
+ my ($in_po_file) = @_;
+ my $encoding = "";
+
+ open IN_PO_FILE, $in_po_file or die;
+ while (<IN_PO_FILE>)
+ {
+ ## example: "Content-Type: text/plain; charset=ISO-8859-1\n"
+ if (/Content-Type\:.*charset=([-a-zA-Z0-9]+)\\n/)
+ {
+ $encoding = $1;
+ last;
+ }
+ }
+ close IN_PO_FILE;
+
+ if (!$encoding)
+ {
+ print STDERR "Warning: no encoding found in $in_po_file. Assuming ISO-8859-1\n" unless $QUIET_ARG;
+ $encoding = "ISO-8859-1";
+ }
+
+ system ("$iconv -f $encoding -t UTF-8 </dev/null 2>/dev/null");
+ if ($?) {
+ $encoding = get_local_charset($encoding);
+ }
+
+ return $encoding
+}
+
+sub utf8_sanity_check
+{
+ print STDERR "Warning: option --pass-through has been removed.\n" if $PASS_THROUGH_ARG;
+ $UTF8_ARG = 1;
+}
+
+sub get_translation_database
+{
+ if ($cache_file) {
+ &get_cached_translation_database;
+ } else {
+ &create_translation_database;
+ }
+}
+
+sub get_newest_po_age
+{
+ my $newest_age;
+
+ foreach my $file (values %po_files_by_lang)
+ {
+ my $file_age = -M $file;
+ $newest_age = $file_age if !$newest_age || $file_age < $newest_age;
+ }
+
+ $newest_age = 0 if !$newest_age;
+
+ return $newest_age;
+}
+
+sub create_cache
+{
+ print "Generating and caching the translation database\n" unless $QUIET_ARG;
+
+ &create_translation_database;
+
+ open CACHE, ">$cache_file" || die;
+ print CACHE join "\x01", %translations;
+ close CACHE;
+}
+
+sub load_cache
+{
+ print "Found cached translation database\n" unless $QUIET_ARG;
+
+ my $contents;
+ open CACHE, "<$cache_file" || die;
+ {
+ local $/;
+ $contents = <CACHE>;
+ }
+ close CACHE;
+ %translations = split "\x01", $contents;
+}
+
+sub get_cached_translation_database
+{
+ my $cache_file_age = -M $cache_file;
+ if (defined $cache_file_age)
+ {
+ if ($cache_file_age <= &get_newest_po_age)
+ {
+ &load_cache;
+ return;
+ }
+ print "Found too-old cached translation database\n" unless $QUIET_ARG;
+ }
+
+ &create_cache;
+}
+
+sub create_translation_database
+{
+ for my $lang (keys %po_files_by_lang)
+ {
+ my $po_file = $po_files_by_lang{$lang};
+
+ if ($UTF8_ARG)
+ {
+ my $encoding = get_po_encoding ($po_file);
+
+ if (lc $encoding eq "utf-8")
+ {
+ open PO_FILE, "<$po_file";
+ }
+ else
+ {
+ print STDERR "WARNING: $po_file is not in UTF-8 but $encoding, converting...\n" unless $QUIET_ARG;;
+
+ open PO_FILE, "$iconv -f $encoding -t UTF-8 $po_file|";
+ }
+ }
+ else
+ {
+ open PO_FILE, "<$po_file";
+ }
+
+ my $nextfuzzy = 0;
+ my $inmsgid = 0;
+ my $inmsgstr = 0;
+ my $msgid = "";
+ my $msgstr = "";
+
+ while (<PO_FILE>)
+ {
+ $nextfuzzy = 1 if /^#, fuzzy/;
+
+ if (/^msgid "((\\.|[^\\])*)"/ )
+ {
+ $translations{$lang, $msgid} = $msgstr if $inmsgstr && $msgid && $msgstr;
+ $msgid = "";
+ $msgstr = "";
+
+ if ($nextfuzzy) {
+ $inmsgid = 0;
+ } else {
+ $msgid = unescape_po_string($1);
+ $inmsgid = 1;
+ }
+ $inmsgstr = 0;
+ $nextfuzzy = 0;
+ }
+
+ if (/^msgstr "((\\.|[^\\])*)"/)
+ {
+ $msgstr = unescape_po_string($1);
+ $inmsgstr = 1;
+ $inmsgid = 0;
+ }
+
+ if (/^"((\\.|[^\\])*)"/)
+ {
+ $msgid .= unescape_po_string($1) if $inmsgid;
+ $msgstr .= unescape_po_string($1) if $inmsgstr;
+ }
+ }
+ $translations{$lang, $msgid} = $msgstr if $inmsgstr && $msgid && $msgstr;
+ }
+}
+
+sub finalize
+{
+}
+
+sub unescape_one_sequence
+{
+ my ($sequence) = @_;
+
+ return "\\" if $sequence eq "\\\\";
+ return "\"" if $sequence eq "\\\"";
+ return "\n" if $sequence eq "\\n";
+ return "\r" if $sequence eq "\\r";
+ return "\t" if $sequence eq "\\t";
+ return "\b" if $sequence eq "\\b";
+ return "\f" if $sequence eq "\\f";
+ return "\a" if $sequence eq "\\a";
+ return chr(11) if $sequence eq "\\v"; # vertical tab, see ascii(7)
+
+ return chr(hex($1)) if ($sequence =~ /\\x([0-9a-fA-F]{2})/);
+ return chr(oct($1)) if ($sequence =~ /\\([0-7]{3})/);
+
+ # FIXME: Is \0 supported as well? Kenneth and Rodney don't want it, see bug #48489
+
+ return $sequence;
+}
+
+sub unescape_po_string
+{
+ my ($string) = @_;
+
+ $string =~ s/(\\x[0-9a-fA-F]{2}|\\[0-7]{3}|\\.)/unescape_one_sequence($1)/eg;
+
+ return $string;
+}
+
+## NOTE: deal with < - < but not > - > because it seems its ok to have
+## > in the entity. For further info please look at #84738.
+sub entity_decode
+{
+ local ($_) = @_;
+
+ s/'/'/g; # '
+ s/"/"/g; # "
+ s/&/&/g;
+ s/</</g;
+
+ return $_;
+}
+
+# entity_encode: (string)
+#
+# Encode the given string to XML format (encode '<' etc).
+
+sub entity_encode
+{
+ my ($pre_encoded) = @_;
+
+ my @list_of_chars = unpack ('C*', $pre_encoded);
+
+ # with UTF-8 we only encode minimalistic
+ return join ('', map (&entity_encode_int_minimalist, @list_of_chars));
+}
+
+sub entity_encode_int_minimalist
+{
+ return """ if $_ == 34;
+ return "&" if $_ == 38;
+ return "'" if $_ == 39;
+ return "<" if $_ == 60;
+ return chr $_;
+}
+
+sub entity_encoded_translation
+{
+ my ($lang, $string) = @_;
+
+ my $translation = $translations{$lang, $string};
+ return $string if !$translation;
+ return entity_encode ($translation);
+}
+
+## XML (bonobo-activation specific) merge code
+
+sub ba_merge_translations
+{
+ my $source;
+
+ {
+ local $/; # slurp mode
+ open INPUT, "<$FILE" or die "can't open $FILE: $!";
+ $source = <INPUT>;
+ close INPUT;
+ }
+
+ open OUTPUT, ">$OUTFILE" or die "can't open $OUTFILE: $!";
+
+ while ($source =~ s|^(.*?)([ \t]*<\s*$w+\s+($w+\s*=\s*"$q"\s*)+/?>)([ \t]*\n)?||s)
+ {
+ print OUTPUT $1;
+
+ my $node = $2 . "\n";
+
+ my @strings = ();
+ $_ = $node;
+ while (s/(\s)_($w+\s*=\s*"($q)")/$1$2/s) {
+ push @strings, entity_decode($3);
+ }
+ print OUTPUT;
+
+ my %langs;
+ for my $string (@strings)
+ {
+ for my $lang (keys %po_files_by_lang)
+ {
+ $langs{$lang} = 1 if $translations{$lang, $string};
+ }
+ }
+
+ for my $lang (sort keys %langs)
+ {
+ $_ = $node;
+ s/(\sname\s*=\s*)"($q)"/$1"$2-$lang"/s;
+ s/(\s)_($w+\s*=\s*")($q)"/$1 . $2 . entity_encoded_translation($lang, $3) . '"'/seg;
+ print OUTPUT;
+ }
+ }
+
+ print OUTPUT $source;
+
+ close OUTPUT;
+}
+
+
+## XML (non-bonobo-activation) merge code
+
+
+# Process tag attributes
+# Only parameter is a HASH containing attributes -> values mapping
+sub getAttributeString
+{
+ my $sub = shift;
+ my $do_translate = shift || 0;
+ my $language = shift || "";
+ my $result = "";
+ my $translate = shift;
+ foreach my $e (reverse(sort(keys %{ $sub }))) {
+ my $key = $e;
+ my $string = $sub->{$e};
+ my $quote = '"';
+
+ $string =~ s/^[\s]+//;
+ $string =~ s/[\s]+$//;
+
+ if ($string =~ /^'.*'$/)
+ {
+ $quote = "'";
+ }
+ $string =~ s/^['"]//g;
+ $string =~ s/['"]$//g;
+
+ if ($do_translate && $key =~ /^_/) {
+ $key =~ s|^_||g;
+ if ($language) {
+
+ # Handle translation
+ #
+ my $decode_string = entity_decode($string);
+ my $translation = $translations{$language, $decode_string};
+ if ($translation) {
+ $translation = entity_encode($translation);
+ $string = $translation;
+ $$translate = 2;
+ } else {
+ $$translate = 2; # we still want translations for deep nesting (FIXME: this will cause
+ # problems since we might get untranslated duplicated entries, but with xml:lang set)
+ # Fix would be to set it here to eg. 3, and do a check in traverse() to see if any of the containing tags
+ # really need translation, and only emit "translation" if there is (this means parsing same data twice)
+ }
+ } else {
+ $$translate = 2 if ($translate && (!$$translate)); # watch not to "overwrite" if $translate == 2
+ }
+ }
+
+ $result .= " $key=$quote$string$quote";
+ }
+ return $result;
+}
+
+# Returns a translatable string from XML node, it works on contents of every node in XML::Parser tree
+# doesn't support nesting of translatable tags (i.e. <_blah>this <_doh>doesn't</_doh> work</_blah> -- besides
+# can you define the correct semantics for this?)
+#
+
+sub getXMLstring
+{
+ my $ref = shift;
+ my @list = @{ $ref };
+ my $result = "";
+
+ my $count = scalar(@list);
+ my $attrs = $list[0];
+ my $index = 1;
+
+ while ($index < $count) {
+ my $type = $list[$index];
+ my $content = $list[$index+1];
+ if (! $type ) {
+ # We've got CDATA
+ if ($content) {
+ # lets strip the whitespace here, and *ONLY* here
+ $content =~ s/\s+/ /gs if (!((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)));
+ $result .= ($content);
+ } else {
+ #print "no cdata content when expected it\n"; # is this possible, is this ok?
+ # what to do if this happens?
+ # Did I mention that I hate XML::Parser tree style?
+ }
+ } else {
+ # We've got another element
+ $result .= "<$type";
+ $result .= getAttributeString(@{$content}[0], 0); # no nested translatable elements
+ if ($content) {
+ my $subresult = getXMLstring($content);
+ if ($subresult) {
+ $result .= ">".$subresult . "</$type>";
+ } else {
+ $result .= "/>";
+ }
+ } else {
+ $result .= "/>";
+ }
+ }
+ $index += 2;
+ }
+ return $result;
+}
+
+# Translate list of nodes if necessary
+sub translate_subnodes
+{
+ my $fh = shift;
+ my $content = shift;
+ my $language = shift || "";
+ my $singlelang = shift || 0;
+
+ my @nodes = @{ $content };
+
+ my $count = scalar(@nodes);
+ my $index = 0;
+ while ($index < $count) {
+ my $type = $nodes[$index];
+ my $rest = $nodes[$index+1];
+ if ($singlelang) {
+ my $oldMO = $MULTIPLE_OUTPUT;
+ $MULTIPLE_OUTPUT = 1;
+ traverse($fh, $type, $rest, $language);
+ $MULTIPLE_OUTPUT = $oldMO;
+ } else {
+ traverse($fh, $type, $rest, $language);
+ }
+ $index += 2;
+ }
+}
+
+sub traverse
+{
+ my $fh = shift;
+ my $nodename = shift;
+ my $content = shift;
+ my $language = shift || "";
+
+ if (!$nodename) {
+ if ($content =~ /^[\s]*$/) {
+ $leading_space .= $content;
+ }
+ print $fh $content;
+ } else {
+ # element
+ my @all = @{ $content };
+ my $attrs = shift @all;
+ my $translate = 0;
+ my $outattr = getAttributeString($attrs, 1, $language, \$translate);
+
+ if ($nodename =~ /^_/) {
+ $translate = 1;
+ $nodename =~ s/^_//;
+ }
+ my $lookup = '';
+ print $fh "<$nodename", $outattr;
+ if ($translate) {
+ $lookup = getXMLstring($content);
+ if (!((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/))) {
+ $lookup =~ s/^\s+//s;
+ $lookup =~ s/\s+$//s;
+ }
+
+ if ($lookup || $translate == 2) {
+ my $translation = $translations{$language, $lookup};
+ if ($MULTIPLE_OUTPUT && ($translation || $translate == 2)) {
+ $translation = $lookup if (!$translation);
+ print $fh " xml:lang=\"", $language, "\"" if $language;
+ print $fh ">";
+ if ($translate == 2) {
+ translate_subnodes($fh, \@all, $language, 1);
+ } else {
+ print $fh $translation;
+ }
+ print $fh "</$nodename>";
+
+ return; # this means there will be no same translation with xml:lang="$language"...
+ # if we want them both, just remove this "return"
+ } else {
+ print $fh ">";
+ if ($translate == 2) {
+ translate_subnodes($fh, \@all, $language, 1);
+ } else {
+ print $fh $lookup;
+ }
+ print $fh "</$nodename>";
+ }
+ } else {
+ print $fh "/>";
+ }
+
+ for my $lang (sort keys %po_files_by_lang) {
+ if ($MULTIPLE_OUTPUT && $lang ne "$language") {
+ next;
+ }
+ if ($lang) {
+ # Handle translation
+ #
+ my $translate = 0;
+ my $localattrs = getAttributeString($attrs, 1, $lang, \$translate);
+ my $translation = $translations{$lang, $lookup};
+ if ($translate && !$translation) {
+ $translation = $lookup;
+ }
+
+ if ($translation || $translate) {
+ print $fh "\n";
+ $leading_space =~ s/.*\n//g;
+ print $fh $leading_space;
+ print $fh "<", $nodename, " xml:lang=\"", $lang, "\"", $localattrs, ">";
+ if ($translate == 2) {
+ translate_subnodes($fh, \@all, $lang, 1);
+ } else {
+ print $fh $translation;
+ }
+ print $fh "</$nodename>";
+ }
+ }
+ }
+
+ } else {
+ my $count = scalar(@all);
+ if ($count > 0) {
+ print $fh ">";
+ my $index = 0;
+ while ($index < $count) {
+ my $type = $all[$index];
+ my $rest = $all[$index+1];
+ traverse($fh, $type, $rest, $language);
+ $index += 2;
+ }
+ print $fh "</$nodename>";
+ } else {
+ print $fh "/>";
+ }
+ }
+ }
+}
+
+sub intltool_tree_cdatastart
+{
+ my $expat = shift;
+ my $clist = $expat->{Curlist};
+ my $pos = $#$clist;
+
+ push @$clist, 0 => $expat->original_string();
+}
+
+sub intltool_tree_cdataend
+{
+ my $expat = shift;
+ my $clist = $expat->{Curlist};
+ my $pos = $#$clist;
+
+ $clist->[$pos] .= $expat->original_string();
+}
+
+sub intltool_tree_char
+{
+ my $expat = shift;
+ my $text = shift;
+ my $clist = $expat->{Curlist};
+ my $pos = $#$clist;
+
+ # Use original_string so that we retain escaped entities
+ # in CDATA sections.
+ #
+ if ($pos > 0 and $clist->[$pos - 1] eq '0') {
+ $clist->[$pos] .= $expat->original_string();
+ } else {
+ push @$clist, 0 => $expat->original_string();
+ }
+}
+
+sub intltool_tree_start
+{
+ my $expat = shift;
+ my $tag = shift;
+ my @origlist = ();
+
+ # Use original_string so that we retain escaped entities
+ # in attribute values. We must convert the string to an
+ # @origlist array to conform to the structure of the Tree
+ # Style.
+ #
+ my @original_array = split /\x/, $expat->original_string();
+ my $source = $expat->original_string();
+
+ # Remove leading tag.
+ #
+ $source =~ s|^\s*<\s*(\S+)||s;
+
+ # Grab attribute key/value pairs and push onto @origlist array.
+ #
+ while ($source)
+ {
+ if ($source =~ /^\s*([\w:-]+)\s*[=]\s*["]/)
+ {
+ $source =~ s|^\s*([\w:-]+)\s*[=]\s*["]([^"]*)["]||s;
+ push @origlist, $1;
+ push @origlist, '"' . $2 . '"';
+ }
+ elsif ($source =~ /^\s*([\w:-]+)\s*[=]\s*[']/)
+ {
+ $source =~ s|^\s*([\w:-]+)\s*[=]\s*[']([^']*)[']||s;
+ push @origlist, $1;
+ push @origlist, "'" . $2 . "'";
+ }
+ else
+ {
+ last;
+ }
+ }
+
+ my $ol = [ { @origlist } ];
+
+ push @{ $expat->{Lists} }, $expat->{Curlist};
+ push @{ $expat->{Curlist} }, $tag => $ol;
+ $expat->{Curlist} = $ol;
+}
+
+sub readXml
+{
+ my $filename = shift || return;
+ if(!-f $filename) {
+ die "ERROR Cannot find filename: $filename\n";
+ }
+
+ my $ret = eval 'require XML::Parser';
+ if(!$ret) {
+ die "You must have XML::Parser installed to run $0\n\n";
+ }
+ my $xp = new XML::Parser(Style => 'Tree');
+ $xp->setHandlers(Char => \&intltool_tree_char);
+ $xp->setHandlers(Start => \&intltool_tree_start);
+ $xp->setHandlers(CdataStart => \&intltool_tree_cdatastart);
+ $xp->setHandlers(CdataEnd => \&intltool_tree_cdataend);
+ my $tree = $xp->parsefile($filename);
+
+# <foo><head id="a">Hello <em>there</em></head><bar>Howdy<ref/></bar>do</foo>
+# would be:
+# [foo, [{}, head, [{id => "a"}, 0, "Hello ", em, [{}, 0, "there"]], bar, [{},
+# 0, "Howdy", ref, [{}]], 0, "do" ] ]
+
+ return $tree;
+}
+
+sub print_header
+{
+ my $infile = shift;
+ my $fh = shift;
+ my $source;
+
+ if(!-f $infile) {
+ die "ERROR Cannot find filename: $infile\n";
+ }
+
+ print $fh qq{<?xml version="1.0" encoding="UTF-8"?>\n};
+ {
+ local $/;
+ open DOCINPUT, "<${FILE}" or die;
+ $source = <DOCINPUT>;
+ close DOCINPUT;
+ }
+ if ($source =~ /(<!DOCTYPE.*\[.*\]\s*>)/s)
+ {
+ print $fh "$1\n";
+ }
+ elsif ($source =~ /(<!DOCTYPE[^>]*>)/s)
+ {
+ print $fh "$1\n";
+ }
+}
+
+sub parseTree
+{
+ my $fh = shift;
+ my $ref = shift;
+ my $language = shift || "";
+
+ my $name = shift @{ $ref };
+ my $cont = shift @{ $ref };
+ traverse($fh, $name, $cont, $language);
+}
+
+sub xml_merge_output
+{
+ my $source;
+
+ if ($MULTIPLE_OUTPUT) {
+ for my $lang (sort keys %po_files_by_lang) {
+ if ( ! -e $lang ) {
+ mkdir $lang or die "Cannot create subdirectory $lang: $!\n";
+ }
+ open OUTPUT, ">$lang/$OUTFILE" or die "Cannot open $lang/$OUTFILE: $!\n";
+ my $tree = readXml($FILE);
+ print_header($FILE, \*OUTPUT);
+ parseTree(\*OUTPUT, $tree, $lang);
+ close OUTPUT;
+ print "CREATED $lang/$OUTFILE\n" unless $QUIET_ARG;
+ }
+ }
+ open OUTPUT, ">$OUTFILE" or die "Cannot open $OUTFILE: $!\n";
+ my $tree = readXml($FILE);
+ print_header($FILE, \*OUTPUT);
+ parseTree(\*OUTPUT, $tree);
+ close OUTPUT;
+ print "CREATED $OUTFILE\n" unless $QUIET_ARG;
+}
+
+sub keys_merge_translations
+{
+ open INPUT, "<${FILE}" or die;
+ open OUTPUT, ">${OUTFILE}" or die;
+
+ while (<INPUT>)
+ {
+ if (s/^(\s*)_(\w+=(.*))/$1$2/)
+ {
+ my $string = $3;
+
+ print OUTPUT;
+
+ my $non_translated_line = $_;
+
+ for my $lang (sort keys %po_files_by_lang)
+ {
+ my $translation = $translations{$lang, $string};
+ next if !$translation;
+
+ $_ = $non_translated_line;
+ s/(\w+)=.*/[$lang]$1=$translation/;
+ print OUTPUT;
+ }
+ }
+ else
+ {
+ print OUTPUT;
+ }
+ }
+
+ close OUTPUT;
+ close INPUT;
+}
+
+sub desktop_merge_translations
+{
+ open INPUT, "<${FILE}" or die;
+ open OUTPUT, ">${OUTFILE}" or die;
+
+ while (<INPUT>)
+ {
+ if (s/^(\s*)_(\w+=(.*))/$1$2/)
+ {
+ my $string = $3;
+
+ print OUTPUT;
+
+ my $non_translated_line = $_;
+
+ for my $lang (sort keys %po_files_by_lang)
+ {
+ my $translation = $translations{$lang, $string};
+ next if !$translation;
+
+ $_ = $non_translated_line;
+ s/(\w+)=.*/${1}[$lang]=$translation/;
+ print OUTPUT;
+ }
+ }
+ else
+ {
+ print OUTPUT;
+ }
+ }
+
+ close OUTPUT;
+ close INPUT;
+}
+
+sub schemas_merge_translations
+{
+ my $source;
+
+ {
+ local $/; # slurp mode
+ open INPUT, "<$FILE" or die "can't open $FILE: $!";
+ $source = <INPUT>;
+ close INPUT;
+ }
+
+ open OUTPUT, ">$OUTFILE" or die;
+
+ # FIXME: support attribute translations
+
+ # Empty nodes never need translation, so unmark all of them.
+ # For example, <_foo/> is just replaced by <foo/>.
+ $source =~ s|<\s*_($w+)\s*/>|<$1/>|g;
+
+ while ($source =~ s/
+ (.*?)
+ (\s+)(<locale\ name="C">(\s*)
+ (<default>\s*(?:<!--[^>]*?-->\s*)?(.*?)\s*<\/default>)?(\s*)
+ (<short>\s*(?:<!--[^>]*?-->\s*)?(.*?)\s*<\/short>)?(\s*)
+ (<long>\s*(?:<!--[^>]*?-->\s*)?(.*?)\s*<\/long>)?(\s*)
+ <\/locale>)
+ //sx)
+ {
+ print OUTPUT $1;
+
+ my $locale_start_spaces = $2 ? $2 : '';
+ my $default_spaces = $4 ? $4 : '';
+ my $short_spaces = $7 ? $7 : '';
+ my $long_spaces = $10 ? $10 : '';
+ my $locale_end_spaces = $13 ? $13 : '';
+ my $c_default_block = $3 ? $3 : '';
+ my $default_string = $6 ? $6 : '';
+ my $short_string = $9 ? $9 : '';
+ my $long_string = $12 ? $12 : '';
+
+ print OUTPUT "$locale_start_spaces$c_default_block";
+
+ $default_string =~ s/\s+/ /g;
+ $default_string = entity_decode($default_string);
+ $short_string =~ s/\s+/ /g;
+ $short_string = entity_decode($short_string);
+ $long_string =~ s/\s+/ /g;
+ $long_string = entity_decode($long_string);
+
+ for my $lang (sort keys %po_files_by_lang)
+ {
+ my $default_translation = $translations{$lang, $default_string};
+ my $short_translation = $translations{$lang, $short_string};
+ my $long_translation = $translations{$lang, $long_string};
+
+ next if (!$default_translation && !$short_translation &&
+ !$long_translation);
+
+ print OUTPUT "\n$locale_start_spaces<locale name=\"$lang\">";
+
+ print OUTPUT "$default_spaces";
+
+ if ($default_translation)
+ {
+ $default_translation = entity_encode($default_translation);
+ print OUTPUT "<default>$default_translation</default>";
+ }
+
+ print OUTPUT "$short_spaces";
+
+ if ($short_translation)
+ {
+ $short_translation = entity_encode($short_translation);
+ print OUTPUT "<short>$short_translation</short>";
+ }
+
+ print OUTPUT "$long_spaces";
+
+ if ($long_translation)
+ {
+ $long_translation = entity_encode($long_translation);
+ print OUTPUT "<long>$long_translation</long>";
+ }
+
+ print OUTPUT "$locale_end_spaces</locale>";
+ }
+ }
+
+ print OUTPUT $source;
+
+ close OUTPUT;
+}
+
+sub rfc822deb_merge_translations
+{
+ my %encodings = ();
+ for my $lang (keys %po_files_by_lang) {
+ $encodings{$lang} = ($UTF8_ARG ? 'UTF-8' : get_po_encoding($po_files_by_lang{$lang}));
+ }
+
+ my $source;
+
+ $Text::Wrap::huge = 'overflow';
+ $Text::Wrap::break = qr/\n|\s(?=\S)/;
+
+ {
+ local $/; # slurp mode
+ open INPUT, "<$FILE" or die "can't open $FILE: $!";
+ $source = <INPUT>;
+ close INPUT;
+ }
+
+ open OUTPUT, ">${OUTFILE}" or die;
+
+ while ($source =~ /(^|\n+)(_*)([^:\s]+)(:[ \t]*)(.*?)(?=\n[\S\n]|$)/sg)
+ {
+ my $sep = $1;
+ my $non_translated_line = $3.$4;
+ my $string = $5;
+ my $underscore = length($2);
+ next if $underscore eq 0 && $non_translated_line =~ /^#/;
+ # Remove [] dummy strings
+ my $stripped = $string;
+ $stripped =~ s/\[\s[^\[\]]*\],/,/g if $underscore eq 2;
+ $stripped =~ s/\[\s[^\[\]]*\]$//;
+ $non_translated_line .= $stripped;
+
+ print OUTPUT $sep.$non_translated_line;
+
+ if ($underscore)
+ {
+ my @str_list = rfc822deb_split($underscore, $string);
+
+ for my $lang (sort keys %po_files_by_lang)
+ {
+ my $is_translated = 1;
+ my $str_translated = '';
+ my $first = 1;
+
+ for my $str (@str_list)
+ {
+ my $translation = $translations{$lang, $str};
+
+ if (!$translation)
+ {
+ $is_translated = 0;
+ last;
+ }
+
+ # $translation may also contain [] dummy
+ # strings, mostly to indicate an empty string
+ $translation =~ s/\[\s[^\[\]]*\]$//;
+
+ if ($first)
+ {
+ if ($underscore eq 2)
+ {
+ $str_translated .= $translation;
+ }
+ else
+ {
+ $str_translated .=
+ Text::Tabs::expand($translation) .
+ "\n";
+ }
+ }
+ else
+ {
+ if ($underscore eq 2)
+ {
+ $str_translated .= ', ' . $translation;
+ }
+ else
+ {
+ $str_translated .= Text::Tabs::expand(
+ Text::Wrap::wrap(' ', ' ', $translation)) .
+ "\n .\n";
+ }
+ }
+ $first = 0;
+
+ # To fix some problems with Text::Wrap::wrap
+ $str_translated =~ s/(\n )+\n/\n .\n/g;
+ }
+ next unless $is_translated;
+
+ $str_translated =~ s/\n \.\n$//;
+ $str_translated =~ s/\s+$//;
+
+ $_ = $non_translated_line;
+ s/^(\w+):\s*.*/$sep${1}-$lang.$encodings{$lang}: $str_translated/s;
+ print OUTPUT;
+ }
+ }
+ }
+ print OUTPUT "\n";
+
+ close OUTPUT;
+ close INPUT;
+}
+
+sub rfc822deb_split
+{
+ # Debian defines a special way to deal with rfc822-style files:
+ # when a value contain newlines, it consists of
+ # 1. a short form (first line)
+ # 2. a long description, all lines begin with a space,
+ # and paragraphs are separated by a single dot on a line
+ # This routine returns an array of all paragraphs, and reformat
+ # them.
+ # When first argument is 2, the string is a comma separated list of
+ # values.
+ my $type = shift;
+ my $text = shift;
+ $text =~ s/^[ \t]//mg;
+ return (split(/, */, $text, 0)) if $type ne 1;
+ return ($text) if $text !~ /\n/;
+
+ $text =~ s/([^\n]*)\n//;
+ my @list = ($1);
+ my $str = '';
+
+ for my $line (split (/\n/, $text))
+ {
+ chomp $line;
+ if ($line =~ /^\.\s*$/)
+ {
+ # New paragraph
+ $str =~ s/\s*$//;
+ push(@list, $str);
+ $str = '';
+ }
+ elsif ($line =~ /^\s/)
+ {
+ # Line which must not be reformatted
+ $str .= "\n" if length ($str) && $str !~ /\n$/;
+ $line =~ s/\s+$//;
+ $str .= $line."\n";
+ }
+ else
+ {
+ # Continuation line, remove newline
+ $str .= " " if length ($str) && $str !~ /\n$/;
+ $str .= $line;
+ }
+ }
+
+ $str =~ s/\s*$//;
+ push(@list, $str) if length ($str);
+
+ return @list;
+}
+
--- /dev/null
+#!@INTLTOOL_PERL@ -w
+# -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+
+#
+# The Intltool Message Updater
+#
+# Copyright (C) 2000-2003 Free Software Foundation.
+#
+# Intltool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# version 2 published by the Free Software Foundation.
+#
+# Intltool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+#
+# Authors: Kenneth Christiansen <kenneth@gnu.org>
+# Maciej Stachowiak
+# Darin Adler <darin@bentspoon.com>
+
+## Release information
+my $PROGRAM = "intltool-update";
+my $VERSION = "0.33";
+my $PACKAGE = "intltool";
+
+## Loaded modules
+use strict;
+use Getopt::Long;
+use Cwd;
+use File::Copy;
+use File::Find;
+
+## Scalars used by the option stuff
+my $HELP_ARG = 0;
+my $VERSION_ARG = 0;
+my $DIST_ARG = 0;
+my $POT_ARG = 0;
+my $HEADERS_ARG = 0;
+my $MAINTAIN_ARG = 0;
+my $REPORT_ARG = 0;
+my $VERBOSE = 0;
+my $GETTEXT_PACKAGE = "";
+my $OUTPUT_FILE = "";
+
+my @languages;
+my %varhash = ();
+my %po_files_by_lang = ();
+
+# Regular expressions to categorize file types.
+# FIXME: Please check if the following is correct
+
+my $xml_support =
+"xml(?:\\.in)*|". # http://www.w3.org/XML/ (Note: .in is not required)
+"ui|". # Bonobo specific - User Interface desc. files
+"lang|". # ?
+"glade2?(?:\\.in)*|". # Glade specific - User Interface desc. files (Note: .in is not required)
+"scm(?:\\.in)*|". # ? (Note: .in is not required)
+"oaf(?:\\.in)+|". # DEPRECATED: Replaces by Bonobo .server files
+"etspec|". # ?
+"server(?:\\.in)+|". # Bonobo specific
+"sheet(?:\\.in)+|". # ?
+"schemas(?:\\.in)+|". # GConf specific
+"pong(?:\\.in)+|". # DEPRECATED: PONG is not used [by GNOME] any longer.
+"kbd(?:\\.in)+"; # GOK specific.
+
+my $ini_support =
+"icon(?:\\.in)+|". # http://www.freedesktop.org/Standards/icon-theme-spec
+"desktop(?:\\.in)+|". # http://www.freedesktop.org/Standards/menu-spec
+"caves(?:\\.in)+|". # GNOME Games specific
+"directory(?:\\.in)+|". # http://www.freedesktop.org/Standards/menu-spec
+"soundlist(?:\\.in)+|". # GNOME specific
+"keys(?:\\.in)+|". # GNOME Mime database specific
+"theme(?:\\.in)+"; # http://www.freedesktop.org/Standards/icon-theme-spec
+
+my $buildin_gettext_support =
+"c|y|cs|cc|cpp|c\\+\\+|h|hh|gob|py";
+
+## Always flush buffer when printing
+$| = 1;
+
+## Sometimes the source tree will be rooted somewhere else.
+my $SRCDIR = ".";
+my $POTFILES_in;
+
+$SRCDIR = $ENV{"srcdir"} if $ENV{"srcdir"};
+$POTFILES_in = "<$SRCDIR/POTFILES.in";
+
+## Handle options
+GetOptions
+(
+ "help" => \$HELP_ARG,
+ "version" => \$VERSION_ARG,
+ "dist|d" => \$DIST_ARG,
+ "pot|p" => \$POT_ARG,
+ "headers|s" => \$HEADERS_ARG,
+ "maintain|m" => \$MAINTAIN_ARG,
+ "report|r" => \$REPORT_ARG,
+ "verbose|x" => \$VERBOSE,
+ "gettext-package|g=s" => \$GETTEXT_PACKAGE,
+ "output-file|o=s" => \$OUTPUT_FILE,
+ ) or &Console_WriteError_InvalidOption;
+
+&Console_Write_IntltoolHelp if $HELP_ARG;
+&Console_Write_IntltoolVersion if $VERSION_ARG;
+
+my $arg_count = ($DIST_ARG > 0)
+ + ($POT_ARG > 0)
+ + ($HEADERS_ARG > 0)
+ + ($MAINTAIN_ARG > 0)
+ + ($REPORT_ARG > 0);
+
+&Console_Write_IntltoolHelp if $arg_count > 1;
+
+# --version and --help don't require a module name
+my $MODULE = $GETTEXT_PACKAGE || &FindPackageName;
+
+if ($POT_ARG)
+{
+ &GenerateHeaders;
+ &GeneratePOTemplate;
+}
+elsif ($HEADERS_ARG)
+{
+ &GenerateHeaders;
+}
+elsif ($MAINTAIN_ARG)
+{
+ &FindLeftoutFiles;
+}
+elsif ($REPORT_ARG)
+{
+ &GenerateHeaders;
+ &GeneratePOTemplate;
+ &Console_Write_CoverageReport;
+}
+elsif ((defined $ARGV[0]) && $ARGV[0] =~ /^[a-z]/)
+{
+ my $lang = $ARGV[0];
+
+ ## Report error if the language file supplied
+ ## to the command line is non-existent
+ &Console_WriteError_NotExisting("$SRCDIR/$lang.po")
+ if ! -s "$SRCDIR/$lang.po";
+
+ if (!$DIST_ARG)
+ {
+ print "Working, please wait..." if $VERBOSE;
+ &GenerateHeaders;
+ &GeneratePOTemplate;
+ }
+ &POFile_Update ($lang, $OUTPUT_FILE);
+ &Console_Write_TranslationStatus ($lang, $OUTPUT_FILE);
+}
+else
+{
+ &Console_Write_IntltoolHelp;
+}
+
+exit;
+
+#########
+
+sub Console_Write_IntltoolVersion
+{
+ print <<_EOF_;
+${PROGRAM} (${PACKAGE}) $VERSION
+Written by Kenneth Christiansen, Maciej Stachowiak, and Darin Adler.
+
+Copyright (C) 2000-2003 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+_EOF_
+ exit;
+}
+
+sub Console_Write_IntltoolHelp
+{
+ print <<_EOF_;
+Usage: ${PROGRAM} [OPTION]... LANGCODE
+Updates PO template files and merge them with the translations.
+
+Mode of operation (only one is allowed):
+ -p, --pot generate the PO template only
+ -s, --headers generate the header files in POTFILES.in
+ -m, --maintain search for left out files from POTFILES.in
+ -r, --report display a status report for the module
+ -d, --dist merge LANGCODE.po with existing PO template
+
+Extra options:
+ -g, --gettext-package=NAME override PO template name, useful with --pot
+ -o, --output-file=FILE write merged translation to FILE
+ -x, --verbose display lots of feedback
+ --help display this help and exit
+ --version output version information and exit
+
+Examples of use:
+${PROGRAM} --pot just create a new PO template
+${PROGRAM} xy create new PO template and merge xy.po with it
+
+Report bugs to http://bugzilla.gnome.org/ (product name "$PACKAGE")
+or send email to <xml-i18n-tools\@gnome.org>.
+_EOF_
+ exit;
+}
+
+sub echo_n
+{
+ my $str = shift;
+ my $ret = `echo "$str"`;
+
+ $ret =~ s/\n$//; # do we need the "s" flag?
+
+ return $ret;
+}
+
+sub POFile_DetermineType ($)
+{
+ my $type = $_;
+ my $gettext_type;
+
+ my $xml_regex = "(?:" . $xml_support . ")";
+ my $ini_regex = "(?:" . $ini_support . ")";
+ my $buildin_regex = "(?:" . $buildin_gettext_support . ")";
+
+ if ($type =~ /\[type: gettext\/([^\]].*)]/)
+ {
+ $gettext_type=$1;
+ }
+ elsif ($type =~ /schemas(\.in)+$/)
+ {
+ $gettext_type="schemas";
+ }
+ elsif ($type =~ /glade2?(\.in)*$/)
+ {
+ $gettext_type="glade";
+ }
+ elsif ($type =~ /scm(\.in)*$/)
+ {
+ $gettext_type="scheme";
+ }
+ elsif ($type =~ /keys(\.in)+$/)
+ {
+ $gettext_type="keys";
+ }
+
+ # bucket types
+
+ elsif ($type =~ /$xml_regex$/)
+ {
+ $gettext_type="xml";
+ }
+ elsif ($type =~ /$ini_regex$/)
+ {
+ $gettext_type="ini";
+ }
+ elsif ($type =~ /$buildin_regex$/)
+ {
+ $gettext_type="buildin";
+ }
+ else
+ {
+ $gettext_type="unknown";
+ }
+
+ return "gettext\/$gettext_type";
+}
+
+sub TextFile_DetermineEncoding ($)
+{
+ my $gettext_code="ASCII"; # All files are ASCII by default
+ my $filetype=`file $_ | cut -d ' ' -f 2`;
+
+ if ($? eq "0")
+ {
+ if ($filetype =~ /^(ISO|UTF)/)
+ {
+ chomp ($gettext_code = $filetype);
+ }
+ elsif ($filetype =~ /^XML/)
+ {
+ $gettext_code="UTF-8"; # We asume that .glade and other .xml files are UTF-8
+ }
+ }
+
+ return $gettext_code;
+}
+
+sub isNotValidMissing
+{
+ my ($file) = @_;
+
+ return if $file =~ /^\{arch\}\/.*$/;
+ return if $file =~ /^$varhash{"PACKAGE"}-$varhash{"VERSION"}\/.*$/;
+}
+
+sub FindLeftoutFiles
+{
+ my (@buf_i18n_plain,
+ @buf_i18n_xml,
+ @buf_i18n_xml_unmarked,
+ @buf_i18n_ini,
+ @buf_potfiles,
+ @buf_potfiles_ignore,
+ @buf_allfiles,
+ @buf_allfiles_sorted,
+ @buf_potfiles_sorted
+ );
+
+ ## Search and find all translatable files
+ find sub {
+ push @buf_i18n_plain, "$File::Find::name" if /\.($buildin_gettext_support)$/;
+ push @buf_i18n_xml, "$File::Find::name" if /\.($xml_support)$/;
+ push @buf_i18n_ini, "$File::Find::name" if /\.($ini_support)$/;
+ push @buf_i18n_xml_unmarked, "$File::Find::name" if /\.(schemas(\.in)+)$/;
+ }, "..";
+
+
+ open POTFILES, $POTFILES_in or die "$PROGRAM: there's no POTFILES.in!\n";
+ @buf_potfiles = grep !/^(#|\s*$)/, <POTFILES>;
+ close POTFILES;
+
+ foreach (@buf_potfiles) {
+ s/^\[.*]\s*//;
+ }
+
+ print "Searching for missing translatable files...\n" if $VERBOSE;
+
+ ## Check if we should ignore some found files, when
+ ## comparing with POTFILES.in
+ foreach my $ignore ("POTFILES.skip", "POTFILES.ignore")
+ {
+ (-s $ignore) or next;
+
+ if ("$ignore" eq "POTFILES.ignore")
+ {
+ print "The usage of POTFILES.ignore is deprecated. Please consider moving the\n".
+ "content of this file to POTFILES.skip.\n";
+ }
+
+ print "Found $ignore: Ignoring files...\n" if $VERBOSE;
+ open FILE, "<$ignore" or die "ERROR: Failed to open $ignore!\n";
+
+ while (<FILE>)
+ {
+ push @buf_potfiles_ignore, $_ unless /^(#|\s*$)/;
+ }
+ close FILE;
+
+ @buf_potfiles = (@buf_potfiles_ignore, @buf_potfiles);
+ }
+
+ foreach my $file (@buf_i18n_plain)
+ {
+ my $in_comment = 0;
+ my $in_macro = 0;
+
+ open FILE, "<$file";
+ while (<FILE>)
+ {
+ # Handle continued multi-line comment.
+ if ($in_comment)
+ {
+ next unless s-.*\*/--;
+ $in_comment = 0;
+ }
+
+ # Handle continued macro.
+ if ($in_macro)
+ {
+ $in_macro = 0 unless /\\$/;
+ next;
+ }
+
+ # Handle start of macro (or any preprocessor directive).
+ if (/^\s*\#/)
+ {
+ $in_macro = 1 if /^([^\\]|\\.)*\\$/;
+ next;
+ }
+
+ # Handle comments and quoted text.
+ while (m-(/\*|//|\'|\")-) # \' and \" keep emacs perl mode happy
+ {
+ my $match = $1;
+ if ($match eq "/*")
+ {
+ if (!s-/\*.*?\*/--)
+ {
+ s-/\*.*--;
+ $in_comment = 1;
+ }
+ }
+ elsif ($match eq "//")
+ {
+ s-//.*--;
+ }
+ else # ' or "
+ {
+ if (!s-$match([^\\]|\\.)*?$match-QUOTEDTEXT-)
+ {
+ warn "mismatched quotes at line $. in $file\n";
+ s-$match.*--;
+ }
+ }
+ }
+
+ if (/\.GetString ?\(QUOTEDTEXT/)
+ {
+ if (defined isNotValidMissing (unpack("x3 A*", $file))) {
+ ## Remove the first 3 chars and add newline
+ push @buf_allfiles, unpack("x3 A*", $file) . "\n";
+ }
+ last;
+ }
+
+ if (/_\(QUOTEDTEXT/)
+ {
+ if (defined isNotValidMissing (unpack("x3 A*", $file))) {
+ ## Remove the first 3 chars and add newline
+ push @buf_allfiles, unpack("x3 A*", $file) . "\n";
+ }
+ last;
+ }
+ }
+ close FILE;
+ }
+
+ foreach my $file (@buf_i18n_xml)
+ {
+ open FILE, "<$file";
+
+ while (<FILE>)
+ {
+ # FIXME: share the pattern matching code with intltool-extract
+ if (/\s_(.*)=\"/ || /<_[^>]+>/ || /translatable=\"yes\"/)
+ {
+ if (defined isNotValidMissing (unpack("x3 A*", $file))) {
+ push @buf_allfiles, unpack("x3 A*", $file) . "\n";
+ }
+ last;
+ }
+ }
+ close FILE;
+ }
+
+ foreach my $file (@buf_i18n_ini)
+ {
+ open FILE, "<$file";
+ while (<FILE>)
+ {
+ if (/_(.*)=/)
+ {
+ if (defined isNotValidMissing (unpack("x3 A*", $file))) {
+ push @buf_allfiles, unpack("x3 A*", $file) . "\n";
+ }
+ last;
+ }
+ }
+ close FILE;
+ }
+
+ foreach my $file (@buf_i18n_xml_unmarked)
+ {
+ if (defined isNotValidMissing (unpack("x3 A*", $file))) {
+ push @buf_allfiles, unpack("x3 A*", $file) . "\n";
+ }
+ }
+
+
+ @buf_allfiles_sorted = sort (@buf_allfiles);
+ @buf_potfiles_sorted = sort (@buf_potfiles);
+
+ my %in2;
+ foreach (@buf_potfiles_sorted)
+ {
+ $in2{$_} = 1;
+ }
+
+ my @result;
+
+ foreach (@buf_allfiles_sorted)
+ {
+ if (!exists($in2{$_}))
+ {
+ push @result, $_
+ }
+ }
+
+ my @buf_potfiles_notexist;
+
+ foreach (@buf_potfiles_sorted)
+ {
+ chomp (my $dummy = $_);
+ if ("$dummy" ne "" and ! -f "../$dummy")
+ {
+ push @buf_potfiles_notexist, $_;
+ }
+ }
+
+ ## Save file with information about the files missing
+ ## if any, and give information about this procedure.
+ if (@result + @buf_potfiles_notexist > 0)
+ {
+ if (@result)
+ {
+ print "\n" if $VERBOSE;
+ unlink "missing";
+ open OUT, ">missing";
+ print OUT @result;
+ close OUT;
+ warn "\e[1mThe following files contain translations and are currently not in use. Please\e[0m\n".
+ "\e[1mconsider adding these to the POTFILES.in file, located in the po/ directory.\e[0m\n\n";
+ print STDERR @result, "\n";
+ warn "If some of these files are left out on purpose then please add them to\n".
+ "POTFILES.skip instead of POTFILES.in. A file \e[1m'missing'\e[0m containing this list\n".
+ "of left out files has been written in the current directory.\n";
+ }
+ if (@buf_potfiles_notexist)
+ {
+ unlink "notexist";
+ open OUT, ">notexist";
+ print OUT @buf_potfiles_notexist;
+ close OUT;
+ warn "\n" if ($VERBOSE or @result);
+ warn "\e[1mThe following files do not exist anymore:\e[0m\n\n";
+ warn @buf_potfiles_notexist, "\n";
+ warn "Please remove them from POTFILES.in or POTFILES.skip. A file \e[1m'notexist'\e[0m\n".
+ "containing this list of absent files has been written in the current directory.\n";
+ }
+ }
+
+ ## If there is nothing to complain about, notify the user
+ else {
+ print "\nAll files containing translations are present in POTFILES.in.\n" if $VERBOSE;
+ }
+}
+
+sub Console_WriteError_InvalidOption
+{
+ ## Handle invalid arguments
+ print STDERR "Try `${PROGRAM} --help' for more information.\n";
+ exit 1;
+}
+
+sub GenerateHeaders
+{
+ my $EXTRACT = "@INTLTOOL_EXTRACT@";
+ chomp $EXTRACT;
+
+ $EXTRACT = $ENV{"INTLTOOL_EXTRACT"} if $ENV{"INTLTOOL_EXTRACT"};
+
+ ## Generate the .h header files, so we can allow glade and
+ ## xml translation support
+ if (! -x "$EXTRACT")
+ {
+ print STDERR "\n *** The intltool-extract script wasn't found!"
+ ."\n *** Without it, intltool-update can not generate files.\n";
+ exit;
+ }
+ else
+ {
+ open (FILE, $POTFILES_in) or die "$PROGRAM: POTFILES.in not found.\n";
+
+ while (<FILE>)
+ {
+ chomp;
+ next if /^\[\s*encoding/;
+
+ ## Find xml files in POTFILES.in and generate the
+ ## files with help from the extract script
+
+ my $gettext_type= &POFile_DetermineType ($1);
+
+ if (/\.($xml_support|$ini_support)$/ || /^\[/)
+ {
+ s/^\[[^\[].*]\s*//;
+
+ my $filename = "../$_";
+
+ if ($VERBOSE)
+ {
+ system ($EXTRACT, "--update", "--srcdir=$SRCDIR",
+ "--type=$gettext_type", $filename);
+ }
+ else
+ {
+ system ($EXTRACT, "--update", "--type=$gettext_type",
+ "--srcdir=$SRCDIR", "--quiet", $filename);
+ }
+ }
+ }
+ close FILE;
+ }
+}
+
+#
+# Generate .pot file from POTFILES.in
+#
+sub GeneratePOTemplate
+{
+ my $XGETTEXT = $ENV{"XGETTEXT"} || "/scratchbox/devkits/slp-tools/bin/xgettext";
+ my $XGETTEXT_ARGS = $ENV{"XGETTEXT_ARGS"} || '';
+ chomp $XGETTEXT;
+
+ if (! -x $XGETTEXT)
+ {
+ print STDERR " *** xgettext is not found on this system!\n".
+ " *** Without it, intltool-update can not extract strings.\n";
+ exit;
+ }
+
+ print "Building $MODULE.pot...\n" if $VERBOSE;
+
+ open INFILE, $POTFILES_in;
+ unlink "POTFILES.in.temp";
+ open OUTFILE, ">POTFILES.in.temp" or die("Cannot open POTFILES.in.temp for writing");
+
+ my $gettext_support_nonascii = 0;
+
+ # checks for GNU gettext >= 0.12
+ my $dummy = `$XGETTEXT --version --from-code=UTF-8 >/dev/null 2>/dev/null`;
+ if ($? == 0)
+ {
+ $gettext_support_nonascii = 1;
+ }
+ else
+ {
+ # urge everybody to upgrade gettext
+ print STDERR "WARNING: This version of gettext does not support extracting non-ASCII\n".
+ " strings. That means you should install a version of gettext\n".
+ " that supports non-ASCII strings (such as GNU gettext >= 0.12),\n".
+ " or have to let non-ASCII strings untranslated. (If there is any)\n";
+ }
+
+ my $encoding = "ASCII";
+ my $forced_gettext_code;
+ my @temp_headers;
+ my $encoding_problem_is_reported = 0;
+
+ while (<INFILE>)
+ {
+ next if (/^#/ or /^\s*$/);
+
+ chomp;
+
+ my $gettext_code;
+
+ if (/^\[\s*encoding:\s*(.*)\s*\]/)
+ {
+ $forced_gettext_code=$1;
+ }
+ elsif (/\.($xml_support|$ini_support)$/ || /^\[/)
+ {
+ s/^\[.*]\s*//;
+ print OUTFILE "../$_.h\n";
+ push @temp_headers, "../$_.h";
+ $gettext_code = &TextFile_DetermineEncoding ("../$_.h") if ($gettext_support_nonascii and not defined $forced_gettext_code);
+ }
+ else
+ {
+ if ($SRCDIR eq ".") {
+ print OUTFILE "../$_\n";
+ } else {
+ print OUTFILE "$SRCDIR/../$_\n";
+ }
+ $gettext_code = &TextFile_DetermineEncoding ("../$_") if ($gettext_support_nonascii and not defined $forced_gettext_code);
+ }
+
+ next if (! $gettext_support_nonascii);
+
+ if (defined $forced_gettext_code)
+ {
+ $encoding=$forced_gettext_code;
+ }
+ elsif (defined $gettext_code and "$encoding" ne "$gettext_code")
+ {
+ if ($encoding eq "ASCII")
+ {
+ $encoding=$gettext_code;
+ }
+ elsif ($gettext_code ne "ASCII")
+ {
+ # Only report once because the message is quite long
+ if (! $encoding_problem_is_reported)
+ {
+ print STDERR "WARNING: You should use the same file encoding for all your project files,\n".
+ " but $PROGRAM thinks that most of the source files are in\n".
+ " $encoding encoding, while \"$_\" is (likely) in\n".
+ " $gettext_code encoding. If you are sure that all translatable strings\n".
+ " are in same encoding (say UTF-8), please \e[1m*prepend*\e[0m the following\n".
+ " line to POTFILES.in:\n\n".
+ " [encoding: UTF-8]\n\n".
+ " and make sure that configure.in/ac checks for $PACKAGE >= 0.27 .\n".
+ "(such warning message will only be reported once.)\n";
+ $encoding_problem_is_reported = 1;
+ }
+ }
+ }
+ }
+
+ close OUTFILE;
+ close INFILE;
+
+ unlink "$MODULE.pot";
+ my @xgettext_argument=("$XGETTEXT",
+ "--add-comments",
+ "--directory\=\.",
+ "--output\=$MODULE\.pot",
+ "--files-from\=\.\/POTFILES\.in\.temp");
+ my $XGETTEXT_KEYWORDS = &FindPOTKeywords;
+ push @xgettext_argument, $XGETTEXT_KEYWORDS;
+ push @xgettext_argument, "--from-code\=$encoding" if ($gettext_support_nonascii);
+ push @xgettext_argument, $XGETTEXT_ARGS if $XGETTEXT_ARGS;
+ my $xgettext_command = join ' ', @xgettext_argument;
+
+ # intercept xgettext error message
+ print "Running $xgettext_command\n" if $VERBOSE;
+ my $xgettext_error_msg = `$xgettext_command 2>\&1`;
+ my $command_failed = $?;
+
+ unlink "POTFILES.in.temp";
+
+ print "Removing generated header (.h) files..." if $VERBOSE;
+ unlink foreach (@temp_headers);
+ print "done.\n" if $VERBOSE;
+
+ if (! $command_failed)
+ {
+ if (! -e "$MODULE.pot")
+ {
+ print "None of the files in POTFILES.in contain strings marked for translation.\n" if $VERBOSE;
+ }
+ else
+ {
+ print "Wrote $MODULE.pot\n" if $VERBOSE;
+ }
+ }
+ else
+ {
+ if ($xgettext_error_msg =~ /--from-code/)
+ {
+ # replace non-ASCII error message with a more useful one.
+ print STDERR "ERROR: xgettext failed to generate PO template file because there is non-ASCII\n".
+ " string marked for translation. Please make sure that all strings marked\n".
+ " for translation are in uniform encoding (say UTF-8), then \e[1m*prepend*\e[0m the\n".
+ " following line to POTFILES.in and rerun $PROGRAM:\n\n".
+ " [encoding: UTF-8]\n\n";
+ }
+ else
+ {
+ print STDERR "$xgettext_error_msg";
+ if (-e "$MODULE.pot")
+ {
+ # is this possible?
+ print STDERR "ERROR: xgettext failed but still managed to generate PO template file.\n".
+ " Please consult error message above if there is any.\n";
+ }
+ else
+ {
+ print STDERR "ERROR: xgettext failed to generate PO template file. Please consult\n".
+ " error message above if there is any.\n";
+ }
+ }
+ exit (1);
+ }
+}
+
+sub POFile_Update
+{
+ -f "$MODULE.pot" or die "$PROGRAM: $MODULE.pot does not exist.\n";
+
+ my $MSGMERGE = $ENV{"MSGMERGE"} || "/usr/bin/msgmerge";
+ my ($lang, $outfile) = @_;
+
+ print "Merging $SRCDIR/$lang.po with $MODULE.pot..." if $VERBOSE;
+
+ my $infile = "$SRCDIR/$lang.po";
+ $outfile = "$SRCDIR/$lang.po" if ($outfile eq "");
+
+ # I think msgmerge won't overwrite old file if merge is not successful
+ system ("$MSGMERGE", "-o", $outfile, $infile, "$MODULE.pot");
+}
+
+sub Console_WriteError_NotExisting
+{
+ my ($file) = @_;
+
+ ## Report error if supplied language file is non-existing
+ print STDERR "$PROGRAM: $file does not exist!\n";
+ print STDERR "Try '$PROGRAM --help' for more information.\n";
+ exit;
+}
+
+sub GatherPOFiles
+{
+ my @po_files = glob ("./*.po");
+
+ @languages = map (&POFile_GetLanguage, @po_files);
+
+ foreach my $lang (@languages)
+ {
+ $po_files_by_lang{$lang} = shift (@po_files);
+ }
+}
+
+sub POFile_GetLanguage ($)
+{
+ s/^(.*\/)?(.+)\.po$/$2/;
+ return $_;
+}
+
+sub Console_Write_TranslationStatus
+{
+ my ($lang, $output_file) = @_;
+ my $MSGFMT = $ENV{"MSGFMT"} || "/usr/bin/msgfmt";
+
+ $output_file = "$SRCDIR/$lang.po" if ($output_file eq "");
+
+ system ("$MSGFMT", "-o", "/dev/null", "--statistics", $output_file);
+}
+
+sub Console_Write_CoverageReport
+{
+ my $MSGFMT = $ENV{"MSGFMT"} || "/usr/bin/msgfmt";
+
+ &GatherPOFiles;
+
+ foreach my $lang (@languages)
+ {
+ print "$lang: ";
+ &POFile_Update ($lang, "");
+ }
+
+ print "\n\n * Current translation support in $MODULE \n\n";
+
+ foreach my $lang (@languages)
+ {
+ print "$lang: ";
+ system ("$MSGFMT", "-o", "/dev/null", "--statistics", "$SRCDIR/$lang.po");
+ }
+}
+
+sub SubstituteVariable
+{
+ my ($str) = @_;
+
+ # always need to rewind file whenever it has been accessed
+ seek (CONF, 0, 0);
+
+ # cache each variable. varhash is global to we can add
+ # variables elsewhere.
+ while (<CONF>)
+ {
+ if (/^(\w+)=(.*)$/)
+ {
+ ($varhash{$1} = $2) =~ s/^["'](.*)["']$/$1/;
+ }
+ }
+
+ if ($str =~ /^(.*)\${?([A-Z_]+)}?(.*)$/)
+ {
+ my $rest = $3;
+ my $untouched = $1;
+ my $sub = $varhash{$2};
+
+ return SubstituteVariable ("$untouched$sub$rest");
+ }
+
+ # We're using Perl backticks ` and "echo -n" here in order to
+ # expand any shell escapes (such as backticks themselves) in every variable
+ return echo_n ($str);
+}
+
+sub CONF_Handle_Open
+{
+ my $base_dirname = getcwd();
+ $base_dirname =~ s@.*/@@;
+
+ my ($conf_in, $src_dir);
+
+ if ($base_dirname =~ /^po(-.+)?$/)
+ {
+ if (-f "Makevars")
+ {
+ my $makefile_source;
+
+ local (*IN);
+ open (IN, "<Makevars") || die "can't open Makevars: $!";
+
+ while (<IN>)
+ {
+ if (/^top_builddir[ \t]*=/)
+ {
+ $src_dir = $_;
+ $src_dir =~ s/^top_builddir[ \t]*=[ \t]*([^ \t\n\r]*)/$1/;
+
+ chomp $src_dir;
+ if (-f "$src_dir" . "/configure.ac") {
+ $conf_in = "$src_dir" . "/configure.ac" . "\n";
+ } else {
+ $conf_in = "$src_dir" . "/configure.in" . "\n";
+ }
+ last;
+ }
+ }
+ close IN;
+
+ $conf_in || die "Cannot find top_builddir in Makevars.";
+ }
+ elsif (-f "../configure.ac")
+ {
+ $conf_in = "../configure.ac";
+ }
+ elsif (-f "../configure.in")
+ {
+ $conf_in = "../configure.in";
+ }
+ else
+ {
+ my $makefile_source;
+
+ local (*IN);
+ open (IN, "<Makefile") || return;
+
+ while (<IN>)
+ {
+ if (/^top_srcdir[ \t]*=/)
+ {
+ $src_dir = $_;
+ $src_dir =~ s/^top_srcdir[ \t]*=[ \t]*([^ \t\n\r]*)/$1/;
+
+ chomp $src_dir;
+ $conf_in = "$src_dir" . "/configure.in" . "\n";
+
+ last;
+ }
+ }
+ close IN;
+
+ $conf_in || die "Cannot find top_srcdir in Makefile.";
+ }
+
+ open (CONF, "<$conf_in");
+ }
+ else
+ {
+ print STDERR "$PROGRAM: Unable to proceed.\n" .
+ "Make sure to run this script inside the po directory.\n";
+ exit;
+ }
+}
+
+sub FindPackageName
+{
+ my $version;
+ my $domain = &FindMakevarsDomain;
+ my $name = $domain || "untitled";
+
+ &CONF_Handle_Open;
+
+ my $conf_source; {
+ local (*IN);
+ open (IN, "<&CONF") || return $name;
+ seek (IN, 0, 0);
+ local $/; # slurp mode
+ $conf_source = <IN>;
+ close IN;
+ }
+
+ # priority for getting package name:
+ # 1. GETTEXT_PACKAGE
+ # 2. first argument of AC_INIT (with >= 2 arguments)
+ # 3. first argument of AM_INIT_AUTOMAKE (with >= 2 argument)
+
+ # /^AM_INIT_AUTOMAKE\([\s\[]*([^,\)\s\]]+)/m
+ # the \s makes this not work, why?
+ if ($conf_source =~ /^AM_INIT_AUTOMAKE\(([^,\)]+),([^,\)]+)/m)
+ {
+ ($name, $version) = ($1, $2);
+ $name =~ s/[\[\]\s]//g;
+ $version =~ s/[\[\]\s]//g;
+ $varhash{"AC_PACKAGE_NAME"} = $name;
+ $varhash{"PACKAGE"} = $name;
+ $varhash{"AC_PACKAGE_VERSION"} = $version;
+ $varhash{"VERSION"} = $version;
+ }
+
+ if ($conf_source =~ /^AC_INIT\(([^,\)]+),([^,\)]+)/m)
+ {
+ ($name, $version) = ($1, $2);
+ $name =~ s/[\[\]\s]//g;
+ $version =~ s/[\[\]\s]//g;
+ $varhash{"AC_PACKAGE_NAME"} = $name;
+ $varhash{"PACKAGE"} = $name;
+ $varhash{"AC_PACKAGE_VERSION"} = $version;
+ $varhash{"VERSION"} = $version;
+ }
+
+ # \s makes this not work, why?
+ $name = $1 if $conf_source =~ /^GETTEXT_PACKAGE=\[?([^\n\]]+)/m;
+
+ # prepend '$' to auto* internal variables, usually they are
+ # used in configure.in/ac without the '$'
+ $name =~ s/AC_/\$AC_/g;
+ $name =~ s/\$\$/\$/g;
+
+ $name = $domain if $domain;
+
+ $name = SubstituteVariable ($name);
+ $name =~ s/^["'](.*)["']$/$1/;
+
+ return $name if $name;
+}
+
+
+sub FindPOTKeywords
+{
+
+ my $keywords = "--keyword\=\_ --keyword\=N\_ --keyword\=U\_ --keyword\=Q\_";
+ my $varname = "XGETTEXT_OPTIONS";
+ my $make_source; {
+ local (*IN);
+ open (IN, "<Makevars") || (open(IN, "<Makefile.in.in") && ($varname = "XGETTEXT_KEYWORDS")) || return $keywords;
+ seek (IN, 0, 0);
+ local $/; # slurp mode
+ $make_source = <IN>;
+ close IN;
+ }
+
+ $keywords = $1 if $make_source =~ /^$varname[ ]*=\[?([^\n\]]+)/m;
+
+ return $keywords;
+}
+
+sub FindMakevarsDomain
+{
+
+ my $domain = "";
+ my $makevars_source; {
+ local (*IN);
+ open (IN, "<Makevars") || return $domain;
+ seek (IN, 0, 0);
+ local $/; # slurp mode
+ $makevars_source = <IN>;
+ close IN;
+ }
+
+ $domain = $1 if $makevars_source =~ /^DOMAIN[ ]*=\[?([^\n\]\$]+)/m;
+ $domain =~ s/^\s+//;
+ $domain =~ s/\s+$//;
+
+ return $domain;
+}
--- /dev/null
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+localedir=/usr/share/locale
+datadir=@datadir@
+sysconfdir=@sysconfdir@
+
+
+Name: ISF
+Description: Input Service Framework
+Version: @ISF_VERSION@
+Requires:
+Libs: -L${libdir} -lscim@SCIM_EPOCH@
+Cflags: -I${includedir}/scim@SCIM_EPOCH@
--- /dev/null
+2009-10-26 Following files have been removed by Samsung
+- extras/ism_context/ism_context.cpp
+- extras/ism_context/ism_context.h
+- extras/ism_context/Makefile.am
+- src/ism_newise.cpp
+- src/ism_newise.h
+- src/ism_newise_module.cpp
+- src/ism_newise_module.h
+- src/scim_newise_launcher.cpp
+
+2009-10-07 Following files have been changed by Samsung
+- configs/config
+- configs/global
+- extras/gtk2_immodule/gtkimcontextscim.cpp
+- extras/gtk2_immodule/gtkimcontextscim.h
+- extras/gtk2_immodule/imscim.cpp
+- extras/gtk2_immodule/Makefile.am
+- extras/panel/Makefile.am
+- extras/panel/scim_panel_gtk.cpp
+- extras/Makefile.am
+- module/config/Makefile.am
+- module/config/scim_socket_config.cpp
+- module/filter/Makefile.am
+- module/frontend/Makefile.am
+- module/frontend/scim_socket_frontend.cpp
+- module/frontend/scim_socket_frontend.h
+- module/IMEngine/Makefile.am
+- module/Makefile.am
+- src/ltdl.cpp
+- src/Makefile.am
+- src/scim.cpp
+- src/scim_backend.cpp
+- src/scim_backend.h
+- src/scim_compose_key.cpp
+- src/scim_config_path.h
+- src/scim_debug.cpp
+- src/scim_debug.h
+- src/scim_event.cpp
+- src/scim_frontend.cpp
+- src/scim_frontend.h
+- src/scim_global_config.cpp
+- src/scim_global_config.h
+- src/scim_helper.cpp
+- src/scim_helper.h
+- src/scim_helper_launcher.cpp
+- src/scim_helper_manager.cpp
+- src/scim_helper_manager.h
+- src/scim_helper_module.cpp
+- src/scim_helper_module.h
+- src/scim_hotkey.cpp
+- src/scim_hotkey.h
+- src/scim_imengine.cpp
+- src/scim_imengine.h
+- src/scim_keyboard_layout_data.h
+- src/scim_launcher.cpp
+- src/scim_lookup_table.h
+- src/scim_panel_agent.cpp
+- src/scim_panel_agent.h
+- src/scim_panel_client.cpp
+- src/scim_panel_client.h
+- src/scim_signals.h
+- src/scim_socket.cpp
+- src/scim_socket.h
+- src/scim_trans_commands.h
+- src/scim_transaction.cpp
+- src/scim_transaction.h
+- src/scim_utility.cpp
+- src/scim_utility.h
+- utils/Makefile.am
+- utils/scimkeyselection.cpp
+- utils/scimstringview.c
+- utils/scimstringview.h
+
+2009-10-07 Following files have been added by Samsung
+- extras/ism_context/ism_context.cpp
+- extras/ism_context/ism_context.h
+- extras/ism_context/Makefile.am
+- extras/panel/ise_setup_win.cpp
+- extras/panel/ise_setup_win.h
+- extras/panel/isf_lang_win.cpp
+- extras/panel/isf_lang_win.h
+- extras/panel/isf_setup_utility.cpp
+- extras/panel/isf_setup_utility.h
+- extras/panel/isf_setup_win.cpp
+- extras/panel/isf_setup_win.h
+- extras/panel/scim-setup.desktop.in
+- extras/panel/scim-setup.in
+- src/ism_newise.cpp
+- src/ism_newise.h
+- src/ism_newise_module.cpp
+- src/ism_newise_module.h
+- src/scim_newise_launcher.cpp
+
--- /dev/null
+MAINTAINERCLEANFILES = Makefile.in
+
+CLEANFILES = *.bak
+
+if SCIM_BUILD_CONFIG_SIMPLE
+configdir = $(sysconfdir)/scim
+config_DATA = config global
+config_source_data = $(foreach file, $(config_DATA), $(srcdir)/$(file))
+endif
+
+EXTRA_DIST = $(config_DATA)
--- /dev/null
+# This file is encoded in UTF-8 encoding.
+/DefaultIMEngineFactory/~other = d75857a5-4148-4745-89e2-1da7ddaf7999
+/FrontEnd/OnTheSpot = true
+/FrontEnd/ChangeFactoryGlobally = false
+/FrontEnd/SharedInputMethod = true
+/FrontEnd/Socket/ConfigReadOnly = false
+/FrontEnd/Socket/MaxClients = 512
+/Hotkeys/FrontEnd/NextFactory = Control+Alt+Down,Shift+Control+KeyRelease+Shift_L,Shift+Control+KeyRelease+Shift_R
+/Hotkeys/FrontEnd/PreviousFactory = Control+Alt+Up,Shift+Control+KeyRelease+Control_L,Shift+Control+KeyRelease+Control_R
+/Hotkeys/FrontEnd/ShowFactoryMenu = Control+Alt+Right
+/Hotkeys/FrontEnd/Trigger = Control+space
+/Hotkeys/FrontEnd/ValidKeyMask = Shift+Control+Alt+CapsLock+Meta+QuirkKanaRo
+/Panel/Gtk/Color/ActiveBackground = light sky blue
+/Panel/Gtk/Color/ActiveText = black
+/Panel/Gtk/Color/NormalBackground = #DDDDFF
+/Panel/Gtk/Color/NormalText = black
+/Panel/Gtk/Color/HighlightText = #88BB09
+/Panel/Gtk/Font = Vodafone Rg Bold 22
+/Panel/Gtk/DefaultSticked = false
+/Panel/Gtk/LookupTableEmbedded = true
+/Panel/Gtk/LookupTableVertical = true
+/Panel/Gtk/LookupTableStyle = 1
+/Panel/Gtk/LookupTableMode = 1
+/Panel/Gtk/ShowTrayIcon = true
+/Panel/Gtk/ToolBar/AlwaysShow = false
+/Panel/Gtk/ToolBar/HideTimeout = 2
+/Panel/Gtk/ToolBar/POS_X = -1
+/Panel/Gtk/ToolBar/POS_Y = -1
--- /dev/null
+/SupportedUnicodeLocales = en_US.UTF-8
+/DefaultPanelProgram = isf-panel-efl
+/DefaultConfigModule = simple
+/DefaultSocketFrontEndAddress = local:/tmp/scim-socket-frontend
+/DefaultSocketIMEngineAddress = local:/tmp/scim-socket-frontend
+/DefaultSocketConfigAddress = local:/tmp/scim-socket-frontend
+/DefaultPanelSocketAddress = local:/tmp/scim-panel-socket
+/DefaultHelperManagerSocketAddress = local:/tmp/scim-socket-frontend
+/DefaultSocketTimeout = 5000
+/InitialIseType = 1
+/InitialIseUuid = 12aa3425-f88d-45f4-a509-cee8dfe904e3
+/InitialIseName = Tizen Keyboard
--- /dev/null
+## Makefile.am -- Process this file with automake to produce Makefile.in
+## Copyright (C) 2002 James Su
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+MAINTAINERCLEANFILES = Makefile.in
+CLEANFILES = *.bak
+
+SUBDIRS = icons pixmaps
+
+desktopdir = /usr/share/applications/
+desktop_DATA = isf-panel-efl.desktop
+
+isfshelldir = /etc/profile.d/
+isfshell_DATA = isf.sh
+
+bootscriptdir = /etc/init.d/
+bootscript_DATA = isf-panel-efl
--- /dev/null
+## Makefile.am -- Process this file with automake to produce Makefile.in
+## Copyright (C) 2002 James Su
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+MAINTAINERCLEANFILES = Makefile.in
+
+NOINST_ICONS = setup.xpm \
+ full-letter.xpm \
+ half-letter.xpm \
+ help.xpm \
+ up.xpm \
+ down.xpm \
+ left.xpm \
+ right.xpm \
+ pin-down.xpm \
+ pin-up.xpm \
+ full-punct.xpm \
+ half-punct.xpm \
+ trademark.xpm \
+ menu.xpm
+
+INST_ICONS = up.png \
+ down.png \
+ left.png \
+ right.png \
+ 01_header_icon_cancel.png \
+ 01_header_icon_done.png \
+ 01_list_select_all.png \
+ ISF_candidate_bg.png \
+ ISF_candidate_divider.png \
+ ISF_icon_31_help.png \
+ ISF_icon_31_help_t.png \
+ ISF_icon_help.png \
+ ISF_icon_option.png \
+ ISF_panel_bg.png
+
+SCTC_FILTER_ICONS = sctc.png \
+ sctc-sc-to-tc.png \
+ sctc-tc-to-sc.png
+
+if SCIM_BUILD_FILTER_SCTC
+INST_SCTC_ICONS = $(SCTC_FILTER_ICONS)
+endif
+
+EXTRA_DIST = $(NOINST_ICONS) \
+ $(INST_ICONS) \
+ $(SCTC_FILTER_ICONS)
+
+icondir = @SCIM_ICONDIR@
+icon_DATA = $(INST_ICONS) $(INST_SCTC_ICONS)
+
--- /dev/null
+/* XPM */
+static const char *down_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 64 1",
+" c #000000",
+". c #03060c",
+"X c #050b12",
+"o c #060f19",
+"O c #001f03",
+"+ c #05141e",
+"@ c #071620",
+"# c #0b293e",
+"$ c #070144",
+"% c #0b0265",
+"& c #0c026b",
+"* c #0c0271",
+"= c #0d324c",
+"- c #0d3652",
+"; c #026f0c",
+": c #02710c",
+"> c #144059",
+", c #18425f",
+"< c #0d4864",
+"1 c #0e5775",
+"2 c #114560",
+"3 c #124d6f",
+"4 c #254a64",
+"5 c #600a01",
+"6 c #6d0b02",
+"7 c #106589",
+"8 c #10698f",
+"9 c #337f9e",
+"0 c #0e8fb6",
+"q c #0e96bd",
+"w c #1697b7",
+"e c #1299bb",
+"r c #1f95b2",
+"t c #2b91ae",
+"y c #2695b1",
+"u c #0e9ec3",
+"i c #0fa0c4",
+"p c #0eadcb",
+"a c #14a5c9",
+"s c #1ca2c3",
+"d c #1babca",
+"f c #1bb2ce",
+"g c #1db4d0",
+"h c #1bbad1",
+"j c #2ab4d1",
+"k c #15c1da",
+"l c #64a3bd",
+"z c #46b8d5",
+"x c #53b7d4",
+"c c #54bdd7",
+"v c #40d1db",
+"b c #5fc0d8",
+"n c #46dbe6",
+"m c #48dfe9",
+"M c #8fcce2",
+"N c #a0cbdf",
+"B c #a7dcec",
+"V c #bfdfee",
+"C c #d3e5f0",
+"Z c #dfeff8",
+"A c #e0f1fb",
+"S c #eff3fc",
+"D c white",
+"F c None",
+/* pixels */
+"FFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFF",
+"FFFFF3334,=FFFFF",
+"FFFFF3NSCl+FFFFF",
+"FFFFF3AcMt+FFFFF",
+"FFFFF3Spvy+FFFFF",
+"FFFFF4Aqmr+FFFFF",
+"F-3344Vqhe12># F",
+"FF-9ABc0qkms7.FF",
+"FFF-9Duqims7oFFF",
+"FFFF=tDams7XFFFF",
+"FFFFF=9As7XFFFFF",
+"FFFFFF-87oFFFFFF",
+"FFFFFFF-.FFFFFFF",
+"FFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFF"
+};
--- /dev/null
+/* XPM */
+static const char *full_letter_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #0000ff",
+"................",
+".....######.....",
+"....#.....##....",
+"...#........#...",
+"..#..........#..",
+".##...........#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#...........##.",
+"..#..........#..",
+"...#........#...",
+"....##.....#....",
+".....######.....",
+"................"};
--- /dev/null
+/* XPM */
+static const char * full_punct_xpm[] = {
+"16 16 2 1",
+" c None",
+". c #1520EF",
+" ",
+" ",
+" ",
+" ",
+" .... ... ",
+" .. .. ..... ",
+" . . ..... ",
+" . . ..... ",
+" .. .. .... ",
+" .... ... ",
+" .. ",
+" ... ",
+" ... ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static const char *half_letter_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #0000ff",
+"................",
+"................",
+"..........##....",
+"..........#.#...",
+"..........#..#..",
+"..........#...#.",
+"..........#...#.",
+".........#....#.",
+".........#....#.",
+"........#.....#.",
+".......#.....##.",
+".....##......#..",
+"...##.......#...",
+"....##.....#....",
+".....######.....",
+"................"};
--- /dev/null
+/* XPM */
+static const char * half_punct_xpm[] = {
+"16 16 2 1",
+" c None",
+". c #1520EF",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" .. .. ",
+" .... .... ",
+" .... .... ",
+" .. ... ",
+" . ",
+" . ",
+" .. ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static const char *help_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 16 1",
+" c black",
+". c #00385b",
+"X c #003e66",
+"o c #00406a",
+"O c #004572",
+"+ c #00528c",
+"@ c #005896",
+"# c #005a99",
+"$ c #2a82bf",
+"% c #2982c0",
+"& c #408fc6",
+"* c #4f97ca",
+"= c #66a7d1",
+"- c #6baad2",
+"; c #8bbbdc",
+": c None",
+/* pixels */
+"::::...... :::::",
+":::.$+ ++ :::",
+"::X-+ :::.$++ ::",
+"::O* :::::.$+ ::",
+"::.$+ ::::X&+ ::",
+":::.++ :::o&+ ::",
+":::: ::.=+ :::",
+"::::::::.;# ::::",
+":::::::.=# :::::",
+"::::::.$+ ::::::",
+"::::::.$+ ::::::",
+"::::::: :::::::",
+"::::::::::::::::",
+":::::::..:::::::",
+"::::::.=+ ::::::",
+"::::::: :::::::"
+};
--- /dev/null
+/* XPM */
+static const char * left_xpm[] = {
+"16 16 40 1",
+" c None",
+". c #000000",
+"+ c #0A121F",
+"@ c #071728",
+"# c #105375",
+"$ c #155678",
+"% c #1CA2C3",
+"& c #16597A",
+"* c #138DB0",
+"= c #3CD7E1",
+"- c #0A263B",
+"; c #081E31",
+"> c #48DFE9",
+", c #0EA0C5",
+"' c #159ABC",
+") c #2A98B3",
+"! c #178EAC",
+"~ c #061625",
+"{ c #0E97BF",
+"] c #26BDD3",
+"^ c #43D5DE",
+"/ c #2CC7D5",
+"( c #19B3CE",
+"_ c #091A2B",
+": c #124C6E",
+"< c #819EBA",
+"[ c #DDEFF8",
+"} c #59C3DA",
+"| c #1197B9",
+"1 c #58ACC5",
+"2 c #FDFBFD",
+"3 c #71D1E0",
+"4 c #9DDAEB",
+"5 c #CDEBF6",
+"6 c #80C2DB",
+"7 c #1A4C6B",
+"8 c #114760",
+"9 c #E2F0F9",
+"0 c #7DA0B8",
+"a c #20374F",
+" ",
+" . ",
+" +. ",
+" @#. ",
+" @$%. ",
+" @&*=&---.. ",
+" ;$*>,'')!!. ",
+" ~$*=,{]^^/(_ ",
+" :<[}({||||1_ ",
+" $<23(45256_ ",
+" 7<2}8$#### ",
+" 7<9. ",
+" 70. ",
+" :a ",
+" $ ",
+" "};
--- /dev/null
+/* XPM */
+static const char *menu_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 4 1",
+" c black",
+". c #1F4AEA",
+"X c gray100",
+"o c None",
+/* pixels */
+"oooooooooooooooo",
+"oo ooo",
+"oo XXXXXXXXX ooo",
+"oo X X ooo",
+"oo XXXXXXXXX ooo",
+"oo X . X ooo",
+"oo XXXXX..XX ooo",
+"oo X .X.X ooo",
+"oo XXXXX.XX. ooo",
+"oo X .XXX.ooo",
+"oo XXXXX.XXXX.oo",
+"oo X .XXX...o",
+"oo XXXXX.X.X.ooo",
+"oo .. .X.oo",
+"oooooooo.oo.X.oo",
+"oooooooooooo..oo"
+};
--- /dev/null
+/* XPM */
+static const char * pin_down_xpm[] = {
+"16 16 4 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+"@ c #B4B6B4",
+" ",
+" ",
+" .... ",
+" ..++++. ",
+" ...++++++. ",
+" .+.+++@@@. ",
+" .++.++@@@.. ",
+" .++..+@@... ",
+" .++++..... ",
+" .+++@@@@.. ",
+" .+@@@@... ",
+" .@@@@... ",
+" ...... ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static const char * pin_up_xpm[] = {
+"16 16 4 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+"@ c #B4B6B4",
+" ",
+" ",
+" ",
+" ",
+" .. . ",
+" .+. .. ",
+" .++...+. ",
+" ++++++.@+@+@+. ",
+" @@@@@@.@+@+@+. ",
+" .......@@.@.@. ",
+" .@...... ",
+" ... .. ",
+" .. . ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static const char * right_xpm[] = {
+"16 16 43 1",
+" c None",
+". c #000000",
+"+ c #0B293E",
+"@ c #03060C",
+"# c #144059",
+"$ c #106589",
+"% c #060F19",
+"& c #114560",
+"* c #1CA2C3",
+"= c #050B12",
+"- c #0D324C",
+"; c #05141E",
+"> c #0E5775",
+", c #48DFE9",
+"' c #18425F",
+") c #64A3BD",
+"! c #2B91AE",
+"~ c #2695B1",
+"{ c #1F95B2",
+"] c #1299BB",
+"^ c #15C1DA",
+"/ c #254A64",
+"( c #D3E5F0",
+"_ c #8FCCE2",
+": c #40D1DB",
+"< c #1BBAD1",
+"[ c #0E96BD",
+"} c #0FA0C4",
+"| c #124D6F",
+"1 c #EFF3FC",
+"2 c #54BDD7",
+"3 c #0EADCB",
+"4 c #0E8FB6",
+"5 c #14A5C9",
+"6 c #E0F1FB",
+"7 c #10698F",
+"8 c #0D3652",
+"9 c #A0CBDF",
+"0 c #BFDFEE",
+"a c #0E9EC3",
+"b c #FFFFFF",
+"c c #337F9E",
+"d c #A7DCEC",
+" ",
+" . ",
+" +@ ",
+" #$% ",
+" &*$= ",
+" -;;;;>,*$= ",
+" ')!~{]^,*$% ",
+" /(_:,<[},*$@ ",
+" |123[[4[5678 ",
+" |961602abc8 ",
+" ||||//db!- ",
+" /6c- ",
+" |c8 ",
+" |8 ",
+" 8 ",
+" "};
--- /dev/null
+/* XPM */
+static const char *setup_xpm[]={
+"16 16 15 1",
+". c None",
+"# c #000000",
+"l c #303030",
+"i c #585858",
+"b c #646464",
+"f c #787878",
+"a c #808080",
+"d c #a0a0a0",
+"j c #b7b7b7",
+"e c #b8b8b8",
+"c c #c2c2c2",
+"m c #cfcfcf",
+"k c #e7e7e7",
+"h c #ededed",
+"g c #ffffff",
+"...######.......",
+"...#ab.cd##.....",
+"....#efb.cd#....",
+"###..##eb.c#....",
+"#gc##..#b..d#...",
+"#gh.c#ibc..j#...",
+"#bgh......kcd##.",
+"lgbfghh..kcmcdd#",
+"#c.gbbbfdch.mcjd",
+".##c.cccfbfgh.mc",
+"...###d.ccdbfgh.",
+"......####h.dbfg",
+"..........##h.db",
+"............##h.",
+"..............##",
+"................"};
--- /dev/null
+/* XPM */
+static const char * trademark_xpm[] = {
+"24 24 5 1",
+" c None",
+". c #3D55FD",
+"+ c #D71FEF",
+"@ c #568C56",
+"# c #F93E00",
+" ",
+" ",
+" ...... +++ ",
+" ... ... +++++++ ",
+" .. ++ ++ ",
+" .. ++ ",
+" ..... ++ ",
+" .... ++ ",
+" .. ++ ",
+" .. ++ ++ ",
+" ... ... +++++++ ",
+" ...... +++++ ",
+" ",
+" @@@@@@@@ ## ## ",
+" @@@@@@@@ ## ## ",
+" @@ ### ### ",
+" @@ ### ### ",
+" @@ ######## ",
+" @@ ######## ",
+" @@ ## ## ## ",
+" @@ ## ## ## ",
+" @@@@@@@@ ## ## ## ",
+" @@@@@@@@ ## ## ## ",
+" "};
--- /dev/null
+/* XPM */
+static const char *up_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 65 1",
+" c #000000",
+". c #06101d",
+"X c #0a121f",
+"o c #061625",
+"O c #071728",
+"+ c #071a2b",
+"@ c #091a2b",
+"# c #081e31",
+"$ c #082033",
+"% c #0a263b",
+"& c #2f0500",
+"* c #323e01",
+"= c #20374f",
+"- c #18415d",
+"; c #0f4b6a",
+": c #0f5d7e",
+"> c #114760",
+", c #124c6e",
+"< c #1a4c6b",
+"1 c #105375",
+"2 c #155678",
+"3 c #16597a",
+"4 c #214764",
+"5 c #3c5c73",
+"6 c #710c02",
+"7 c #42556d",
+"8 c #116c92",
+"9 c #287c9f",
+"0 c #14839f",
+"q c #0e97bf",
+"w c #178eac",
+"e c #138db0",
+"r c #1290b4",
+"t c #1197b9",
+"y c #159abc",
+"u c #2294b1",
+"i c #2a98b3",
+"p c #0ea0c5",
+"a c #14a5c9",
+"s c #1ca2c3",
+"d c #19b3ce",
+"f c #1bb8d2",
+"g c #26bdd3",
+"h c #2cc7d5",
+"j c #3cd7e1",
+"k c #5486a3",
+"l c #7da0b8",
+"z c #4bbfd8",
+"x c #58acc5",
+"c c #50b3cf",
+"v c #43d5de",
+"b c #50c1d9",
+"n c #59c3da",
+"m c #48dfe9",
+"M c #71d1e0",
+"N c #c3162e",
+"B c #819eba",
+"V c #80c2db",
+"C c #9ddaeb",
+"Z c #b6dae9",
+"A c #cdebf6",
+"S c #ddeff8",
+"D c #e2f0f9",
+"F c #fdfbfd",
+"G c None",
+/* pixels */
+"GGGGGGGGGGGGGGGG",
+"GGGGGGGGGGGGGGGG",
+"GGGGGGG,oGGGGGGG",
+"GGGGGG2B2#GGGGGG",
+"GGGGG<BSe2OGGGGG",
+"GGGG<BFnje3OGGGG",
+"GGG<BFMdpme2OGGG",
+"GG,lDndqqpjs1XGG",
+"G2= >Ctgy3 G",
+"GGGGG2Atvy%GGGGG",
+"GGGGG1Ftvi%GGGGG",
+"GGGGG1Athw%GGGGG",
+"GGGGG1Vxdw GGGGG",
+"GGGGG1@@@ GGGGG",
+"GGGGGGGGGGGGGGGG",
+"GGGGGGGGGGGGGGGG"
+};
--- /dev/null
+#!/bin/sh
+
+while [ ! -f /tmp/.wm_ready ];
+do
+ sleep 0.1
+done
+
+/usr/bin/isf-panel-efl &
--- /dev/null
+[Desktop Entry]
+Encoding=UTF-8
+Name=ISFPanel
+Comment=ISF Panel Application
+Exec=/usr/bin/isf-panel-efl
+Icon=elementary
+Terminal=false
+Type=Application
+Categories=Applications;Utility;
--- /dev/null
+export SCIM_MODULE_PATH=/opt/apps/scim/lib/scim-1.0
--- /dev/null
+## Makefile.am -- Process this file with automake to produce Makefile.in
+## Copyright (C) 2002 James Su
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+MAINTAINERCLEANFILES = Makefile.in
+CLEANFILES = *.bak *.edj
+
+ISF_CANDIDATE_PNG = 08_textinput_predictive_popup_arrow.png \
+ 08_textinput_predictive_popup_arrow_2.png
+
+#pixmapsdir = @SCIM_DATADIR@/pixmaps
+#pixmaps_DATA = $(ISF_CANDIDATE_PNG)
+
+EXTRA_DIST = $(ISF_CANDIDATE_PNG)
+
+# edjes
+isf_candidate_theme1.edj : isf_candidate_theme1.edc
+ edje_cc $^ $@
+
+isf_candidate_theme2.edj : isf_candidate_theme2.edc
+ edje_cc $^ $@
+
+isfsetting.edj : isfsetting.edc
+ edje_cc $^ $@
+
+edjdir = @SCIM_DATADIR@
+edj_DATA = isf_candidate_theme1.edj isf_candidate_theme2.edj isfsetting.edj
--- /dev/null
+
+#define FONT_NAME "SLP:style=medium"
+#define FONT_SIZE 30
+
+#define AUX_FONT_NAME "SLP:style=medium"
+#define AUX_FONT_SIZE 30
+
+#define BG_IMAGE_BORDER 12
+
+
+collections {
+ group { name: "popup_line";
+ images {
+ image: POPUP_LINE COMP;
+ }
+
+ parts {
+ part { name: "bg";
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ image.normal: POPUP_LINE;
+ image.border: 12 12 0 0;
+ }
+ }
+ }
+ }
+
+ group { name: "candidate_bg";
+ images {
+ image: CANDIDATE_BG COMP;
+ image: "08_textinput_panel_bg.png" COMP;
+ }
+
+ parts {
+ part { name: "bg";
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ image.normal: CANDIDATE_BG;
+ image.border: BG_IMAGE_BORDER BG_IMAGE_BORDER BG_IMAGE_BORDER BG_IMAGE_BORDER;
+ }
+ description { state: "port_single" 0.0;
+ inherit: "default" 0.0;
+ }
+ description { state: "port_more" 0.0;
+ inherit: "default" 0.0;
+ }
+ description { state: "land_single" 0.0;
+ inherit: "default" 0.0;
+ }
+ description { state: "land_more" 0.0;
+ inherit: "default" 0.0;
+ }
+ description { state: "port_more_2" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ image.normal: "08_textinput_panel_bg.png";
+ image.border: BG_IMAGE_BORDER BG_IMAGE_BORDER BG_IMAGE_BORDER BG_IMAGE_BORDER;
+ }
+ description { state: "land_more_2" 0.0;
+ inherit: "port_more_2" 0.0;
+ }
+ }
+ }
+
+ programs {
+ program { name: "port_single";
+ signal, "candidate_bg,state,port_single";
+ source, "candidate_bg";
+ action, STATE_SET "port_single" 0.0;
+ target, "bg";
+ }
+
+ program { name: "port_more";
+ signal, "candidate_bg,state,port_more";
+ source, "candidate_bg";
+ action, STATE_SET "port_more" 0.0;
+ target, "bg";
+ }
+
+ program { name: "land_single";
+ signal, "candidate_bg,state,land_single";
+ source, "candidate_bg";
+ action, STATE_SET "land_single" 0.0;
+ target, "bg";
+ }
+
+ program { name: "land_more";
+ signal, "candidate_bg,state,land_more";
+ source, "candidate_bg";
+ action, STATE_SET "land_more" 0.0;
+ target, "bg";
+ }
+
+ program { name: "port_more_2";
+ signal, "candidate_bg,state,port_more_2";
+ source, "candidate_bg";
+ action, STATE_SET "port_more_2" 0.0;
+ target, "bg";
+ }
+
+ program { name: "land_more_2";
+ signal, "candidate_bg,state,land_more_2";
+ source, "candidate_bg";
+ action, STATE_SET "land_more_2" 0.0;
+ target, "bg";
+ }
+ }
+ }
+
+ group { name: "candidate";
+ images {
+ image: BUTTON_NORMAL_BG COMP;
+ image: BUTTON_PRESS_BG COMP;
+ }
+
+ parts {
+ part { name: "bg";
+ mouse_events: 1;
+ description { state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ image.normal: BUTTON_NORMAL_BG;
+ image.border: BUTTON_IMAGE_BORDER BUTTON_IMAGE_BORDER BUTTON_IMAGE_BORDER BUTTON_IMAGE_BORDER;
+ }
+ description { state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ image.normal: BUTTON_PRESS_BG;
+ }
+ }
+
+ part { name: "candidate";
+ type: TEXT;
+ mouse_events: 0;
+ //effect: SHADOW;
+ description { state: "default" 0.0;
+ color: COLOR_NORMAL_TEXT;
+ text {
+ text_class: "candidate_text_class";
+ text: "Test";
+ font: FONT_NAME;
+ size: FONT_SIZE;
+ align: 0.5 0.5;
+ }
+ rel1.to: "bg";
+ rel1.relative: 0.0 0.0;
+ rel1.offset: 11 0;
+ rel2.to: "bg";
+ rel2.relative: 1.0 1.0;
+ rel2.offset: -11 0;
+ }
+ description { state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ color: COLOR_PRESS_TEXT;
+ }
+ }
+ }
+
+ programs {
+ program { name: "button_click";
+ signal: "mouse,clicked,1";
+ source: "bg";
+ action: SIGNAL_EMIT "candidate,action,clicked" "";
+ }
+
+ program { name, "button_press";
+ signal, "mouse,down,1";
+ source, "bg";
+ action, STATE_SET "pressed" 0.0;
+ target, "bg";
+ target, "candidate";
+ }
+
+ program { name, "button_release";
+ signal, "mouse,up,1";
+ source, "bg";
+ action, STATE_SET "default" 0.0;
+ target, "bg";
+ target, "candidate";
+ //after, "do_me";
+ }
+
+ program { name, "do_me";
+ //signal, "*";
+ //source, "button_release";
+ action, SIGNAL_EMIT "candidate,action,clicked" "";
+ }
+ }
+ }
+
+ group { name: "candidate_button";
+
+ images {
+ image: "08_textinput_button_128x56.png" COMP;
+ image: "08_textinput_button_128x56_pre.png" COMP;
+ }
+
+ parts {
+ part { name: "bg";
+ mouse_events: 1;
+ description { state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ image.normal: "08_textinput_button_128x56.png";
+ }
+ description { state: "pressed" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ image.normal: "08_textinput_button_128x56_pre.png";
+ }
+ }
+
+ part { name: "button_text";
+ type: TEXT;
+ mouse_events: 0;
+ effect: SHADOW;
+ description { state: "default" 0.0;
+ color: 255 255 255 255;
+ text {
+ text_class: "candidate_text_class";
+ text: "Test";
+ font: FONT_NAME;
+ size: FONT_SIZE;
+ align: 0.5 0.5;
+ }
+ rel1.to: "bg";
+ rel1.relative: 0.0 0.0;
+ rel2.to: "bg";
+ rel2.relative: 1.0 1.0;
+ }
+ }
+ }
+
+ programs {
+ program { name: "button_click";
+ signal: "mouse,clicked,1";
+ source: "bg";
+ action: SIGNAL_EMIT "button,action,clicked" "";
+ }
+
+ program { name, "button_press";
+ signal, "mouse,down,1";
+ source, "bg";
+ action, STATE_SET "pressed" 0.0;
+ target, "bg";
+ }
+
+ program { name, "button_release";
+ signal, "mouse,up,1";
+ source, "bg";
+ action, STATE_SET "default" 0.0;
+ target, "bg";
+ }
+ }
+ }
+
+ group { name: "close_button";
+
+ images {
+ image: "08_textinput_button_close_114x71.png" COMP;
+ image: "08_textinput_button_close_114x71_pre.png" COMP;
+ }
+
+ parts {
+ part { name: "bg";
+ mouse_events: 1;
+ description { state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ image.normal: "08_textinput_button_close_114x71.png";
+ }
+ description { state: "pressed" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ image.normal: "08_textinput_button_close_114x71_pre.png";
+ }
+ }
+
+ part { name: "button_text";
+ type: TEXT;
+ mouse_events: 0;
+ effect: SHADOW;
+ description { state: "default" 0.0;
+ color: 255 255 255 255;
+ text {
+ text_class: "button_text_class";
+ text: "Close";
+ font: FONT_NAME;
+ size: FONT_SIZE;
+ align: 0.5 0.5;
+ }
+ rel1.to: "bg";
+ rel1.relative: 0.0 0.0;
+ rel2.to: "bg";
+ rel2.relative: 1.0 1.0;
+ }
+ }
+ }
+
+ programs {
+ program { name: "button_click";
+ signal: "mouse,clicked,1";
+ source: "bg";
+ action: SIGNAL_EMIT "button,action,clicked" "";
+ }
+
+ program { name, "button_press";
+ signal, "mouse,down,1";
+ source, "bg";
+ action, STATE_SET "pressed" 0.0;
+ target, "bg";
+ }
+
+ program { name, "button_release";
+ signal, "mouse,up,1";
+ source, "bg";
+ action, STATE_SET "default" 0.0;
+ target, "bg";
+ }
+ }
+ }
+
+ group { name: "page_button_port";
+
+ images {
+ image: "08_textinput_sym_arrow_left.png" COMP;
+ image: "08_textinput_sym_arrow_right.png" COMP;
+ image: "08_textinput_button_232x71.png" COMP;
+ image: "08_textinput_button_232x71_pre_left.png" COMP;
+ image: "08_textinput_button_232x71_pre_right.png" COMP;
+ }
+
+ parts {
+ part { name: "bg";
+ description { state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ image.normal: "08_textinput_button_232x71.png";
+ }
+ description { state: "left_pressed" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ image.normal: "08_textinput_button_232x71_pre_left.png";
+ }
+ description { state: "right_pressed" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ image.normal: "08_textinput_button_232x71_pre_right.png";
+ }
+ }
+
+ part { name: "left";
+ mouse_events: 1;
+ description { state: "default" 0.0;
+ rel1.to: "bg";
+ rel1.relative: 0.0 0.0;
+ rel1.offset: 0 0;
+ rel2.to: "bg";
+ rel2.relative: 0.0 1.0;
+ rel2.offset: 68 0;
+ image.normal: "08_textinput_sym_arrow_left.png";
+ }
+ }
+ part { name: "right";
+ mouse_events: 1;
+ description { state: "default" 0.0;
+ rel1.to: "bg";
+ rel1.relative: 1.0 0.0;
+ rel1.offset: -68 0;
+ rel2.to: "bg";
+ rel2.relative: 1.0 1.0;
+ rel2.offset: 0 0;
+ image.normal: "08_textinput_sym_arrow_right.png";
+ }
+ }
+
+ part { name: "page_text";
+ type: TEXT;
+ mouse_events: 0;
+ effect: SHADOW;
+ description { state: "default" 0.0;
+ color: 255 255 255 255;
+ text {
+ text_class: "page_text_class";
+ text: "1/1";
+ font: FONT_NAME;
+ size: FONT_SIZE;
+ align: 0.5 0.5;
+ }
+ rel1.to: "bg";
+ rel1.relative: 0.0 0.0;
+ rel2.to: "bg";
+ rel2.relative: 1.0 1.0;
+ }
+ }
+ }
+
+ programs {
+ program { name: "prev_click";
+ signal: "mouse,clicked,1";
+ source: "left";
+ action: SIGNAL_EMIT "prev,action,clicked" "";
+ }
+
+ program { name, "next_click";
+ signal, "mouse,clicked,1";
+ source, "right";
+ action: SIGNAL_EMIT "next,action,clicked" "";
+ }
+
+ program { name, "left_press";
+ signal, "mouse,down,1";
+ source, "left";
+ action, STATE_SET "left_pressed" 0.0;
+ target, "bg";
+ }
+
+ program { name, "left_release";
+ signal, "mouse,up,1";
+ source, "left";
+ action, STATE_SET "default" 0.0;
+ target, "bg";
+ }
+
+ program { name, "right_press";
+ signal, "mouse,down,1";
+ source, "right";
+ action, STATE_SET "right_pressed" 0.0;
+ target, "bg";
+ }
+
+ program { name, "right_release";
+ signal, "mouse,up,1";
+ source, "right";
+ action, STATE_SET "default" 0.0;
+ target, "bg";
+ }
+ }
+ }
+
+ group { name: "page_button_land";
+
+ images {
+ image: "08_textinput_sym_arrow_left.png" COMP;
+ image: "08_textinput_sym_arrow_right.png" COMP;
+ image: "08_textinput_button_260x56.png" COMP;
+ image: "08_textinput_button_260x56_pre_left.png" COMP;
+ image: "08_textinput_button_260x56_pre_right.png" COMP;
+ }
+
+ parts {
+ part { name: "bg";
+ description { state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ image.normal: "08_textinput_button_260x56.png";
+ }
+ description { state: "left_pressed" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ image.normal: "08_textinput_button_260x56_pre_left.png";
+ }
+ description { state: "right_pressed" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ image.normal: "08_textinput_button_260x56_pre_right.png";
+ }
+ }
+
+ part { name: "left";
+ mouse_events: 1;
+ description { state: "default" 0.0;
+ rel1.to: "bg";
+ rel1.relative: 0.0 0.0;
+ rel1.offset: 0 0;
+ rel2.to: "bg";
+ rel2.relative: 0.0 1.0;
+ rel2.offset: 71 0;
+ image.normal: "08_textinput_sym_arrow_left.png";
+ }
+ }
+ part { name: "right";
+ mouse_events: 1;
+ description { state: "default" 0.0;
+ rel1.to: "bg";
+ rel1.relative: 1.0 0.0;
+ rel1.offset: -71 0;
+ rel2.to: "bg";
+ rel2.relative: 1.0 1.0;
+ rel2.offset: 0 0;
+ image.normal: "08_textinput_sym_arrow_right.png";
+ }
+ }
+
+ part { name: "page_text";
+ type: TEXT;
+ mouse_events: 0;
+ effect: SHADOW;
+ description { state: "default" 0.0;
+ color: 255 255 255 255;
+ text {
+ text_class: "page_text_class";
+ text: "1/1";
+ font: FONT_NAME;
+ size: FONT_SIZE;
+ align: 0.5 0.5;
+ }
+ rel1.to: "bg";
+ rel1.relative: 0.0 0.0;
+ rel2.to: "bg";
+ rel2.relative: 1.0 1.0;
+ }
+ }
+ }
+
+ programs {
+ program { name: "prev_click";
+ signal: "mouse,clicked,1";
+ source: "left";
+ action: SIGNAL_EMIT "prev,action,clicked" "";
+ }
+
+ program { name, "next_click";
+ signal, "mouse,clicked,1";
+ source, "right";
+ action: SIGNAL_EMIT "next,action,clicked" "";
+ }
+
+ program { name, "left_press";
+ signal, "mouse,down,1";
+ source, "left";
+ action, STATE_SET "left_pressed" 0.0;
+ target, "bg";
+ }
+
+ program { name, "left_release";
+ signal, "mouse,up,1";
+ source, "left";
+ action, STATE_SET "default" 0.0;
+ target, "bg";
+ }
+
+ program { name, "right_press";
+ signal, "mouse,down,1";
+ source, "right";
+ action, STATE_SET "right_pressed" 0.0;
+ target, "bg";
+ }
+
+ program { name, "right_release";
+ signal, "mouse,up,1";
+ source, "right";
+ action, STATE_SET "default" 0.0;
+ target, "bg";
+ }
+ }
+ }
+
+ group { name: "aux";
+
+ parts {
+ part { name: "bg";
+ type: RECT;
+ mouse_events: 1;
+ description { state: "default" 0.0;
+ color: 200 200 200 0;
+ rel1.relative: 0.0 0.0;
+ rel1.offset: 0 8;
+ rel2.relative: 1.0 1.0;
+ rel2.offset: 0 -12;
+ }
+ description { state: "selected" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 0;
+ }
+ }
+
+ part { name: "aux";
+ type: TEXT;
+ mouse_events: 0;
+ //effect: SHADOW;
+ description { state: "default" 0.0;
+ color: COLOR_NORMAL_TEXT;
+ text {
+ text: "aux";
+ text_class: "aux_text_class";
+ font: AUX_FONT_NAME;
+ size: AUX_FONT_SIZE;
+ align: 0.5 0.5;
+ }
+ rel1.to: "bg";
+ rel1.relative: 0.0 0.0;
+ rel2.to: "bg";
+ rel2.relative: 1.0 1.0;
+ }
+ description { state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ //color: 0 0 255 255;
+ }
+ description { state: "selected" 0.0;
+ inherit: "default" 0.0;
+ color: 30 144 255 255;
+ }
+ }
+ }
+
+ programs {
+ program { name: "select";
+ signal, "aux,state,selected";
+ source, "aux";
+ action, STATE_SET "selected" 0.0;
+ target, "aux";
+ target, "bg";
+ }
+
+ program { name: "unselect";
+ signal, "aux,state,unselected";
+ source, "aux";
+ action, STATE_SET "default" 0.0;
+ target, "aux";
+ target, "bg";
+ }
+
+ program { name: "button_click";
+ signal, "mouse,clicked,1";
+ source, "bg";
+ //action, STATE_SET "selected" 0.0;
+ //target, "aux";
+ //target, "bg";
+ after, "do_me";
+ }
+
+ program { name, "button_press";
+ signal, "mouse,down,1";
+ source, "bg";
+ script {
+ new st[31];
+ new Float:vl;
+ get_state (PART:"aux", st, 30, vl);
+ if (!strcmp (st, "default"))
+ set_state (PART:"aux", "pressed", 0.0);
+ }
+ }
+
+ program { name, "button_release";
+ signal, "mouse,up,1";
+ source, "bg";
+ script {
+ new st[31];
+ new Float:vl;
+ get_state (PART:"aux", st, 30, vl);
+ if (!strcmp (st, "pressed"))
+ set_state (PART:"aux", "default", 0.0);
+ }
+ }
+
+ program { name, "do_me";
+ signal, "*";
+ source, "button_click";
+ action, SIGNAL_EMIT "aux,action,clicked" "";
+ }
+ }
+ }
+}
--- /dev/null
+#define CANDIDATE_BG "00_popup_bubble_bg_black.png"\r
+#define POPUP_LINE "00_popup_line.png"\r
+#define BUTTON_NORMAL_BG "00_button_01_normal_black.png"\r
+#define BUTTON_PRESS_BG "00_button_01_normal_press_black.png"\r
+\r
+#define BUTTON_IMAGE_BORDER 4\r
+\r
+#define COLOR_NORMAL_TEXT 255 255 255 255\r
+#define COLOR_PRESS_TEXT 255 255 255 255\r
+\r
+#include "isf_candidate.edc"\r
--- /dev/null
+#define CANDIDATE_BG "00_popup_bubble_bg.png"\r
+#define POPUP_LINE "00_popup_line.png"\r
+#define BUTTON_NORMAL_BG "00_button_01_normal.png"\r
+#define BUTTON_PRESS_BG "00_button_01_normal_press.png"\r
+\r
+#define BUTTON_IMAGE_BORDER 4\r
+\r
+#define COLOR_NORMAL_TEXT 40 40 40 255\r
+#define COLOR_PRESS_TEXT 226 226 226 255\r
+\r
+#include "isf_candidate.edc"
\ No newline at end of file
--- /dev/null
+#define PADDING_X 25
+#define PADDING_Y 25
+collections {
+ group {
+ name : "isfsetting/languageview";
+ parts {
+ part {
+ name:"top_padding";
+ type: RECT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 0 PADDING_Y;
+ fixed: 0 1;
+ rel1 {relative: 0 0;}
+ rel2 {relative: 1 0;}
+ align: 0 0;
+ visible : 0;
+ }
+ }
+ part {
+ name:"content";
+ type: SWALLOW;
+ scale :1;
+ description {
+ state : "default" 0.0;
+ rel1 {relative: 0.0 1.0; offset: PADDING_X 0 ;to_y:"top_padding";}
+ }
+ }
+ }
+ }
+}
--- /dev/null
+MAINTAINERCLEANFILES = Makefile.in
+CLEANFILES = *.bak
+
+INCLUDES = -I$(top_builddir) \
+ -I$(top_builddir)/ism/src \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/ism/src \
+ -I$(top_srcdir)/ism/intl \
+ -I$(top_srcdir)/ism/data \
+ -I$(top_srcdir)/ism/utils \
+ -I$(top_srcdir)/ism/demos/include \
+ -I$(includedir) \
+ -DSCIM_DATADIR=\"@SCIM_DATADIR@\" \
+ -DSCIM_LOCALEDIR=\"@SCIM_LOCALEDIR@\" \
+ -DSCIM_SYSCONFDIR=\"@SCIM_SYSCONFDIR@\" \
+ -DSCIM_LIBEXECDIR=\"@SCIM_LIBEXECDIR@\" \
+ -DSCIM_ICONDIR=\"@SCIM_ICONDIR@\" \
+ -DSCIM_MODULE_PATH=\"@SCIM_MODULE_PATH@\" \
+ -DSCIM_TEMPDIR=\"@SCIM_TEMPDIR@\"
+
+
+noinst_HEADERS =
+
+if ISF_BUILD_SETTING_EFL
+ISF_DEMO_EFL = isf-demo-efl
+endif
+
+bin_PROGRAMS = $(ISF_DEMO_EFL)
+
+isf_demo_efl_SOURCES = isf_demo_efl.cpp \
+ isf_imcontrol_efl.cpp \
+ isf_layout_efl.cpp \
+ isf_event_efl.cpp \
+ isf_entry_event_efl.cpp \
+ isf_autocapital_efl.cpp \
+ isf_prediction_efl.cpp
+
+isf_demo_efl_CXXFLAGS = @EFL_CFLAGS@ \
+ @APPCORE_EFL_CFLAGS@ \
+ @UIGADGET_CFLAGS@ \
+ @VCONF_CFLAGS@
+
+isf_demo_efl_LDFLAGS = @EFL_LIBS@ @LTLIBINTL@ -rpath $(libdir) \
+ @VCONF_LIBS@ \
+ @APPCORE_EFL_LIBS@ \
+ @UIGADGET_LIBS@
+
+#isf_demo_efl_LDADD = -lui-gadget
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Jihoon Kim <jihoon48.kim@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __ISE_AUTOCAPITAL_H
+#define __ISE_AUTOCAPITAL_H
+
+#include <Elementary.h>
+
+void ise_autocapital_bt (void *data, Evas_Object *obj, void *event_info);
+
+#endif /* __ISE_AUTOCAPITAL_H */
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Jihoon Kim <jihoon48.kim@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __ISF_DEMO_EFL_H
+#define __ISF_DEMO_EFL_H
+
+
+#include <Elementary.h>
+#include <appcore-efl.h>
+
+
+struct appdata {
+ int root_w;
+ int root_h;
+ int root_x;
+ int root_y;
+
+ Evas *evas;
+ Evas_Object *win_main;
+ Evas_Object *layout_main; // layout widget based on EDJ
+ Evas_Object *naviframe;
+ Evas_Object *bg;
+
+ struct ui_gadget *ug;
+ int is_frameview;
+
+ // add more variables here
+ Evas_Object *li;
+ Evas_Object *ev_li;
+ bundle *data;
+};
+
+#endif /* __ISF_DEMO_EFL_H */
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Jihoon Kim <jihoon48.kim@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __ISF_EVENT_DEMO_H
+#define __ISF_EVENT_DEMO_H
+
+#include <Elementary.h>
+
+void isf_event_demo_bt (void *data, Evas_Object *obj, void *event_info);
+
+#endif /* __ISF_EVENT_DEMO_H */
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Jihoon Kim <jihoon48.kim@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __ISF_IMCONTROL_API_H
+#define __ISF_IMCONTROL_API_H
+
+#include <Elementary.h>
+
+void imcontrolapi_bt (void *data, Evas_Object *obj, void *event_info);
+
+#endif /* __ISF_IMCONTROL_API_H */
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Jihoon Kim <jihoon48.kim@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __ISE_LAYOUT_H
+#define __ISE_LAYOUT_H
+
+#include <Elementary.h>
+
+void ise_layout_bt (void *data, Evas_Object *obj, void *event_info);
+
+#endif /* __ISE_LAYOUT_H */
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
\ No newline at end of file
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Jihoon Kim <jihoon48.kim@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __ISE_PREDICTION_H
+#define __ISE_PREDICTION_H
+
+#include <Elementary.h>
+
+void ise_prediction_bt (void *data, Evas_Object *obj, void *event_info);
+
+#endif /* __ISE_PREDICTION_H */
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef _ISF_OCR_LANG_TYPES_H
+#define _ISF_OCR_LANG_TYPES_H
+
+enum
+{
+ LANG_KOR =0,
+ LANG_CHN,
+ LANG_JPN,
+ LANG_ENG,
+ LANG_FRA,
+ LANG_ESP,
+ LANG_ITA,
+ LANG_DEU,
+ LANG_PRT,
+ LANG_RUS,
+ LANG_TUR,
+ TOTAL_SUPPORTED_LANG,
+};
+
+#endif
+
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Jihoon Kim <jihoon48.kim@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#include "isf_demo_efl.h"
+#include "isf_autocapital_efl.h"
+
+static Evas_Object *_create_ef (Evas_Object *parent, const char *label, const char *guide_text, Elm_Autocapital_Type autocap)
+{
+ Evas_Object *ef = elm_editfield_add (parent);
+ elm_editfield_label_set (ef, label);
+ elm_editfield_guide_text_set (ef, guide_text);
+ evas_object_size_hint_weight_set (ef, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set (ef, EVAS_HINT_FILL, 0);
+ evas_object_show (ef);
+
+ Evas_Object *en = elm_editfield_entry_get(ef);
+ if (!en) return ef;
+
+ elm_entry_autocapital_type_set(en, autocap);
+
+ return ef;
+}
+
+static void add_layout_to_conformant (void *data, Evas_Object *lay_in, const char *title)
+{
+ Evas_Object *scroller = NULL;
+ Evas_Object *win = NULL;
+ Evas_Object *conform = NULL;
+ struct appdata *ad = NULL;
+
+ ad = (struct appdata *) data;
+
+ win = ad->win_main;
+ // Enabling illume notification property for window
+ elm_win_conformant_set (win, EINA_TRUE);
+
+ // Creating conformant widget
+ conform = elm_conformant_add (win);
+ evas_object_size_hint_weight_set (conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show (conform);
+
+ scroller = elm_scroller_add (ad->naviframe);
+
+ elm_scroller_bounce_set (scroller, EINA_FALSE, EINA_TRUE);
+ evas_object_show (scroller);
+
+ elm_scroller_content_set (scroller, lay_in);
+ elm_conformant_content_set (conform, scroller);
+ elm_naviframe_item_push (ad->naviframe, title, NULL, NULL, conform, NULL);
+}
+
+static Evas_Object * create_inner_layout (void *data)
+{
+ struct appdata *ad = (struct appdata *)data;
+ Evas_Object *bx = NULL ;
+ Evas_Object *ef = NULL ;
+
+ Evas_Object *parent = ad->naviframe;
+
+ bx = elm_box_add (parent);
+ evas_object_size_hint_weight_set (bx, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set (bx, EVAS_HINT_FILL, 0.0);
+ evas_object_show (bx);
+
+ /* NONE type */
+ ef = _create_ef (parent, _("NONE type"), _("click to enter"), ELM_AUTOCAPITAL_TYPE_NONE);
+ elm_box_pack_end (bx, ef);
+
+ /* WORD type */
+ ef = _create_ef (parent, _("WORD type"), _("click to enter"), ELM_AUTOCAPITAL_TYPE_WORD);
+ elm_box_pack_end (bx, ef);
+
+ /* Sentence type */
+ ef = _create_ef (parent, _("SENTENCE type"), _("click to enter"), ELM_AUTOCAPITAL_TYPE_SENTENCE);
+ elm_box_pack_end (bx, ef);
+
+ /* ALLCHARACTER type */
+ ef = _create_ef (parent, _("ALLCHARACTER type"), _("click to enter"), ELM_AUTOCAPITAL_TYPE_ALLCHARACTER);
+ elm_box_pack_end (bx, ef);
+
+ return bx;
+}
+
+void ise_autocapital_bt (void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *lay_inner = create_inner_layout (data);
+ add_layout_to_conformant (data, lay_inner, _("Autocapital"));
+}
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Jihoon Kim <jihoon48.kim@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <Elementary.h>
+#include <ui-gadget.h>
+#include <Ecore_X.h>
+#include "isf_demo_efl.h"
+#include "isf_imcontrol_efl.h"
+#include "isf_layout_efl.h"
+#include "isf_event_efl.h"
+#include "isf_autocapital_efl.h"
+#include "isf_prediction_efl.h"
+
+#define BASE_THEME_WIDTH 720.0f
+
+static void _quit_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ elm_exit ();
+}
+
+static void _list_click (void *data, Evas_Object *obj, void *event_info)
+{
+ struct appdata *ad = (struct appdata *)data;
+ if (ad == NULL) return;
+
+ Evas_Object *li = ad->li;
+ if (li == NULL) return;
+
+ Elm_List_Item *it = (Elm_List_Item *)elm_list_selected_item_get (li);
+
+ if (it != NULL)
+ elm_list_item_selected_set (it, EINA_FALSE);
+}
+
+static void layout_cb (struct ui_gadget *ug, enum ug_mode mode, void *priv)
+{
+ struct appdata *ad = NULL;
+ Evas_Object *base = NULL;
+
+ if ( ug == NULL || priv == NULL)
+ return;
+
+ ad = (appdata *)priv;
+
+ base = (Evas_Object *)ug_get_layout (ug);
+ if (base == NULL)
+ return;
+
+ switch (mode) {
+ case UG_MODE_FULLVIEW:
+ evas_object_size_hint_weight_set (base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add (ad->win_main, base);
+ evas_object_show (base);
+ break;
+ case UG_MODE_FRAMEVIEW:
+ printf("please set ug mode to UG_MODE_FULLVIEW!\n");
+ break;
+ default:
+ break;
+ }
+}
+
+static void result_cb (struct ui_gadget *ug, bundle *result, void *priv)
+{
+ struct appdata *ad = (appdata*) priv;
+
+ if (!result) return;
+
+ const char *name = bundle_get_val(result, "name");
+ printf("get key [ %s ]\n",name);
+
+ if (strcmp(name, "keyboard-setting-wizard-efl") == 0) {
+ const char *desp = bundle_get_val(result,"description");
+ printf("====================\nresult:%s\n====================\n",desp);
+ }
+}
+
+static void destroy_cb (struct ui_gadget *ug, void *priv)
+{
+ if (ug == NULL)
+ return;
+
+ ug_destroy (ug);
+}
+
+static void cam_destroy_cb (struct ui_gadget *ug, void *priv)
+{
+ printf ("enter cam_destroy_cb ().........\n");
+ if (!ug)
+ return;
+
+ ug_destroy (ug);
+ struct appdata *ad = (struct appdata *) priv;
+ if (ad->layout_main != NULL)
+ evas_object_show(ad->layout_main);
+ if (ad->bg != NULL)
+ evas_object_show(ad->bg);
+}
+
+static void isfsetting_bt (void *data, Evas_Object *obj, void *event_info)
+{
+ struct appdata *ad = (struct appdata *)data;
+ struct ug_cbs cbs = {0, };
+
+ UG_INIT_EFL (ad->win_main, UG_OPT_INDICATOR_ENABLE);
+
+ cbs.layout_cb = layout_cb;
+ cbs.result_cb = result_cb;
+ cbs.destroy_cb = destroy_cb;
+ cbs.priv = ad;
+ ad->ug = ug_create (NULL, "isfsetting-efl",
+ UG_MODE_FULLVIEW,
+ ad->data, &cbs);
+ bundle_free (ad->data);
+ ad->data = NULL;
+}
+
+static void keyboard_setting_wizard_bt (void *data, Evas_Object *obj, void *event_info)
+{
+ struct appdata *ad = (struct appdata *)data;
+ struct ug_cbs cbs = {0, };
+
+ UG_INIT_EFL (ad->win_main, UG_OPT_INDICATOR_ENABLE);
+
+ cbs.layout_cb = layout_cb;
+ cbs.result_cb = result_cb;
+ cbs.destroy_cb = destroy_cb;
+ cbs.priv = ad;
+ ad->data = bundle_create();
+ bundle_add(ad->data, "navi_btn_left", _("Previous"));
+ //bundle_add(ad->data, "navi_btn_left", NULL);
+ bundle_add(ad->data, "navi_btn_right", _("Next"));
+ ad->ug = ug_create (NULL, "keyboard-setting-wizard-efl",
+ UG_MODE_FULLVIEW,
+ ad->data, &cbs);
+ bundle_free (ad->data);
+ ad->data = NULL;
+}
+
+static void response_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ if ((int)event_info != 5)
+ evas_object_del (obj);
+}
+
+static int create_demo_view (struct appdata *ad)
+{
+ Evas_Object *li = NULL;
+
+ Evas_Object *l_button = elm_button_add (ad->naviframe);
+ elm_object_style_set (l_button, "naviframe/end_btn/default");
+ evas_object_smart_callback_add (l_button, "clicked", _quit_cb, NULL);
+
+ // Create list
+ ad->li = li = elm_list_add (ad->naviframe);
+ elm_list_mode_set (li, ELM_LIST_COMPRESS);
+ evas_object_smart_callback_add (ad->li, "selected", _list_click, ad);
+
+ // Test ISF imcontrol API
+ elm_list_item_append (li, "ISF imcontrol API", NULL, NULL, imcontrolapi_bt, ad);
+
+ // test ISF layout
+ elm_list_item_append (li, "ISF Layout", NULL, NULL, ise_layout_bt, ad);
+
+ // Test autocapital type
+ elm_list_item_append (li, "ISF Autocapital", NULL, NULL, ise_autocapital_bt, ad);
+
+ // Test prediction allow
+ elm_list_item_append (li, "ISF Prediction allow", NULL, NULL, ise_prediction_bt, ad);
+
+ elm_list_item_append (li, "ISF Event Demo", NULL, NULL, isf_event_demo_bt, ad);
+
+ /*
+ ISF language selection
+ ISE selection
+ */
+ elm_list_item_append (li, "ISF Setting", NULL, NULL, isfsetting_bt, ad);
+ elm_list_item_append (li, "keyboard Setting wizard", NULL, NULL, keyboard_setting_wizard_bt, ad);
+ // ISF preedit string and commit string on Label and Entry
+
+ elm_list_go (li);
+
+ elm_naviframe_item_push (ad->naviframe, _("isf demo"), l_button, NULL, li, NULL);
+
+ return 0;
+}
+
+static int lang_changed (void *data)
+{
+ struct appdata *ad = (appdata *)data;
+
+ if (ad->layout_main == NULL)
+ return 0;
+
+ ug_send_event (UG_EVENT_LANG_CHANGE);
+ return 0;
+}
+
+static int _rotate_cb (enum appcore_rm m, void *data)
+{
+ struct appdata *ad = (struct appdata *)data;
+ if (ad == NULL || ad->win_main == NULL)
+ return 0;
+
+ int r;
+ switch (m) {
+ case APPCORE_RM_PORTRAIT_NORMAL:
+ ug_send_event (UG_EVENT_ROTATE_PORTRAIT);
+ r = 0;
+ break;
+ case APPCORE_RM_PORTRAIT_REVERSE:
+ ug_send_event (UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN);
+ r = 180;
+ break;
+ case APPCORE_RM_LANDSCAPE_NORMAL:
+ ug_send_event (UG_EVENT_ROTATE_LANDSCAPE);
+ r = 270;
+ break;
+ case APPCORE_RM_LANDSCAPE_REVERSE:
+ ug_send_event (UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN);
+ r = 90;
+ break;
+ default:
+ r = -1;
+ break;
+ }
+
+ if (r >= 0)
+ elm_win_rotation_with_resize_set (ad->win_main, r);
+
+ return 0;
+}
+
+static void win_del (void *data, Evas_Object *obj, void *event)
+{
+ elm_exit ();
+}
+
+static Evas_Object* create_win (const char *name)
+{
+ Evas_Object *eo = NULL;
+ int w, h;
+
+ eo = elm_win_add (NULL, name, ELM_WIN_BASIC);
+ if (eo != NULL) {
+ elm_win_title_set (eo, name);
+ elm_win_borderless_set (eo, EINA_TRUE);
+ evas_object_smart_callback_add (eo, "delete,request",
+ win_del, NULL);
+ ecore_x_window_size_get (ecore_x_window_root_first_get (), &w, &h);
+ evas_object_resize (eo, w, h);
+ }
+
+ return eo;
+}
+
+static Evas_Object* create_layout_main (Evas_Object* parent)
+{
+ Evas_Object *layout = elm_layout_add (parent);
+ elm_layout_theme_set (layout, "layout", "application", "default");
+ evas_object_size_hint_weight_set (layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add (parent, layout);
+
+ evas_object_show (layout);
+
+ return layout;
+}
+
+static Evas_Object* _create_naviframe_layout (Evas_Object* parent)
+{
+ Evas_Object *naviframe = elm_naviframe_add (parent);
+ elm_layout_content_set (parent, "elm.swallow.content", naviframe);
+
+ evas_object_show (naviframe);
+
+ return naviframe;
+}
+
+static Evas_Object* create_bg(Evas_Object *win)
+{
+ Evas_Object *bg = elm_bg_add(win);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, bg);
+ evas_object_show(bg);
+
+ return bg;
+}
+
+static Eina_Bool _keydown_event(void *data, int type, void *event)
+{
+ Ecore_Event_Key *ev = (Ecore_Event_Key *)event;
+ struct appdata *ad = (struct appdata *)data;
+ Elm_Object_Item *top_it, *bottom_it;
+ if (ad == NULL || ev == NULL) return ECORE_CALLBACK_RENEW;
+
+ if (strcmp(ev->keyname, "XF86Stop") == 0) {
+ if (ug_send_key_event(UG_KEY_EVENT_END) == -1) {
+ top_it = elm_naviframe_top_item_get(ad->naviframe);
+ bottom_it = elm_naviframe_top_item_get(ad->naviframe);
+ if (top_it && bottom_it && (elm_object_item_content_get(top_it) == elm_object_item_content_get(bottom_it))) {
+ elm_exit();
+ }
+ else {
+ elm_naviframe_item_pop(ad->naviframe);
+ }
+ }
+ }
+ return ECORE_CALLBACK_RENEW;
+}
+
+static int app_create (void *data)
+{
+ struct appdata *ad = (struct appdata *)data;
+
+ appcore_measure_start ();
+
+ ad->win_main = create_win ("isf-demo-efl");
+ evas_object_show (ad->win_main);
+
+ ad->evas = evas_object_evas_get (ad->win_main);
+ /* get width and height of main window */
+ evas_object_geometry_get (ad->win_main, NULL, NULL, &ad->root_w, &ad->root_h);
+
+ if (ad->root_w >= 0) {
+ elm_scale_set(ad->root_w / BASE_THEME_WIDTH );
+ }
+
+ ad->bg = create_bg(ad->win_main);
+
+ ad->layout_main = create_layout_main (ad->win_main);
+
+ // Indicator
+ elm_win_indicator_state_set (ad->win_main, EINA_TRUE);
+
+ // Navigation Bar
+ ad->naviframe = _create_naviframe_layout (ad->layout_main);
+
+ //init the content in layout_main.
+ create_demo_view (ad);
+
+ lang_changed (ad);
+
+ evas_object_show (ad->win_main);
+
+ /* add system event callback */
+ appcore_set_event_callback (APPCORE_EVENT_LANG_CHANGE,
+ lang_changed, ad);
+
+ ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _keydown_event, ad);
+
+ appcore_set_rotation_cb (_rotate_cb, ad);
+
+ appcore_measure_time ();
+
+ return 0;
+}
+
+static int app_exit (void *data)
+{
+ struct appdata *ad = (struct appdata *)data;
+ if (ad->li != NULL)
+ evas_object_del (ad->li);
+
+ if (ad->ev_li != NULL)
+ evas_object_del (ad->ev_li);
+
+ if (ad->layout_main != NULL)
+ evas_object_del (ad->layout_main);
+
+ if (ad->win_main != NULL)
+ evas_object_del (ad->win_main);
+
+ return 0;
+}
+
+static int app_pause(void *data)
+{
+ return 0;
+}
+
+static int app_resume (void *data)
+{
+ return 0;
+}
+
+static int app_reset (bundle *b, void *data)
+{
+ struct appdata *ad = (struct appdata *)data;
+
+ if ( (ad != NULL) && (ad->win_main != NULL))
+ elm_win_activate (ad->win_main);
+
+ return 0;
+}
+
+int main (int argc, char *argv[])
+{
+ struct appdata ad;
+ struct appcore_ops ops;
+
+ ops.create = app_create;
+ ops.terminate = app_exit;
+ ops.pause = app_pause;
+ ops.resume = app_resume;
+ ops.reset = app_reset;
+
+ memset (&ad, 0x0, sizeof (struct appdata));
+ ops.data = &ad;
+ return appcore_efl_main ("isf-demo-efl", &argc, &argv, &ops);
+}
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Jihoon Kim <jihoon48.kim@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#include <Ecore_IMF.h>
+#include "isf_demo_efl.h"
+
+
+static Evas_Object * _entry1 = NULL;
+static Evas_Object * _entry2 = NULL;
+static Evas_Object * _key_event_label = NULL;
+static Evas_Object * _preedit_event_label = NULL;
+static Evas_Object * _commit_event_label = NULL;
+static Ecore_Event_Handler *_preedit_handler = NULL;
+static Ecore_Event_Handler *_commit_handler = NULL;
+
+
+static void _input_panel_event_callback (void *data, Ecore_IMF_Context *ctx, int value)
+{
+ if (value == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
+ printf("[%s] ECORE_IMF_INPUT_PANEL_STATE_SHOW\n", __func__);
+ } else if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
+ printf("[%s] ECORE_IMF_INPUT_PANEL_STATE_HIDE\n", __func__);
+ }
+}
+
+static void _evas_key_up_cb (void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ static char str [100];
+ Evas_Event_Key_Up *ev = (Evas_Event_Key_Up *) event_info;
+
+ if (obj == _entry1) {
+ snprintf (str, sizeof(str),"entry 1 get keyEvent: %s", (char *)(ev->keyname));
+ elm_object_text_set (_key_event_label, str);
+ } else if (obj == _entry2) {
+ snprintf (str, sizeof(str),"entry 2 get keyEvent: %s", (char *)(ev->keyname));
+ elm_object_text_set (_key_event_label, str);
+ }
+}
+
+static Eina_Bool _ecore_imf_event_changed_cb (void *data, int type, void *event)
+{
+ int len;
+ static char str [100];
+ char *preedit_string = NULL;
+ Ecore_IMF_Context *imf_context = NULL;
+
+ if (elm_object_focus_get (_entry1) == EINA_TRUE) {
+ imf_context = elm_entry_imf_context_get (_entry1);
+ ecore_imf_context_preedit_string_get (imf_context, &preedit_string, &len);
+ snprintf (str,sizeof(str), "entry 1 get preedit string: %s", preedit_string);
+ elm_object_text_set (_preedit_event_label, str);
+ } else if (elm_object_focus_get (_entry2) == EINA_TRUE) {
+ imf_context = elm_entry_imf_context_get (_entry2);
+ ecore_imf_context_preedit_string_get (imf_context, &preedit_string, &len);
+ snprintf (str, sizeof(str),"entry 2 get preedit string: %s", preedit_string);
+ elm_object_text_set (_preedit_event_label, str);
+ }
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool _ecore_imf_event_commit_cb (void *data, int type, void *event)
+{
+ static char str [100];
+ Ecore_IMF_Event_Commit *ev = (Ecore_IMF_Event_Commit *) event;
+
+ if (elm_object_focus_get (_entry1) == EINA_TRUE) {
+ snprintf (str,sizeof(str), "entry 1 get commit string: %s",(char *)( ev->str));
+ elm_object_text_set (_commit_event_label, str);
+ } else if (elm_object_focus_get (_entry2) == EINA_TRUE) {
+ snprintf (str,sizeof(str), "entry 2 get commit string: %s", (char *)(ev->str));
+ elm_object_text_set (_commit_event_label, str);
+ }
+ return ECORE_CALLBACK_RENEW;
+}
+
+void isf_entry_event_demo_bt (void *data, Evas_Object *obj, void *event_info)
+{
+ struct appdata *ad = (struct appdata *)data;
+ Evas_Object *layout = NULL;
+ Ecore_IMF_Context *ic = NULL;
+
+ layout = elm_layout_add (ad->naviframe);
+ evas_object_size_hint_weight_set (layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show (layout);
+
+ _preedit_handler = ecore_event_handler_add (ECORE_IMF_EVENT_PREEDIT_CHANGED, _ecore_imf_event_changed_cb, NULL);
+ _commit_handler = ecore_event_handler_add (ECORE_IMF_EVENT_COMMIT, _ecore_imf_event_commit_cb, NULL);
+
+ _entry1 = elm_entry_add (layout);
+ elm_entry_entry_set (_entry1, "ENTRY 1");
+ evas_object_move (_entry1, 0, 100);
+ evas_object_resize (_entry1, ad->root_w, 50);
+ evas_object_show (_entry1);
+ evas_object_event_callback_add (_entry1, EVAS_CALLBACK_KEY_UP, _evas_key_up_cb, (void *)NULL);
+
+ ic = elm_entry_imf_context_get (_entry1);
+ if (ic != NULL)
+ ecore_imf_context_input_panel_event_callback_add (ic, ECORE_IMF_INPUT_PANEL_STATE_EVENT, _input_panel_event_callback, NULL);
+
+ _entry2 = elm_entry_add (layout);
+ elm_entry_entry_set (_entry2, "ENTRY 2");
+ evas_object_move (_entry2, 0, 150);
+ evas_object_resize (_entry2, ad->root_w, 50);
+ evas_object_show (_entry2);
+ evas_object_event_callback_add (_entry2, EVAS_CALLBACK_KEY_UP, _evas_key_up_cb, (void *)NULL);
+
+ ic = elm_entry_imf_context_get (_entry2);
+ if (ic != NULL)
+ ecore_imf_context_input_panel_event_callback_add (ic, ECORE_IMF_INPUT_PANEL_STATE_EVENT, _input_panel_event_callback, NULL);
+
+ _key_event_label = elm_button_add (layout);
+ elm_object_text_set (_key_event_label, "KEY EVENT");
+ evas_object_move (_key_event_label, 0, 200);
+ evas_object_resize (_key_event_label, ad->root_w, 50);
+ evas_object_show (_key_event_label);
+
+ _preedit_event_label = elm_button_add (layout);
+ elm_object_text_set (_preedit_event_label, "PREEDIT EVENT");
+ evas_object_move (_preedit_event_label, 0, 250);
+ evas_object_resize (_preedit_event_label, ad->root_w, 50);
+ evas_object_show (_preedit_event_label);
+
+ _commit_event_label = elm_button_add (layout);
+ elm_object_text_set (_commit_event_label, "COMMIT EVENT");
+ evas_object_move (_commit_event_label, 0, 300);
+ evas_object_resize (_commit_event_label, ad->root_w, 50);
+ evas_object_show (_commit_event_label);
+
+ elm_naviframe_item_push (ad->naviframe, _("entry event demo"), NULL, NULL, layout, NULL);
+}
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Jihoon Kim <jihoon48.kim@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#include "isf_demo_efl.h"
+
+
+static Ecore_IMF_Context* _imf_context[2];
+static Evas_Object *_label1 = NULL;
+static Evas_Object *_label2 = NULL;
+static Evas_Object *_key_event_label = NULL;
+static Evas_Object *_preedit_event_label = NULL;
+static Evas_Object *_commit_event_label = NULL;
+static Evas_Object *_set_focus_button1 = NULL;
+static Evas_Object *_set_focus_button2 = NULL;
+static Evas_Object *_ise_show_button = NULL;
+static Ecore_Event_Handler *_preedit_handler = NULL;
+static Ecore_Event_Handler *_commit_handler = NULL;
+static int focus_label_idx = 1;
+
+
+void isf_entry_event_demo_bt (void *data, Evas_Object *obj, void *event_info);
+
+
+static void _set_focus_button_bt (void *data, Evas_Object *obj, void *event_info)
+{
+ int i = (int) data;
+
+ focus_label_idx = i;
+
+ ecore_imf_context_focus_in (_imf_context[i-1]);
+}
+
+static void _button_bt (void *data, Evas_Object *obj, void *event_info)
+{
+ if (_imf_context[focus_label_idx-1] != NULL)
+ ecore_imf_context_input_panel_show (_imf_context[focus_label_idx-1]);
+}
+
+static void _key_up_cb (void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ static char str [100];
+ Evas_Event_Key_Up *ev = (Evas_Event_Key_Up *) event_info;
+
+ if (obj == _label1) {
+ snprintf (str, sizeof(str),"label 1 get key up event: %s", (char *)(ev->keyname));
+ elm_object_text_set (_key_event_label, str);
+ } else if (obj == _label2) {
+ snprintf (str,sizeof(str), "label 2 get key up event: %s", (char *)(ev->keyname));
+ elm_object_text_set (_key_event_label, str);
+ }
+}
+
+static void _key_down_cb (void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ static char str [100];
+ Evas_Event_Key_Up *ev = (Evas_Event_Key_Up *) event_info;
+
+ if (obj == _label1) {
+ snprintf (str, sizeof(str), "label 1 get key down event: %s", (char *)(ev->keyname));
+ elm_object_text_set (_key_event_label, str);
+ } else if (obj == _label2) {
+ snprintf (str, sizeof(str),"label 2 get key down event: %s", (char *)(ev->keyname));
+ elm_object_text_set (_key_event_label, str);
+ }
+}
+
+static Eina_Bool _ecore_imf_event_changed_cb (void *data, int type, void *event)
+{
+ static char str [100];
+
+ char *preedit_string = NULL;
+ preedit_string = (char *)malloc (sizeof (char)*70);
+ int cursor_pos;
+
+ ecore_imf_context_preedit_string_get (_imf_context[focus_label_idx-1], &preedit_string, &cursor_pos);
+
+ if (preedit_string == NULL)
+ return ECORE_CALLBACK_CANCEL;
+
+ snprintf (str,sizeof(str), "label %d get preedit string: %s", focus_label_idx, preedit_string);
+
+ free (preedit_string);
+ elm_object_text_set (_preedit_event_label, str);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool _ecore_imf_event_commit_cb (void *data, int type, void *event)
+{
+ static char str [100];
+ Ecore_IMF_Event_Commit *ev = (Ecore_IMF_Event_Commit *) event;
+
+ snprintf (str,sizeof(str), "label %d get commit string: %s", focus_label_idx, (char *)(ev->str));
+ elm_object_text_set (_commit_event_label, str);
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void nf_back_event_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ evas_object_event_callback_del (_label1, EVAS_CALLBACK_KEY_UP, NULL);
+ evas_object_event_callback_del (_label2, EVAS_CALLBACK_KEY_UP, NULL);
+
+ for(int i = 0; i < 2; i++)
+ {
+ if (_imf_context[i]) {
+ ecore_imf_context_del(_imf_context[i]);
+ _imf_context[i] = NULL;
+ }
+ }
+
+ if (_preedit_handler != NULL) {
+ ecore_event_handler_del (_preedit_handler);
+ _preedit_handler = NULL;
+ }
+
+ if (_commit_handler != NULL) {
+ ecore_event_handler_del (_commit_handler);
+ _commit_handler = NULL;
+ }
+}
+
+static void isf_label_event_demo_bt (void *data, Evas_Object *obj, void *event_info)
+{
+ struct appdata *ad = (struct appdata *)data;
+ Evas_Object *layout = NULL;
+ Evas *evas = NULL;
+ Ecore_Window ecore_win;
+
+ layout = elm_layout_add (ad->naviframe);
+ evas_object_size_hint_weight_set (layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show (layout);
+
+ evas = evas_object_evas_get(ad->win_main);
+ ecore_win = ecore_evas_window_get(ecore_evas_ecore_evas_get(evas));
+
+ const char *ctx_id = ecore_imf_context_default_id_get ();
+
+ /* register preedit (composing) event handler */
+ _preedit_handler = ecore_event_handler_add (ECORE_IMF_EVENT_PREEDIT_CHANGED, _ecore_imf_event_changed_cb, NULL);
+ /* register commit event handler */
+ _commit_handler = ecore_event_handler_add (ECORE_IMF_EVENT_COMMIT, _ecore_imf_event_commit_cb, NULL);
+
+ /* create label2 */
+ _label1 = elm_label_add (layout);
+ elm_object_text_set (_label1, "LABEL 1");
+ evas_object_move (_label1, 0, 100);
+ evas_object_resize (_label1, ad->root_w, 50);
+ evas_object_show (_label1);
+ evas_object_event_callback_add (_label1, EVAS_CALLBACK_KEY_UP, _key_up_cb, (void *)NULL);
+ evas_object_event_callback_add (_label1, EVAS_CALLBACK_KEY_DOWN, _key_down_cb, (void *)NULL);
+
+ /* create input context for label1 */
+ _imf_context[0] = ecore_imf_context_add (ctx_id);
+ ecore_imf_context_client_window_set (_imf_context[0], (void *)ecore_win);
+ ecore_imf_context_client_canvas_set (_imf_context[0], evas_object_evas_get(_label1));
+ ecore_imf_context_focus_in (_imf_context[0]);
+
+ /* create label2 */
+ _label2 = elm_label_add (layout);
+ elm_object_text_set (_label2, "LABEL 2");
+ evas_object_move (_label2, 0, 150);
+ evas_object_resize (_label2, ad->root_w, 50);
+ evas_object_show (_label2);
+ evas_object_event_callback_add (_label2, EVAS_CALLBACK_KEY_UP, _key_up_cb, (void *)NULL);
+ evas_object_event_callback_add (_label2, EVAS_CALLBACK_KEY_DOWN, _key_down_cb, (void *)NULL);
+
+ /* create input context for label2 */
+ _imf_context[1] = ecore_imf_context_add (ctx_id);
+ ecore_imf_context_client_window_set (_imf_context[1], (void *)ecore_win);
+ ecore_imf_context_client_canvas_set (_imf_context[1], evas_object_evas_get (_label2));
+
+ _key_event_label = elm_button_add (layout);
+ elm_object_text_set (_key_event_label, "KEY EVENT");
+ evas_object_move (_key_event_label, 0, 200);
+ evas_object_resize (_key_event_label, ad->root_w, 50);
+ evas_object_show (_key_event_label);
+
+ _preedit_event_label = elm_button_add (layout);
+ elm_object_text_set (_preedit_event_label, "PREEDIT EVENT");
+ evas_object_move (_preedit_event_label, 0, 250);
+ evas_object_resize (_preedit_event_label, ad->root_w, 50);
+ evas_object_show (_preedit_event_label);
+
+ _commit_event_label = elm_button_add (layout);
+ elm_object_text_set (_commit_event_label, "COMMIT EVENT");
+ evas_object_move (_commit_event_label, 0, 300);
+ evas_object_resize (_commit_event_label, ad->root_w, 50);
+ evas_object_show (_commit_event_label);
+
+ _set_focus_button1 = elm_button_add (layout);
+ elm_object_text_set (_set_focus_button1, "SET FOCUS TO LABEL 1");
+ evas_object_move (_set_focus_button1, 0, 350);
+ evas_object_resize (_set_focus_button1, ad->root_w, 50);
+ evas_object_show (_set_focus_button1);
+ evas_object_smart_callback_add (_set_focus_button1, "clicked", _set_focus_button_bt, (void *)1);
+
+ _set_focus_button2 = elm_button_add (layout);
+ elm_object_text_set (_set_focus_button2, "SET FOCUS TO LABEL 2");
+ evas_object_move (_set_focus_button2, 0, 400);
+ evas_object_resize (_set_focus_button2, ad->root_w, 50);
+ evas_object_show (_set_focus_button2);
+ evas_object_smart_callback_add (_set_focus_button2, "clicked", _set_focus_button_bt, (void *)2);
+
+ _ise_show_button = elm_button_add (layout);
+ elm_object_text_set (_ise_show_button, "ISE SHOW");
+ evas_object_move (_ise_show_button, 0, 450);
+ evas_object_resize (_ise_show_button, ad->root_w, 50);
+ evas_object_show (_ise_show_button);
+ evas_object_smart_callback_add (_ise_show_button, "clicked", _button_bt, NULL);
+
+ Elm_Object_Item *it = elm_naviframe_item_push (ad->naviframe, _("label event demo"), NULL, NULL, layout, NULL);
+ Evas_Object *back_btn = elm_object_item_content_part_get (it, ELM_NAVIFRAME_ITEM_PREV_BTN);
+ evas_object_smart_callback_add (back_btn, "clicked", nf_back_event_cb, ad );
+}
+
+static void _list_click (void *data, Evas_Object *obj, void *event_info)
+{
+ struct appdata *ad = (struct appdata *)data;
+ if (ad == NULL) return;
+
+ Evas_Object *li = ad->ev_li;
+ if (li == NULL) return;
+
+ Elm_List_Item *it = (Elm_List_Item *)elm_list_selected_item_get (li);
+
+ if (it != NULL)
+ elm_list_item_selected_set (it, EINA_FALSE);
+}
+
+void isf_event_demo_bt (void *data, Evas_Object *obj, void *event_info)
+{
+ struct appdata *ad = (struct appdata *)data;
+
+ ad->ev_li = elm_list_add (ad->naviframe);
+ elm_list_mode_set (ad->ev_li, ELM_LIST_COMPRESS);
+ evas_object_smart_callback_add (ad->ev_li, "selected", _list_click, ad);
+ elm_list_item_append (ad->ev_li, "Label event", NULL, NULL, isf_label_event_demo_bt, ad);
+ elm_list_item_append (ad->ev_li, "Entry event", NULL, NULL, isf_entry_event_demo_bt, ad);
+ elm_list_go (ad->ev_li);
+
+ elm_naviframe_item_push (ad->naviframe, _("ise event demo"), NULL, NULL, ad->ev_li, NULL);
+}
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Jihoon Kim <jihoon48.kim@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#include "isf_demo_efl.h"
+
+static Ecore_IMF_Context *imf_context = NULL;
+static Elm_Genlist_Item_Class itci;
+
+enum {
+ INPUT_PANEL_GEOMETRY_GET,
+ INPUT_PANEL_SHOW,
+ INPUT_PANEL_HIDE,
+ INPUT_PANEL_IMDATA_SET,
+ INPUT_PANEL_IMDATA_GET,
+ INPUT_PANEL_LAYOUT_SET,
+ INPUT_PANEL_LAYOUT_GET,
+ INPUT_PANEL_PRIVATE_KEY_SET,
+ INPUT_PANEL_KEY_DISABLED_SET,
+ INPUT_PANEL_STATE_GET,
+ INPUT_PANEL_MOVE,
+ CONTROL_PANEL_SHOW,
+ CONTROL_PANEL_HIDE,
+};
+
+const char *api_list[]={
+ "PANEL GEOMETRY GET",
+ "INPUT PANEL SHOW",
+ "INPUT PANEL HIDE",
+ "INPUT PANEL IMDATA SET",
+ "INPUT PANEL IMDATA GET",
+ "INPUT PANEL LAYOUT SET",
+ "INPUT PANEL LAYOUT GET",
+ "PANEL PRIVATE KEY SET",
+ "PANEL KEY DISABLED SET",
+ "INPUT PANEL STATE GET",
+ "INPUT PANEL MOVE",
+ "CTRL PANEL SHOW",
+ "CTRL PANEL HIDE",
+};
+
+static void test_input_panel_geometry_get (void *data, Evas_Object *obj, void *event_info)
+{
+ int x, y, w, h;
+ if (imf_context != NULL) {
+ ecore_imf_context_input_panel_geometry_get (imf_context, &x, &y, &w, &h);
+ printf ("x=%d \n", x);
+ printf ("y=%d \n", y);
+ printf ("width=%d \n", w);
+ printf ("height=%d \n", h);
+ }
+}
+
+void test_input_panel_show (void *data, Evas_Object *obj, void *event_info)
+{
+ if (imf_context != NULL) {
+ ecore_imf_context_input_panel_show (imf_context);
+ }
+}
+
+void test_input_panel_hide (void *data, Evas_Object *obj, void *event_info)
+{
+ if (imf_context != NULL) {
+ ecore_imf_context_input_panel_hide (imf_context);
+ }
+}
+
+void test_input_panel_imdata_set (void *data, Evas_Object *obj, void *event_info)
+{
+ // need ISE to deal with the data
+ char buf[256] = "ur imdata";
+ if (imf_context != NULL)
+ ecore_imf_context_input_panel_imdata_set (imf_context, buf, sizeof (buf));
+}
+
+void test_input_panel_imdata_get (void *data, Evas_Object *obj, void *event_info)
+{
+ int len = 256;
+ char* buf = (char*) malloc (len);
+ if (buf != NULL) {
+ memset (buf, '\0', len);
+ if (imf_context != NULL) {
+ ecore_imf_context_input_panel_imdata_get (imf_context, buf, &len);
+ printf ("get imdata %s, and len is %d ...\n", (char *)buf, len);
+ }
+ free (buf);
+ }
+}
+
+void test_input_panel_layout_set (void *data, Evas_Object *obj, void *event_info)
+{
+ Ecore_IMF_Input_Panel_Layout layout = ECORE_IMF_INPUT_PANEL_LAYOUT_EMAIL;
+ if (imf_context != NULL)
+ ecore_imf_context_input_panel_layout_set (imf_context, layout);
+}
+
+void test_input_panel_layout_get (void *data, Evas_Object *obj, void *event_info)
+{
+ Ecore_IMF_Input_Panel_Layout layout;
+ if (imf_context != NULL) {
+ layout = ecore_imf_context_input_panel_layout_get (imf_context);
+ printf ("get layout : %d ...\n", (int)layout);
+ }
+}
+
+void test_input_panel_private_key_set (void *data, Evas_Object *obj, void *event_info)
+{
+ int layout_index = 1;
+
+ if (imf_context != NULL)
+ ecore_imf_context_input_panel_private_key_set (imf_context, layout_index, ECORE_IMF_INPUT_PANEL_KEY_ENTER, NULL, "Go", ECORE_IMF_INPUT_PANEL_KEY_ENTER, NULL);
+}
+
+void test_input_panel_key_disabled_set (void *data, Evas_Object *obj, void *event_info)
+{
+ int layout_index = 1;
+ int key_index = 1;
+
+ if (imf_context != NULL)
+ ecore_imf_context_input_panel_key_disabled_set (imf_context, layout_index, key_index, EINA_TRUE);
+}
+
+void test_input_panel_state_get (void *data, Evas_Object *obj, void *event_info)
+{
+ Ecore_IMF_Input_Panel_State state;
+
+ if (imf_context != NULL) {
+ state = ecore_imf_context_input_panel_state_get (imf_context);
+ printf ("ise state : %d \n", (int)state);
+ }
+}
+
+void test_control_panel_show (void *data, Evas_Object *obj, void *event_info)
+{
+ if (imf_context != NULL) {
+ ecore_imf_context_control_panel_show (imf_context);
+ }
+}
+
+void test_control_panel_hide (void *data, Evas_Object *obj, void *event_info)
+{
+ if (imf_context != NULL) {
+ ecore_imf_context_control_panel_hide (imf_context);
+ }
+}
+
+void test_input_panel_move (void *data, Evas_Object *obj, void *event_info)
+{
+ if (imf_context != NULL) {
+ ecore_imf_context_input_panel_move (imf_context, 100, 100);
+ }
+}
+
+char *gli_label_get (void *data, Evas_Object *obj, const char *part)
+{
+ int j = (int)data;
+ return strdup (api_list[j]);
+}
+
+static void test_api (void *data, Evas_Object *obj, void *event_info)
+{
+ int j = (int)data;
+ switch (j) {
+ case INPUT_PANEL_GEOMETRY_GET:
+ test_input_panel_geometry_get (NULL, obj, event_info);
+ break;
+ case INPUT_PANEL_SHOW:
+ test_input_panel_show (NULL, obj, event_info);
+ break;
+ case INPUT_PANEL_HIDE:
+ test_input_panel_hide (NULL, obj, event_info);
+ break;
+ case INPUT_PANEL_IMDATA_SET:
+ test_input_panel_imdata_set (NULL,obj, event_info);
+ break;
+ case INPUT_PANEL_IMDATA_GET:
+ test_input_panel_imdata_get (NULL,obj, event_info);
+ break;
+ case INPUT_PANEL_LAYOUT_SET:
+ test_input_panel_layout_set (NULL,obj, event_info);
+ break;
+ case INPUT_PANEL_LAYOUT_GET:
+ test_input_panel_layout_get (NULL,obj, event_info);
+ break;
+ case INPUT_PANEL_PRIVATE_KEY_SET:
+ test_input_panel_private_key_set (NULL, obj, event_info);
+ break;
+ case INPUT_PANEL_KEY_DISABLED_SET:
+ test_input_panel_key_disabled_set (NULL, obj, event_info);
+ break;
+ case INPUT_PANEL_STATE_GET:
+ test_input_panel_state_get (NULL, obj, event_info);
+ break;
+ case INPUT_PANEL_MOVE:
+ test_input_panel_move (NULL, obj, event_info);
+ break;
+ case CONTROL_PANEL_SHOW:
+ test_control_panel_show (NULL, obj, event_info);
+ break;
+ case CONTROL_PANEL_HIDE:
+ test_control_panel_hide (NULL, obj, event_info);
+ break;
+ default:
+ break;
+ }
+}
+
+static void _nf_back_event (void *data, Evas_Object *obj, void *event_info)
+{
+ if (imf_context) {
+ ecore_imf_context_del(imf_context);
+ imf_context = NULL;
+ }
+}
+
+static Evas_Object *_create_imcontrolapi_list (Evas_Object *parent)
+{
+ int i, num;
+
+ Evas_Object *gl = elm_genlist_add (parent);
+
+ itci.item_style = "default";
+ itci.func.label_get = gli_label_get;
+ itci.func.icon_get = NULL;
+ itci.func.state_get = NULL;
+ itci.func.del = NULL;
+
+ num = sizeof (api_list) / sizeof (char *);
+ for (i = 0; i < num; i++) {
+ elm_genlist_item_append (gl, &itci,
+ (void *)i/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, test_api/* func */,
+ (void *)i/* func data */);
+ }
+
+ return gl;
+}
+
+void imcontrolapi_bt (void *data, Evas_Object *obj, void *event_info)
+{
+ const char *ctx_id = ecore_imf_context_default_id_get ();
+ if (ctx_id != NULL) {
+ imf_context = ecore_imf_context_add (ctx_id);
+ } else {
+ printf ("Cannot create imf context\n");
+ return;
+ }
+
+ struct appdata *ad = (struct appdata *)data;
+ Evas_Object *gl = NULL;
+
+ gl = _create_imcontrolapi_list (ad->naviframe);
+
+ Elm_Object_Item *navi_it = elm_naviframe_item_push (ad->naviframe, _("isfimcontrol api"), NULL, NULL, gl, NULL);
+
+ Evas_Object *back_btn = elm_object_item_content_part_get (navi_it, ELM_NAVIFRAME_ITEM_PREV_BTN);
+ evas_object_smart_callback_add (back_btn, "clicked", _nf_back_event, ad);
+}
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Jihoon Kim <jihoon48.kim@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#include "isf_demo_efl.h"
+#include "isf_layout_efl.h"
+
+static void _rotate_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ struct appdata *ad = (struct appdata *)data;
+
+ int angle = elm_win_rotation_get (ad->win_main);
+ if (angle == 0) {
+ elm_win_rotation_with_resize_set (ad->win_main, 270);
+ } else if (angle == 270) {
+ elm_win_rotation_with_resize_set (ad->win_main, 0);
+ }
+}
+
+static void _state_cb (void *data, Ecore_IMF_Context *ctx, int value)
+{
+ int x, y, w, h;
+
+ if (value == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
+ ecore_imf_context_input_panel_geometry_get (ctx, &x, &y, &w, &h);
+ printf ("Input panel is shown\n");
+ printf ("x : %d, y : %d, w : %d, h : %d\n", x, y, w, h);
+ } else if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
+ printf ("Input panel is hidden\n");
+ } else {
+ printf ("unknown value : %d\n", value);
+ }
+}
+
+static void
+_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Key_Down *ev = (Evas_Event_Key_Down *)event_info;
+ printf("[key down] keyname : '%s', key : '%s', string : '%s', compose : '%s'\n", ev->keyname, ev->key, ev->string, ev->compose);
+}
+
+static void
+_key_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Key_Up *ev = (Evas_Event_Key_Up *)event_info;
+ printf("[key up] keyname : '%s', key : '%s', string : '%s', compose : '%s'\n", ev->keyname, ev->key, ev->string, ev->compose);
+}
+
+static Evas_Object *_create_ef (Evas_Object *parent, const char *label, const char *guide_text, Elm_Input_Panel_Layout layout)
+{
+ Evas_Object *ef = NULL;
+ Evas_Object *en = NULL;
+ Ecore_IMF_Context *ic = NULL;
+
+ ef = elm_editfield_add (parent);
+ elm_editfield_label_set (ef, label);
+ elm_editfield_guide_text_set (ef, guide_text);
+ evas_object_size_hint_weight_set (ef, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set (ef, EVAS_HINT_FILL, 0);
+ evas_object_show (ef);
+
+ en = elm_editfield_entry_get (ef);
+ if (!en) return ef;
+
+ elm_entry_input_panel_layout_set (en, layout);
+ evas_object_event_callback_add(en, EVAS_CALLBACK_KEY_DOWN, _key_down_cb, NULL);
+ evas_object_event_callback_add(en, EVAS_CALLBACK_KEY_UP, _key_up_cb, NULL);
+
+ ic = elm_entry_imf_context_get (en);
+
+ if (ic != NULL)
+ ecore_imf_context_input_panel_event_callback_add (ic, ECORE_IMF_INPUT_PANEL_STATE_EVENT, _state_cb, NULL);
+
+ return ef;
+}
+
+static void add_layout_to_conformant (void *data, Evas_Object *lay_in, const char *title)
+{
+ Evas_Object *scroller = NULL;
+ Evas_Object *win = NULL;
+ Evas_Object *conform = NULL;
+ struct appdata *ad = NULL;
+
+ ad = (struct appdata *) data;
+
+ win = ad->win_main;
+ // Enabling illume notification property for window
+ elm_win_conformant_set (win, EINA_TRUE);
+
+ // Creating conformant widget
+ conform = elm_conformant_add (win);
+ evas_object_size_hint_weight_set (conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show (conform);
+
+ scroller = elm_scroller_add (ad->naviframe);
+
+ elm_scroller_bounce_set (scroller, EINA_FALSE, EINA_TRUE);
+ evas_object_show (scroller);
+
+ elm_scroller_content_set (scroller, lay_in);
+ elm_conformant_content_set (conform, scroller);
+ elm_naviframe_item_push (ad->naviframe, title, NULL, NULL, conform, NULL);
+}
+
+static Evas_Object * create_inner_layout (void *data)
+{
+ struct appdata *ad = (struct appdata *)data;
+ Evas_Object *bx = NULL ;
+ Evas_Object *ef = NULL ;
+ Evas_Object *en = NULL ;
+
+ Evas_Object *parent = ad->naviframe;
+
+ bx = elm_box_add (parent);
+ evas_object_size_hint_weight_set (bx, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set (bx, EVAS_HINT_FILL, 0.0);
+ evas_object_show (bx);
+
+ /* Normal Layout */
+ ef = _create_ef (parent, _("NORMAL LAYOUT"), _("click to enter TEXT"), ELM_INPUT_PANEL_LAYOUT_NORMAL);
+ elm_box_pack_end (bx, ef);
+
+ /* Number Layout */
+ ef = _create_ef (parent, _("NUMBER LAYOUT"), _("click to enter NUMBER"), ELM_INPUT_PANEL_LAYOUT_NUMBER);
+ elm_box_pack_end (bx, ef);
+
+ /* Email Layout */
+ ef = _create_ef (parent, _("EMAIL LAYOUT"), _("click to enter EMAIL"), ELM_INPUT_PANEL_LAYOUT_EMAIL);
+ elm_box_pack_end (bx, ef);
+
+ /* URL Layout */
+ ef = _create_ef (parent, _("URL LAYOUT"), _("click to enter URL"), ELM_INPUT_PANEL_LAYOUT_URL);
+ elm_box_pack_end (bx, ef);
+
+ /* Phonenumber Layout */
+ ef = _create_ef (parent, _("PHONENUMBER LAYOUT"), _("click to enter PHONENUMBER"), ELM_INPUT_PANEL_LAYOUT_PHONENUMBER);
+ elm_box_pack_end (bx, ef);
+
+ /* IP Layout */
+ ef = _create_ef (parent, _("IP LAYOUT"), _("click to enter IP"), ELM_INPUT_PANEL_LAYOUT_IP);
+ elm_box_pack_end (bx, ef);
+
+ /* Month Layout */
+ ef = _create_ef (parent, _("MONTH LAYOUT"), _("click to enter MONTH"), ELM_INPUT_PANEL_LAYOUT_MONTH);
+ elm_box_pack_end (bx, ef);
+
+ /* Number Only Layout */
+ ef = _create_ef (parent, _("NUMBERONLY LAYOUT"), _("click to enter NUMBERONLY"), ELM_INPUT_PANEL_LAYOUT_NUMBERONLY);
+ elm_box_pack_end (bx, ef);
+
+ /* Click to rotate button */
+ Evas_Object *rotate_btn = elm_button_add(parent);
+ elm_object_text_set(rotate_btn, "rotate");
+ evas_object_smart_callback_add(rotate_btn, "clicked", _rotate_cb, (void *)ad);
+ evas_object_size_hint_weight_set (rotate_btn, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set (rotate_btn, EVAS_HINT_FILL, 0);
+ evas_object_show (rotate_btn);
+ elm_box_pack_end (bx, rotate_btn);
+
+ return bx;
+}
+
+void ise_layout_bt (void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *lay_inner = create_inner_layout (data);
+ add_layout_to_conformant (data, lay_inner, _("Layout"));
+}
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Jihoon Kim <jihoon48.kim@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#include "isf_demo_efl.h"
+#include "isf_prediction_efl.h"
+
+static Evas_Object *_create_ef (Evas_Object *parent, const char *label, const char *guide_text, Eina_Bool allow)
+{
+ Evas_Object *ef = elm_editfield_add (parent);
+ elm_editfield_label_set (ef, label);
+ elm_editfield_guide_text_set (ef, guide_text);
+ evas_object_size_hint_weight_set (ef, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set (ef, EVAS_HINT_FILL, 0);
+ evas_object_show (ef);
+
+ Evas_Object *en = elm_editfield_entry_get(ef);
+ if (!en) return ef;
+
+ Ecore_IMF_Context *ic = elm_entry_imf_context_get(en);
+ if (ic) {
+ ecore_imf_context_prediction_allow_set(ic, allow);
+ }
+
+ return ef;
+}
+
+static void add_layout_to_conformant (void *data, Evas_Object *lay_in, const char *title)
+{
+ Evas_Object *scroller = NULL;
+ Evas_Object *win = NULL;
+ Evas_Object *conform = NULL;
+ struct appdata *ad = NULL;
+
+ ad = (struct appdata *) data;
+
+ win = ad->win_main;
+ // Enabling illume notification property for window
+ elm_win_conformant_set (win, EINA_TRUE);
+
+ // Creating conformant widget
+ conform = elm_conformant_add (win);
+ evas_object_size_hint_weight_set (conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show (conform);
+
+ scroller = elm_scroller_add (ad->naviframe);
+
+ elm_scroller_bounce_set (scroller, EINA_FALSE, EINA_TRUE);
+ evas_object_show (scroller);
+
+ elm_scroller_content_set (scroller, lay_in);
+ elm_conformant_content_set (conform, scroller);
+ elm_naviframe_item_push (ad->naviframe, title, NULL, NULL, conform, NULL);
+}
+
+static Evas_Object * create_inner_layout (void *data)
+{
+ struct appdata *ad = (struct appdata *)data;
+ Evas_Object *bx = NULL ;
+ Evas_Object *ef = NULL ;
+
+ Evas_Object *parent = ad->naviframe;
+
+ bx = elm_box_add (parent);
+ evas_object_size_hint_weight_set (bx, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set (bx, EVAS_HINT_FILL, 0.0);
+ evas_object_show (bx);
+
+ /* Prediction allow : TRUE */
+ ef = _create_ef (parent, _("Prediction Allow : TRUE"), _("click to enter"), EINA_TRUE);
+ elm_box_pack_end (bx, ef);
+
+ /* Prediction allow : FALSE */
+ ef = _create_ef (parent, _("Prediction Allow : FALSE"), _("click to enter"), EINA_FALSE);
+ elm_box_pack_end (bx, ef);
+
+ return bx;
+}
+
+void ise_prediction_bt (void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *lay_inner = create_inner_layout (data);
+ add_layout_to_conformant (data, lay_inner, _("Prediction Allow"));
+}
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+## Makefile.am -- Process this file with automake to produce Makefile.in
+## Copyright (C) 2002 James Su
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+MAINTAINERCLEANFILES = Makefile.in
+CLEANFILES = *.bak
+
+SUBDIRS = gtk_panel gtk2_immodule efl_panel efl_immodule efl_setting
--- /dev/null
+MAINTAINERCLEANFILES = Makefile.in
+EXTRA_DIST =
+
+INCLUDES = -I$(top_builddir) \
+ -I$(top_builddir)/ism/src \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/ism/src \
+ -I$(top_srcdir)/ism/intl \
+ -I$(top_srcdir)/ism/utils \
+ -I$(includedir) \
+ -DSCIM_DATADIR=\"@SCIM_DATADIR@\" \
+ -DSCIM_LOCALEDIR=\"@SCIM_LOCALEDIR@\" \
+ -DSCIM_SYSCONFDIR=\"@SCIM_SYSCONFDIR@\" \
+ -DSCIM_LIBEXECDIR=\"@SCIM_LIBEXECDIR@\" \
+ -DSCIM_ICONDIR=\"@SCIM_ICONDIR@\" \
+ -DSCIM_MODULE_PATH=\"@SCIM_MODULE_PATH@\" \
+ -DSCIM_TEMPDIR=\"@SCIM_TEMPDIR@\" \
+ -DSCIM_KEYBOARD_ICON_FILE=\"@SCIM_ICONDIR@/keyboard.png\"
+
+if ISF_BUILD_EFL_IMMODULE
+CONFIG_EFL_IMMODULE = libisf-imf-module.la
+endif
+
+noinst_HEADERS = isf_imf_context.h \
+ isf_imf_control_ui.h \
+ isf_imf_control.h
+
+moduledir = @EFL_IM_MODULEDIR@
+module_LTLIBRARIES = $(CONFIG_EFL_IMMODULE)
+
+libisf_imf_module_la_SOURCES = isf_imf_module.cpp \
+ isf_imf_context.cpp \
+ isf_imf_control_ui.cpp \
+ isf_imf_control.cpp
+
+libisf_imf_module_la_CXXFLAGS = @EFL_CFLAGS@ \
+ @UTILX_CFLAGS@ \
+ @VCONF_CFLAGS@ \
+ @DLOG_CFLAGS@
+
+libisf_imf_module_la_LDFLAGS = -rpath $(moduledir) \
+ -avoid-version \
+ -module
+
+libisf_imf_module_la_LIBADD = -lstdc++ \
+ $(LD_VERSION_SCRIPT_OPTION) \
+ @EFL_LIBS@ \
+ @UTILX_LIBS@ \
+ @VCONF_LIBS@ \
+ @DLOG_LIBS@ \
+ $(top_builddir)/ism/src/libscim@SCIM_EPOCH@.la
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jihoon Kim <jihoon48.kim@samsung.com>, Haifeng Deng <haifeng.deng@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#define Uses_SCIM_BACKEND
+#define Uses_SCIM_IMENGINE_MODULE
+#define Uses_SCIM_HELPER_MODULE
+#define Uses_SCIM_HOTKEY
+#define Uses_SCIM_PANEL_CLIENT
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/time.h>
+#include <sys/times.h>
+#include <pthread.h>
+
+#include <Elementary.h>
+#include <Ecore_Evas.h>
+#include <Ecore_X.h>
+#include <Edje.h>
+#include <X11/Xlib.h>
+#include <X11/keysym.h>
+#include <X11/Xutil.h>
+#include <glib.h>
+#include <utilX.h>
+#include <vconf.h>
+#include <vconf-keys.h>
+//#include <X11/extensions/XTest.h>
+
+#include "scim_private.h"
+#include "scim.h"
+#include "isf_imf_context.h"
+#include "isf_imf_control_ui.h"
+
+const double DOUBLE_SPACE_INTERVAL=1.0;
+const int PREDICTION_ALLOW_SET = 0xa0;
+
+using namespace scim;
+
+struct _EcoreIMFContextISFImpl {
+ EcoreIMFContextISF *parent;
+ IMEngineInstancePointer si;
+ Ecore_X_Window client_window;
+ Evas *client_canvas;
+ Ecore_IMF_Input_Mode input_mode;
+ WideString preedit_string;
+ AttributeList preedit_attrlist;
+ Ecore_IMF_Autocapital_Type autocapital_type;
+ int preedit_caret;
+ int cursor_x;
+ int cursor_y;
+ int cursor_top_y;
+ int cursor_pos;
+ bool use_preedit;
+ bool is_on;
+ bool shared_si;
+ bool preedit_started;
+ bool preedit_updating;
+ bool need_commit_preedit;
+ bool uppercase;
+ bool prediction_allow;
+
+ EcoreIMFContextISFImpl *next;
+};
+
+/* Input Context handling functions. */
+static EcoreIMFContextISFImpl *new_ic_impl (EcoreIMFContextISF *parent);
+static void delete_ic_impl (EcoreIMFContextISFImpl *impl);
+static void delete_all_ic_impl (void);
+
+static EcoreIMFContextISF *find_ic (int id);
+
+
+/* private functions */
+static void panel_slot_reload_config (int context);
+static void panel_slot_exit (int context);
+static void panel_slot_update_lookup_table_page_size(int context,
+ int page_size);
+static void panel_slot_lookup_table_page_up (int context);
+static void panel_slot_lookup_table_page_down (int context);
+static void panel_slot_trigger_property (int context,
+ const String &property);
+static void panel_slot_process_helper_event (int context,
+ const String &target_uuid,
+ const String &helper_uuid,
+ const Transaction &trans);
+static void panel_slot_move_preedit_caret (int context,
+ int caret_pos);
+static void panel_slot_select_aux (int context,
+ int aux_index);
+static void panel_slot_select_candidate (int context,
+ int cand_index);
+static void panel_slot_process_key_event (int context,
+ const KeyEvent &key);
+static void panel_slot_commit_string (int context,
+ const WideString &wstr);
+static void panel_slot_forward_key_event (int context,
+ const KeyEvent &key);
+static void panel_slot_request_help (int context);
+static void panel_slot_request_factory_menu (int context);
+static void panel_slot_change_factory (int context,
+ const String &uuid);
+static void panel_slot_reset_keyboard_ise (int context);
+static void panel_slot_update_keyboard_ise (int context);
+static void panel_slot_show_preedit_string (int context);
+static void panel_slot_hide_preedit_string (int context);
+static void panel_slot_update_preedit_string (int context,
+ const WideString &str,
+ const AttributeList &attrs);
+
+static void panel_req_focus_in (EcoreIMFContextISF *ic);
+static void panel_req_update_factory_info (EcoreIMFContextISF *ic);
+static void panel_req_update_spot_location (EcoreIMFContextISF *ic);
+static void panel_req_update_cursor_position (EcoreIMFContextISF *ic, int cursor_pos);
+static void panel_req_show_help (EcoreIMFContextISF *ic);
+static void panel_req_show_factory_menu (EcoreIMFContextISF *ic);
+
+/* Panel iochannel handler*/
+static bool panel_initialize (void);
+static void panel_finalize (void);
+static Eina_Bool panel_iochannel_handler (void *data,
+ Ecore_Fd_Handler *fd_handler);
+
+/* utility functions */
+static bool filter_hotkeys (EcoreIMFContextISF *ic,
+ const KeyEvent &key);
+static void turn_on_ic (EcoreIMFContextISF *ic);
+static void turn_off_ic (EcoreIMFContextISF *ic);
+static void set_ic_capabilities (EcoreIMFContextISF *ic);
+
+static void initialize (void);
+static void finalize (void);
+
+static void open_next_factory (EcoreIMFContextISF *ic);
+static void open_previous_factory (EcoreIMFContextISF *ic);
+static void open_specific_factory (EcoreIMFContextISF *ic,
+ const String &uuid);
+static void initialize_modifier_bits (Display *display);
+static unsigned int scim_x11_keymask_scim_to_x11 (Display *display, uint16 scimkeymask);
+static XKeyEvent createKeyEvent (Display *display, const Window &win,
+ const Window &winRoot, bool press,
+ int keycode, int modifiers);
+static void _x_send_key_event (const KeyEvent &key);
+
+static void attach_instance (const IMEngineInstancePointer &si);
+
+/* slot functions */
+static void slot_show_preedit_string (IMEngineInstanceBase *si);
+static void slot_show_aux_string (IMEngineInstanceBase *si);
+static void slot_show_lookup_table (IMEngineInstanceBase *si);
+
+static void slot_hide_preedit_string (IMEngineInstanceBase *si);
+static void slot_hide_aux_string (IMEngineInstanceBase *si);
+static void slot_hide_lookup_table (IMEngineInstanceBase *si);
+
+static void slot_update_preedit_caret (IMEngineInstanceBase *si,
+ int caret);
+static void slot_update_preedit_string (IMEngineInstanceBase *si,
+ const WideString &str,
+ const AttributeList &attrs);
+static void slot_update_aux_string (IMEngineInstanceBase *si,
+ const WideString &str,
+ const AttributeList &attrs);
+static void slot_commit_string (IMEngineInstanceBase *si,
+ const WideString &str);
+static void slot_forward_key_event (IMEngineInstanceBase *si,
+ const KeyEvent &key);
+static void slot_update_lookup_table (IMEngineInstanceBase *si,
+ const LookupTable &table);
+
+static void slot_register_properties (IMEngineInstanceBase *si,
+ const PropertyList &properties);
+static void slot_update_property (IMEngineInstanceBase *si,
+ const Property &property);
+static void slot_beep (IMEngineInstanceBase *si);
+static void slot_start_helper (IMEngineInstanceBase *si,
+ const String &helper_uuid);
+static void slot_stop_helper (IMEngineInstanceBase *si,
+ const String &helper_uuid);
+static void slot_send_helper_event (IMEngineInstanceBase *si,
+ const String &helper_uuid,
+ const Transaction &trans);
+static bool slot_get_surrounding_text (IMEngineInstanceBase *si,
+ WideString &text,
+ int &cursor,
+ int maxlen_before,
+ int maxlen_after);
+static bool slot_delete_surrounding_text (IMEngineInstanceBase *si,
+ int offset,
+ int len);
+
+static void reload_config_callback (const ConfigPointer &config);
+
+static void fallback_commit_string_cb (IMEngineInstanceBase *si,
+ const WideString &str);
+
+static void caps_mode_check (Ecore_IMF_Context *ctx, Eina_Bool force);
+
+/* Local variables declaration */
+static String _language;
+static EcoreIMFContextISFImpl *_used_ic_impl_list = 0;
+static EcoreIMFContextISFImpl *_free_ic_impl_list = 0;
+static EcoreIMFContextISF *_ic_list = 0;
+
+static KeyboardLayout _keyboard_layout = SCIM_KEYBOARD_Default;
+static int _valid_key_mask = SCIM_KEY_AllMasks;
+
+static FrontEndHotkeyMatcher _frontend_hotkey_matcher;
+static IMEngineHotkeyMatcher _imengine_hotkey_matcher;
+
+static IMEngineInstancePointer _default_instance;
+
+static ConfigModule *_config_module = 0;
+static ConfigPointer _config;
+static BackEndPointer _backend;
+
+static EcoreIMFContextISF *_focused_ic = 0;
+
+static bool _scim_initialized = false;
+
+static int _instance_count = 0;
+static int _context_count = 0;
+
+static IMEngineFactoryPointer _fallback_factory;
+static IMEngineInstancePointer _fallback_instance;
+static PanelClient _panel_client;
+
+static Ecore_Fd_Handler *_panel_iochannel_read_handler = 0;
+static Ecore_Fd_Handler *_panel_iochannel_err_handler = 0;
+
+static Ecore_X_Window _client_window = 0;
+static Ecore_Event_Handler *_key_handler = 0;
+
+static bool _on_the_spot = true;
+static bool _shared_input_method = false;
+
+static Eina_Bool autocap_allow = EINA_FALSE;
+
+static Display *__current_display = 0;
+static int __current_alt_mask = Mod1Mask;
+static int __current_meta_mask = 0;
+static int __current_super_mask = 0;
+static int __current_hyper_mask = 0;
+static int __current_numlock_mask = Mod2Mask;
+
+extern Ecore_IMF_Context *input_panel_ctx;
+
+// A hack to shutdown the immodule cleanly even if im_module_exit () is not called when exiting.
+class FinalizeHandler
+{
+public:
+ FinalizeHandler () {
+ SCIM_DEBUG_FRONTEND(1) << "FinalizeHandler::FinalizeHandler ()\n";
+ }
+ ~FinalizeHandler () {
+ SCIM_DEBUG_FRONTEND(1) << "FinalizeHandler::~FinalizeHandler ()\n";
+ isf_imf_context_shutdown ();
+ }
+};
+
+static FinalizeHandler _finalize_handler;
+
+ConfigPointer isf_imf_context_get_config (void)
+{
+ return _config;
+}
+
+EcoreIMFContextISF *
+get_focused_ic ()
+{
+ return _focused_ic;
+}
+
+static unsigned int
+get_time (void)
+{
+ unsigned int tint;
+ struct timeval tv;
+ struct timezone tz; /* is not used since ages */
+ gettimeofday (&tv, &tz);
+ tint = tv.tv_sec * 1000;
+ tint = tint / 1000 * 1000;
+ tint = tint + tv.tv_usec / 1000;
+ return tint;
+}
+
+/* Function Implementations */
+static EcoreIMFContextISFImpl *
+new_ic_impl (EcoreIMFContextISF *parent)
+{
+ EcoreIMFContextISFImpl *impl = NULL;
+
+ if (_free_ic_impl_list != NULL) {
+ impl = _free_ic_impl_list;
+ _free_ic_impl_list = _free_ic_impl_list->next;
+ } else {
+ impl = new EcoreIMFContextISFImpl;
+ if (impl == NULL)
+ return NULL;
+ }
+
+ impl->uppercase = false;
+ impl->autocapital_type = ECORE_IMF_AUTOCAPITAL_TYPE_NONE;
+ impl->next = _used_ic_impl_list;
+ _used_ic_impl_list = impl;
+
+ impl->parent = parent;
+
+ return impl;
+}
+
+static void
+delete_ic_impl (EcoreIMFContextISFImpl *impl)
+{
+ EcoreIMFContextISFImpl *rec = _used_ic_impl_list, *last = 0;
+
+ for (; rec != 0; last = rec, rec = rec->next) {
+ if (rec == impl) {
+ if (last != 0)
+ last->next = rec->next;
+ else
+ _used_ic_impl_list = rec->next;
+
+ rec->next = _free_ic_impl_list;
+ _free_ic_impl_list = rec;
+
+ rec->parent = 0;
+ rec->si.reset ();
+ rec->client_window = 0;
+ rec->preedit_string = WideString ();
+ rec->preedit_attrlist.clear ();
+
+ return;
+ }
+ }
+}
+
+static void
+delete_all_ic_impl (void)
+{
+ EcoreIMFContextISFImpl *it = _used_ic_impl_list;
+
+ while (it != 0) {
+ _used_ic_impl_list = it->next;
+ delete it;
+ it = _used_ic_impl_list;
+ }
+
+ it = _free_ic_impl_list;
+ while (it != 0) {
+ _free_ic_impl_list = it->next;
+ delete it;
+ it = _free_ic_impl_list;
+ }
+}
+
+static EcoreIMFContextISF *
+find_ic (int id)
+{
+ EcoreIMFContextISFImpl *rec = _used_ic_impl_list;
+
+ while (rec != 0) {
+ if (rec->parent && rec->parent->id == id)
+ return rec->parent;
+ rec = rec->next;
+ }
+
+ return 0;
+}
+
+static Eina_Bool
+key_press_cb (void *data, int type, void *event)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ Evas_Event_Key_Down *ev = (Evas_Event_Key_Down *)event;
+
+ if (!_focused_ic || !_focused_ic->ctx) return ECORE_CALLBACK_RENEW;
+
+ if (!strcmp (ev->keyname, KEY_END)) {
+ LOGD("END key is pressed\n");
+#ifdef ENABLE_BACKKEY
+ isf_imf_context_input_panel_instant_hide (_focused_ic->ctx);
+ return ECORE_CALLBACK_CANCEL;
+#endif
+ } else if (!strcmp (ev->keyname, KEY_SELECT)) {
+ LOGD("HOME key is pressed\n");
+ isf_imf_context_input_panel_instant_hide (_focused_ic->ctx);
+ }
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+int
+register_key_handler ()
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ if (!_key_handler) {
+ _key_handler = ecore_event_handler_add (ECORE_EVENT_KEY_DOWN, key_press_cb, NULL);
+ }
+
+ return EXIT_SUCCESS;
+}
+
+int
+unregister_key_handler ()
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ if (_key_handler) {
+ ecore_event_handler_del (_key_handler);
+ _key_handler = NULL;
+ }
+
+ return EXIT_SUCCESS;
+}
+
+static void
+set_prediction_allow (IMEngineInstancePointer si, bool prediction)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ if (si) {
+ Transaction trans;
+ trans.put_command (PREDICTION_ALLOW_SET);
+ trans.put_data ((uint32)prediction);
+ si->process_helper_event ("", trans);
+ }
+}
+
+void
+send_caps_mode(Ecore_IMF_Context *ctx)
+{
+ caps_mode_check(ctx, EINA_TRUE);
+}
+
+static Eina_Bool
+analyze_surrounding_text(Ecore_IMF_Context *ctx)
+{
+ char *plain_str = NULL;
+ char *markup_str = NULL;
+ const char *puncs[] = {". ", ".\302\240", "! ", "!\302\240", "? ", "?\302\240" };
+ Eina_Bool ret = EINA_FALSE;
+ int cursor_pos = 0;
+ int i = 0;
+ Eina_Unicode *tail = NULL;
+ Eina_Unicode *ustr = NULL;
+ const int punc_num = sizeof(puncs) / sizeof(puncs[0]);
+ Eina_Unicode *uni_puncs[punc_num];
+ EcoreIMFContextISF *context_scim;
+
+ if (!ctx) return EINA_FALSE;
+ context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get (ctx);
+ if (!context_scim || !context_scim->impl) return EINA_FALSE;
+
+ switch (context_scim->impl->autocapital_type)
+ {
+ case ECORE_IMF_AUTOCAPITAL_TYPE_NONE:
+ return EINA_FALSE;
+ case ECORE_IMF_AUTOCAPITAL_TYPE_ALLCHARACTER:
+ return EINA_TRUE;
+ default:
+ break;
+ }
+
+ for (i=0; i < punc_num; i++) {
+ uni_puncs[i] = eina_unicode_utf8_to_unicode(puncs[i], NULL);
+ }
+
+ ecore_imf_context_surrounding_get(ctx, &markup_str, &cursor_pos);
+ if (!markup_str) goto done;
+
+ if (cursor_pos == 0) {
+ ret = EINA_TRUE;
+ goto done;
+ }
+
+ // Convert into plain string
+ plain_str = elm_entry_markup_to_utf8(markup_str);
+ if (!plain_str) goto done;
+
+ // Convert string from utf8 to unicode
+ ustr = eina_unicode_utf8_to_unicode(plain_str, NULL);
+ if (!ustr) goto done;
+
+ if (cursor_pos >= 1) {
+ if (context_scim->impl->autocapital_type == ECORE_IMF_AUTOCAPITAL_TYPE_WORD) {
+ if (ustr[cursor_pos-1] == ' ' || ustr[cursor_pos-1] == '\302\240') {
+ ret = EINA_TRUE;
+ goto done;
+ }
+ }
+
+ // Check paragraph separator <PS> and carrage return <br>
+ if ((ustr[cursor_pos-1] == 0x2029) || (ustr[cursor_pos-1] == '\n')) {
+ ret = EINA_TRUE;
+ goto done;
+ }
+ }
+
+ // check punctuation
+ if (cursor_pos >= 2) {
+ tail = eina_unicode_strndup(ustr+cursor_pos-2, 2);
+
+ if (tail) {
+ for (i=0; i < punc_num; i++) {
+ if (!eina_unicode_strcmp(tail, uni_puncs[i])) {
+ ret = EINA_TRUE;
+ break;
+ }
+ }
+ free(tail);
+ tail = NULL;
+ }
+ }
+
+done:
+ if (ustr) free(ustr);
+ if (markup_str) free(markup_str);
+ if (plain_str) free(plain_str);
+
+ for (i=0; i < punc_num; i++) {
+ if (uni_puncs[i]) free(uni_puncs[i]);
+ }
+
+ return ret;
+}
+
+static void
+caps_mode_check(Ecore_IMF_Context *ctx, Eina_Bool force)
+{
+ Eina_Bool uppercase;
+ EcoreIMFContextISF *context_scim;
+
+ if (!ctx) return;
+ context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get (ctx);
+
+ Ecore_IMF_Input_Panel_Layout layout = ecore_imf_context_input_panel_layout_get(ctx);
+ if (layout != ECORE_IMF_INPUT_PANEL_LAYOUT_NORMAL)
+ return;
+
+ if (autocap_allow == EINA_FALSE)
+ return;
+
+ // Check autocapital type
+ if (!context_scim || !context_scim->impl)
+ return;
+
+ if (analyze_surrounding_text(ctx)) {
+ uppercase = EINA_TRUE;
+ } else {
+ uppercase = EINA_FALSE;
+ }
+
+ if (force) {
+ context_scim->impl->uppercase = uppercase;
+ isf_imf_context_input_panel_caps_mode_set(ctx, uppercase);
+ } else {
+ if (context_scim->impl->uppercase != uppercase) {
+ context_scim->impl->uppercase = uppercase;
+ isf_imf_context_input_panel_caps_mode_set(ctx, uppercase);
+ }
+ }
+}
+
+static void
+evas_focus_out_cb(void *data, Evas *e, void *event_info)
+{
+ Ecore_IMF_Context *ctx = (Ecore_IMF_Context *)data;
+
+ if (!ctx) return;
+
+ LOGD("Canvas focus-out. ctx : %p\n", ctx);
+
+ if (input_panel_ctx == ctx && _scim_initialized) {
+ isf_imf_context_input_panel_instant_hide(ctx);
+ }
+}
+
+static void autocapital_allow_changed_cb (keynode_t *key, void* data)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ autocap_allow = vconf_keynode_get_bool(key);
+}
+
+/* Public functions */
+/**
+ * isf_imf_context_new
+ *
+ * This function will be called by Ecore IMF.
+ * Create a instance of type EcoreIMFContextISF.
+ *
+ * Return value: A pointer to the newly created EcoreIMFContextISF instance
+ */
+EAPI EcoreIMFContextISF *
+isf_imf_context_new (void)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ int val;
+ Ecore_X_Display *display = ecore_x_display_get ();
+ if (!display) {
+ std::cerr << "ecore_x_display_get () failed !!!";
+ return NULL;
+ }
+
+ EcoreIMFContextISF *context_scim = new EcoreIMFContextISF;
+ if (context_scim == NULL) {
+ std::cerr << "memory allocation failed in " << __FUNCTION__ << "\n";
+ return NULL;
+ }
+
+ context_scim->id = _context_count++;
+
+ if (!_scim_initialized) {
+ initialize ();
+ _scim_initialized = true;
+ isf_imf_input_panel_init ();
+
+ /* get autocapital allow vconf value */
+ if (vconf_get_bool (VCONFKEY_SETAPPL_AUTOCAPITAL_ALLOW_BOOL, &val) == 0) {
+ if (val == EINA_TRUE)
+ autocap_allow = EINA_TRUE;
+ }
+
+ vconf_notify_key_changed (VCONFKEY_SETAPPL_AUTOCAPITAL_ALLOW_BOOL, autocapital_allow_changed_cb, NULL);
+ }
+
+ return context_scim;
+}
+
+/**
+ * isf_imf_context_shutdown
+ *
+ * It will be called when the scim im module is unloaded by EFL. It will do some
+ * cleanup job.
+ */
+EAPI void
+isf_imf_context_shutdown (void)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ if (_scim_initialized) {
+ _scim_initialized = false;
+
+ vconf_ignore_key_changed (VCONFKEY_SETAPPL_AUTOCAPITAL_ALLOW_BOOL, autocapital_allow_changed_cb);
+
+ finalize ();
+ isf_imf_input_panel_shutdown ();
+ }
+}
+
+EAPI void
+isf_imf_context_add (Ecore_IMF_Context *ctx)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF*)ecore_imf_context_data_get (ctx);
+
+ if (!context_scim) return;
+
+ context_scim->impl = NULL;
+
+ if (_backend.null ())
+ return;
+
+ IMEngineInstancePointer si;
+
+ // Use the default instance if "shared input method" mode is enabled.
+ if (_shared_input_method && !_default_instance.null ()) {
+ si = _default_instance;
+ SCIM_DEBUG_FRONTEND(2) << "use default instance: " << si->get_id () << " " << si->get_factory_uuid () << "\n";
+ }
+
+ // Not in "shared input method" mode, or no default instance, create an instance.
+ if (si.null ()) {
+ IMEngineFactoryPointer factory = _backend->get_default_factory (_language, "UTF-8");
+ if (factory.null ()) return;
+ si = factory->create_instance ("UTF-8", _instance_count++);
+ if (si.null ()) return;
+ attach_instance (si);
+ SCIM_DEBUG_FRONTEND(2) << "create new instance: " << si->get_id () << " " << si->get_factory_uuid () << "\n";
+ }
+
+ // If "shared input method" mode is enabled, and there is no default instance,
+ // then store this instance as default one.
+ if (_shared_input_method && _default_instance.null ()) {
+ SCIM_DEBUG_FRONTEND(2) << "update default instance.\n";
+ _default_instance = si;
+ }
+
+ context_scim->ctx = ctx;
+ context_scim->impl = new_ic_impl (context_scim);
+ if (context_scim->impl == NULL) {
+ std::cerr << "memory allocation failed in " << __FUNCTION__ << "\n";
+ return;
+ }
+
+ context_scim->impl->si = si;
+ context_scim->impl->client_window = 0;
+ context_scim->impl->client_canvas = NULL;
+ context_scim->impl->preedit_caret = 0;
+ context_scim->impl->cursor_x = 0;
+ context_scim->impl->cursor_y = 0;
+ context_scim->impl->cursor_pos = -1;
+ context_scim->impl->cursor_top_y = 0;
+ context_scim->impl->is_on = true;
+ context_scim->impl->shared_si = _shared_input_method;
+ context_scim->impl->use_preedit = _on_the_spot;
+ context_scim->impl->preedit_started = false;
+ context_scim->impl->preedit_updating = false;
+ context_scim->impl->need_commit_preedit = false;
+ context_scim->impl->prediction_allow = true;
+
+ if (!_ic_list)
+ context_scim->next = NULL;
+ else
+ context_scim->next = _ic_list;
+ _ic_list = context_scim;
+
+ if (_shared_input_method)
+ context_scim->impl->is_on = _config->read (String (SCIM_CONFIG_FRONTEND_IM_OPENED_BY_DEFAULT), context_scim->impl->is_on);
+
+ _panel_client.prepare (context_scim->id);
+ _panel_client.register_input_context (context_scim->id, si->get_factory_uuid ());
+ _panel_client.start_default_ise (context_scim->id);
+ set_ic_capabilities (context_scim);
+ _panel_client.send ();
+
+ SCIM_DEBUG_FRONTEND(2) << "input context created: id = " << context_scim->id << "\n";
+}
+
+EAPI void
+isf_imf_context_del (Ecore_IMF_Context *ctx)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ if (!_ic_list) return;
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF*)ecore_imf_context_data_get (ctx);
+
+ if (context_scim) {
+ if (context_scim->id != _ic_list->id) {
+ EcoreIMFContextISF * pre = _ic_list;
+ EcoreIMFContextISF * cur = _ic_list->next;
+ while (cur != NULL) {
+ if (cur->id == context_scim->id) {
+ pre->next = cur->next;
+ break;
+ }
+ pre = cur;
+ cur = cur->next;
+ }
+ } else
+ _ic_list = _ic_list->next;
+ }
+
+ isf_imf_context_input_panel_event_callback_clear(ctx);
+
+ if (context_scim && context_scim->impl) {
+ _panel_client.prepare (context_scim->id);
+
+ if (context_scim == _focused_ic)
+ context_scim->impl->si->focus_out ();
+
+ if (context_scim->impl->client_canvas)
+ evas_event_callback_del_full(context_scim->impl->client_canvas, EVAS_CALLBACK_CANVAS_FOCUS_OUT, evas_focus_out_cb, ctx);
+
+ if (input_panel_ctx == ctx && _scim_initialized) {
+ LOGD("Context is deleted. ctx : %p\n", ctx);
+ isf_imf_context_input_panel_hide(ctx);
+ }
+
+ // Delete the instance.
+ // FIXME:
+ // In case the instance send out some helper event,
+ // and this context has been focused out,
+ // we need set the focused_ic to this context temporary.
+ EcoreIMFContextISF *old_focused = _focused_ic;
+ _focused_ic = context_scim;
+ context_scim->impl->si.reset ();
+ _focused_ic = old_focused;
+
+ if (context_scim == _focused_ic) {
+ _panel_client.turn_off (context_scim->id);
+ _panel_client.focus_out (context_scim->id);
+ }
+
+ _panel_client.remove_input_context (context_scim->id);
+ _panel_client.send ();
+
+ if (context_scim->impl->client_window)
+ isf_imf_context_client_window_set (ctx, NULL);
+
+ if (context_scim->impl) {
+ delete_ic_impl (context_scim->impl);
+ context_scim->impl = 0;
+ }
+ }
+
+ if (context_scim == _focused_ic)
+ _focused_ic = 0;
+
+ if (context_scim) {
+ delete context_scim;
+ context_scim = 0;
+ }
+}
+
+/**
+ * isf_imf_context_client_canvas_set
+ * @ctx: a #Ecore_IMF_Context
+ * @canvas: the client canvas
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Set the client canvas for the Input Method Context; this is the canvas
+ * in which the input appears.
+ *
+ * The canvas type can be determined by using the context canvas type.
+ * Actually only canvas with type "evas" (Evas *) is supported. This canvas
+ * may be used in order to correctly position status windows, and may also
+ * be used for purposes internal to the Input Method Context.
+ */
+EAPI void
+isf_imf_context_client_canvas_set (Ecore_IMF_Context *ctx, void *canvas)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get (ctx);
+
+ if (context_scim && context_scim->impl && context_scim->impl->client_canvas != (Evas*) canvas) {
+ context_scim->impl->client_canvas = (Evas*)canvas;
+
+ evas_event_callback_add(context_scim->impl->client_canvas, EVAS_CALLBACK_CANVAS_FOCUS_OUT, evas_focus_out_cb, ctx);
+ }
+}
+
+/**
+ * isf_imf_context_client_window_set
+ * @ctx: a #Ecore_IMF_Context
+ * @window: the client window
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Set the client window for the Input Method Context; this is the Ecore_X_Window
+ * when using X11, Ecore_Win32_Window when using Win32, etc.
+ *
+ * This window is used in order to correctly position status windows,
+ * and may also be used for purposes internal to the Input Method Context.
+ */
+EAPI void
+isf_imf_context_client_window_set (Ecore_IMF_Context *ctx, void *window)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get (ctx);
+
+ if (context_scim && context_scim->impl && context_scim->impl->client_window != (Ecore_X_Window)((Ecore_Window)window)) {
+ context_scim->impl->client_window = (Ecore_X_Window)((Ecore_Window)window);
+
+ if ((context_scim->impl->client_window != 0) &&
+ (context_scim->impl->client_window != _client_window)) {
+ _client_window = context_scim->impl->client_window;
+ }
+ }
+}
+
+/**
+ * isf_imf_context_focus_in
+ * @ctx: a #Ecore_IMF_Context
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Notify the Input Method Context that the widget to which its correspond has gained focus.
+ */
+EAPI void
+isf_imf_context_focus_in (Ecore_IMF_Context *ctx)
+{
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get (ctx);
+
+ if (!context_scim)
+ return;
+
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__<< "(" << context_scim->id << ")...\n";
+
+ if (_focused_ic) {
+ if (_focused_ic == context_scim) {
+ SCIM_DEBUG_FRONTEND(1) << "It's already focused.\n";
+ //isf_imf_context_cursor_position_set (ctx, 0);
+ return;
+ }
+ SCIM_DEBUG_FRONTEND(1) << "Focus out previous IC first: " << _focused_ic->id << "\n";
+ if (_focused_ic->ctx)
+ isf_imf_context_focus_out (_focused_ic->ctx);
+ }
+
+ bool need_cap = false;
+ bool need_reset = false;
+ bool need_reg = false;
+
+ if (context_scim && context_scim->impl) {
+ _focused_ic = context_scim;
+ _panel_client.prepare (context_scim->id);
+
+ // Handle the "Shared Input Method" mode.
+ if (_shared_input_method) {
+ SCIM_DEBUG_FRONTEND(2) << "shared input method.\n";
+ IMEngineFactoryPointer factory = _backend->get_default_factory (_language, "UTF-8");
+ if (!factory.null ()) {
+ if (_default_instance.null () || _default_instance->get_factory_uuid () != factory->get_uuid ()) {
+ _default_instance = factory->create_instance ("UTF-8", _default_instance.null () ? _instance_count++ : _default_instance->get_id ());
+ attach_instance (_default_instance);
+ SCIM_DEBUG_FRONTEND(2) << "create new default instance: " << _default_instance->get_id () << " " << _default_instance->get_factory_uuid () << "\n";
+ }
+
+ context_scim->impl->shared_si = true;
+ context_scim->impl->si = _default_instance;
+
+ context_scim->impl->is_on = _config->read (String (SCIM_CONFIG_FRONTEND_IM_OPENED_BY_DEFAULT), context_scim->impl->is_on);
+ context_scim->impl->preedit_string.clear ();
+ context_scim->impl->preedit_attrlist.clear ();
+ context_scim->impl->preedit_caret = 0;
+ context_scim->impl->preedit_started = false;
+ need_cap = true;
+ need_reset = true;
+ need_reg = true;
+ }
+ } else if (context_scim->impl->shared_si) {
+ SCIM_DEBUG_FRONTEND(2) << "exit shared input method.\n";
+ IMEngineFactoryPointer factory = _backend->get_default_factory (_language, "UTF-8");
+ if (!factory.null ()) {
+ context_scim->impl->si = factory->create_instance ("UTF-8", _instance_count++);
+ context_scim->impl->preedit_string.clear ();
+ context_scim->impl->preedit_attrlist.clear ();
+ context_scim->impl->preedit_caret = 0;
+ context_scim->impl->preedit_started = false;
+ attach_instance (context_scim->impl->si);
+ need_cap = true;
+ need_reg = true;
+ context_scim->impl->shared_si = false;
+ SCIM_DEBUG_FRONTEND(2) << "create new instance: " << context_scim->impl->si->get_id () << " " << context_scim->impl->si->get_factory_uuid () << "\n";
+ }
+ }
+
+ context_scim->impl->si->set_frontend_data (static_cast <void*> (context_scim));
+
+ if (need_reg) _panel_client.register_input_context (context_scim->id, context_scim->impl->si->get_factory_uuid ());
+ if (need_cap) set_ic_capabilities (context_scim);
+ if (need_reset) context_scim->impl->si->reset ();
+
+ panel_req_focus_in (context_scim);
+// panel_req_update_spot_location (context_scim);
+// panel_req_update_factory_info (context_scim);
+
+ if (context_scim->impl->is_on) {
+ _panel_client.turn_on (context_scim->id);
+// _panel_client.hide_preedit_string (context_scim->id);
+// _panel_client.hide_aux_string (context_scim->id);
+// _panel_client.hide_lookup_table (context_scim->id);
+ context_scim->impl->si->focus_in ();
+ set_prediction_allow (context_scim->impl->si, context_scim->impl->prediction_allow);
+ } else {
+ _panel_client.turn_off (context_scim->id);
+ }
+
+ if (!context_scim->impl->is_on)
+ turn_on_ic (context_scim);
+
+ _panel_client.send ();
+ }
+
+ LOGD("focus-in. ctx : %p\n", ctx);
+
+ if (ecore_imf_context_input_panel_enabled_get(ctx))
+ isf_imf_context_input_panel_show(ctx);
+}
+
+/**
+ * isf_imf_context_focus_out
+ * @ctx: a #Ecore_IMF_Context
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Notify the Input Method Context that the widget to which its correspond has lost focus.
+ */
+EAPI void
+isf_imf_context_focus_out (Ecore_IMF_Context *ctx)
+{
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get (ctx);
+
+ if (!context_scim) return;
+
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "(" << context_scim->id << ")...\n";
+
+ if (context_scim && context_scim->impl && context_scim == _focused_ic) {
+
+ WideString wstr = context_scim->impl->preedit_string;
+
+ LOGD("focus-out. ctx : %p\n", ctx);
+
+ if (ecore_imf_context_input_panel_enabled_get(ctx))
+ isf_imf_context_input_panel_hide(ctx);
+
+ if (context_scim->impl->need_commit_preedit) {
+ panel_slot_hide_preedit_string (context_scim->id);
+
+ if (wstr.length ())
+ ecore_imf_context_commit_event_add (context_scim->ctx, utf8_wcstombs (wstr).c_str ());
+
+ _panel_client.prepare (context_scim->id);
+ _panel_client.reset_input_context (context_scim->id);
+ _panel_client.send ();
+ }
+
+ _panel_client.prepare (context_scim->id);
+ context_scim->impl->si->focus_out ();
+ context_scim->impl->si->reset ();
+// if (context_scim->impl->shared_si) context_scim->impl->si->reset ();
+ _panel_client.focus_out (context_scim->id);
+ _panel_client.send ();
+ _focused_ic = 0;
+ }
+}
+
+/**
+ * isf_imf_context_reset
+ * @ctx: a #Ecore_IMF_Context
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Notify the Input Method Context that a change such as a change in cursor
+ * position has been made. This will typically cause the Input Method Context
+ * to clear the preedit state.
+ */
+EAPI void
+isf_imf_context_reset (Ecore_IMF_Context *ctx)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get (ctx);
+
+ if (context_scim && context_scim->impl && context_scim == _focused_ic) {
+ WideString wstr = context_scim->impl->preedit_string;
+
+ _panel_client.prepare (context_scim->id);
+ context_scim->impl->si->reset ();
+ _panel_client.send ();
+
+ if (context_scim->impl->need_commit_preedit) {
+ panel_slot_hide_preedit_string (context_scim->id);
+
+ if (wstr.length ()) {
+ ecore_imf_context_commit_event_add (context_scim->ctx, utf8_wcstombs (wstr).c_str ());
+ }
+
+ _panel_client.prepare (context_scim->id);
+ _panel_client.reset_input_context (context_scim->id);
+ _panel_client.send ();
+ }
+ }
+}
+
+/**
+ * isf_imf_context_cursor_position_set
+ * @ctx: a #Ecore_IMF_Context
+ * @cursor_pos: New cursor position in characters.
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Notify the Input Method Context that a change in the cursor position has been made.
+ */
+EAPI void
+isf_imf_context_cursor_position_set (Ecore_IMF_Context *ctx, int cursor_pos)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get (ctx);
+
+ if (context_scim && context_scim->impl && context_scim == _focused_ic) {
+ // Don't update spot location while updating preedit string.
+ if (context_scim->impl->preedit_updating)
+ return;
+
+ if (!context_scim->impl->client_canvas)
+ return;
+
+ if (context_scim->impl->cursor_pos != cursor_pos) {
+ context_scim->impl->cursor_pos = cursor_pos;
+
+ caps_mode_check(ctx, EINA_FALSE);
+
+ _panel_client.prepare (context_scim->id);
+ panel_req_update_cursor_position (context_scim, cursor_pos);
+ _panel_client.send ();
+ }
+ }
+}
+
+/**
+ * isf_imf_context_cursor_location_set
+ * @ctx: a #Ecore_IMF_Context
+ * @x: x position of New cursor.
+ * @y: y position of New cursor.
+ * @w: the width of New cursor.
+ * @h: the height of New cursor.
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Notify the Input Method Context that a change in the cursor location has been made.
+ */
+EAPI void
+isf_imf_context_cursor_location_set (Ecore_IMF_Context *ctx, int cx, int cy, int cw, int ch)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get (ctx);
+ Ecore_Evas *ee;
+ int canvas_x, canvas_y;
+
+ if (cw == 0 && ch == 0)
+ return;
+
+ if (context_scim && context_scim->impl && context_scim == _focused_ic) {
+ // Don't update spot location while updating preedit string.
+ if (context_scim->impl->preedit_updating)
+ return;
+
+ if (!context_scim->impl->client_canvas)
+ return;
+
+ ee = ecore_evas_ecore_evas_get(context_scim->impl->client_canvas);
+ if (!ee) return;
+
+ ecore_evas_geometry_get (ee, &canvas_x, &canvas_y, NULL, NULL);
+
+ if (context_scim->impl->cursor_x != canvas_x + cx || context_scim->impl->cursor_y != canvas_y + cy + ch) {
+ context_scim->impl->cursor_x = canvas_x + cx;
+ context_scim->impl->cursor_y = canvas_y + cy + ch;
+ context_scim->impl->cursor_top_y = canvas_y + cy;
+ _panel_client.prepare (context_scim->id);
+ panel_req_update_spot_location (context_scim);
+ _panel_client.send ();
+ SCIM_DEBUG_FRONTEND(2) << "new cursor location = " << context_scim->impl->cursor_x << "," << context_scim->impl->cursor_y << "\n";
+ }
+ }
+}
+
+/**
+ * isf_imf_context_input_mode_set
+ * @ctx: a #Ecore_IMF_Context
+ * @input_mode: the input mode
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * To set the input mode of input method. The definition of Ecore_IMF_Input_Mode
+ * is in Ecore_IMF.h.
+ */
+EAPI void
+isf_imf_context_input_mode_set (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Mode input_mode)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF*)ecore_imf_context_data_get (ctx);
+ if (context_scim && context_scim->impl) {
+ context_scim->impl->input_mode = input_mode;
+ }
+}
+
+/**
+ * isf_imf_context_preedit_string_get
+ * @ctx: a #Ecore_IMF_Context
+ * @str: the preedit string
+ * @cursor_pos: the cursor position
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * To get the preedit string of the input method.
+ */
+EAPI void
+isf_imf_context_preedit_string_get (Ecore_IMF_Context *ctx, char** str, int *cursor_pos)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF*)ecore_imf_context_data_get (ctx);
+
+ if (context_scim && context_scim->impl && context_scim->impl->is_on) {
+ String mbs = utf8_wcstombs (context_scim->impl->preedit_string);
+
+ if (str) {
+ if (mbs.length ())
+ *str = strdup (mbs.c_str ());
+ else
+ *str = strdup ("");
+ }
+
+ if (cursor_pos) {
+ *cursor_pos = context_scim->impl->preedit_caret;
+ }
+ } else {
+ if (str)
+ *str = strdup ("");
+
+ if (cursor_pos)
+ *cursor_pos = 0;
+ }
+}
+
+EAPI void
+isf_imf_context_preedit_string_with_attributes_get (Ecore_IMF_Context *ctx, char** str, Eina_List **attrs, int *cursor_pos)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF*)ecore_imf_context_data_get (ctx);
+
+ if (context_scim && context_scim->impl && context_scim->impl->is_on) {
+ String mbs = utf8_wcstombs (context_scim->impl->preedit_string);
+
+ if (str) {
+ if (mbs.length ())
+ *str = strdup (mbs.c_str ());
+ else
+ *str = strdup ("");
+ }
+
+ if (cursor_pos) {
+ *cursor_pos = context_scim->impl->preedit_caret;
+ }
+
+ if (attrs) {
+ if (mbs.length ()) {
+ int start_index, end_index;
+ int wlen = context_scim->impl->preedit_string.length ();
+
+ Ecore_IMF_Preedit_Attr *attr = NULL;
+ AttributeList::const_iterator i;
+ bool *attrs_flag = new bool [mbs.length ()];
+ memset (attrs_flag, 0, mbs.length () *sizeof (bool));
+
+ for (i = context_scim->impl->preedit_attrlist.begin ();
+ i != context_scim->impl->preedit_attrlist.end (); ++i) {
+ start_index = i->get_start ();
+ end_index = i->get_end ();
+
+ if (end_index <= wlen && start_index < end_index && i->get_type () != SCIM_ATTR_DECORATE_NONE) {
+ start_index = g_utf8_offset_to_pointer (mbs.c_str (), i->get_start ()) - mbs.c_str ();
+ end_index = g_utf8_offset_to_pointer (mbs.c_str (), i->get_end ()) - mbs.c_str ();
+
+ if (i->get_type () == SCIM_ATTR_DECORATE) {
+ attr = (Ecore_IMF_Preedit_Attr *)calloc(1, sizeof(Ecore_IMF_Preedit_Attr));
+ if (attr == NULL)
+ continue;
+ attr->start_index = start_index;
+ attr->end_index = end_index;
+
+ if (i->get_value () == SCIM_ATTR_DECORATE_UNDERLINE) {
+ attr->preedit_type = ECORE_IMF_PREEDIT_TYPE_SUB1;
+ *attrs = eina_list_append(*attrs, (void *)attr);
+ } else if (i->get_value () == SCIM_ATTR_DECORATE_REVERSE) {
+ attr->preedit_type = ECORE_IMF_PREEDIT_TYPE_SUB2;
+ *attrs = eina_list_append(*attrs, (void *)attr);
+ } else if (i->get_value () == SCIM_ATTR_DECORATE_HIGHLIGHT) {
+ attr->preedit_type = ECORE_IMF_PREEDIT_TYPE_SUB3;
+ *attrs = eina_list_append(*attrs, (void *)attr);
+ } else {
+ free (attr);
+ }
+
+ switch(i->get_value())
+ {
+ case SCIM_ATTR_DECORATE_UNDERLINE:
+ case SCIM_ATTR_DECORATE_REVERSE:
+ case SCIM_ATTR_DECORATE_HIGHLIGHT:
+ // Record which character has attribute.
+ for (int pos = start_index; pos < end_index; ++pos)
+ attrs_flag [pos] = 1;
+ break;
+ default:
+ break;
+ }
+ } else if (i->get_type () == SCIM_ATTR_FOREGROUND) {
+ SCIM_DEBUG_FRONTEND(4) << "SCIM_ATTR_FOREGROUND\n";
+ } else if (i->get_type () == SCIM_ATTR_BACKGROUND) {
+ SCIM_DEBUG_FRONTEND(4) << "SCIM_ATTR_BACKGROUND\n";
+ }
+ }
+ }
+
+ // Add underline for all characters which don't have attribute.
+ for (unsigned int pos = 0; pos < mbs.length (); ++pos) {
+ if (!attrs_flag [pos]) {
+ int begin_pos = pos;
+
+ while (pos < mbs.length () && !attrs_flag [pos])
+ ++pos;
+
+ // use REVERSE style as default
+ attr = (Ecore_IMF_Preedit_Attr *)calloc(1, sizeof(Ecore_IMF_Preedit_Attr));
+ if (attr == NULL)
+ continue;
+ attr->preedit_type = ECORE_IMF_PREEDIT_TYPE_SUB2;
+ attr->start_index = begin_pos;
+ attr->end_index = pos;
+ *attrs = eina_list_append(*attrs, (void *)attr);
+ }
+ }
+
+ delete [] attrs_flag;
+ }
+ }
+ } else {
+ if (str)
+ *str = strdup ("");
+
+ if (cursor_pos)
+ *cursor_pos = 0;
+
+ if (attrs)
+ *attrs = NULL;
+ }
+}
+
+/**
+ * isf_imf_context_use_preedit_set
+ * @ctx: a #Ecore_IMF_Context
+ * @use_preedit: Whether the IM context should use the preedit string.
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Set whether the IM context should use the preedit string to display feedback.
+ * If is 0 (default is 1), then the IM context may use some other method to
+ * display feedback, such as displaying it in a child of the root window.
+ */
+EAPI void
+isf_imf_context_use_preedit_set (Ecore_IMF_Context* ctx, Eina_Bool use_preedit)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " = " << (use_preedit == EINA_TRUE ? "true" : "false") << "...\n";
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF*)ecore_imf_context_data_get (ctx);
+
+ if (!_on_the_spot) return;
+
+ if (context_scim && context_scim->impl) {
+ bool old = context_scim->impl->use_preedit;
+ context_scim->impl->use_preedit = use_preedit;
+ if (context_scim == _focused_ic) {
+ _panel_client.prepare (context_scim->id);
+
+ if (old != use_preedit)
+ set_ic_capabilities (context_scim);
+
+ if (context_scim->impl->preedit_string.length ())
+ slot_show_preedit_string (context_scim->impl->si);
+
+ _panel_client.send ();
+ }
+ }
+}
+
+/**
+ * isf_imf_context_prediction_allow_set
+ * @ctx: a #Ecore_IMF_Context
+ * @prediction: Whether the IM context should use the prediction.
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Set whether the IM context should use the prediction.
+ */
+EAPI void
+isf_imf_context_prediction_allow_set (Ecore_IMF_Context* ctx, Eina_Bool prediction)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " = " << (prediction == EINA_TRUE ? "true" : "false") << "...\n";
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get (ctx);
+
+ if (context_scim && context_scim->impl && context_scim->impl->prediction_allow != prediction) {
+ context_scim->impl->prediction_allow = prediction;
+ set_prediction_allow (context_scim->impl->si, prediction);
+ }
+}
+
+/**
+ * isf_imf_context_prediction_allow_get
+ * @ctx: a #Ecore_IMF_Context
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * To get prediction allow flag for the IM context.
+ *
+ * Return value: the prediction allow flag for the IM context
+ */
+EAPI Eina_Bool
+isf_imf_context_prediction_allow_get (Ecore_IMF_Context* ctx)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get (ctx);
+
+ Eina_Bool ret = EINA_FALSE;
+ if (context_scim && context_scim->impl) {
+ ret = context_scim->impl->prediction_allow;
+ } else {
+ std::cerr << __FUNCTION__ << " failed!!!\n";
+ }
+ return ret;
+}
+
+/**
+ * isf_imf_context_autocapital_type_set
+ * @ctx: a #Ecore_IMF_Context
+ * @autocapital_type: the autocapital type for the IM context.
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Set autocapital type for the IM context.
+ */
+EAPI void
+isf_imf_context_autocapital_type_set (Ecore_IMF_Context* ctx, Ecore_IMF_Autocapital_Type autocapital_type)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " = " << autocapital_type << "...\n";
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get (ctx);
+
+ if (context_scim && context_scim->impl && context_scim->impl->autocapital_type != autocapital_type) {
+ context_scim->impl->autocapital_type = autocapital_type;
+ }
+}
+
+/**
+ * isf_imf_context_filter_event
+ * @ctx: a #Ecore_IMF_Context
+ * @type: The type of event defined by Ecore_IMF_Event_Type.
+ * @event: The event itself.
+ * Return value: %TRUE if the input method handled the key event.
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Allow an Ecore Input Context to internally handle an event. If this function
+ * returns 1, then no further processing should be done for this event. Input
+ * methods must be able to accept all types of events (simply returning 0 if
+ * the event was not handled), but there is no obligation of any events to be
+ * submitted to this function.
+ */
+
+EAPI Eina_Bool
+isf_imf_context_filter_event (Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type type, Ecore_IMF_Event *event)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = (EcoreIMFContextISF*)ecore_imf_context_data_get (ctx);
+ Eina_Bool ret = EINA_FALSE;
+
+ if (ic == NULL || ic->impl == NULL)
+ return ret;
+
+ KeyEvent key;
+ unsigned int timestamp;
+
+ if (type == ECORE_IMF_EVENT_KEY_DOWN) {
+ Ecore_IMF_Event_Key_Down *ev = (Ecore_IMF_Event_Key_Down *)event;
+ timestamp = ev->timestamp;
+ scim_string_to_key (key, ev->key);
+ if (ev->modifiers & ECORE_IMF_KEYBOARD_MODIFIER_SHIFT) key.mask |=SCIM_KEY_ShiftMask;
+ if (ev->modifiers & ECORE_IMF_KEYBOARD_MODIFIER_CTRL) key.mask |=SCIM_KEY_ControlMask;
+ if (ev->modifiers & ECORE_IMF_KEYBOARD_MODIFIER_ALT) key.mask |=SCIM_KEY_AltMask;
+ if (ev->locks & ECORE_IMF_KEYBOARD_LOCK_CAPS) key.mask |=SCIM_KEY_CapsLockMask;
+ if (ev->locks & ECORE_IMF_KEYBOARD_LOCK_NUM) key.mask |=SCIM_KEY_NumLockMask;
+ } else if (type == ECORE_IMF_EVENT_KEY_UP) {
+ Ecore_IMF_Event_Key_Up *ev = (Ecore_IMF_Event_Key_Up *)event;
+ timestamp = ev->timestamp;
+ scim_string_to_key (key, ev->key);
+ key.mask = SCIM_KEY_ReleaseMask;
+ if (ev->modifiers & ECORE_IMF_KEYBOARD_MODIFIER_SHIFT) key.mask |=SCIM_KEY_ShiftMask;
+ if (ev->modifiers & ECORE_IMF_KEYBOARD_MODIFIER_CTRL) key.mask |=SCIM_KEY_ControlMask;
+ if (ev->modifiers & ECORE_IMF_KEYBOARD_MODIFIER_ALT) key.mask |=SCIM_KEY_AltMask;
+ if (ev->locks & ECORE_IMF_KEYBOARD_LOCK_CAPS) key.mask |=SCIM_KEY_CapsLockMask;
+ if (ev->locks & ECORE_IMF_KEYBOARD_LOCK_NUM) key.mask |=SCIM_KEY_NumLockMask;
+ } else if (type == ECORE_IMF_EVENT_MOUSE_UP) {
+ if (ecore_imf_context_input_panel_enabled_get(ctx)) {
+ LOGD("Mouse-up event. ctx : %p\n", ctx);
+ isf_imf_context_input_panel_show(ctx);
+ }
+ return EINA_FALSE;
+ } else {
+ return ret;
+ }
+
+ key.mask &= _valid_key_mask;
+
+ _panel_client.prepare (ic->id);
+
+ ret = EINA_TRUE;
+ if (!filter_hotkeys (ic, key)) {
+ if (timestamp == 0) {
+ // in case of generated event
+ if (type == ECORE_IMF_EVENT_KEY_DOWN) {
+ char code = key.get_ascii_code ();
+ if (isgraph(code)) {
+ char string[2] = {0};
+ snprintf(string, sizeof(string), "%c", code);
+
+ if (strlen(string) != 0) {
+ ecore_imf_context_commit_event_add (ic->ctx, string);
+ _panel_client.send ();
+ caps_mode_check(ctx, EINA_FALSE);
+ return EINA_TRUE;
+ }
+ }
+ }
+ }
+
+ if (!_focused_ic || !_focused_ic->impl->is_on ||
+ !_focused_ic->impl->si->process_key_event (key)) {
+ ret = EINA_FALSE;
+ }
+ }
+
+ _panel_client.send ();
+
+ return ret;
+}
+
+/* Panel Slot functions */
+static void
+panel_slot_reload_config (int context)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ _config->reload ();
+}
+
+static void
+panel_slot_exit (int /* context */)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ finalize ();
+}
+
+static void
+panel_slot_update_lookup_table_page_size (int context, int page_size)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " page_size=" << page_size << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ ic->impl->si->update_lookup_table_page_size (page_size);
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_lookup_table_page_up (int context)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ ic->impl->si->lookup_table_page_up ();
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_lookup_table_page_down (int context)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ ic->impl->si->lookup_table_page_down ();
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_reset_option (int context)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ ic->impl->si->reset_option ();
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_trigger_property (int context, const String &property)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " property=" << property << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ ic->impl->si->trigger_property (property);
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_process_helper_event (int context, const String &target_uuid, const String &helper_uuid, const Transaction &trans)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " target=" << target_uuid
+ << " helper=" << helper_uuid << " ic=" << ic << " ic->impl=" << (ic != NULL ? ic->impl : 0) << " ic-uuid="
+ << ((ic && ic->impl) ? ic->impl->si->get_factory_uuid () : "" ) << "\n";
+ if (ic && ic->impl && ic->impl->si->get_factory_uuid () == target_uuid) {
+ _panel_client.prepare (ic->id);
+ SCIM_DEBUG_FRONTEND(2) << "call process_helper_event\n";
+ ic->impl->si->process_helper_event (helper_uuid, trans);
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_move_preedit_caret (int context, int caret_pos)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " caret=" << caret_pos << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ ic->impl->si->move_preedit_caret (caret_pos);
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_select_aux (int context, int aux_index)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " aux=" << aux_index << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ ic->impl->si->select_aux (aux_index);
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_select_candidate (int context, int cand_index)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " candidate=" << cand_index << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ ic->impl->si->select_candidate (cand_index);
+ _panel_client.send ();
+ }
+}
+
+static const char *
+get_sw_keyname (const char *key_string)
+{
+ const static char *SW_KEY_NAMES[][2] = {
+ {"0x1008ff84", "XF86XK_UserPB"},
+ {"0x1008ff85", "XF86XK_User1KB"},
+ {"0x1008ff86", "XF86XK_User2KB"},
+ };
+ const char* key_name = key_string;
+ int loop;
+ if (key_string) {
+ for (loop = 0; ((unsigned int)loop) < (sizeof (SW_KEY_NAMES) / sizeof (SW_KEY_NAMES[0])); loop++) {
+ if (!strcmp (key_string, SW_KEY_NAMES[loop][0])) {
+ key_name = SW_KEY_NAMES[loop][1];
+ break;
+ }
+ }
+ }
+ return key_name;
+}
+
+static void
+feed_key_event (Evas *evas, const char *str, Eina_Bool fake)
+{
+ char key_string[128] = {0};
+ unsigned int timestamp = 0;
+
+ if (!fake)
+ timestamp = get_time ();
+
+ if (strncmp (str, "KeyRelease+", 11) == 0) {
+ strncpy(key_string, str + 11, strlen(str)-11);
+ evas_event_feed_key_up (evas, key_string, get_sw_keyname(key_string), NULL, NULL, timestamp, NULL);
+ SCIM_DEBUG_FRONTEND(1) << " evas_event_feed_key_up ()...\n";
+ } else {
+ strncpy(key_string, str, strlen(str));
+ evas_event_feed_key_down (evas, key_string, get_sw_keyname(key_string), NULL, NULL, timestamp, NULL);
+ SCIM_DEBUG_FRONTEND(1) << " evas_event_feed_key_down ()...\n";
+ }
+}
+
+static void
+panel_slot_process_key_event (int context, const KeyEvent &key)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " key=" << key.get_key_string () << " ic=" << ic << "\n";
+
+ if (ic && ic->impl && ic->impl->client_canvas) {
+ feed_key_event(ic->impl->client_canvas, key.get_key_string().c_str(), EINA_FALSE);
+ }
+}
+
+static void
+panel_slot_commit_string (int context, const WideString &wstr)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " str=" << utf8_wcstombs (wstr) << " ic=" << ic << "\n";
+
+ if (ic && ic->impl) {
+ if (_focused_ic != ic)
+ return;
+
+ ecore_imf_context_commit_event_add (ic->ctx, utf8_wcstombs (wstr).c_str ());
+ }
+}
+
+static void
+panel_slot_forward_key_event (int context, const KeyEvent &key)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " key=" << key.get_key_string () << " ic=" << ic << "\n";
+
+ if (strlen (key.get_key_string ().c_str ()) >= 116)
+ return;
+
+ if (ic && ic->impl && ic->impl->client_canvas)
+ feed_key_event (ic->impl->client_canvas, key.get_key_string ().c_str (), EINA_TRUE);
+}
+
+static void
+panel_slot_request_help (int context)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ panel_req_show_help (ic);
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_request_factory_menu (int context)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ panel_req_show_factory_menu (ic);
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_change_factory (int context, const String &uuid)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " factory=" << uuid << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ ic->impl->si->reset ();
+ _panel_client.prepare (ic->id);
+ open_specific_factory (ic, uuid);
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_reset_keyboard_ise (int context)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ WideString wstr = ic->impl->preedit_string;
+ if (ic->impl->need_commit_preedit) {
+ panel_slot_hide_preedit_string (ic->id);
+
+ if (wstr.length ())
+ ecore_imf_context_commit_event_add (ic->ctx, utf8_wcstombs (wstr).c_str ());
+ }
+ ic->impl->si->reset ();
+ }
+}
+
+static void
+panel_slot_update_keyboard_ise (int context)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " ic=" << ic << "\n";
+
+ _backend->add_module (_config, "socket", false);
+}
+
+static void
+panel_slot_show_preedit_string (int context)
+{
+ EcoreIMFContextISF *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << "\n";
+
+ if (ic && ic->impl && _focused_ic == ic) {
+ if (!ic->impl->is_on)
+ ic->impl->is_on = true;
+
+ if (ic->impl->use_preedit) {
+ if (!ic->impl->preedit_started) {
+ ecore_imf_context_preedit_start_event_add (_focused_ic->ctx);
+ ic->impl->preedit_started = true;
+ ic->impl->need_commit_preedit = true;
+ }
+ } else {
+ _panel_client.show_preedit_string (ic->id);
+ }
+ }
+}
+
+static void
+panel_slot_hide_preedit_string (int context)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = find_ic (context);
+
+ if (ic && ic->impl && _focused_ic == ic) {
+ if (!ic->impl->is_on)
+ ic->impl->is_on = true;
+
+ bool emit = false;
+ if (ic->impl->preedit_string.length ()) {
+ ic->impl->preedit_string = WideString ();
+ ic->impl->preedit_caret = 0;
+ ic->impl->preedit_attrlist.clear ();
+ emit = true;
+ }
+ if (ic->impl->use_preedit) {
+ if (emit) ecore_imf_context_preedit_changed_event_add (ic->ctx);
+ if (ic->impl->preedit_started) {
+ ecore_imf_context_preedit_end_event_add (ic->ctx);
+ ic->impl->preedit_started = false;
+ ic->impl->need_commit_preedit = false;
+ }
+ } else {
+ _panel_client.hide_preedit_string (ic->id);
+ }
+ }
+}
+
+static void
+panel_slot_update_preedit_string (int context,
+ const WideString &str,
+ const AttributeList &attrs)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = find_ic (context);
+
+ if (ic && ic->impl && _focused_ic == ic) {
+ if (!ic->impl->is_on)
+ ic->impl->is_on = true;
+
+ if (ic->impl->preedit_string != str || str.length ()) {
+ ic->impl->preedit_string = str;
+ ic->impl->preedit_attrlist = attrs;
+
+ if (ic->impl->use_preedit) {
+ if (!ic->impl->preedit_started) {
+ ecore_imf_context_preedit_start_event_add (ic->ctx);
+ ic->impl->preedit_started = true;
+ ic->impl->need_commit_preedit = true;
+ }
+ ic->impl->preedit_caret = str.length ();
+ ic->impl->preedit_updating = true;
+ ecore_imf_context_preedit_changed_event_add (ic->ctx);
+ ic->impl->preedit_updating = false;
+ } else {
+ _panel_client.update_preedit_string (ic->id, str, attrs);
+ }
+ }
+ }
+}
+
+/* Panel Requestion functions. */
+static void
+panel_req_show_help (EcoreIMFContextISF *ic)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ String help;
+
+ help = String (_("Smart Common Input Method platform ")) +
+ String (SCIM_VERSION) +
+ String (_("\n(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n\n"));
+
+ if (ic && ic->impl) {
+ IMEngineFactoryPointer sf = _backend->get_factory (ic->impl->si->get_factory_uuid ());
+ if (sf) {
+ help += utf8_wcstombs (sf->get_name ());
+ help += String (_(":\n\n"));
+
+ help += utf8_wcstombs (sf->get_help ());
+ help += String (_("\n\n"));
+
+ help += utf8_wcstombs (sf->get_credits ());
+ }
+ _panel_client.show_help (ic->id, help);
+ }
+}
+
+static void
+panel_req_show_factory_menu (EcoreIMFContextISF *ic)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ std::vector<IMEngineFactoryPointer> factories;
+ std::vector <PanelFactoryInfo> menu;
+
+ _backend->get_factories_for_encoding (factories, "UTF-8");
+
+ for (size_t i = 0; i < factories.size (); ++ i) {
+ menu.push_back (PanelFactoryInfo (
+ factories [i]->get_uuid (),
+ utf8_wcstombs (factories [i]->get_name ()),
+ factories [i]->get_language (),
+ factories [i]->get_icon_file ()));
+ }
+
+ if (menu.size ())
+ _panel_client.show_factory_menu (ic->id, menu);
+}
+
+static void
+panel_req_update_factory_info (EcoreIMFContextISF *ic)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ if (ic && ic->impl && ic == _focused_ic) {
+ PanelFactoryInfo info;
+ if (ic->impl->is_on) {
+ IMEngineFactoryPointer sf = _backend->get_factory (ic->impl->si->get_factory_uuid ());
+ if (sf)
+ info = PanelFactoryInfo (sf->get_uuid (), utf8_wcstombs (sf->get_name ()), sf->get_language (), sf->get_icon_file ());
+ } else {
+ info = PanelFactoryInfo (String (""), String (_("English/Keyboard")), String ("C"), String (SCIM_KEYBOARD_ICON_FILE));
+ }
+ _panel_client.update_factory_info (ic->id, info);
+ }
+}
+
+static void
+panel_req_focus_in (EcoreIMFContextISF *ic)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ _panel_client.focus_in (ic->id, ic->impl->si->get_factory_uuid ());
+}
+
+static void
+panel_req_update_spot_location (EcoreIMFContextISF *ic)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ _panel_client.update_spot_location (ic->id, ic->impl->cursor_x, ic->impl->cursor_y, ic->impl->cursor_top_y);
+}
+
+static void
+panel_req_update_cursor_position (EcoreIMFContextISF *ic, int cursor_pos)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ _panel_client.update_cursor_position (ic->id, cursor_pos);
+}
+
+static bool
+filter_hotkeys (EcoreIMFContextISF *ic, const KeyEvent &key)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ bool ret = false;
+
+ _frontend_hotkey_matcher.push_key_event (key);
+ _imengine_hotkey_matcher.push_key_event (key);
+
+ FrontEndHotkeyAction hotkey_action = _frontend_hotkey_matcher.get_match_result ();
+
+ if (hotkey_action == SCIM_FRONTEND_HOTKEY_TRIGGER) {
+ if (!ic->impl->is_on)
+ turn_on_ic (ic);
+ else
+ turn_off_ic (ic);
+ ret = true;
+ } else if (hotkey_action == SCIM_FRONTEND_HOTKEY_ON) {
+ if (!ic->impl->is_on)
+ turn_on_ic (ic);
+ ret = true;
+ } else if (hotkey_action == SCIM_FRONTEND_HOTKEY_OFF) {
+ if (ic->impl->is_on)
+ turn_off_ic (ic);
+ ret = true;
+ } else if (hotkey_action == SCIM_FRONTEND_HOTKEY_NEXT_FACTORY) {
+ open_next_factory (ic);
+ ret = true;
+ } else if (hotkey_action == SCIM_FRONTEND_HOTKEY_PREVIOUS_FACTORY) {
+ open_previous_factory (ic);
+ ret = true;
+ } else if (hotkey_action == SCIM_FRONTEND_HOTKEY_SHOW_FACTORY_MENU) {
+ panel_req_show_factory_menu (ic);
+ ret = true;
+ } else if (_imengine_hotkey_matcher.is_matched ()) {
+ ISEInfo info = _imengine_hotkey_matcher.get_match_result ();
+ ISE_TYPE type = info.type;
+ if (type == IMENGINE_T)
+ open_specific_factory (ic, info.uuid);
+ else if (type == HELPER_T)
+ _panel_client.start_helper (ic->id, info.uuid);
+ ret = true;
+ }
+ return ret;
+}
+
+static bool
+panel_initialize (void)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ String display_name;
+ {
+ const char *p = getenv ("DISPLAY");
+ if (p) display_name = String (p);
+ }
+
+ if (_panel_client.open_connection (_config->get_name (), display_name) >= 0) {
+ int fd = _panel_client.get_connection_number ();
+
+ _panel_iochannel_read_handler = ecore_main_fd_handler_add (fd, ECORE_FD_READ, panel_iochannel_handler, NULL, NULL, NULL);
+// _panel_iochannel_err_handler = ecore_main_fd_handler_add (fd, ECORE_FD_ERROR, panel_iochannel_handler, NULL, NULL, NULL);
+
+ SCIM_DEBUG_FRONTEND(2) << " Panel FD= " << fd << "\n";
+
+ EcoreIMFContextISF *context_scim = _ic_list;
+ while (context_scim != NULL) {
+ _panel_client.prepare (context_scim->id);
+ _panel_client.register_input_context (context_scim->id, context_scim->impl->si->get_factory_uuid ());
+ _panel_client.start_default_ise (context_scim->id);
+ _panel_client.send ();
+ context_scim = context_scim->next;
+ }
+
+ if (_focused_ic) {
+ _panel_client.prepare (_focused_ic->id);
+ panel_req_focus_in (_focused_ic);
+ _panel_client.send ();
+ }
+
+ return true;
+ }
+ std::cerr << "panel_initialize () failed!!!\n";
+ return false;
+}
+
+static void
+panel_finalize (void)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ _panel_client.close_connection ();
+
+ if (_panel_iochannel_read_handler) {
+ ecore_main_fd_handler_del (_panel_iochannel_read_handler);
+ _panel_iochannel_read_handler = 0;
+ }
+ if (_panel_iochannel_err_handler) {
+ ecore_main_fd_handler_del (_panel_iochannel_err_handler);
+ _panel_iochannel_err_handler = 0;
+ }
+}
+
+static Eina_Bool
+panel_iochannel_handler (void *data, Ecore_Fd_Handler *fd_handler)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ if (fd_handler == _panel_iochannel_read_handler) {
+ if (!_panel_client.filter_event ()) {
+ panel_finalize ();
+ panel_initialize ();
+ return ECORE_CALLBACK_CANCEL;
+ }
+ } else if (fd_handler == _panel_iochannel_err_handler) {
+ panel_finalize ();
+ panel_initialize ();
+ return ECORE_CALLBACK_CANCEL;
+ }
+ return ECORE_CALLBACK_RENEW;
+}
+
+static void
+turn_on_ic (EcoreIMFContextISF *ic)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ if (ic && ic->impl && !ic->impl->is_on) {
+ ic->impl->is_on = true;
+
+ if (ic == _focused_ic) {
+ panel_req_focus_in (ic);
+// panel_req_update_spot_location (ic);
+ panel_req_update_factory_info (ic);
+ _panel_client.turn_on (ic->id);
+// _panel_client.hide_preedit_string (ic->id);
+// _panel_client.hide_aux_string (ic->id);
+// _panel_client.hide_lookup_table (ic->id);
+ ic->impl->si->focus_in ();
+ set_prediction_allow (ic->impl->si, ic->impl->prediction_allow);
+ }
+
+ //Record the IC on/off status
+ if (_shared_input_method)
+ _config->write (String (SCIM_CONFIG_FRONTEND_IM_OPENED_BY_DEFAULT), true);
+
+ if (ic->impl->use_preedit && ic->impl->preedit_string.length ()) {
+ ecore_imf_context_preedit_start_event_add (ic->ctx);
+ ecore_imf_context_preedit_changed_event_add (ic->ctx);
+ ic->impl->preedit_started = true;
+ }
+ }
+}
+
+static void
+turn_off_ic (EcoreIMFContextISF *ic)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ if (ic && ic->impl && ic->impl->is_on) {
+ ic->impl->is_on = false;
+
+ if (ic == _focused_ic) {
+ ic->impl->si->focus_out ();
+
+// panel_req_update_factory_info (ic);
+ _panel_client.turn_off (ic->id);
+ }
+
+ //Record the IC on/off status
+ if (_shared_input_method)
+ _config->write (String (SCIM_CONFIG_FRONTEND_IM_OPENED_BY_DEFAULT), false);
+
+ if (ic->impl->use_preedit && ic->impl->preedit_string.length ()) {
+ ecore_imf_context_preedit_changed_event_add (ic->ctx);
+ ecore_imf_context_preedit_end_event_add (ic->ctx);
+ ic->impl->preedit_started = false;
+ }
+ }
+}
+
+static void
+set_ic_capabilities (EcoreIMFContextISF *ic)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ if (ic && ic->impl) {
+ unsigned int cap = SCIM_CLIENT_CAP_ALL_CAPABILITIES;
+
+ if (!_on_the_spot || !ic->impl->use_preedit)
+ cap -= SCIM_CLIENT_CAP_ONTHESPOT_PREEDIT;
+
+ ic->impl->si->update_client_capabilities (cap);
+ }
+}
+
+static bool
+check_socket_frontend (void)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ SocketAddress address;
+ SocketClient client;
+
+ uint32 magic;
+
+ address.set_address (scim_get_default_socket_frontend_address ());
+
+ if (!client.connect (address))
+ return false;
+
+ if (!scim_socket_open_connection (magic,
+ String ("ConnectionTester"),
+ String ("SocketFrontEnd"),
+ client,
+ 1000)) {
+ return false;
+ }
+
+ return true;
+}
+
+void
+initialize (void)
+{
+ std::vector<String> config_list;
+ std::vector<String> engine_list;
+ std::vector<String> helper_list;
+ std::vector<String> load_engine_list;
+
+ std::vector<String>::iterator it;
+
+ bool manual = false;
+ bool socket = true;
+ String config_module_name = "simple";
+
+ SCIM_DEBUG_FRONTEND(1) << "Initializing Ecore ISF IMModule...\n";
+
+ // Get system language.
+ _language = scim_get_locale_language (scim_get_current_locale ());
+
+ if (socket) {
+ // If no Socket FrontEnd is running, then launch one.
+ // And set manual to false.
+ bool check_result = check_socket_frontend ();
+ if (!check_result) {
+ std::cerr << "Launching a ISF daemon with Socket FrontEnd...\n";
+ //get modules list
+ scim_get_imengine_module_list (engine_list);
+ scim_get_helper_module_list (helper_list);
+
+ for (it = engine_list.begin (); it != engine_list.end (); it++) {
+ if (*it != "socket")
+ load_engine_list.push_back (*it);
+ }
+ for (it = helper_list.begin (); it != helper_list.end (); it++)
+ load_engine_list.push_back (*it);
+ const char *new_argv [] = { "--no-stay", 0 };
+ scim_launch (true,
+ config_module_name,
+ (load_engine_list.size () > 0 ? scim_combine_string_list (load_engine_list, ',') : "none"),
+ "socket",
+ (char **)new_argv);
+ manual = false;
+ }
+
+ // If there is one Socket FrontEnd running and it's not manual mode,
+ // then just use this Socket Frontend.
+ if (!manual) {
+ for (int i = 0; i < 200; ++i) {
+ if (check_result) {
+ config_module_name = "socket";
+ load_engine_list.clear ();
+ load_engine_list.push_back ("socket");
+ break;
+ }
+ scim_usleep (50000);
+ check_result = check_socket_frontend ();
+ }
+ }
+ }
+
+ if (config_module_name != "dummy") {
+ //load config module
+ SCIM_DEBUG_FRONTEND(1) << "Loading Config module: " << config_module_name << "...\n";
+ _config_module = new ConfigModule (config_module_name);
+
+ //create config instance
+ if (_config_module != NULL && _config_module->valid ())
+ _config = _config_module->create_config ();
+ }
+
+ if (_config.null ()) {
+ SCIM_DEBUG_FRONTEND(1) << "Config module cannot be loaded, using dummy Config.\n";
+
+ if (_config_module) delete _config_module;
+ _config_module = NULL;
+
+ _config = new DummyConfig ();
+ config_module_name = "dummy";
+ }
+
+ reload_config_callback (_config);
+ _config->signal_connect_reload (slot (reload_config_callback));
+
+ // create backend
+ _backend = new CommonBackEnd (_config, load_engine_list.size () > 0 ? load_engine_list : engine_list);
+
+ if (_backend.null ()) {
+ std::cerr << "Cannot create BackEnd Object!\n";
+ } else {
+ _backend->initialize (_config, load_engine_list.size () > 0 ? load_engine_list : engine_list, false, false);
+ _fallback_factory = _backend->get_factory (SCIM_COMPOSE_KEY_FACTORY_UUID);
+ }
+
+ if (_fallback_factory.null ())
+ _fallback_factory = new DummyIMEngineFactory ();
+
+ _fallback_instance = _fallback_factory->create_instance (String ("UTF-8"), 0);
+ _fallback_instance->signal_connect_commit_string (slot (fallback_commit_string_cb));
+
+ // Attach Panel Client signal.
+ _panel_client.signal_connect_reload_config (slot (panel_slot_reload_config));
+ _panel_client.signal_connect_exit (slot (panel_slot_exit));
+ _panel_client.signal_connect_update_lookup_table_page_size (slot (panel_slot_update_lookup_table_page_size));
+ _panel_client.signal_connect_lookup_table_page_up (slot (panel_slot_lookup_table_page_up));
+ _panel_client.signal_connect_lookup_table_page_down (slot (panel_slot_lookup_table_page_down));
+ _panel_client.signal_connect_reset_option (slot (panel_slot_reset_option));
+ _panel_client.signal_connect_trigger_property (slot (panel_slot_trigger_property));
+ _panel_client.signal_connect_process_helper_event (slot (panel_slot_process_helper_event));
+ _panel_client.signal_connect_move_preedit_caret (slot (panel_slot_move_preedit_caret));
+ _panel_client.signal_connect_select_aux (slot (panel_slot_select_aux));
+ _panel_client.signal_connect_select_candidate (slot (panel_slot_select_candidate));
+ _panel_client.signal_connect_process_key_event (slot (panel_slot_process_key_event));
+ _panel_client.signal_connect_commit_string (slot (panel_slot_commit_string));
+ _panel_client.signal_connect_forward_key_event (slot (panel_slot_forward_key_event));
+ _panel_client.signal_connect_request_help (slot (panel_slot_request_help));
+ _panel_client.signal_connect_request_factory_menu (slot (panel_slot_request_factory_menu));
+ _panel_client.signal_connect_change_factory (slot (panel_slot_change_factory));
+ _panel_client.signal_connect_reset_keyboard_ise (slot (panel_slot_reset_keyboard_ise));
+ _panel_client.signal_connect_update_keyboard_ise (slot (panel_slot_update_keyboard_ise));
+ _panel_client.signal_connect_show_preedit_string (slot (panel_slot_show_preedit_string));
+ _panel_client.signal_connect_hide_preedit_string (slot (panel_slot_hide_preedit_string));
+ _panel_client.signal_connect_update_preedit_string (slot (panel_slot_update_preedit_string));
+
+ if (!panel_initialize ()) {
+ std::cerr << "Ecore IM Module: Cannot connect to Panel!\n";
+ }
+}
+
+static void
+finalize (void)
+{
+ SCIM_DEBUG_FRONTEND(1) << "Finalizing Ecore ISF IMModule...\n";
+
+ // Reset this first so that the shared instance could be released correctly afterwards.
+ _default_instance.reset ();
+
+ SCIM_DEBUG_FRONTEND(2) << "Finalize all IC partially.\n";
+ while (_used_ic_impl_list) {
+ // In case in "shared input method" mode,
+ // all contexts share only one instance,
+ // so we need point the reference pointer correctly before finalizing.
+ _used_ic_impl_list->si->set_frontend_data (static_cast <void*> (_used_ic_impl_list->parent));
+ isf_imf_context_del (_used_ic_impl_list->parent->ctx);
+ }
+
+ delete_all_ic_impl ();
+
+ _fallback_instance.reset ();
+ _fallback_factory.reset ();
+
+ SCIM_DEBUG_FRONTEND(2) << " Releasing BackEnd...\n";
+ _backend.reset ();
+
+ SCIM_DEBUG_FRONTEND(2) << " Releasing Config...\n";
+ _config.reset ();
+
+ if (_config_module) {
+ SCIM_DEBUG_FRONTEND(2) << " Deleting _config_module...\n";
+ delete _config_module;
+ _config_module = 0;
+ }
+
+ _focused_ic = NULL;
+ _ic_list = NULL;
+
+ _scim_initialized = false;
+
+ _panel_client.reset_signal_handler ();
+ panel_finalize ();
+}
+
+static void
+open_next_factory (EcoreIMFContextISF *ic)
+{
+ SCIM_DEBUG_FRONTEND(2) << __FUNCTION__ << " context=" << ic->id << "\n";
+ IMEngineFactoryPointer sf = _backend->get_next_factory ("", "UTF-8", ic->impl->si->get_factory_uuid ());
+
+ if (!sf.null ()) {
+ turn_off_ic (ic);
+ ic->impl->si = sf->create_instance ("UTF-8", ic->impl->si->get_id ());
+ ic->impl->si->set_frontend_data (static_cast <void*> (ic));
+ ic->impl->preedit_string = WideString ();
+ ic->impl->preedit_caret = 0;
+ attach_instance (ic->impl->si);
+ _backend->set_default_factory (_language, sf->get_uuid ());
+ _panel_client.register_input_context (ic->id, sf->get_uuid ());
+ set_ic_capabilities (ic);
+ turn_on_ic (ic);
+
+ if (_shared_input_method) {
+ _default_instance = ic->impl->si;
+ ic->impl->shared_si = true;
+ }
+ }
+}
+
+static void
+open_previous_factory (EcoreIMFContextISF *ic)
+{
+ if (ic == NULL)
+ return;
+
+ SCIM_DEBUG_FRONTEND(2) << __FUNCTION__ << " context=" << ic->id << "\n";
+ IMEngineFactoryPointer sf = _backend->get_previous_factory ("", "UTF-8", ic->impl->si->get_factory_uuid ());
+
+ if (!sf.null ()) {
+ turn_off_ic (ic);
+ ic->impl->si = sf->create_instance ("UTF-8", ic->impl->si->get_id ());
+ ic->impl->si->set_frontend_data (static_cast <void*> (ic));
+ ic->impl->preedit_string = WideString ();
+ ic->impl->preedit_caret = 0;
+ attach_instance (ic->impl->si);
+ _backend->set_default_factory (_language, sf->get_uuid ());
+ _panel_client.register_input_context (ic->id, sf->get_uuid ());
+ set_ic_capabilities (ic);
+ turn_on_ic (ic);
+
+ if (_shared_input_method) {
+ _default_instance = ic->impl->si;
+ ic->impl->shared_si = true;
+ }
+ }
+}
+
+static void
+open_specific_factory (EcoreIMFContextISF *ic,
+ const String &uuid)
+{
+ if (ic == NULL)
+ return;
+
+ SCIM_DEBUG_FRONTEND(2) << __FUNCTION__ << " context=" << ic->id << "\n";
+
+ // The same input method is selected, just turn on the IC.
+ if (ic->impl->si->get_factory_uuid () == uuid) {
+ turn_on_ic (ic);
+ return;
+ }
+
+ IMEngineFactoryPointer sf = _backend->get_factory (uuid);
+
+ if (uuid.length () && !sf.null ()) {
+ turn_off_ic (ic);
+ ic->impl->si = sf->create_instance ("UTF-8", ic->impl->si->get_id ());
+ ic->impl->si->set_frontend_data (static_cast <void*> (ic));
+ ic->impl->preedit_string = WideString ();
+ ic->impl->preedit_caret = 0;
+ attach_instance (ic->impl->si);
+ _backend->set_default_factory (_language, sf->get_uuid ());
+ _panel_client.register_input_context (ic->id, sf->get_uuid ());
+ set_ic_capabilities (ic);
+ turn_on_ic (ic);
+
+ if (_shared_input_method) {
+ _default_instance = ic->impl->si;
+ ic->impl->shared_si = true;
+ }
+ } else {
+ std::cerr << "open_specific_factory () is failed!!!!!!\n";
+ // turn_off_ic comment out panel_req_update_factory_info ()
+ //turn_off_ic (ic);
+ if (ic && ic->impl->is_on) {
+ ic->impl->is_on = false;
+
+ if (ic == _focused_ic) {
+ ic->impl->si->focus_out ();
+
+ panel_req_update_factory_info (ic);
+ _panel_client.turn_off (ic->id);
+ }
+
+ //Record the IC on/off status
+ if (_shared_input_method)
+ _config->write (String (SCIM_CONFIG_FRONTEND_IM_OPENED_BY_DEFAULT), false);
+
+ if (ic->impl->use_preedit && ic->impl->preedit_string.length ()) {
+ ecore_imf_context_preedit_changed_event_add (ic->ctx);
+ ecore_imf_context_preedit_end_event_add (ic->ctx);
+ ic->impl->preedit_started = false;
+ }
+ }
+ }
+}
+
+static void initialize_modifier_bits (Display *display)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ if (__current_display == display)
+ return;
+
+ __current_display = display;
+
+ if (display == 0) {
+ __current_alt_mask = Mod1Mask;
+ __current_meta_mask = ShiftMask | Mod1Mask;
+ __current_super_mask = 0;
+ __current_hyper_mask = 0;
+ __current_numlock_mask = Mod2Mask;
+ return;
+ }
+
+ XModifierKeymap *mods = NULL;
+
+ ::KeyCode ctrl_l = XKeysymToKeycode (display, XK_Control_L);
+ ::KeyCode ctrl_r = XKeysymToKeycode (display, XK_Control_R);
+ ::KeyCode meta_l = XKeysymToKeycode (display, XK_Meta_L);
+ ::KeyCode meta_r = XKeysymToKeycode (display, XK_Meta_R);
+ ::KeyCode alt_l = XKeysymToKeycode (display, XK_Alt_L);
+ ::KeyCode alt_r = XKeysymToKeycode (display, XK_Alt_R);
+ ::KeyCode super_l = XKeysymToKeycode (display, XK_Super_L);
+ ::KeyCode super_r = XKeysymToKeycode (display, XK_Super_R);
+ ::KeyCode hyper_l = XKeysymToKeycode (display, XK_Hyper_L);
+ ::KeyCode hyper_r = XKeysymToKeycode (display, XK_Hyper_R);
+ ::KeyCode numlock = XKeysymToKeycode (display, XK_Num_Lock);
+
+ int i, j;
+
+ mods = XGetModifierMapping (display);
+ if (mods == NULL)
+ return;
+
+ __current_alt_mask = 0;
+ __current_meta_mask = 0;
+ __current_super_mask = 0;
+ __current_hyper_mask = 0;
+ __current_numlock_mask = 0;
+
+ /* We skip the first three sets for Shift, Lock, and Control. The
+ remaining sets are for Mod1, Mod2, Mod3, Mod4, and Mod5. */
+ for (i = 3; i < 8; i++) {
+ for (j = 0; j < mods->max_keypermod; j++) {
+ ::KeyCode code = mods->modifiermap [i * mods->max_keypermod + j];
+ if (! code) continue;
+ if (code == alt_l || code == alt_r)
+ __current_alt_mask |= (1 << i);
+ else if (code == meta_l || code == meta_r)
+ __current_meta_mask |= (1 << i);
+ else if (code == super_l || code == super_r)
+ __current_super_mask |= (1 << i);
+ else if (code == hyper_l || code == hyper_r)
+ __current_hyper_mask |= (1 << i);
+ else if (code == numlock)
+ __current_numlock_mask |= (1 << i);
+ }
+ }
+
+ /* Check whether there is a combine keys mapped to Meta */
+ if (__current_meta_mask == 0) {
+ char buf [32];
+ XKeyEvent xkey;
+ KeySym keysym_l, keysym_r;
+
+ xkey.type = KeyPress;
+ xkey.display = display;
+ xkey.serial = 0L;
+ xkey.send_event = False;
+ xkey.x = xkey.y = xkey.x_root = xkey.y_root = 0;
+ xkey.time = 0;
+ xkey.same_screen = False;
+ xkey.subwindow = None;
+ xkey.window = None;
+ xkey.root = DefaultRootWindow (display);
+ xkey.state = ShiftMask;
+
+ xkey.keycode = meta_l;
+ XLookupString (&xkey, buf, 32, &keysym_l, 0);
+ xkey.keycode = meta_r;
+ XLookupString (&xkey, buf, 32, &keysym_r, 0);
+
+ if ((meta_l == alt_l && keysym_l == XK_Meta_L) || (meta_r == alt_r && keysym_r == XK_Meta_R))
+ __current_meta_mask = ShiftMask + __current_alt_mask;
+ else if ((meta_l == ctrl_l && keysym_l == XK_Meta_L) || (meta_r == ctrl_r && keysym_r == XK_Meta_R))
+ __current_meta_mask = ShiftMask + ControlMask;
+ }
+
+ XFreeModifiermap (mods);
+}
+
+static unsigned int scim_x11_keymask_scim_to_x11 (Display *display, uint16 scimkeymask)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ unsigned int state = 0;
+
+ initialize_modifier_bits (display);
+
+ if (scimkeymask & SCIM_KEY_ShiftMask) state |= ShiftMask;
+ if (scimkeymask & SCIM_KEY_CapsLockMask) state |= LockMask;
+ if (scimkeymask & SCIM_KEY_ControlMask) state |= ControlMask;
+ if (scimkeymask & SCIM_KEY_AltMask) state |= __current_alt_mask;
+ if (scimkeymask & SCIM_KEY_MetaMask) state |= __current_meta_mask;
+ if (scimkeymask & SCIM_KEY_SuperMask) state |= __current_super_mask;
+ if (scimkeymask & SCIM_KEY_HyperMask) state |= __current_hyper_mask;
+ if (scimkeymask & SCIM_KEY_NumLockMask) state |= __current_numlock_mask;
+
+ return state;
+}
+
+static XKeyEvent createKeyEvent (Display *display, const Window &win,
+ const Window &winRoot, bool press,
+ int keycode, int modifiers)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ XKeyEvent event;
+
+ event.display = display;
+ event.window = win;
+ event.root = winRoot;
+ event.subwindow = None;
+ event.time = CurrentTime;
+ event.x = 1;
+ event.y = 1;
+ event.x_root = 1;
+ event.y_root = 1;
+ event.same_screen = EINA_TRUE;
+ event.state = modifiers;
+ event.keycode = XKeysymToKeycode (display, keycode);
+ if (press)
+ event.type = KeyPress;
+ else
+ event.type = KeyRelease;
+ event.send_event = EINA_FALSE;
+ event.serial = 0;
+
+ return event;
+}
+
+static void _x_send_key_event (const KeyEvent &key)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ //std::cout << "[slot_send_key_event] code : " << key.code << " mask : " << key.mask << "\n";
+
+ // Obtain the X11 display.
+ Display *display = XOpenDisplay (NULL);
+ if (display == NULL) {
+ std::cerr << "XOpenDisplay failed\n";
+ return;
+ }
+
+ // Get the root window for the current display.
+ Window winRoot = 0;// = XRootWindow (display, 1);
+
+ // Find the window which has the current keyboard focus.
+ Window winFocus = 0;
+ int revert = RevertToParent;
+
+ XGetInputFocus (display, &winFocus, &revert);
+
+ // Send a fake key press event to the window.
+ XSelectInput (display, winFocus, FocusChangeMask|KeyPressMask|KeyReleaseMask);
+ XMapWindow (display, winFocus);
+
+ unsigned int modifier = scim_x11_keymask_scim_to_x11 (display, key.mask);
+ XKeyEvent event;
+ if (key.is_key_press ()) {
+ event = createKeyEvent (display, winFocus, winRoot, true, key.code, modifier);
+ XSendEvent (event.display, event.window, True, KeyPressMask, (XEvent *)&event);
+ } else {
+ event = createKeyEvent (display, winFocus, winRoot, false, key.code, modifier);
+ XSendEvent (event.display, event.window, True, KeyReleaseMask, (XEvent *)&event);
+ }
+
+ XCloseDisplay (display);
+}
+
+static void
+attach_instance (const IMEngineInstancePointer &si)
+{
+ si->signal_connect_show_preedit_string (
+ slot (slot_show_preedit_string));
+ si->signal_connect_show_aux_string (
+ slot (slot_show_aux_string));
+ si->signal_connect_show_lookup_table (
+ slot (slot_show_lookup_table));
+
+ si->signal_connect_hide_preedit_string (
+ slot (slot_hide_preedit_string));
+ si->signal_connect_hide_aux_string (
+ slot (slot_hide_aux_string));
+ si->signal_connect_hide_lookup_table (
+ slot (slot_hide_lookup_table));
+
+ si->signal_connect_update_preedit_caret (
+ slot (slot_update_preedit_caret));
+ si->signal_connect_update_preedit_string (
+ slot (slot_update_preedit_string));
+ si->signal_connect_update_aux_string (
+ slot (slot_update_aux_string));
+ si->signal_connect_update_lookup_table (
+ slot (slot_update_lookup_table));
+
+ si->signal_connect_commit_string (
+ slot (slot_commit_string));
+
+ si->signal_connect_forward_key_event (
+ slot (slot_forward_key_event));
+
+ si->signal_connect_register_properties (
+ slot (slot_register_properties));
+
+ si->signal_connect_update_property (
+ slot (slot_update_property));
+
+ si->signal_connect_beep (
+ slot (slot_beep));
+
+ si->signal_connect_start_helper (
+ slot (slot_start_helper));
+
+ si->signal_connect_stop_helper (
+ slot (slot_stop_helper));
+
+ si->signal_connect_send_helper_event (
+ slot (slot_send_helper_event));
+
+ si->signal_connect_get_surrounding_text (
+ slot (slot_get_surrounding_text));
+
+ si->signal_connect_delete_surrounding_text (
+ slot (slot_delete_surrounding_text));
+}
+
+// Implementation of slot functions
+static void
+slot_show_preedit_string (IMEngineInstanceBase *si)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic) {
+ if (ic->impl->use_preedit) {
+ if (!ic->impl->preedit_started) {
+ ecore_imf_context_preedit_start_event_add (_focused_ic->ctx);
+ //ecore_x_window_background_color_set ((Ecore_X_Window)(_focused_ic->impl->client_window), 0, 128, 128);
+ ic->impl->preedit_started = true;
+ }
+ //if (ic->impl->preedit_string.length ())
+ // ecore_imf_context_preedit_changed_event_add (_focused_ic->ctx);
+ } else {
+ _panel_client.show_preedit_string (ic->id);
+ }
+ }
+}
+
+static void
+slot_show_aux_string (IMEngineInstanceBase *si)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ _panel_client.show_aux_string (ic->id);
+}
+
+static void
+slot_show_lookup_table (IMEngineInstanceBase *si)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ _panel_client.show_lookup_table (ic->id);
+}
+
+static void
+slot_hide_preedit_string (IMEngineInstanceBase *si)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic) {
+ bool emit = false;
+ if (ic->impl->preedit_string.length ()) {
+ ic->impl->preedit_string = WideString ();
+ ic->impl->preedit_caret = 0;
+ ic->impl->preedit_attrlist.clear ();
+ emit = true;
+ }
+ if (ic->impl->use_preedit) {
+ if (emit)
+ ecore_imf_context_preedit_changed_event_add (ic->ctx);
+ if (ic->impl->preedit_started) {
+ ecore_imf_context_preedit_end_event_add (ic->ctx);
+ ic->impl->preedit_started = false;
+ }
+ } else {
+ _panel_client.hide_preedit_string (ic->id);
+ }
+ }
+}
+
+static void
+slot_hide_aux_string (IMEngineInstanceBase *si)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ _panel_client.hide_aux_string (ic->id);
+}
+
+static void
+slot_hide_lookup_table (IMEngineInstanceBase *si)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ _panel_client.hide_lookup_table (ic->id);
+}
+
+static void
+slot_update_preedit_caret (IMEngineInstanceBase *si, int caret)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic && ic->impl->preedit_caret != caret) {
+ ic->impl->preedit_caret = caret;
+ if (ic->impl->use_preedit) {
+ if (!ic->impl->preedit_started) {
+ ecore_imf_context_preedit_start_event_add (ic->ctx);
+ ic->impl->preedit_started = true;
+ }
+ ecore_imf_context_preedit_changed_event_add (ic->ctx);
+ } else {
+ _panel_client.update_preedit_caret (ic->id, caret);
+ }
+ }
+}
+
+static void
+slot_update_preedit_string (IMEngineInstanceBase *si,
+ const WideString & str,
+ const AttributeList & attrs)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic && (ic->impl->preedit_string != str || str.length ())) {
+ ic->impl->preedit_string = str;
+ ic->impl->preedit_attrlist = attrs;
+ if (ic->impl->use_preedit) {
+ if (!ic->impl->preedit_started) {
+ ecore_imf_context_preedit_start_event_add (_focused_ic->ctx);
+ ic->impl->preedit_started = true;
+ }
+ ic->impl->preedit_caret = str.length ();
+ ic->impl->preedit_updating = true;
+ ecore_imf_context_preedit_changed_event_add (ic->ctx);
+ ic->impl->preedit_updating = false;
+ } else {
+ _panel_client.update_preedit_string (ic->id, str, attrs);
+ }
+ }
+}
+
+static void
+slot_update_aux_string (IMEngineInstanceBase *si,
+ const WideString & str,
+ const AttributeList & attrs)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ _panel_client.update_aux_string (ic->id, str, attrs);
+}
+
+static void
+slot_commit_string (IMEngineInstanceBase *si,
+ const WideString & str)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ if (ic && ic->ctx) {
+ ecore_imf_context_commit_event_add (ic->ctx, utf8_wcstombs (str).c_str ());
+ }
+}
+
+static void
+slot_forward_key_event (IMEngineInstanceBase *si,
+ const KeyEvent & key)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ if (ic && _focused_ic == ic) {
+ if (!_fallback_instance->process_key_event (key)) {
+ _x_send_key_event(key);
+ }
+ }
+}
+
+static void
+slot_update_lookup_table (IMEngineInstanceBase *si,
+ const LookupTable & table)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ _panel_client.update_lookup_table (ic->id, table);
+}
+
+static void
+slot_register_properties (IMEngineInstanceBase *si,
+ const PropertyList & properties)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ _panel_client.register_properties (ic->id, properties);
+}
+
+static void
+slot_update_property (IMEngineInstanceBase *si,
+ const Property & property)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ _panel_client.update_property (ic->id, property);
+}
+
+static void
+slot_beep (IMEngineInstanceBase *si)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ ;//gdk_beep ();
+}
+
+static void
+slot_start_helper (IMEngineInstanceBase *si,
+ const String &helper_uuid)
+{
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " helper= " << helper_uuid << " context="
+ << (ic != NULL ? ic->id : -1) << " ic=" << ic
+ << " ic-uuid=" << ((ic != NULL ) ? ic->impl->si->get_factory_uuid () : "") << "...\n";
+
+ if (ic && ic->impl)
+ _panel_client.start_helper (ic->id, helper_uuid);
+}
+
+static void
+slot_stop_helper (IMEngineInstanceBase *si,
+ const String &helper_uuid)
+{
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " helper= " << helper_uuid << " context=" << (ic != NULL ? ic->id : -1) << " ic=" << ic << "...\n";
+
+ if (ic && ic->impl)
+ _panel_client.stop_helper (ic->id, helper_uuid);
+}
+
+static void
+slot_send_helper_event (IMEngineInstanceBase *si,
+ const String &helper_uuid,
+ const Transaction &trans)
+{
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " helper= " << helper_uuid << " context="
+ << (ic != NULL ? ic->id : -1) << " ic=" << ic
+ << " ic-uuid=" << ((ic != NULL) ? ic->impl->si->get_factory_uuid () : "") << "...\n";
+
+ if (ic && ic->impl)
+ _panel_client.send_helper_event (ic->id, helper_uuid, trans);
+}
+
+static bool
+slot_get_surrounding_text (IMEngineInstanceBase *si,
+ WideString &text,
+ int &cursor,
+ int maxlen_before,
+ int maxlen_after)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic) {
+ char *surrounding = NULL;
+ int cursor_index;
+ if (ecore_imf_context_surrounding_get (_focused_ic->ctx, &surrounding, &cursor_index)) {
+ SCIM_DEBUG_FRONTEND(2) << "Surrounding text: " << surrounding <<"\n";
+ SCIM_DEBUG_FRONTEND(2) << "Cursor Index : " << cursor_index <<"\n";
+ WideString before (utf8_mbstowcs (String (surrounding, surrounding + cursor_index)));
+ WideString after (utf8_mbstowcs (String (surrounding + cursor_index)));
+ if (maxlen_before > 0 && ((unsigned int)maxlen_before) < before.length ())
+ before = WideString (before.begin () + (before.length () - maxlen_before), before.end ());
+ else if (maxlen_before == 0) before = WideString ();
+ if (maxlen_after > 0 && ((unsigned int)maxlen_after) < after.length ())
+ after = WideString (after.begin (), after.begin () + maxlen_after);
+ else if (maxlen_after == 0) after = WideString ();
+ text = before + after;
+ cursor = before.length ();
+ return true;
+ }
+ }
+ return false;
+}
+
+static bool
+slot_delete_surrounding_text (IMEngineInstanceBase *si,
+ int offset,
+ int len)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic) {
+ ecore_imf_context_delete_surrounding_event_add (_focused_ic->ctx, offset, len);
+ return true;
+ }
+ return false;
+}
+
+static void
+reload_config_callback (const ConfigPointer &config)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ _frontend_hotkey_matcher.load_hotkeys (config);
+ _imengine_hotkey_matcher.load_hotkeys (config);
+
+ KeyEvent key;
+
+ scim_string_to_key (key,
+ config->read (String (SCIM_CONFIG_HOTKEYS_FRONTEND_VALID_KEY_MASK),
+ String ("Shift+Control+Alt+Lock")));
+
+ _valid_key_mask = (key.mask > 0)?(key.mask):0xFFFF;
+ _valid_key_mask |= SCIM_KEY_ReleaseMask;
+ // Special treatment for two backslash keys on jp106 keyboard.
+ _valid_key_mask |= SCIM_KEY_QuirkKanaRoMask;
+
+ _on_the_spot = config->read (String (SCIM_CONFIG_FRONTEND_ON_THE_SPOT), _on_the_spot);
+ _shared_input_method = config->read (String (SCIM_CONFIG_FRONTEND_SHARED_INPUT_METHOD), _shared_input_method);
+
+ // Get keyboard layout setting
+ // Flush the global config first, in order to load the new configs from disk.
+ scim_global_config_flush ();
+
+ _keyboard_layout = scim_get_default_keyboard_layout ();
+}
+
+static void
+fallback_commit_string_cb (IMEngineInstanceBase *si,
+ const WideString &str)
+{
+ SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+ if (_focused_ic && _focused_ic->impl) {
+ ecore_imf_context_commit_event_add (_focused_ic->ctx, utf8_wcstombs (str).c_str ());
+ }
+}
+
+/*
+vi:ts=4:expandtab:nowrap
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jihoon Kim <jihoon48.kim@samsung.com>, Haifeng Deng <haifeng.deng@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __ISF_IMF_CONTEXT_H
+#define __ISF_IMF_CONTEXT_H
+
+#include <Ecore.h>
+#include <Ecore_IMF.h>
+#include <dlog.h>
+
+#define LOG_TAG "immodule"
+
+typedef struct _EcoreIMFContextISF EcoreIMFContextISF;
+typedef struct _EcoreIMFContextISFImpl EcoreIMFContextISFImpl;
+
+
+struct _EcoreIMFContextISF {
+ Ecore_IMF_Context *ctx;
+
+ EcoreIMFContextISFImpl *impl;
+
+ int id; /* Input Context id*/
+ struct _EcoreIMFContextISF *next;
+};
+
+int register_key_handler ();
+int unregister_key_handler ();
+
+void send_caps_mode(Ecore_IMF_Context *ctx);
+
+EcoreIMFContextISF *get_focused_ic ();
+
+void isf_imf_context_add (Ecore_IMF_Context *ctx);
+void isf_imf_context_del (Ecore_IMF_Context *ctx);
+void isf_imf_context_client_window_set (Ecore_IMF_Context *ctx, void *window);
+void isf_imf_context_client_canvas_set (Ecore_IMF_Context *ctx, void *window);
+void isf_imf_context_focus_in (Ecore_IMF_Context *ctx);
+void isf_imf_context_focus_out (Ecore_IMF_Context *ctx);
+void isf_imf_context_reset (Ecore_IMF_Context *ctx);
+void isf_imf_context_cursor_position_set (Ecore_IMF_Context *ctx, int cursor_pos);
+void isf_imf_context_cursor_location_set (Ecore_IMF_Context *ctx, int x, int y, int w, int h);
+void isf_imf_context_input_mode_set (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Mode input_mode);
+void isf_imf_context_preedit_string_get (Ecore_IMF_Context *ctx, char** str, int *cursor_pos);
+void isf_imf_context_preedit_string_with_attributes_get (Ecore_IMF_Context *ctx, char** str, Eina_List **attrs, int *cursor_pos);
+void isf_imf_context_use_preedit_set (Ecore_IMF_Context* ctx, Eina_Bool use_preedit);
+Eina_Bool isf_imf_context_filter_event (Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type type, Ecore_IMF_Event *event);
+void isf_imf_context_prediction_allow_set (Ecore_IMF_Context* ctx, Eina_Bool prediction);
+void isf_imf_context_autocapital_type_set (Ecore_IMF_Context* ctx, Ecore_IMF_Autocapital_Type autocapital_type);
+
+EcoreIMFContextISF* isf_imf_context_new (void);
+void isf_imf_context_shutdown (void);
+
+#endif /* __ISF_IMF_CONTEXT_H */
+
+/*
+vi:ts=4:expandtab:nowrap
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jihoon Kim <jihoon48.kim@samsung.com>, Haifeng Deng <haifeng.deng@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#define Uses_SCIM_TRANSACTION
+#define Uses_ISF_IMCONTROL_CLIENT
+
+#include <stdio.h>
+#include <Ecore.h>
+#include <errno.h>
+#include "isf_imf_control.h"
+#include "scim.h"
+
+
+using namespace scim;
+
+
+//#define IMFCONTROLDBG(str...) printf(str)
+#define IMFCONTROLDBG(str...)
+#define IMFCONTROLERR(str...) printf(str)
+
+
+static Ecore_Fd_Handler *_read_handler = 0;
+static IMControlClient _imcontrol_client;
+
+
+extern void ecore_ise_process_data (Transaction &trans, int cmd);
+
+
+static int isf_socket_wait_for_data_internal (int socket_id, int timeout)
+{
+ fd_set fds;
+ struct timeval tv;
+ struct timeval begin_tv;
+ int ret;
+
+ int m_id = socket_id;
+
+ if (timeout >= 0) {
+ gettimeofday (&begin_tv, 0);
+ tv.tv_sec = timeout / 1000;
+ tv.tv_usec = (timeout % 1000) * 1000;
+ }
+
+ while (1) {
+ FD_ZERO (&fds);
+ FD_SET (m_id, &fds);
+
+ ret = select (m_id + 1, &fds, NULL, NULL, (timeout >= 0) ? &tv : NULL);
+ if (timeout > 0) {
+ int elapsed;
+ struct timeval cur_tv;
+ gettimeofday (&cur_tv, 0);
+ elapsed = (cur_tv.tv_sec - begin_tv.tv_sec) * 1000 +
+ (cur_tv.tv_usec - begin_tv.tv_usec) / 1000;
+ timeout = timeout - elapsed;
+ if (timeout > 0) {
+ tv.tv_sec = timeout / 1000;
+ tv.tv_usec = (timeout % 1000) * 1000;
+ } else {
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ timeout = 0;
+ }
+ }
+ if (ret > 0) {
+ return ret;
+ } else if (ret == 0) {
+ if (timeout == 0)
+ return ret;
+ else
+ continue;
+ }
+
+ if (errno == EINTR)
+ continue;
+
+ return ret;
+ }
+}
+
+static Eina_Bool ecore_ise_input_handler (void *data, Ecore_Fd_Handler *fd_handler)
+{
+ int cmd;
+ int timeout = 0;
+ Transaction trans;
+
+ if (fd_handler == NULL)
+ return ECORE_CALLBACK_RENEW;
+
+ int fd = ecore_main_fd_handler_fd_get (fd_handler);
+ if (_imcontrol_client.is_connected () &&
+ isf_socket_wait_for_data_internal (fd, timeout) > 0) {
+ trans.clear ();
+ if (!trans.read_from_socket (fd, timeout)) {
+ IMFCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
+ _imcontrol_client.close_connection ();
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REQUEST) {
+ while (trans.get_command (cmd)) {
+ ecore_ise_process_data (trans, cmd);
+ }
+ }
+ return ECORE_CALLBACK_RENEW;
+ }
+ IMFCONTROLERR ("ecore_ise_input_handler is failed!!!\n");
+ return ECORE_CALLBACK_RENEW;
+}
+
+static void connect_panel (void)
+{
+ if (!_imcontrol_client.is_connected ()) {
+ _imcontrol_client.open_connection ();
+ int fd = _imcontrol_client.get_panel2imclient_connection_number ();
+ if (fd > 0) {
+ _read_handler = ecore_main_fd_handler_add (fd, ECORE_FD_READ, ecore_ise_input_handler, NULL, NULL, NULL);
+ }
+ }
+}
+
+EAPI int _isf_imf_context_input_panel_show (void *data, int length)
+{
+ connect_panel ();
+ _imcontrol_client.prepare ();
+ _imcontrol_client.show_ise(data, length);
+ _imcontrol_client.send ();
+ return 0;
+}
+
+EAPI int _isf_imf_context_input_panel_hide (void)
+{
+ connect_panel ();
+ _imcontrol_client.prepare ();
+ _imcontrol_client.hide_ise();
+ _imcontrol_client.send ();
+ return 0;
+}
+
+EAPI int _isf_imf_context_control_panel_show (void)
+{
+ connect_panel ();
+ _imcontrol_client.prepare ();
+ _imcontrol_client.show_control_panel ();
+ _imcontrol_client.send ();
+ return 0;
+}
+
+EAPI int _isf_imf_context_control_panel_hide (void)
+{
+ connect_panel ();
+ _imcontrol_client.prepare ();
+ _imcontrol_client.hide_control_panel ();
+ _imcontrol_client.send ();
+ return 0;
+}
+
+/*
+EAPI int _isf_imf_context_ise_set_mode (ISE_MODE mode)
+{
+ connect_panel ();
+ _imcontrol_client.prepare ();
+ _imcontrol_client.set_mode (mode);
+ _imcontrol_client.send ();
+}
+*/
+
+EAPI int _isf_imf_context_input_panel_language_set (Ecore_IMF_Input_Panel_Lang lang)
+{
+ connect_panel ();
+ _imcontrol_client.prepare ();
+ _imcontrol_client.set_ise_language(lang);
+ _imcontrol_client.send ();
+ return 0;
+}
+
+EAPI int _isf_imf_context_input_panel_imdata_set (const char *data, int len)
+{
+ connect_panel ();
+ _imcontrol_client.prepare ();
+ _imcontrol_client.set_imdata (data, len);
+ _imcontrol_client.send ();
+ return 0;
+}
+
+EAPI int _isf_imf_context_input_panel_imdata_get (char *data, int *len)
+{
+ connect_panel ();
+ _imcontrol_client.prepare ();
+ _imcontrol_client.get_imdata (data, len);
+ return 0;
+}
+
+EAPI int _isf_imf_context_input_panel_geometry_get (int *x, int *y, int *w, int *h)
+{
+ connect_panel ();
+ _imcontrol_client.prepare ();
+ _imcontrol_client.get_window_rect (x, y, w, h);
+ return 0;
+}
+
+EAPI int _isf_imf_context_input_panel_private_key_set (int layout_index, int key_index, const char *label, const char *value)
+{
+ connect_panel ();
+ _imcontrol_client.prepare ();
+ _imcontrol_client.set_private_key (layout_index, key_index, label, value);
+ _imcontrol_client.send ();
+ return 0;
+}
+
+EAPI int _isf_imf_context_input_panel_private_key_set_by_image (int layout_index, int key_index, const char *img_path, const char *value)
+{
+ connect_panel ();
+ _imcontrol_client.prepare ();
+ _imcontrol_client.set_private_key_by_image (layout_index, key_index, img_path, value);
+ _imcontrol_client.send ();
+ return 0;
+}
+
+EAPI int _isf_imf_context_input_panel_key_disabled_set (int layout_index, int key_index, Eina_Bool disabled)
+{
+ connect_panel ();
+ _imcontrol_client.prepare ();
+ _imcontrol_client.set_disable_key (layout_index, key_index, disabled);
+ _imcontrol_client.send ();
+ return 0;
+}
+
+EAPI int _isf_imf_context_input_panel_layout_set (Ecore_IMF_Input_Panel_Layout layout)
+{
+ int layout_temp = layout;
+
+ connect_panel ();
+ _imcontrol_client.prepare ();
+ _imcontrol_client.set_layout (layout_temp);
+ _imcontrol_client.send ();
+ return 0;
+}
+
+EAPI int _isf_imf_context_input_panel_layout_get (Ecore_IMF_Input_Panel_Layout *layout)
+{
+ int layout_temp;
+
+ connect_panel ();
+ _imcontrol_client.prepare ();
+ _imcontrol_client.get_layout (&layout_temp);
+
+ *layout = (Ecore_IMF_Input_Panel_Layout)layout_temp;
+ return 0;
+}
+
+EAPI int _isf_imf_context_input_panel_caps_mode_set (unsigned int mode)
+{
+ connect_panel ();
+
+ _imcontrol_client.prepare ();
+ _imcontrol_client.set_caps_mode (mode);
+ _imcontrol_client.send ();
+ return 0;
+}
+
+/*
+vi:ts=4:expandtab:nowrap
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jihoon Kim <jihoon48.kim@samsung.com>, Haifeng Deng <haifeng.deng@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __ISF_IMF_CONTROL_H
+#define __ISF_IMF_CONTROL_H
+
+#include <Ecore_IMF.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+ /* non UI related works */
+ int _isf_imf_context_input_panel_show (void *data, int length);
+ int _isf_imf_context_input_panel_hide (void);
+ int _isf_imf_context_control_panel_show (void);
+ int _isf_imf_context_control_panel_hide (void);
+
+ int _isf_imf_context_input_panel_language_set (Ecore_IMF_Input_Panel_Lang lang);
+
+ int _isf_imf_context_input_panel_imdata_set (const char *data, int len);
+ int _isf_imf_context_input_panel_imdata_get (char *data, int *len);
+ int _isf_imf_context_input_panel_geometry_get (int *x, int *y, int *w, int *h);
+ int _isf_imf_context_input_panel_private_key_set (int layout_index, int key_index, const char *label, const char *value);
+ int _isf_imf_context_input_panel_private_key_set_by_image (int layout_index, int key_index, const char *img_path, const char *value);
+ int _isf_imf_context_input_panel_layout_set (Ecore_IMF_Input_Panel_Layout layout);
+ int _isf_imf_context_input_panel_layout_get (Ecore_IMF_Input_Panel_Layout *layout);
+ int _isf_imf_context_input_panel_key_disabled_set (int layout_index, int key_index, Eina_Bool disabled);
+ int _isf_imf_context_input_panel_caps_mode_set (unsigned int mode);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __ISF_IMF_CONTROL_H */
+
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jihoon Kim <jihoon48.kim@samsung.com>, Haifeng Deng <haifeng.deng@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#define Uses_SCIM_TRANSACTION
+
+
+/* IM control UI part */
+#include <Ecore_X.h>
+#include <Ecore_Evas.h>
+#include <Ecore_IMF.h>
+#include <glib.h>
+#include "scim.h"
+#include "isf_imf_control_ui.h"
+#include "isf_imf_context.h"
+#include "isf_imf_control.h"
+#include "ise_context.h"
+
+using namespace scim;
+
+#define IMFCONTROLUIDBG(str...)
+#define IMFCONTROLUIERR(str...) printf(str)
+
+
+typedef struct {
+ void (*func)(void *data, Ecore_IMF_Context *ctx, int value);
+ void *data;
+ Ecore_IMF_Input_Panel_Event type;
+ Ecore_IMF_Context *imf_context;
+} EventCallbackNode;
+
+
+/* IM control related variables */
+static Ise_Context iseContext;
+static bool IfInitContext = false;
+static Eina_List *EventCallbackList = NULL;
+static Ecore_IMF_Context *show_req_ic = NULL;
+static Ecore_IMF_Context *hide_req_ic = NULL;
+static Ecore_Event_Handler *_prop_change_handler = NULL;
+static Ecore_X_Atom prop_x_ext_keyboard_exist = 0;
+static Ecore_X_Window _rootwin;
+static unsigned int hw_kbd_num = 0;
+static Ecore_Timer *hide_timer = NULL;
+
+Ecore_IMF_Context *input_panel_ctx = NULL;
+
+
+static Eina_Bool _prop_change (void *data, int ev_type, void *ev)
+{
+ Ecore_X_Event_Window_Property *event = (Ecore_X_Event_Window_Property *)ev;
+ unsigned int val = 0;
+
+ if (event->win != _rootwin) return ECORE_CALLBACK_PASS_ON;
+ if (event->atom != prop_x_ext_keyboard_exist) return ECORE_CALLBACK_PASS_ON;
+
+ if (!ecore_x_window_prop_card32_get (event->win, prop_x_ext_keyboard_exist, &val, 1) > 0)
+ return ECORE_CALLBACK_PASS_ON;
+
+ if (val != 0) {
+ if (show_req_ic)
+ isf_imf_context_input_panel_hide (show_req_ic);
+ }
+
+ hw_kbd_num = val;
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+static void _save_current_xid (Evas *evas)
+{
+ Ecore_X_Window xid = 0, rootwin_xid = 0;
+ Ecore_Evas *ee = NULL;
+
+ if (evas) {
+ ee = ecore_evas_ecore_evas_get (evas);
+ if (ee)
+ xid = (Ecore_X_Window)ecore_evas_window_get (ee);
+ }
+
+ if (xid == 0)
+ rootwin_xid = ecore_x_window_root_first_get ();
+ else
+ rootwin_xid = ecore_x_window_root_get (xid);
+
+ Ecore_X_Atom isf_active_window_atom = ecore_x_atom_get ("_ISF_ACTIVE_WINDOW");
+ ecore_x_window_prop_property_set (rootwin_xid, isf_active_window_atom, ((Ecore_X_Atom) 33), 32, &xid, 1);
+ ecore_x_flush ();
+ ecore_x_sync ();
+}
+
+static Ecore_IMF_Input_Panel_Orient _orient_get (Evas *evas)
+{
+ Ecore_Evas *ee = NULL;
+ int degree;
+ Ecore_IMF_Input_Panel_Orient orient;
+
+ if (!evas)
+ return ECORE_IMF_INPUT_PANEL_ORIENT_NONE;
+ ee = ecore_evas_ecore_evas_get (evas);
+ if (!ee)
+ return ECORE_IMF_INPUT_PANEL_ORIENT_NONE;
+
+ degree = ecore_evas_rotation_get (ee);
+
+ orient = (Ecore_IMF_Input_Panel_Orient)(degree % 360 / 90);
+
+ return orient;
+}
+
+static void _event_callback_call (Ecore_IMF_Input_Panel_Event type, int value)
+{
+ void *list_data = NULL;
+ EventCallbackNode *fn = NULL;
+ Eina_List *l = NULL;
+ Ecore_IMF_Context *using_ic = show_req_ic;
+
+ if (type == ECORE_IMF_INPUT_PANEL_STATE_EVENT &&
+ value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
+ if (hide_req_ic) {
+ using_ic = hide_req_ic;
+ hide_req_ic = NULL;
+ }
+ }
+
+ EINA_LIST_FOREACH(EventCallbackList, l, list_data) {
+ fn = (EventCallbackNode *)list_data;
+
+ if ((fn) && (fn->imf_context == using_ic) &&
+ (fn->type == type) && (fn->func))
+ fn->func (fn->data, fn->imf_context, value);
+
+ IMFCONTROLUIDBG("\tFunc : %p\tType : %d\n", fn->func, fn->type);
+ }
+}
+
+static void _isf_imf_context_init (void)
+{
+ IMFCONTROLUIDBG("debug start --%s\n", __FUNCTION__);
+ memset (iseContext.name, '\0', sizeof (iseContext.name));
+ iseContext.IfAlwaysShow = FALSE;
+ iseContext.IfFullStyle = FALSE;
+ iseContext.state = ECORE_IMF_INPUT_PANEL_STATE_HIDE;
+ iseContext.language = ECORE_IMF_INPUT_PANEL_LANG_AUTOMATIC;
+ iseContext.orient = ECORE_IMF_INPUT_PANEL_ORIENT_NONE;
+ iseContext.fUseImEffect = TRUE;
+
+ if (!IfInitContext) {
+ IfInitContext = true;
+ }
+
+ IMFCONTROLUIDBG("debug end\n");
+}
+
+static Eina_Bool _hide_timer_handler (void *data)
+{
+ LOGD("input panel hide. ctx : %p\n", data);
+ _isf_imf_context_input_panel_hide ();
+
+ hide_timer = NULL;
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void _input_panel_hide_timer_start(void *data)
+{
+ if (!hide_timer)
+ hide_timer = ecore_timer_add (0.05, _hide_timer_handler, data);
+}
+
+static void _input_panel_hide (Ecore_IMF_Context *ctx, Eina_Bool instant)
+{
+ IMFCONTROLUIDBG("[%s]\n", __func__);
+
+ if (IfInitContext == false) {
+ _isf_imf_context_init ();
+ }
+
+ if (iseContext.state == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
+ hide_req_ic = ctx;
+ }
+
+ iseContext.IfAlwaysShow = FALSE;
+
+ if (instant) {
+ if (hide_timer) {
+ ecore_timer_del (hide_timer);
+ hide_timer = NULL;
+ }
+
+ LOGD("input panel hide. ctx : %p\n", ctx);
+ _isf_imf_context_input_panel_hide ();
+ } else {
+ _input_panel_hide_timer_start (ctx);
+ }
+}
+
+EAPI void isf_imf_context_control_panel_show (Ecore_IMF_Context *ctx)
+{
+ IMFCONTROLUIDBG("[%s]\n", __FUNCTION__);
+
+ if (IfInitContext == false) {
+ _isf_imf_context_init ();
+ }
+ _isf_imf_context_control_panel_show ();
+}
+
+EAPI void isf_imf_context_control_panel_hide (Ecore_IMF_Context *ctx)
+{
+ IMFCONTROLUIDBG("[%s]\n", __FUNCTION__);
+
+ if (IfInitContext == false) {
+ _isf_imf_context_init ();
+ }
+ _isf_imf_context_control_panel_hide ();
+}
+
+EAPI void isf_imf_input_panel_init (void)
+{
+ IMFCONTROLUIDBG("[%s]\n", __FUNCTION__);
+
+ if (_prop_change_handler) return;
+
+ _rootwin = ecore_x_window_root_first_get ();
+ ecore_x_event_mask_set (_rootwin, ECORE_X_EVENT_MASK_WINDOW_PROPERTY);
+
+ _prop_change_handler = ecore_event_handler_add (ECORE_X_EVENT_WINDOW_PROPERTY, _prop_change, NULL);
+
+ if (!prop_x_ext_keyboard_exist)
+ prop_x_ext_keyboard_exist = ecore_x_atom_get (PROP_X_EXT_KEYBOARD_EXIST);
+
+ if (!ecore_x_window_prop_card32_get (_rootwin, prop_x_ext_keyboard_exist, &hw_kbd_num, 1)) {
+ printf ("Error! cannot get hw_kbd_num\n");
+ return;
+ }
+}
+
+EAPI void isf_imf_input_panel_shutdown (void)
+{
+ IMFCONTROLUIDBG("[%s]\n", __FUNCTION__);
+
+ if (_prop_change_handler) {
+ ecore_event_handler_del (_prop_change_handler);
+ _prop_change_handler = NULL;
+ }
+
+ if (hide_timer) {
+ ecore_timer_del (hide_timer);
+ hide_timer = NULL;
+ }
+}
+
+EAPI void isf_imf_context_input_panel_show (Ecore_IMF_Context* ctx)
+{
+ int length = -1;
+ int i = 0;
+ Disable_Key_Item *dkey_item = NULL;
+ Private_Key_Item *pkey_item = NULL;
+ Eina_List *disable_key_list = NULL;
+ Eina_List *private_key_list = NULL;
+ Eina_List *l = NULL;
+ void *list_data = NULL;
+ void *offset = NULL;
+ void *packet = NULL;
+ Evas *evas = NULL;
+
+ input_panel_ctx = ctx;
+
+ IMFCONTROLUIDBG("debug start --%s\n", __FUNCTION__);
+
+ if (hw_kbd_num != 0) {
+ printf ("H/W keyboard is existed.\n");
+ return;
+ }
+
+ if (hide_timer) {
+ ecore_timer_del(hide_timer);
+ hide_timer = NULL;
+ }
+
+ if (IfInitContext == false) {
+ _isf_imf_context_init ();
+ }
+
+ show_req_ic = ctx;
+
+ /* get input language */
+ iseContext.language = ecore_imf_context_input_panel_language_get (ctx);
+ IMFCONTROLUIDBG("[%s] language : %d\n", __func__, iseContext.language);
+
+ /* get layout */
+ iseContext.layout = ecore_imf_context_input_panel_layout_get (ctx);
+ IMFCONTROLUIDBG("[%s] layout : %d\n", __func__, iseContext.layout);
+
+ /* get language */
+ iseContext.language = ecore_imf_context_input_panel_language_get (ctx);
+ IMFCONTROLUIDBG("[%s] language : %d\n", __func__, iseContext.language);
+
+ /* get disable key list */
+ disable_key_list = ecore_imf_context_input_panel_key_disabled_list_get (ctx);
+ iseContext.disabled_key_num = eina_list_count (disable_key_list);
+ IMFCONTROLUIDBG("disable key_num : %d\n", iseContext.disabled_key_num);
+
+ /* get private key list */
+ private_key_list = ecore_imf_context_input_panel_private_key_list_get (ctx);
+ iseContext.private_key_num = eina_list_count (private_key_list);
+ IMFCONTROLUIDBG("private key_num : %d\n", iseContext.private_key_num);
+
+ evas = (Evas *)ecore_imf_context_client_canvas_get (ctx);
+
+ if (evas) {
+ iseContext.orient = _orient_get (evas);
+ }
+
+ /* calculate packet size */
+ length = sizeof (iseContext);
+ length += iseContext.disabled_key_num * sizeof (Disable_Key_Item);
+ length += iseContext.private_key_num * sizeof (Private_Key_Item);
+
+ /* create packet */
+ packet = calloc (1, length);
+ if (!packet)
+ return;
+
+ memcpy (packet, (void *)&iseContext, sizeof (iseContext));
+
+ i = 0;
+ offset = (void *)((unsigned int)packet + sizeof (iseContext));
+ EINA_LIST_FOREACH(disable_key_list, l, list_data) {
+ dkey_item = (Disable_Key_Item *)list_data;
+
+ memcpy ((void *)((unsigned int)offset+i*sizeof(Disable_Key_Item)), dkey_item, sizeof (Disable_Key_Item));
+ IMFCONTROLUIDBG("[Disable Key] layout : %d, key : %d, disable : %d\n", dkey_item->layout_idx, dkey_item->key_idx, dkey_item->disabled);
+ i++;
+ }
+
+ offset = (void *)((unsigned int)offset + iseContext.disabled_key_num * sizeof (Disable_Key_Item));
+
+ i = 0;
+ EINA_LIST_FOREACH(private_key_list, l, list_data) {
+ pkey_item = (Private_Key_Item *)list_data;
+ memcpy ((void *)((unsigned int)offset + i * sizeof (Private_Key_Item)), pkey_item, sizeof (Private_Key_Item));
+ IMFCONTROLUIDBG("[Private Key] layout : %d, key : %d, label : %s, key_value : %d, key_str : %s\n", pkey_item->layout_idx, pkey_item->key_idx, pkey_item->data, pkey_item->key_value, pkey_item->key_string);
+ i++;
+ }
+
+ /* Set the current XID of the active window into the root window property */
+ _save_current_xid (evas);
+
+ iseContext.state = ECORE_IMF_INPUT_PANEL_STATE_SHOW;
+
+ LOGD("input panel show. ctx : %p\n", ctx);
+
+ _isf_imf_context_input_panel_show (packet ,length);
+ free (packet);
+
+ send_caps_mode (ctx);
+}
+
+EAPI void isf_imf_context_input_panel_hide (Ecore_IMF_Context *ctx)
+{
+ IMFCONTROLUIDBG("[%s]\n", __func__);
+
+ _input_panel_hide (ctx, EINA_FALSE);
+}
+
+EAPI void isf_imf_context_input_panel_instant_hide (Ecore_IMF_Context *ctx)
+{
+ IMFCONTROLUIDBG("[%s]\n", __func__);
+
+ _input_panel_hide (ctx, EINA_TRUE);
+}
+
+EAPI void isf_imf_context_input_panel_language_set (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Lang language)
+{
+ IMFCONTROLUIDBG("[%s] language : %d\n", __func__, language);
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get (ctx);
+
+ if (!IfInitContext)
+ _isf_imf_context_init ();
+ iseContext.language = language;
+
+ if (context_scim == get_focused_ic ())
+ _isf_imf_context_input_panel_language_set (language);
+}
+
+EAPI Ecore_IMF_Input_Panel_Lang isf_imf_context_input_panel_language_get (Ecore_IMF_Context *ctx)
+{
+ IMFCONTROLUIDBG("[%s] language : %d\n", __func__, iseContext.language);
+ if (!IfInitContext) _isf_imf_context_init();
+ return iseContext.language;
+}
+
+EAPI void isf_imf_context_input_panel_caps_mode_set (Ecore_IMF_Context *ctx, unsigned int mode)
+{
+ IMFCONTROLUIDBG("[%s] shift mode : %d\n", __func__, mode);
+
+ if (!IfInitContext)
+ _isf_imf_context_init ();
+ _isf_imf_context_input_panel_caps_mode_set (mode);
+}
+
+/**
+ * Set up an ISE specific data
+ *
+ * @param[in] ctx a #Ecore_IMF_Context
+ * @param[in] data pointer of data to sets up to ISE
+ * @param[in] length length of data
+ */
+EAPI void isf_imf_context_input_panel_imdata_set (Ecore_IMF_Context *ctx, const char* data, int length)
+{
+ IMFCONTROLUIDBG("[%s] data : %s, len : %d\n", __func__, data, length);
+
+ if (length < 0)
+ return;
+ if (!IfInitContext)
+ _isf_imf_context_init ();
+ _isf_imf_context_input_panel_imdata_set (data, length);
+}
+
+/**
+ * Get the ISE specific data from ISE
+ *
+ * @param[in] ctx a #Ecore_IMF_Context
+ * @param[out] data pointer of data to return
+ * @param[out] length length of data
+ */
+EAPI void isf_imf_context_input_panel_imdata_get (Ecore_IMF_Context *ctx, char* data, int* length)
+{
+ if (!IfInitContext)
+ _isf_imf_context_init ();
+ _isf_imf_context_input_panel_imdata_get (data, length);
+ IMFCONTROLUIDBG("[%s] imdata : %s, len : %d\n", __func__, data, *length);
+}
+
+EAPI void isf_imf_context_input_panel_move (Ecore_IMF_Context *ctx, int x, int y)
+{
+ IMFCONTROLUIDBG("[%s] x : %d, y : %d\n", __func__, x, y);
+
+ if (!IfInitContext)
+ _isf_imf_context_init ();
+ iseContext.input_panel_x = x;
+ iseContext.input_panel_x = y;
+}
+
+/**
+ * Get ISE's position and size, in screen coodinates of the ISE rectangle not the client area,
+ * the represents the size and location of the ISE
+ *
+ * @param[in] ctx a #Ecore_IMF_Context
+ * @param[out] x the x position of ISE window
+ * @param[out] y the y position of ISE window
+ * @param[out] w the width of ISE window
+ * @param[out] h the height of ISE window
+ */
+EAPI void isf_imf_context_input_panel_geometry_get (Ecore_IMF_Context *ctx, int *x, int *y, int *w, int *h)
+{
+ if (!IfInitContext)
+ _isf_imf_context_init ();
+ _isf_imf_context_input_panel_geometry_get (x, y, w, h);
+
+ IMFCONTROLUIDBG("[%s] x : %d, y : %d, w : %d, h : %d\n", __func__, *x, *y, *w, *h);
+}
+
+/**
+ * Sets up a private key in active ISE keyboard layout for own's application.
+ * In some case which does not support the private key will be ignored even
+ * through the application requested.
+ *
+ * @param[in] ctx a #Ecore_IMF_Context
+ * @param[in] layout_idx an index of layout page to be set
+ * @param[in] key_idx an index of key to be set
+ * @param[in] img_path the image file to be set
+ * @param[in] label a text label to be displayed on private key
+ * @param[in] value a value of key. If null, it will use original value of key
+ */
+EAPI void isf_imf_context_input_panel_private_key_set (Ecore_IMF_Context *ctx,
+ int layout_index,
+ int key_index,
+ const char *img_path,
+ const char *label,
+ const char *value)
+{
+ IMFCONTROLUIDBG("[%s] layout : %d, key_index : %d, img_path : %s, label : %s, value : %s\n", __func__, layout_index, key_index, img_path, label, value);
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get (ctx);
+
+ if (!IfInitContext)
+ _isf_imf_context_init ();
+
+ if (context_scim != get_focused_ic ())
+ return;
+
+ if (img_path) {
+ _isf_imf_context_input_panel_private_key_set_by_image (layout_index, key_index, img_path, value);
+ } else {
+ _isf_imf_context_input_panel_private_key_set (layout_index, key_index, label, value);
+ }
+}
+
+/**
+ * Make a key to be disabled in active ISE keyboard layout for own's application.
+ * In some case which does not support the disable key will be ignored
+ * even through the application requested.
+ *
+ * @param[in] ctx a #Ecore_IMF_Context
+ * @param[in] layout_idx an index of layout page to be set
+ * @param[in] key_idx an index of key to be set
+ * @param[in] disabled the state
+ */
+EAPI void isf_imf_context_input_panel_key_disabled_set (Ecore_IMF_Context *ctx, int layout_index, int key_index, Eina_Bool disabled)
+{
+ IMFCONTROLUIDBG("[%s] layout : %d, key_index : %d, value : %d\n", __func__, layout_index, key_index, disabled);
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get (ctx);
+
+ if (!IfInitContext)
+ _isf_imf_context_init ();
+
+ if (context_scim == get_focused_ic())
+ _isf_imf_context_input_panel_key_disabled_set (layout_index, key_index, disabled);
+}
+
+/**
+ * Sets up the layout infomation of active ISE
+ *
+ * @param[in] ctx a #Ecore_IMF_Context
+ * @param[in] layout sets a layout ID to be shown. The layout ID will define by the configuration of selected ISE.
+ */
+EAPI void
+isf_imf_context_input_panel_layout_set (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Layout layout)
+{
+ IMFCONTROLUIDBG("[%s] layout : %d\n", __func__, layout);
+
+ EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get (ctx);
+
+ if (!IfInitContext)
+ _isf_imf_context_init ();
+
+ if (context_scim == get_focused_ic ())
+ _isf_imf_context_input_panel_layout_set (layout);
+}
+
+/**
+* Get current ISE layout
+*
+* @param[in] ctx a #Ecore_IMF_Context
+*
+* @return the layout of current ISE.
+*/
+EAPI Ecore_IMF_Input_Panel_Layout isf_imf_context_input_panel_layout_get (Ecore_IMF_Context *ctx)
+{
+ Ecore_IMF_Input_Panel_Layout layout;
+ if (!IfInitContext)
+ _isf_imf_context_init ();
+ _isf_imf_context_input_panel_layout_get (&layout);
+
+ IMFCONTROLUIDBG("[%s] layout : %d\n", __func__, layout);
+
+ return layout;
+}
+
+/**
+ * Get current ISE state
+ *
+ * @param[in] ctx a #Ecore_IMF_Context
+ *
+ * @return the state of current ISE.
+ */
+EAPI Ecore_IMF_Input_Panel_State isf_imf_context_input_panel_state_get (Ecore_IMF_Context *ctx)
+{
+ IMFCONTROLUIDBG("[%s] state : %d\n", __func__, iseContext.state);
+
+ if (!IfInitContext)
+ _isf_imf_context_init ();
+ return iseContext.state;
+}
+
+EAPI void isf_imf_context_input_panel_event_callback_add (Ecore_IMF_Context *ctx,
+ Ecore_IMF_Input_Panel_Event type,
+ void (*func) (void *data, Ecore_IMF_Context *ctx, int value),
+ void *data)
+{
+ EventCallbackNode *fn = NULL;
+
+ fn = (EventCallbackNode *)calloc (1, sizeof (EventCallbackNode));
+ if (!fn)
+ return;
+
+ IMFCONTROLUIDBG("[%s]\n", __func__);
+
+ fn->func = func;
+ fn->data = data;
+ fn->type = type;
+ fn->imf_context = ctx;
+
+ EventCallbackList = eina_list_append (EventCallbackList, fn);
+}
+
+EAPI void isf_imf_context_input_panel_event_callback_del (Ecore_IMF_Context *ctx,
+ Ecore_IMF_Input_Panel_Event type,
+ void (*func) (void *data, Ecore_IMF_Context *ctx, int value))
+{
+ Eina_List *l = NULL;
+ EventCallbackNode *fn = NULL;
+
+ IMFCONTROLUIDBG("[%s]\n", __func__);
+
+ for (l = EventCallbackList; l;) {
+ fn = (EventCallbackNode *)l->data;
+
+ if ((fn) && (fn->func == func) && (fn->type == type)) {
+ EventCallbackList = eina_list_remove (EventCallbackList, fn);
+ free (fn);
+ break;
+ }
+ l = l->next;
+ }
+}
+
+EAPI void isf_imf_context_input_panel_event_callback_clear (Ecore_IMF_Context *ctx)
+{
+ Eina_List *l;
+ EventCallbackNode *fn;
+
+ IMFCONTROLUIDBG("[%s]\n", __func__);
+
+ for (l = EventCallbackList; l;) {
+ fn = (EventCallbackNode *)l->data;
+
+ if ((fn) && (fn->imf_context == ctx)) {
+ EventCallbackList = eina_list_remove (EventCallbackList, fn);
+ free (fn);
+ }
+ l = l->next;
+ }
+}
+
+/**
+ * process command message, ISM_TRANS_CMD_ISE_PANEL_SHOWED of ecore_ise_process_event()
+ */
+static bool _process_ise_panel_showed (void)
+{
+ /* When the size of ISE gets changed, STATE_SHOW is be delivered again to letting applications know the change.
+ Later, an event type for notifying the size change of ISE needs to be added instead. */
+ iseContext.state = ECORE_IMF_INPUT_PANEL_STATE_SHOW;
+
+ /* Notify that ISE status has changed */
+ _event_callback_call (ECORE_IMF_INPUT_PANEL_STATE_EVENT, ECORE_IMF_INPUT_PANEL_STATE_SHOW);
+
+ return true;
+}
+
+/**
+ * process command message, ISM_TRANS_CMD_ISE_PANEL_HIDED of ecore_ise_process_event()
+ */
+static bool _process_ise_panel_hided (void)
+{
+ if (iseContext.state == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
+ IMFCONTROLUIDBG("ISE is already hided (_process_ise_panel_hided)\n");
+ return false;
+ }
+
+ iseContext.state = ECORE_IMF_INPUT_PANEL_STATE_HIDE;
+
+ /* Notify that ISE status has changed */
+ _event_callback_call (ECORE_IMF_INPUT_PANEL_STATE_EVENT, ECORE_IMF_INPUT_PANEL_STATE_HIDE);
+
+ return true;
+}
+
+/**
+ * process command message, ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT of gtk_ise_process_event()
+ */
+static bool _process_update_input_context (Transaction &trans)
+{
+ uint32 type;
+ uint32 value;
+
+ if (!(trans.get_data (type) && trans.get_data (value)))
+ return false;
+
+ IMFCONTROLUIDBG("[%s] receive input context: [%d:%d]\n", __FUNCTION__, type, value);
+
+ if (type == (uint32)ECORE_IMF_INPUT_PANEL_STATE_EVENT && value == (uint32)ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
+ _process_ise_panel_hided ();
+ return true;
+ }
+
+ if (type == (uint32)ECORE_IMF_INPUT_PANEL_STATE_EVENT && value == (uint32)ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
+ _process_ise_panel_showed ();
+ return true;
+ }
+
+ _event_callback_call ((Ecore_IMF_Input_Panel_Event)type, (int)value);
+
+ return true;
+}
+
+/**
+ * process ISE data of command message with ISF
+ *
+ * @param[in] trans packet data to be processed
+ * @param[in] cmd command ID that defines with ISF
+ */
+void ecore_ise_process_data (Transaction &trans, int cmd)
+{
+ switch (cmd) {
+ case ISM_TRANS_CMD_ISE_PANEL_SHOWED : {
+ IMFCONTROLUIDBG ("cmd is ISM_TRANS_CMD_ISE_PANEL_SHOWED\n");
+ _process_ise_panel_showed ();
+ break;
+ }
+ case ISM_TRANS_CMD_ISE_PANEL_HIDED : {
+ IMFCONTROLUIDBG ("cmd is ISM_TRANS_CMD_ISE_PANEL_HIDED\n");
+ _process_ise_panel_hided ();
+ break;
+ }
+ case ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT : {
+ IMFCONTROLUIDBG ("cmd is ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT\n");
+ _process_update_input_context (trans);
+ break;
+ }
+ default :
+ IMFCONTROLUIDBG("unknown command");
+ break;
+ }
+}
+
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jihoon Kim <jihoon48.kim@samsung.com>, Haifeng Deng <haifeng.deng@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __ISF_IMF_CONTROL_UI_H
+#define __ISF_IMF_CONTROL_UI_H
+
+#include <Ecore_IMF.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+ /* non UI related works */
+ void isf_imf_input_panel_init ();
+ void isf_imf_input_panel_shutdown ();
+ void isf_imf_context_input_panel_show (Ecore_IMF_Context *ctx);
+ void isf_imf_context_input_panel_hide (Ecore_IMF_Context *ctx);
+ void isf_imf_context_input_panel_instant_hide (Ecore_IMF_Context *ctx);
+ void isf_imf_context_control_panel_show (Ecore_IMF_Context *ctx);
+ void isf_imf_context_control_panel_hide (Ecore_IMF_Context *ctx);
+ void isf_imf_context_input_panel_language_set (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Lang lang);
+ Ecore_IMF_Input_Panel_Lang isf_imf_context_input_panel_language_get (Ecore_IMF_Context *ctx);
+ void isf_imf_context_input_panel_imdata_set (Ecore_IMF_Context *ctx, const char* data, int len);
+ void isf_imf_context_input_panel_imdata_get (Ecore_IMF_Context *ctx, char* data, int* len);
+ void isf_imf_context_input_panel_geometry_get (Ecore_IMF_Context *ctx, int *x, int *y, int *w, int *h);
+ void isf_imf_context_input_panel_private_key_set (Ecore_IMF_Context *ctx, int layout_index, int key_index, const char *img_path, const char *label, const char *value);
+ void isf_imf_context_input_panel_layout_set (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Layout layout);
+ Ecore_IMF_Input_Panel_Layout isf_imf_context_input_panel_layout_get (Ecore_IMF_Context *ctx);
+ Ecore_IMF_Input_Panel_State isf_imf_context_input_panel_state_get (Ecore_IMF_Context *ctx);
+ void isf_imf_context_input_panel_caps_mode_set (Ecore_IMF_Context *ctx, unsigned int mode);
+
+ void isf_imf_context_input_panel_event_callback_add (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Event type, void (*func) (void *data, Ecore_IMF_Context *ctx, int value), void *data);
+ void isf_imf_context_input_panel_event_callback_del (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Event type, void (*func) (void *data, Ecore_IMF_Context *ctx, int value));
+ void isf_imf_context_input_panel_event_callback_clear (Ecore_IMF_Context *ctx);
+
+ void isf_imf_context_input_panel_key_disabled_set (Ecore_IMF_Context *ctx, int layout_index, int key_index, Eina_Bool disabled);
+ void isf_imf_context_input_panel_move (Ecore_IMF_Context *ctx, int x, int y);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __ISF_IMF_CONTROL_UI_H */
+
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jihoon Kim <jihoon48.kim@samsung.com>, Haifeng Deng <haifeng.deng@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#include <stdio.h>
+#include "isf_imf_context.h"
+#include "isf_imf_control_ui.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+ static const Ecore_IMF_Context_Info isf_imf_info = {
+ "isf", /* ID */
+ "Input Service Framework for Ecore", /* Description */
+ "*", /* Default locales */
+ NULL, /* Canvas type */
+ 0 /* Canvas required */
+ };
+
+ static Ecore_IMF_Context_Class isf_imf_class = {
+ isf_imf_context_add, /* add */
+ isf_imf_context_del, /* del */
+ isf_imf_context_client_window_set, /* client_window_set */
+ isf_imf_context_client_canvas_set, /* client_canvas_set */
+ isf_imf_context_input_panel_show, /* show */
+ isf_imf_context_input_panel_hide, /* hide */
+ isf_imf_context_preedit_string_get, /* get_preedit_string */
+ isf_imf_context_focus_in, /* focus_in */
+ isf_imf_context_focus_out, /* focus_out */
+ isf_imf_context_reset, /* reset */
+ isf_imf_context_cursor_position_set, /* cursor_position_set */
+ isf_imf_context_use_preedit_set, /* use_preedit_set */
+ isf_imf_context_input_mode_set, /* input_mode_set */
+ isf_imf_context_filter_event, /* filter_event */
+ isf_imf_context_preedit_string_with_attributes_get,
+ isf_imf_context_prediction_allow_set,
+ isf_imf_context_autocapital_type_set,
+ isf_imf_context_control_panel_show,
+ isf_imf_context_control_panel_hide,
+ isf_imf_context_input_panel_layout_set,
+ isf_imf_context_input_panel_layout_get,
+ isf_imf_context_input_panel_language_set,
+ isf_imf_context_input_panel_language_get,
+ isf_imf_context_cursor_location_set,
+ isf_imf_context_input_panel_imdata_set,
+ isf_imf_context_input_panel_imdata_get,
+ NULL, /* use effect set */
+ NULL, /* orient_set */
+ isf_imf_context_input_panel_move,
+ isf_imf_context_input_panel_geometry_get,
+ isf_imf_context_input_panel_private_key_set,
+ isf_imf_context_input_panel_key_disabled_set,
+ NULL, /* input_panel_reset */
+ isf_imf_context_input_panel_state_get,
+
+ isf_imf_context_input_panel_event_callback_add,
+ isf_imf_context_input_panel_event_callback_del
+ };
+
+ static Ecore_IMF_Context *imf_module_create (void);
+ static Ecore_IMF_Context *imf_module_exit (void);
+
+ static Eina_Bool imf_module_init (void) {
+ ecore_imf_module_register (&isf_imf_info, imf_module_create, imf_module_exit);
+ register_key_handler ();
+ return EINA_TRUE;
+ }
+
+ static void imf_module_shutdown (void) {
+ unregister_key_handler ();
+ isf_imf_context_shutdown ();
+ }
+
+ static Ecore_IMF_Context *imf_module_create (void) {
+ Ecore_IMF_Context *ctx = NULL;
+ EcoreIMFContextISF *ctxd = NULL;
+
+ ctxd = isf_imf_context_new ();
+ if (!ctxd) {
+ printf ("isf_imf_context_new () failed!!!\n");
+ return NULL;
+ }
+
+ ctx = ecore_imf_context_new (&isf_imf_class);
+ if (!ctx) {
+ delete ctxd;
+ return NULL;
+ }
+
+ ecore_imf_context_data_set (ctx, ctxd);
+
+ return ctx;
+ }
+
+ static Ecore_IMF_Context *imf_module_exit (void) {
+ return NULL;
+ }
+
+ EINA_MODULE_INIT(imf_module_init);
+ EINA_MODULE_SHUTDOWN(imf_module_shutdown);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+/*
+vi:ts=4:expandtab:nowrap
+*/
--- /dev/null
+MAINTAINERCLEANFILES = Makefile.in
+CLEANFILES = *.bak *.edj
+
+INCLUDES = -I$(top_builddir) \
+ -I$(top_builddir)/ism/src \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/ism/src \
+ -I$(top_srcdir)/ism/intl \
+ -I$(top_srcdir)/ism/data \
+ -I$(top_srcdir)/ism/utils \
+ -I$(includedir) \
+ -DSCIM_DATADIR=\"@SCIM_DATADIR@\" \
+ -DSCIM_LOCALEDIR=\"@SCIM_LOCALEDIR@\" \
+ -DSCIM_SYSCONFDIR=\"@SCIM_SYSCONFDIR@\" \
+ -DSCIM_LIBEXECDIR=\"@SCIM_LIBEXECDIR@\" \
+ -DSCIM_ICONDIR=\"@SCIM_ICONDIR@\" \
+ -DSCIM_MODULE_PATH=\"@SCIM_MODULE_PATH@\" \
+ -DSCIM_TEMPDIR=\"@SCIM_TEMPDIR@\"
+
+noinst_HEADERS = isf_panel_utility.h
+
+if ISF_BUILD_PANEL_EFL
+CONFIG_SCIM_PANEL_EFL = isf-panel-efl
+endif
+
+bin_PROGRAMS = $(CONFIG_SCIM_PANEL_EFL)
+
+isf_panel_efl_SOURCES = isf_panel_efl.cpp \
+ isf_panel_utility.cpp
+
+isf_panel_efl_CXXFLAGS = @EFL_CFLAGS@ @VCONF_CFLAGS@ @HEYNOTI_CFLAGS@
+
+isf_panel_efl_LDFLAGS = @EFL_LIBS@ @LTLIBINTL@ -rpath $(libdir) \
+ @VCONF_LIBS@ \
+ @HEYNOTI_LIBS@ \
+ @X11_LIBS@
+
+isf_panel_efl_LDADD = $(top_builddir)/ism/src/libscim@SCIM_EPOCH@.la
+
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Haifeng Deng <haifeng.deng@samsung.com>, Jihoon Kim <jihoon48.kim@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_SCIM_HELPER_MODULE
+#define Uses_SCIM_PANEL_AGENT
+#define Uses_SCIM_COMPOSE_KEY
+#define Uses_SCIM_IMENGINE_MODULE
+#define WAIT_WM
+
+#include <sys/wait.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/times.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <list>
+#include <glib.h>
+#include <Evas.h>
+#include <Ecore.h>
+#include <Ecore_X.h>
+#include <Ecore_File.h>
+#include <Elementary.h>
+#include <X11/Xlib.h>
+#include <malloc.h>
+#include "scim_private.h"
+#include "scim.h"
+#include "scim_stl_map.h"
+#if HAVE_VCONF
+#include <heynoti.h>
+#include <vconf.h>
+#include <vconf-keys.h>
+#endif
+#include "isf_panel_utility.h"
+
+
+using namespace scim;
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Declaration of macro.
+/////////////////////////////////////////////////////////////////////////////
+#define EFL_CANDIDATE_THEME1 (SCIM_DATADIR "/isf_candidate_theme1.edj")
+#define EFL_CANDIDATE_THEME2 (SCIM_DATADIR "/isf_candidate_theme2.edj")
+
+#define ISF_CONFIG_PANEL_LOOKUP_TABLE_VERTICAL "/Panel/Gtk/LookupTableVertical"
+#define ISF_CONFIG_PANEL_LOOKUP_TABLE_STYLE "/Panel/Gtk/LookupTableStyle"
+#define ISF_CONFIG_PANEL_LOOKUP_TABLE_MODE "/Panel/Gtk/LookupTableMode"
+#define ISF_CONFIG_HARDWARE_KEYBOARD_DETECT "/isf/hw_keyboard_detect"
+
+#define ISF_CANDIDATE_TABLE 0
+
+#define ISF_PORT_BUTTON_NUMBER 9
+#define ISF_LAND_BUTTON_NUMBER 18
+
+#define ISF_EFL_AUX 1
+#define ISF_EFL_CANDIDATE_0 2
+#define ISF_EFL_CANDIDATE_ITEMS 3
+
+#define ISE_DEFAULT_HEIGHT_PORTRAIT 360
+#define ISE_DEFAULT_HEIGHT_LANDSCAPE 288
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Declaration of external variables.
+/////////////////////////////////////////////////////////////////////////////
+extern MapStringVectorSizeT _groups;
+extern std::vector<String> _uuids;
+extern std::vector<String> _names;
+extern std::vector<String> _module_names;
+extern std::vector<String> _langs;
+extern std::vector<String> _icons;
+extern std::vector<uint32> _options;
+extern std::vector<TOOLBAR_MODE_T> _modes;
+extern std::vector<String> _disabled_langs;
+
+extern std::vector<String> _load_ise_list;
+
+/////////////////////////////////////////////////////////////////////////////
+// Declaration of internal data types.
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Declaration of internal functions.
+/////////////////////////////////////////////////////////////////////////////
+static Evas_Object *efl_create_window (const char *strWinName, const char *strEffect);
+static void efl_set_transient_for_app_window (Evas_Object *win_obj);
+static int efl_get_angle_for_root_window (Evas_Object *win_obj);
+
+static void ui_candidate_hide (bool bForce);
+static void ui_destroy_candidate_window (void);
+static void ui_settle_candidate_window (void);
+static void ui_create_more_window (void);
+static void ui_more_window_rotate (int angle);
+static void ui_more_window_update (void);
+
+/* PanelAgent related functions */
+static bool initialize_panel_agent (const String &config, const String &display, bool resident);
+
+static void slot_reload_config (void);
+static void slot_focus_in (void);
+static void slot_focus_out (void);
+static void slot_update_spot_location (int x, int y, int top_y);
+static void slot_update_factory_info (const PanelFactoryInfo &info);
+static void slot_show_aux_string (void);
+static void slot_show_candidate_table (void);
+static void slot_hide_aux_string (void);
+static void slot_hide_candidate_table (void);
+static void slot_update_aux_string (const String &str, const AttributeList &attrs);
+static void slot_update_candidate_table (const LookupTable &table);
+static void slot_set_active_ise_by_uuid (const String &uuid, bool);
+static bool slot_get_ise_list (std::vector<String> &name);
+static bool slot_get_keyboard_ise_list (std::vector<String> &name);
+static void slot_get_language_list (std::vector<String> &name);
+static void slot_get_all_language (std::vector<String> &lang);
+static void slot_get_ise_language (char *, std::vector<String> &name);
+static void slot_set_isf_language (const String &language);
+static bool slot_get_ise_info_by_uuid (const String &uuid, ISE_INFO &info);
+static void slot_set_candidate_ui (int style, int mode);
+static void slot_get_candidate_ui (int &style, int &mode);
+static void slot_set_candidate_position (int left, int top);
+static void slot_get_candidate_rect (struct rectinfo &info);
+static void slot_set_keyboard_ise (int type, const String &ise);
+static void slot_get_keyboard_ise (String &ise_name, String &ise_uuid);
+static void slot_start_default_ise (void);
+static void slot_accept_connection (int fd);
+static void slot_close_connection (int fd);
+static void slot_exit (void);
+
+static Eina_Bool panel_agent_handler (void *data, Ecore_Fd_Handler *fd_handler);
+static void change_hw_and_sw_keyboard (void);
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Declaration of internal variables.
+/////////////////////////////////////////////////////////////////////////////
+static Evas_Object *_candidate_window = 0;
+static Evas_Object *_candidate_area_1 = 0;
+static Evas_Object *_candidate_area_2 = 0;
+static Evas_Object *_candidate_toolbar = 0;
+static Evas_Object *_candidate_bg = 0;
+static Evas_Object *_candidate_0_scroll = 0;
+static Evas_Object *_candidate_scroll = 0;
+static Evas_Object *_candidate_0_table = 0;
+static Evas_Object *_candidate_table = 0;
+static Evas_Object *_candidate_0 [SCIM_LOOKUP_TABLE_MAX_PAGESIZE];
+static Evas_Object *_candidate_items [SCIM_LOOKUP_TABLE_MAX_PAGESIZE];
+static Evas_Object *_more_btn = 0;
+static Evas_Object *_close_btn = 0;
+static bool _candidate_window_show = false;
+
+static Evas_Object *_more_window = 0;
+static Evas_Object *_more_port_table = 0;
+static Evas_Object *_more_land_table = 0;
+static Evas_Object *_page_button_port = 0;
+static Evas_Object *_page_button_land = 0;
+static Evas_Object *_port_button [ISF_PORT_BUTTON_NUMBER];
+static Evas_Object *_land_button [ISF_LAND_BUTTON_NUMBER];
+static bool _more_window_enable = false;
+static int _more_port_height = 329;
+static int _more_land_height = 270;
+static int _pages = 0;
+static int _page_no = 0;
+static std::vector<String> _more_list;
+
+static int _candidate_port_width = 464;
+static int _candidate_port_height_min = 86;
+static int _candidate_port_height_min_2 = 150;
+static int _candidate_port_height_max = 286;
+static int _candidate_port_height_max_2 = 350;
+static int _candidate_land_width = 784;
+static int _candidate_land_height_min = 86;
+static int _candidate_land_height_max = 150;
+static int _candidate_land_height_max_2 = 214;
+static int _candidate_area_1_pos [2] = {11, 13};
+static int _candidate_area_2_pos [2] = {11, 13};
+static int _more_btn_pos [4] = {369, 11, 689, 11};
+static int _close_btn_pos [4] = {362, 211, 682, 75};
+
+static int _candidate_port_number = 3;
+static int _candidate_land_number = 5;
+static int _h_padding = 4;
+static int _v_padding = 11;
+static int _item_min_width = 66;
+static int _item_min_height = 55;
+
+static int _candidate_scroll_0_width_min = 350;
+static int _candidate_scroll_0_width_max = 670;
+
+static int _candidate_scroll_width = 453;
+static int _candidate_scroll_width_min = 453;
+static int _candidate_scroll_width_max = 663;
+static int _candidate_scroll_height_min = 124;
+static int _candidate_scroll_height_max = 190;
+
+static Elm_Toolbar_Item *_candidate_table_items [SCIM_LOOKUP_TABLE_MAX_PAGESIZE];
+static Elm_Toolbar_Item *_candidate_seperator_items [SCIM_LOOKUP_TABLE_MAX_PAGESIZE];
+
+static Evas_Object *_aux_area = 0;
+static Evas_Object *_aux_line = 0;
+static Evas_Object *_aux_table = 0;
+static int _aux_height = 0;
+static int _aux_port_width = 444;
+static int _aux_land_width = 764;
+static std::vector<Evas_Object *> _aux_items;
+
+static Evas_Object *_tmp_aux_text = 0;
+static Evas_Object *_tmp_candidate_text = 0;
+static std::vector<Evas_Object *> _text_fonts;
+
+static int _spot_location_x = -1;
+static int _spot_location_y = -1;
+static int _spot_location_top_y = -1;
+static int _candidate_left = -1;
+static int _candidate_top = -1;
+static int _candidate_angle = 0;
+
+static int _indicator_height = 24;
+static int _screen_width = 480;
+static int _screen_height = 800;
+static float _width_rate = 1.0;
+static float _height_rate = 1.0;
+static int _blank_width = 10;
+
+static String _candidate_name = String ("candidate");
+static String _candidate_edje_file = String (EFL_CANDIDATE_THEME1);
+
+static String _candidate_font_name = String ("SLP:style=medium");
+static int _candidate_font_max_size = 30;
+static int _candidate_font_min_size = 14;
+static int _aux_font_size = 30;
+static int _button_font_size = 22;
+static int _click_object = 0;
+static int _click_down_pos [2] = {0, 0};
+static int _click_up_pos [2] = {0, 0};
+
+static DEFAULT_ISE_T _initial_ise;
+static DEFAULT_ISE_T _active_ise;
+static ConfigPointer _config;
+static PanelAgent *_panel_agent = 0;
+static std::vector<Ecore_Fd_Handler *> _read_handler_list;
+
+static ISF_CANDIDATE_STYLE_T _candidate_style = PREDICTION_ENGINE_CANDIDATE_STYLE;
+static ISF_CANDIDATE_MODE_T _candidate_mode = PORTRAIT_VERTICAL_CANDIDATE_MODE;
+static bool _candidate_vertical = true;
+
+static clock_t _clock_start;
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Implementation of internal functions.
+/////////////////////////////////////////////////////////////////////////////
+/**
+ * @brief Print system time point for panel performance.
+ *
+ * @param strInfo The output information.
+ */
+static void check_time (const char *strInfo)
+{
+ gettime (_clock_start, strInfo);
+ ISF_SYSLOG ("%s ppid=%d pid=%d\n", strInfo, getppid (), getpid ());
+}
+
+/**
+ * @brief Check the specific file.
+ *
+ * @param strFile The file path.
+ *
+ * @return true if the file is existed, otherwise false.
+ */
+static bool check_file (const char* strFile)
+{
+ struct stat st;
+
+ /* Workaround so that "/" returns a true, otherwise we can't monitor "/" in ecore_file_monitor */
+ if (stat (strFile, &st) < 0 && strcmp (strFile, "/"))
+ return false;
+ else
+ return true;
+}
+
+/**
+ * @brief Flush memory for elm.
+ *
+ * @return void
+ */
+static void flush_memory (void)
+{
+ elm_all_flush ();
+ malloc_trim (0);
+}
+
+/**
+ * @brief Get ISE name according to uuid.
+ *
+ * @param uuid The ISE uuid.
+ *
+ * @return The ISE name
+ */
+static String get_ise_name (const String uuid)
+{
+ String ise_name;
+ if (uuid.length () > 0) {
+ for (unsigned int i = 0; i < _uuids.size (); i++) {
+ if (strcmp (uuid.c_str (), _uuids[i].c_str ()) == 0) {
+ ise_name = _names[i];
+ break;
+ }
+ }
+ }
+
+ return ise_name;
+}
+
+/**
+ * @brief Change keyboard ISE.
+ *
+ * @param uuid The keyboard ISE's uuid.
+ * @param name The keyboard ISE's name.
+ *
+ * @return false if keyboard ISE change is failed, otherwise return true.
+ */
+static bool activate_keyboard_ise (const String &uuid, const String &name)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ TOOLBAR_MODE_T mode = _panel_agent->get_current_toolbar_mode ();
+
+ if (TOOLBAR_HELPER_MODE == mode) {
+ String pre_uuid = _panel_agent->get_current_helper_uuid ();
+ _panel_agent->stop_helper (pre_uuid);
+ } else if (TOOLBAR_KEYBOARD_MODE == mode) {
+ String pre_name = _panel_agent->get_current_ise_name ();
+ if (!pre_name.compare (name))
+ return false;
+ }
+
+ String language = String ("~other");/*scim_get_locale_language (scim_get_current_locale ());*/
+ _config->write (String (SCIM_CONFIG_DEFAULT_IMENGINE_FACTORY) + String ("/") + language, uuid);
+ _config->flush ();
+
+ _panel_agent->change_factory (uuid);
+
+ return true;
+}
+
+/**
+ * @brief Change helper ISE.
+ *
+ * @param uuid The helper ISE's uuid.
+ * @param changeDefault The flag for change default ISE.
+ *
+ * @return false if helper ISE change is failed, otherwise return true.
+ */
+static bool activate_helper_ise (const String &uuid, bool changeDefault)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ TOOLBAR_MODE_T mode = _panel_agent->get_current_toolbar_mode ();
+
+ if (TOOLBAR_HELPER_MODE == mode) {
+ String pre_uuid = _panel_agent->get_current_helper_uuid ();
+ if (!pre_uuid.compare (uuid))
+ return false;
+ _panel_agent->hide_helper (pre_uuid);
+ _panel_agent->stop_helper (pre_uuid);
+ } else if (TOOLBAR_KEYBOARD_MODE == mode) {
+ /*_panel_agent->change_factory ("");*/
+ }
+
+ _panel_agent->start_helper (uuid);
+ if (changeDefault) {
+ _config->write (String (SCIM_CONFIG_DEFAULT_HELPER_ISE), uuid);
+ _config->flush ();
+ }
+
+ return true;
+}
+
+/**
+ * @brief Set active ISE by uuid.
+ *
+ * @param uuid The ISE's uuid.
+ * @param fromISE It indicates whether the request is sent from helper ISE.
+ *
+ * @return false if ISE change is failed, otherwise return true.
+ */
+static bool set_active_ise_by_uuid (const String &ise_uuid, bool fromISE, bool changeDefault)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (ise_uuid.length () <= 0)
+ return false;
+
+ bool ise_changed = false;
+
+ if (fromISE) {
+ TOOLBAR_MODE_T mode = _panel_agent->get_current_toolbar_mode ();
+
+ if (TOOLBAR_HELPER_MODE == mode) {
+ String pre_uuid = _panel_agent->get_current_helper_uuid ();
+ _panel_agent->hide_helper (pre_uuid);
+ }
+ _panel_agent->set_ise_changing (true);
+ }
+
+ for (unsigned int i = 0; i < _uuids.size (); i++) {
+ if (!ise_uuid.compare (_uuids[i])) {
+ if (TOOLBAR_KEYBOARD_MODE == _modes[i])
+ ise_changed = activate_keyboard_ise (_uuids[i], _names[i]);
+ else if (TOOLBAR_HELPER_MODE == _modes[i])
+ ise_changed = activate_helper_ise (_uuids[i], changeDefault);
+
+ if (ise_changed) {
+ DEFAULT_ISE_T default_ise;
+ default_ise.type = _modes[i];
+ default_ise.uuid = _uuids[i];
+ default_ise.name = _names[i];
+ if (changeDefault)
+ _panel_agent->set_default_ise (default_ise);
+ _panel_agent->set_current_toolbar_mode (default_ise.type);
+ _panel_agent->set_current_ise_name (default_ise.name);
+ }
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * @brief Load ISF configuration and ISEs information.
+ */
+static void load_config (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ String str;
+ bool shared_ise = false;
+
+ /* Read configurations. */
+ if (!_config.null ()) {
+ _candidate_style = (ISF_CANDIDATE_STYLE_T)_config->read (String (ISF_CONFIG_PANEL_LOOKUP_TABLE_STYLE), _candidate_style);
+ _candidate_mode = (ISF_CANDIDATE_MODE_T)_config->read (String (ISF_CONFIG_PANEL_LOOKUP_TABLE_MODE), _candidate_mode);
+ _candidate_vertical = _config->read (String (ISF_CONFIG_PANEL_LOOKUP_TABLE_VERTICAL), _candidate_vertical);
+ shared_ise = _config->read (String (SCIM_CONFIG_FRONTEND_SHARED_INPUT_METHOD), shared_ise);
+ _panel_agent->set_should_shared_ise (shared_ise);
+ }
+
+ isf_load_ise_information (ALL_ISE, _config);
+}
+
+/**
+ * @brief Reload config callback function for ISF panel.
+ *
+ * @param config The config pointer.
+ */
+static void config_reload_cb (const ConfigPointer &config)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ /* load_config (); */
+}
+
+
+//////////////////////////////////////////////////////////////////////
+// Start of Candidate Functions
+//////////////////////////////////////////////////////////////////////
+/**
+ * @brief This function will add one candidate window resize timer.
+ *
+ * @param new_width New width for candidate window.
+ * @param new_height New height for candidate window.
+ */
+static void ui_candidate_window_resize (int new_width, int new_height)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (!_candidate_window)
+ return;
+
+ int x, y, width, height;
+ evas_object_geometry_get (_candidate_window, &x, &y, &width, &height);
+
+ if (width == new_width && height == new_height)
+ return;
+
+ evas_object_resize (_candidate_window, new_width, new_height);
+ evas_object_resize (_candidate_bg, new_width, new_height);
+ ui_settle_candidate_window ();
+}
+
+/**
+ * @brief This function will show/hide widgets of candidate window,
+ * and resize candidate window size according to aux_area/candidate_area.
+ */
+static void ui_candidate_window_adjust (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+ if (!_candidate_window)
+ return;
+
+ int x, y, width, height;
+
+ /* Get candidate window size */
+ evas_object_geometry_get (_candidate_window, &x, &y, &width, &height);
+ if (_candidate_vertical) {
+ if (evas_object_visible_get (_aux_area) && evas_object_visible_get (_candidate_area_1)) {
+ evas_object_show (_aux_line);
+ ui_candidate_window_resize (width, _candidate_port_height_min_2);
+ evas_object_move (_candidate_area_1, _candidate_area_1_pos[0], _candidate_area_1_pos[1] + _candidate_port_height_min_2 - _candidate_port_height_min);
+ if (_candidate_angle == 90 || _candidate_angle == 270) {
+ evas_object_move (_more_btn, _more_btn_pos[2], _more_btn_pos[3] + _candidate_port_height_min_2 - _candidate_port_height_min);
+ } else {
+ evas_object_move (_more_btn, _more_btn_pos[0], _more_btn_pos[1] + _candidate_port_height_min_2 - _candidate_port_height_min);
+ }
+ } else if (evas_object_visible_get (_aux_area) && evas_object_visible_get (_candidate_area_2)) {
+ evas_object_show (_aux_line);
+ evas_object_move (_candidate_area_2, _candidate_area_2_pos[0], _candidate_area_2_pos[1] + _candidate_port_height_min_2 - _candidate_port_height_min);
+ if (_candidate_angle == 90 || _candidate_angle == 270) {
+ ui_candidate_window_resize (width, _candidate_land_height_max_2);
+ evas_object_move (_close_btn, _close_btn_pos[2], _close_btn_pos[3] + _candidate_port_height_min_2 - _candidate_port_height_min);
+ } else {
+ ui_candidate_window_resize (width, _candidate_port_height_max_2);
+ evas_object_move (_close_btn, _close_btn_pos[0], _close_btn_pos[1] + _candidate_port_height_min_2 - _candidate_port_height_min);
+ }
+ } else if (evas_object_visible_get (_aux_area)) {
+ evas_object_hide (_aux_line);
+ ui_candidate_window_resize (width, _aux_height);
+ } else if (evas_object_visible_get (_candidate_area_1)) {
+ evas_object_hide (_aux_line);
+ ui_candidate_window_resize (width, _candidate_port_height_min);
+ evas_object_move (_candidate_area_1, _candidate_area_1_pos[0], _candidate_area_1_pos[1]);
+ if (_candidate_angle == 90 || _candidate_angle == 270) {
+ evas_object_move (_more_btn, _more_btn_pos[2], _more_btn_pos[3]);
+ } else {
+ evas_object_move (_more_btn, _more_btn_pos[0], _more_btn_pos[1]);
+ }
+ } else if (evas_object_visible_get (_candidate_area_2)) {
+ evas_object_hide (_aux_line);
+ evas_object_move (_candidate_area_2, _candidate_area_2_pos[0], _candidate_area_2_pos[1]);
+ if (_candidate_angle == 90 || _candidate_angle == 270) {
+ ui_candidate_window_resize (width, _candidate_land_height_max);
+ evas_object_move (_close_btn, _close_btn_pos[2], _close_btn_pos[3]);
+ } else {
+ ui_candidate_window_resize (width, _candidate_port_height_max);
+ evas_object_move (_close_btn, _close_btn_pos[0], _close_btn_pos[1]);
+ }
+ }
+ } else {
+ if (evas_object_visible_get (_aux_area) && evas_object_visible_get (_candidate_area_1)) {
+ evas_object_show (_aux_line);
+ ui_candidate_window_resize (width, _candidate_port_height_min_2);
+ evas_object_move (_candidate_area_1, 0, _candidate_port_height_min_2 - _candidate_port_height_min);
+ } else if (evas_object_visible_get (_aux_area)) {
+ evas_object_hide (_aux_line);
+ ui_candidate_window_resize (width, _aux_height);
+ } else if (evas_object_visible_get (_candidate_area_1)) {
+ evas_object_hide (_aux_line);
+ ui_candidate_window_resize (width, _candidate_port_height_min);
+ evas_object_move (_candidate_area_1, 0, 0);
+ }
+ }
+}
+
+/**
+ * @brief Rotate candidate window.
+ *
+ * @param angle The angle of candidate window.
+ */
+static void ui_candidate_window_rotate (int angle)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+ if (!_candidate_window)
+ return;
+
+ elm_win_rotation_set (_candidate_window, angle);
+ ui_candidate_hide (true);
+ if (angle == 90 || angle == 270) {
+ if (_candidate_vertical) {
+ _candidate_scroll_width = _candidate_scroll_width_max;
+ ui_candidate_window_resize (_candidate_land_width, _candidate_land_height_min);
+ evas_object_resize (_aux_area, _aux_land_width, _aux_height);
+ evas_object_resize (_candidate_area_1, _candidate_scroll_0_width_max, _item_min_height);
+ evas_object_resize (_candidate_area_2, _candidate_scroll_width, _candidate_scroll_height_min);
+ } else {
+ evas_object_resize (_candidate_window, _screen_height, _candidate_land_height_min);
+ evas_object_resize (_candidate_area_1, _screen_height, _candidate_land_height_min);
+ evas_object_resize (_aux_area, _screen_height - 2*_blank_width, _aux_height);
+ }
+ } else {
+ if (_candidate_vertical) {
+ _candidate_scroll_width = _candidate_scroll_width_min;
+ ui_candidate_window_resize (_candidate_port_width, _candidate_port_height_min);
+ evas_object_resize (_aux_area, _aux_port_width, _aux_height);
+ evas_object_resize (_candidate_area_1, _candidate_scroll_0_width_min, _item_min_height);
+ evas_object_resize (_candidate_area_2, _candidate_scroll_width, _candidate_scroll_height_max);
+ } else {
+ evas_object_resize (_candidate_window, _screen_width, _candidate_port_height_min);
+ evas_object_resize (_candidate_area_1, _screen_width, _candidate_port_height_min);
+ evas_object_resize (_aux_area, _screen_width - 2*_blank_width, _aux_height);
+ }
+ }
+
+ /* Delete old candidate items and popup lines */
+ for (int i = 0; i < SCIM_LOOKUP_TABLE_MAX_PAGESIZE; ++i) {
+ if (_candidate_items [i]) {
+ evas_object_del (_candidate_items [i]);
+ _candidate_items [i] = NULL;
+ }
+ }
+
+ ui_more_window_rotate (angle);
+ ui_settle_candidate_window ();
+ flush_memory ();
+}
+
+/**
+ * @brief Update candidate text font size according to display width.
+ *
+ * @param obj A valid Evas_Object handle of text.
+ * @param obj_width The text display width.
+ * @param mbs The dislpayed string.
+ */
+static void ui_candidate_text_update_font_size (Evas_Object *obj, int obj_width, String mbs)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (obj == NULL || mbs.length () <= 0 || _text_fonts.size () <= 0)
+ return;
+
+ int x, y, width, height;
+ edje_object_text_class_set (obj, "candidate_text_class", _candidate_font_name.c_str (), _candidate_font_min_size);
+ for (unsigned int i = 0; i < _text_fonts.size (); i++) {
+ evas_object_text_text_set (_text_fonts [i], mbs.c_str ());
+ evas_object_geometry_get (_text_fonts [i], &x, &y, &width, &height);
+ if (width < obj_width) {
+ edje_object_text_class_set (obj, "candidate_text_class", _candidate_font_name.c_str (), _candidate_font_max_size - 2*i);
+ break;
+ }
+ }
+}
+
+/**
+ * @brief This function is used to judge whether candidate window should be hidden.
+ *
+ * @return true if candidate window should be hidden, otherwise return false.
+ */
+static bool ui_candidate_can_be_hide (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (evas_object_visible_get (_aux_area) ||
+ evas_object_visible_get (_candidate_area_1) ||
+ evas_object_visible_get (_candidate_area_2))
+ return false;
+ else
+ return true;
+}
+
+/**
+ * @brief Show candidate window.
+ */
+static void ui_candidate_show (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+ if (!_candidate_window)
+ return;
+
+ int angle = efl_get_angle_for_root_window (_candidate_window);
+ if (_candidate_angle != angle) {
+ _candidate_angle = angle;
+ ui_candidate_window_rotate (angle);
+ }
+
+ _candidate_window_show = true;
+ evas_object_show (_candidate_window);
+ elm_win_raise (_candidate_window);
+ efl_set_transient_for_app_window (_candidate_window);
+}
+
+/**
+ * @brief Hide candidate window.
+ */
+static void ui_candidate_hide (bool bForce)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+ if (!_candidate_window)
+ return;
+
+ if (bForce) {
+ evas_object_hide (_aux_area);
+ elm_scroller_region_show (_aux_area, 0, 0, 10, 10);
+ evas_object_hide (_candidate_area_1);
+ evas_object_hide (_candidate_area_2);
+ }
+
+ if (ui_candidate_can_be_hide () || bForce) {
+ _candidate_window_show = false;
+ evas_object_hide (_candidate_window);
+ }
+}
+
+/**
+ * @brief Callback function for more button.
+ *
+ * @param data Data to pass when it is called.
+ * @param e The evas for current event.
+ * @param button The evas object for current event.
+ * @param event_info The information for current event.
+ */
+static void ui_candidate_window_more_button_cb (void *data, Evas *e, Evas_Object *button, void *event_info)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ evas_object_hide (_candidate_area_1);
+
+ _panel_agent->candidate_more_window_show ();
+ if (_more_window_enable) {
+ ui_candidate_hide (false);
+ ui_candidate_window_adjust ();
+ if (_more_window == NULL)
+ ui_create_more_window ();
+ evas_object_show (_more_window);
+
+ _page_no = 1;
+ if (_candidate_angle == 90 || _candidate_angle == 270) {
+ _pages = _more_list.size () / ISF_LAND_BUTTON_NUMBER;
+ if ((_more_list.size () % ISF_LAND_BUTTON_NUMBER) > 0)
+ _pages += 1;
+ } else {
+ _pages = _more_list.size () / ISF_PORT_BUTTON_NUMBER;
+ if ((_more_list.size () % ISF_PORT_BUTTON_NUMBER) > 0)
+ _pages += 1;
+ }
+
+ ui_more_window_update ();
+ } else {
+ evas_object_hide (_more_btn);
+ evas_object_show (_candidate_area_2);
+ evas_object_show (_close_btn);
+ elm_win_raise (_candidate_window);
+ ui_candidate_window_adjust ();
+ }
+ ui_settle_candidate_window ();
+ flush_memory ();
+}
+
+/**
+ * @brief Callback function for close button.
+ *
+ * @param data Data to pass when it is called.
+ * @param e The evas for current event.
+ * @param button The evas object for current event.
+ * @param event_info The information for current event.
+ */
+static void ui_candidate_window_close_button_cb (void *data, Evas *e, Evas_Object *button, void *event_info)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (evas_object_visible_get (_candidate_area_2)) {
+ evas_object_hide (_candidate_area_2);
+ evas_object_hide (_close_btn);
+ _panel_agent->candidate_more_window_hide ();
+ }
+ evas_object_show (_candidate_area_1);
+ evas_object_show (_more_btn);
+ elm_win_raise (_candidate_window);
+ ui_candidate_window_adjust ();
+ ui_settle_candidate_window ();
+ elm_scroller_region_show (_candidate_area_2, 0, 0, _candidate_scroll_width, 100);
+ flush_memory ();
+}
+
+/**
+ * @brief Callback function for mouse button press.
+ *
+ * @param data Data to pass when it is called.
+ * @param e The evas for current event.
+ * @param button The evas object for current event.
+ * @param event_info The information for current event.
+ */
+static void ui_mouse_button_pressed_cb (void *data, Evas *e, Evas_Object *button, void *event_info)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ elm_win_raise (_candidate_window);
+ _click_object = GPOINTER_TO_INT (data);
+
+ Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down *)event_info;
+ _click_down_pos [0] = ev->canvas.x;
+ _click_down_pos [1] = ev->canvas.y;
+}
+
+/**
+ * @brief Callback function for mouse button release.
+ *
+ * @param data Data to pass when it is called.
+ * @param e The evas for current event.
+ * @param button The evas object for current event.
+ * @param event_info The information for current event.
+ */
+static void ui_mouse_button_released_cb (void *data, Evas *e, Evas_Object *button, void *event_info)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << " index:" << GPOINTER_TO_INT (data) << "...\n";
+
+ int index = GPOINTER_TO_INT (data);
+ if (_click_object == ISF_EFL_AUX) {
+ double ret = 0;
+ const char *buf = edje_object_part_state_get (button, "aux", &ret);
+ if (strcmp ("selected", buf)) {
+ for (unsigned int i = 0; i < _aux_items.size (); i++) {
+ buf = edje_object_part_state_get (_aux_items [i], "aux", &ret);
+ if (!strcmp ("selected", buf))
+ edje_object_signal_emit (_aux_items [i], "aux,state,unselected", "aux");
+ }
+ edje_object_signal_emit (button, "aux,state,selected", "aux");
+ _panel_agent->select_aux (index);
+ }
+ } else if (_click_object == ISF_EFL_CANDIDATE_0) {
+ _panel_agent->select_candidate (index);
+ } else if (_click_object == ISF_EFL_CANDIDATE_ITEMS) {
+ ui_candidate_window_close_button_cb (NULL, NULL, _close_btn, NULL);
+ _panel_agent->select_candidate (index);
+ }
+}
+
+/**
+ * @brief Callback function for mouse move.
+ *
+ * @param data Data to pass when it is called.
+ * @param e The evas for current event.
+ * @param button The evas object for current event.
+ * @param event_info The information for current event.
+ */
+static void ui_mouse_moved_cb (void *data, Evas *e, Evas_Object *button, void *event_info)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down *)event_info;
+ _click_up_pos [0] = ev->canvas.x;
+ _click_up_pos [1] = ev->canvas.y;
+
+ if (abs (_click_up_pos [0] - _click_down_pos [0]) >= 10 ||
+ abs (_click_up_pos [1] - _click_down_pos [1]) >= 10) {
+ _click_object = 0;
+ }
+}
+
+/**
+ * @brief Rotate more window.
+ *
+ * @param angle The angle of more window.
+ */
+static void ui_more_window_rotate (int angle)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+ if (!_candidate_window || !_more_window)
+ return;
+
+ elm_win_rotation_set (_more_window, angle);
+ if (angle == 90 || angle == 270) {
+ evas_object_resize (_more_window, _screen_height, _more_land_height);
+ evas_object_hide (_more_port_table);
+ evas_object_show (_more_land_table);
+ if (angle == 90)
+ evas_object_move (_more_window, _screen_width - _more_land_height, 0);
+ else
+ evas_object_move (_more_window, 0, 0);
+ } else {
+ evas_object_resize (_more_window, _screen_width, _more_port_height);
+ evas_object_hide (_more_land_table);
+ evas_object_show (_more_port_table);
+ if (angle == 180)
+ evas_object_move (_more_window, 0, 0);
+ else
+ evas_object_move (_more_window, 0, _screen_height - _more_port_height);
+ }
+}
+
+/**
+ * @brief Update more window.
+ */
+static void ui_more_window_update (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+ if (!_candidate_window || !_more_window)
+ return;
+
+ unsigned int offset, index, i;
+ char buffer [20] = {0};
+
+ snprintf (buffer, sizeof (buffer), "%d/%d", _page_no, _pages);
+
+ if (_candidate_angle == 90 || _candidate_angle == 270) {
+ offset = (_page_no - 1) * ISF_LAND_BUTTON_NUMBER;
+ for (i = 0; i < ISF_LAND_BUTTON_NUMBER; i++) {
+ index = offset + i;
+ if (index < _more_list.size ()) {
+ edje_object_part_text_set (_land_button [i], "button_text", _more_list [index].c_str ());
+ ui_candidate_text_update_font_size (_land_button [i], (128 - 10)*_height_rate, _more_list [index]);
+ evas_object_show (_land_button [i]);
+ } else {
+ edje_object_part_text_set (_land_button [i], "button_text", "");
+ evas_object_hide (_land_button [i]);
+ }
+ }
+ edje_object_part_text_set (_page_button_land, "page_text", buffer);
+ } else {
+ offset = (_page_no - 1) * ISF_PORT_BUTTON_NUMBER;
+ for (i = 0; i < ISF_PORT_BUTTON_NUMBER; i++) {
+ index = offset + i;
+ if (index < _more_list.size ()) {
+ edje_object_part_text_set (_port_button [i], "button_text", _more_list [index].c_str ());
+ ui_candidate_text_update_font_size (_port_button [i], (153 - 10)*_width_rate, _more_list [index]);
+ evas_object_show (_port_button [i]);
+ } else {
+ edje_object_part_text_set (_port_button [i], "button_text", "");
+ evas_object_hide (_port_button [i]);
+ }
+ }
+ edje_object_part_text_set (_page_button_port, "page_text", buffer);
+ }
+}
+
+/**
+ * @brief Callback function for close button of more window.
+ *
+ * @param data A pointer to data to pass in when the signal is emitted.
+ * @param obj A valid Evas_Object handle for emitted signal.
+ * @param emission The signal's name.
+ * @param source The signal's source.
+ */
+static void ui_more_window_close_button_cb (void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (evas_object_visible_get (_more_window)) {
+ evas_object_hide (_more_window);
+ _panel_agent->candidate_more_window_hide ();
+ }
+
+ elm_win_raise (_candidate_window);
+ slot_show_candidate_table ();
+ flush_memory ();
+}
+
+/**
+ * @brief Callback function for page button of more window.
+ *
+ * @param data A pointer to data to pass in when the signal is emitted.
+ * @param obj A valid Evas_Object handle for emitted signal.
+ * @param emission The signal's name.
+ * @param source The signal's source.
+ */
+static void ui_more_window_page_button_cb (void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (_pages <= 1)
+ return;
+
+ int action = GPOINTER_TO_INT (data);
+ if (action == 1) /* Show prev page */
+ _page_no = (_page_no == 1) ? _pages : (_page_no - 1);
+ else /* Show next page */
+ _page_no = (_page_no == _pages) ? 1 : (_page_no + 1);
+
+ ui_more_window_update ();
+ flush_memory ();
+}
+
+/**
+ * @brief Callback function for candidate item of more window.
+ *
+ * @param data A pointer to data to pass in when the signal is emitted.
+ * @param obj A valid Evas_Object handle for emitted signal.
+ * @param emission The signal's name.
+ * @param source The signal's source.
+ */
+static void ui_more_window_candidate_item_click_cb (void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ int offset;
+ int index = GPOINTER_TO_INT (data);
+ if (index < SCIM_LOOKUP_TABLE_MAX_PAGESIZE) {
+ if (_candidate_angle == 90 || _candidate_angle == 270)
+ offset = (_page_no - 1) * ISF_LAND_BUTTON_NUMBER;
+ else
+ offset = (_page_no - 1) * ISF_PORT_BUTTON_NUMBER;
+
+ ui_more_window_close_button_cb (NULL, NULL, NULL, NULL);
+ _panel_agent->select_candidate (offset + index);
+ }
+}
+
+/**
+ * @brief Callback function for horizontal candidate item is clicked.
+ *
+ * @param data Data to pass when it is called.
+ * @param object The Evas_Object handler for current event.
+ * @param event_info The information for current event.
+ */
+static void ui_horizontal_candidate_item_click_cb (void *data, Evas_Object *object, void *event_info)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ _panel_agent->select_candidate ((uint32)GPOINTER_TO_INT (data));
+ Elm_Toolbar_Item *it = elm_toolbar_selected_item_get (_candidate_toolbar);
+
+ if (it)
+ elm_toolbar_item_selected_set (it, EINA_FALSE);
+}
+
+/**
+ * @brief Create more window for candidate.
+ */
+static void ui_create_more_window (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ Evas_Object *button = NULL;
+
+ _more_window = efl_create_window ("more_window", "ISF Popup");
+ evas_object_resize (_more_window, _screen_width, _more_port_height);
+ evas_object_move (_more_window, 0, _screen_height - _more_port_height);
+
+ Evas *evas = evas_object_evas_get (_more_window);
+
+ /* Create port table */
+ _more_port_table = elm_table_add (_more_window);
+ evas_object_size_hint_weight_set (_more_port_table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show (_more_port_table);
+
+ Evas_Object *bg = edje_object_add (evas);
+ edje_object_file_set (bg, _candidate_edje_file.c_str (), "candidate_bg");
+ evas_object_size_hint_min_set (bg, _screen_width, _more_port_height);
+ elm_table_pack (_more_port_table, bg, 0, 0, _screen_width, _more_port_height);
+ edje_object_signal_emit (bg, "candidate_bg,state,port_more_2", "candidate_bg");
+ evas_object_show (bg);
+
+ for (int i = 0; i < ISF_PORT_BUTTON_NUMBER; i++) {
+ button = edje_object_add (evas);
+ edje_object_file_set (button, _candidate_edje_file.c_str (), "candidate_button");
+ evas_object_size_hint_min_set (button, 153*_width_rate, 71*_height_rate);
+ elm_table_pack (_more_port_table, button, (6 + (i%3)*158)*_width_rate, (15 + (i/3)*79)*_height_rate, 153*_width_rate, 71*_height_rate);
+ edje_object_signal_callback_add (button, "button,action,clicked", "",
+ ui_more_window_candidate_item_click_cb, GINT_TO_POINTER (i));
+ evas_object_show (button);
+ _port_button [i] = button;
+ }
+
+ /* Create port page button */
+ _page_button_port = edje_object_add (evas);
+ edje_object_file_set (_page_button_port, _candidate_edje_file.c_str (), "page_button_port");
+ evas_object_size_hint_min_set (_page_button_port, 232*_width_rate, 71*_height_rate);
+ edje_object_text_class_set (_page_button_port, "page_text_class", "1/1", _candidate_font_max_size);
+ elm_table_pack (_more_port_table, _page_button_port, 6*_width_rate, 252*_height_rate, 233*_width_rate, 71*_height_rate);
+ edje_object_signal_callback_add (_page_button_port, "prev,action,clicked", "", ui_more_window_page_button_cb, GINT_TO_POINTER (1));
+ edje_object_signal_callback_add (_page_button_port, "next,action,clicked", "", ui_more_window_page_button_cb, GINT_TO_POINTER (2));
+ evas_object_show (_page_button_port);
+
+ /* Create port close button */
+ button = edje_object_add (evas);
+ edje_object_file_set (button, _candidate_edje_file.c_str (), "close_button");
+ evas_object_size_hint_min_set (button, 114*_width_rate, 71*_height_rate);
+ edje_object_text_class_set (button, "button_text_class", "Close", _candidate_font_max_size);
+ elm_table_pack (_more_port_table, button, 361*_width_rate, 252*_height_rate, 114*_width_rate, 71*_height_rate);
+ edje_object_signal_callback_add (button, "button,action,clicked", "", ui_more_window_close_button_cb, 0);
+ evas_object_show (button);
+
+ /* Create land table */
+ _more_land_table = elm_table_add (_more_window);
+ evas_object_size_hint_weight_set (_more_land_table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ bg = edje_object_add (evas);
+ edje_object_file_set (bg, _candidate_edje_file.c_str (), "candidate_bg");
+ evas_object_size_hint_min_set (bg, _screen_height, _more_land_height);
+ elm_table_pack (_more_land_table, bg, 0, 0, _screen_height, _more_land_height);
+ edje_object_signal_emit (bg, "candidate_bg,state,land_more_2", "candidate_bg");
+ evas_object_show (bg);
+
+ for (int i = 0; i < ISF_LAND_BUTTON_NUMBER; i++) {
+ button = edje_object_add (evas);
+ edje_object_file_set (button, _candidate_edje_file.c_str (), "candidate_button");
+ evas_object_size_hint_min_set (button, 128*_height_rate, 56*_width_rate);
+ elm_table_pack (_more_land_table, button, (7 + (i%6)*132)*_height_rate, (16 + (i/6)*65)*_width_rate, 128*_height_rate, 56*_width_rate);
+ edje_object_signal_callback_add (button, "button,action,clicked", "",
+ ui_more_window_candidate_item_click_cb, GINT_TO_POINTER (i));
+ evas_object_show (button);
+ _land_button [i] = button;
+ }
+
+ /* Create land page button */
+ _page_button_land = edje_object_add (evas);
+ edje_object_file_set (_page_button_land, _candidate_edje_file.c_str (), "page_button_land");
+ evas_object_size_hint_min_set (_page_button_land, 260*_height_rate, 56*_width_rate);
+ edje_object_text_class_set (_page_button_land, "page_text_class", "1/1", _candidate_font_max_size);
+ elm_table_pack (_more_land_table, _page_button_land, 7*_height_rate, 211*_width_rate, 260*_height_rate, 56*_width_rate);
+ edje_object_signal_callback_add (_page_button_land, "prev,action,clicked", "", ui_more_window_page_button_cb, GINT_TO_POINTER (1));
+ edje_object_signal_callback_add (_page_button_land, "next,action,clicked", "", ui_more_window_page_button_cb, GINT_TO_POINTER (2));
+ evas_object_show (_page_button_land);
+
+ /* Create land close button */
+ button = edje_object_add (evas);
+ edje_object_file_set (button, _candidate_edje_file.c_str (), "close_button");
+ evas_object_size_hint_min_set (button, 128*_height_rate, 56*_width_rate);
+ edje_object_text_class_set (button, "button_text_class", "Close", _candidate_font_max_size);
+ elm_table_pack (_more_land_table, button, 667*_height_rate, 211*_width_rate, 128*_height_rate, 56*_width_rate);
+ edje_object_signal_callback_add (button, "button,action,clicked", "", ui_more_window_close_button_cb, 0);
+ evas_object_show (button);
+
+ if (_candidate_angle != 0)
+ ui_more_window_rotate (_candidate_angle);
+
+ flush_memory ();
+}
+
+/**
+ * @brief Create prediction engine style candidate window.
+ *
+ * @param vertical An indicator for vertical window or horizontal window.
+ */
+static void ui_create_prediction_engine_candidate_window (bool vertical)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ Evas_Object *tmp_text = NULL;
+
+ if (_candidate_edje_file == String (EFL_CANDIDATE_THEME2)) {
+ _candidate_port_width = 480 * _width_rate;
+ _candidate_port_height_min = 102 * _height_rate;
+ _candidate_port_height_min_2 = 157 * _height_rate;
+ _candidate_port_height_max = 310 * _height_rate;
+ _candidate_port_height_max_2 = 365 * _height_rate;
+ _candidate_land_width = 800 * _height_rate;
+ _candidate_land_height_min = 102 * _width_rate;
+ _candidate_land_height_max = 170 * _width_rate;
+ _candidate_land_height_max_2 = 230 * _width_rate;
+
+ _candidate_scroll_0_width_min = 350 * _width_rate;
+ _candidate_scroll_0_width_max = 670 * _height_rate;
+ _candidate_scroll_width_min = 446 * _width_rate;
+ _candidate_scroll_width_max = 676 * _height_rate;
+ _candidate_scroll_height_min = 130 * _height_rate;
+ _candidate_scroll_height_max = 198 * _width_rate;
+
+ _candidate_area_1_pos [0] = 20 * _width_rate;
+ _candidate_area_1_pos [1] = 20 * _height_rate;
+ _candidate_area_2_pos [0] = 20 * _width_rate;
+ _candidate_area_2_pos [1] = 20 * _height_rate;
+ _more_btn_pos [0] = 376 * _width_rate;
+ _more_btn_pos [1] = 20 * _height_rate;
+ _more_btn_pos [2] = 696 * _height_rate;
+ _more_btn_pos [3] = 20 * _width_rate;
+ _close_btn_pos [0] = 376 * _width_rate;
+ _close_btn_pos [1] = 228 * _height_rate;
+ _close_btn_pos [2] = 696 * _height_rate;
+ _close_btn_pos [3] = 88 * _width_rate;
+
+ _aux_height = 68 * _height_rate;
+ _aux_port_width = 460 * _width_rate;
+ _aux_land_width = 780 * _height_rate;
+
+ _h_padding = 5 * _width_rate;
+ _v_padding = 6 * _height_rate;
+ _item_min_height = 62 * _height_rate;
+ } else {
+ _candidate_port_width = 464 * _width_rate;
+ _candidate_port_height_min = 86 * _height_rate;
+ _candidate_port_height_min_2 = 150 * _height_rate;
+ _candidate_port_height_max = 286 * _height_rate;
+ _candidate_port_height_max_2 = 350 * _height_rate;
+ _candidate_land_width = 784 * _height_rate;
+ _candidate_land_height_min = 86 * _width_rate;
+ _candidate_land_height_max = 150 * _width_rate;
+ _candidate_land_height_max_2 = 214 * _width_rate;
+
+ _candidate_scroll_0_width_min = 350 * _width_rate;
+ _candidate_scroll_0_width_max = 670 * _height_rate;
+ _candidate_scroll_width_min = 448 * _width_rate;
+ _candidate_scroll_width_max = 676 * _height_rate;
+ _candidate_scroll_height_min = 124 * _height_rate;
+ _candidate_scroll_height_max = 190 * _width_rate;
+
+ _candidate_area_1_pos [0] = 11 * _width_rate;
+ _candidate_area_1_pos [1] = 13 * _height_rate;
+ _candidate_area_2_pos [0] = 11 * _width_rate;
+ _candidate_area_2_pos [1] = 13 * _height_rate;
+ _more_btn_pos [0] = 366 * _width_rate;
+ _more_btn_pos [1] = 13 * _height_rate;
+ _more_btn_pos [2] = 689 * _height_rate;
+ _more_btn_pos [3] = 13 * _width_rate;
+ _close_btn_pos [0] = 366 * _width_rate;
+ _close_btn_pos [1] = 214 * _height_rate;
+ _close_btn_pos [2] = 689 * _height_rate;
+ _close_btn_pos [3] = 79 * _width_rate;
+
+ _aux_height = _candidate_port_height_min * 4 / 5;
+ _aux_port_width = 444 * _width_rate;
+ _aux_land_width = 764 * _height_rate;
+
+ _h_padding = 4 * _width_rate;
+ _v_padding = 11 * _height_rate;
+ _item_min_height = 55 * _height_rate;
+ }
+
+ _candidate_name = String ("candidate");
+
+ /* Create candidate window */
+ if (_candidate_window == NULL) {
+ _candidate_window = efl_create_window ("candidate", "Prediction Window");
+ evas_object_resize (_candidate_window, _screen_width, _candidate_port_height_min);
+
+ if (vertical) {
+ evas_object_resize (_candidate_window, _candidate_port_width, _candidate_port_height_min);
+
+ /* Add background */
+ _candidate_bg = edje_object_add (evas_object_evas_get (_candidate_window));
+ edje_object_file_set (_candidate_bg, _candidate_edje_file.c_str (), "candidate_bg");
+ elm_win_resize_object_add (_candidate_window, _candidate_bg);
+ evas_object_show (_candidate_bg);
+
+ /* Create _candidate_0 scroller */
+ _candidate_0_scroll = elm_scroller_add (_candidate_window);
+ elm_scroller_bounce_set (_candidate_0_scroll, 1, 0);
+ elm_scroller_policy_set (_candidate_0_scroll, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_OFF);
+ evas_object_resize (_candidate_0_scroll, _candidate_scroll_0_width_min, _item_min_height);
+ evas_object_move (_candidate_0_scroll, _candidate_area_1_pos[0], _candidate_area_1_pos[1]);
+ _candidate_0_table = elm_table_add (_candidate_window);
+ evas_object_size_hint_weight_set (_candidate_0_table, 0.0, 0.0);
+ evas_object_size_hint_align_set (_candidate_0_table, 0.0, 0.0);
+ elm_table_padding_set (_candidate_0_table, _h_padding, 0);
+ elm_object_content_set (_candidate_0_scroll, _candidate_0_table);
+ evas_object_show (_candidate_0_table);
+ _candidate_area_1 = _candidate_0_scroll;
+
+ /* Create more button */
+ _more_btn = edje_object_add (evas_object_evas_get (_candidate_window));
+ edje_object_file_set (_more_btn, _candidate_edje_file.c_str (), _candidate_name.c_str ());
+ edje_object_text_class_set (_more_btn, "candidate_text_class", _candidate_font_name.c_str (), _button_font_size);
+ edje_object_part_text_set (_more_btn, "candidate", "More");
+ evas_object_move (_more_btn, _more_btn_pos[0], _more_btn_pos[1]);
+ evas_object_resize (_more_btn, 84 * _width_rate, _item_min_height);
+ evas_object_event_callback_add (_more_btn, EVAS_CALLBACK_MOUSE_UP, ui_candidate_window_more_button_cb, NULL);
+
+ /* Create vertical scroller */
+ _candidate_scroll_width = _candidate_scroll_width_min;
+ _candidate_scroll = elm_scroller_add (_candidate_window);
+ elm_scroller_bounce_set (_candidate_scroll, 0, 1);
+ elm_scroller_policy_set (_candidate_scroll, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
+ evas_object_resize (_candidate_scroll, _candidate_scroll_width, _candidate_scroll_height_max);
+ elm_scroller_page_size_set (_candidate_scroll, 0, _item_min_height+_v_padding);
+ evas_object_move (_candidate_scroll, _candidate_area_2_pos[0], _candidate_area_2_pos[1]);
+ _candidate_table = elm_table_add (_candidate_window);
+ evas_object_size_hint_weight_set (_candidate_table, 0.0, 0.0);
+ evas_object_size_hint_align_set (_candidate_table, 0.0, 0.0);
+ elm_table_padding_set (_candidate_table, _h_padding, _v_padding);
+ elm_object_content_set (_candidate_scroll, _candidate_table);
+ evas_object_show (_candidate_table);
+ _candidate_area_2 = _candidate_scroll;
+
+ /* Create close button */
+ _close_btn = edje_object_add (evas_object_evas_get (_candidate_window));
+ edje_object_file_set (_close_btn, _candidate_edje_file.c_str (), _candidate_name.c_str ());
+ edje_object_text_class_set (_close_btn, "candidate_text_class", _candidate_font_name.c_str (), _button_font_size);
+ edje_object_part_text_set (_close_btn, "candidate", "Close");
+ evas_object_move (_close_btn, _close_btn_pos[0], _close_btn_pos[1]);
+ evas_object_resize (_close_btn, 84 * _width_rate, _item_min_height);
+ evas_object_event_callback_add (_close_btn, EVAS_CALLBACK_MOUSE_UP, ui_candidate_window_close_button_cb, NULL);
+ } else {
+ /* Add background */
+ Evas_Object *bg = elm_bg_add (_candidate_window);
+ evas_object_size_hint_weight_set (bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_bg_file_set (bg, EFL_CANDIDATE_BG, NULL);
+ elm_win_resize_object_add (_candidate_window, bg);
+ evas_object_show (bg);
+
+ /* Create candidate toolbar */
+ _candidate_toolbar = elm_toolbar_add (_candidate_window);
+ elm_toolbar_mode_shrink_set(_candidate_toolbar, ELM_TOOLBAR_SHRINK_SCROLL);
+ elm_toolbar_homogeneous_set (_candidate_toolbar, 0);
+ elm_toolbar_align_set (_candidate_toolbar, 0);
+ evas_object_size_hint_weight_set (_candidate_toolbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set (_candidate_toolbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_resize (_candidate_toolbar, _screen_width, _candidate_port_height_min);
+ evas_object_move (_candidate_toolbar, 0, 0);
+ _candidate_area_1 = _candidate_toolbar;
+ }
+
+ _tmp_candidate_text = evas_object_text_add (evas_object_evas_get (_candidate_window));
+ evas_object_text_font_set (_tmp_candidate_text, _candidate_font_name.c_str (), _candidate_font_max_size);
+
+ _text_fonts.clear ();
+ for (int font_size = _candidate_font_max_size; font_size > _candidate_font_min_size; font_size-=2) {
+ tmp_text = evas_object_text_add (evas_object_evas_get (_candidate_window));
+ evas_object_text_font_set (tmp_text, _candidate_font_name.c_str (), font_size);
+ _text_fonts.push_back (tmp_text);
+ }
+
+ /* Create aux */
+ _aux_area = elm_scroller_add (_candidate_window);
+ elm_scroller_bounce_set (_aux_area, 1, 0);
+ elm_scroller_policy_set (_aux_area, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_OFF);
+ if (vertical)
+ evas_object_resize (_aux_area, _aux_port_width, _aux_height);
+ else
+ evas_object_resize (_aux_area, _screen_width - 2*_blank_width, _aux_height);
+ evas_object_move (_aux_area, _blank_width, 0);
+
+ _aux_table = elm_table_add (_candidate_window);
+ elm_object_content_set (_aux_area, _aux_table);
+ elm_table_padding_set (_aux_table, _blank_width, 0);
+ evas_object_size_hint_weight_set (_aux_table, 0.0, 0.0);
+ evas_object_size_hint_align_set (_aux_table, 0.0, 0.0);
+ evas_object_show (_aux_table);
+
+ _aux_line = edje_object_add (evas_object_evas_get (_candidate_window));
+ edje_object_file_set (_aux_line, _candidate_edje_file.c_str (), "popup_line");
+ evas_object_resize (_aux_line, _candidate_port_width, 2);
+ evas_object_move (_aux_line, 0, 62 * _height_rate);
+
+ _tmp_aux_text = evas_object_text_add (evas_object_evas_get (_candidate_window));
+ evas_object_text_font_set (_tmp_aux_text, _candidate_font_name.c_str (), _aux_font_size);
+ }
+
+ flush_memory ();
+}
+
+/**
+ * @brief Create candidate window.
+ *
+ * @param style The candidate window style.
+ * @param vertical An indicator for vertical window or horizontal window.
+ */
+static void ui_create_candidate_window (ISF_CANDIDATE_STYLE_T style, bool vertical)
+{
+ check_time ("\nEnter ui_create_candidate_window");
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ ui_destroy_candidate_window ();
+
+ _candidate_angle = 0;
+
+ ui_create_prediction_engine_candidate_window (vertical);
+
+ check_time ("Exit ui_create_candidate_window");
+}
+
+/**
+ * @brief Destroy candidate window.
+ *
+ * @return void
+ */
+static void ui_destroy_candidate_window (void)
+{
+ check_time ("Enter ui_destroy_candidate_window");
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ /* Delete candidate items, popup lines and seperator items */
+ for (int i = 0; i < SCIM_LOOKUP_TABLE_MAX_PAGESIZE; ++i) {
+ if (_candidate_0 [i]) {
+ evas_object_del (_candidate_0 [i]);
+ _candidate_0 [i] = NULL;
+ }
+
+ if (_candidate_items [i]) {
+ evas_object_del (_candidate_items [i]);
+ _candidate_items [i] = NULL;
+ }
+
+ if (_candidate_table_items [i]) {
+ elm_toolbar_item_del (_candidate_table_items [i]);
+ _candidate_table_items [i] = NULL;
+ }
+
+ if (_candidate_seperator_items [i]) {
+ elm_toolbar_item_del (_candidate_seperator_items [i]);
+ _candidate_seperator_items [i] = NULL;
+ }
+ }
+
+ _aux_items.clear ();
+ /* Delete candidate window */
+ if (_candidate_window) {
+ evas_object_del (_candidate_window);
+ _candidate_window = NULL;
+ _aux_area = NULL;
+ _candidate_area_1 = NULL;
+ _candidate_area_2 = NULL;
+ }
+ _candidate_window_show = false;
+
+ /* Delete more window */
+ if (_more_window) {
+ evas_object_del (_more_window);
+ _more_window = NULL;
+ }
+
+ flush_memory ();
+
+ check_time ("Exit ui_destroy_candidate_window");
+}
+
+/**
+ * @brief Settle candidate window position.
+ */
+static void ui_settle_candidate_window (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (!_candidate_window) {
+ return;
+ } else if (!_candidate_window_show) {
+ ui_candidate_hide (false);
+ return;
+ }
+
+ int spot_x, spot_y;
+ int candidate_width, candidate_height;
+ int x, y, width, height, x2, y2, height2;
+ bool reverse = false;
+
+ /* Get candidate window position */
+ ecore_evas_geometry_get (ecore_evas_ecore_evas_get (evas_object_evas_get (_candidate_window)), &x, &y, &width, &height);
+ /* Get exact candidate window size */
+ evas_object_geometry_get (_candidate_window, &x2, &y2, &width, &height);
+ candidate_width = width;
+ candidate_height = height;
+
+ if (_candidate_left >= 0 || _candidate_top >= 0) {
+ spot_x = _candidate_left;
+ spot_y = _candidate_top;
+ } else {
+ spot_x = _spot_location_x;
+ spot_y = _spot_location_y;
+
+ rectinfo ise_rect;
+ _panel_agent->get_current_ise_rect (ise_rect);
+ if (_candidate_angle == 90 || _candidate_angle == 270) {
+ if (ise_rect.height <= (uint32)0 || ise_rect.height >= (uint32)_screen_width)
+ ise_rect.height = ISE_DEFAULT_HEIGHT_LANDSCAPE * _width_rate;
+ } else {
+ if (ise_rect.height <= (uint32)0 || ise_rect.height >=(uint32) _screen_height)
+ ise_rect.height = ISE_DEFAULT_HEIGHT_PORTRAIT * _height_rate;
+ }
+
+ /* Get aux+candidate window height */
+ if (evas_object_visible_get (_aux_area))
+ height2 = _candidate_port_height_min_2;
+ else
+ height2 = _candidate_port_height_min;
+
+ int nOffset = _candidate_port_height_min / 3;
+ if (_candidate_angle == 270) {
+ if (ise_rect.height > 0 && spot_y + height2 > _screen_width - (int)ise_rect.height + nOffset) {
+ reverse = true;
+ spot_x = _screen_width - _spot_location_top_y;
+ if (spot_x > _screen_width - (_indicator_height+candidate_height))
+ spot_x = _screen_width - (_indicator_height+candidate_height);
+ } else {
+ spot_x = _screen_width - _spot_location_y - candidate_height;
+ }
+ } else if (_candidate_angle == 90) {
+ if (ise_rect.height > 0 && spot_y + height2 > _screen_width - (int)ise_rect.height + nOffset) {
+ reverse = true;
+ spot_x = _spot_location_top_y - candidate_height;
+ spot_x = spot_x < _indicator_height ? _indicator_height : spot_x;
+ } else {
+ spot_x = spot_y;
+ }
+ } else if (_candidate_angle == 180) {
+ if (ise_rect.height > 0 && spot_y + height2 > _screen_height - (int)ise_rect.height + nOffset) {
+ reverse = true;
+ spot_y = _screen_height - _spot_location_top_y;
+ if (spot_y > _screen_height - (_indicator_height+candidate_height))
+ spot_y = _screen_height - (_indicator_height+candidate_height);
+ } else {
+ spot_y = _screen_height - _spot_location_y - candidate_height;
+ }
+ } else {
+ if (ise_rect.height > 0 && spot_y + height2 > _screen_height - (int)ise_rect.height + nOffset) {
+ reverse = true;
+ spot_y = _spot_location_top_y - candidate_height;
+ spot_y = spot_y < _indicator_height ? _indicator_height : spot_y;
+ } else {
+ spot_y = spot_y;
+ }
+ }
+ }
+
+ if (_candidate_angle == 90 || _candidate_angle == 270) {
+ if (_candidate_vertical) {
+ spot_y = (_screen_height - width) / 2;
+ } else {
+ spot_y = 0;
+ }
+ } else {
+ if (_candidate_vertical) {
+ spot_x = (_screen_width - width) / 2;
+ } else {
+ spot_x = 0;
+ }
+ }
+
+ if (spot_x != x || spot_y != y) {
+ evas_object_move (_candidate_window, spot_x, spot_y);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////
+// End of Candidate Functions
+//////////////////////////////////////////////////////////////////////
+
+/**
+ * @brief Get screen width and height.
+ *
+ * @param width The screen width.
+ * @param height The screen height.
+ */
+static void efl_get_screen_size (int &width, int &height)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ Display *d = (Display *)ecore_x_display_get ();
+ if (d) {
+ int screen_num = DefaultScreen (d);
+ width = DisplayWidth (d, screen_num);
+ height = DisplayHeight (d, screen_num);
+ } else {
+ std::cerr << "ecore_x_display_get () is failed!!!\n";
+ }
+}
+
+/**
+ * @brief Disable focus for app window.
+ *
+ * @param win_obj The Evas_Object handler of app window.
+ */
+static void efl_disable_focus_for_app_window (Evas_Object *win_obj)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ Eina_Bool accepts_focus;
+ Ecore_X_Window_State_Hint initial_state;
+ Ecore_X_Pixmap icon_pixmap;
+ Ecore_X_Pixmap icon_mask;
+ Ecore_X_Window icon_window;
+ Ecore_X_Window window_group;
+ Eina_Bool is_urgent;
+
+ ecore_x_icccm_hints_get (elm_win_xwindow_get (win_obj),
+ &accepts_focus, &initial_state, &icon_pixmap, &icon_mask, &icon_window, &window_group, &is_urgent);
+ ecore_x_icccm_hints_set (elm_win_xwindow_get (win_obj),
+ 0, initial_state, icon_pixmap, icon_mask, icon_window, window_group, is_urgent);
+}
+
+/**
+ * @brief Set transient for app window.
+ *
+ * @param win_obj The Evas_Object handler of app window.
+ */
+static void efl_set_transient_for_app_window (Evas_Object *win_obj)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ /* Set a transient window for window stack */
+ /* Gets the current XID of the active window into the root window property */
+ int ret = 0;
+ Atom type_return;
+ int format_return;
+ unsigned long nitems_return;
+ unsigned long bytes_after_return;
+ unsigned char *data = NULL;
+ Ecore_X_Window xAppWindow;
+ Ecore_X_Window xKeypadWin = elm_win_xwindow_get (win_obj);
+
+ ret = XGetWindowProperty ((Display *)ecore_x_display_get (), ecore_x_window_root_get (xKeypadWin),
+ ecore_x_atom_get ("_ISF_ACTIVE_WINDOW"),
+ 0, G_MAXLONG, False, ((Atom) 33), &type_return,
+ &format_return, &nitems_return, &bytes_after_return,
+ &data);
+
+ if (ret == Success) {
+ if ((type_return == ((Atom) 33)) && (format_return == 32) && (data)) {
+ xAppWindow = *(Window *)data;
+ ecore_x_icccm_transient_for_set (xKeypadWin, xAppWindow);
+ if (data)
+ XFree (data);
+ }
+ } else {
+ std::cerr << "XGetWindowProperty () is failed!!!\n";
+ }
+}
+
+/**
+ * @brief Get angle for root window.
+ *
+ * @param win_obj The Evas_Object handler of application window.
+ *
+ * @return The angle of root window.
+ */
+static int efl_get_angle_for_root_window (Evas_Object *win_obj)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ int ret;
+ int count;
+ int angle = 0;
+ unsigned char *prop_data = NULL;
+ Ecore_X_Window root_win = ecore_x_window_root_get (elm_win_xwindow_get (win_obj));
+
+ ret = ecore_x_window_prop_property_get (root_win, ECORE_X_ATOM_E_ILLUME_ROTATE_ROOT_ANGLE, ECORE_X_ATOM_CARDINAL, 32, &prop_data, &count);
+ if (ret && prop_data) {
+ memcpy (&angle, prop_data, sizeof (int));
+ } else {
+ std::cerr << "ecore_x_window_prop_property_get () is failed!!!\n";
+ }
+ if (prop_data)
+ XFree (prop_data);
+
+ return angle;
+}
+
+/**
+ * @brief Set showing effect for application window.
+ *
+ * @param win The Evas_Object handler of application window.
+ * @param strEffect The pointer of effect string.
+ */
+static void efl_set_showing_effect_for_app_window (Evas_Object *win, const char* strEffect)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+ ecore_x_icccm_name_class_set (elm_win_xwindow_get (static_cast<Evas_Object*>(win)), strEffect, "ISF");
+}
+
+/**
+ * @brief Create elementary window.
+ *
+ * @param strWinName The window name.
+ * @param strEffect The window effect string.
+ *
+ * @return The window pointer
+ */
+static Evas_Object *efl_create_window (const char *strWinName, const char *strEffect)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ Evas_Object *win = elm_win_add (NULL, strWinName, ELM_WIN_UTILITY);
+
+ /* set window properties */
+ elm_win_autodel_set (win, EINA_TRUE);
+ elm_object_focus_allow_set (win, EINA_FALSE);
+ elm_win_borderless_set (win, EINA_TRUE);
+ elm_win_alpha_set (win, EINA_TRUE);
+ efl_disable_focus_for_app_window (win);
+ efl_set_showing_effect_for_app_window (win, strEffect);
+
+ return win;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+// Start of PanelAgent Functions
+//////////////////////////////////////////////////////////////////////
+
+/**
+ * @brief Initialize panel agent.
+ *
+ * @param config The config string for PanelAgent.
+ * @param display The current display.
+ * @param resident The variable indicates whether panel will be resident.
+ *
+ * @return true if initialize is successful, otherwise return false.
+ */
+static bool initialize_panel_agent (const String &config, const String &display, bool resident)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ _panel_agent = new PanelAgent ();
+
+ if (!_panel_agent || !_panel_agent->initialize (config, display, resident))
+ return false;
+
+ _panel_agent->signal_connect_reload_config (slot (slot_reload_config));
+ _panel_agent->signal_connect_focus_in (slot (slot_focus_in));
+ _panel_agent->signal_connect_focus_out (slot (slot_focus_out));
+ _panel_agent->signal_connect_update_factory_info (slot (slot_update_factory_info));
+ _panel_agent->signal_connect_update_spot_location (slot (slot_update_spot_location));
+ _panel_agent->signal_connect_show_aux_string (slot (slot_show_aux_string));
+ _panel_agent->signal_connect_show_lookup_table (slot (slot_show_candidate_table));
+ _panel_agent->signal_connect_hide_aux_string (slot (slot_hide_aux_string));
+ _panel_agent->signal_connect_hide_lookup_table (slot (slot_hide_candidate_table));
+ _panel_agent->signal_connect_update_aux_string (slot (slot_update_aux_string));
+ _panel_agent->signal_connect_update_lookup_table (slot (slot_update_candidate_table));
+ _panel_agent->signal_connect_set_candidate_ui (slot (slot_set_candidate_ui));
+ _panel_agent->signal_connect_get_candidate_ui (slot (slot_get_candidate_ui));
+ _panel_agent->signal_connect_set_candidate_position (slot (slot_set_candidate_position));
+ _panel_agent->signal_connect_get_candidate_rect (slot (slot_get_candidate_rect));
+ _panel_agent->signal_connect_set_active_ise_by_uuid (slot (slot_set_active_ise_by_uuid));
+ _panel_agent->signal_connect_get_ise_list (slot (slot_get_ise_list));
+ _panel_agent->signal_connect_get_keyboard_ise_list (slot (slot_get_keyboard_ise_list));
+ _panel_agent->signal_connect_get_language_list (slot (slot_get_language_list));
+ _panel_agent->signal_connect_get_all_language (slot (slot_get_all_language));
+ _panel_agent->signal_connect_get_ise_language (slot (slot_get_ise_language));
+ _panel_agent->signal_connect_set_isf_language (slot (slot_set_isf_language));
+ _panel_agent->signal_connect_get_ise_info_by_uuid (slot (slot_get_ise_info_by_uuid));
+ _panel_agent->signal_connect_set_keyboard_ise (slot (slot_set_keyboard_ise));
+ _panel_agent->signal_connect_get_keyboard_ise (slot (slot_get_keyboard_ise));
+ _panel_agent->signal_connect_start_default_ise (slot (slot_start_default_ise));
+ _panel_agent->signal_connect_accept_connection (slot (slot_accept_connection));
+ _panel_agent->signal_connect_close_connection (slot (slot_close_connection));
+ _panel_agent->signal_connect_exit (slot (slot_exit));
+ _panel_agent->get_active_ise_list (_load_ise_list);
+
+ return true;
+}
+
+/**
+ * @brief Reload config slot function for PanelAgent.
+ */
+static void slot_reload_config (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (!_config.null ())
+ _config->reload ();
+}
+
+/**
+ * @brief Focus in slot function for PanelAgent.
+ */
+static void slot_focus_in (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (!_candidate_window) {
+ ui_create_candidate_window (_candidate_style, _candidate_vertical);
+ }
+}
+
+/**
+ * @brief Focus out slot function for PanelAgent.
+ */
+static void slot_focus_out (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+ ui_destroy_candidate_window ();
+}
+
+/**
+ * @brief Update keyboard ISE information slot function for PanelAgent.
+ *
+ * @param info The information of current Keyboard ISE.
+ */
+static void slot_update_factory_info (const PanelFactoryInfo &info)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ String ise_name = info.name;
+ String ise_icon = info.icon;
+
+ TOOLBAR_MODE_T mode = _panel_agent->get_current_toolbar_mode ();
+
+ if (TOOLBAR_HELPER_MODE == mode)
+ ise_name = get_ise_name (_panel_agent->get_current_helper_uuid ());
+
+ if (ise_name.length () > 0)
+ _panel_agent->set_current_ise_name (ise_name);
+}
+
+/**
+ * @brief Update cursor position slot function for PanelAgent.
+ *
+ * @param x The x position of current cursor.
+ * @param y The bottom y position of current cursor.
+ * @param top_y The top y position of current cursor.
+ */
+static void slot_update_spot_location (int x, int y, int top_y)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (x >= 0 && x < _screen_height && y >= 0 && y < _screen_height) {
+ _spot_location_x = x;
+ _spot_location_y = y;
+ _spot_location_top_y = top_y;
+
+ ui_settle_candidate_window ();
+ }
+}
+
+/**
+ * @brief Show aux slot function for PanelAgent.
+ */
+static void slot_show_aux_string (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (_aux_area == NULL || evas_object_visible_get (_aux_area) ||
+ _candidate_angle == 90 || _candidate_angle == 270)
+ return;
+
+ evas_object_show (_aux_area);
+ ui_candidate_window_adjust ();
+
+ ui_candidate_show ();
+ ui_settle_candidate_window ();
+}
+
+/**
+ * @brief Show candidate table slot function for PanelAgent.
+ */
+static void slot_show_candidate_table (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (!_candidate_area_1 ||
+ evas_object_visible_get (_candidate_area_1) ||
+ evas_object_visible_get (_candidate_area_2))
+ return;
+
+ evas_object_show (_candidate_area_1);
+ evas_object_show (_more_btn);
+ evas_object_hide (_close_btn);
+ ui_candidate_window_adjust ();
+
+ ui_candidate_show ();
+ ui_settle_candidate_window ();
+}
+
+/**
+ * @brief Hide aux slot function for PanelAgent.
+ */
+static void slot_hide_aux_string (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (!_aux_area || !evas_object_visible_get (_aux_area))
+ return;
+
+ evas_object_hide (_aux_area);
+ elm_scroller_region_show (_aux_area, 0, 0, 10, 10);
+ ui_candidate_window_adjust ();
+
+ ui_candidate_hide (false);
+ ui_settle_candidate_window ();
+}
+
+/**
+ * @brief Hide candidate table slot function for PanelAgent.
+ */
+static void slot_hide_candidate_table (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (!_candidate_area_1)
+ return;
+
+ if (_more_window && evas_object_visible_get (_more_window))
+ evas_object_hide (_more_window);
+
+ if (evas_object_visible_get (_candidate_area_1) || evas_object_visible_get (_candidate_area_2)) {
+ if (evas_object_visible_get (_candidate_area_1)) {
+ evas_object_hide (_candidate_area_1);
+ evas_object_hide (_more_btn);
+ }
+ if (evas_object_visible_get (_candidate_area_2)) {
+ evas_object_hide (_candidate_area_2);
+ evas_object_hide (_close_btn);
+ _panel_agent->candidate_more_window_hide ();
+ }
+ ui_candidate_window_adjust ();
+
+ ui_candidate_hide (false);
+ ui_settle_candidate_window ();
+ }
+}
+
+/**
+ * @brief Update aux slot function for PanelAgent.
+ *
+ * @param str The new aux string.
+ * @param attrs The attribute list of new aux string.
+ */
+static void slot_update_aux_string (const String &str, const AttributeList &attrs)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (!_aux_area || (str.length () <= 0))
+ return;
+
+ int x, y, width, height, item_width = 0;
+ unsigned int window_width = 0, count = 0, i;
+
+ Evas_Object *aux_edje = NULL;
+
+ /* Get selected aux index */
+ int aux_index = -1, aux_start = 0, aux_end = 0;
+ String strAux = str;
+ const char *buf = str.c_str ();
+ if (buf[0] >= '0' && buf[0] <= '9') {
+ aux_index = buf[0] - 48;
+ strAux.erase (0, 1);
+ }
+
+ std::vector<String> aux_list;
+ scim_split_string_list (aux_list, strAux, '|');
+
+ if (_aux_items.size () > 0) {
+ for (i = 0; i < _aux_items.size (); i++)
+ evas_object_del (_aux_items [i]);
+ _aux_items.clear ();
+ }
+
+ for (i = 0; i < aux_list.size (); i++) {
+ count++;
+ if (i >= _aux_items.size ()) {
+ aux_edje = edje_object_add (evas_object_evas_get (_candidate_window));
+ edje_object_file_set (aux_edje, _candidate_edje_file.c_str (), "aux");
+ edje_object_text_class_set (aux_edje, "aux_text_class", _candidate_font_name.c_str (), _aux_font_size);
+ elm_table_pack (_aux_table, aux_edje, i, 0, 1, 1);
+ evas_object_event_callback_add (aux_edje, EVAS_CALLBACK_MOUSE_DOWN, ui_mouse_button_pressed_cb, GINT_TO_POINTER (ISF_EFL_AUX));
+ evas_object_event_callback_add (aux_edje, EVAS_CALLBACK_MOUSE_UP, ui_mouse_button_released_cb, GINT_TO_POINTER (i));
+ evas_object_event_callback_add (aux_edje, EVAS_CALLBACK_MOUSE_MOVE, ui_mouse_moved_cb, GINT_TO_POINTER (ISF_EFL_AUX));
+ evas_object_show (aux_edje);
+ _aux_items.push_back (aux_edje);
+ } else {
+ aux_edje = _aux_items [i];
+ }
+ edje_object_part_text_set (aux_edje, "aux", aux_list [i].c_str ());
+ if (i == (unsigned int)aux_index)
+ edje_object_signal_emit (aux_edje, "aux,state,selected", "aux");
+ else
+ edje_object_signal_emit (aux_edje, "aux,state,unselected", "aux");
+
+ evas_object_text_text_set (_tmp_aux_text, aux_list [i].c_str ());
+ evas_object_geometry_get (_tmp_aux_text, &x, &y, &width, &height);
+ item_width = width + 2*_blank_width;
+ item_width = item_width > _item_min_width ? item_width : _item_min_width;
+ evas_object_size_hint_min_set (aux_edje, item_width, _aux_height - 2);
+ if (aux_index == (int)i || (aux_index == -1 && i == 0)) {
+ aux_start = window_width;
+ aux_end = window_width + item_width;
+ }
+ window_width = window_width + item_width + _blank_width;
+ }
+
+ /* Remove redundant aux edje */
+ if (count < _aux_items.size ()) {
+ for (i = count; i < _aux_items.size (); i++)
+ evas_object_del (_aux_items [i]);
+ _aux_items.erase (_aux_items.begin () + count, _aux_items.end ());
+ }
+
+ int w, h;
+ elm_scroller_region_get (_aux_area, &x, &y, &w, &h);
+ item_width = aux_end - aux_start;
+ if (item_width > 0) {
+ if (item_width >= w)
+ elm_scroller_region_show (_aux_area, aux_end - w, y, w, h);
+ else if (aux_end > x + w)
+ elm_scroller_region_show (_aux_area, aux_end - w, y, w, h);
+ else if (aux_start < x)
+ elm_scroller_region_show (_aux_area, aux_start, y, w, h);
+ }
+ flush_memory ();
+}
+
+/**
+ * @brief Update candidate/associate table.
+ *
+ * @param table_type The table type.
+ * @param table The lookup table for candidate or associate.
+ * @param table_items The table items for candidate or associate.
+ * @param seperator_items The seperator items for candidate or associate.
+ */
+static void update_table (const int table_type, const LookupTable &table,
+ Elm_Toolbar_Item *table_items[], Elm_Toolbar_Item *seperator_items[])
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ String mbs;
+ WideString wcs;
+
+ int i, x, y, width, height, item_width, item_number, item_0_width;
+ int item_num = table.get_current_page_size ();
+
+ if (_candidate_vertical) {
+ _more_list.clear ();
+
+ if (_candidate_angle == 90 || _candidate_angle == 270)
+ item_number = _candidate_land_number;
+ else
+ item_number = _candidate_port_number;
+
+ item_width = (_candidate_scroll_width - 6*_width_rate - (item_number-1)*_h_padding) / item_number;
+
+ Evas *evas = evas_object_evas_get (_candidate_window);
+ for (i = 0; i < SCIM_LOOKUP_TABLE_MAX_PAGESIZE; ++ i) {
+ if (i < item_num) {
+ wcs = table.get_candidate_in_current_page (i);
+ mbs = utf8_wcstombs (wcs);
+ _more_list.push_back (mbs);
+
+ if (_candidate_0 [i]) {
+ evas_object_del (_candidate_0 [i]);
+ _candidate_0 [i] = NULL;
+ }
+
+ if (!_candidate_0 [i]) {
+ _candidate_0 [i] = edje_object_add (evas);
+ edje_object_file_set (_candidate_0 [i], _candidate_edje_file.c_str (), _candidate_name.c_str ());
+ edje_object_text_class_set (_candidate_0 [i], "candidate_text_class", _candidate_font_name.c_str (), _candidate_font_max_size);
+ elm_table_pack (_candidate_0_table, _candidate_0 [i], i, 0, 1, 1);
+ evas_object_event_callback_add (_candidate_0 [i], EVAS_CALLBACK_MOUSE_DOWN, ui_mouse_button_pressed_cb, GINT_TO_POINTER (ISF_EFL_CANDIDATE_0));
+ evas_object_event_callback_add (_candidate_0 [i], EVAS_CALLBACK_MOUSE_UP, ui_mouse_button_released_cb, GINT_TO_POINTER (i));
+ evas_object_event_callback_add (_candidate_0 [i], EVAS_CALLBACK_MOUSE_MOVE, ui_mouse_moved_cb, GINT_TO_POINTER (ISF_EFL_CANDIDATE_0));
+ evas_object_show (_candidate_0 [i]);
+ }
+ edje_object_part_text_set (_candidate_0 [i], "candidate", mbs.c_str ());
+ /* Resize _candidate_0 [i] display width */
+ evas_object_text_text_set (_tmp_candidate_text, mbs.c_str ());
+ evas_object_geometry_get (_tmp_candidate_text, &x, &y, &width, &height);
+ item_0_width = width + 3.5*_blank_width;
+ item_0_width = item_0_width > _item_min_width ? item_0_width : _item_min_width;
+ evas_object_size_hint_min_set (_candidate_0 [i], item_0_width, _item_min_height);
+
+ if (!_candidate_items [i]) {
+ _candidate_items [i] = edje_object_add (evas);
+ edje_object_file_set (_candidate_items [i], _candidate_edje_file.c_str (), _candidate_name.c_str ());
+ edje_object_text_class_set (_candidate_items [i], "candidate_text_class", _candidate_font_name.c_str (), _candidate_font_max_size);
+ evas_object_size_hint_min_set (_candidate_items [i], item_width, _item_min_height);
+ evas_object_event_callback_add (_candidate_items [i], EVAS_CALLBACK_MOUSE_DOWN, ui_mouse_button_pressed_cb, GINT_TO_POINTER (ISF_EFL_CANDIDATE_ITEMS));
+ evas_object_event_callback_add (_candidate_items [i], EVAS_CALLBACK_MOUSE_UP, ui_mouse_button_released_cb, GINT_TO_POINTER (i));
+ evas_object_event_callback_add (_candidate_items [i], EVAS_CALLBACK_MOUSE_MOVE, ui_mouse_moved_cb, GINT_TO_POINTER (ISF_EFL_CANDIDATE_ITEMS));
+ elm_table_pack (_candidate_table, _candidate_items [i], i%item_number, i/item_number, 1, 1);
+ }
+ evas_object_show (_candidate_items [i]);
+ edje_object_part_text_set (_candidate_items [i], "candidate", mbs.c_str ());
+ ui_candidate_text_update_font_size (_candidate_items [i], item_width - 22*_width_rate, mbs);
+ } else {
+ if (_candidate_0 [i]) {
+ evas_object_del (_candidate_0 [i]);
+ _candidate_0 [i] = NULL;
+ }
+ if (_candidate_items [i]) {
+ if (i < item_number) { /* Only hide for first line */
+ evas_object_hide (_candidate_items [i]);
+ } else {
+ evas_object_del (_candidate_items [i]);
+ _candidate_items [i] = NULL;
+ }
+ }
+ }
+ }
+ elm_scroller_region_show (_candidate_area_1, 0, 0, _candidate_scroll_width, _item_min_height);
+ elm_scroller_region_show (_candidate_area_2, 0, 0, _candidate_scroll_width, item_num * 66 * _height_rate - _v_padding);
+ flush_memory ();
+
+ /* Update more window */
+ if (_more_window && evas_object_visible_get (_more_window)) {
+ _page_no = 1;
+ if (_candidate_angle == 90 || _candidate_angle == 270) {
+ _pages = _more_list.size () / ISF_LAND_BUTTON_NUMBER;
+ if ((_more_list.size () % ISF_LAND_BUTTON_NUMBER) > 0)
+ _pages += 1;
+ } else {
+ _pages = _more_list.size () / ISF_PORT_BUTTON_NUMBER;
+ if ((_more_list.size () % ISF_PORT_BUTTON_NUMBER) > 0)
+ _pages += 1;
+ }
+
+ ui_more_window_update ();
+ }
+ } else {
+ for (i = 0; i < SCIM_LOOKUP_TABLE_MAX_PAGESIZE; ++i) {
+ if (i < item_num) {
+ wcs = table.get_candidate_in_current_page (i);
+ mbs = utf8_wcstombs (wcs);
+
+ if (table_items [i]) {
+ elm_toolbar_item_label_set (table_items [i], mbs.c_str ());
+ } else {
+ if (i > 0) {
+ seperator_items [i] = elm_toolbar_item_append (_candidate_toolbar, NULL, mbs.c_str (), NULL, NULL);
+ elm_toolbar_item_separator_set (seperator_items [i], 1);
+ }
+
+ table_items [i] = elm_toolbar_item_append (_candidate_toolbar, NULL, mbs.c_str (), ui_horizontal_candidate_item_click_cb, GINT_TO_POINTER (i));
+ }
+ } else {
+ if (table_items [i]) {
+ elm_toolbar_item_del (table_items [i]);
+ table_items [i] = NULL;
+ }
+ if (seperator_items [i]) {
+ elm_toolbar_item_del (seperator_items [i]);
+ seperator_items [i] = NULL;
+ }
+ }
+ }
+ }
+}
+
+/**
+ * @brief Update candidate table slot function for PanelAgent.
+ *
+ * @param table The lookup table for candidate.
+ */
+static void slot_update_candidate_table (const LookupTable &table)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (!_candidate_window || table.get_current_page_size () <= 0)
+ return;
+
+ if (!evas_object_visible_get (_candidate_area_1) &&
+ !evas_object_visible_get (_candidate_area_2) &&
+ !evas_object_visible_get (_more_window)) {
+ ui_candidate_show ();
+ slot_show_candidate_table ();
+ }
+
+ update_table (ISF_CANDIDATE_TABLE, table, _candidate_table_items, _candidate_seperator_items);
+}
+
+/**
+ * @brief Set candidate style slot function for PanelAgent.
+ *
+ * @param style The new candidate style.
+ * @param mode The new candidate mode.
+ */
+static void slot_set_candidate_ui (int style, int mode)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+}
+
+/**
+ * @brief Get candidate style slot function for PanelAgent.
+ *
+ * @param style The current candidate style.
+ * @param mode The current candidate mode.
+ */
+static void slot_get_candidate_ui (int &style, int &mode)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ style = _candidate_style;
+ mode = _candidate_mode;
+
+ if (_more_window_enable == true && _candidate_mode == PORTRAIT_VERTICAL_CANDIDATE_MODE)
+ mode = PORTRAIT_MORE_CANDIDATE_MODE;
+ else if (_more_window_enable == true && _candidate_mode == LANDSCAPE_VERTICAL_CANDIDATE_MODE)
+ mode = LANDSCAPE_MORE_CANDIDATE_MODE;
+}
+
+/**
+ * @brief Set candidate position slot function for PanelAgent.
+ *
+ * @param left The new candidate left position.
+ * @param top The new candidate top position.
+ */
+static void slot_set_candidate_position (int left, int top)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ _candidate_left = left;
+ _candidate_top = top;
+
+ ui_settle_candidate_window ();
+}
+
+/**
+ * @brief Get candidate rect slot function for PanelAgent.
+ *
+ * @param info The data is used to store candidate position and size.
+ */
+static void slot_get_candidate_rect (struct rectinfo &info)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ int x = 0;
+ int y = 0;
+ int width = _candidate_port_width;
+ int height = _candidate_port_height_min;
+ if (_candidate_window) {
+ ecore_evas_geometry_get (ecore_evas_ecore_evas_get (evas_object_evas_get (_candidate_window)), &x, &y, &width, &height);
+ }
+ info.pos_x = x;
+ info.pos_y = y;
+ info.width = 464 * _width_rate;
+ info.height = 86 * _height_rate;
+}
+
+/**
+ * @brief Set active ISE slot function for PanelAgent.
+ *
+ * @param ise_uuid The active ISE's uuid.
+ */
+static void slot_set_active_ise_by_uuid (const String &ise_uuid, bool changeDefault)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ set_active_ise_by_uuid (ise_uuid, 0, changeDefault);
+}
+
+/**
+ * @brief Get all ISEs list slot function for PanelAgent.
+ *
+ * @param list The list is used to store all ISEs.
+ *
+ * @return true if this operation is successful, otherwise return false.
+ */
+static bool slot_get_ise_list (std::vector<String> &list)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ /* update ise list */
+ isf_load_ise_information (ALL_ISE, _config);
+ bool ret = isf_update_ise_list (ALL_ISE, _config);
+
+ std::vector<String> selected_lang;
+ isf_get_enabled_languages (selected_lang);
+ isf_get_enabled_ise_names_in_languages (selected_lang, list);
+
+ _panel_agent->update_ise_list (list);
+ return ret;
+}
+
+/**
+ * @brief Get keyboard ISEs list slot function for PanelAgent.
+ *
+ * @param list The list is used to store keyboard ISEs.
+ *
+ * @return true if this operation is successful, otherwise return false.
+ */
+static bool slot_get_keyboard_ise_list (std::vector<String> &list)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ /* update ise list */
+ isf_load_ise_information (ALL_ISE, _config);
+ bool ret = isf_update_ise_list (ALL_ISE, _config);
+
+ std::vector<String> selected_lang;
+ isf_get_all_languages (selected_lang);
+ isf_get_keyboard_uuids_in_languages (selected_lang, list);
+
+ if (ret)
+ _panel_agent->update_ise_list (list);
+ return ret;
+}
+
+/**
+ * @brief Get enable languages list slot function for PanelAgent.
+ *
+ * @param list The list is used to store languages.
+ */
+static void slot_get_language_list (std::vector<String> &list)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ String lang_name;
+ MapStringVectorSizeT::iterator iter = _groups.begin ();
+
+ for (; iter != _groups.end (); iter++) {
+ lang_name = scim_get_language_name (iter->first);
+ if (std::find (_disabled_langs.begin (), _disabled_langs.end (), lang_name) ==_disabled_langs.end ())
+ list.push_back (lang_name);
+ }
+}
+
+/**
+ * @brief Get all languages list slot function for PanelAgent.
+ *
+ * @param lang The list is used to store languages.
+ */
+static void slot_get_all_language (std::vector<String> &lang)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ isf_get_all_languages (lang);
+}
+
+/**
+ * @brief Get specific ISE language list slot function for PanelAgent.
+ *
+ * @param name The ISE name.
+ * @param list The list is used to store ISE languages.
+ */
+static void slot_get_ise_language (char *name, std::vector<String> &list)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (name == NULL)
+ return;
+
+ unsigned int num = _names.size ();
+ std::vector<String> list_tmp;
+ list_tmp.clear ();
+ for (unsigned int i = 0; i < num; i++) {
+ if (!strcmp (_names[i].c_str (), name)) {
+ scim_split_string_list (list_tmp, _langs[i], ',');
+ for (i = 0; i < list_tmp.size (); i++)
+ list.push_back (scim_get_language_name (list_tmp[i]));
+ return;
+ }
+ }
+}
+
+/**
+ * @brief Set ISF language slot function for PanelAgent.
+ *
+ * @param language The ISF language string.
+ */
+static void slot_set_isf_language (const String &language)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (language.length () <= 0)
+ return;
+
+ isf_set_language (language);
+}
+
+/**
+ * @brief Get ISE information slot function for PanelAgent.
+ *
+ * @param uuid The ISE uuid.
+ * @param info The variable is used to store ISE information.
+ *
+ * @return true if this operation is successful, otherwise return false.
+ */
+static bool slot_get_ise_info_by_uuid (const String &uuid, ISE_INFO &info)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ for (unsigned int i = 0; i < _uuids.size (); i++) {
+ if (!uuid.compare (_uuids[i])) {
+ info.uuid = _uuids[i];
+ info.name = _names[i];
+ info.icon = _icons[i];
+ info.lang = _langs[i];
+ info.option = _options[i];
+ info.type = _modes[i];
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * @brief Set keyboard ISE slot function for PanelAgent.
+ *
+ * @param type The variable should be ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID.
+ * @param ise The variable is ISE uuid.
+ */
+static void slot_set_keyboard_ise (int type, const String &ise)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (ise.length () <= 0)
+ return;
+
+ String ise_uuid = ise;
+ String language = String ("~other");/*scim_get_locale_language (scim_get_current_locale ());*/
+ _config->write (String (SCIM_CONFIG_DEFAULT_IMENGINE_FACTORY) + String ("/") + language, ise_uuid);
+ _config->flush ();
+
+ _panel_agent->change_factory (ise_uuid);
+}
+
+/**
+ * @brief Get current keyboard ISE name and uuid slot function for PanelAgent.
+ *
+ * @param ise_name The variable is used to store ISE name.
+ * @param ise_uuid The variable is used to store ISE uuid.
+ */
+static void slot_get_keyboard_ise (String &ise_name, String &ise_uuid)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ String language = String ("~other");/*scim_get_locale_language (scim_get_current_locale ());*/
+ String uuid = _config->read (String (SCIM_CONFIG_DEFAULT_IMENGINE_FACTORY) + String ("/") + language, String (""));
+ if (ise_uuid.length () > 0)
+ uuid = ise_uuid;
+ for (unsigned int i = 0; i < _uuids.size (); i++) {
+ if (uuid == _uuids[i]) {
+ ise_name = _names[i];
+ ise_uuid = uuid;
+ return;
+ }
+ }
+ ise_name = String ("");
+ ise_uuid = String ("");
+}
+
+/**
+ * @brief Start default ISE slot function for PanelAgent.
+ */
+static void slot_start_default_ise (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ DEFAULT_ISE_T default_ise;
+
+ default_ise.type = (TOOLBAR_MODE_T)scim_global_config_read (String (SCIM_GLOBAL_CONFIG_DEFAULT_ISE_TYPE), (int)_initial_ise.type);
+ default_ise.uuid = scim_global_config_read (String (SCIM_GLOBAL_CONFIG_DEFAULT_ISE_UUID), _initial_ise.uuid);
+ default_ise.name = scim_global_config_read (String (SCIM_GLOBAL_CONFIG_DEFAULT_ISE_NAME), _initial_ise.name);
+
+ if (!set_active_ise_by_uuid (default_ise.uuid, 0, 1)) {
+ if (default_ise.uuid != _initial_ise.uuid)
+ set_active_ise_by_uuid (_initial_ise.uuid, 0, 1);
+
+ _active_ise = _initial_ise;
+ } else {
+ _active_ise = default_ise;
+ }
+
+ return;
+}
+
+/**
+ * @brief Accept connection slot function for PanelAgent.
+ *
+ * @param fd The file descriptor to connect.
+ */
+static void slot_accept_connection (int fd)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ Ecore_Fd_Handler *panel_agent_read_handler = ecore_main_fd_handler_add (fd, ECORE_FD_READ, panel_agent_handler, NULL, NULL, NULL);
+ _read_handler_list.push_back (panel_agent_read_handler);
+}
+
+/**
+ * @brief Close connection slot function for PanelAgent.
+ *
+ * @param fd The file descriptor to connect.
+ */
+static void slot_close_connection (int fd)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+ int i = 0;
+ std::vector<Ecore_Fd_Handler *>::iterator IterPos;
+
+ for (IterPos = _read_handler_list.begin (); IterPos != _read_handler_list.end (); ++IterPos,++i) {
+ if (ecore_main_fd_handler_fd_get (_read_handler_list[i]) == fd) {
+ ecore_main_fd_handler_del (_read_handler_list[i]);
+ _read_handler_list.erase (IterPos);
+ break;
+ }
+ }
+}
+
+/**
+ * @brief Exit panel process slot function for PanelAgent.
+ */
+static void slot_exit (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ elm_exit ();
+}
+
+//////////////////////////////////////////////////////////////////////
+// End of PanelAgent-Functions
+//////////////////////////////////////////////////////////////////////
+
+
+/**
+ * @brief Callback function for ecore fd handler.
+ *
+ * @param data The data to pass to this callback.
+ * @param fd_handler The ecore fd handler.
+ *
+ * @return ECORE_CALLBACK_RENEW
+ */
+static Eina_Bool panel_agent_handler (void *data, Ecore_Fd_Handler *fd_handler)
+{
+ if (fd_handler == NULL)
+ return ECORE_CALLBACK_RENEW;
+
+ int fd = ecore_main_fd_handler_fd_get (fd_handler);
+ for (unsigned int i = 0; i < _read_handler_list.size (); i++) {
+ if (fd_handler == _read_handler_list [i]) {
+ if (!_panel_agent->filter_event (fd)) {
+ std::cerr << "_panel_agent->filter_event () is failed!!!\n";
+ ecore_main_fd_handler_del (fd_handler);
+ }
+ return ECORE_CALLBACK_RENEW;
+ }
+ }
+ std::cerr << "panel_agent_handler () has received exception event!!!\n";
+ _panel_agent->filter_exception_event (fd);
+ ecore_main_fd_handler_del (fd_handler);
+ return ECORE_CALLBACK_RENEW;
+}
+
+/**
+ * @brief Callback function for abnormal signal.
+ *
+ * @param sig The signal.
+ */
+static void signalhandler (int sig)
+{
+ SCIM_DEBUG_MAIN (1) << __FUNCTION__ << "...\n";
+
+ if (_panel_agent != NULL)
+ _panel_agent->stop ();
+ elm_exit ();
+}
+
+#if HAVE_VCONF
+/**
+ * @brief Callback function for setting theme change.
+ *
+ * @param key The key node.
+ * @param data The data to pass to this callback.
+ */
+static void setting_theme_changed_cb (keynode_t *key, void* data)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ char *theme_str = vconf_get_str (VCONFKEY_THEME);
+ if (!theme_str) return;
+
+ if (String (theme_str) == "tizen-black" || String (theme_str) == "tizen-black-hd")
+ _candidate_edje_file = String (EFL_CANDIDATE_THEME1);
+ else if (String (theme_str) == "tizen" || String (theme_str) == "tizen-hd")
+ _candidate_edje_file = String (EFL_CANDIDATE_THEME2);
+
+ free (theme_str);
+}
+
+/**
+ * @brief Update keyboard ISE name when display language is changed.
+ *
+ * @param module_name The keyboard ISE module name.
+ * @param index The index of _module_names.
+ *
+ * @return true if suceessful, otherwise return false.
+ */
+static bool update_keyboard_ise_locale (const String module_name, int index)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+ if (module_name.length () <= 0 || module_name == "socket")
+ return false;
+
+ IMEngineFactoryPointer factory;
+ IMEngineModule ime_module;
+ ime_module.load (module_name, _config);
+
+ if (ime_module.valid ()) {
+ for (size_t j = 0; j < ime_module.number_of_factories (); ++j) {
+ try {
+ factory = ime_module.create_factory (j);
+ } catch (...) {
+ factory.reset ();
+ }
+ if (!factory.null ()) {
+ _names[index+j] = utf8_wcstombs (factory->get_name ());
+ factory.reset ();
+ }
+ }
+ ime_module.unload ();
+ } else {
+ std::cerr << module_name << " can not be loaded!!!\n";
+ }
+
+ return true;
+}
+
+/**
+ * @brief Update helper ISE name when display language is changed.
+ *
+ * @param module_name The helper ISE module name.
+ * @param index The index of _module_names.
+ *
+ * @return true if suceessful, otherwise return false.
+ */
+static bool update_helper_ise_locale (const String module_name, int index)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+ if (module_name.length () <= 0)
+ return false;
+
+ HelperModule helper_module;
+ HelperInfo helper_info;
+ helper_module.load (module_name);
+ if (helper_module.valid ()) {
+ for (size_t j = 0; j < helper_module.number_of_helpers (); ++j) {
+ helper_module.get_helper_info (j, helper_info);
+ _names[index+j] = helper_info.name;
+ }
+ helper_module.unload ();
+ } else {
+ std::cerr << module_name << " can not be loaded!!!\n";
+ }
+
+ return true;
+}
+
+/**
+ * @brief Set language and locale.
+ *
+ * @return void
+ */
+static void set_language_and_locale (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ char *lang_str = vconf_get_str (VCONFKEY_LANGSET);
+
+ if (lang_str) {
+ setenv ("LANG", lang_str, 1);
+ setlocale (LC_MESSAGES, lang_str);
+ free(lang_str);
+ } else {
+ setenv ("LANG", "en_US.utf8", 1);
+ setlocale (LC_MESSAGES, "en_US.utf8");
+ }
+}
+
+/**
+ * @brief Callback function for display language change.
+ *
+ * @param key The key node.
+ * @param data The data to pass to this callback.
+ *
+ * @return void
+ */
+static void display_language_changed_cb (keynode_t *key, void* data)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ set_language_and_locale ();
+
+ /* update the active ise and all the ises names in new locale */
+ std::vector<String> module_list;
+ for (unsigned int i = 0; i < _module_names.size (); i++) {
+ if (std::find (module_list.begin (), module_list.end (), _module_names[i]) != module_list.end ())
+ continue;
+ module_list.push_back (_module_names[i]);
+ if (_module_names[i] == String (ENGLISH_KEYBOARD_MODULE)) {
+ IMEngineFactoryPointer factory;
+ factory = new ComposeKeyFactory ();
+ _names[i] = utf8_wcstombs (factory->get_name ());
+ factory.reset ();
+ } else if (_modes[i] == TOOLBAR_KEYBOARD_MODE) {
+ update_keyboard_ise_locale (_module_names[i], i);
+ } else if (_modes[i] == TOOLBAR_HELPER_MODE) {
+ update_helper_ise_locale (_module_names[i], i);
+ }
+ }
+ isf_save_ise_information ();
+
+ String name = get_ise_name (_panel_agent->get_current_helper_uuid ());
+ _panel_agent->set_current_ise_name (name);
+}
+
+/**
+ * @brief Callback function for hibernation enter.
+ *
+ * @param data Data to pass when it is called.
+ *
+ * @return void
+ */
+static void hibernation_enter_cb (void *data)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ /* Remove callback function for input language and display language */
+ vconf_ignore_key_changed (VCONFKEY_LANGSET, display_language_changed_cb);
+ vconf_ignore_key_changed (VCONFKEY_THEME, setting_theme_changed_cb);
+}
+
+/**
+ * @brief Callback function for hibernation leave.
+ *
+ * @param data Data to pass when it is called.
+ *
+ * @return void
+ */
+static void hibernation_leave_cb (void *data)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ if (data == NULL) {
+ if (!_config.null ())
+ _config->reload ();
+ }
+ /* Add callback function for input language and display language */
+ vconf_notify_key_changed (VCONFKEY_LANGSET, display_language_changed_cb, NULL);
+ vconf_notify_key_changed (VCONFKEY_THEME, setting_theme_changed_cb, NULL);
+ setting_theme_changed_cb (NULL, NULL);
+
+ scim_global_config_update ();
+ set_language_and_locale ();
+
+ try {
+ /* update ise list */
+ std::vector<String> list;
+ slot_get_ise_list (list);
+
+ /* Start default ISE */
+ slot_start_default_ise ();
+ change_hw_and_sw_keyboard ();
+ } catch (scim::Exception & e) {
+ std::cerr << e.what () << "\n";
+ }
+}
+#endif
+
+/**
+ * @brief Callback function for X event client message.
+ *
+ * @param data Data to pass when it is called.
+ * @param type The event type.
+ * @param event The information for current message.
+ *
+ * @return ECORE_CALLBACK_RENEW
+ */
+static Eina_Bool x_event_client_message_cb (void *data, int type, void *event)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ Ecore_X_Event_Client_Message *ev = (Ecore_X_Event_Client_Message *)event;
+ if (ev->message_type == ECORE_X_ATOM_E_ILLUME_ROTATE_ROOT_ANGLE) {
+ int angle = ev->data.l[0];
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << " : ANGLE (" << angle << ")\n";
+ ui_candidate_hide (true);
+ if (_candidate_window && _candidate_angle != angle) {
+ _candidate_angle = angle;
+ ui_candidate_window_rotate (angle);
+ }
+ }
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+/**
+ * @brief Change hw and sw keyboard.
+ *
+ * @return void
+ */
+static void change_hw_and_sw_keyboard (void)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ unsigned int val = 0;
+
+ _config->write (ISF_CONFIG_HARDWARE_KEYBOARD_DETECT, 0);
+ if (ecore_x_window_prop_card32_get (ecore_x_window_root_first_get (), ecore_x_atom_get (PROP_X_EXT_KEYBOARD_EXIST), &val, 1)) {
+ if (val != 0) {
+ /* Currently active the hw ise directly */
+ String uuid, name;
+ isf_get_keyboard_ise (uuid, name, _config);
+ set_active_ise_by_uuid (uuid, 0, 1);
+
+ _config->write (ISF_CONFIG_HARDWARE_KEYBOARD_DETECT, 1);
+ } else {
+ String previous_helper = _config->read (SCIM_CONFIG_DEFAULT_HELPER_ISE, _initial_ise.uuid);
+ set_active_ise_by_uuid (previous_helper, 0, 1);
+ }
+ }
+ _config->reload ();
+}
+
+/**
+ * @brief Callback function for ECORE_X_EVENT_WINDOW_PROPERTY.
+ *
+ * @param data Data to pass when it is called.
+ * @param ev_type The event type.
+ * @param ev The information for current message.
+ *
+ * @return ECORE_CALLBACK_PASS_ON
+ */
+static Eina_Bool x_event_property_change_cb (void *data, int ev_type, void *ev)
+{
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+
+ Ecore_X_Event_Window_Property *event = (Ecore_X_Event_Window_Property *)ev;
+
+ Ecore_X_Window rootwin = ecore_x_window_root_first_get ();
+ if (event->win == rootwin && event->atom == ecore_x_atom_get (PROP_X_EXT_KEYBOARD_EXIST)) {
+ SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
+ change_hw_and_sw_keyboard ();
+ }
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+int main (int argc, char *argv [])
+{
+ struct tms tiks_buf;
+ _clock_start = times (&tiks_buf);
+
+ int i, ret1, slp_fd;
+#ifdef WAIT_WM
+ int try_count = 0;
+#endif
+ size_t j;
+ int ret = 0;
+
+ bool daemon = false;
+ bool should_resident = true;
+
+ int new_argc = 0;
+ char **new_argv = new char * [40];
+ ConfigModule *config_module = NULL;
+ String config_name = String ("socket");
+ String display_name = String ();
+ char *clang = NULL;
+
+ Ecore_Fd_Handler *panel_agent_read_handler = NULL;
+ Ecore_Event_Handler *xclient_msg_handler = NULL;
+ Ecore_Event_Handler *prop_change_handler = NULL;
+
+ check_time ("\nStarting ISF Panel EFL...... ");
+
+ DebugOutput::disable_debug (SCIM_DEBUG_AllMask);
+ DebugOutput::enable_debug (SCIM_DEBUG_MainMask);
+
+ /* Parse command options */
+ i = 0;
+ while (i < argc) {
+ if (++i >= argc)
+ break;
+
+ if (String ("-c") == argv [i] || String ("--config") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "no argument for option " << argv [i-1] << "\n";
+ ret = -1;
+ goto cleanup;
+ }
+ config_name = argv [i];
+ continue;
+ }
+
+ if (String ("-h") == argv [i] || String ("--help") == argv [i]) {
+ std::cout << "Usage: " << argv [0] << " [option]...\n\n"
+ << "The options are: \n"
+ << " --display DISPLAY Run on display DISPLAY.\n"
+ << " -c, --config NAME Uses specified Config module.\n"
+ << " -d, --daemon Run " << argv [0] << " as a daemon.\n"
+ << " -ns, --no-stay Quit if no connected client.\n"
+#if ENABLE_DEBUG
+ << " -v, --verbose LEVEL Enable debug info, to specific LEVEL.\n"
+ << " -o, --output FILE Output debug information into FILE.\n"
+#endif
+ << " -h, --help Show this help message.\n";
+ delete []new_argv;
+ return 0;
+ }
+
+ if (String ("-d") == argv [i] || String ("--daemon") == argv [i]) {
+ daemon = true;
+ continue;
+ }
+
+ if (String ("-ns") == argv [i] || String ("--no-stay") == argv [i]) {
+ should_resident = false;
+ continue;
+ }
+
+ if (String ("-v") == argv [i] || String ("--verbose") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "no argument for option " << argv [i-1] << "\n";
+ ret = -1;
+ goto cleanup;
+ }
+ DebugOutput::set_verbose_level (atoi (argv [i]));
+ continue;
+ }
+
+ if (String ("-o") == argv [i] || String ("--output") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "No argument for option " << argv [i-1] << "\n";
+ ret = -1;
+ goto cleanup;
+ }
+ DebugOutput::set_output (argv [i]);
+ continue;
+ }
+
+ if (String ("--display") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "No argument for option " << argv [i-1] << "\n";
+ ret = -1;
+ goto cleanup;
+ }
+ display_name = argv [i];
+ continue;
+ }
+
+ if (String ("--") == argv [i])
+ break;
+
+ std::cerr << "Invalid command line option: " << argv [i] << "\n";
+ delete []new_argv;
+ return 0;
+ } /* End of command line parsing. */
+
+ new_argv [new_argc ++] = argv [0];
+
+ /* Store the rest argvs into new_argv. */
+ for (++i; i < argc && new_argc < 37; ++i) {
+ new_argv [new_argc ++] = argv [i];
+ }
+
+ /* Make up DISPLAY env. */
+ if (display_name.length ()) {
+ new_argv [new_argc ++] = const_cast <char*> ("--display");
+ new_argv [new_argc ++] = const_cast <char*> (display_name.c_str ());
+
+ setenv ("DISPLAY", display_name.c_str (), 1);
+ }
+
+ new_argv [new_argc] = 0;
+
+ if (!config_name.length ()) {
+ std::cerr << "No Config module is available!\n";
+ ret = -1;
+ goto cleanup;
+ }
+
+ if (config_name != "dummy") {
+ /* Load config module */
+ config_module = new ConfigModule (config_name);
+
+ if (!config_module || !config_module->valid ()) {
+ std::cerr << "Can not load " << config_name << " Config module.\n";
+ ret = -1;
+ goto cleanup;
+ }
+ } else {
+ _config = new DummyConfig ();
+ }
+
+ signal (SIGQUIT, signalhandler);
+ signal (SIGTERM, signalhandler);
+ signal (SIGINT, signalhandler);
+
+ setenv ("ELM_FPS", "6000", 1);
+ setenv ("ELM_ENGINE", "software_x11", 1); /* to avoid the inheritance of ELM_ENGINE */
+ set_language_and_locale ();
+
+#ifdef WAIT_WM
+ while (1) {
+ if (check_file ("/tmp/.wm_ready"))
+ break;
+
+ if (try_count == 100) {
+ std::cerr << "[ISF-PANEL-EFL] Timeout. cannot check the state of window manager....\n";
+ break;
+ }
+
+ try_count++;
+ usleep (50000);
+ }
+#endif
+
+ elm_init (argc, argv);
+ check_time ("elm_init");
+
+#if HAVE_VCONF
+ slp_fd = heynoti_init ();
+
+ /* register hibernation callback */
+ heynoti_subscribe (slp_fd, "HIBERNATION_ENTER", hibernation_enter_cb, NULL);
+ heynoti_subscribe (slp_fd, "HIBERNATION_LEAVE", hibernation_leave_cb, NULL);
+#endif
+
+ /* Get current display. */
+ {
+ const char *p = getenv ("DISPLAY");
+ if (p)
+ display_name = String (p);
+ }
+
+ char buf [256];
+ snprintf (buf, sizeof (buf), "config_name=%s display_name=%s", config_name.c_str (), display_name.c_str ());
+ check_time (buf);
+ try {
+ if (!initialize_panel_agent (config_name, display_name, should_resident)) {
+ check_time ("Failed to initialize Panel Agent!");
+ std::cerr << "Failed to initialize Panel Agent!\n";
+ ret = -1;
+ goto cleanup;
+ }
+ } catch (scim::Exception & e) {
+ std::cerr << e.what() << "\n";
+ ret = -1;
+ goto cleanup;
+ }
+ check_time ("initialize_panel_agent");
+
+ /* Create config instance */
+ if (_config.null () && config_module && config_module->valid ())
+ _config = config_module->create_config ();
+ if (_config.null ()) {
+ std::cerr << "Failed to create Config instance from " << config_name << " Config module.\n";
+ ret = -1;
+ goto cleanup;
+ }
+ check_time ("create config instance");
+
+ /* Initialize global variables and pointers for candidate items and etc. */
+ for (i = 0; i < SCIM_LOOKUP_TABLE_MAX_PAGESIZE; i++) {
+ _candidate_0 [i] = NULL;
+ _candidate_items [i] = NULL;
+ _candidate_table_items [i] = NULL;
+ _candidate_seperator_items [i] = NULL;
+ }
+
+ efl_get_screen_size (_screen_width, _screen_height);
+
+ _width_rate = (float)(_screen_width / 480.0);
+ _height_rate = (float)(_screen_height / 800.0);
+ _blank_width = (int)(_blank_width * _height_rate);
+ _item_min_width = (int)(_item_min_width * _width_rate);
+ _item_min_height = (int)(_item_min_height * _height_rate);
+ _aux_font_size = (int)(_aux_font_size * _height_rate);
+
+ _candidate_font_max_size = (int)(_candidate_font_max_size * _height_rate);
+ _candidate_font_min_size = (int)(_candidate_font_min_size * _height_rate);
+
+ _more_port_height = (int)(_more_port_height * _height_rate);
+ _more_land_height = (int)(_more_land_height * _width_rate);
+
+ /* Load ISF configuration */
+ load_config ();
+ check_time ("load_config");
+
+ try {
+ _panel_agent->send_display_name (display_name);
+ } catch (scim::Exception & e) {
+ std::cerr << e.what() << "\n";
+ ret = -1;
+ goto cleanup;
+ }
+
+ _initial_ise.type = (TOOLBAR_MODE_T)scim_global_config_read (String (SCIM_GLOBAL_CONFIG_INITIAL_ISE_TYPE), (int)TOOLBAR_HELPER_MODE);
+ _initial_ise.uuid = scim_global_config_read (String (SCIM_GLOBAL_CONFIG_INITIAL_ISE_UUID), String ("ff110940-b8f0-4062-9ff6-a84f4f3575c0"));
+ _initial_ise.name = scim_global_config_read (String (SCIM_GLOBAL_CONFIG_INITIAL_ISE_NAME), String ("Input Pad"));
+
+ for (j = 0; j < _uuids.size (); ++j) {
+ if (!_uuids[j].compare (_initial_ise.uuid))
+ break;
+ }
+
+ if (j == _uuids.size ()) {
+ for (j = 0; j < _uuids.size (); ++j) {
+ if (_modes[j] == TOOLBAR_HELPER_MODE) {
+ _initial_ise.type = _modes[j];
+ _initial_ise.uuid = _uuids[j];
+ _initial_ise.name = _names[j];
+ }
+ }
+ }
+
+ if (daemon) {
+ check_time ("ISF Panel EFL run as daemon");
+ scim_daemon ();
+ }
+
+ /* Connect the configuration reload signal. */
+ _config->signal_connect_reload (slot (config_reload_cb));
+
+ panel_agent_read_handler = ecore_main_fd_handler_add (_panel_agent->get_server_id (), ECORE_FD_READ, panel_agent_handler, NULL, NULL, NULL);
+ _read_handler_list.push_back (panel_agent_read_handler);
+ check_time ("run_panel_agent");
+
+#if HAVE_VCONF
+ ret1 = heynoti_attach_handler (slp_fd);
+ if (ret1 == -1)
+ std::cerr << "heynoti_attach_handler () is failed!!!\n";
+
+ clang = vconf_get_str (VCONFKEY_ISF_INPUT_LANG_STR);
+ if (clang == NULL) {
+ std::cerr << "\nGet vconf key value failed, set active language to Automatic...\n";
+ isf_set_language ("Automatic");
+ } else {
+ isf_set_language (String (clang));
+ }
+
+ if (!ecore_file_exists ("/opt/etc/.hib_capturing")) {
+ /* in case of normal booting */
+ hibernation_leave_cb ((void *)1);
+ }
+
+ /* set hibernation ready state flag */
+ vconf_set_int ("memory/hibernation/isf_ready", 1);
+#endif
+
+ xclient_msg_handler = ecore_event_handler_add (ECORE_X_EVENT_CLIENT_MESSAGE, x_event_client_message_cb, NULL);
+ ecore_x_event_mask_set (ecore_x_window_root_first_get (), ECORE_X_EVENT_MASK_WINDOW_PROPERTY);
+ prop_change_handler = ecore_event_handler_add (ECORE_X_EVENT_WINDOW_PROPERTY, x_event_property_change_cb, NULL);
+
+ /* Set elementary scale */
+ {
+ Evas_Coord win_w = 0, win_h = 0;
+ ecore_x_window_size_get (ecore_x_window_root_first_get (), &win_w, &win_h);
+ if (win_w) {
+ elm_scale_set (win_w / 720.0f);
+ }
+ }
+
+ check_time ("EFL Panel launch time");
+
+ elm_run ();
+ elm_shutdown ();
+
+ _config->flush ();
+ ret = 0;
+
+ ecore_event_handler_del (xclient_msg_handler);
+ ecore_event_handler_del (prop_change_handler);
+#if HAVE_VCONF
+ hibernation_enter_cb (NULL);
+ heynoti_close (slp_fd);
+#endif
+
+cleanup:
+ if (!_config.null ())
+ _config.reset ();
+ if (config_module)
+ delete config_module;
+ if (_panel_agent)
+ delete _panel_agent;
+
+ delete []new_argv;
+
+ if (ret == 0) {
+ std::cerr << "Successfully exited.\n";
+ return 0;
+ } else {
+ std::cerr << "Abnormally exited.\n";
+ return -1;
+ }
+}
+
+/*
+vi:ts=4:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Haifeng Deng <haifeng.deng@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_SCIM_PANEL_AGENT
+#define Uses_SCIM_IMENGINE_MODULE
+#define Uses_SCIM_HELPER_MODULE
+#define Uses_SCIM_COMPOSE_KEY
+
+
+#include <string.h>
+#include "scim.h"
+#include "scim_stl_map.h"
+#include "isf_panel_utility.h"
+#include "isf_query_utility.h"
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Declaration of global variables.
+/////////////////////////////////////////////////////////////////////////////
+MapStringVectorSizeT _groups;
+std::vector<String> _uuids;
+std::vector<String> _names;
+std::vector<String> _module_names;
+std::vector<String> _langs;
+std::vector<String> _icons;
+std::vector<uint32> _options;
+std::vector<TOOLBAR_MODE_T> _modes;
+
+std::vector<String> _load_ise_list;
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Declaration of internal variables.
+/////////////////////////////////////////////////////////////////////////////
+static std::vector<String> _current_modules_list;
+
+static MapStringVectorString _disabled_ise_map;
+static std::vector<String> _disabled_langs_bak;
+std::vector<String> _disabled_langs;
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Declaration of internal functions.
+/////////////////////////////////////////////////////////////////////////////
+static bool add_keyboard_ise_module (const String ise_name, const ConfigPointer &config);
+static bool add_helper_ise_module (const String ise_name);
+
+
+/**
+ * @brief Get all ISEs support languages.
+ *
+ * @param all_langs The list to store all languages.
+ */
+void isf_get_all_languages (std::vector<String> &all_langs)
+{
+ String lang_name;
+
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ lang_name = scim_get_language_name_english (it->first);
+ all_langs.push_back (lang_name);
+ }
+}
+
+/**
+ * @brief Get enabled languages.
+ *
+ * @param enabled_langs The list to store languages.
+ */
+void isf_get_enabled_languages (std::vector<String> &enabled_langs)
+{
+ String lang_name;
+
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ lang_name = scim_get_language_name_english (it->first);
+
+ if (std::find (_disabled_langs.begin (), _disabled_langs.end (), lang_name) == _disabled_langs.end ())
+ enabled_langs.push_back (lang_name);
+ }
+}
+
+/**
+ * @brief Get enabled ISE names for the specific languages.
+ *
+ * @param lang_list The specific languages list.
+ * @param ise_names The list to store ISE names .
+ */
+void isf_get_enabled_ise_names_in_languages (std::vector<String> lang_list, std::vector<String> &ise_names)
+{
+ String lang_name;
+ String active_app ("Default");
+
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ lang_name = scim_get_language_name_english (it->first);
+ if (std::find (lang_list.begin (), lang_list.end (), lang_name) != lang_list.end ()) {
+ for (size_t i = 0; i < it->second.size (); i++) {
+ if (_current_modules_list.size () > 0 &&
+ std::find (_current_modules_list.begin (), _current_modules_list.end (), _module_names[it->second[i]]) == _current_modules_list.end ())
+ continue;
+ if (std::find (_disabled_ise_map[active_app].begin (), _disabled_ise_map[active_app].end (), _uuids[it->second[i]]) ==_disabled_ise_map[active_app].end ()) {
+ // Avoid to add the same ise
+ if (std::find (ise_names.begin (), ise_names.end (), _names[it->second[i]]) == ise_names.end ())
+ ise_names.push_back (_names[it->second[i]]);
+ }
+ }
+ }
+ }
+}
+
+/**
+ * @brief Get keyboard ISE
+ *
+ * @param ise_uuid The keyboard ISE uuid.
+ * @param ise_name The keyboard ISE name.
+ */
+void isf_get_keyboard_ise (String &ise_uuid, String &ise_name, const ConfigPointer &config)
+{
+ String language = String ("~other");
+ String uuid = config->read (String (SCIM_CONFIG_DEFAULT_IMENGINE_FACTORY) + String ("/") + language, String ("d75857a5-4148-4745-89e2-1da7ddaf7999"));
+ if (ise_uuid.length () > 0)
+ uuid = ise_uuid;
+ for (unsigned int i = 0; i < _uuids.size (); i++) {
+ if (uuid == _uuids[i]) {
+ ise_name = _names[i];
+ ise_uuid = uuid;
+ return;
+ }
+ }
+ ise_name = String ("");
+ ise_uuid = String ("");
+}
+
+/**
+ * @brief Get all keyboard ISE names for the specific languages.
+ *
+ * @param lang_list The specific languages list.
+ * @param keyboard_names The list to store keyboard ISE names.
+ */
+void isf_get_keyboard_names_in_languages (std::vector<String> lang_list, std::vector<String> &keyboard_names)
+{
+ String lang_name;
+
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ lang_name = scim_get_language_name_english (it->first);
+
+ if (std::find (lang_list.begin (), lang_list.end (), lang_name) != lang_list.end ()) {
+ for (size_t i = 0; i < it->second.size (); i++) {
+ if (_modes[it->second[i]] != TOOLBAR_KEYBOARD_MODE)
+ continue;
+ if (_current_modules_list.size () > 0 &&
+ std::find (_current_modules_list.begin (), _current_modules_list.end (), _module_names[it->second[i]]) == _current_modules_list.end ())
+ continue;
+ if (std::find (keyboard_names.begin (), keyboard_names.end (), _names[it->second[i]]) == keyboard_names.end ())
+ keyboard_names.push_back (_names[it->second[i]]);
+ }
+ }
+ }
+}
+
+/**
+ * @brief Get all keyboard ISE uuids for the specific languages.
+ *
+ * @param lang_list The specific languages list.
+ * @param keyboard_uuids The list to store keyboard ISE uuids.
+ */
+void isf_get_keyboard_uuids_in_languages (std::vector<String> lang_list, std::vector<String> &keyboard_uuids)
+{
+ String lang_name;
+
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ lang_name = scim_get_language_name_english (it->first);
+
+ if (std::find (lang_list.begin (), lang_list.end (), lang_name) != lang_list.end ()) {
+ for (size_t i = 0; i < it->second.size (); i++) {
+ if (_modes[it->second[i]] != TOOLBAR_KEYBOARD_MODE)
+ continue;
+ if (_current_modules_list.size () > 0 &&
+ std::find (_current_modules_list.begin (), _current_modules_list.end (), _module_names[it->second[i]]) == _current_modules_list.end ())
+ continue;
+ if (std::find (keyboard_uuids.begin (), keyboard_uuids.end (), _uuids[it->second[i]]) == keyboard_uuids.end ())
+ keyboard_uuids.push_back (_uuids[it->second[i]]);
+ }
+ }
+ }
+}
+
+/**
+ * @brief Get enabled helper ISE names for the specific languages.
+ *
+ * @param lang_list The specific languages list.
+ * @param helper_names The list to store helper ISE names.
+ */
+void isf_get_helper_names_in_languages (std::vector<String> lang_list, std::vector<String> &helper_names)
+{
+ String lang_name;
+ String active_app ("Default");
+
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ lang_name = scim_get_language_name_english (it->first);
+ if (std::find (lang_list.begin (), lang_list.end (), lang_name) != lang_list.end ()) {
+ for (size_t i = 0; i < it->second.size (); i++) {
+
+ if (_modes[it->second[i]]!= TOOLBAR_HELPER_MODE)
+ continue;
+ if (_current_modules_list.size () > 0 &&
+ std::find (_current_modules_list.begin (), _current_modules_list.end (), _module_names[it->second[i]]) == _current_modules_list.end ())
+ continue;
+ if (std::find (_disabled_ise_map[active_app].begin (), _disabled_ise_map[active_app].end (), _uuids[it->second[i]])
+ ==_disabled_ise_map[active_app].end ()) {
+ // Avoid to add the same ISE
+ if (std::find (helper_names.begin (), helper_names.end (), _names[it->second[i]]) == helper_names.end ())
+ helper_names.push_back (_names[it->second[i]]);
+ }
+ }
+ }
+ }
+}
+
+/**
+ * @brief Save all ISEs information into cache file.
+ *
+ * @return void
+ */
+void isf_save_ise_information (void)
+{
+ if (_module_names.size () <= 0)
+ return;
+
+ std::vector<ISEINFO> info_list;
+ for (size_t i = 0; i < _module_names.size (); ++i) {
+ if (_module_names[i] == ENGLISH_KEYBOARD_MODULE)
+ continue;
+ ISEINFO info;
+ info.name = _names[i];
+ info.uuid = _uuids[i];
+ info.module = _module_names[i];
+ info.language = _langs[i];
+ info.icon = _icons[i];
+ info.mode = _modes[i];
+ info.option = _options[i];
+ info.locales = "";
+ info_list.push_back (info);
+ }
+
+ String user_file_name = String (USER_ENGINE_FILE_NAME);
+ isf_write_ise_info_list (user_file_name.c_str (), info_list);
+}
+
+/**
+ * @brief Load all ISEs to initialize.
+ *
+ * @param type The loading ISE type.
+ * @param config The config pointer for loading keyboard ISE.
+ * @param uuids The ISE uuid list.
+ * @param names The ISE name list.
+ * @param module_names The ISE module name list.
+ * @param langs The ISE language list.
+ * @param icons The ISE icon list.
+ * @param modes The ISE type list.
+ * @param options The ISE option list.
+ * @param ise_list The already loaded ISE list.
+ */
+void isf_get_factory_list (LOAD_ISE_TYPE type,
+ const ConfigPointer &config,
+ std::vector<String> &uuids,
+ std::vector<String> &names,
+ std::vector<String> &module_names,
+ std::vector<String> &langs,
+ std::vector<String> &icons,
+ std::vector<TOOLBAR_MODE_T> &modes,
+ std::vector<uint32> &options,
+ const std::vector<String> &ise_list)
+{
+ uuids.clear ();
+ names.clear ();
+ module_names.clear ();
+ langs.clear ();
+ icons.clear ();
+ modes.clear ();
+ options.clear ();
+ _groups.clear ();
+
+ if (type != HELPER_ONLY) {
+ /* Add "English/Keyboard" factory first. */
+ IMEngineFactoryPointer factory = new ComposeKeyFactory ();
+ uuids.push_back (factory->get_uuid ());
+ names.push_back (utf8_wcstombs (factory->get_name ()));
+ module_names.push_back (ENGLISH_KEYBOARD_MODULE);
+ langs.push_back (isf_get_normalized_language (factory->get_language ()));
+ icons.push_back (factory->get_icon_file ());
+ modes.push_back (TOOLBAR_KEYBOARD_MODE);
+ options.push_back (0);
+ factory.reset ();
+ }
+
+ String user_file_name = String (USER_ENGINE_FILE_NAME);
+ FILE *engine_list_file = fopen (user_file_name.c_str (), "r");
+ if (engine_list_file == NULL) {
+ std::cerr << user_file_name << " doesn't exist.\n";
+ return;
+ }
+
+ char buf[MAXLINE];
+ while (fgets (buf, MAXLINE, engine_list_file) != NULL) {
+ ISEINFO info;
+ isf_get_ise_info_from_string (buf, info);
+ if (info.mode == TOOLBAR_HELPER_MODE || type != HELPER_ONLY) {
+ names.push_back (info.name);
+ uuids.push_back (info.uuid);
+ module_names.push_back (info.module);
+ langs.push_back (info.language);
+ icons.push_back (info.icon);
+ modes.push_back (info.mode);
+ options.push_back (info.option);
+ }
+ }
+
+ fclose (engine_list_file);
+}
+
+/**
+ * @brief Load all ISEs information and ISF default languages.
+ *
+ * @param type The load ISE type.
+ * @param config The config pointer for loading keyboard ISE.
+ */
+void isf_load_ise_information (LOAD_ISE_TYPE type, const ConfigPointer &config)
+{
+ /* Load ISE engine info */
+ isf_get_factory_list (type, config, _uuids, _names, _module_names, _langs, _icons, _modes, _options, _load_ise_list);
+
+ _current_modules_list.clear ();
+ scim_get_helper_module_list (_current_modules_list);
+ /* Check keyboard ISEs */
+ if (type != HELPER_ONLY) {
+ _current_modules_list.push_back (ENGLISH_KEYBOARD_MODULE);
+ std::vector<String> imengine_list;
+ scim_get_imengine_module_list (imengine_list);
+ for (size_t i = 0; i < imengine_list.size (); ++i)
+ _current_modules_list.push_back (imengine_list [i]);
+ }
+
+ /* Update _groups */
+ std::vector<String> ise_langs;
+ for (size_t i = 0; i < _uuids.size (); ++i) {
+ scim_split_string_list (ise_langs, _langs[i]);
+ for (size_t j = 0; j < ise_langs.size (); j++) {
+ if (std::find (_groups[ise_langs[j]].begin (), _groups[ise_langs[j]].end (), i) == _groups[ise_langs[j]].end ())
+ _groups[ise_langs[j]].push_back (i);
+ }
+ ise_langs.clear ();
+ }
+
+ /* Get ISF default language */
+ std::vector<String> isf_default_langs;
+ isf_default_langs = scim_global_config_read (String (SCIM_GLOBAL_CONFIG_ISF_DEFAULT_LANGUAGES), isf_default_langs);
+
+ /* No default ISF language */
+ if (isf_default_langs.size () == 0) {
+ String sys_input_lang, lang_info ("English");
+ sys_input_lang = config->read (String (SCIM_CONFIG_SYSTEM_INPUT_LANGUAGE), sys_input_lang);
+ MapStringVectorSizeT::iterator g = _groups.find (sys_input_lang);
+ if (g != _groups.end ())
+ lang_info = sys_input_lang;
+ else
+ std::cerr << "System input language is not included in the ISF languages.\n";
+
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ String lang_name = scim_get_language_name_english (it->first);
+ if (strcmp (lang_info.c_str (), lang_name.c_str ())) {
+ _disabled_langs.push_back (lang_name);
+ _disabled_langs_bak.push_back (lang_name);
+ }
+ }
+ } else {
+ std::vector<String> disabled;
+ disabled = scim_global_config_read (String (SCIM_GLOBAL_CONFIG_DISABLED_LANGS), disabled);
+ for (size_t i = 0; i < disabled.size (); i++) {
+ _disabled_langs.push_back (disabled[i]);
+ _disabled_langs_bak.push_back (disabled[i]);
+ }
+ }
+}
+
+/**
+ * @brief Load one keyboard ISE module.
+ *
+ * @param module_name The keboard ISE module name.
+ * @param config The config pointer for loading keyboard ISE.
+ *
+ * @return true if load module is successful, otherwise return false.
+ */
+static bool add_keyboard_ise_module (const String module_name, const ConfigPointer &config)
+{
+ if (module_name.length () <= 0 || module_name == "socket")
+ return false;
+
+ IMEngineFactoryPointer factory;
+ IMEngineModule ime_module;
+
+ String filename = String (USER_ENGINE_FILE_NAME);
+ FILE *engine_list_file = fopen (filename.c_str (), "a");
+ if (engine_list_file == NULL) {
+ std::cerr << "failed to open " << filename << "\n";
+ return false;
+ }
+
+ ime_module.load (module_name, config);
+ if (ime_module.valid ()) {
+ for (size_t j = 0; j < ime_module.number_of_factories (); ++j) {
+ try {
+ factory = ime_module.create_factory (j);
+ } catch (...) {
+ factory.reset ();
+ }
+
+ if (!factory.null ()) {
+ if (std::find (_uuids.begin (), _uuids.end (), factory->get_uuid ()) == _uuids.end ()) {
+ String uuid = factory->get_uuid ();
+ String name = utf8_wcstombs (factory->get_name ());
+ String language = isf_get_normalized_language (factory->get_language ());
+ String icon = factory->get_icon_file ();
+ char mode[12];
+ char option[12];
+
+ _uuids.push_back (uuid);
+ _names.push_back (name);
+ _module_names.push_back (module_name);
+ _langs.push_back (language);
+ _icons.push_back (icon);
+ _modes.push_back (TOOLBAR_KEYBOARD_MODE);
+ _options.push_back (0);
+
+ snprintf (mode, sizeof (mode), "%d", (int)TOOLBAR_KEYBOARD_MODE);
+ snprintf (option, sizeof (option), "%d", 0);
+
+ String line = isf_combine_ise_info_string (name, uuid, module_name, language,
+ icon, String (mode), String (option), factory->get_locales ());
+ if (fputs (line.c_str (), engine_list_file) < 0) {
+ std::cerr << "write to ise cache file failed:" << line << "\n";
+ break;
+ }
+ }
+ factory.reset ();
+ }
+ }
+ ime_module.unload ();
+ }
+
+ fclose (engine_list_file);
+
+ return true;
+}
+
+/**
+ * @brief Load one helper ISE module.
+ *
+ * @param module_name The helper ISE module name.
+ *
+ * @return true if load module is successful, otherwise return false.
+ */
+static bool add_helper_ise_module (const String module_name)
+{
+ if (module_name.length () <= 0)
+ return false;
+
+ HelperModule helper_module;
+ HelperInfo helper_info;
+
+ String filename = String (USER_ENGINE_FILE_NAME);
+ FILE *engine_list_file = fopen (filename.c_str (), "a");
+ if (engine_list_file == NULL) {
+ std::cerr << "failed to open " << filename << "\n";
+ return false;
+ }
+
+ helper_module.load (module_name);
+ if (helper_module.valid ()) {
+ for (size_t j = 0; j < helper_module.number_of_helpers (); ++j) {
+ helper_module.get_helper_info (j, helper_info);
+ _uuids.push_back (helper_info.uuid);
+ _names.push_back (helper_info.name);
+ _langs.push_back (isf_get_normalized_language (helper_module.get_helper_lang (j)));
+ _module_names.push_back (module_name);
+ _icons.push_back (helper_info.icon);
+ _modes.push_back (TOOLBAR_HELPER_MODE);
+ _options.push_back (helper_info.option);
+
+ char mode[12];
+ char option[12];
+ snprintf (mode, sizeof (mode), "%d", (int)TOOLBAR_HELPER_MODE);
+ snprintf (option, sizeof (option), "%d", helper_info.option);
+
+ String line = isf_combine_ise_info_string (helper_info.name, helper_info.uuid, module_name, isf_get_normalized_language (helper_module.get_helper_lang (j)),
+ helper_info.icon, String (mode), String (option), String (""));
+ if (fputs (line.c_str (), engine_list_file) < 0) {
+ std::cerr << "write to ise cache file failed:" << line << "\n";
+ break;
+ }
+ }
+ helper_module.unload ();
+ }
+
+ fclose (engine_list_file);
+
+ return true;
+}
+
+/**
+ * @brief Update ISEs information for ISE is added or removed.
+ *
+ * @param type The load ISE type.
+ * @param config The config pointer for loading keyboard ISE.
+ *
+ * @return true if ISEs list is changed, otherwise return false.
+ */
+bool isf_update_ise_list (LOAD_ISE_TYPE type, const ConfigPointer &config)
+{
+ bool ret = false;
+
+ std::vector<String> helper_list;
+ scim_get_helper_module_list (helper_list);
+
+ _current_modules_list.clear ();
+
+ /* Check keyboard ISEs */
+ if (type != HELPER_ONLY) {
+ _current_modules_list.push_back (ENGLISH_KEYBOARD_MODULE);
+ std::vector<String> imengine_list;
+ scim_get_imengine_module_list (imengine_list);
+ for (size_t i = 0; i < imengine_list.size (); ++i) {
+ _current_modules_list.push_back (imengine_list [i]);
+ if (std::find (_module_names.begin (), _module_names.end (), imengine_list [i]) == _module_names.end ()) {
+ if (add_keyboard_ise_module (imengine_list [i], config))
+ ret = true;
+ }
+ }
+ }
+
+ /* Check helper ISEs */
+ for (size_t i = 0; i < helper_list.size (); ++i) {
+ _current_modules_list.push_back (helper_list [i]);
+ if (std::find (_module_names.begin (), _module_names.end (), helper_list [i]) == _module_names.end ()) {
+ if (add_helper_ise_module (helper_list [i]))
+ ret = true;
+ }
+ }
+
+ /* Update _groups */
+ if (ret) {
+ std::vector<String> ise_langs;
+ for (size_t i = 0; i < _uuids.size (); ++i) {
+ scim_split_string_list (ise_langs, _langs[i]);
+ for (size_t j = 0; j < ise_langs.size (); j++) {
+ if (std::find (_groups[ise_langs[j]].begin (), _groups[ise_langs[j]].end (), i) == _groups[ise_langs[j]].end ())
+ _groups[ise_langs[j]].push_back (i);
+ }
+ ise_langs.clear ();
+ }
+ }
+
+ /* When load ise list is empty, all ISEs can be loaded. */
+ _load_ise_list.clear ();
+ return ret;
+}
+
+/**
+ * @brief Set language as specific language.
+ *
+ * @param language The specific language.
+ */
+void isf_set_language (String language)
+{
+ if (language.length () <= 0)
+ return;
+
+ std::vector<String> langlist, all_langs;
+ if (language == String ("Automatic")) {
+ _disabled_langs.clear ();
+ _disabled_langs_bak.clear ();
+ } else {
+ scim_split_string_list (langlist, language);
+ isf_get_all_languages (all_langs);
+
+ _disabled_langs.clear ();
+ _disabled_langs_bak.clear ();
+
+ for (unsigned int i = 0; i < all_langs.size (); i++) {
+ if (std::find (langlist.begin (), langlist.end (), all_langs[i]) == langlist.end ()) {
+ _disabled_langs.push_back (all_langs[i]);
+ _disabled_langs_bak.push_back (all_langs[i]);
+ }
+ }
+ }
+ scim_global_config_write (String (SCIM_GLOBAL_CONFIG_DISABLED_LANGS), _disabled_langs);
+
+ std::vector<String> enable_langs;
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ String lang_name = scim_get_language_name (it->first);
+ if (std::find (_disabled_langs.begin (), _disabled_langs.end (), lang_name) == _disabled_langs.end ())
+ enable_langs.push_back (lang_name);
+ }
+ scim_global_config_write (String (SCIM_GLOBAL_CONFIG_ISF_DEFAULT_LANGUAGES), enable_langs);
+ scim_global_config_flush ();
+}
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Haifeng Deng <haifeng.deng@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __ISF_PANEL_UTILITY_H
+#define __ISF_PANEL_UTILITY_H
+
+using namespace scim;
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Declaration of macro.
+/////////////////////////////////////////////////////////////////////////////
+#define ENGLISH_KEYBOARD_MODULE "English/Keyboard"
+
+
+#define EFL_CANDIDATE_BG (SCIM_DATADIR "/pixmaps/08_textinput_panel_bg.png")
+
+#ifndef VCONFKEY_ISF_INPUT_LANG_STR
+#define VCONFKEY_ISF_PREFIX "db/isf"
+#define VCONFKEY_ISF_INPUT_LANG_STR (VCONFKEY_ISF_PREFIX "/input_lang")
+#endif
+#ifndef VCONFKEY_LANGSET
+#define VCONFKEY_LANGSET "db/menu_widget/language"
+#endif
+#ifndef VCONFKEY_THEME
+#define VCONFKEY_THEME "db/setting/selected_theme"
+#endif
+
+
+#if SCIM_USE_STL_EXT_HASH_MAP
+typedef __gnu_cxx::hash_map <String, std::vector <size_t>, scim_hash_string> MapStringVectorSizeT;
+typedef std::map <String, std::vector <String> > MapStringVectorString;
+typedef std::map <String ,String> MapStringString;
+#elif SCIM_USE_STL_HASH_MAP
+typedef std::hash_map <String, std::vector <size_t>, scim_hash_string> MapStringVectorSizeT;
+typedef std::map <String, std::vector <String> > MapStringVectorString;
+typedef std::map <String ,String> MapStringString;
+#else
+typedef std::map <String, std::vector <size_t> > MapStringVectorSizeT;
+typedef std::map <String, std::vector <String> > MapStringVectorString;
+typedef std::map <String ,String> MapStringString;
+#endif
+
+typedef enum {
+ ALL_ISE = 0,
+ HELPER_ONLY,
+ TYPE_END
+} LOAD_ISE_TYPE;
+
+void isf_get_all_languages (std::vector<String> &all_langs);
+void isf_get_enabled_languages (std::vector<String> &enabled_langs);
+
+void isf_get_enabled_ise_names_in_languages (std::vector<String> lang_list, std::vector<String> &ise_names);
+
+void isf_get_keyboard_ise (String &ise_uuid, String &ise_name, const ConfigPointer &config);
+void isf_get_keyboard_names_in_languages (std::vector<String> lang_list, std::vector<String> &keyboard_names);
+void isf_get_keyboard_uuids_in_languages (std::vector<String> lang_list, std::vector<String> &keyboard_uuids);
+
+void isf_get_helper_names_in_languages (std::vector<String> lang_list, std::vector<String> &helper_names);
+
+void isf_save_ise_information (void);
+void isf_load_ise_information (LOAD_ISE_TYPE type, const ConfigPointer &config);
+bool isf_update_ise_list (LOAD_ISE_TYPE type, const ConfigPointer &config);
+
+void isf_set_language (String language);
+
+#endif /* __ISF_PANEL_UTILITY_H */
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+MAINTAINERCLEANFILES = Makefile.in\r
+CLEANFILES = *.bak\r
+\r
+INCLUDES = -I$(top_builddir) \\r
+ -I$(top_builddir)/ism/src \\r
+ -I$(top_srcdir) \\r
+ -I$(top_srcdir)/ism/src \\r
+ -I$(top_srcdir)/ism/intl \\r
+ -I$(top_srcdir)/ism/data \\r
+ -I$(top_srcdir)/ism/utils \\r
+ -I$(top_srcdir)/ism/extras/efl_setting/include \\r
+ -I$(includedir) \\r
+ -DSCIM_DATADIR=\"@SCIM_DATADIR@\" \\r
+ -DSCIM_LOCALEDIR=\"@SCIM_LOCALEDIR@\" \\r
+ -DSCIM_SYSCONFDIR=\"@SCIM_SYSCONFDIR@\" \\r
+ -DSCIM_LIBEXECDIR=\"@SCIM_LIBEXECDIR@\" \\r
+ -DSCIM_ICONDIR=\"@SCIM_ICONDIR@\" \\r
+ -DSCIM_MODULE_PATH=\"@SCIM_MODULE_PATH@\" \\r
+ -DSCIM_TEMPDIR=\"@SCIM_TEMPDIR@\"\r
+\r
+\r
+noinst_HEADERS =\r
+\r
+moduledir = /opt/ug/lib\r
+module_LTLIBRARIES = libug-isfsetting-efl.la libug-keyboard-setting-wizard-efl.la\r
+libug_isfsetting_efl_la_SOURCES = isf_setting_efl.cpp \\r
+ scim_setup_module_efl.cpp \\r
+ ../efl_panel/isf_panel_utility.cpp\r
+\r
+libug_isfsetting_efl_la_CXXFLAGS = @EFL_CFLAGS@ \\r
+ @VCONF_CFLAGS@ \\r
+ @UIGADGET_CFLAGS@\r
+\r
+libug_isfsetting_efl_la_LDFLAGS = -avoid-version \\r
+ -export-dynamic \\r
+ -rpath $(moduledir)\r
+\r
+libug_isfsetting_efl_la_LIBADD = @LIBTOOL_EXPORT_OPTIONS@ \\r
+ @LTLIBINTL@ \\r
+ @EFL_LIBS@ \\r
+ @VCONF_LIBS@ \\r
+ @UIGADGET_LIBS@ \\r
+ $(top_builddir)/ism/src/libscim@SCIM_EPOCH@.la \\r
+ $(top_builddir)/ism/extras/efl_immodule/libisf-imf-module.la\r
+\r
+libug_keyboard_setting_wizard_efl_la_SOURCES = isf_setting_wizard.cpp \\r
+ ../efl_panel/isf_panel_utility.cpp\r
+\r
+libug_keyboard_setting_wizard_efl_la_CXXFLAGS = @EFL_CFLAGS@ \\r
+ @VCONF_CFLAGS@ \\r
+ @DLOG_CFLAGS@\r
+\r
+libug_keyboard_setting_wizard_efl_la_LDFLAGS = -avoid-version \\r
+ -export-dynamic \\r
+ -rpath $(moduledir)\r
+\r
+libug_keyboard_setting_wizard_efl_la_LIBADD = @LIBTOOL_EXPORT_OPTIONS@ \\r
+ @LTLIBINTL@ \\r
+ @EFL_LIBS@ \\r
+ @VCONF_LIBS@ \\r
+ @DLOG_LIBS@ \\r
+ @UIGADGET_LIBS@ \\r
+ $(top_builddir)/ism/src/libscim@SCIM_EPOCH@.la \\r
+ $(top_builddir)/ism/extras/efl_immodule/libisf-imf-module.la\r
+\r
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __ISF_SETTING_EFL_H
+#define __ISF_SETTING_EFL_H
+enum
+{
+ TYPE_KEY_END = 0,
+ //add more here
+};
+
+struct ug_data {
+ Evas_Object *layout_main;
+ Evas_Object *naviframe;
+ Evas_Object *opt_eo;
+ Elm_Genlist_Item *sw_ise_item_tizen; //sw
+ Elm_Genlist_Item *hw_ise_item_tizen; //hw
+ Elm_Genlist_Item *sw_ise_opt_item_tizen; //sw opt
+ Elm_Genlist_Item *hw_ise_opt_item_tizen; //hw opt
+ void (*key_end_cb)(void *, Evas_Object *, void *);
+ struct ui_gadget *ug;
+};
+
+#endif /* __ISF_SETTING_EFL_H */
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __ISF_SETTING_WIZARD_H
+#define __ISF_SETTING_WIZARD_H
+
+#define ISF_HEADER_CANCEL_ICON (SCIM_ICONDIR "/01_header_icon_cancel.png")
+#define ISF_HEADER_DONE_ICON (SCIM_ICONDIR "/01_header_icon_done.png")
+
+struct ug_data {
+ Evas_Object *layout_main;
+ Evas_Object *naviframe;
+ bundle *data;
+ struct ui_gadget *ug;
+};
+
+#endif /* __ISF_SETTING_WIZARD_H */
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
+
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_setup_module.h,v 1.9 2005/01/10 08:30:45 suzhe Exp $
+ */
+
+#if !defined (__SCIM_SETUP_MODULE_EFL_H)
+#define __SCIM_SETUP_MODULE_EFL_H
+
+
+#include <Elementary.h>
+#include <string.h>
+
+using namespace scim;
+typedef Evas_Object * (*SetupModuleCreateUIFunc) (Evas_Object *parent,Evas_Object *layout);
+typedef String (*SetupModuleGetCategoryFunc) (void);
+typedef String (*SetupModuleGetNameFunc) (void);
+typedef String (*SetupModuleGetDescriptionFunc) (void);
+typedef void (*SetupModuleLoadConfigFunc) (const ConfigPointer &config);
+typedef void (*SetupModuleSaveConfigFunc) (const ConfigPointer &config);
+typedef bool (*SetupModuleQueryChangedFunc) (void);
+typedef bool (*SetupModuleKeyProceedingFunc) (int);
+typedef bool (*SetupModuleOptionResetFunc) (const ConfigPointer &config);
+
+class SetupModule
+{
+ Module m_module;
+
+ SetupModuleCreateUIFunc m_create_ui;
+ SetupModuleGetCategoryFunc m_get_category;
+ SetupModuleGetNameFunc m_get_name;
+ SetupModuleGetDescriptionFunc m_get_description;
+ SetupModuleLoadConfigFunc m_load_config;
+ SetupModuleSaveConfigFunc m_save_config;
+ SetupModuleQueryChangedFunc m_query_changed;
+ SetupModuleKeyProceedingFunc m_key_proceeding;
+ SetupModuleOptionResetFunc m_option_reset;
+
+ SetupModule (const SetupModule &);
+ SetupModule & operator= (const SetupModule &);
+
+public:
+ SetupModule ();
+ SetupModule (const String &name);
+
+ bool load (const String &name);
+ bool unload();
+ bool valid () const;
+
+ Evas_Object * create_ui (Evas_Object *,Evas_Object *) const;
+
+ String get_category () const;
+ String get_name () const;
+ String get_description () const;
+
+ void load_config (const ConfigPointer &config) const;
+ void save_config (const ConfigPointer &config) const;
+
+ bool query_changed () const;
+ bool key_proceeding (int)const;
+ bool option_reset (const ConfigPointer &config) const;
+};
+
+int scim_get_setup_module_list (std::vector <String>& mod_list);
+
+#endif // __SCIM_SETUP_MODULE_EFL_H
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef UG_MODULE_API
+#define UG_MODULE_API __attribute__ ((visibility("default")))
+#endif
+
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_SCIM_HELPER_MODULE
+
+#define SINGLE_SELECTION
+
+#include <stdio.h>
+#include <Elementary.h>
+#include <Ecore_IMF.h>
+#include <Ecore_X.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <vconf-keys.h>
+#include <vconf.h>
+#include <ui-gadget-module.h>
+#include <ui-gadget.h>
+#include "scim.h"
+#include "scim_stl_map.h"
+#include "isf_setting_efl.h"
+#include "../efl_panel/isf_panel_utility.h"
+#include "scim_setup_module_efl.h"
+#include "isf_control.h"
+
+
+using namespace scim;
+
+
+#define SETTING_AUTO_CAPITALIZATION "isfsetting/auto_capitalization"
+#define SETTING_SW_KEYBOARD_CONNECTION "isfsetting/sw_keyboard_connection"
+
+#define _EDJ(x) elm_layout_edje_get(x)
+#define ISF_SETTING_EDJ (SCIM_DATADIR "/isfsetting.edj")
+#define PADDING_X 25
+
+#define SETTING_PACKAGE "isfsetting-efl"
+#define SETTING_LOCALEDIR "/opt/ug/res/locale"
+#define _T(s) dgettext(SETTING_PACKAGE, s)
+
+
+enum {
+ F_CONNECTION_AUTO = 0,
+ F_CONNECTION_ALWAYS_USED,
+ F_CONNECTION_END,
+};
+
+enum {
+ TYPE_PHONEPAD = 0,
+ TYPE_QWERTY,
+ TYPE_KEYBOARD_END,
+};
+
+enum
+{
+ AUTO_CAPITALIZATION_ITEM =0,
+ SW_KEYBOARD_GROUP_TITLE_ITEM,
+ SW_KEYBOARD_SEL_ITEM,
+ SW_ISE_OPTION_ITEM,
+ HW_KEYBOARD_GROUP_TITLE_ITEM,
+ HW_KEYBOARD_SEL_ITEM,
+ HW_ISE_OPTION_ITEM,
+ ITEM_TOTAL_COUNT
+};
+
+struct ItemData
+{
+ char *text;
+ char *sub_text;
+ int mode;
+};
+
+static struct ug_data *common_ugd ;
+static ItemData *p_items[ITEM_TOTAL_COUNT] ;
+static Elm_Genlist_Item_Class itc1, itc2, itc3, itc4 ,itc5, itcTitle, itcSeparator;
+static int mark = 0;
+static int hw_mark = 0;
+static Ecore_Event_Handler *_prop_change_handler = NULL;
+static Ecore_X_Atom prop_x_ext_keyboard_exist = 0;
+static Ecore_X_Window _rootwin;
+static unsigned int hw_kbd_num = 0;
+
+#ifndef SINGLE_SELECTION
+static Evas_Object *default_ise_item = NULL;
+static std::vector<String> enable_uuid_list;
+static String _default_ise_uuid;
+#endif
+
+static bool is_hw_connected = false;
+static Evas_Object *hw_radio_grp = NULL;
+static std::vector<String> hw_iselist;
+
+static char hw_ise_bak[256] = {'\0'};
+static char _active_hw_ise_name[256] = {'\0'};
+
+static Ecore_IMF_Context *imf_context = NULL;
+static SetupModule *mdl = NULL;
+static Evas_Object *sw_radio_grp = NULL; //test view raido group
+static std::vector<String> sw_iselist;
+
+static Eina_Bool f_auto_capitalization = EINA_FALSE;
+
+static ConfigPointer _config;
+static char ise_bak[256] = {'\0'};
+static char _active_ise_name[256] = {'\0'};
+
+extern std::vector <String> _names;
+extern std::vector <String> _uuids;
+extern std::vector <String> _module_names;
+extern std::vector <String> _langs;
+
+
+static Evas_Object *_gl_icon_get(void *data, Evas_Object *obj, const char *part);
+static char *_gl_label_get(void *data, Evas_Object *obj, const char *part);
+static Eina_Bool _gl_state_get(void *data, Evas_Object *obj, const char *part);
+static void _gl_del(void *data, Evas_Object *obj);
+static void _gl_sel(void *data, Evas_Object *obj, void *event_info);
+static void _gl_sw_ise_sel(void *data, Evas_Object *obj, void *event_info);
+static void _gl_hw_ise_sel(void *data, Evas_Object *obj, void *event_info);
+static void _gl_keyboard_sel(void *data, Evas_Object *obj, void *event_info);
+static char *_gl_exp_sw_label_get(void *data, Evas_Object *obj, const char *part);
+static Evas_Object *_gl_exp_sw_icon_get(void *data, Evas_Object *obj, const char *part);
+static void sw_keyboard_selection_view_tizen(ug_data * ugd);
+static void hw_keyboard_selection_view_tizen(ug_data * ugd);
+static void show_ise_option_module(ug_data *ugd , const char *isename);
+static void _hw_radio_cb (void *data, Evas_Object *obj, void *event_info);
+
+static Evas_Object *_create_bg(Evas_Object *win)
+{
+ Evas_Object *bg = elm_bg_add(win);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(bg);
+ return bg;
+}
+
+static Evas_Object *create_fullview (Evas_Object *parent, struct ug_data *ugd)
+{
+ Evas_Object *bg = _create_bg(parent);
+ Evas_Object *layout_main = NULL;
+ layout_main = elm_layout_add (parent);
+
+ if (layout_main == NULL)
+ return NULL;
+
+ elm_layout_theme_set (layout_main, "layout", "application", "default");
+ elm_object_style_set(bg, "group_list");
+ elm_object_part_content_set (layout_main, "elm.swallow.bg", bg);
+
+ return layout_main;
+}
+
+static Evas_Object *create_frameview (Evas_Object *parent, struct ug_data *ugd)
+{
+ Evas_Object *bg = _create_bg(parent);
+ Evas_Object *layout_main = elm_layout_add (parent);
+ if (layout_main == NULL)
+ return NULL;
+
+ elm_layout_theme_set (layout_main, "layout", "application", "default");
+ elm_object_style_set(bg, "group_list");
+ elm_object_part_content_set (layout_main, "elm.swallow.bg", bg);
+ return layout_main;
+}
+
+static bool in_exit = false;
+static void back_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ if (in_exit)
+ return;
+ in_exit = true;
+
+ if (data == NULL)
+ return;
+ struct ug_data *ugd = (struct ug_data *)data;
+ ug_destroy_me (ugd->ug);
+}
+
+static Evas_Object* _create_naviframe_layout (Evas_Object* parent)
+{
+ Evas_Object *naviframe = elm_naviframe_add (parent);
+ elm_object_part_content_set (parent, "elm.swallow.content", naviframe);
+ evas_object_show (naviframe);
+
+ return naviframe;
+}
+
+#ifndef SINGLE_SELECTION
+static void _ise_onoff_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ int i = (int)data;
+ if (elm_check_state_get (obj) == EINA_FALSE) {
+ // remove the uuid from enable_uuid_list
+ std::vector<String>::iterator it;
+ it = std::find (enable_uuid_list.begin (), enable_uuid_list.end (), _uuids[i]);
+ enable_uuid_list.erase (it);
+ } else {
+ //add the uuid into the disable_uuid_list
+ enable_uuid_list.push_back (_uuids[i]);
+ }
+
+ //check if the active keyboard num == 0?
+ int num = enable_uuid_list.size ();
+ if (num == 0) {
+ //search the DEFAULT_ISE onoff check and set it on
+ elm_check_state_set (default_ise_item, EINA_TRUE);
+ enable_uuid_list.push_back (_default_ise_uuid);
+ }
+}
+#endif
+
+static void set_autocap_mode()
+{
+ if (vconf_set_bool (VCONFKEY_SETAPPL_AUTOCAPITAL_ALLOW_BOOL, f_auto_capitalization) == -1)
+ printf("Failed to set vconf autocapital\n");
+}
+
+static void _onoff_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ int index = (int)data;
+
+ if (index == AUTO_CAPITALIZATION_ITEM) {
+ if (elm_check_state_get (obj) == EINA_TRUE)
+ f_auto_capitalization = EINA_TRUE;
+ else
+ f_auto_capitalization = EINA_FALSE;
+
+ set_autocap_mode();
+ }
+}
+
+static String uuid_to_name(String uuid)
+{
+ String tmpName("");
+ for(unsigned int i = 0;i<_uuids.size();i++)
+ {
+ if (strcmp(uuid.c_str(),_uuids[i].c_str())== 0) {
+ tmpName = _names[i];
+ break;
+ }
+ }
+ return tmpName;
+}
+
+static String name_to_uuid(String name)
+{
+ String tmpUuid("");
+ for(unsigned int i = 0;i<_names.size();i++)
+ {
+ if (strcmp(name.c_str(),_names[i].c_str())== 0) {
+ tmpUuid = _uuids[i];
+ break;
+ }
+ }
+ return tmpUuid;
+}
+
+static void sw_keyboard_selection_view_back_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ if (data == NULL)
+ return;
+
+ struct ug_data *ugd = (struct ug_data *)data;
+#ifndef SINGLE_SELECTION
+ String tmpStr = _config->read(SCIM_CONFIG_DEFAULT_HELPER_ISE, String("b70bf6cc-ff77-47dc-a137-60acc32d1e0c"));
+ snprintf (_active_ise_name, sizeof (_active_ise_name), "%s", (uuid_to_name(tmpStr)).c_str());
+
+ String ise_uuid;
+ for (int i = 0; i< _names.size (); i++) {
+ if (strcmp (_active_ise_name, _names[i].c_str ()) == 0) {
+ ise_uuid = _uuids[i];
+ break;
+ }
+ }
+
+ if (std::find (enable_uuid_list.begin (), enable_uuid_list.end (), ise_uuid) == enable_uuid_list.end ()) {
+ int next;
+ String next_ise_uuid;
+ String next_ise;
+ //active next
+ for (int i = 0; i < sw_iselist.size (); i++) {
+ if (strcmp (_active_ise_name, sw_iselist[i].c_str ()) == 0) {
+ next = i + 1;
+ break;
+ }
+ }
+ if (next >= sw_iselist.size ())
+ next = 0;
+ next_ise = sw_iselist[next];
+ for (int i = 0; i < _names.size (); i++) {
+ if (strcmp (next_ise.c_str (), _names[i].c_str ()) == 0) {
+ next_ise_uuid = _uuids[i];
+ break;
+ }
+ }
+
+ while (std::find (enable_uuid_list.begin (), enable_uuid_list.end (), next_ise_uuid) == enable_uuid_list.end ()) {
+ next ++;
+ if (next >= sw_iselist.size ())
+ next = 0;
+
+ next_ise = sw_iselist[next];
+ for (int i = 0; i < _names.size (); i++) {
+ if (strcmp (next_ise.c_str (), _names[i].c_str ()) == 0) {
+ next_ise_uuid = _uuids[i];
+ break;
+ }
+ }
+ }
+
+ isf_control_set_active_ise_by_uuid (next_ise_uuid.c_str ());
+ }
+
+ _config->write (SCIM_CONFIG_ENABLED_ISE_UUID_LIST, enable_uuid_list);
+ _config->flush ();
+
+ int num = enable_uuid_list.size ();
+
+ char tx[100] = {'\0'};
+ snprintf (tx, sizeof (tx), "%d", num);
+ edje_object_part_text_set (_EDJ (ugd->sw_ise_di), "on_off_text", tx);
+#else
+ snprintf (_active_ise_name, sizeof (_active_ise_name), "%s", ise_bak);
+#endif
+
+ ugd->key_end_cb = back_cb;
+}
+
+static void update_isf_setting_main_view(ug_data *ugd)
+{
+ p_items[SW_KEYBOARD_SEL_ITEM]->sub_text = strdup(_active_ise_name);
+ elm_genlist_item_data_set(ugd->sw_ise_item_tizen,p_items[SW_KEYBOARD_SEL_ITEM]);
+ p_items[HW_KEYBOARD_SEL_ITEM]->sub_text = strdup(_active_hw_ise_name);
+ elm_genlist_item_data_set(ugd->hw_ise_item_tizen,p_items[HW_KEYBOARD_SEL_ITEM]);
+}
+
+static void sw_keyboard_selection_view_set_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ if (data == NULL)
+ return;
+
+ struct ug_data *ugd = (struct ug_data *)data;
+
+ if (strcmp (ise_bak, _active_ise_name) != 0) {
+ //if _active_ise_name is changed , active _active_ise_name.
+ //find the uuid of the active
+ String uuid;
+ for (unsigned int i = 0; i < _names.size (); i++) {
+ if (strcmp (_names[i].c_str (), _active_ise_name) == 0)
+ uuid = _uuids[i];
+ }
+ isf_control_set_active_ise_by_uuid (uuid.c_str ());
+
+ snprintf (ise_bak, sizeof (ise_bak), "%s", _active_ise_name);
+ }
+
+ update_isf_setting_main_view(ugd);
+
+ ugd->key_end_cb = back_cb;
+}
+
+static void set_active_ise(int index)
+{
+ snprintf (_active_ise_name, sizeof (_active_ise_name), "%s", sw_iselist[index].c_str ());
+}
+
+static void _sw_radio_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ int index = GPOINTER_TO_INT(data);
+ elm_radio_value_set (sw_radio_grp, index);
+ set_active_ise(index);
+}
+
+static void lang_view_back_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ common_ugd->key_end_cb = sw_keyboard_selection_view_set_cb ;
+}
+
+static void show_lang_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ int index = GPOINTER_TO_INT(data);
+ String langlist_str,normal_langlist_str;
+ for (unsigned int i = 0; i < _names.size (); i++) {
+ if (strcmp (_names[i].c_str (), sw_iselist[index].c_str()) == 0)
+ langlist_str = _langs[i];
+ }
+ std::vector<String> langlist_vec,normal_langlist_vec;
+ scim_split_string_list(langlist_vec,langlist_str);
+ normal_langlist_str = ((scim_get_language_name(langlist_vec[0].c_str())).c_str()) ;
+ for (unsigned int i = 1;i<langlist_vec.size();i++) {
+ normal_langlist_str += String(", ");
+ normal_langlist_str += ((scim_get_language_name(langlist_vec[i].c_str())).c_str());
+ }
+
+ Evas_Object *scroller = elm_scroller_add(common_ugd->naviframe);
+ elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_FALSE);
+
+ Evas_Object* layout = elm_layout_add(common_ugd->naviframe);
+ elm_layout_file_set(layout, ISF_SETTING_EDJ, "isfsetting/languageview");
+
+ Evas_Object *label = elm_label_add(layout);
+ elm_label_line_wrap_set(label, ELM_WRAP_WORD);
+
+ Evas_Coord win_w = 0, win_h = 0;
+ ecore_x_window_size_get(ecore_x_window_root_first_get(), &win_w, &win_h);
+ elm_label_wrap_width_set(label, win_w - PADDING_X * 2);
+ elm_object_text_set(label, normal_langlist_str.c_str());
+ elm_object_part_content_set(layout, "content", label);
+
+ elm_object_content_set (scroller, layout);
+
+ //Push the layout along with function buttons and title
+ Elm_Object_Item *it = elm_naviframe_item_push(common_ugd->naviframe, _T(sw_iselist[index].c_str()), NULL, NULL, scroller, NULL);
+
+ Evas_Object *back_btn = elm_object_item_content_part_get (it, ELM_NAVIFRAME_ITEM_PREV_BTN);
+ evas_object_smart_callback_add (back_btn, "clicked", lang_view_back_cb, NULL);
+
+ common_ugd->key_end_cb = lang_view_back_cb;
+}
+
+static char *_gl_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ ItemData *item_data = (ItemData *)data;
+ if (!strcmp(part, "elm.text")) {
+ return strdup(item_data->text);
+ }
+ if (!strcmp(part,"elm.text.1")) {
+ return strdup(item_data->text);
+ }
+ if (!strcmp(part , "elm.text.2")) {
+ return strdup (item_data->sub_text);
+ }
+ return NULL;
+}
+
+static Evas_Object *_gl_icon_get(void *data, Evas_Object *obj, const char *part)
+{
+ ItemData *item_data = (ItemData *)data;
+
+ if (!strcmp(part, "elm.icon")) {
+ Evas_Object *onoff_ck = elm_check_add(obj);
+ elm_object_style_set (onoff_ck, "on&off");
+ if (item_data->mode == AUTO_CAPITALIZATION_ITEM) {
+ elm_check_state_set(onoff_ck,f_auto_capitalization);
+ }
+ evas_object_smart_callback_add (onoff_ck, "changed", _onoff_cb, (void *)(item_data->mode));
+ return onoff_ck;
+ }
+
+ return NULL;
+}
+
+static Eina_Bool _gl_state_get(void *data, Evas_Object *obj, const char *part)
+{
+ return EINA_FALSE;
+}
+
+static void _gl_del(void *data, Evas_Object *obj)
+{
+ return;
+}
+
+static void _gl_sw_ise_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ Elm_Genlist_Item *item = (Elm_Genlist_Item *)event_info;
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+
+ mark = (int) (data);
+ set_active_ise(mark);
+
+ elm_genlist_item_update(item);
+
+ return;
+}
+
+static void _gl_hw_ise_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ Elm_Genlist_Item *item = (Elm_Genlist_Item *)event_info;
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+
+ hw_mark = (int) (data);
+ snprintf (_active_hw_ise_name, sizeof (_active_hw_ise_name), "%s", hw_iselist[hw_mark].c_str ());
+
+ elm_genlist_item_update(item);
+
+ return;
+}
+
+static void _gl_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ Elm_Genlist_Item *item = (Elm_Genlist_Item *)event_info;
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+
+ int id = (int) (data);
+
+ if (id == AUTO_CAPITALIZATION_ITEM) {
+ f_auto_capitalization = (f_auto_capitalization == EINA_TRUE? EINA_FALSE:EINA_TRUE);
+ set_autocap_mode();
+ }
+
+ elm_genlist_item_update(item);
+
+ return;
+}
+
+static void _gl_keyboard_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ Elm_Genlist_Item *item = (Elm_Genlist_Item *)event_info;
+ ug_data *ugd = (ug_data *)data;
+ if (item == ugd->sw_ise_item_tizen)
+ sw_keyboard_selection_view_tizen (ugd);
+ if (item == ugd->hw_ise_item_tizen)
+ hw_keyboard_selection_view_tizen(ugd);
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+ return;
+}
+
+static void _gl_ise_option_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ Elm_Genlist_Item *item = (Elm_Genlist_Item *)event_info;
+ ug_data *ugd = (ug_data *)data;
+ const char *isename = NULL;
+ if (item == ugd->sw_ise_opt_item_tizen)
+ isename = _active_ise_name;
+ else
+ isename = _active_hw_ise_name;
+ show_ise_option_module(ugd, isename);
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+}
+
+static char *_gl_exp_sw_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ int index = (int)(data);
+ if (!strcmp(part, "elm.text")) {
+ return strdup(sw_iselist[index].c_str());
+ }
+ return NULL;
+}
+
+static Evas_Object *_gl_exp_sw_icon_get(void *data, Evas_Object *obj, const char *part)
+{
+ int index = (int)(data);
+ if (!strcmp(part, "elm.icon.1")) {
+ Evas_Object *radio = elm_radio_add (obj);
+ elm_radio_state_value_set (radio, index);
+ if (sw_radio_grp == NULL)
+ sw_radio_grp = elm_radio_add(obj);
+ elm_radio_group_add (radio, sw_radio_grp);
+ evas_object_show (radio);
+ evas_object_smart_callback_add (radio, "changed", _sw_radio_cb, (void *) (index));
+ if (mark == index) {
+ elm_radio_value_set (sw_radio_grp, mark);
+ }
+ return radio;
+ }
+ if (!strcmp(part,"elm.icon.2")) {
+ Evas_Object *icon = elm_button_add(obj);
+ elm_object_style_set(icon, "reveal");
+ evas_object_smart_callback_add (icon, "clicked", show_lang_cb, (void *)(index));
+ evas_object_propagate_events_set (icon, EINA_FALSE);//not propagate to genlist item.
+ return icon;
+ }
+ return NULL;
+}
+
+static char *_gl_exp_hw_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ int index = (int)(data);
+ if (!strcmp(part, "elm.text")) {
+ return strdup(hw_iselist[index].c_str());
+ }
+ return NULL;
+}
+
+static Evas_Object *_gl_exp_hw_icon_get(void *data, Evas_Object *obj, const char *part)
+{
+ if (!strcmp(part, "elm.icon")) {
+ int index = (int)(data);
+ Evas_Object *radio = elm_radio_add (obj);
+ elm_radio_state_value_set (radio, index);
+ if (hw_radio_grp == NULL)
+ hw_radio_grp = elm_radio_add(obj);
+ elm_radio_group_add (radio, hw_radio_grp);
+ evas_object_show (radio);
+ evas_object_smart_callback_add (radio, "changed", _hw_radio_cb, (void *) (index));
+ if (hw_mark == index) {
+ elm_radio_value_set (hw_radio_grp, hw_mark);
+ }
+ return radio;
+ }
+ return NULL;
+}
+
+static void sw_keyboard_selection_view_tizen(ug_data * ugd)
+{
+ ugd->key_end_cb = sw_keyboard_selection_view_back_cb;
+
+ if (sw_radio_grp != NULL)
+ {
+ evas_object_del(sw_radio_grp);
+ sw_radio_grp = NULL;
+ }
+
+ Evas_Object *genlist = elm_genlist_add (ugd->naviframe);
+ evas_object_show (genlist);
+
+ //Push the layout along with function buttons and title
+ Elm_Object_Item *it = elm_naviframe_item_push(ugd->naviframe, _T("Selection"), NULL, NULL, genlist, NULL);
+
+ Evas_Object *back_btn = elm_object_item_content_part_get (it, ELM_NAVIFRAME_ITEM_PREV_BTN);
+ evas_object_smart_callback_add (back_btn, "clicked", sw_keyboard_selection_view_set_cb, ugd);
+
+ unsigned int i = 0;
+
+ sw_iselist.clear();
+ std::vector<String> selected_langs, all_langs;
+
+ isf_get_all_languages (all_langs);
+ isf_get_helper_names_in_languages (all_langs, sw_iselist);
+ std::sort (sw_iselist.begin (), sw_iselist.end ());
+
+ if (sw_iselist.size () > 0) {
+ // Set item class for dialogue group seperator
+ itcSeparator.item_style = "dialogue/separator/21/with_line";
+ itcSeparator.func.label_get = NULL;
+ itcSeparator.func.icon_get = NULL;
+ itcSeparator.func.state_get = NULL;
+ itcSeparator.func.del = NULL;
+
+ //separator
+ Elm_Genlist_Item *item;
+ item = elm_genlist_item_append(
+ genlist, // genlist object
+ &itcSeparator, // item class
+ NULL, // data
+ NULL,
+ ELM_GENLIST_ITEM_NONE,
+ NULL,
+ NULL);
+ elm_genlist_item_display_only_set(item, EINA_TRUE);
+ }
+
+ for (i = 0; i < sw_iselist.size (); i++) {
+ if (strcmp (_active_ise_name, sw_iselist[i].c_str ()) == 0) {
+ mark = i;
+ break;
+ }
+ }
+
+ //set item class for 1text.1icon(text+radiobutton)
+ itc4.item_style = "dialogue/1text.2icon.2";
+ itc4.func.label_get = _gl_exp_sw_label_get;
+ itc4.func.icon_get = _gl_exp_sw_icon_get;
+ itc4.func.state_get = _gl_state_get;
+ itc4.func.del = _gl_del;
+ for (i = 0;i < sw_iselist.size();i++) {
+ elm_genlist_item_append(genlist, &itc4,
+ (void *)(i), NULL, ELM_GENLIST_ITEM_NONE, _gl_sw_ise_sel,
+ (void *)(i));
+ }
+}
+
+static void response_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ if ((int)event_info != 5)
+ evas_object_del (obj);
+}
+
+//for naviframe l_btn
+static void ise_option_view_set_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ if (!data)
+ return;
+
+ struct ug_data *ugd = (struct ug_data *)data;
+ ugd->key_end_cb = back_cb;
+ mdl->save_config (_config);
+ _config->reload ();
+
+ String display_name = String (":13");
+ const char *p = getenv ("DISPLAY");
+ if (p != NULL)
+ display_name = String (p);
+ HelperAgent helper_agent;
+ HelperInfo helper_info ("ff110940-b8f0-4062-9ff6-a84f4f3setup", "ISF Setting", "", "", SCIM_HELPER_STAND_ALONE);
+ int id = helper_agent.open_connection (helper_info, display_name);
+ if (id == -1) {
+ std::cerr << " open_connection failed!!!!!!\n";
+ } else {
+ helper_agent.reload_config ();
+ helper_agent.close_connection ();
+ }
+}
+
+static void show_ise_option_module(ug_data *ugd , const char *isename)
+{
+ String mdl_name;
+ for (unsigned int i = 0; i < _names.size (); i++) {
+ if (strcmp (_names[i].c_str (), isename) == 0)
+ mdl_name = _module_names[i];
+ }
+
+ char module_name[256];
+ snprintf (module_name, sizeof (module_name), "%s-imengine-setup", mdl_name.c_str ());
+ if (mdl)
+ {
+ delete mdl;
+ mdl = NULL;
+ }
+ mdl = new SetupModule (String (module_name));
+ if ( mdl == NULL || !mdl->valid ()) {
+ Evas_Object *popup = elm_popup_add (ugd->naviframe);
+ evas_object_size_hint_weight_set (popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ char tmp[256] = {'\0'};
+ snprintf (tmp,sizeof(tmp),"%s: %s", isename ,_T("No option"));
+ elm_popup_desc_set (popup, tmp);
+ elm_popup_mode_set (popup, ELM_POPUP_TYPE_ALERT);
+ elm_popup_timeout_set (popup, 3.0);
+ evas_object_smart_callback_add (popup, "response", response_cb, NULL);
+ evas_object_show (popup);
+ } else {
+ char title[256];
+ snprintf (title, sizeof(title), _T("Options"));
+ ugd->opt_eo = mdl->create_ui (ugd->layout_main, ugd->naviframe);
+ mdl->load_config (_config);
+
+ Elm_Object_Item *it = elm_naviframe_item_push (ugd->naviframe, title, NULL, NULL, ugd->opt_eo, NULL);
+
+ Evas_Object *back_btn = elm_object_item_content_part_get (it, ELM_NAVIFRAME_ITEM_PREV_BTN);
+ evas_object_smart_callback_add (back_btn, "clicked", ise_option_view_set_cb, ugd);
+ ugd->key_end_cb = ise_option_view_set_cb;
+ }
+}
+
+static void hw_keyboard_selection_view_back_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ if (!data)
+ return;
+
+ struct ug_data *ugd = (struct ug_data *)data;
+
+#ifdef SINGLE_SELECTION
+ snprintf (_active_hw_ise_name, sizeof (_active_hw_ise_name), "%s", hw_ise_bak);
+#endif
+ ugd->key_end_cb = back_cb;
+}
+
+static void hw_keyboard_selection_view_set_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ if (!data)
+ return;
+
+ struct ug_data *ugd = (struct ug_data *)data;
+ if (strcmp (hw_ise_bak, _active_hw_ise_name) != 0) {
+ //if _active_ise_name is changed , active _active_ise_name.
+ //find the uuid of the active
+ String uuid;
+ for (unsigned int i = 0; i < _names.size (); i++) {
+ if (strcmp (_names[i].c_str (), _active_hw_ise_name) == 0)
+ uuid = _uuids[i];
+ }
+ isf_control_set_active_ise_by_uuid (uuid.c_str ());
+ snprintf (hw_ise_bak, sizeof (hw_ise_bak), "%s", _active_hw_ise_name);
+ }
+
+ update_isf_setting_main_view(ugd);
+
+ ugd->key_end_cb = back_cb;
+}
+
+static void _hw_radio_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ int index = GPOINTER_TO_INT(data);
+ elm_radio_value_set (hw_radio_grp, index);
+ snprintf (_active_hw_ise_name, sizeof (_active_hw_ise_name), "%s", hw_iselist[index].c_str ());
+}
+
+static void hw_keyboard_selection_view_tizen(ug_data * ugd)
+{
+ ugd->key_end_cb = hw_keyboard_selection_view_back_cb;
+
+ if (hw_radio_grp != NULL)
+ {
+ evas_object_del(hw_radio_grp);
+ hw_radio_grp = NULL;
+ }
+
+ Evas_Object *genlist = elm_genlist_add(ugd->naviframe);
+ evas_object_show(genlist);
+
+ //Push the layout along with function buttons and title
+ Elm_Object_Item *nf_it = elm_naviframe_item_push(ugd->naviframe, _T("Selection"), NULL, NULL, genlist, NULL);
+
+ Evas_Object *back_btn = elm_object_item_content_part_get (nf_it, ELM_NAVIFRAME_ITEM_PREV_BTN);
+ evas_object_smart_callback_add (back_btn, "clicked", hw_keyboard_selection_view_set_cb, ugd);
+
+ unsigned int i = 0;
+
+ hw_iselist.clear();
+ std::vector<String> selected_langs, all_langs;
+
+ isf_get_all_languages (all_langs);
+ isf_get_keyboard_names_in_languages (all_langs, hw_iselist);
+
+ if (hw_iselist.size () > 0) {
+ // Set item class for dialogue group seperator
+ itcSeparator.item_style = "dialogue/separator/21/with_line";
+ itcSeparator.func.label_get = NULL;
+ itcSeparator.func.icon_get = NULL;
+ itcSeparator.func.state_get = NULL;
+ itcSeparator.func.del = NULL;
+
+ //separator
+ Elm_Genlist_Item *item;
+ item = elm_genlist_item_append(
+ genlist, // genlist object
+ &itcSeparator, // item class
+ NULL, // data
+ NULL,
+ ELM_GENLIST_ITEM_NONE,
+ NULL,
+ NULL);
+ elm_genlist_item_display_only_set(item, EINA_TRUE);
+ }
+
+ std::vector<String>::iterator it;
+ it = std::find (hw_iselist.begin (), hw_iselist.end (), uuid_to_name(String("d75857a5-4148-4745-89e2-1da7ddaf7999")));
+ hw_iselist.erase (it);
+
+ std::sort (hw_iselist.begin (), hw_iselist.end ());
+
+ for (i = 0; i < hw_iselist.size (); i++) {
+ if (strcmp (_active_hw_ise_name, hw_iselist[i].c_str ()) == 0) {
+ hw_mark = i;
+ break;
+ }
+ }
+
+ //set item class for 1text.1icon(text+radiobutton)
+ itc5.item_style = "dialogue/1text.1icon.2";
+ itc5.func.label_get = _gl_exp_hw_label_get;
+ itc5.func.icon_get = _gl_exp_hw_icon_get;
+ itc5.func.state_get = _gl_state_get;
+ itc5.func.del = _gl_del;
+ for (i = 0;i < hw_iselist.size();i++) {
+ elm_genlist_item_append(genlist, &itc5,
+ (void *)(i), NULL, ELM_GENLIST_ITEM_NONE, _gl_hw_ise_sel,
+ (void *)(i));
+ }
+}
+
+static Evas_Object *isf_setting_main_view_tizen (ug_data *ugd)
+{
+ Elm_Genlist_Item *item = NULL;
+
+ if (ugd->naviframe == NULL)
+ {
+ ugd->naviframe = _create_naviframe_layout (ugd->layout_main);
+ ugd->key_end_cb = back_cb;
+
+ Evas_Object *genlist = elm_genlist_add(ugd->naviframe);
+ //set item class for 1text.1icon(text+radiobutton)
+ itc1.item_style = "dialogue/1text.1icon";
+ itc1.func.label_get = _gl_label_get;
+ itc1.func.icon_get = _gl_icon_get;
+ itc1.func.state_get = _gl_state_get;
+ itc1.func.del = _gl_del;
+
+ //set item class for 2text(text+subtext)
+ itc2.item_style = "dialogue/2text.3";
+ itc2.func.label_get = _gl_label_get;
+ itc2.func.icon_get = NULL;
+ itc2.func.state_get = _gl_state_get;
+ itc2.func.del = _gl_del;
+
+ //set item class for normal text(text)
+ itc3.item_style = "dialogue/1text";
+ itc3.func.label_get = _gl_label_get;
+ itc3.func.icon_get = NULL;
+ itc3.func.state_get = _gl_state_get;
+ itc3.func.del = _gl_del;
+
+ // Set item class for dialogue group seperator
+ itcSeparator.item_style = "dialogue/separator/21/with_line";
+ itcSeparator.func.label_get = NULL;
+ itcSeparator.func.icon_get = NULL;
+ itcSeparator.func.state_get = NULL;
+ itcSeparator.func.del = NULL;
+
+ // Set item class for dialogue group title
+ itcTitle.item_style = "dialogue/title";
+ itcTitle.func.label_get = _gl_label_get;
+ itcTitle.func.icon_get = NULL;
+ itcTitle.func.state_get = _gl_state_get;
+ itcTitle.func.del = _gl_del;
+//==================================group begin =======================
+ ItemData *item_data = NULL;
+
+//separator
+ item = elm_genlist_item_append(
+ genlist, // genlist object
+ &itcSeparator, // item class
+ NULL, // data
+ NULL,
+ ELM_GENLIST_ITEM_NONE,
+ NULL,
+ NULL);
+ elm_genlist_item_display_only_set(item, EINA_TRUE);
+
+//group1 item1
+ item_data = (ItemData *)malloc(sizeof(ItemData));
+ if (item_data != NULL) {
+ memset(item_data,0,sizeof(ItemData));
+ p_items[AUTO_CAPITALIZATION_ITEM] = item_data;
+ item_data->text = strdup(_T("Auto capitalization"));
+ item_data->mode = AUTO_CAPITALIZATION_ITEM;
+ elm_genlist_item_append(
+ genlist, // genlist object
+ &itc1, // item class
+ item_data, // data
+ NULL,
+ ELM_GENLIST_ITEM_NONE,
+ _gl_sel,
+ (void *)(item_data->mode));
+ }
+
+//group2 title
+ item_data = (ItemData *)malloc(sizeof(ItemData));
+ if (item_data != NULL) {
+ memset(item_data,0,sizeof(ItemData));
+ p_items[SW_KEYBOARD_GROUP_TITLE_ITEM] = item_data;
+ item_data->text = strdup(_T("Software keyboard"));
+ item = elm_genlist_item_append(
+ genlist, // genlist object
+ &itcTitle, // item class
+ item_data, // data
+ NULL,
+ ELM_GENLIST_ITEM_NONE,
+ NULL,
+ NULL);
+ elm_genlist_item_display_only_set(item, EINA_TRUE);
+ }
+
+//group2 item1
+ std::vector<String> ise_names;
+
+ String tmpStr = _config->read(SCIM_CONFIG_DEFAULT_HELPER_ISE,String("b70bf6cc-ff77-47dc-a137-60acc32d1e0c"));
+ snprintf (_active_ise_name, sizeof (_active_ise_name), "%s", (uuid_to_name(tmpStr)).c_str());
+ snprintf (ise_bak, sizeof (ise_bak), "%s", _active_ise_name);
+
+ item_data = (ItemData *)malloc(sizeof(ItemData));
+ if (item_data!=NULL) {
+ memset(item_data,0,sizeof(ItemData));
+ p_items[SW_KEYBOARD_SEL_ITEM] = item_data;
+ item_data->text = strdup(_T("Keyboard selection"));
+ item_data->sub_text = strdup(_active_ise_name);
+ item_data->mode = AUTO_CAPITALIZATION_ITEM;
+
+ ugd->sw_ise_item_tizen = elm_genlist_item_append(
+ genlist, // genlist object
+ &itc2, // item class
+ item_data, // data
+ NULL,
+ ELM_GENLIST_ITEM_NONE,
+ _gl_keyboard_sel,
+ (void *)ugd);
+
+ if (is_hw_connected)
+ elm_genlist_item_disabled_set(ugd->sw_ise_item_tizen, EINA_TRUE);
+ }
+
+//group2 item2
+ item_data = (ItemData *)malloc(sizeof(ItemData));
+ if (item_data != NULL) {
+ memset(item_data,0,sizeof(ItemData));
+ p_items[SW_ISE_OPTION_ITEM] = item_data;
+ item_data->text = strdup (_T("Keyboard option"));
+ item_data->mode = SW_ISE_OPTION_ITEM;
+ ugd->sw_ise_opt_item_tizen = elm_genlist_item_append(
+ genlist, // genlist object
+ &itc3, // item class
+ item_data, // data
+ NULL,
+ ELM_GENLIST_ITEM_NONE,
+ _gl_ise_option_sel,
+ (void *)ugd);
+
+ if (is_hw_connected)
+ elm_genlist_item_disabled_set(ugd->sw_ise_opt_item_tizen,EINA_TRUE);
+ }
+
+//group3 title
+ item_data = (ItemData *)malloc(sizeof(ItemData));
+ if (item_data != NULL) {
+ memset(item_data,0,sizeof(ItemData));
+ p_items[HW_KEYBOARD_GROUP_TITLE_ITEM] = item_data;
+ item_data->text=strdup(_T("Hardware keyboard"));
+ item = elm_genlist_item_append(
+ genlist, // genlist object
+ &itcTitle, // item class
+ item_data, // data
+ NULL,
+ ELM_GENLIST_ITEM_NONE,
+ NULL,
+ NULL);
+ elm_genlist_item_display_only_set(item, EINA_TRUE);
+ }
+
+//group3 item1
+ String uuid,name;
+ isf_get_keyboard_ise(uuid,name,_config);
+ //temp
+ if (strcmp(uuid.c_str(),"d75857a5-4148-4745-89e2-1da7ddaf7999") == 0)
+ {
+ name = name + String("English");
+ uuid = name_to_uuid(name);
+ }
+ snprintf(_active_hw_ise_name,sizeof(_active_hw_ise_name),"%s",name.c_str());
+
+ snprintf (hw_ise_bak, sizeof (hw_ise_bak), "%s", _active_hw_ise_name);
+
+ item_data = (ItemData *)malloc(sizeof(ItemData));
+ if (item_data != NULL) {
+ memset(item_data,0,sizeof(ItemData));
+ p_items[HW_KEYBOARD_SEL_ITEM] = item_data;
+ item_data->text = strdup(_T("Keyboard selection"));
+ item_data->sub_text = strdup(_active_hw_ise_name);
+ ugd->hw_ise_item_tizen = elm_genlist_item_append(
+ genlist, // genlist object
+ &itc2, // item class
+ item_data, // data
+ NULL,
+ ELM_GENLIST_ITEM_NONE,
+ _gl_keyboard_sel,
+ (void *)ugd);
+
+ if (!is_hw_connected)
+ elm_genlist_item_disabled_set(ugd->hw_ise_item_tizen,EINA_TRUE);
+ }
+//group3 item2
+ p_items[HW_ISE_OPTION_ITEM] = NULL;
+
+//==================================group end =========================
+ Evas_Object *back_btn = elm_button_add(ugd->naviframe);
+ elm_object_style_set(back_btn, "naviframe/back_btn/default");
+ evas_object_smart_callback_add (back_btn, "clicked", back_cb, ugd);
+
+ elm_naviframe_item_push (ugd->naviframe, _T("Keyboard"), back_btn, NULL, genlist, NULL);
+ }
+ return ugd->naviframe;
+}
+
+static void sync_iselist()
+{
+ // Request ISF to update ISE list, below codes are very important, dont remove
+ char **iselist = NULL;
+ int count = isf_control_get_iselist (&iselist);
+ int i;
+ for (i = 0; i < count; i++) {
+ SCIM_DEBUG_MAIN (3) << " [" << i << " : " << iselist[i] << "] \n";
+ delete [] (iselist[i]);
+ }
+ if (iselist != NULL)
+ free (iselist);
+}
+
+static void load_config_data (ConfigPointer config)
+{
+#ifndef SINGLE_SELECTION
+ enable_uuid_list.clear ();
+
+ enable_uuid_list = config->read (SCIM_CONFIG_ENABLED_ISE_UUID_LIST, enable_uuid_list);
+ _default_ise_uuid = scim_global_config_read (String (SCIM_GLOBAL_CONFIG_INITIAL_ISE_UUID), String ("b70bf6cc-ff77-47dc-a137-60acc32d1e0c"));
+ if (enable_uuid_list.size () == 0) {
+ enable_uuid_list.push_back (_default_ise_uuid);
+
+ isf_control_set_active_ise_by_uuid ( _default_ise_uuid.c_str ());
+ }
+#endif
+ int tmp_cap=0;
+ vconf_get_bool (VCONFKEY_SETAPPL_AUTOCAPITAL_ALLOW_BOOL, &tmp_cap);
+ if (tmp_cap == true) f_auto_capitalization = EINA_TRUE;
+}
+
+ConfigPointer isf_imf_context_get_config (void);
+static void load_config_module (void)
+{
+ _config = isf_imf_context_get_config ();
+ if (_config.null ()) {
+ std::cerr << "Create dummy config!!!\n";
+ _config = new DummyConfig ();
+ }
+
+ if (_config.null ()) {
+ std::cerr << "Can not create Config Object!\n";
+ }
+}
+
+static void hw_connection_change_cb(ug_data *ugd)
+{
+ //enable / disable switch
+ elm_genlist_item_disabled_set(ugd->sw_ise_item_tizen,!elm_genlist_item_disabled_get(ugd->sw_ise_item_tizen));
+ elm_genlist_item_disabled_set(ugd->sw_ise_opt_item_tizen,!elm_genlist_item_disabled_get(ugd->sw_ise_opt_item_tizen));
+ elm_genlist_item_disabled_set(ugd->hw_ise_item_tizen,!elm_genlist_item_disabled_get(ugd->hw_ise_item_tizen));
+ elm_genlist_item_disabled_set(ugd->hw_ise_opt_item_tizen,!elm_genlist_item_disabled_get(ugd->hw_ise_opt_item_tizen));
+
+ if (!is_hw_connected)
+ {
+ String uuid;
+ for (unsigned int i = 0; i < _names.size (); i++) {
+ if (strcmp (_names[i].c_str (), _active_ise_name) == 0)
+ uuid = _uuids[i];
+ }
+ isf_control_set_active_ise_by_uuid (uuid.c_str());
+ }
+}
+
+static Eina_Bool
+_prop_change(void *data, int ev_type, void *ev)
+{
+ Ecore_X_Event_Window_Property *event = (Ecore_X_Event_Window_Property *)ev;
+ unsigned int val = 0;
+
+ if (event->win != _rootwin) return ECORE_CALLBACK_PASS_ON;
+ if (event->atom != prop_x_ext_keyboard_exist) return ECORE_CALLBACK_PASS_ON;
+
+ if (!ecore_x_window_prop_card32_get(event->win,
+ prop_x_ext_keyboard_exist,
+ &val, 1) > 0)
+ return ECORE_CALLBACK_PASS_ON;
+
+ if (val != 0) {
+ is_hw_connected = true;
+ }
+ else
+ is_hw_connected = false;
+
+ ug_data *ugd = (ug_data *)data;
+ hw_connection_change_cb(ugd);
+ hw_kbd_num = val;
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+static void init_hw_keyboard_listener(ug_data *ugd)
+{
+ if (_prop_change_handler) return;
+
+ _rootwin = ecore_x_window_root_first_get();
+ ecore_x_event_mask_set(_rootwin, ECORE_X_EVENT_MASK_WINDOW_PROPERTY);
+
+ _prop_change_handler = ecore_event_handler_add
+ (ECORE_X_EVENT_WINDOW_PROPERTY, _prop_change, (void *)ugd);
+
+ if (!prop_x_ext_keyboard_exist)
+ prop_x_ext_keyboard_exist = ecore_x_atom_get(PROP_X_EXT_KEYBOARD_EXIST);
+
+ if (!ecore_x_window_prop_card32_get(_rootwin, prop_x_ext_keyboard_exist, &hw_kbd_num, 1)) {
+ printf("Error! cannot get hw_kbd_num\n");
+ return;
+ }
+
+ if (hw_kbd_num == 0)
+ is_hw_connected = false;
+ else
+ is_hw_connected = true;
+ return ;
+}
+
+static void *on_create (struct ui_gadget *ug, enum ug_mode mode, bundle *data, void *priv)
+{
+ Evas_Object *parent = NULL;
+ Evas_Object *content = NULL;
+
+ if (ug == NULL|| priv == NULL)
+ return NULL;
+
+ bindtextdomain (SETTING_PACKAGE, SETTING_LOCALEDIR);
+ struct ug_data *ugd = (struct ug_data *)priv;
+ ugd->ug = ug;
+ parent = (Evas_Object *) ug_get_parent_layout (ug);
+ if (parent == NULL)
+ return NULL;
+
+ if (imf_context == NULL) {
+ const char *ctx_id = ecore_imf_context_default_id_get ();
+ if (ctx_id) {
+ imf_context = ecore_imf_context_add (ctx_id);
+ }
+ }
+
+ load_config_module ();
+
+ //only helper ISEs will be needed in isfsetting according to phone requirement.
+ load_config_data (_config);
+ sync_iselist();
+ isf_load_ise_information (ALL_ISE, _config);
+ init_hw_keyboard_listener(ugd);
+ //-------------------------- ise infomation ----------------------------
+
+ //construct the UI part of the isfsetting module
+ if (mode == UG_MODE_FULLVIEW)
+ ugd->layout_main = create_fullview (parent, ugd);
+ else
+ ugd->layout_main = create_frameview (parent, ugd);
+
+ if (ugd->layout_main != NULL) {
+ content = isf_setting_main_view_tizen(ugd);
+ elm_object_part_content_set (ugd->layout_main, "elm.swallow.content", content);
+ }
+ return (void *)ugd->layout_main;
+}
+
+static void on_start (struct ui_gadget *ug, bundle *data, void *priv)
+{
+}
+
+static void on_pause (struct ui_gadget *ug, bundle *data, void *priv)
+{
+
+}
+
+static void on_resume (struct ui_gadget *ug, bundle *data, void *priv)
+{
+
+}
+
+static void on_destroy (struct ui_gadget *ug, bundle *data, void *priv)
+{
+ if (ug == NULL|| priv == NULL)
+ return;
+
+ if (imf_context != NULL) {
+ ecore_imf_context_del(imf_context);
+ imf_context = NULL;
+ }
+
+ struct ug_data *ugd = (struct ug_data *) priv;
+
+ if (ugd->naviframe != NULL) {
+ evas_object_del (ugd->naviframe);
+ ugd->naviframe = NULL;
+ }
+
+ if (ugd->layout_main != NULL) {
+ evas_object_del (ugd->layout_main);
+ ugd->layout_main = NULL;
+ }
+
+ if (ugd->opt_eo != NULL) {
+ evas_object_del(ugd->opt_eo);
+ ugd->opt_eo = NULL;
+ }
+
+ if (mdl) {
+ delete mdl;
+ mdl = NULL;
+ }
+
+ if (!_config.null ()) {
+ _config->flush ();
+ _config.reset ();
+ }
+
+ for(int i = 0 ;i < ITEM_TOTAL_COUNT;i++)
+ {
+ if (p_items[i]!= NULL)
+ {
+ if (p_items[i]->text) {
+ free(p_items[i]->text);
+ p_items[i]->text = NULL;
+ }
+ if (p_items[i]->sub_text) {
+ free(p_items[i]->sub_text);
+ p_items[i]->sub_text = NULL;
+ }
+ free(p_items[i]);
+ p_items[i]= NULL;
+ }
+ }
+
+ if (!_prop_change_handler) return;
+ ecore_event_handler_del(_prop_change_handler);
+ _prop_change_handler = NULL;
+}
+
+static void on_message (struct ui_gadget *ug, bundle *msg, bundle *data, void *priv)
+{
+}
+
+static void on_event (struct ui_gadget *ug, enum ug_event event, bundle *data, void *priv)
+{
+ switch (event) {
+ case UG_EVENT_LOW_MEMORY:
+ break;
+ case UG_EVENT_LOW_BATTERY:
+ break;
+ case UG_EVENT_LANG_CHANGE:
+ break;
+ case UG_EVENT_ROTATE_PORTRAIT:
+ break;
+ case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
+ break;
+ case UG_EVENT_ROTATE_LANDSCAPE:
+ break;
+ case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
+ break;
+ default:
+ break;
+ }
+}
+
+static void on_key_event(struct ui_gadget *ug, enum ug_key_event event, bundle *data, void *priv)
+{
+ if ( ug == NULL || priv == NULL)
+ return ;
+
+ struct ug_data *ugd = (struct ug_data *)priv;
+ Elm_Object_Item *top_it;
+
+ switch (event) {
+ case UG_KEY_EVENT_END:
+ top_it = elm_naviframe_top_item_get(ugd->naviframe);
+ if (top_it && (elm_object_item_content_get(top_it) != ugd->opt_eo) && (ugd->key_end_cb == ise_option_view_set_cb))//ise option maybe multiple layouts
+ {
+ mdl->key_proceeding(TYPE_KEY_END);
+ }
+ else
+ {
+ ugd->key_end_cb(priv, NULL, NULL);
+ }
+
+ break;
+ default:
+ break;
+ }
+}
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+ UG_MODULE_API int UG_MODULE_INIT (struct ug_module_ops *ops) {
+ if (ops == NULL)
+ return -1;
+
+ struct ug_data *ugd = (ug_data*)calloc (1, sizeof (struct ug_data));
+ if (ugd == NULL)
+ return -1;
+
+ common_ugd = ugd;
+ ops->create = on_create;
+ ops->start = on_start;
+ ops->pause = on_pause;
+ ops->resume = on_resume;
+ ops->destroy = on_destroy;
+ ops->message = on_message;
+ ops->event = on_event;
+ ops->key_event = on_key_event;
+ ops->priv = ugd;
+ ops->opt = UG_OPT_INDICATOR_PORTRAIT_ONLY;
+
+ return 0;
+ }
+
+ UG_MODULE_API void UG_MODULE_EXIT (struct ug_module_ops *ops) {
+ if (ops == NULL)
+ return;
+
+ struct ug_data *ugd = (struct ug_data *)(ops->priv);
+ if (ugd != NULL)
+ free (ugd);
+ }
+
+ UG_MODULE_API int setting_plugin_reset(bundle *data, void *priv)//for setting keyboard reset
+ {
+ if (vconf_set_bool (VCONFKEY_SETAPPL_AUTOCAPITAL_ALLOW_BOOL, false) == -1)
+ return -1;
+
+ load_config_module ();
+ load_config_data (_config);
+ isf_load_ise_information (ALL_ISE, _config);
+
+ String uuid = scim_global_config_read (String (SCIM_GLOBAL_CONFIG_INITIAL_ISE_UUID), String ("b70bf6cc-ff77-47dc-a137-60acc32d1e0c"));
+ isf_control_set_active_ise_by_uuid (uuid.c_str());
+
+ String mdl_name;
+
+ for (unsigned int i = 0; i < _module_names.size (); i++) {
+ mdl_name = _module_names[i];
+ char module_name[256];
+ snprintf (module_name, sizeof (module_name), "%s-imengine-setup", mdl_name.c_str ());
+ mdl = new SetupModule (String (module_name));
+ if ( mdl == NULL || !mdl->valid ()) {
+ if (mdl)
+ {
+ delete mdl;
+ mdl = NULL;
+ }
+ continue;
+ }
+ else{
+ if (mdl->option_reset(_config) == false)
+ {
+ printf("mdl %s failed to reset option!\n",module_name);
+ if (mdl)
+ {
+ delete mdl;
+ mdl = NULL;
+ }
+ return -1;
+ }
+ else
+ {
+ _config->reload ();
+ if (mdl)
+ {
+ delete mdl;
+ mdl = NULL;
+ }
+ }
+ }
+ }
+ return 0;
+ }
+
+#ifdef __cplusplus
+}
+#endif
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef UG_WIZARD_MODULE_API
+#define UG_WIZARD_MODULE_API __attribute__ ((visibility("default")))
+#endif
+
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_SCIM_HELPER_MODULE
+
+#include <stdio.h>
+#include <Elementary.h>
+#include <Ecore_IMF.h>
+#include "isf_control.h"
+#include <Ecore_X.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <vconf-keys.h>
+#include <vconf.h>
+#include <ui-gadget-module.h>
+#include <ui-gadget.h>
+#include <dlog.h>
+#include "scim.h"
+#include "scim_stl_map.h"
+#include "isf_setting_wizard.h"
+#include "../efl_panel/isf_panel_utility.h"
+
+
+using namespace scim;
+
+
+#define WIZARD_PACKAGE "keyboard-setting-wizard-efl"
+#define WIZARD_LOCALEDIR "/opt/ug/res/locale"
+#define T_(s) dgettext(WIZARD_PACKAGE, s)
+#define LOG_TAG "isfsettingwizard"
+
+static Elm_Genlist_Item_Class itc1,itcSeparator;
+static int mark = 0;
+
+
+static Ecore_IMF_Context *imf_context = NULL;
+
+static Evas_Object *sw_radio_grp = NULL; //sw view raido group
+static std::vector<String> sw_iselist;
+
+static ConfigPointer _config;
+
+static char ise_bak[256] = {'\0'};
+static char _active_ise_name[256] = {'\0'};
+
+
+extern std::vector <String> _names;
+extern std::vector <String> _uuids;
+extern std::vector <String> _module_names;
+extern std::vector <String> _langs;
+
+static String uuid_to_name(String uuid)
+{
+ String tmpName("");
+ for(unsigned int i = 0;i<_uuids.size();i++)
+ {
+ if (strcmp(uuid.c_str(),_uuids[i].c_str())== 0) {
+ tmpName = _names[i];
+ break;
+ }
+ }
+ return tmpName;
+}
+
+static Evas_Object *_create_bg(Evas_Object *win)
+{
+ Evas_Object *bg = elm_bg_add(win);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(bg);
+ return bg;
+}
+
+static Evas_Object *create_fullview (Evas_Object *parent, struct ug_data *ugd)
+{
+ Evas_Object *bg = _create_bg(parent);
+ Evas_Object *layout_main = NULL;
+
+ layout_main = elm_layout_add (parent);
+
+ if (layout_main == NULL)
+ return NULL;
+
+ elm_layout_theme_set (layout_main, "layout","application","default");
+ elm_object_style_set(bg, "group_list");
+ elm_layout_content_set (layout_main, "elm.swallow.bg", bg);
+
+ return layout_main;
+}
+
+static Evas_Object *create_frameview (Evas_Object *parent, struct ug_data *ugd)
+{
+ Evas_Object *bg = _create_bg(parent);
+ Evas_Object *layout_main = elm_layout_add (parent);
+ if (layout_main == NULL)
+ return NULL;
+ elm_layout_theme_set (layout_main, "layout", "application", "default");
+ elm_object_style_set(bg, "group_list");
+ elm_layout_content_set (layout_main, "elm.swallow.bg", bg);
+
+ return layout_main;
+}
+
+static void back_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ if (data == NULL)
+ return;
+
+ struct ug_data *ugd = (struct ug_data *)data;
+ ug_destroy_me (ugd->ug);
+}
+
+static Evas_Object* _create_naviframe_layout (Evas_Object* parent)
+{
+ Evas_Object *naviframe = elm_naviframe_add (parent);
+ elm_layout_content_set (parent, "elm.swallow.content", naviframe);
+ evas_object_show (naviframe);
+
+ return naviframe;
+}
+
+static bool in_exit = false;
+static void sw_keyboard_selection_view_back_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ if (in_exit) {
+ LOGD("do nothing ,exit!\n");
+ return;
+ }
+ in_exit = true;
+
+ if (data == NULL)
+ return;
+
+ struct ug_data *ugd = NULL;
+ ugd = (ug_data *)data;
+
+ if (strcmp (ise_bak, _active_ise_name) != 0) {
+ //if _active_ise_name is changed , active _active_ise_name.
+ //find the uuid of the active
+ String uuid;
+ for (unsigned int i = 0; i < _names.size (); i++) {
+ if (strcmp (_names[i].c_str (), _active_ise_name) == 0)
+ uuid = _uuids[i];
+ }
+ isf_control_set_active_ise_by_uuid ( uuid.c_str ());
+
+ snprintf (ise_bak, sizeof (ise_bak), "%s", _active_ise_name);
+ }
+
+ bundle *b = NULL;
+ b = bundle_create();
+ bundle_add(b, "name", "keyboard-setting-wizard-efl");
+ bundle_add(b, "description", "previous clicked");
+ ug_send_result(ugd->ug, b);
+ bundle_free(b);
+
+ back_cb(data,obj,event_info);
+
+ LOGD("End of %s", __func__);
+}
+
+static void sw_keyboard_selection_view_set_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ if (in_exit)
+ return;
+ in_exit = true;
+
+ if (data == NULL)
+ return;
+
+ struct ug_data *ugd = (struct ug_data *)data;
+
+ if (strcmp (ise_bak, _active_ise_name) != 0) {
+ //if _active_ise_name is changed , active _active_ise_name.
+ //find the uuid of the active
+ String uuid;
+ for (unsigned int i = 0; i < _names.size (); i++) {
+ if (strcmp (_names[i].c_str (), _active_ise_name) == 0)
+ uuid = _uuids[i];
+ }
+ isf_control_set_active_ise_by_uuid ( uuid.c_str ());
+
+ snprintf (ise_bak, sizeof (ise_bak), "%s", _active_ise_name);
+ LOGD("Set active ISE : %s", ise_bak);
+ }
+
+ bundle *b = NULL;
+ b = bundle_create();
+ bundle_add(b, "name", "keyboard-setting-wizard-efl");
+ bundle_add(b, "description", "next clicked");
+ ug_send_result(ugd->ug, b);
+ bundle_free(b);
+
+ back_cb(data,obj,event_info);
+
+ LOGD("End of %s", __func__);
+// call next ug
+}
+
+static void _gl_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ Elm_Genlist_Item *item = (Elm_Genlist_Item *)event_info;
+ elm_genlist_item_selected_set(item, 0);
+ mark = (int) (data);
+ snprintf (_active_ise_name, sizeof (_active_ise_name), "%s", sw_iselist[mark].c_str ());
+ elm_genlist_item_update(item);
+ return;
+}
+
+static void _sw_radio_cb (void *data, Evas_Object *obj, void *event_info)
+{
+ int index = GPOINTER_TO_INT(data);
+ elm_radio_value_set (sw_radio_grp, index);
+ snprintf (_active_ise_name, sizeof (_active_ise_name), "%s", sw_iselist[index].c_str ());
+}
+
+static char *_gl_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ int index = (int)(data);
+ if (!strcmp(part, "elm.text")) {
+ return strdup(sw_iselist[index].c_str());
+ }
+ return NULL;
+}
+
+static Evas_Object *_gl_icon_get(void *data, Evas_Object *obj, const char *part)
+{
+ if (!strcmp(part, "elm.icon")) {
+
+ int index = (int)(data);
+ Evas_Object *radio = elm_radio_add (obj);
+ elm_radio_state_value_set (radio, index);
+ if (sw_radio_grp == NULL)
+ sw_radio_grp = elm_radio_add(obj);
+ elm_radio_group_add (radio, sw_radio_grp);
+ evas_object_show (radio);
+ evas_object_smart_callback_add (radio, "changed", _sw_radio_cb, (void *) (index));
+ if (mark == index) {
+ elm_radio_value_set (sw_radio_grp, mark);
+ }
+ return radio;
+ }
+ return NULL;
+}
+
+static Eina_Bool _gl_state_get(void *data, Evas_Object *obj, const char *part)
+{
+ return EINA_FALSE;
+}
+
+static void _gl_del(void *data, Evas_Object *obj)
+{
+ return;
+}
+
+static Evas_Object *isf_setting_main_view_tizen(ug_data * ugd)
+{
+ String tmpStr = _config->read(SCIM_CONFIG_DEFAULT_HELPER_ISE,String("b70bf6cc-ff77-47dc-a137-60acc32d1e0c"));
+ snprintf (_active_ise_name, sizeof (_active_ise_name), "%s", (uuid_to_name(tmpStr)).c_str());
+ snprintf (ise_bak, sizeof (ise_bak), "%s", _active_ise_name);
+ LOGD("Default ISE Name : %s", ise_bak);
+
+ ugd->naviframe = _create_naviframe_layout (ugd->layout_main);
+ const char *navi_btn_l_lable = bundle_get_val(ugd->data, "navi_btn_left");
+ const char *navi_btn_r_lable = bundle_get_val(ugd->data, "navi_btn_right");
+
+ if (sw_radio_grp != NULL)
+ {
+ evas_object_del(sw_radio_grp);
+ sw_radio_grp = NULL;
+ }
+
+ Evas_Object *genlist = elm_genlist_add(ugd->naviframe);
+ evas_object_show(genlist);
+
+ Elm_Object_Item *nf_it;
+ Evas_Object *cbar = elm_controlbar_add(ugd->naviframe);
+ if (cbar == NULL) return NULL;
+ elm_object_style_set(cbar, "naviframe");
+
+ if (navi_btn_l_lable!= NULL) {
+ elm_controlbar_tool_item_append(cbar, NULL, navi_btn_l_lable, sw_keyboard_selection_view_back_cb, ugd);
+ elm_controlbar_tool_item_append(cbar, NULL, navi_btn_r_lable, sw_keyboard_selection_view_set_cb, ugd);
+
+ nf_it = elm_naviframe_item_push(ugd->naviframe, T_("Keyboard"), NULL, NULL, genlist, NULL);
+ elm_object_item_part_content_set(nf_it, ELM_NAVIFRAME_ITEM_CONTROLBAR, cbar);
+ }
+ else {
+ elm_controlbar_tool_item_append(cbar, NULL, navi_btn_r_lable, sw_keyboard_selection_view_set_cb, ugd);
+ nf_it = elm_naviframe_item_push(ugd->naviframe, T_("Keyboard"), NULL, NULL, genlist, NULL);
+ elm_object_item_part_content_set(nf_it, ELM_NAVIFRAME_ITEM_CONTROLBAR, cbar);
+ }
+
+ unsigned int i = 0;
+
+ sw_iselist.clear();
+ std::vector<String> selected_langs, all_langs;
+
+ isf_get_all_languages (all_langs);
+ isf_get_helper_names_in_languages (all_langs, sw_iselist);
+ std::sort (sw_iselist.begin (), sw_iselist.end ());
+
+ if (sw_iselist.size () > 0) {
+ // Set item class for dialogue group seperator
+ itcSeparator.item_style = "dialogue/separator/21/with_line";
+ itcSeparator.func.label_get = NULL;
+ itcSeparator.func.icon_get = NULL;
+ itcSeparator.func.state_get = NULL;
+ itcSeparator.func.del = NULL;
+
+ //separator
+ Elm_Genlist_Item *item;
+ item = elm_genlist_item_append(
+ genlist, // genlist object
+ &itcSeparator, // item class
+ NULL, // data
+ NULL,
+ ELM_GENLIST_ITEM_NONE,
+ NULL,
+ NULL);
+ elm_genlist_item_display_only_set(item, EINA_TRUE);
+ }
+
+ for (i = 0; i < sw_iselist.size (); i++) {
+ if (strcmp (_active_ise_name, sw_iselist[i].c_str ()) == 0) {
+ mark = i;
+ break;
+ }
+ }
+
+ //set item class for 1text.1icon(text+radiobutton)
+ itc1.item_style = "dialogue/1text.1icon.2";
+ itc1.func.label_get = _gl_label_get;
+ itc1.func.icon_get = _gl_icon_get;
+ itc1.func.state_get = _gl_state_get;
+ itc1.func.del = _gl_del;
+ for (i = 0;i < sw_iselist.size();i++) {
+ elm_genlist_item_append(genlist, &itc1,
+ (void *)(i), NULL, ELM_GENLIST_ITEM_NONE, _gl_sel,
+ (void *)(i));
+ }
+
+ return ugd->naviframe;
+}
+
+ConfigPointer isf_imf_context_get_config(void);
+static void *on_create (struct ui_gadget *ug, enum ug_mode mode, bundle *data, void *priv)
+{
+ Evas_Object *parent = NULL;
+ Evas_Object *content = NULL;
+
+ if ( ug == NULL || priv == NULL)
+ return NULL;
+
+ bindtextdomain (WIZARD_PACKAGE, WIZARD_LOCALEDIR);
+
+ struct ug_data *ugd = (struct ug_data *)priv;
+ ugd->ug = ug;
+ ugd->data = data;
+ parent = (Evas_Object *) ug_get_parent_layout (ug);
+ if (parent == NULL)
+ return NULL;
+ //-------------------------- ise infomation ----------------------------
+
+ const char *ctx_id = ecore_imf_context_default_id_get ();
+ if (ctx_id != NULL) {
+ imf_context = ecore_imf_context_add (ctx_id);
+ }
+
+ _config = isf_imf_context_get_config ();
+ if (_config.null ()) {
+ std::cerr << "Create dummy config!!!\n";
+ _config = new DummyConfig ();
+ }
+
+ if (_config.null ()) {
+ std::cerr << "Can not create Config Object!\n";
+ }
+
+ //only helper ISEs will be needed in isfsetting according to phone requirement.
+ isf_load_ise_information (HELPER_ONLY, _config);
+ // Request ISF to update ISE list, below codes are very important, dont remove
+ char **iselist = NULL;
+ int count = isf_control_get_iselist (&iselist);
+ for (unsigned int i = 0; i < (unsigned int)count; i++) {
+ SCIM_DEBUG_MAIN (3) << " [" << i << " : " << iselist[i] << "] \n";
+ if (iselist[i] != NULL)
+ delete [] (iselist[i]);
+ }
+
+ if (iselist!=NULL)
+ free(iselist);
+ //-------------------------- ise infomation ----------------------------
+
+ //construct the UI part of the isfsetting module
+ if (mode == UG_MODE_FULLVIEW)
+ ugd->layout_main = create_fullview (parent, ugd);
+ else
+ ugd->layout_main = create_frameview (parent, ugd);
+
+ if (ugd->layout_main != NULL) {
+ content = isf_setting_main_view_tizen(ugd);
+ elm_layout_content_set (ugd->layout_main, "elm.swallow.content", content);
+ }
+ return (void *)ugd->layout_main;
+}
+
+static void on_start (struct ui_gadget *ug, bundle *data, void *priv)
+{
+}
+
+static void on_pause (struct ui_gadget *ug, bundle *data, void *priv)
+{
+
+}
+
+static void on_resume (struct ui_gadget *ug, bundle *data, void *priv)
+{
+
+}
+
+static void on_destroy (struct ui_gadget *ug, bundle *data, void *priv)
+{
+ if ( ug == NULL|| priv == NULL)
+ return;
+
+ if (imf_context != NULL) {
+ ecore_imf_context_del(imf_context);
+ imf_context = NULL;
+ }
+
+ struct ug_data *ugd = (struct ug_data *) priv;
+
+ if (ugd->naviframe != NULL) {
+ evas_object_del (ugd->naviframe);
+ ugd->naviframe = NULL;
+ }
+
+ if (ugd->layout_main != NULL) {
+ evas_object_del (ugd->layout_main);
+ ugd->layout_main = NULL;
+ }
+
+ if (!_config.null ()) {
+ _config->flush ();
+ _config.reset ();
+ }
+}
+
+static void on_message (struct ui_gadget *ug, bundle *msg, bundle *data, void *priv)
+{
+}
+
+static void on_event (struct ui_gadget *ug, enum ug_event event, bundle *data, void *priv)
+{
+ switch (event) {
+ case UG_EVENT_LOW_MEMORY:
+ break;
+ case UG_EVENT_LOW_BATTERY:
+ break;
+ case UG_EVENT_LANG_CHANGE:
+ break;
+ case UG_EVENT_ROTATE_PORTRAIT:
+ break;
+ case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
+ break;
+ case UG_EVENT_ROTATE_LANDSCAPE:
+ break;
+ case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
+ break;
+ default:
+ break;
+ }
+}
+
+static void on_key_event(struct ui_gadget *ug, enum ug_key_event event, bundle *data, void *priv)
+{
+ if (ug == NULL)
+ return;
+
+ switch (event) {
+ case UG_KEY_EVENT_END:
+ ug_destroy_me(ug);
+ break;
+ default:
+ break;
+ }
+}
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+ UG_WIZARD_MODULE_API int UG_MODULE_INIT (struct ug_module_ops *ops) {
+ if (ops == NULL)
+ return -1;
+
+ struct ug_data *ugd = (ug_data*)calloc (1, sizeof (struct ug_data));
+ if (ugd == NULL)
+ return -1;
+
+ ops->create = on_create;
+ ops->start = on_start;
+ ops->pause = on_pause;
+ ops->resume = on_resume;
+ ops->destroy = on_destroy;
+ ops->message = on_message;
+ ops->event = on_event;
+ ops->key_event = on_key_event;
+ ops->priv = ugd;
+ ops->opt = UG_OPT_INDICATOR_PORTRAIT_ONLY;
+
+ return 0;
+ }
+
+ UG_WIZARD_MODULE_API void UG_MODULE_EXIT (struct ug_module_ops *ops) {
+ if (ops == NULL)
+ return;
+
+ struct ug_data *ugd = (struct ug_data *)(ops->priv);
+ if (ugd != NULL)
+ free (ugd);
+ }
+
+#ifdef __cplusplus
+}
+#endif
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
+
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_setup_module.cpp,v 1.9 2005/01/10 08:30:45 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_CONFIG_BASE
+#define Uses_SCIM_MODULE
+
+
+#include "scim_private.h"
+#include "scim.h"
+#include "scim_setup_module_efl.h"
+
+SetupModule::SetupModule ()
+ : m_create_ui (0),
+ m_get_category (0),
+ m_get_name (0),
+ m_get_description (0),
+ m_load_config (0),
+ m_save_config (0),
+ m_query_changed (0),
+ m_key_proceeding(0),
+ m_option_reset (0)
+{
+}
+
+SetupModule::SetupModule (const String &name)
+ : m_create_ui (0),
+ m_get_category (0),
+ m_get_name (0),
+ m_get_description (0),
+ m_load_config (0),
+ m_save_config (0),
+ m_query_changed (0),
+ m_key_proceeding (0),
+ m_option_reset (0)
+{
+ load (name);
+}
+
+bool
+SetupModule::load (const String &name)
+{
+ if (!m_module.load (name, "SetupUI"))
+ return false;
+
+ m_create_ui = (SetupModuleCreateUIFunc) m_module.symbol ("scim_setup_module_create_ui");
+ m_get_category = (SetupModuleGetCategoryFunc) m_module.symbol ("scim_setup_module_get_category");
+ m_get_name = (SetupModuleGetNameFunc) m_module.symbol ("scim_setup_module_get_name");
+ m_get_description = (SetupModuleGetDescriptionFunc) m_module.symbol ("scim_setup_module_get_description");
+ m_load_config = (SetupModuleLoadConfigFunc) m_module.symbol ("scim_setup_module_load_config");
+ m_save_config = (SetupModuleSaveConfigFunc) m_module.symbol ("scim_setup_module_save_config");
+ m_query_changed = (SetupModuleQueryChangedFunc) m_module.symbol ("scim_setup_module_query_changed");
+ m_key_proceeding = (SetupModuleKeyProceedingFunc) m_module.symbol ("scim_setup_module_key_proceeding");
+ m_option_reset = (SetupModuleOptionResetFunc) m_module.symbol ("scim_setup_module_option_reset");
+
+
+ if (!m_create_ui || !m_get_category || !m_get_name ||
+ !m_load_config || !m_save_config || !m_key_proceeding || !m_option_reset)
+ {
+ m_module.unload ();
+ m_create_ui = 0;
+ m_get_category = 0;
+ m_get_name = 0;
+ m_get_description = 0;
+ m_load_config = 0;
+ m_save_config = 0;
+ m_query_changed = 0;
+ m_key_proceeding = 0;
+ m_option_reset = 0;
+ return false;
+ }
+ return true;
+}
+
+bool
+SetupModule::unload()
+{
+ m_module.unload ();
+
+ m_create_ui = 0;
+ m_get_category = 0;
+ m_get_name = 0;
+ m_get_description = 0;
+ m_load_config = 0;
+ m_save_config = 0;
+ m_query_changed = 0;
+ m_key_proceeding = 0;
+ m_option_reset = 0;
+ return true;
+}
+
+bool
+SetupModule::valid () const
+{
+ return (m_module.valid () &&
+ m_create_ui && m_get_category && m_get_name &&
+ m_load_config && m_save_config && m_key_proceeding && m_option_reset);
+}
+
+Evas_Object*
+SetupModule::create_ui (Evas_Object *parent,Evas_Object *layout) const
+{
+ if (valid ())
+ return m_create_ui (parent,layout);
+
+ return 0;
+}
+
+String
+SetupModule::get_category () const
+{
+ if (valid ())
+ return m_get_category ();
+
+ return String ();
+}
+
+String
+SetupModule::get_name () const
+{
+ if (valid ())
+ return m_get_name ();
+
+ return String ();
+}
+
+String
+SetupModule::get_description () const
+{
+ if (valid () && m_get_description)
+ return m_get_description ();
+
+ return String ();
+}
+
+void
+SetupModule::load_config (const ConfigPointer &config) const
+{
+ if (valid ())
+ m_load_config (config);
+}
+
+void
+SetupModule::save_config (const ConfigPointer &config) const
+{
+ if (valid ())
+ m_save_config (config);
+}
+
+bool
+SetupModule::query_changed () const
+{
+ if (valid () && m_query_changed)
+ return m_query_changed ();
+ return false;
+}
+bool
+SetupModule::key_proceeding (int key_type) const
+{
+ if (valid () && m_key_proceeding)
+ return m_key_proceeding (key_type);
+ return false;
+}
+bool
+SetupModule::option_reset (const ConfigPointer &config) const
+{
+ if (valid () && m_option_reset)
+ return m_option_reset (config);
+ return false;
+}
+int scim_get_setup_module_list (std::vector <String>& mod_list)
+{
+ return scim_get_module_list (mod_list, "SetupUI");
+}
+
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+MAINTAINERCLEANFILES = Makefile.in
+EXTRA_DIST = im-scim.version-script
+
+INCLUDES = -I$(top_builddir) \
+ -I$(top_builddir)/ism/src \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/ism/src \
+ -I$(top_srcdir)/ism/intl \
+ -I$(top_srcdir)/ism/data \
+ -I$(top_srcdir)/ism/utils \
+ -I$(top_srcdir)/ism/extras/panel \
+ -I$(top_srcdir)/idm/src \
+ -DSCIM_DATADIR=\"@SCIM_DATADIR@\" \
+ -DSCIM_LOCALEDIR=\"@SCIM_LOCALEDIR@\" \
+ -DSCIM_SYSCONFDIR=\"@SCIM_SYSCONFDIR@\" \
+ -DSCIM_LIBEXECDIR=\"@SCIM_LIBEXECDIR@\" \
+ -DSCIM_ICONDIR=\"@SCIM_ICONDIR@\" \
+ -DSCIM_MODULE_PATH=\"@SCIM_MODULE_PATH@\" \
+ -DSCIM_TEMPDIR=\"@SCIM_TEMPDIR@\" \
+ -DSCIM_KEYBOARD_ICON_FILE=\"@SCIM_ICONDIR@/keyboard.png\"
+
+if SCIM_BUILD_GTK2_IMMODULE
+CONFIG_GTK2_IMMODULE = im-scim.la
+endif
+
+if SCIM_LD_VERSION_SCRIPT
+LD_VERSION_SCRIPT_OPTION="-Wl,--version-script=$(srcdir)/im-scim.version-script"
+endif
+
+noinst_HEADERS = gtkimcontextscim.h
+
+moduledir = @GTK_IM_MODULEDIR@
+
+module_LTLIBRARIES = $(CONFIG_GTK2_IMMODULE)
+
+im_scim_la_SOURCES = gtkimcontextscim.cpp imscim.cpp
+
+im_scim_la_CXXFLAGS=@GTK2_CFLAGS@
+im_scim_la_CFLAGS =@GTK2_CFLAGS@
+
+im_scim_la_LDFLAGS = -rpath $(moduledir) \
+ -avoid-version \
+ -module \
+ -lstdc++ \
+ $(LD_VERSION_SCRIPT_OPTION) \
+ -lgtk-x11-2.0 -lgdk-x11-2.0 -lglib-2.0 -lgobject-2.0 -lpango-1.0
+
+im_scim_la_LIBADD = $(top_builddir)/ism/src/libscim@SCIM_EPOCH@.la
--- /dev/null
+/** @file gtkimcontextscim.cpp
+ * @brief immodule for GTK2.
+ */
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: gtkimcontextscim.cpp,v 1.170.2.13 2007/06/16 06:23:38 suzhe Exp $
+ */
+
+#define Uses_SCIM_DEBUG
+#define Uses_SCIM_BACKEND
+#define Uses_SCIM_IMENGINE
+#define Uses_SCIM_IMENGINE_MODULE
+#define Uses_SCIM_HELPER_MODULE
+#define Uses_SCIM_CONFIG
+#define Uses_SCIM_CONFIG_MODULE
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_SCIM_TRANSACTION
+#define Uses_SCIM_HOTKEY
+#define Uses_SCIM_PANEL_CLIENT
+#define Uses_C_STRING
+#define Uses_C_STDIO
+#define Uses_C_STDLIB
+#define Uses_STL_IOSTREAM
+#define Uses_SCIM_UTILITY
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <gtk/gtk.h>
+#include <gdk/gdk.h>
+#include <gdk/gdkkeysyms.h>
+
+#undef GDK_WINDOWING_X11
+#ifdef GDK_WINDOWING_X11
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/keysym.h>
+#include <gdk/gdkx.h>
+#endif
+
+#include <sys/times.h>
+static struct timeval _scim_start;
+
+#include "scim_private.h"
+#include "scim.h"
+
+#ifdef GDK_WINDOWING_X11
+#include "scim_x11_utils.h"
+#endif
+
+using namespace scim;
+
+#include "gtkimcontextscim.h"
+
+//#define USING_ISF_MAINWINDOW_AUTOSCROLL
+
+
+#define GTK_TYPE_IM_CONTEXT_SCIM _gtk_type_im_context_scim
+#define GTK_IM_CONTEXT_SCIM(obj) (GTK_CHECK_CAST ((obj), GTK_TYPE_IM_CONTEXT_SCIM, GtkIMContextSCIM))
+#define GTK_IM_CONTEXT_SCIM_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_IM_CONTEXT_SCIM, GtkIMContextSCIMClass))
+#define GTK_IS_IM_CONTEXT_SCIM(obj) (GTK_CHECK_TYPE ((obj), GTK_TYPE_IM_CONTEXT_SCIM))
+#define GTK_IS_IM_CONTEXT_SCIM_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_IM_CONTEXT_SCIM))
+#define GTK_IM_CONTEXT_SCIM_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), GTK_TYPE_IM_CONTEXT_SCIM, GtkIMContextSCIMClass))
+
+#define SCIM_CONFIG_FRONTEND_GTK_IMMODULE_USE_KEY_SNOOPER "/FrontEnd/GtkIMModule/UseKeySnooper"
+#define ISE_KEY_FLUSH 0x8001
+#ifdef ISF_PROF
+static void gettime (const char* str)
+{
+ struct tms tiks_buf;
+ double clock_tiks = (double)sysconf (_SC_CLK_TCK);
+ clock_t times_tiks = times (&tiks_buf);
+ double times_secs = (double)times_tiks / clock_tiks;
+ double utime = (double)tiks_buf.tms_utime / clock_tiks;
+ double stime = (double)tiks_buf.tms_stime / clock_tiks;
+ printf ("Times: %3f \t User: %.3f \t System: %.3f \n", (double)times_secs, (double)utime , (double)stime);
+}
+#endif
+
+static void print_time (const char *str_info)
+{
+#ifdef ISF_PROF
+ struct timeval current_time;
+ int used_time = 0;
+
+ gettimeofday (¤t_time, NULL);
+ used_time = 1000000 * (current_time.tv_sec - _scim_start.tv_sec) + current_time.tv_usec - _scim_start.tv_usec;
+ printf (mzc_red "%s : %d usec" mzc_normal ".\n", str_info, used_time);
+ //printf ("Current time : %d sec %d usec\n", current_time.tv_sec, current_time.tv_usec);
+ gettime (str_info);
+#endif
+}
+
+/* Typedef */
+struct _GtkIMContextSCIMImpl
+{
+ GtkIMContextSCIM *parent;
+ IMEngineInstancePointer si;
+ GdkWindow *client_window;
+ WideString preedit_string;
+ AttributeList preedit_attrlist;
+ gint preedit_caret;
+ gint cursor_x;
+ gint cursor_y;
+ gint cursor_top_y;
+ gboolean use_preedit;
+ bool is_on;
+ bool shared_si;
+ bool preedit_started;
+ bool preedit_updating;
+ bool need_commit_preedit;
+
+ GtkIMContextSCIMImpl *next;
+};
+
+/* Input Context handling functions. */
+static GtkIMContextSCIMImpl * new_ic_impl (GtkIMContextSCIM *parent);
+static void delete_ic_impl (GtkIMContextSCIMImpl *impl);
+static void delete_all_ic_impl ();
+
+static GtkIMContextSCIM * find_ic (int siid);
+
+/* Methods declaration */
+static void gtk_im_context_scim_class_init (GtkIMContextSCIMClass *klass,
+ gpointer *klass_data);
+static void gtk_im_context_scim_init (GtkIMContextSCIM *context_scim,
+ GtkIMContextSCIMClass *klass);
+static void gtk_im_context_scim_finalize (GObject *obj);
+static void gtk_im_context_scim_finalize_partial (GtkIMContextSCIM *context_scim);
+static void gtk_im_context_scim_set_client_window (GtkIMContext *context,
+ GdkWindow *client_window);
+static gboolean gtk_im_context_scim_filter_keypress (GtkIMContext *context,
+ GdkEventKey *key);
+static void gtk_im_context_scim_reset (GtkIMContext *context);
+static void gtk_im_context_scim_focus_in (GtkIMContext *context);
+static void gtk_im_context_scim_focus_out (GtkIMContext *context);
+static void gtk_im_context_scim_set_cursor_location (GtkIMContext *context,
+ GdkRectangle *area);
+static void gtk_im_context_scim_set_use_preedit (GtkIMContext *context,
+ gboolean use_preedit);
+static void gtk_im_context_scim_get_preedit_string (GtkIMContext *context,
+ gchar **str,
+ PangoAttrList **attrs,
+ gint *cursor_pos);
+
+static gboolean gtk_scim_key_snooper (GtkWidget *grab_widget,
+ GdkEventKey *event,
+ gpointer data);
+
+static void gtk_im_slave_commit_cb (GtkIMContext *context,
+ const char *str,
+ GtkIMContextSCIM *context_scim);
+
+/* private functions */
+static void panel_slot_reload_config (int context);
+static void panel_slot_exit (int context);
+static void panel_slot_update_lookup_table_page_size(int context,
+ int page_size);
+static void panel_slot_lookup_table_page_up (int context);
+static void panel_slot_lookup_table_page_down (int context);
+static void panel_slot_trigger_property (int context,
+ const String &property);
+static void panel_slot_process_helper_event (int context,
+ const String &target_uuid,
+ const String &helper_uuid,
+ const Transaction &trans);
+static void panel_slot_move_preedit_caret (int context,
+ int caret_pos);
+static void panel_slot_select_candidate (int context,
+ int cand_index);
+static void panel_slot_process_key_event (int context,
+ const KeyEvent &key);
+static void panel_slot_commit_string (int context,
+ const WideString &wstr);
+static void panel_slot_forward_key_event (int context,
+ const KeyEvent &key);
+static void panel_slot_request_help (int context);
+static void panel_slot_request_factory_menu (int context);
+static void panel_slot_change_factory (int context,
+ const String &uuid);
+static void panel_slot_reset_keyboard_ise (int context);
+static void panel_slot_show_preedit_string (int context);
+static void panel_slot_hide_preedit_string (int context);
+static void panel_slot_update_preedit_string (int context,
+ const WideString &str,
+ const AttributeList &attrs);
+
+static void panel_req_focus_in (GtkIMContextSCIM *ic);
+static void panel_req_update_screen (GtkIMContextSCIM *ic);
+static void panel_req_update_factory_info (GtkIMContextSCIM *ic);
+static void panel_req_update_spot_location (GtkIMContextSCIM *ic);
+static void panel_req_show_help (GtkIMContextSCIM *ic);
+static void panel_req_show_factory_menu (GtkIMContextSCIM *ic);
+
+/* Panel iochannel handler*/
+static bool panel_initialize ();
+static void panel_finalize ();
+static gboolean panel_iochannel_handler (GIOChannel *source,
+ GIOCondition condition,
+ gpointer user_data);
+
+/* utility functions */
+static bool filter_hotkeys (GtkIMContextSCIM *ic,
+ const KeyEvent &key);
+static void turn_on_ic (GtkIMContextSCIM *ic);
+static void turn_off_ic (GtkIMContextSCIM *ic);
+
+static void set_ic_capabilities (GtkIMContextSCIM *ic);
+
+static KeyEvent keyevent_gdk_to_scim (const GtkIMContextSCIM *ic,
+ const GdkEventKey &gdkevent);
+
+static GdkEventKey keyevent_scim_to_gdk (const GtkIMContextSCIM *ic,
+ const KeyEvent &scimkey, gboolean send_event);
+
+static void initialize (void);
+
+static void finalize (void);
+
+static void open_next_factory (GtkIMContextSCIM *ic);
+static void open_previous_factory (GtkIMContextSCIM *ic);
+static void open_specific_factory (GtkIMContextSCIM *ic,
+ const String &uuid);
+
+static void attach_instance (const IMEngineInstancePointer &si);
+
+/* slot functions */
+static void slot_show_preedit_string (IMEngineInstanceBase *si);
+static void slot_show_aux_string (IMEngineInstanceBase *si);
+static void slot_show_lookup_table (IMEngineInstanceBase *si);
+
+static void slot_hide_preedit_string (IMEngineInstanceBase *si);
+static void slot_hide_aux_string (IMEngineInstanceBase *si);
+static void slot_hide_lookup_table (IMEngineInstanceBase *si);
+
+static void slot_update_preedit_caret (IMEngineInstanceBase *si,
+ int caret);
+static void slot_update_preedit_string (IMEngineInstanceBase *si,
+ const WideString &str,
+ const AttributeList &attrs);
+static void slot_update_aux_string (IMEngineInstanceBase *si,
+ const WideString &str,
+ const AttributeList &attrs);
+static void slot_commit_string (IMEngineInstanceBase *si,
+ const WideString &str);
+static void slot_forward_key_event (IMEngineInstanceBase *si,
+ const KeyEvent &key);
+static void slot_update_lookup_table (IMEngineInstanceBase *si,
+ const LookupTable &table);
+
+static void slot_register_properties (IMEngineInstanceBase *si,
+ const PropertyList &properties);
+static void slot_update_property (IMEngineInstanceBase *si,
+ const Property &property);
+static void slot_beep (IMEngineInstanceBase *si);
+static void slot_start_helper (IMEngineInstanceBase *si,
+ const String &helper_uuid);
+static void slot_stop_helper (IMEngineInstanceBase *si,
+ const String &helper_uuid);
+static void slot_send_helper_event (IMEngineInstanceBase *si,
+ const String &helper_uuid,
+ const Transaction &trans);
+static bool slot_get_surrounding_text (IMEngineInstanceBase *si,
+ WideString &text,
+ int &cursor,
+ int maxlen_before,
+ int maxlen_after);
+static bool slot_delete_surrounding_text (IMEngineInstanceBase *si,
+ int offset,
+ int len);
+
+static void reload_config_callback (const ConfigPointer &config);
+
+static void fallback_commit_string_cb (IMEngineInstanceBase *si,
+ const WideString &str);
+
+
+
+
+/* Local variables declaration */
+static String _language;
+static GtkIMContextSCIMImpl *_used_ic_impl_list = 0;
+static GtkIMContextSCIMImpl *_free_ic_impl_list = 0;
+static GtkIMContextSCIM *_ic_list = 0;
+
+static GType _gtk_type_im_context_scim = 0;
+static GObjectClass *_parent_klass = 0;
+
+static KeyboardLayout _keyboard_layout = SCIM_KEYBOARD_Default;
+static int _valid_key_mask = SCIM_KEY_AllMasks;
+
+static FrontEndHotkeyMatcher _frontend_hotkey_matcher;
+static IMEngineHotkeyMatcher _imengine_hotkey_matcher;
+
+static IMEngineInstancePointer _default_instance;
+
+static ConfigModule *_config_module = 0;
+static ConfigPointer _config;
+static BackEndPointer _backend;
+
+static GtkIMContextSCIM *_focused_ic = 0;
+static GtkWidget *_focused_widget = 0;
+
+static bool _scim_initialized = false;
+
+static GdkColor _normal_bg;
+static GdkColor _normal_text;
+static GdkColor _active_bg;
+static GdkColor _active_text;
+
+static gint _snooper_id = 0;
+static bool _snooper_installed = false;
+
+static int _instance_count = 0;
+static int _context_count = 0;
+
+static IMEngineFactoryPointer _fallback_factory;
+static IMEngineInstancePointer _fallback_instance;
+
+static PanelClient _panel_client;
+
+static GIOChannel *_panel_iochannel = 0;
+static guint _panel_iochannel_read_source= 0;
+static guint _panel_iochannel_err_source = 0;
+static guint _panel_iochannel_hup_source = 0;
+
+static bool _on_the_spot = true;
+static bool _shared_input_method = false;
+static bool _use_key_snooper = false;
+
+static GdkColor *_theme_color = NULL;
+
+// A hack to shutdown the immodule cleanly even if im_module_exit () is not called when exiting.
+class FinalizeHandler
+{
+public:
+ FinalizeHandler () {
+ SCIM_DEBUG_FRONTEND(1) << "FinalizeHandler::FinalizeHandler ()\n";
+ }
+ ~FinalizeHandler () {
+ SCIM_DEBUG_FRONTEND(1) << "FinalizeHandler::~FinalizeHandler ()\n";
+ gtk_im_context_scim_shutdown ();
+ }
+};
+
+static FinalizeHandler _finalize_handler;
+
+/* Function Implementations */
+
+static GtkIMContextSCIMImpl *
+new_ic_impl (GtkIMContextSCIM *parent)
+{
+ GtkIMContextSCIMImpl *impl = NULL;
+
+ if (_free_ic_impl_list != NULL) {
+ impl = _free_ic_impl_list;
+ _free_ic_impl_list = _free_ic_impl_list->next;
+ } else {
+ impl = new GtkIMContextSCIMImpl;
+ if (impl == NULL)
+ return NULL;
+ }
+
+ impl->next = _used_ic_impl_list;
+ _used_ic_impl_list = impl;
+
+ impl->parent = parent;
+
+ return impl;
+}
+
+static void
+delete_ic_impl (GtkIMContextSCIMImpl *impl)
+{
+ GtkIMContextSCIMImpl *rec = _used_ic_impl_list, *last = 0;
+
+ for (; rec != 0; last = rec, rec = rec->next) {
+ if (rec == impl) {
+ if (last != 0)
+ last->next = rec->next;
+ else
+ _used_ic_impl_list = rec->next;
+
+ rec->next = _free_ic_impl_list;
+ _free_ic_impl_list = rec;
+
+ rec->parent = 0;
+ rec->si.reset ();
+ rec->client_window = 0;
+ rec->preedit_string = WideString ();
+ rec->preedit_attrlist.clear ();
+
+ return;
+ }
+ }
+}
+
+
+static void
+delete_all_ic_impl ()
+{
+ GtkIMContextSCIMImpl *it = _used_ic_impl_list;
+
+
+ while (it != 0) {
+ _used_ic_impl_list = it->next;
+ delete it;
+ it = _used_ic_impl_list;
+ }
+
+ it = _free_ic_impl_list;
+ while (it != 0) {
+ _free_ic_impl_list = it->next;
+ delete it;
+ it = _free_ic_impl_list;
+ }
+}
+
+static GtkIMContextSCIM *
+find_ic (int id)
+{
+ GtkIMContextSCIMImpl *rec = _used_ic_impl_list;
+
+ while (rec != 0) {
+ if (rec->parent && rec->parent->id == id)
+ return rec->parent;
+ rec = rec->next;
+ }
+
+ return 0;
+}
+
+
+/* Public functions */
+/**
+ * gtk_im_context_scim_new
+ *
+ * This function will be called by gtk.
+ * Create a instance of type GtkIMContext.
+ *
+ * Return value: A pointer to the newly created GtkIMContextSCIM instance
+ *
+ **/
+GtkIMContext *
+gtk_im_context_scim_new (void)
+{
+ print_time ("enter gtk_im_context_scim_new");
+ SCIM_DEBUG_FRONTEND(1) << "gtk_im_context_scim_new...\n";
+
+ GtkIMContextSCIM *result = NULL;
+
+ result = GTK_IM_CONTEXT_SCIM (g_object_new (GTK_TYPE_IM_CONTEXT_SCIM, NULL));
+
+ print_time ("exit gtk_im_context_scim_new");
+ return GTK_IM_CONTEXT (result);
+}
+
+/**
+ * gtk_im_context_scim_new
+ *
+ * Register the new type GtkIMContextSCIM to glib
+ *
+ **/
+void
+gtk_im_context_scim_register_type (GTypeModule *type_module)
+{
+ gettimeofday (&_scim_start, NULL);
+ print_time ("enter gtk_im_context_scim_register_type");
+ static const GTypeInfo im_context_scim_info =
+ {
+ sizeof (GtkIMContextSCIMClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) gtk_im_context_scim_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (GtkIMContextSCIM),
+ 0,
+ (GtkObjectInitFunc) gtk_im_context_scim_init,
+ };
+
+ SCIM_DEBUG_FRONTEND(1) << "gtk_im_context_scim_register_type...\n";
+
+ if (!_gtk_type_im_context_scim) {
+ _gtk_type_im_context_scim =
+ g_type_module_register_type (type_module,
+ GTK_TYPE_IM_CONTEXT,
+ "GtkIMContextSCIM",
+ &im_context_scim_info,
+ (GTypeFlags) 0);
+ }
+ print_time ("exit gtk_im_context_scim_register_type");
+}
+
+/**
+ * gtk_im_context_scim_shutdown
+ *
+ * It will be called when the scim im module is unloaded by gtk. It will do some cleanup
+ * job.
+ *
+ **/
+void
+gtk_im_context_scim_shutdown (void)
+{
+ print_time ("enter gtk_im_context_scim_shutdown");
+ SCIM_DEBUG_FRONTEND(1) << "gtk_im_context_scim_shutdown...\n";
+
+ if (_scim_initialized) {
+ SCIM_DEBUG_FRONTEND(1) << "gtk_im_context_scim_shutdown: call finalize ()...\n";
+ finalize ();
+ _scim_initialized = false;
+ }
+ print_time ("exit gtk_im_context_scim_shutdown");
+}
+
+/* Private functions */
+static void
+gtk_im_context_scim_class_init (GtkIMContextSCIMClass *klass,
+ gpointer *klass_data)
+{
+ print_time ("enter gtk_im_context_scim_class_init");
+ SCIM_DEBUG_FRONTEND(1) << "gtk_im_context_scim_class_init...\n";
+
+ GtkIMContextClass *im_context_klass = GTK_IM_CONTEXT_CLASS (klass);
+ GObjectClass *gobject_klass = G_OBJECT_CLASS (klass);
+
+ _parent_klass = (GObjectClass *) g_type_class_peek_parent (klass);
+
+ im_context_klass->set_client_window = gtk_im_context_scim_set_client_window;
+ im_context_klass->filter_keypress = gtk_im_context_scim_filter_keypress;
+ im_context_klass->reset = gtk_im_context_scim_reset;
+ im_context_klass->get_preedit_string = gtk_im_context_scim_get_preedit_string;
+ im_context_klass->focus_in = gtk_im_context_scim_focus_in;
+ im_context_klass->focus_out = gtk_im_context_scim_focus_out;
+ im_context_klass->set_cursor_location = gtk_im_context_scim_set_cursor_location;
+ im_context_klass->set_use_preedit = gtk_im_context_scim_set_use_preedit;
+ gobject_klass->finalize = gtk_im_context_scim_finalize;
+
+ if (!_scim_initialized) {
+ initialize ();
+ _scim_initialized = true;
+ }
+ print_time ("exit gtk_im_context_scim_class_init");
+}
+
+static void
+gtk_im_context_scim_init (GtkIMContextSCIM *context_scim,
+ GtkIMContextSCIMClass *klass)
+{
+ print_time ("enter gtk_im_context_scim_init");
+ SCIM_DEBUG_FRONTEND(1) << "gtk_im_context_scim_init...\n";
+
+ context_scim->impl = NULL;
+
+ /* slave exists for using gtk+'s table based input method */
+ context_scim->slave = gtk_im_context_simple_new ();
+ g_signal_connect(G_OBJECT(context_scim->slave),
+ "commit",
+ G_CALLBACK(gtk_im_slave_commit_cb),
+ context_scim);
+
+ if (_backend.null ()) return;
+
+ IMEngineInstancePointer si;
+
+ // Use the default instance if "shared input method" mode is enabled.
+ if (_shared_input_method && !_default_instance.null ()) {
+ si = _default_instance;
+ SCIM_DEBUG_FRONTEND(2) << "use default instance: " << si->get_id () << " " << si->get_factory_uuid () << "\n";
+ }
+
+ // Not in "shared input method" mode, or no default instance, create an instance.
+ if (si.null ()) {
+ IMEngineFactoryPointer factory = _backend->get_default_factory (_language, "UTF-8");
+ if (factory.null ()) return;
+ si = factory->create_instance ("UTF-8", _instance_count++);
+ if (si.null ()) return;
+ attach_instance (si);
+ SCIM_DEBUG_FRONTEND(2) << "create new instance: " << si->get_id () << " " << si->get_factory_uuid () << "\n";
+ }
+
+ // If "shared input method" mode is enabled, and there is no default instance,
+ // then store this instance as default one.
+ if (_shared_input_method && _default_instance.null ()) {
+ SCIM_DEBUG_FRONTEND(2) << "update default instance.\n";
+ _default_instance = si;
+ }
+
+ context_scim->impl = new_ic_impl (context_scim);
+ if (context_scim->impl == NULL)
+ {
+ std::cerr << "memory allocation failed in " << __FUNCTION__ << "\n";
+ return;
+ }
+
+ context_scim->impl->si = si;
+ context_scim->impl->client_window = NULL;
+ context_scim->impl->preedit_caret = 0;
+ context_scim->impl->cursor_x = 0;
+ context_scim->impl->cursor_y = 0;
+ context_scim->impl->cursor_top_y = 0;
+ context_scim->impl->is_on = FALSE;
+ context_scim->impl->shared_si = _shared_input_method;
+ context_scim->impl->use_preedit = _on_the_spot;
+ context_scim->impl->preedit_started = false;
+ context_scim->impl->preedit_updating = false;
+ context_scim->impl->need_commit_preedit = false;
+
+ if (_context_count == 0) _context_count = time (NULL);
+ context_scim->id = _context_count++;
+ if (!_ic_list)
+ context_scim->next = NULL;
+ else
+ context_scim->next = _ic_list;
+ _ic_list = context_scim;
+
+ if (_shared_input_method)
+ context_scim->impl->is_on = _config->read (String (SCIM_CONFIG_FRONTEND_IM_OPENED_BY_DEFAULT), context_scim->impl->is_on);
+
+ _panel_client.prepare (context_scim->id);
+ _panel_client.register_input_context (context_scim->id, si->get_factory_uuid ());
+ _panel_client.start_default_ise (context_scim->id);
+ set_ic_capabilities (context_scim);
+ _panel_client.send ();
+
+ SCIM_DEBUG_FRONTEND(2) << "input context created: id = " << context_scim->id << "\n";
+ print_time ("exit gtk_im_context_scim_init");
+}
+
+static void
+gtk_im_context_scim_finalize_partial (GtkIMContextSCIM *context_scim)
+{
+ SCIM_DEBUG_FRONTEND(1) << "gtk_im_context_scim_finalize_partial id=" << context_scim->id << "\n";
+
+ if (context_scim->impl) {
+ _panel_client.prepare (context_scim->id);
+
+ if (context_scim == _focused_ic)
+ context_scim->impl->si->focus_out ();
+
+ // Delete the instance.
+ // FIXME:
+ // In case the instance send out some helper event,
+ // and this context has been focused out,
+ // we need set the focused_ic to this context temporary.
+ GtkIMContextSCIM *old_focused = _focused_ic;
+ _focused_ic = context_scim;
+ context_scim->impl->si.reset ();
+ _focused_ic = old_focused;
+
+ if (context_scim == _focused_ic) {
+ _panel_client.turn_off (context_scim->id);
+ _panel_client.focus_out (context_scim->id);
+ }
+
+ _panel_client.remove_input_context (context_scim->id);
+ _panel_client.send ();
+
+ if (context_scim->impl->client_window)
+ g_object_unref (context_scim->impl->client_window);
+
+ delete_ic_impl (context_scim->impl);
+
+ context_scim->impl = 0;
+ }
+
+ if (context_scim == _focused_ic)
+ _focused_ic = 0;
+}
+
+static void
+gtk_im_context_scim_finalize (GObject *obj)
+{
+ print_time ("enter gtk_im_context_scim_finalize");
+ GtkIMContextSCIM *context_scim = GTK_IM_CONTEXT_SCIM (obj);
+
+ if (context_scim == NULL)
+ return;
+
+ SCIM_DEBUG_FRONTEND(1) << "gtk_im_context_scim_finalize id=" << context_scim->id << "\n";
+
+ if ((_ic_list != NULL))
+ {
+ if(context_scim->id != _ic_list->id) {
+ GtkIMContextSCIM * pre = _ic_list;
+ GtkIMContextSCIM * cur = _ic_list->next;
+ while (cur != NULL) {
+ if (cur->id == context_scim->id) {
+ pre->next = cur->next;
+ break;
+ }
+ pre = cur;
+ cur = cur->next;
+ }
+ } else
+ _ic_list = _ic_list->next;
+ }
+
+ if (_theme_color != NULL) {
+ gdk_color_free (_theme_color);
+ _theme_color = NULL;
+ }
+
+ g_signal_handlers_disconnect_by_func(context_scim->slave,
+ (void *)gtk_im_slave_commit_cb,
+ (void *)context_scim);
+ g_object_unref(context_scim->slave);
+
+ gtk_im_context_scim_finalize_partial (context_scim);
+
+ _parent_klass->finalize (obj);
+ print_time ("exit gtk_im_context_scim_finalize");
+}
+
+/**
+ * gtk_im_context_scim_set_client_window:
+ * @context: a #GtkIMContext
+ * @window: the client window. This may be %NULL to indicate
+ * that the previous client window no longer exists.
+ *
+ * This function will be called by gtk.
+ * Set the client window for the input context; this is the
+ * #GdkWindow in which the input appears. This window is
+ * used in order to correctly position status windows, and may
+ * also be used for purposes internal to the input method.
+ *
+ **/
+static void
+gtk_im_context_scim_set_client_window (GtkIMContext *context,
+ GdkWindow *client_window)
+{
+ print_time ("enter gtk_im_context_scim_set_client_window");
+ SCIM_DEBUG_FRONTEND(1) << "gtk_im_context_scim_set_client_window...\n";
+
+ GtkIMContextSCIM *context_scim = GTK_IM_CONTEXT_SCIM (context);
+
+ if (context_scim && context_scim->impl) {
+ if (client_window)
+ g_object_ref (client_window);
+
+ if (context_scim->impl->client_window)
+ g_object_unref (context_scim->impl->client_window);
+
+ context_scim->impl->client_window = client_window;
+ }
+ print_time ("exit gtk_im_context_scim_set_client_window");
+}
+
+/**
+ * gtk_im_context_scim_filter_keypress:
+ * @context: a #GtkIMContext
+ * @event: the key event
+ *
+ * This function will be called by gtk.
+ * Allow an input method to internally handle key press and release
+ * events. If this function returns %TRUE, then no further processing
+ * should be done for this key event.
+ *
+ * Return value: %TRUE if the input method handled the key event.
+ *
+ **/
+static gboolean
+gtk_im_context_scim_filter_keypress (GtkIMContext *context,
+ GdkEventKey *event)
+{
+ print_time ("enter gtk_im_context_scim_filter_keypress");
+ SCIM_DEBUG_FRONTEND(1) << "gtk_im_context_scim_filter_keypress...\n";
+
+ if (event->keyval == 255 && (event->keyval & GDK_SHIFT_MASK))
+ return (gboolean)TRUE;
+
+ GtkIMContextSCIM *context_scim = GTK_IM_CONTEXT_SCIM (context);
+
+ gboolean ret = FALSE;
+
+ if (context_scim) {
+ if (!_snooper_installed)
+ ret = gtk_scim_key_snooper (0, event, 0);
+
+ if (!ret && context_scim->slave)
+ ret = gtk_im_context_filter_keypress (context_scim->slave, event);
+ }
+
+ print_time ("exit gtk_im_context_scim_filter_keypress");
+ return ret;
+}
+
+/**
+ * gtk_im_context_scim_reset:
+ * @context: a #GtkIMContext
+ *
+ * This function will be called by gtk.
+ * Notify the input method that a change such as a change in cursor
+ * position has been made. This will typically cause the input
+ * method to clear the preedit state.
+ **/
+static void
+gtk_im_context_scim_reset (GtkIMContext *context)
+{
+ print_time ("enter gtk_im_context_scim_reset");
+ SCIM_DEBUG_FRONTEND(1) << "gtk_im_context_scim_reset...\n";
+
+ GtkIMContextSCIM *context_scim = GTK_IM_CONTEXT_SCIM (context);
+
+ if (context_scim && context_scim->impl && context_scim == _focused_ic) {
+ WideString wstr = context_scim->impl->preedit_string;
+
+ _panel_client.prepare (context_scim->id);
+ context_scim->impl->si->reset ();
+ _panel_client.send ();
+
+ if (context_scim->impl->need_commit_preedit)
+ {
+ panel_slot_hide_preedit_string (context_scim->id);
+
+ if (wstr.length ())
+ g_signal_emit_by_name (context_scim, "commit", utf8_wcstombs (wstr).c_str ());
+
+ _panel_client.prepare (context_scim->id);
+ _panel_client.reset_input_context (context_scim->id);
+ _panel_client.send ();
+ }
+ }
+ print_time ("exit gtk_im_context_scim_reset");
+}
+
+/**
+ * gtk_im_context_scim_focus_in:
+ * @context: a #GtkIMContext
+ *
+ * This function will be called by gtk.
+ * Notify the input method that the widget to which this
+ * input context corresponds has gained focus. The input method
+ * may, for example, change the displayed feedback to reflect
+ * this change.
+ **/
+static void
+gtk_im_context_scim_focus_in (GtkIMContext *context)
+{
+ print_time ("enter gtk_im_context_scim_focus_in");
+ GtkIMContextSCIM *context_scim = GTK_IM_CONTEXT_SCIM (context);
+
+ if (context_scim)
+ SCIM_DEBUG_FRONTEND(1) << "gtk_im_context_scim_focus_in(" << context_scim->id << ")...\n";
+
+ if (_focused_ic) {
+ if (_focused_ic == context_scim) {
+ SCIM_DEBUG_FRONTEND(1) << "It's already focused.\n";
+ return;
+ }
+ SCIM_DEBUG_FRONTEND(1) << "Focus out previous IC first: " << _focused_ic->id << "\n";
+ gtk_im_context_scim_focus_out (GTK_IM_CONTEXT (_focused_ic));
+ }
+
+ // Only use key snooper when use_key_snooper option is enabled and a gtk main loop is running.
+ if (_use_key_snooper && !_snooper_installed && gtk_main_level () > 0) {
+ SCIM_DEBUG_FRONTEND(2) << "Install key snooper.\n";
+ _snooper_id = gtk_key_snooper_install ((GtkKeySnoopFunc)gtk_scim_key_snooper, NULL);
+ _snooper_installed = true;
+ }
+
+ bool need_cap = false;
+ bool need_reset = false;
+ bool need_reg = false;
+
+ if (context_scim && context_scim->impl) {
+ _focused_ic = context_scim;
+ _panel_client.prepare (context_scim->id);
+
+ // Handle the "Shared Input Method" mode.
+ if (_shared_input_method) {
+ SCIM_DEBUG_FRONTEND(2) << "shared input method.\n";
+ IMEngineFactoryPointer factory = _backend->get_default_factory (_language, "UTF-8");
+ if (!factory.null ()) {
+ if (_default_instance.null () || _default_instance->get_factory_uuid () != factory->get_uuid ()) {
+ _default_instance = factory->create_instance ("UTF-8", _default_instance.null () ? _instance_count++ : _default_instance->get_id ());
+ attach_instance (_default_instance);
+ SCIM_DEBUG_FRONTEND(2) << "create new default instance: " << _default_instance->get_id () << " " << _default_instance->get_factory_uuid () << "\n";
+ }
+
+ context_scim->impl->shared_si = true;
+ context_scim->impl->si = _default_instance;
+
+ context_scim->impl->is_on = _config->read (String (SCIM_CONFIG_FRONTEND_IM_OPENED_BY_DEFAULT), context_scim->impl->is_on);
+ context_scim->impl->preedit_string.clear ();
+ context_scim->impl->preedit_attrlist.clear ();
+ context_scim->impl->preedit_caret = 0;
+ context_scim->impl->preedit_started = false;
+ need_cap = true;
+ need_reset = true;
+ need_reg = true;
+ }
+ } else if (context_scim->impl->shared_si) {
+ SCIM_DEBUG_FRONTEND(2) << "exit shared input method.\n";
+ IMEngineFactoryPointer factory = _backend->get_default_factory (_language, "UTF-8");
+ if (!factory.null ()) {
+ context_scim->impl->si = factory->create_instance ("UTF-8", _instance_count++);
+ context_scim->impl->preedit_string.clear ();
+ context_scim->impl->preedit_attrlist.clear ();
+ context_scim->impl->preedit_caret = 0;
+ context_scim->impl->preedit_started = false;
+ attach_instance (context_scim->impl->si);
+ need_cap = true;
+ need_reg = true;
+ context_scim->impl->shared_si = false;
+ SCIM_DEBUG_FRONTEND(2) << "create new instance: " << context_scim->impl->si->get_id () << " " << context_scim->impl->si->get_factory_uuid () << "\n";
+ }
+ }
+
+ context_scim->impl->si->set_frontend_data (static_cast <void*> (context_scim));
+
+ if (need_reg) _panel_client.register_input_context (context_scim->id, context_scim->impl->si->get_factory_uuid ());
+ if (need_cap) set_ic_capabilities (context_scim);
+ if (need_reset) context_scim->impl->si->reset ();
+
+ panel_req_focus_in (context_scim);
+// panel_req_update_screen (context_scim);
+ panel_req_update_spot_location (context_scim);
+ panel_req_update_factory_info (context_scim);
+
+ if (context_scim->impl->is_on) {
+ _panel_client.turn_on (context_scim->id);
+// _panel_client.hide_preedit_string (context_scim->id);
+// _panel_client.hide_aux_string (context_scim->id);
+// _panel_client.hide_lookup_table (context_scim->id);
+ context_scim->impl->si->focus_in ();
+ } else {
+ _panel_client.turn_off (context_scim->id);
+ }
+
+ if (!context_scim->impl->is_on)
+ turn_on_ic (context_scim);
+
+ _panel_client.send ();
+ }
+
+ // Get theme color for preedit background color
+/* if (_theme_color != NULL) {
+ gdk_color_free (_theme_color);
+ _theme_color = NULL;
+ }*/
+
+ /*
+ if (_theme_color == NULL)
+ {
+ GtkWidget *temp_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_widget_realize (temp_window);
+ gtk_widget_style_get (temp_window, "theme-color", &_theme_color, NULL);
+ if (GTK_IS_WIDGET (temp_window))
+ gtk_widget_destroy (temp_window);
+ }
+ */
+
+ print_time ("exit gtk_im_context_scim_focus_in");
+}
+
+/**
+ * gtk_im_context_scim_focus_out:
+ * @context: a #GtkIMContext
+ *
+ * This function will be called by gtk.
+ * Notify the input method that the widget to which this
+ * input context corresponds has lost focus. The input method
+ * may, for example, change the displayed feedback or reset the contexts
+ * state to reflect this change.
+ **/
+static void
+gtk_im_context_scim_focus_out (GtkIMContext *context)
+{
+ print_time ("enter gtk_im_context_scim_focus_out");
+ GtkIMContextSCIM *context_scim = GTK_IM_CONTEXT_SCIM (context);
+
+ if (context_scim)
+ SCIM_DEBUG_FRONTEND(1) << "gtk_im_context_scim_focus_out(" << context_scim->id << ")...\n";
+
+ if (_snooper_installed) {
+ SCIM_DEBUG_FRONTEND(2) << "Remove key snooper.\n";
+ gtk_key_snooper_remove (_snooper_id);
+ _snooper_installed = false;
+ }
+
+ if (context_scim && context_scim->impl && context_scim == _focused_ic) {
+
+ WideString wstr = context_scim->impl->preedit_string;
+
+ //sehwan added
+ if (context_scim->impl->need_commit_preedit)
+ {
+ panel_slot_hide_preedit_string (context_scim->id);
+
+ if (wstr.length ())
+ g_signal_emit_by_name (context_scim, "commit", utf8_wcstombs (wstr).c_str ());
+
+ _panel_client.prepare (context_scim->id);
+ _panel_client.reset_input_context (context_scim->id);
+ _panel_client.send ();
+ }
+
+ _panel_client.prepare (context_scim->id);
+ context_scim->impl->si->focus_out ();
+ context_scim->impl->si->reset ();
+ //if (context_scim->impl->shared_si) context_scim->impl->si->reset ();
+ _panel_client.focus_out (context_scim->id);
+ _panel_client.send ();
+ _focused_ic = 0;
+ }
+ print_time ("exit gtk_im_context_scim_focus_out");
+}
+
+/**
+ * gtk_im_context_scim_set_cursor_location:
+ * @context: a #GtkIMContext
+ * @area: new location
+ *
+ * This function will be called gtk.
+ * Notify the input method that a change in cursor
+ * position has been made. The location is relative to the client
+ * window.
+ **/
+static void
+gtk_im_context_scim_set_cursor_location (GtkIMContext *context,
+ GdkRectangle *area)
+{
+ print_time ("enter gtk_im_context_scim_set_cursor_location");
+ SCIM_DEBUG_FRONTEND(4) << "gtk_im_context_scim_set_cursor_location...\n";
+
+ gint x, y;
+ GtkIMContextSCIM *context_scim = GTK_IM_CONTEXT_SCIM (context);
+#ifdef USING_ISF_MAINWINDOW_AUTOSCROLL
+ gtk_ise_set_cursor_location (area);
+#endif
+ ISF_PROF_DEBUG("last message");
+#if 1
+ if (context_scim && context_scim->impl && context_scim->impl->client_window && context_scim == _focused_ic) {
+ // Don't update spot location while updating preedit string.
+ if (context_scim->impl->preedit_updating)
+ return;
+
+ gdk_window_get_origin(context_scim->impl->client_window, &x, &y);
+ if (context_scim->impl->cursor_x != x + area->x + area->width ||
+ context_scim->impl->cursor_y != y + area->y + area->height) {
+ context_scim->impl->cursor_x = x + area->x + area->width;
+ context_scim->impl->cursor_y = y + area->y + area->height;
+ context_scim->impl->cursor_top_y = y + area->y;
+// if (area->y > 0)
+// context_scim->impl->cursor_top_y = y + area->y - 4;
+
+ _panel_client.prepare (context_scim->id);
+ panel_req_update_spot_location (context_scim);
+ _panel_client.send ();
+ SCIM_DEBUG_FRONTEND(2) << "new cursor location = " << context_scim->impl->cursor_x << "," << context_scim->impl->cursor_y << "\n";
+ }
+ }
+#endif
+ print_time ("exit gtk_im_context_scim_set_cursor_location");
+}
+
+/**
+ * gtk_im_context_scim_set_use_preedit:
+ * @context: a #GtkIMContext
+ * @area: new location
+ *
+ * This function will be called by gtk.
+ * Notify the input method that a change in cursor
+ * position has been made. The location is relative to the client
+ * window.
+ **/
+static void
+gtk_im_context_scim_set_use_preedit (GtkIMContext *context,
+ gboolean use_preedit)
+{
+ print_time ("enter gtk_im_context_scim_set_use_preedit");
+ SCIM_DEBUG_FRONTEND(1) << "gtk_im_context_scim_set_use_preedit = " << (use_preedit ? "true" : "false") << "...\n";
+
+ GtkIMContextSCIM *context_scim = GTK_IM_CONTEXT_SCIM (context);
+
+ if (!_on_the_spot) return;
+
+ if (context_scim && context_scim->impl) {
+ bool old = context_scim->impl->use_preedit;
+ context_scim->impl->use_preedit = use_preedit;
+ if (context_scim == _focused_ic) {
+ _panel_client.prepare (context_scim->id);
+
+ if (old != use_preedit)
+ set_ic_capabilities (context_scim);
+
+ if (context_scim->impl->preedit_string.length ())
+ slot_show_preedit_string (context_scim->impl->si);
+
+ _panel_client.send ();
+ }
+ }
+ print_time ("exit gtk_im_context_scim_set_use_preedit");
+}
+
+/**
+ * gtk_im_context_scim_get_preedit_string:
+ * @context: a #GtkIMContext
+ * @str: location to store the retrieved string. The
+ * string retrieved must be freed with g_free ().
+ * @attrs: location to store the retrieved attribute list.
+ * When you are done with this list, you must
+ * unreference it with pango_attr_list_unref().
+ * @cursor_pos: location to store position of cursor (in characters)
+ * within the preedit string.
+ *
+ * This function will be called by gtk
+ * Retrieve the current preedit string for the input context,
+ * and a list of attributes to apply to the string.
+ * This string should be displayed inserted at the insertion
+ * point.
+ **/
+static void
+gtk_im_context_scim_get_preedit_string (GtkIMContext *context,
+ gchar **str,
+ PangoAttrList **attrs,
+ gint *cursor_pos)
+{
+ print_time ("enter gtk_im_context_scim_get_preedit_string");
+ SCIM_DEBUG_FRONTEND(1) << "gtk_im_context_scim_get_preedit_string...\n";
+
+ GtkIMContextSCIM *context_scim = GTK_IM_CONTEXT_SCIM (context);
+
+ if (context_scim && context_scim->impl && context_scim->impl->is_on) {
+ String mbs = utf8_wcstombs (context_scim->impl->preedit_string);
+
+ if (str) {
+ if (mbs.length ())
+ *str = g_strdup (mbs.c_str ());
+ else
+ *str = g_strdup ("");
+ }
+
+ if (cursor_pos) {
+ *cursor_pos = context_scim->impl->preedit_caret;
+ }
+
+ if (attrs) {
+ *attrs = pango_attr_list_new ();
+
+ if (mbs.length ()) {
+ guint start_index, end_index;
+ guint wlen = context_scim->impl->preedit_string.length ();
+
+ PangoAttribute *attr = NULL;
+ AttributeList::const_iterator i;
+ //bool underline = false;
+ bool *attrs_flag = new bool [mbs.length ()];
+
+ memset (attrs_flag, 0, mbs.length () * sizeof (bool));
+
+ for (i = context_scim->impl->preedit_attrlist.begin ();
+ i != context_scim->impl->preedit_attrlist.end (); ++i) {
+ start_index = i->get_start ();
+ end_index = i->get_end ();
+
+ if (end_index <= wlen && start_index < end_index && i->get_type () != SCIM_ATTR_DECORATE_NONE) {
+ start_index = g_utf8_offset_to_pointer (mbs.c_str (), i->get_start ()) - mbs.c_str ();
+ end_index = g_utf8_offset_to_pointer (mbs.c_str (), i->get_end ()) - mbs.c_str ();
+
+ if (i->get_type () == SCIM_ATTR_DECORATE) {
+ if (i->get_value () == scim::SCIM_ATTR_DECORATE_UNDERLINE) {
+ attr = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE);
+ if (attr == NULL)
+ continue;
+ attr->start_index = start_index;
+ attr->end_index = end_index;
+ pango_attr_list_insert (*attrs, attr);
+ //underline = true;
+ } else if (i->get_value () == SCIM_ATTR_DECORATE_REVERSE) {
+ attr = pango_attr_foreground_new (_normal_bg.red, _normal_bg.green, _normal_bg.blue);
+ if (attr == NULL)
+ continue;
+ attr->start_index = start_index;
+ attr->end_index = end_index;
+ pango_attr_list_insert (*attrs, attr);
+
+ attr = pango_attr_background_new (_normal_text.red, _normal_text.green, _normal_text.blue);
+ if (attr == NULL)
+ continue;
+ attr->start_index = start_index;
+ attr->end_index = end_index;
+ pango_attr_list_insert (*attrs, attr);
+ } else if (i->get_value () == SCIM_ATTR_DECORATE_HIGHLIGHT) {
+ attr = pango_attr_foreground_new (_active_text.red, _active_text.green, _active_text.blue);
+ if (attr == NULL)
+ continue;
+ //attr = pango_attr_foreground_new (65535, 65535, 65535);
+ attr->start_index = start_index;
+ attr->end_index = end_index;
+ pango_attr_list_insert (*attrs, attr);
+
+ attr = pango_attr_background_new (_active_bg.red, _active_bg.green, _active_bg.blue);
+ if (attr == NULL)
+ continue;
+ //attr = pango_attr_background_new (32767, 32767, 32767);
+ attr->start_index = start_index;
+ attr->end_index = end_index;
+ pango_attr_list_insert (*attrs, attr);
+ }
+ } else if (i->get_type () == SCIM_ATTR_FOREGROUND) {
+ unsigned int color = i->get_value ();
+
+ attr = pango_attr_foreground_new (SCIM_RGB_COLOR_RED(color) * 256, SCIM_RGB_COLOR_GREEN(color) * 256, SCIM_RGB_COLOR_BLUE(color) * 256);
+ if (attr == NULL)
+ continue;
+ attr->start_index = start_index;
+ attr->end_index = end_index;
+ pango_attr_list_insert (*attrs, attr);
+ } else if (i->get_type () == SCIM_ATTR_BACKGROUND) {
+ unsigned int color = i->get_value ();
+
+ attr = pango_attr_background_new (SCIM_RGB_COLOR_RED(color) * 256, SCIM_RGB_COLOR_GREEN(color) * 256, SCIM_RGB_COLOR_BLUE(color) * 256);
+ if (attr == NULL)
+ continue;
+ attr->start_index = start_index;
+ attr->end_index = end_index;
+ pango_attr_list_insert (*attrs, attr);
+ }
+
+ // Record which character has attribute.
+ for (guint pos = start_index; pos < end_index; ++pos)
+ attrs_flag [pos] = 1;
+ }
+ }
+
+ // Add underline for all characters which don't have attribute.
+ for (guint pos = 0; pos < mbs.length (); ++pos) {
+ if (!attrs_flag [pos]) {
+ guint begin_pos = pos;
+
+ while (pos < mbs.length () && !attrs_flag [pos])
+ ++pos;
+
+ // use REVERSE style as default
+ attr = pango_attr_foreground_new (_normal_bg.red, _normal_bg.green, _normal_bg.blue);
+ if (attr == NULL)
+ continue;
+ attr->start_index = begin_pos;
+ attr->end_index = pos;
+ pango_attr_list_insert (*attrs, attr);
+
+ attr = pango_attr_background_new (_normal_text.red, _normal_text.green, _normal_text.blue);
+ if (attr == NULL)
+ continue;
+ attr->start_index = begin_pos;
+ attr->end_index = pos;
+ pango_attr_list_insert (*attrs, attr);
+
+ /*
+ attr = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE);
+ attr->start_index = begin_pos;
+ attr->end_index = pos;
+ pango_attr_list_insert (*attrs, attr);
+ */
+ }
+ }
+
+ delete [] attrs_flag;
+ }
+ }
+ } else {
+ if (str)
+ *str = g_strdup ("");
+
+ if (cursor_pos)
+ *cursor_pos = 0;
+
+ if (attrs)
+ *attrs = pango_attr_list_new ();
+ }
+ print_time ("exit gtk_im_context_scim_get_preedit_string");
+}
+
+static gboolean
+gtk_scim_key_snooper (GtkWidget *grab_widget,
+ GdkEventKey *event,
+ gpointer data)
+{
+ SCIM_DEBUG_FRONTEND(3) << "gtk_scim_key_snooper...\n";
+
+ gboolean ret = FALSE;
+
+ if (_focused_ic && _focused_ic->impl && (event->type == GDK_KEY_PRESS || event->type == GDK_KEY_RELEASE) && !event->send_event) {
+ _focused_widget = grab_widget;
+
+ KeyEvent key = keyevent_gdk_to_scim (_focused_ic, *event);
+
+ key.mask &= _valid_key_mask;
+
+ key.layout = _keyboard_layout;
+
+ _panel_client.prepare (_focused_ic->id);
+
+ if (!filter_hotkeys (_focused_ic, key)) {
+ if (!_focused_ic->impl->is_on || !_focused_ic->impl->si->process_key_event (key)) {
+ SCIM_DEBUG_FRONTEND(3) << "Failed to process: "
+ << (!_focused_ic->impl->is_on ? "IC is off" : "IC doesn't process")
+ << ".\n";
+ ret = _fallback_instance->process_key_event (key);
+ } else {
+ ret = TRUE;
+ }
+ } else {
+ ret = TRUE;
+ }
+
+ _panel_client.send ();
+
+ _focused_widget = 0;
+ } else {
+ SCIM_DEBUG_FRONTEND(3) << "Failed snooper: "
+ << ((!_focused_ic || !_focused_ic->impl) ? "Invalid focused ic" :
+ (event->send_event ? "send event is set" : "unknown"))
+ << "\n";
+ }
+
+ return ret;
+}
+
+static void
+gtk_im_slave_commit_cb (GtkIMContext *context,
+ const char *str,
+ GtkIMContextSCIM *context_scim)
+{
+ g_return_if_fail(str);
+ g_signal_emit_by_name(context_scim, "commit", str);
+}
+
+/* Panel Slot functions */
+static void
+panel_slot_reload_config (int context)
+{
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_reload_config...\n";
+ _config->reload ();
+}
+
+static void
+panel_slot_exit (int /* context */)
+{
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_exit...\n";
+
+ finalize ();
+}
+
+static void
+panel_slot_update_lookup_table_page_size (int context, int page_size)
+{
+ GtkIMContextSCIM *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_update_lookup_table_page_size context=" << context << " page_size=" << page_size << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ ic->impl->si->update_lookup_table_page_size (page_size);
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_lookup_table_page_up (int context)
+{
+ GtkIMContextSCIM *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_lookup_table_page_up context=" << context << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ ic->impl->si->lookup_table_page_up ();
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_lookup_table_page_down (int context)
+{
+ GtkIMContextSCIM *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_lookup_table_page_down context=" << context << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ ic->impl->si->lookup_table_page_down ();
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_trigger_property (int context, const String &property)
+{
+ GtkIMContextSCIM *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_trigger_property context=" << context << " property=" << property << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ ic->impl->si->trigger_property (property);
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_process_helper_event (int context, const String &target_uuid, const String &helper_uuid, const Transaction &trans)
+{
+ GtkIMContextSCIM *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_process_helper_event context=" << context << " target=" << target_uuid
+ << " helper=" << helper_uuid << " ic=" << ic << " ic->impl=" << (ic ? ic->impl : 0) << " ic-uuid="
+ << ((ic && ic->impl) ? ic->impl->si->get_factory_uuid () : "" ) << "\n";
+ if (ic && ic->impl && ic->impl->si->get_factory_uuid () == target_uuid) {
+ _panel_client.prepare (ic->id);
+ SCIM_DEBUG_FRONTEND(2) << "call process_helper_event\n";
+ ic->impl->si->process_helper_event (helper_uuid, trans);
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_move_preedit_caret (int context, int caret_pos)
+{
+ GtkIMContextSCIM *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_move_preedit_caret context=" << context << " caret=" << caret_pos << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ ic->impl->si->move_preedit_caret (caret_pos);
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_select_candidate (int context, int cand_index)
+{
+ GtkIMContextSCIM *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_select_candidate context=" << context << " candidate=" << cand_index << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ ic->impl->si->select_candidate (cand_index);
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_process_key_event (int context, const KeyEvent &key)
+{
+ GtkIMContextSCIM *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_process_key_event context=" << context << " key=" << key.get_key_string () << " ic=" << ic << "\n";
+
+ if (_focused_ic != ic)
+ return;
+
+ if (ic && ic->impl) {
+ // Just send it to key_snooper and bypass to client directly (because send_event is set to TRUE).
+ GdkEventKey gdkevent = keyevent_scim_to_gdk (ic, key, FALSE);
+ gdk_event_put ((GdkEvent *)&gdkevent);
+ }
+}
+
+static void
+panel_slot_commit_string (int context, const WideString &wstr)
+{
+ GtkIMContextSCIM *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_commit_string context=" << context << " str=" << utf8_wcstombs (wstr) << " ic=" << ic << "\n";
+
+ if (_focused_ic != ic)
+ return;
+
+ if (ic && ic->impl)
+ g_signal_emit_by_name (ic, "commit", utf8_wcstombs (wstr).c_str ());
+}
+
+static void
+panel_slot_forward_key_event (int context, const KeyEvent &key)
+{
+ GtkIMContextSCIM *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_forward_key_event context=" << context << " key=" << key.get_key_string () << " ic=" << ic << "\n";
+
+ if (_focused_ic != ic)
+ return;
+
+ if (ic && ic->impl) {
+ // Just send it to key_snooper and bypass to client directly (because send_event is set to TRUE).
+ GdkEventKey gdkevent = keyevent_scim_to_gdk (ic, key, TRUE);
+ gdk_event_put ((GdkEvent *)&gdkevent);
+ }
+}
+
+static void
+panel_slot_request_help (int context)
+{
+ GtkIMContextSCIM *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_request_help context=" << context << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ panel_req_show_help (ic);
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_request_factory_menu (int context)
+{
+ GtkIMContextSCIM *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_request_factory_menu context=" << context << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ _panel_client.prepare (ic->id);
+ panel_req_show_factory_menu (ic);
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_change_factory (int context, const String &uuid)
+{
+ GtkIMContextSCIM *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_change_factory context=" << context << " factory=" << uuid << " ic=" << ic << "\n";
+ if (ic && ic->impl) {
+ ic->impl->si->reset ();
+ _panel_client.prepare (ic->id);
+ open_specific_factory (ic, uuid);
+ _panel_client.send ();
+ }
+}
+
+static void
+panel_slot_reset_keyboard_ise (int context)
+{
+ GtkIMContextSCIM *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_reset_keyboard_ise context=" << context << " ic=" << ic << "\n";
+ if (ic && ic->impl)
+ {
+ WideString wstr = ic->impl->preedit_string;
+ if (ic->impl->need_commit_preedit)
+ {
+ panel_slot_hide_preedit_string (ic->id);
+
+ if (wstr.length ())
+ g_signal_emit_by_name (ic, "commit", utf8_wcstombs (wstr).c_str ());
+ }
+ ic->impl->si->reset ();
+ }
+}
+
+static void
+panel_slot_show_preedit_string (int context)
+{
+ GtkIMContextSCIM *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_show_preedit_string context=" << context << "\n";
+
+ if (ic && ic->impl)
+ {
+ if (!ic->impl->is_on)
+ ic->impl->is_on = true;
+
+ if (ic->impl->use_preedit) {
+ if (!ic->impl->preedit_started) {
+ KeyEvent key (0xff, SCIM_KEY_ShiftMask);
+
+ GdkEventKey gdkevent = keyevent_scim_to_gdk (ic, key, TRUE);
+
+ gdk_event_put ((GdkEvent *)&gdkevent);
+
+ g_signal_emit_by_name (_focused_ic, "preedit-start");
+ ic->impl->preedit_started = true;
+ ic->impl->need_commit_preedit = true;
+ }
+ }
+ }
+}
+
+static void
+panel_slot_hide_preedit_string (int context)
+{
+ GtkIMContextSCIM *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_hide_preedit_string context=" << context << "\n";
+
+ if (ic && ic->impl)
+ {
+ if (!ic->impl->is_on)
+ ic->impl->is_on = true;
+
+ bool emit = false;
+ if (ic->impl->preedit_string.length ()) {
+ ic->impl->preedit_string = WideString ();
+ ic->impl->preedit_caret = 0;
+ ic->impl->preedit_attrlist.clear ();
+ emit = true;
+ }
+ if (ic->impl->use_preedit) {
+ if (emit) g_signal_emit_by_name (ic, "preedit-changed");
+ if (ic->impl->preedit_started) {
+ g_signal_emit_by_name (ic, "preedit-end");
+ ic->impl->preedit_started = false;
+ ic->impl->need_commit_preedit = false;
+ }
+ }
+ }
+}
+
+static void
+panel_slot_update_preedit_string (int context,
+ const WideString &str,
+ const AttributeList &attrs)
+{
+ GtkIMContextSCIM *ic = find_ic (context);
+ SCIM_DEBUG_FRONTEND(1) << "panel_slot_update_preedit_string context=" << context << "\n";
+
+ if (ic && ic->impl)
+ {
+ if (!ic->impl->is_on)
+ ic->impl->is_on = true;
+
+ if (ic->impl->preedit_string != str || str.length ()) {
+ ic->impl->preedit_string = str;
+ ic->impl->preedit_attrlist = attrs;
+
+ if (ic->impl->use_preedit) {
+ if (!ic->impl->preedit_started) {
+ g_signal_emit_by_name(_focused_ic, "preedit-start");
+ ic->impl->preedit_started = true;
+ ic->impl->need_commit_preedit = true;
+ }
+ ic->impl->preedit_caret = str.length ();
+ ic->impl->preedit_updating = true;
+ g_signal_emit_by_name(ic, "preedit-changed");
+ ic->impl->preedit_updating = false;
+ }
+ }
+ }
+}
+
+/* Panel Requestion functions. */
+static void
+panel_req_update_screen (GtkIMContextSCIM *ic)
+{
+#if GDK_MULTIHEAD_SAFE
+ if (ic->impl->client_window) {
+ GdkScreen *screen = gdk_drawable_get_screen (GDK_DRAWABLE (ic->impl->client_window));
+ if (screen) {
+ int number = gdk_screen_get_number (screen);
+ _panel_client.update_screen (ic->id, number);
+ }
+ }
+#endif
+}
+
+static void
+panel_req_show_help (GtkIMContextSCIM *ic)
+{
+ String help;
+
+ help = String (_("Smart Common Input Method platform ")) +
+ String (SCIM_VERSION) +
+ String (_("\n(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n\n"));
+
+ if (ic && ic->impl) {
+ IMEngineFactoryPointer sf = _backend->get_factory (ic->impl->si->get_factory_uuid ());
+ if (sf) {
+ help += utf8_wcstombs (sf->get_name ());
+ help += String (_(":\n\n"));
+
+ help += utf8_wcstombs (sf->get_help ());
+ help += String (_("\n\n"));
+
+ help += utf8_wcstombs (sf->get_credits ());
+ }
+
+ _panel_client.show_help (ic->id, help);
+ }
+}
+
+static void
+panel_req_show_factory_menu (GtkIMContextSCIM *ic)
+{
+ std::vector<IMEngineFactoryPointer> factories;
+ std::vector <PanelFactoryInfo> menu;
+
+ _backend->get_factories_for_encoding (factories, "UTF-8");
+
+ for (size_t i = 0; i < factories.size (); ++ i) {
+ menu.push_back (PanelFactoryInfo (
+ factories [i]->get_uuid (),
+ utf8_wcstombs (factories [i]->get_name ()),
+ factories [i]->get_language (),
+ factories [i]->get_icon_file ()));
+ }
+
+ if (menu.size ())
+ _panel_client.show_factory_menu (ic->id, menu);
+}
+
+static void
+panel_req_update_factory_info (GtkIMContextSCIM *ic)
+{
+ if (ic && ic->impl && ic == _focused_ic) {
+ PanelFactoryInfo info;
+ if (ic->impl->is_on) {
+ IMEngineFactoryPointer sf = _backend->get_factory (ic->impl->si->get_factory_uuid ());
+ if (sf)
+ info = PanelFactoryInfo (sf->get_uuid (), utf8_wcstombs (sf->get_name ()), sf->get_language (), sf->get_icon_file ());
+ } else {
+ info = PanelFactoryInfo (String (""), String (_("English/Keyboard")), String ("C"), String (SCIM_KEYBOARD_ICON_FILE));
+ }
+ _panel_client.update_factory_info (ic->id, info);
+ }
+}
+
+static void
+panel_req_focus_in (GtkIMContextSCIM *ic)
+{
+ _panel_client.focus_in (ic->id, ic->impl->si->get_factory_uuid ());
+}
+
+static void
+panel_req_update_spot_location (GtkIMContextSCIM *ic)
+{
+ _panel_client.update_spot_location (ic->id, ic->impl->cursor_x, ic->impl->cursor_y, ic->impl->cursor_top_y);
+}
+
+
+static bool
+filter_hotkeys (GtkIMContextSCIM *ic, const KeyEvent &key)
+{
+ bool ret = false;
+
+ _frontend_hotkey_matcher.push_key_event (key);
+ _imengine_hotkey_matcher.push_key_event (key);
+
+ FrontEndHotkeyAction hotkey_action = _frontend_hotkey_matcher.get_match_result ();
+
+ if (hotkey_action == SCIM_FRONTEND_HOTKEY_TRIGGER) {
+ if (!ic->impl->is_on)
+ turn_on_ic (ic);
+ else
+ turn_off_ic (ic);
+ ret = true;
+ } else if (hotkey_action == SCIM_FRONTEND_HOTKEY_ON) {
+ if (!ic->impl->is_on)
+ turn_on_ic (ic);
+ ret = true;
+ } else if (hotkey_action == SCIM_FRONTEND_HOTKEY_OFF) {
+ if (ic->impl->is_on)
+ turn_off_ic (ic);
+ ret = true;
+ } else if (hotkey_action == SCIM_FRONTEND_HOTKEY_NEXT_FACTORY) {
+ open_next_factory (ic);
+ ret = true;
+ } else if (hotkey_action == SCIM_FRONTEND_HOTKEY_PREVIOUS_FACTORY) {
+ open_previous_factory (ic);
+ ret = true;
+ } else if (hotkey_action == SCIM_FRONTEND_HOTKEY_SHOW_FACTORY_MENU) {
+ panel_req_show_factory_menu (ic);
+ ret = true;
+ } else if (_imengine_hotkey_matcher.is_matched ()) {
+ ISEInfo info = _imengine_hotkey_matcher.get_match_result ();
+ ISE_TYPE type = info.type;
+ if (type == IMENGINE_T)
+ open_specific_factory (ic, info.uuid);
+ else if (type == HELPER_T)
+ _panel_client.start_helper (ic->id, info.uuid);
+ ret = true;
+ }
+ return ret;
+}
+
+static bool
+panel_initialize ()
+{
+ String display_name;
+
+ {
+#if GDK_MULTIHEAD_SAFE
+ const char *p = gdk_display_get_name (gdk_display_get_default ());
+#else
+ const char *p = getenv ("DISPLAY");
+#endif
+ if (p) display_name = String (p);
+ }
+
+ SCIM_DEBUG_FRONTEND(1) << "panel_initialize..\n";
+
+ if (_panel_client.open_connection (_config->get_name (), display_name) >= 0) {
+ int fd = _panel_client.get_connection_number ();
+ _panel_iochannel = g_io_channel_unix_new (fd);
+
+ _panel_iochannel_read_source = g_io_add_watch (_panel_iochannel, G_IO_IN, panel_iochannel_handler, 0);
+ _panel_iochannel_err_source = g_io_add_watch (_panel_iochannel, G_IO_ERR, panel_iochannel_handler, 0);
+ _panel_iochannel_hup_source = g_io_add_watch (_panel_iochannel, G_IO_HUP, panel_iochannel_handler, 0);
+
+ SCIM_DEBUG_FRONTEND(2) << " Panel FD= " << fd << "\n";
+
+ /*
+ * When the PanelAgent process crash, the application will try restarting and
+ * connecting the PanelAgent process.
+ * After it, it will register the previous input contexts to the PanelAgent.
+ */
+ GtkIMContextSCIM *context_scim = _ic_list;
+ while (context_scim != NULL) {
+ _panel_client.prepare (context_scim->id);
+ _panel_client.register_input_context (context_scim->id, context_scim->impl->si->get_factory_uuid ());
+ _panel_client.start_default_ise (context_scim->id);
+ _panel_client.send ();
+ context_scim = context_scim->next;
+ }
+
+ if (_focused_ic) {
+ _panel_client.prepare (_focused_ic->id);
+ panel_req_focus_in (_focused_ic);
+ _panel_client.send ();
+ }
+
+ return true;
+ }
+ return false;
+}
+
+static void
+panel_finalize ()
+{
+ _panel_client.close_connection ();
+
+ if (_panel_iochannel) {
+ g_io_channel_unref (_panel_iochannel);
+ g_source_remove (_panel_iochannel_read_source);
+ g_source_remove (_panel_iochannel_err_source);
+ g_source_remove (_panel_iochannel_hup_source);
+ _panel_iochannel = 0;
+ _panel_iochannel_read_source = 0;
+ _panel_iochannel_err_source = 0;
+ _panel_iochannel_hup_source = 0;
+ }
+}
+
+static gboolean
+panel_iochannel_handler (GIOChannel *source, GIOCondition condition, gpointer user_data)
+{
+ if (condition == G_IO_IN) {
+ if (!_panel_client.filter_event ()) {
+ panel_finalize ();
+ panel_initialize ();
+ return (gboolean)FALSE;
+ }
+ } else if (condition == G_IO_ERR || condition == G_IO_HUP) {
+ panel_finalize ();
+ panel_initialize ();
+ return (gboolean)FALSE;
+ }
+ return (gboolean)TRUE;
+}
+
+static void
+turn_on_ic (GtkIMContextSCIM *ic)
+{
+ if (ic && ic->impl && !ic->impl->is_on) {
+ ic->impl->is_on = true;
+
+ if (ic == _focused_ic) {
+ panel_req_focus_in (ic);
+// panel_req_update_screen (ic);
+ panel_req_update_spot_location (ic);
+ panel_req_update_factory_info (ic);
+ _panel_client.turn_on (ic->id);
+// _panel_client.hide_preedit_string (ic->id);
+// _panel_client.hide_aux_string (ic->id);
+// _panel_client.hide_lookup_table (ic->id);
+ ic->impl->si->focus_in ();
+ }
+
+ //Record the IC on/off status
+ if (_shared_input_method)
+ _config->write (String (SCIM_CONFIG_FRONTEND_IM_OPENED_BY_DEFAULT), true);
+
+ if (ic->impl->use_preedit && ic->impl->preedit_string.length ()) {
+ g_signal_emit_by_name(ic, "preedit-start");
+ g_signal_emit_by_name(ic, "preedit-changed");
+ ic->impl->preedit_started = true;
+ }
+ }
+}
+
+static void
+turn_off_ic (GtkIMContextSCIM *ic)
+{
+ if (ic && ic->impl && ic->impl->is_on) {
+ ic->impl->is_on = false;
+
+ if (ic == _focused_ic) {
+ ic->impl->si->focus_out ();
+
+// panel_req_update_factory_info (ic);
+ _panel_client.turn_off (ic->id);
+ }
+
+ //Record the IC on/off status
+ if (_shared_input_method)
+ _config->write (String (SCIM_CONFIG_FRONTEND_IM_OPENED_BY_DEFAULT), false);
+
+ if (ic->impl->use_preedit && ic->impl->preedit_string.length ()) {
+ g_signal_emit_by_name(ic, "preedit-changed");
+ g_signal_emit_by_name(ic, "preedit-end");
+ ic->impl->preedit_started = false;
+ }
+ }
+}
+
+static void
+set_ic_capabilities (GtkIMContextSCIM *ic)
+{
+ if (ic && ic->impl) {
+ unsigned int cap = SCIM_CLIENT_CAP_ALL_CAPABILITIES;
+
+ if (!_on_the_spot || !ic->impl->use_preedit)
+ cap -= SCIM_CLIENT_CAP_ONTHESPOT_PREEDIT;
+
+ ic->impl->si->update_client_capabilities (cap);
+ }
+}
+
+static KeyEvent
+keyevent_gdk_to_scim (const GtkIMContextSCIM *ic, const GdkEventKey &gdkevent)
+{
+ KeyEvent key;
+
+ // Use Key Symbole provided by gtk.
+ key.code = gdkevent.keyval;
+
+#ifdef GDK_WINDOWING_X11
+ Display *display = 0;
+
+ if (ic && ic->impl && ic->impl->client_window)
+ display = GDK_WINDOW_XDISPLAY (ic->impl->client_window);
+ else
+ display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
+
+ key.mask = scim_x11_keymask_x11_to_scim (display, gdkevent.state);
+
+ // Special treatment for two backslash keys on jp106 keyboard.
+ if (key.code == SCIM_KEY_backslash) {
+ int keysym_size = 0;
+ KeySym *keysyms = XGetKeyboardMapping (display, gdkevent.hardware_keycode, 1, &keysym_size);
+ if (keysyms != NULL) {
+ if (keysyms[0] == XK_backslash &&
+ (keysym_size > 1 && keysyms[1] == XK_underscore))
+ key.mask |= SCIM_KEY_QuirkKanaRoMask;
+ XFree (keysyms);
+ }
+ }
+#else
+ if (gdkevent.state & GDK_SHIFT_MASK) key.mask |=SCIM_KEY_ShiftMask;
+ if (gdkevent.state & GDK_LOCK_MASK) key.mask |=SCIM_KEY_CapsLockMask;
+ if (gdkevent.state & GDK_CONTROL_MASK) key.mask |=SCIM_KEY_ControlMask;
+ if (gdkevent.state & GDK_MOD1_MASK) key.mask |=SCIM_KEY_AltMask;
+ if (gdkevent.state & GDK_MOD2_MASK) key.mask |=SCIM_KEY_NumLockMask;
+#endif
+
+ if (gdkevent.type == GDK_KEY_RELEASE) key.mask |= SCIM_KEY_ReleaseMask;
+
+ return key;
+}
+
+static GdkKeymap *
+get_gdk_keymap (GdkWindow *window)
+{
+ GdkKeymap *keymap = NULL;
+
+#if GDK_MULTIHEAD_SAFE
+ if (window)
+ keymap = gdk_keymap_get_for_display (gdk_drawable_get_display (window));
+ else
+#endif
+ keymap = gdk_keymap_get_default ();
+
+ return keymap;
+}
+
+static guint32
+get_time (void)
+{
+ int tint;
+ struct timeval tv;
+ struct timezone tz; /* is not used since ages */
+ gettimeofday (&tv, &tz);
+ tint = (int) tv.tv_sec * 1000;
+ tint = tint / 1000 * 1000;
+ tint = tint + tv.tv_usec / 1000;
+ return ((guint32) tint);
+}
+
+static GdkEventKey
+keyevent_scim_to_gdk (const GtkIMContextSCIM *ic,
+ const KeyEvent &scimkey, gboolean send_event)
+{
+ GdkEventKey gdkevent;
+
+#ifdef GDK_WINDOWING_X11
+ Display *display = 0;
+
+ if (ic && ic->impl && ic->impl->client_window)
+ display = GDK_WINDOW_XDISPLAY (ic->impl->client_window);
+ else
+ display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
+
+ gdkevent.state = scim_x11_keymask_scim_to_x11 (display, scimkey.mask);
+#else
+ gdkevent.state = 0;
+ if (scimkey.is_shift_down ()) gdkevent.state |= GDK_SHIFT_MASK;
+ if (scimkey.is_caps_lock_down ()) gdkevent.state |= GDK_LOCK_MASK;
+ if (scimkey.is_control_down ()) gdkevent.state |= GDK_CONTROL_MASK;
+ if (scimkey.is_alt_down ()) gdkevent.state |= GDK_MOD1_MASK;
+ if (scimkey.is_num_lock_down ()) gdkevent.state |= GDK_MOD2_MASK;
+#endif
+
+ if (scimkey.is_key_release ()) gdkevent.state |= GDK_RELEASE_MASK;
+
+ gdkevent.type = (scimkey.is_key_release () ? GDK_KEY_RELEASE : GDK_KEY_PRESS);
+ gdkevent.window = ((ic && ic->impl) ? ic->impl->client_window : 0);
+ gdkevent.send_event = send_event;
+ gdkevent.time = get_time ();
+ gdkevent.keyval = scimkey.code;
+ gdkevent.length = 0;
+ gdkevent.string = 0;
+ gdkevent.is_modifier = 0;
+
+ GdkKeymap *keymap = get_gdk_keymap (gdkevent.window);
+
+ GdkKeymapKey *keys = NULL;
+ gint n_keys;
+
+ if (gdk_keymap_get_entries_for_keyval (keymap, gdkevent.keyval, &keys, &n_keys)) {
+ gdkevent.hardware_keycode = keys [0].keycode;
+ gdkevent.group = keys [0].group;
+ } else {
+ gdkevent.hardware_keycode = 0;
+ gdkevent.group = 0;
+ }
+
+ if (keys) g_free (keys);
+
+ return gdkevent;
+}
+
+static bool
+check_socket_frontend ()
+{
+ SocketAddress address;
+ SocketClient client;
+
+ uint32 magic;
+
+ address.set_address (scim_get_default_socket_frontend_address ());
+
+ if (!client.connect (address))
+ return false;
+
+ if (!scim_socket_open_connection (magic,
+ String ("ConnectionTester"),
+ String ("SocketFrontEnd"),
+ client,
+ 1000)) {
+ return false;
+ }
+
+ return true;
+}
+
+static void
+initialize (void)
+{
+ std::vector<String> config_list;
+ std::vector<String> engine_list;
+ std::vector<String> helper_list;
+ std::vector<String> load_engine_list;
+
+ std::vector<String>::iterator it;
+
+ std::vector<String> debug_mask_list;
+ int debug_verbose = 0;
+
+ size_t i;
+
+ bool manual = false;
+
+ bool socket = true;
+
+ String config_module_name = "simple";
+
+ // Get debug info
+ {
+ char *str = NULL;
+
+ str = getenv ("GTK_IM_SCIM_DEBUG_VERBOSE");
+
+ if (str != NULL)
+ debug_verbose = atoi (str);
+
+ DebugOutput::set_verbose_level (debug_verbose);
+
+ str = getenv ("GTK_IM_SCIM_DEBUG_MASK");
+
+ if (str != NULL) {
+ scim_split_string_list (debug_mask_list, String (str), ',');
+ if (debug_mask_list.size ()) {
+ DebugOutput::disable_debug (SCIM_DEBUG_AllMask);
+ for (i=0; i<debug_mask_list.size (); i++)
+ DebugOutput::enable_debug_by_name (debug_mask_list [i]);
+ }
+ }
+ }
+
+ SCIM_DEBUG_FRONTEND(1) << "Initializing GTK2 IMModule...\n";
+
+ // Get system language.
+ _language = scim_get_locale_language (scim_get_current_locale ());
+
+ if (socket) {
+ // If no Socket FrontEnd is running, then launch one.
+ // And set manual to false.
+ bool check_result = check_socket_frontend ();
+ if (!check_result) {
+ std::cerr << "Launching a daemon with Socket FrontEnd...\n";
+ //get modules list
+ scim_get_imengine_module_list (engine_list);
+ scim_get_helper_module_list (helper_list);
+
+ for (it = engine_list.begin (); it != engine_list.end (); it++) {
+ if (*it != "socket")
+ load_engine_list.push_back (*it);
+ }
+ for (it = helper_list.begin (); it != helper_list.end (); it++)
+ load_engine_list.push_back (*it);
+ const char *new_argv [] = { "--no-stay", 0 };
+ scim_launch (true,
+ config_module_name,
+ (load_engine_list.size () ? scim_combine_string_list (load_engine_list, ',') : "none"),
+ "socket",
+ (char **)new_argv);
+ manual = false;
+ }
+
+ // If there is one Socket FrontEnd running and it's not manual mode,
+ // then just use this Socket Frontend.
+ if (!manual) {
+ for (int i = 0; i < 100; ++i) {
+ if (check_result) {
+ config_module_name = "socket";
+ load_engine_list.clear ();
+ load_engine_list.push_back ("socket");
+ break;
+ }
+ scim_usleep (100000);
+ check_result = check_socket_frontend ();
+ }
+ }
+ }
+
+ if (config_module_name != "dummy") {
+ //load config module
+ SCIM_DEBUG_FRONTEND(1) << "Loading Config module: " << config_module_name << "...\n";
+ _config_module = new ConfigModule (config_module_name);
+
+ //create config instance
+ if (_config_module != NULL && _config_module->valid ())
+ _config = _config_module->create_config ();
+ }
+
+ if (_config.null ()) {
+ SCIM_DEBUG_FRONTEND(1) << "Config module cannot be loaded, using dummy Config.\n";
+
+ if (_config_module) delete _config_module;
+ _config_module = NULL;
+
+ _config = new DummyConfig ();
+ config_module_name = "dummy";
+ }
+
+ // Init colors.
+ gdk_color_parse ("white", &_normal_bg);
+ gdk_color_parse ("black", &_normal_text);
+ gdk_color_parse ("black", &_active_bg);
+ gdk_color_parse ("white", &_active_text);
+
+ reload_config_callback (_config);
+ _config->signal_connect_reload (slot (reload_config_callback));
+
+ // create backend
+ _backend = new CommonBackEnd (_config, load_engine_list.size () ? load_engine_list : engine_list);
+
+ if (_backend.null ()) {
+ fprintf (stderr, "GTK IM Module : Cannot create BackEnd Object!\n");
+ } else {
+ _backend->initialize (_config, load_engine_list.size () ? load_engine_list : engine_list, false, false);
+ _fallback_factory = _backend->get_factory (SCIM_COMPOSE_KEY_FACTORY_UUID);
+ }
+
+ if (_fallback_factory.null ()) _fallback_factory = new DummyIMEngineFactory ();
+
+ _fallback_instance = _fallback_factory->create_instance (String ("UTF-8"), 0);
+ _fallback_instance->signal_connect_commit_string (slot (fallback_commit_string_cb));
+
+ // Attach Panel Client signal.
+ _panel_client.signal_connect_reload_config (slot (panel_slot_reload_config));
+ _panel_client.signal_connect_exit (slot (panel_slot_exit));
+ _panel_client.signal_connect_update_lookup_table_page_size (slot (panel_slot_update_lookup_table_page_size));
+ _panel_client.signal_connect_lookup_table_page_up (slot (panel_slot_lookup_table_page_up));
+ _panel_client.signal_connect_lookup_table_page_down (slot (panel_slot_lookup_table_page_down));
+ _panel_client.signal_connect_trigger_property (slot (panel_slot_trigger_property));
+ _panel_client.signal_connect_process_helper_event (slot (panel_slot_process_helper_event));
+ _panel_client.signal_connect_move_preedit_caret (slot (panel_slot_move_preedit_caret));
+ _panel_client.signal_connect_select_candidate (slot (panel_slot_select_candidate));
+ _panel_client.signal_connect_process_key_event (slot (panel_slot_process_key_event));
+ _panel_client.signal_connect_commit_string (slot (panel_slot_commit_string));
+ _panel_client.signal_connect_forward_key_event (slot (panel_slot_forward_key_event));
+ _panel_client.signal_connect_request_help (slot (panel_slot_request_help));
+ _panel_client.signal_connect_request_factory_menu (slot (panel_slot_request_factory_menu));
+ _panel_client.signal_connect_change_factory (slot (panel_slot_change_factory));
+ _panel_client.signal_connect_reset_keyboard_ise (slot (panel_slot_reset_keyboard_ise));
+ _panel_client.signal_connect_show_preedit_string (slot (panel_slot_show_preedit_string));
+ _panel_client.signal_connect_hide_preedit_string (slot (panel_slot_hide_preedit_string));
+ _panel_client.signal_connect_update_preedit_string (slot (panel_slot_update_preedit_string));
+
+ if (!panel_initialize ()) {
+ fprintf (stderr, "GTK IM Module : Cannot connect to Panel!\n");
+ }
+}
+
+static void
+finalize (void)
+{
+ SCIM_DEBUG_FRONTEND(1) << "Finalizing GTK2 IMModule...\n";
+
+ if (_snooper_installed) {
+ gtk_key_snooper_remove(_snooper_id);
+ _snooper_installed=false;
+ _snooper_id = 0;
+ }
+
+ // Reset this first so that the shared instance could be released correctly afterwards.
+ _default_instance.reset ();
+
+ SCIM_DEBUG_FRONTEND(2) << "Finalize all IC partially.\n";
+ while (_used_ic_impl_list) {
+ // In case in "shared input method" mode,
+ // all contexts share only one instance,
+ // so we need point the reference pointer correctly before finalizing.
+ _used_ic_impl_list->si->set_frontend_data (static_cast <void*> (_used_ic_impl_list->parent));
+ gtk_im_context_scim_finalize_partial (_used_ic_impl_list->parent);
+ }
+
+ delete_all_ic_impl ();
+
+ _fallback_instance.reset ();
+ _fallback_factory.reset ();
+
+ SCIM_DEBUG_FRONTEND(2) << " Releasing BackEnd...\n";
+ _backend.reset ();
+
+ SCIM_DEBUG_FRONTEND(2) << " Releasing Config...\n";
+ _config.reset ();
+
+ if (_config_module) {
+ SCIM_DEBUG_FRONTEND(2) << " Deleting _config_module...\n";
+ delete _config_module;
+ _config_module = 0;
+ }
+
+ _focused_ic = 0;
+ _focused_widget = 0;
+
+ _scim_initialized = false;
+
+ panel_finalize ();
+}
+
+static void
+open_next_factory (GtkIMContextSCIM *ic)
+{
+ SCIM_DEBUG_FRONTEND(2) << "open_next_factory context=" << ic->id << "\n";
+ IMEngineFactoryPointer sf = _backend->get_next_factory ("", "UTF-8", ic->impl->si->get_factory_uuid ());
+
+ if (!sf.null ()) {
+ turn_off_ic (ic);
+ ic->impl->si = sf->create_instance ("UTF-8", ic->impl->si->get_id ());
+ ic->impl->si->set_frontend_data (static_cast <void*> (ic));
+ ic->impl->preedit_string = WideString ();
+ ic->impl->preedit_caret = 0;
+ attach_instance (ic->impl->si);
+ _backend->set_default_factory (_language, sf->get_uuid ());
+ _panel_client.register_input_context (ic->id, sf->get_uuid ());
+ set_ic_capabilities (ic);
+ turn_on_ic (ic);
+
+ if (_shared_input_method) {
+ _default_instance = ic->impl->si;
+ ic->impl->shared_si = true;
+ }
+ }
+}
+
+static void
+open_previous_factory (GtkIMContextSCIM *ic)
+{
+ SCIM_DEBUG_FRONTEND(2) << "open_previous_factory context=" << ic->id << "\n";
+ IMEngineFactoryPointer sf = _backend->get_previous_factory ("", "UTF-8", ic->impl->si->get_factory_uuid ());
+
+ if (!sf.null ()) {
+ turn_off_ic (ic);
+ ic->impl->si = sf->create_instance ("UTF-8", ic->impl->si->get_id ());
+ ic->impl->si->set_frontend_data (static_cast <void*> (ic));
+ ic->impl->preedit_string = WideString ();
+ ic->impl->preedit_caret = 0;
+ attach_instance (ic->impl->si);
+ _backend->set_default_factory (_language, sf->get_uuid ());
+ _panel_client.register_input_context (ic->id, sf->get_uuid ());
+ set_ic_capabilities (ic);
+ turn_on_ic (ic);
+
+ if (_shared_input_method) {
+ _default_instance = ic->impl->si;
+ ic->impl->shared_si = true;
+ }
+ }
+}
+
+static void
+open_specific_factory (GtkIMContextSCIM *ic,
+ const String &uuid)
+{
+ if (!(ic && ic->impl))
+ return;
+
+ SCIM_DEBUG_FRONTEND(2) << "open_specific_factory context=" << ic->id << "\n";
+
+ // The same input method is selected, just turn on the IC.
+ if (ic->impl->si && ic->impl->si->get_factory_uuid () == uuid) {
+ turn_on_ic (ic);
+ return;
+ }
+
+ IMEngineFactoryPointer sf = _backend->get_factory (uuid);
+
+ if (uuid.length () && !sf.null ()) {
+ turn_off_ic (ic);
+ ic->impl->si = sf->create_instance ("UTF-8", ic->impl->si->get_id ());
+ ic->impl->si->set_frontend_data (static_cast <void*> (ic));
+ ic->impl->preedit_string = WideString ();
+ ic->impl->preedit_caret = 0;
+ attach_instance (ic->impl->si);
+ _backend->set_default_factory (_language, sf->get_uuid ());
+ _panel_client.register_input_context (ic->id, sf->get_uuid ());
+ set_ic_capabilities (ic);
+ turn_on_ic (ic);
+
+ if (_shared_input_method) {
+ _default_instance = ic->impl->si;
+ ic->impl->shared_si = true;
+ }
+ } else {
+ // turn_off_ic comment out panel_req_update_factory_info()
+ // turn_off_ic (ic);
+ if (ic && ic->impl && ic->impl->is_on) {
+ ic->impl->is_on = false;
+
+ if (ic == _focused_ic) {
+ ic->impl->si->focus_out ();
+
+ panel_req_update_factory_info (ic);
+ _panel_client.turn_off (ic->id);
+ }
+
+ //Record the IC on/off status
+ if (_shared_input_method)
+ _config->write (String (SCIM_CONFIG_FRONTEND_IM_OPENED_BY_DEFAULT), false);
+
+ if (ic->impl->use_preedit && ic->impl->preedit_string.length ()) {
+ g_signal_emit_by_name(ic, "preedit-changed");
+ g_signal_emit_by_name(ic, "preedit-end");
+ ic->impl->preedit_started = false;
+ }
+ }
+ }
+}
+
+static void
+attach_instance (const IMEngineInstancePointer &si)
+{
+ si->signal_connect_show_preedit_string (
+ slot (slot_show_preedit_string));
+ si->signal_connect_show_aux_string (
+ slot (slot_show_aux_string));
+ si->signal_connect_show_lookup_table (
+ slot (slot_show_lookup_table));
+
+ si->signal_connect_hide_preedit_string (
+ slot (slot_hide_preedit_string));
+ si->signal_connect_hide_aux_string (
+ slot (slot_hide_aux_string));
+ si->signal_connect_hide_lookup_table (
+ slot (slot_hide_lookup_table));
+
+ si->signal_connect_update_preedit_caret (
+ slot (slot_update_preedit_caret));
+ si->signal_connect_update_preedit_string (
+ slot (slot_update_preedit_string));
+ si->signal_connect_update_aux_string (
+ slot (slot_update_aux_string));
+ si->signal_connect_update_lookup_table (
+ slot (slot_update_lookup_table));
+
+ si->signal_connect_commit_string (
+ slot (slot_commit_string));
+
+ si->signal_connect_forward_key_event (
+ slot (slot_forward_key_event));
+
+ si->signal_connect_register_properties (
+ slot (slot_register_properties));
+
+ si->signal_connect_update_property (
+ slot (slot_update_property));
+
+ si->signal_connect_beep (
+ slot (slot_beep));
+
+ si->signal_connect_start_helper (
+ slot (slot_start_helper));
+
+ si->signal_connect_stop_helper (
+ slot (slot_stop_helper));
+
+ si->signal_connect_send_helper_event (
+ slot (slot_send_helper_event));
+
+ si->signal_connect_get_surrounding_text (
+ slot (slot_get_surrounding_text));
+
+ si->signal_connect_delete_surrounding_text (
+ slot (slot_delete_surrounding_text));
+}
+
+// Implementation of slot functions
+/**
+ * @brief Show the preedit string area.
+ *
+ * The preedit string should be updated by calling
+ * update_preedit_string before or right after this call.
+ *
+ * @param si the IMEngineInstace pointer
+ */
+static void
+slot_show_preedit_string (IMEngineInstanceBase *si)
+{
+ SCIM_DEBUG_FRONTEND(1) << "slot_show_preedit_string...\n";
+
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic) {
+ if (ic->impl->use_preedit) {
+ if (!ic->impl->preedit_started) {
+ g_signal_emit_by_name (_focused_ic, "preedit-start");
+ ic->impl->preedit_started = true;
+ }
+ //if (ic->impl->preedit_string.length ())
+ // g_signal_emit_by_name (_focused_ic, "preedit-changed");
+ } else {
+ _panel_client.show_preedit_string (ic->id);
+ }
+ }
+}
+
+/**
+ * @brief Show the aux string area.
+ *
+ * The aux string should be updated by calling
+ * update_aux_string before or right after this call.
+ *
+ * The aux string can contain any additional information whatever
+ * the input method engine want.
+ *
+ * @param si the IMEngineInstace pointer
+ */
+static void
+slot_show_aux_string (IMEngineInstanceBase *si)
+{
+ SCIM_DEBUG_FRONTEND(1) << "slot_show_aux_string...\n";
+
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ _panel_client.show_aux_string (ic->id);
+}
+
+/**
+ * @brief Show the lookup table area.
+ *
+ * The lookup table should be updated by calling
+ * update_lookup_table before or right after this call.
+ *
+ * @param si the IMEngineInstace pointer
+ */
+static void
+slot_show_lookup_table (IMEngineInstanceBase *si)
+{
+ SCIM_DEBUG_FRONTEND(1) << "slot_show_lookup_table...\n";
+
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ _panel_client.show_lookup_table (ic->id);
+}
+
+/**
+ * @brief Hide the preedit string area.
+ *
+ * @param si the IMEngineInstace pointer
+ */
+static void
+slot_hide_preedit_string (IMEngineInstanceBase *si)
+{
+ SCIM_DEBUG_FRONTEND(1) << "slot_hide_preedit_string...\n";
+
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic) {
+ bool emit = false;
+ if (ic->impl->preedit_string.length ()) {
+ ic->impl->preedit_string = WideString ();
+ ic->impl->preedit_caret = 0;
+ ic->impl->preedit_attrlist.clear ();
+ emit = true;
+ }
+ if (ic->impl->use_preedit) {
+ if (emit) g_signal_emit_by_name (ic, "preedit-changed");
+ if (ic->impl->preedit_started) {
+ g_signal_emit_by_name (ic, "preedit-end");
+ ic->impl->preedit_started = false;
+ }
+ } else {
+ _panel_client.hide_preedit_string (ic->id);
+ }
+ }
+}
+
+/**
+ * @brief Hide the aux string area.
+ *
+ * @param si the IMEngineInstace pointer
+ */
+static void
+slot_hide_aux_string (IMEngineInstanceBase *si)
+{
+ SCIM_DEBUG_FRONTEND(1) << "slot_hide_aux_string...\n";
+
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ _panel_client.hide_aux_string (ic->id);
+}
+
+/**
+ * @brief Hide the lookup table area.
+ *
+ * @param si the IMEngineInstace pointer
+ */
+static void
+slot_hide_lookup_table (IMEngineInstanceBase *si)
+{
+ SCIM_DEBUG_FRONTEND(1) << "slot_hide_lookup_table...\n";
+
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ _panel_client.hide_lookup_table (ic->id);
+}
+
+/**
+ * @brief Update the preedit caret position in the preedit string.
+ *
+ * @param si the IMEngineInstace pointer
+ * @param caret - the new position of the preedit caret.
+ */
+static void
+slot_update_preedit_caret (IMEngineInstanceBase *si, int caret)
+{
+ SCIM_DEBUG_FRONTEND(1) << "slot_update_preedit_caret...\n";
+
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic && ic->impl->preedit_caret != caret) {
+ ic->impl->preedit_caret = caret;
+ if (ic->impl->use_preedit) {
+ if (!ic->impl->preedit_started) {
+ g_signal_emit_by_name(_focused_ic, "preedit-start");
+ ic->impl->preedit_started = true;
+ }
+ g_signal_emit_by_name(ic, "preedit-changed");
+ } else {
+ _panel_client.update_preedit_caret (ic->id, caret);
+ }
+ }
+}
+
+/**
+ * @brief Update the content of the preedit string,
+ *
+ * @param si the IMEngineInstace pointer
+ * @param str - the string content
+ * @param attrs - the string attributes
+ */
+static void
+slot_update_preedit_string (IMEngineInstanceBase *si,
+ const WideString & str,
+ const AttributeList & attrs)
+{
+ SCIM_DEBUG_FRONTEND(1) << "slot_update_preedit_string...\n";
+
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic && (ic->impl->preedit_string != str || str.length ())) {
+ ic->impl->preedit_string = str;
+ ic->impl->preedit_attrlist = attrs;
+ if (ic->impl->use_preedit) {
+ if (!ic->impl->preedit_started) {
+ g_signal_emit_by_name(_focused_ic, "preedit-start");
+ ic->impl->preedit_started = true;
+ }
+ ic->impl->preedit_caret = str.length ();
+ ic->impl->preedit_updating = true;
+ g_signal_emit_by_name(ic, "preedit-changed");
+ ic->impl->preedit_updating = false;
+ } else {
+ _panel_client.update_preedit_string (ic->id, str, attrs);
+ }
+ }
+}
+
+/**
+ * @brief Update the content of the aux string,
+ *
+ * @param si the IMEngineInstace pointer
+ * @param str - the string content
+ * @param attrs - the string attribute
+ */
+static void
+slot_update_aux_string (IMEngineInstanceBase *si,
+ const WideString & str,
+ const AttributeList & attrs)
+{
+ SCIM_DEBUG_FRONTEND(1) << "slot_update_aux_string...\n";
+
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ _panel_client.update_aux_string (ic->id, str, attrs);
+}
+
+/**
+ * @brief Commit a string to the client application.
+ *
+ * The preedit string should be hid before calling
+ * this method. Otherwise the clients which use
+ * OnTheSpot input mode will flicker annoyingly.
+ *
+ * @param si the IMEngineInstace pointer
+ * @param str - the string to be committed.
+ */
+static void
+slot_commit_string (IMEngineInstanceBase *si,
+ const WideString & str)
+{
+ SCIM_DEBUG_FRONTEND(1) << "slot_commit_string...\n";
+
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ if (ic)
+ g_signal_emit_by_name (ic, "commit", utf8_wcstombs (str).c_str ());
+}
+
+/**
+ * @brief Forward a key event to the client application.
+ *
+ * @param si the IMEngineInstace pointer
+ * @param key - the key event to be forwarded.
+ */
+static void
+slot_forward_key_event (IMEngineInstanceBase *si,
+ const KeyEvent & key)
+{
+ SCIM_DEBUG_FRONTEND(1) << "slot_forward_key_event...\n";
+
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ if (ic && _focused_ic == ic) {
+ GdkEventKey gdkevent = keyevent_scim_to_gdk (ic, key, TRUE);
+ if (!_fallback_instance->process_key_event (key) &&
+ !gtk_im_context_filter_keypress (GTK_IM_CONTEXT (ic->slave), &gdkevent)) {
+
+ // To avoid timing issue, we need emit the signal directly, rather than put the event into the queue.
+ if (_focused_widget) {
+ gboolean result;
+ g_signal_emit_by_name(_focused_widget, key.is_key_press () ? "key-press-event" : "key-release-event", &gdkevent, &result);
+ } else {
+ gdk_event_put ((GdkEvent *) &gdkevent);
+ }
+ }
+ }
+}
+
+/**
+ * @brief Update the content of the lookup table,
+ *
+ * @param si the IMEngineInstace pointer
+ * @param table - the new LookupTable
+ */
+static void
+slot_update_lookup_table (IMEngineInstanceBase *si,
+ const LookupTable & table)
+{
+ SCIM_DEBUG_FRONTEND(1) << "slot_update_lookup_table...\n";
+
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ _panel_client.update_lookup_table (ic->id, table);
+}
+
+/**
+ * @brief Register all properties of this IMEngineInstance into the FrontEnd.
+ *
+ * The old properties previously registered by other IMEngineInstance will be discarded,
+ * so for each time focus_in() is called, all properties should be registered
+ * no matter whether they had been registered before.
+ *
+ * @param si the IMEngineInstace pointer
+ * @param properties the PropertyList contains all of the properties.
+ */
+static void
+slot_register_properties (IMEngineInstanceBase *si,
+ const PropertyList & properties)
+{
+ SCIM_DEBUG_FRONTEND(1) << "slot_register_properties...\n";
+
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ _panel_client.register_properties (ic->id, properties);
+}
+
+/**
+ * @brief Update a registered property.
+ *
+ * Update a property which already registered by register_properties () method.
+ *
+ * @param si the IMEngineInstace pointer
+ * @param property the property to be updated.
+ */
+static void
+slot_update_property (IMEngineInstanceBase *si,
+ const Property & property)
+{
+ SCIM_DEBUG_FRONTEND(1) << "slot_update_property ...\n";
+
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ _panel_client.update_property (ic->id, property);
+}
+
+/**
+ * @brief Generate a short beep.
+ *
+ * @param si the IMEngineInstace pointer
+ */
+static void
+slot_beep (IMEngineInstanceBase *si)
+{
+ SCIM_DEBUG_FRONTEND(1) << "slot_beep ...\n";
+
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ gdk_beep ();
+}
+
+/**
+ * @brief Start a Client Helper process.
+ *
+ * @param si the IMEngineInstace pointer
+ * @param helper_uuid The UUID of the Helper object.
+ */
+static void
+slot_start_helper (IMEngineInstanceBase *si,
+ const String &helper_uuid)
+{
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ SCIM_DEBUG_FRONTEND(1) << "slot_start_helper helper= " << helper_uuid << " context="
+ << (ic ? ic->id : -1) << " ic=" << ic
+ << " ic-uuid=" << ((ic && ic->impl) ? ic->impl->si->get_factory_uuid () : "") << "...\n";
+
+ if (ic && ic->impl)
+ _panel_client.start_helper (ic->id, helper_uuid);
+}
+
+/**
+ * @brief Stop a Client Helper process which was started by start_helper.
+ *
+ * @param si the IMEngineInstace pointer
+ * @param helper_uuid The UUID of the Helper object.
+ */
+static void
+slot_stop_helper (IMEngineInstanceBase *si,
+ const String &helper_uuid)
+{
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ SCIM_DEBUG_FRONTEND(1) << "slot_stop_helper helper= " << helper_uuid << " context=" << (ic ? ic->id : -1) << " ic=" << ic << "...\n";
+
+ if (ic && ic->impl)
+ _panel_client.stop_helper (ic->id, helper_uuid);
+}
+
+/**
+ * @brief Send an events transaction to a client helper process.
+ *
+ * @param si the IMEngineInstace pointer
+ * @param helper_uuid The UUID of the Helper object.
+ * @param trans The transaction which contains events.
+ */
+static void
+slot_send_helper_event (IMEngineInstanceBase *si,
+ const String &helper_uuid,
+ const Transaction &trans)
+{
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ SCIM_DEBUG_FRONTEND(1) << "slot_send_helper_event helper= " << helper_uuid << " context="
+ << (ic ? ic->id : -1) << " ic=" << ic
+ << " ic-uuid=" << ((ic && ic->impl) ? ic->impl->si->get_factory_uuid () : "") << "...\n";
+
+ if (ic && ic->impl)
+ _panel_client.send_helper_event (ic->id, helper_uuid, trans);
+}
+
+/**
+ * @brief Retrieves context around the insertion point.
+ *
+ * @param si the IMEngineInstace pointer
+ * @param text location to store the context string around the insertion point.
+ * @param cursor location to store index of the insertion cursor within @text.
+ * @param maxlen_before the maxmium length of context string to be retrieved
+ * before the cursor; -1 means unlimited.
+ * @param maxlen_after the maxmium length of context string to be retrieved
+ * after the cursor; -1 means unlimited.
+ *
+ * @return true if surrounding text was provided.
+ */
+static bool
+slot_get_surrounding_text (IMEngineInstanceBase *si,
+ WideString &text,
+ int &cursor,
+ int maxlen_before,
+ int maxlen_after)
+{
+ SCIM_DEBUG_FRONTEND(1) << "slot_get_surrounding_text ...\n";
+
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic) {
+ gchar *surrounding = NULL;
+ gint cursor_index;
+ if (gtk_im_context_get_surrounding (GTK_IM_CONTEXT (_focused_ic), &surrounding, &cursor_index)) {
+ SCIM_DEBUG_FRONTEND(2) << "Surrounding text: " << surrounding <<"\n";
+ SCIM_DEBUG_FRONTEND(2) << "Cursor Index : " << cursor_index <<"\n";
+ WideString before (utf8_mbstowcs (String (surrounding, surrounding + cursor_index)));
+ WideString after (utf8_mbstowcs (String (surrounding + cursor_index)));
+ if (maxlen_before > 0 && ((unsigned int)maxlen_before) < before.length ())
+ before = WideString (before.begin () + (before.length () - maxlen_before), before.end ());
+ else if (maxlen_before == 0) before = WideString ();
+ if (maxlen_after > 0 && ((unsigned int)maxlen_after) < after.length ())
+ after = WideString (after.begin (), after.begin () + maxlen_after);
+ else if (maxlen_after == 0) after = WideString ();
+ text = before + after;
+ cursor = before.length ();
+ return true;
+ }
+ }
+ return false;
+}
+
+/**
+ * @brief Ask the client to delete characters around the cursor position.
+ *
+ * @param si the IMEngineInstace pointer
+ * @param offset offset from cursor position in chars;
+ * a negative value means start before the cursor.
+ * @param len number of characters to delete.
+ *
+ * @return true if the signal was handled.
+ */
+static bool
+slot_delete_surrounding_text (IMEngineInstanceBase *si,
+ int offset,
+ int len)
+{
+ SCIM_DEBUG_FRONTEND(1) << "slot_delete_surrounding_text ...\n";
+
+ GtkIMContextSCIM *ic = static_cast<GtkIMContextSCIM *> (si->get_frontend_data ());
+
+ if (ic && ic->impl && _focused_ic == ic)
+ return gtk_im_context_delete_surrounding (GTK_IM_CONTEXT (_focused_ic), offset, len);
+ return false;
+}
+
+static void
+reload_config_callback (const ConfigPointer &config)
+{
+ SCIM_DEBUG_FRONTEND(1) << "reload_config_callback...\n";
+
+ _frontend_hotkey_matcher.load_hotkeys (config);
+ _imengine_hotkey_matcher.load_hotkeys (config);
+
+ KeyEvent key;
+
+ scim_string_to_key (key,
+ config->read (String (SCIM_CONFIG_HOTKEYS_FRONTEND_VALID_KEY_MASK),
+ String ("Shift+Control+Alt+Lock")));
+
+ _valid_key_mask = (key.mask > 0)?(key.mask):0xFFFF;
+ _valid_key_mask |= SCIM_KEY_ReleaseMask;
+ // Special treatment for two backslash keys on jp106 keyboard.
+ _valid_key_mask |= SCIM_KEY_QuirkKanaRoMask;
+
+ _on_the_spot = config->read (String (SCIM_CONFIG_FRONTEND_ON_THE_SPOT), _on_the_spot);
+ _shared_input_method = config->read (String (SCIM_CONFIG_FRONTEND_SHARED_INPUT_METHOD), _shared_input_method);
+ _use_key_snooper = config->read (String (SCIM_CONFIG_FRONTEND_GTK_IMMODULE_USE_KEY_SNOOPER), _use_key_snooper);
+
+ // Get keyboard layout setting
+ // Flush the global config first, in order to load the new configs from disk.
+ scim_global_config_flush ();
+
+ _keyboard_layout = scim_get_default_keyboard_layout ();
+}
+
+static void
+fallback_commit_string_cb (IMEngineInstanceBase *si,
+ const WideString &str)
+{
+ if (_focused_ic && _focused_ic->impl)
+ g_signal_emit_by_name (_focused_ic, "commit", utf8_wcstombs (str).c_str ());
+}
+
+/*
+vi:ts=4:expandtab:nowrap
+*/
--- /dev/null
+/** @file gtkimcontextscim.h
+ * @brief immodule for GTK2.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: gtkimcontextscim.h,v 1.12 2005/06/27 15:31:49 suzhe Exp $
+ */
+
+#ifndef __GTK_IM_CONTEXT_SCIM_H__
+#define __GTK_IM_CONTEXT_SCIM_H__
+
+#include <gtk/gtkimcontext.h>
+
+typedef struct _GtkIMContextSCIM GtkIMContextSCIM;
+typedef struct _GtkIMContextSCIMClass GtkIMContextSCIMClass;
+typedef struct _GtkIMContextSCIMImpl GtkIMContextSCIMImpl;
+
+struct _GtkIMContextSCIM
+{
+ GtkIMContext object;
+ GtkIMContext *slave;
+
+ GtkIMContextSCIMImpl *impl;
+
+ int id; /* Input Context id*/
+ struct _GtkIMContextSCIM *next;
+};
+
+struct _GtkIMContextSCIMClass
+{
+ GtkIMContextClass parent_class;
+};
+
+GtkIMContext *gtk_im_context_scim_new (void);
+
+void gtk_im_context_scim_register_type (GTypeModule *type_module);
+void gtk_im_context_scim_shutdown (void);
+
+#endif /* __GTK_IM_CONTEXT_SCIM_H__ */
--- /dev/null
+IM_SCIM_1.0 {
+ global:
+ extern "C" {
+ im_module_init;
+ im_module_create;
+ im_module_list;
+ im_module_exit;
+ };
+
+ local:
+ extern "C++" {
+ __gnu_cxx::*;
+ std::*;
+ *std::*_S_construct*;
+ };
+};
--- /dev/null
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gtk/gtkimmodule.h>
+#include <gtk/gtk.h>
+#include "gtkimcontextscim.h"
+#include <string.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+static const GtkIMContextInfo scim_info = {
+ "scim", /* ID */
+ "Input Service Framework(It has been derived by SCIM)", /* Human readable name */
+ "scim", /* Translation domain */
+ SCIM_LOCALEDIR, /* Dir for bindtextdomain (not strictly needed for "gtk+") */
+ "en:ja:ko:zh" /* Languages for which this module is the default */
+};
+
+static const GtkIMContextInfo *info_list[] = {
+ &scim_info
+};
+
+void
+im_module_init (GTypeModule *type_module)
+{
+ gtk_im_context_scim_register_type (type_module);
+}
+
+void
+im_module_exit (void)
+{
+ gtk_im_context_scim_shutdown ();
+}
+
+void
+im_module_list (const GtkIMContextInfo ***contexts,
+ int *n_contexts)
+{
+ *contexts = info_list;
+ *n_contexts = G_N_ELEMENTS (info_list);
+}
+
+GtkIMContext *
+im_module_create (const gchar *context_id)
+{
+ if (strcmp (context_id, "scim") == 0)
+ return gtk_im_context_scim_new ();
+ else
+ return NULL;
+}
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
--- /dev/null
+MAINTAINERCLEANFILES = Makefile.in
+CLEANFILES = *.bak
+
+INCLUDES = -I$(top_builddir) \
+ -I$(top_builddir)/ism/src \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/ism/src \
+ -I$(top_srcdir)/ism/intl \
+ -I$(top_srcdir)/ism/data \
+ -I$(top_srcdir)/ism/utils \
+ -I$(includedir) \
+ -DSCIM_DATADIR=\"@SCIM_DATADIR@\" \
+ -DSCIM_LOCALEDIR=\"@SCIM_LOCALEDIR@\" \
+ -DSCIM_SYSCONFDIR=\"@SCIM_SYSCONFDIR@\" \
+ -DSCIM_LIBEXECDIR=\"@SCIM_LIBEXECDIR@\" \
+ -DSCIM_ICONDIR=\"@SCIM_ICONDIR@\" \
+ -DSCIM_MODULE_PATH=\"@SCIM_MODULE_PATH@\" \
+ -DSCIM_TEMPDIR=\"@SCIM_TEMPDIR@\"
+
+noinst_HEADERS = scim_setup_module.h \
+ isf_ise_setup_win.h \
+ isf_help_win.h \
+ isf_setup_win.h \
+ isf_lang_win.h \
+ isf_setup_utility.h
+
+if SCIM_BUILD_PANEL_GTK
+CONFIG_SCIM_PANEL_GTK = scim-panel-gtk
+endif
+
+bin_PROGRAMS = $(CONFIG_SCIM_PANEL_GTK)
+
+scim_panel_gtk_SOURCES = scim_panel_gtk.cpp \
+ isf_ise_setup_win.cpp \
+ scim_setup_module.cpp \
+ isf_help_win.cpp \
+ isf_setup_win.cpp \
+ isf_lang_win.cpp \
+ isf_setup_utility.cpp
+
+scim_panel_gtk_LDFLAGS = @LTLIBINTL@ -rpath $(libdir)
+
+if ISF_BUILD_WITH_GCONF
+scim_panel_gtk_CXXFLAGS = @GTK2_CFLAGS@ @GTHREAD2_CFLAGS@ @GCONF_CFLAGS@
+scim_panel_gtk_LDADD = $(top_builddir)/ism/src/libscim@SCIM_EPOCH@.la \
+ $(top_builddir)/ism/utils/libscim-gtkutils@SCIM_EPOCH@.la \
+ -lgthread-2.0 -lphonestatus -lnoti \
+ @GTK2_LIBS@ @GTHREAD2_LIBS@ @GCONF_LIBS@ @X_LIBS@
+else
+scim_panel_gtk_CXXFLAGS = @GTK2_CFLAGS@ @GTHREAD2_CFLAGS@
+scim_panel_gtk_LDADD = $(top_builddir)/ism/src/libscim@SCIM_EPOCH@.la \
+ $(top_builddir)/ism/utils/libscim-gtkutils@SCIM_EPOCH@.la \
+ -lgthread-2.0 @GTK2_LIBS@ @GTHREAD2_LIBS@ @X_LIBS@
+endif
+
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#include <gtk/gtk.h>
+#include "isf_help_win.h"
+
+static GtkWidget *_main_window = 0;
+static GtkWidget *_content_box = 0;
+static GtkWidget *_help_label = 0;
+static GtkWidget *_form = 0;
+
+
+extern int _screen_width;
+extern float _width_rate;
+extern float _height_rate;
+
+ISFHelpWin::ISFHelpWin ()
+{
+#if HAVE_GCONF
+ if (!_main_window) {
+ _main_window = gtk_main_window_new (GTK_WIN_STYLE_DEFAULT);
+ gtk_main_window_set_title_style (GTK_MAIN_WINDOW (_main_window), GTK_WIN_TITLE_STYLE_TEXT_ICON);
+
+ _form = gtk_form_new (TRUE);
+ gtk_form_set_title (GTK_FORM (_form), "Help");
+ GtkWidget *scroll = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_container_add (GTK_CONTAINER (_form), scroll);
+
+ _content_box = gtk_vbox_new (false, 0);
+ gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scroll), _content_box);
+
+#ifdef USING_ISF_SWITCH_BUTTON
+ GtkWidget *softkey = GTK_WIDGET (gtk_form_get_softkey_bar (GTK_FORM (_form)));
+ gtk_softkey_bar_use_ise_switch (GTK_SOFTKEY_BAR (softkey), false);
+ gtk_softkey_bar_set_softkey (GTK_SOFTKEY_BAR (softkey), SOFTKEY4,
+ "Exit", NULL,
+ (SoftkeyActionType) SOFTKEY_CALLBACK,
+ (gpointer) (on_isf_help_back_callback),
+ (gpointer) this);
+#else
+ gtk_form_add_softkey(GTK_FORM(_form), "Exit", NULL, SOFTKEY_CALLBACK, (void *)on_isf_help_back_callback, NULL);
+
+#endif
+
+ gtk_main_window_add_form (GTK_MAIN_WINDOW (_main_window), GTK_FORM (_form));
+ gtk_main_window_set_current_form (GTK_MAIN_WINDOW (_main_window), GTK_FORM (_form));
+ gtk_widget_show_all (_form);
+ }
+#endif
+}
+
+
+ISFHelpWin::~ISFHelpWin ()
+{
+ if (_main_window) {
+ gtk_widget_destroy (_main_window);
+ _main_window = 0;
+ }
+ if (_content_box) {
+ gtk_widget_destroy (_content_box);
+ _content_box = 0;
+ }
+ if (_help_label) {
+ gtk_widget_destroy (_help_label);
+ _help_label = 0;
+ }
+ if (_form) {
+ gtk_widget_destroy (_form);
+ _form = 0;
+ }
+}
+
+void ISFHelpWin::show_help (const char *title, const char *help_info)
+{
+ if (!_help_label) {
+ _help_label = gtk_label_new (help_info);
+ gtk_box_pack_start (GTK_BOX (_content_box), _help_label, true, true, 0);
+#if HAVE_GCONF
+ gtk_form_set_title (GTK_FORM (_form), (gchar *)title);
+#endif
+ gtk_widget_show_all (_form);
+ gtk_widget_show_all (_main_window);
+ gtk_window_present (GTK_WINDOW (_main_window));
+ gtk_main ();
+ } else {
+ gtk_window_present (GTK_WINDOW (_main_window));
+ }
+}
+
+void ISFHelpWin::on_isf_help_back_callback (GtkWidget *softkey,
+ gpointer user_data)
+{
+ gtk_widget_hide (_main_window);
+ if (_help_label) {
+ gtk_widget_destroy (_help_label);
+ _help_label = 0;
+ }
+ gtk_main_quit ();
+}
+
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __ISF_HELP_WIN_H
+#define __ISF_HELP_WIN_H
+
+#include <gtk/gtk.h>
+#include "scim_private.h"
+#include "scim.h"
+
+using namespace scim;
+
+class ISFHelpWin
+{
+public:
+ ISFHelpWin ();
+ ~ISFHelpWin ();
+
+ void show_help (const char *title, const char *help_info);
+private:
+ static void on_isf_help_back_callback (GtkWidget *softkey,
+ gpointer user_data);
+};
+
+#endif // __ISF_HELP_WIN_H
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#define Uses_SCIM_IMENGINE_MODULE
+#define Uses_SCIM_PANEL_AGENT
+
+
+#include <cstring>
+#include <cstdio>
+#include <gdk/gdk.h>
+#include <sys/time.h>
+#include "scim_private.h"
+#include "scim.h"
+#include "scim_setup_module.h"
+#include "isf_setup_utility.h"
+#include "isf_ise_setup_win.h"
+
+
+static gboolean _is_module_running = false;
+static GtkWidget *_main_window = 0;
+static GtkWidget *_work_area = 0;
+static GtkWidget *_current_widget = 0;
+static SetupModule *_current_module = 0;
+static ConfigPointer _config;
+
+extern PanelAgent *_panel_agent;
+extern int _screen_width;
+extern float _width_rate;
+extern float _height_rate;
+
+SetupUI::SetupUI (const ConfigPointer & config)
+{
+ _config = config;
+
+ create_main_ui ();
+}
+
+SetupUI::~SetupUI ()
+{
+ if (_current_widget) {
+ gtk_widget_destroy (_current_widget);
+ _current_widget = 0;
+ }
+ if (_work_area) {
+ gtk_widget_destroy (_work_area);
+ _work_area = 0;
+ }
+ if (_main_window) {
+ gtk_widget_destroy (_main_window);
+ _main_window = 0;
+ }
+}
+
+bool SetupUI::add_module (SetupModule *module)
+{
+ if (_is_module_running) {
+ std::cerr << "One ISE Setup is running...\n";
+ return false;
+ } else if (!module || !module->valid ()) {
+ GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW (_main_window),
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_INFO,
+ GTK_BUTTONS_OK,
+ _("No setup for this ISE!\n"));
+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+ return false;
+ }
+
+ _is_module_running = true;
+
+ GtkWidget *module_widget = module->create_ui ();
+ String module_label = module->get_name ();
+ String module_category = module->get_category ();
+
+ if (!module_widget || !module_label.length () || !module_category.length ())
+ return false;
+
+ if (!_config.null ()) {
+ module->load_config (_config);
+ }
+
+ _current_widget = module_widget;
+ _current_module = module;
+
+ gtk_box_pack_start (GTK_BOX (_work_area), _current_widget, TRUE, TRUE, 0);
+ gtk_widget_show_all (_work_area);
+ run ();
+
+ return true;
+}
+
+void SetupUI::run (void)
+{
+ if (_main_window) {
+ gtk_widget_show_all (_main_window);
+ gtk_window_present (GTK_WINDOW (_main_window));
+ }
+ gtk_main ();
+
+ SCIM_DEBUG_MAIN(1) << "exit SetupUI::run ()\n";
+}
+
+void SetupUI::create_main_ui (void)
+{
+#if HAVE_GCONF
+ if (!_main_window) {
+ _main_window = gtk_main_window_new (GTK_WIN_STYLE_DEFAULT);
+ gtk_main_window_set_title_style (GTK_MAIN_WINDOW (_main_window), GTK_WIN_TITLE_STYLE_TEXT_ICON);
+
+ GtkWidget *form = gtk_form_new (TRUE);
+ gtk_form_set_title (GTK_FORM (form), "ISE Option");
+ gtk_widget_show (form);
+
+ GtkWidget *scroll = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_container_add (GTK_CONTAINER (form), scroll);
+ gtk_widget_show (scroll);
+
+ _work_area = gtk_vbox_new (false, 0);
+ gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scroll), _work_area);
+
+#ifdef USING_ISF_SWITCH_BUTTON
+ GtkWidget *softkey = GTK_WIDGET (gtk_form_get_softkey_bar (GTK_FORM (form)));
+
+ gtk_softkey_bar_use_ise_switch (GTK_SOFTKEY_BAR(softkey), false);
+
+ gtk_softkey_bar_set_softkey (GTK_SOFTKEY_BAR (softkey), SOFTKEY1,
+ "Save", NULL,
+ (SoftkeyActionType) SOFTKEY_CALLBACK,
+ (gpointer) (softkey_ok_clicked_cb),
+ (gpointer) this);
+
+ gtk_softkey_bar_set_softkey (GTK_SOFTKEY_BAR (softkey), SOFTKEY4,
+ "Exit", NULL,
+ (SoftkeyActionType) SOFTKEY_CALLBACK,
+ (gpointer) (softkey_exit_clicked_cb),
+ (gpointer) this);
+#else
+ gtk_form_add_softkey (GTK_FORM (form), "Save", NULL, SOFTKEY_CALLBACK, (void *)softkey_ok_clicked_cb, NULL);
+ gtk_form_add_softkey (GTK_FORM (form), "Exit", NULL, SOFTKEY_CALLBACK, (void *)softkey_exit_clicked_cb, NULL);
+
+#endif
+
+ gtk_main_window_add_form (GTK_MAIN_WINDOW (_main_window), GTK_FORM (form));
+ gtk_main_window_set_current_form (GTK_MAIN_WINDOW (_main_window), GTK_FORM (form));
+
+ g_signal_connect (G_OBJECT (_main_window), "delete_event", G_CALLBACK (hide), this);
+ }
+#endif
+}
+
+
+void SetupUI::save_and_exit (gpointer user_data)
+{
+ _current_module->save_config (_config);
+ _config->flush ();
+
+ struct timeval start, end;
+ int timeuse = 0;
+
+ gettimeofday (&start, NULL);
+
+ _config->reload ();
+ _panel_agent->reload_config ();
+ gettimeofday (&end, NULL);
+ timeuse = 1000000 * (end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec;
+ printf (mzc_red "ISF config reload time : %d usec" mzc_normal ".\n", timeuse);
+
+ hide (user_data);
+}
+
+void SetupUI::exit_without_save (gpointer user_data)
+{
+ hide (user_data);
+}
+
+void SetupUI::softkey_ok_clicked_cb (GtkWidget * softkey, gpointer user_data)
+{
+ save_and_exit (user_data);
+}
+
+void SetupUI::softkey_exit_clicked_cb (GtkWidget * softkey, gpointer user_data)
+{
+ exit_without_save (user_data);
+}
+
+
+void SetupUI::hide (gpointer user_data)
+{
+ _current_module->unload ();
+ _is_module_running = false;
+ if (_current_widget) {
+ gtk_widget_destroy (_current_widget);
+ _current_widget = 0;
+ }
+ gtk_widget_hide (_main_window);
+ gtk_main_quit ();
+}
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#if !defined (__ISF_ISE_SETUP_WIN_H)
+#define __ISF_ISE_SETUP_WIN_H
+
+#include <gtk/gtk.h>
+
+using namespace scim;
+
+class SetupUI
+{
+ SetupUI (const SetupUI &);
+ SetupUI & operator = (const SetupUI &);
+
+public:
+ SetupUI (const ConfigPointer & config);
+ ~SetupUI ();
+ bool add_module (SetupModule * module);
+
+private:
+ void create_main_ui (void);
+
+ void run (void);
+
+ static void save_and_exit (gpointer user_data);
+ static void exit_without_save (gpointer user_data);
+ static void softkey_ok_clicked_cb (GtkWidget *softkey,
+ gpointer user_data);
+ static void softkey_exit_clicked_cb (GtkWidget *softkey,
+ gpointer user_data);
+ static void hide (gpointer usr_data);
+};
+
+#endif // __ISF_ISE_SETUP_WIN_H
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#define Uses_SCIM_EVENT
+#define Uses_SCIM_CONFIG_PATH
+
+#include <gdk/gdk.h>
+#include "scim_private.h"
+#include "scim.h"
+#include "isf_lang_win.h"
+#include "isf_setup_utility.h"
+
+
+enum {
+ LANG_LIST_ENABLE = 0,
+ LANG_LIST_NAME,
+ LANG_LIST_NUM_COLUMS
+};
+
+extern MapStringVectorSizeT _groups;
+extern MapStringVectorString _disabled_ise_map;
+extern std::vector <String> _disabled_langs;
+extern MapStringVectorString _disabled_ise_map_bak;
+extern std::vector <String> _disabled_langs_bak;
+
+extern gboolean _lang_selected_changed;
+
+extern int _screen_width;
+extern float _width_rate;
+extern float _height_rate;
+
+static GtkWidget *_main_window = 0;
+static GtkListStore *_lang_list_store = 0;
+static unsigned int _lang_num = 0;
+
+
+static gboolean lang_list_set_enable_func (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ gpointer data)
+{
+ gchar *lang = 0;
+ gtk_tree_model_get (model, iter, LANG_LIST_NAME, &lang, -1);
+
+ if (std::find (_disabled_langs.begin (), _disabled_langs.end (), String (lang)) ==_disabled_langs.end ())
+ gtk_list_store_set (_lang_list_store, iter, LANG_LIST_ENABLE, true, -1);
+ else
+ gtk_list_store_set (_lang_list_store, iter, LANG_LIST_ENABLE, false, -1);
+ if (lang) {
+ g_free (lang);
+ lang = 0;
+ }
+
+ return (gboolean)false;
+}
+
+ISFLangWin::ISFLangWin ()
+{
+#if HAVE_GCONF
+ if (!_main_window) {
+ _main_window = gtk_main_window_new (GTK_WIN_STYLE_DEFAULT);
+ gtk_main_window_set_title_style (GTK_MAIN_WINDOW (_main_window), GTK_WIN_TITLE_STYLE_TEXT_ICON);
+
+ GtkWidget *form = gtk_form_new (TRUE);
+ gtk_form_set_title (GTK_FORM (form), "ISF Language");
+
+ GtkWidget *scroll = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_container_add (GTK_CONTAINER (form), scroll);
+ gtk_widget_show (scroll);
+
+ GtkWidget *isf_lang = create_isf_lang_list_view ();
+
+ gtk_container_add (GTK_CONTAINER (scroll), isf_lang);
+ gtk_widget_show (isf_lang);
+
+#ifdef USING_ISF_SWITCH_BUTTON
+ GtkWidget *softkey = GTK_WIDGET (gtk_form_get_softkey_bar (GTK_FORM (form)));
+ gtk_softkey_bar_use_ise_switch (GTK_SOFTKEY_BAR (softkey), false);
+
+ gtk_softkey_bar_set_softkey (GTK_SOFTKEY_BAR (softkey), SOFTKEY1,
+ "Save", NULL,
+ (SoftkeyActionType) SOFTKEY_CALLBACK,
+ (gpointer) (isf_lang_save_callback),
+ (gpointer) NULL);
+
+ gtk_softkey_bar_set_softkey (GTK_SOFTKEY_BAR (softkey), SOFTKEY4,
+ "Exit", NULL,
+ (SoftkeyActionType) SOFTKEY_CALLBACK,
+ (gpointer) (isf_lang_back_callback),
+ (gpointer) NULL);
+#else
+ gtk_form_add_softkey (GTK_FORM (form), "Save", NULL, SOFTKEY_CALLBACK, (void *)isf_lang_save_callback, NULL);
+ gtk_form_add_softkey (GTK_FORM (form), "Exit", NULL, SOFTKEY_CALLBACK, (void *)isf_lang_back_callback, NULL);
+#endif
+
+ gtk_main_window_add_form (GTK_MAIN_WINDOW (_main_window), GTK_FORM (form));
+ gtk_main_window_set_current_form (GTK_MAIN_WINDOW (_main_window), GTK_FORM (form));
+
+ gtk_widget_show_all (form);
+ }
+#endif
+}
+
+ISFLangWin::~ISFLangWin ()
+{
+ if (_main_window) {
+ gtk_widget_destroy (_main_window);
+ _main_window = 0;
+ }
+ if (_lang_list_store) {
+ delete[] _lang_list_store;
+ _lang_list_store = 0;
+ }
+}
+
+void ISFLangWin::show_window (void)
+{
+ gtk_tree_model_foreach (GTK_TREE_MODEL (_lang_list_store),
+ lang_list_set_enable_func,
+ NULL);
+
+ gtk_widget_show_all (_main_window);
+ gtk_window_present (GTK_WINDOW (_main_window));
+ gtk_main ();
+}
+
+
+GtkWidget *ISFLangWin::create_isf_lang_list_view (void)
+{
+ GtkWidget *view = NULL;
+
+ GtkCellRenderer *renderer = NULL;
+ GtkTreeViewColumn *column = NULL;
+
+ view = gtk_tree_view_new ();
+ g_object_set (view, "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_NONE, NULL);
+ gtk_widget_show (view);
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (view), false);
+ gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view), false);
+
+ // Enable column
+ column = gtk_tree_view_column_new ();
+ renderer = gtk_cell_renderer_toggle_new ();
+ gtk_cell_renderer_toggle_set_radio (GTK_CELL_RENDERER_TOGGLE (renderer), false);
+ gtk_tree_view_column_pack_start (column, renderer, FALSE);
+ gtk_cell_renderer_set_fixed_size (renderer, (int)(40*_width_rate), (int)(40*_height_rate));
+ g_object_set (renderer, "radio", 0, NULL);
+ g_object_set (renderer, "indicator-size", (gint)(26*(_width_rate < _height_rate ? _width_rate : _height_rate)), NULL);
+ gtk_tree_view_column_set_attributes (column, renderer, "active", LANG_LIST_ENABLE, NULL);
+
+ g_signal_connect (G_OBJECT (renderer), "toggled",
+ G_CALLBACK (on_lang_enable_box_clicked),
+ (gpointer) view);
+
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);
+
+ // Name column
+ column = gtk_tree_view_column_new ();
+ gtk_tree_view_column_set_title (column, _("Name"));
+ renderer = gtk_cell_renderer_text_new ();
+ gtk_tree_view_column_pack_start (column, renderer, TRUE);
+ gtk_tree_view_column_set_attributes (column, renderer, "text", LANG_LIST_NAME, NULL);
+ gtk_cell_renderer_set_fixed_size (renderer, (int) (_screen_width - 40*_width_rate), (int)(40*_height_rate));
+ g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+ g_object_set (renderer, "xpad", 4, NULL);
+
+ //gtk_cell_renderer_set_cell_font_size (renderer, GTK_CELL_RENDERER_NORMAL, 22);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);
+ // Create model.
+ _lang_list_store = gtk_list_store_new (LANG_LIST_NUM_COLUMS, G_TYPE_BOOLEAN, G_TYPE_STRING);
+
+ // Fill the model
+ GtkTreeIter iter;
+ String lang_name;
+
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ _lang_num++;
+ lang_name = scim_get_language_name (it->first);
+ gtk_list_store_append (_lang_list_store, &iter);
+ gtk_list_store_set (_lang_list_store, &iter, LANG_LIST_NAME, lang_name.c_str (), -1);
+ }
+
+ gtk_tree_model_foreach (GTK_TREE_MODEL (_lang_list_store), lang_list_set_enable_func, NULL);
+
+ gtk_tree_view_set_model (GTK_TREE_VIEW (view), GTK_TREE_MODEL (_lang_list_store));
+
+ return view;
+}
+
+void ISFLangWin::on_lang_enable_box_clicked (GtkCellRendererToggle *cell,
+ gchar *arg1, gpointer data)
+{
+ GtkTreeIter iter;
+ GtkTreePath *path = 0;
+ gboolean enable = FALSE;
+
+ std::vector<String>::iterator it;
+
+ _lang_selected_changed = true;
+
+ path = gtk_tree_path_new_from_string (arg1);
+ if (gtk_tree_model_get_iter (GTK_TREE_MODEL (_lang_list_store), &iter, path)) {
+ gtk_tree_model_get (GTK_TREE_MODEL (_lang_list_store), &iter,
+ LANG_LIST_ENABLE, &enable, -1);
+
+ gtk_list_store_set (GTK_LIST_STORE (_lang_list_store), &iter,
+ LANG_LIST_ENABLE, !enable, -1);
+ }
+
+ if (path) {
+ gtk_tree_path_free (path);
+ path = 0;
+ }
+
+ gchar *lang = 0;
+
+ gtk_tree_model_get (GTK_TREE_MODEL (_lang_list_store), &iter,
+ LANG_LIST_NAME, &lang, -1);
+ String lang_str (lang);
+ if (lang) {
+ g_free (lang);
+ lang = 0;
+ }
+
+ it = std::find (_disabled_langs.begin (), _disabled_langs.end (), lang_str);
+
+ if (it != _disabled_langs.end ())
+ _disabled_langs.erase (it);
+ else
+ _disabled_langs.push_back (lang_str);
+}
+
+void ISFLangWin::isf_lang_save_callback (GtkWidget *softkey,
+ gpointer user_data)
+{
+ if (_disabled_langs.size ()) {
+ if (_disabled_langs.size () == _lang_num) {
+ GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW (_main_window),
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_INFO,
+ GTK_BUTTONS_OK,
+ _("At least select one language!\n"));
+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+ return;
+ }
+ _disabled_langs_bak.clear ();
+ for (size_t j = 0; j < _disabled_langs.size (); j++) {
+ _disabled_langs_bak.push_back (_disabled_langs[j]);
+ }
+ }
+
+ scim_global_config_write (String (SCIM_GLOBAL_CONFIG_DISABLED_LANGS), _disabled_langs);
+
+ std::vector<String> enable_langs;
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ String lang_name;
+ lang_name = scim_get_language_name (it->first);
+ if (std::find (_disabled_langs.begin (), _disabled_langs.end (), lang_name) == _disabled_langs.end ()) {
+ enable_langs.push_back (lang_name);
+ }
+ }
+ scim_global_config_write (String (SCIM_GLOBAL_CONFIG_ISF_DEFAULT_LANGUAGES), enable_langs);
+ scim_global_config_flush ();
+
+ gtk_widget_hide (_main_window);
+ gtk_main_quit ();
+}
+
+void ISFLangWin::isf_lang_back_callback (GtkWidget *softkey,
+ gpointer user_data)
+{
+ _lang_selected_changed = false;
+ _disabled_langs.clear ();
+ if (_disabled_langs_bak.size ()) {
+ for (size_t j = 0; j < _disabled_langs_bak.size (); j++) {
+ _disabled_langs.push_back (_disabled_langs_bak[j]);
+ }
+ }
+
+ gtk_widget_hide (_main_window);
+ gtk_main_quit ();
+}
+
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#if !defined (__ISF_LANG_WIN_H)
+#define __ISF_LANG_WIN_H
+
+#include <gtk/gtk.h>
+
+using namespace scim;
+
+class ISFLangWin
+{
+ ISFLangWin (const ISFLangWin &);
+ ISFLangWin & operator = (const ISFLangWin &);
+
+public:
+ ISFLangWin ();
+ ~ISFLangWin ();
+
+ void show_window (void);
+private:
+
+ GtkWidget *create_isf_lang_list_view (void);
+ static void on_lang_enable_box_clicked (GtkCellRendererToggle *cell,
+ gchar *arg1, gpointer data);
+ static void isf_lang_save_callback (GtkWidget *softkey,
+ gpointer user_data);
+ static void isf_lang_back_callback (GtkWidget *softkey,
+ gpointer user_data);
+
+};
+
+#endif // __ISF_LANG_WIN_H
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
+
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#define Uses_SCIM_PANEL_AGENT
+
+
+#include "isf_setup_utility.h"
+
+MapStringVectorSizeT _groups;
+std::vector < String > _uuids;
+std::vector < String > _names;
+std::vector < String > _module_names;
+std::vector < String > _langs;
+std::vector < String > _icons;
+std::vector < uint32 > _options;
+std::vector <TOOLBAR_MODE_T> _modes;
+MapStringString _keyboard_ise_help_map;
+MapStringVectorString _disabled_ise_map;
+std::vector < String > _disabled_langs;
+MapStringVectorString _disabled_ise_map_bak;
+std::vector < String > _disabled_langs_bak;
+std::vector < String > _isf_app_list;
+gboolean _ise_list_changed = false;
+gboolean _setup_enable_changed = false;
+gboolean _lang_selected_changed = false;
+
+
+void get_all_languages (std::vector<String> &all_langs)
+{
+ String lang_name;
+
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ lang_name = scim_get_language_name_english (it->first);
+ all_langs.push_back (lang_name);
+ }
+}
+
+void get_selected_languages (std::vector<String> &selected_langs)
+{
+ String lang_name;
+
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ lang_name = scim_get_language_name_english (it->first);
+
+ if (std::find (_disabled_langs.begin (), _disabled_langs.end (), lang_name) == _disabled_langs.end ())
+ selected_langs.push_back (lang_name);
+ }
+}
+
+void get_all_iselist_in_languages (std::vector<String> lang_list, std::vector<String> &all_iselist)
+{
+ String lang_name;
+
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ lang_name = scim_get_language_name_english (it->first);
+
+ if (std::find (lang_list.begin (), lang_list.end (), lang_name) != lang_list.end ()) {
+ for (size_t i = 0; i < it->second.size (); i++) {
+ if (std::find (all_iselist.begin (), all_iselist.end (), _names[it->second[i]]) == all_iselist.end ())
+ all_iselist.push_back (_names[it->second[i]]);
+ }
+ }
+ }
+}
+
+void get_interested_iselist_in_languages (std::vector<String> lang_list, std::vector<String> &interested)
+{
+ String lang_name;
+ String active_app = _isf_app_list [0];
+
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ lang_name = scim_get_language_name_english (it->first);
+ if (std::find(lang_list.begin(), lang_list.end(), lang_name) != lang_list.end ()) {
+ for (size_t i = 0; i < it->second.size (); i++) {
+ if (std::find (_disabled_ise_map[active_app].begin (), _disabled_ise_map[active_app].end (), _uuids[it->second[i]])
+ ==_disabled_ise_map[active_app].end ()) {
+ // Protect from add the same ise more than once in case of multiple langs.-->f_show list
+ if (std::find (interested.begin (), interested.end (), _names[it->second[i]]) == interested.end ())
+ interested.push_back (_names[it->second[i]]);
+ }
+ }
+ }
+ }
+}
+
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#if !defined (__ISF_SETUP_UTILITY_H)
+#define __ISF_SETUP_UTILITY_H
+
+
+#include "scim.h"
+#include "scim_stl_map.h"
+#include <glib.h>
+#include <gtk/gtk.h>
+//#include <gtk/gtkimcontrol.h> /* for include USING_ISF_SWITCH_BUTTON - by jyjeon */
+
+using namespace scim;
+
+#if SCIM_USE_STL_EXT_HASH_MAP
+typedef __gnu_cxx::hash_map <String, std::vector <size_t>, scim_hash_string> MapStringVectorSizeT;
+typedef __gnu_cxx::hash_map <String, KeyEventList, scim_hash_string> MapStringKeyEventList;
+typedef std::map <String, std::vector <String> > MapStringVectorString;
+typedef std::map <String ,String> MapStringString;
+#elif SCIM_USE_STL_HASH_MAP
+typedef std::hash_map <String, std::vector <size_t>, scim_hash_string> MapStringVectorSizeT;
+typedef std::hash_map <String, KeyEventList, scim_hash_string> MapStringKeyEventList;
+typedef std::map <String, std::vector <String> > MapStringVectorString;
+typedef std::map <String ,String> MapStringString;
+#else
+typedef std::map <String, std::vector <size_t> > MapStringVectorSizeT;
+typedef std::map <String, KeyEventList> MapStringKeyEventList;
+typedef std::map <String, std::vector <String> > MapStringVectorString;
+typedef std::map <String ,String> MapStringString;
+#endif
+
+
+#define SCIM_UP_ICON_FILE (SCIM_ICONDIR "/up.png")
+#define SCIM_DOWN_ICON_FILE (SCIM_ICONDIR "/down.png")
+#define SCIM_LEFT_ICON_FILE (SCIM_ICONDIR "/left.png")
+#define SCIM_RIGHT_ICON_FILE (SCIM_ICONDIR "/right.png")
+
+#define ISF_PANEL_BG_FILE (SCIM_ICONDIR "/ISF_panel_bg.png")
+#define ISF_ICON_HELP_FILE (SCIM_ICONDIR "/ISF_icon_31_help.png")
+#define ISF_ICON_HELP_T_FILE (SCIM_ICONDIR "/ISF_icon_31_help_t.png")
+#define ISF_CANDIDATE_BG_FILE (SCIM_ICONDIR "/ISF_candidate_bg.png")
+#define ISF_CANDIDATE_DIVIDER_FILE (SCIM_ICONDIR "/ISF_candidate_divider.png")
+
+#define BASE_SCREEN_WIDTH 240.0
+#define BASE_SCREEN_HEIGHT 400.0
+#define BASE_SOFTKEYBAR_HEIGHT 48.0
+#define BASE_PANEL_WIDTH 230.0
+#define BASE_PANEL_HEIGHT 198.0
+
+/*setup button*/
+#define BASE_SETUP_BUTTON_WIDTH 75.0
+#define BASE_SETUP_BUTTON_HEIGHT 31.0
+
+/*help button*/
+#define BASE_HELP_ICON_WIDTH 31.0
+#define BASE_HELP_ICON_HEIGHT 31.0
+
+//#define USING_ISF_SWITCH_BUTTON
+
+
+void get_all_languages (std::vector<String> &all_langs);
+void get_selected_languages (std::vector<String> &selected_langs);
+void get_all_iselist_in_languages (std::vector<String> lang_list, std::vector<String> &all_iselist);
+void get_interested_iselist_in_languages (std::vector<String> lang_list, std::vector<String> &interested);
+
+#endif // __ISF_SETUP_UTILITY_H
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_SCIM_IMENGINE_MODULE
+#define Uses_SCIM_PANEL_AGENT
+
+
+#include <cstring>
+#include <cstdio>
+#include <gdk/gdk.h>
+#include "scim_private.h"
+#include "scim.h"
+#include "isf_setup_win.h"
+#include "isf_setup_utility.h"
+#include "scim_setup_module.h"
+#include "isf_ise_setup_win.h"
+#include "isf_help_win.h"
+#include "isf_lang_win.h"
+
+#define LIST_ICON_SIZE 20
+
+enum {
+ FACTORY_LIST_ENABLE = 0,
+ FACTORY_LIST_ICON,
+ FACTORY_LIST_NAME,
+ FACTORY_LIST_MODULE_NAME,
+ FACTORY_LIST_UUID,
+ FACTORY_LIST_TYPE,
+ FACTORY_LIST_OPTION_PIX,
+ FACTORY_LIST_HELP_PIX,
+ FACTORY_LIST_NUM_COLUMNS
+};
+
+static SetupUI *_setup_ui = 0;
+static ISFHelpWin *_ise_help_win = 0;
+static ISFLangWin *_isf_lang_win = 0;
+static GtkListStore *_app_list_store = 0;
+static GtkListStore *_factory_list_store = 0;
+static GtkTreePath *_app_combo_default_path = 0;
+static GtkWidget *_combo_app = 0;
+static GtkWidget *_main_window = 0;
+static int _display_selected_items = 0;
+static ConfigPointer _config;
+
+extern std::vector<String> _isf_app_list;
+extern MapStringVectorSizeT _groups;
+extern std::vector < String > _uuids;
+extern std::vector < String > _names;
+extern std::vector < String > _module_names;
+extern std::vector < String > _langs;
+extern std::vector < String > _icons;
+extern std::vector <TOOLBAR_MODE_T> _modes;
+extern MapStringString _keyboard_ise_help_map;
+extern MapStringVectorString _disabled_ise_map;
+extern std::vector <String> _disabled_langs;
+extern MapStringVectorString _disabled_ise_map_bak;
+extern std::vector <String> _disabled_langs_bak;
+extern gboolean _lang_selected_changed;
+extern gboolean _ise_list_changed;
+extern gboolean _setup_enable_changed;
+extern int _screen_width;
+extern float _width_rate;
+extern float _height_rate;
+
+
+ISFSetupWin::ISFSetupWin (const ConfigPointer & config)
+{
+ _config = config;
+#if HAVE_GCONF
+ if (!_main_window) {
+ _main_window = gtk_main_window_new (GTK_WIN_STYLE_DEFAULT);
+ gtk_main_window_set_title_style (GTK_MAIN_WINDOW (_main_window), GTK_WIN_TITLE_STYLE_TEXT_ICON);
+
+ GtkWidget *form = gtk_form_new (TRUE);
+ gtk_form_set_title (GTK_FORM (form), "ISF Setup");
+
+ GtkWidget *isf_setup = create_isf_setup_widget ();
+
+ gtk_container_add (GTK_CONTAINER (form), isf_setup);
+
+#ifdef USING_ISF_SWITCH_BUTTON
+ GtkWidget *softkey = GTK_WIDGET (gtk_form_get_softkey_bar (GTK_FORM (form)));
+ gtk_softkey_bar_use_ise_switch (GTK_SOFTKEY_BAR (softkey), false);
+
+ gtk_softkey_bar_set_softkey (GTK_SOFTKEY_BAR (softkey), SOFTKEY1,
+ "Save", NULL,
+ (SoftkeyActionType) SOFTKEY_CALLBACK,
+ (gpointer) (isf_setup_save_callback),
+ (gpointer) NULL);
+
+ gtk_softkey_bar_set_softkey (GTK_SOFTKEY_BAR (softkey), SOFTKEY4,
+ "Exit", NULL,
+ (SoftkeyActionType) SOFTKEY_CALLBACK,
+ (gpointer) (isf_setup_back_callback),
+ (gpointer) NULL);
+#else
+ gtk_form_add_softkey (GTK_FORM (form), "Save", NULL, SOFTKEY_CALLBACK, (void *)isf_setup_save_callback, NULL);
+ gtk_form_add_softkey (GTK_FORM (form), "Exit", NULL, SOFTKEY_CALLBACK, (void *)isf_setup_back_callback, NULL);
+#endif
+
+ gtk_main_window_add_form (GTK_MAIN_WINDOW (_main_window), GTK_FORM (form));
+ gtk_main_window_set_current_form (GTK_MAIN_WINDOW (_main_window), GTK_FORM (form));
+
+ gtk_widget_show_all (form);
+ }
+#endif
+}
+
+ISFSetupWin::~ISFSetupWin ()
+{
+ if (_main_window) {
+ gtk_widget_destroy (_main_window);
+ _main_window = 0;
+ }
+ if (_setup_ui) {
+ delete _setup_ui;
+ _setup_ui = 0;
+ }
+ if (_ise_help_win) {
+ delete _ise_help_win;
+ _ise_help_win = 0;
+ }
+ if (_isf_lang_win) {
+ delete _isf_lang_win;
+ _isf_lang_win = 0;
+ }
+}
+
+void ISFSetupWin::show_window (void)
+{
+ GtkTreeIter it;
+ gtk_tree_model_get_iter (GTK_TREE_MODEL (_app_list_store), &it,
+ _app_combo_default_path);
+ gtk_combo_box_set_active_iter ((GtkComboBox *) _combo_app, &it);
+
+ update_factory_list_store ();
+
+ gtk_widget_show_all (_main_window);
+ gtk_window_present (GTK_WINDOW (_main_window));
+ gtk_main ();
+}
+
+
+void ISFSetupWin::app_selection_changed_callback (GtkComboBox * combo, gpointer data)
+{
+ ISFSetupWin *obj = (ISFSetupWin *)data;
+ obj->update_factory_list_store ();
+}
+
+
+void ISFSetupWin::on_language_button_clicked_callback (GtkButton * button,
+ gpointer user_data)
+{
+ ISFSetupWin *obj = (ISFSetupWin *)user_data;
+
+ if (!_isf_lang_win)
+ _isf_lang_win = new ISFLangWin ();
+ if (_isf_lang_win)
+ _isf_lang_win->show_window ();
+
+ if (_lang_selected_changed) {
+ _ise_list_changed = true;
+ obj->update_factory_list_store ();
+ }
+}
+
+GtkWidget *ISFSetupWin::create_isf_setup_widget (void)
+{
+ GtkWidget *language_button = NULL, *hbox = NULL, *vbox = NULL, *scroll = NULL;
+
+ GtkTreeIter iter, it;
+ GtkCellRenderer *cell = NULL;
+
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, false, false, 0);
+ gtk_widget_set_size_request (hbox, _screen_width, (int)(40*_height_rate));
+ gtk_container_set_border_width (GTK_CONTAINER (hbox),(int)( 5*_height_rate));
+
+ // Create application list combox
+ _combo_app = gtk_combo_box_new ();
+ cell = gtk_cell_renderer_text_new ();
+ _app_list_store = gtk_list_store_new (1, G_TYPE_STRING);
+
+ for (unsigned int i = 0; i < _isf_app_list.size (); i++) {
+ gtk_list_store_prepend (_app_list_store, &iter);
+ gtk_list_store_set (_app_list_store, &iter, 0, _isf_app_list[_isf_app_list.size () - i - 1].c_str (), -1);
+ }
+
+ _app_combo_default_path = gtk_tree_model_get_path (GTK_TREE_MODEL (_app_list_store), &iter);
+
+ gtk_cell_layout_pack_start ((GtkCellLayout *) _combo_app, cell, TRUE);
+ gtk_cell_layout_set_attributes ((GtkCellLayout *) _combo_app, cell, "text", 0, NULL);
+ gtk_combo_box_set_model ((GtkComboBox *) _combo_app, (GtkTreeModel *) _app_list_store);
+ gtk_tree_model_get_iter (GTK_TREE_MODEL (_app_list_store), &it, _app_combo_default_path);
+ gtk_combo_box_set_active_iter ((GtkComboBox *) _combo_app, &it);
+// gtk_widget_show (_combo_app); //hide the app list combox temp
+ g_signal_connect ((gpointer) _combo_app, "changed",
+ G_CALLBACK (app_selection_changed_callback), (gpointer)this);
+
+ // Create language button
+ language_button = gtk_button_new_with_label ("Language");
+ GtkStyle *style1 = gtk_rc_get_style (language_button);
+ GtkWidget *newlabel = gtk_label_new ("Language");
+ if (newlabel) {
+ GtkWidget * old = gtk_bin_get_child (GTK_BIN (language_button));
+ if (old)
+ gtk_container_remove (GTK_CONTAINER (language_button), old);
+ gtk_container_add (GTK_CONTAINER (language_button), newlabel);
+ }
+ if(style1)
+ {
+ gtk_widget_modify_font (language_button, style1->font_desc);
+ }
+ gtk_widget_show (language_button);
+ gtk_box_pack_start (GTK_BOX (hbox), language_button, true, true, 0);
+ g_signal_connect ((gpointer) language_button, "clicked",
+ G_CALLBACK (on_language_button_clicked_callback), (gpointer)this);
+
+ // Create ISE list view
+ scroll = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_container_add (GTK_CONTAINER (vbox), scroll);
+ gtk_widget_show (scroll);
+
+ GtkWidget *view = create_factory_list_view ();
+ create_and_fill_factory_list_store ();
+ gtk_tree_view_set_model (GTK_TREE_VIEW (view), GTK_TREE_MODEL (_factory_list_store));
+ gtk_container_add (GTK_CONTAINER (scroll), view);
+ gtk_widget_show (view);
+
+ return vbox;
+}
+
+// Show all ISEs in the view
+void ISFSetupWin::create_and_fill_factory_list_store (void)
+{
+ _factory_list_store = gtk_list_store_new (FACTORY_LIST_NUM_COLUMNS, G_TYPE_BOOLEAN,
+ GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING,
+ G_TYPE_STRING, G_TYPE_INT, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF);
+ update_factory_list_store ();
+}
+
+void ISFSetupWin::update_factory_list_store (void)
+{
+ GtkTreeIter iter;
+
+ GdkPixbuf *icon = NULL, *icon2 = NULL;
+ GtkWidget *pix = NULL, *pix2 = NULL;
+
+ _display_selected_items = 0;
+ pix = gtk_image_new_from_file (ISE_SETUP_ICON_FILE);
+ icon = gtk_image_get_pixbuf (GTK_IMAGE (pix));
+ pix2 = gtk_image_new_from_file (ISE_HELP_ICON_FILE);
+ icon2 = gtk_image_get_pixbuf (GTK_IMAGE (pix2));
+
+ String _app_name = gtk_combo_box_get_active_text ((GtkComboBox *) _combo_app);
+
+ gtk_list_store_clear (_factory_list_store);
+ std::vector<String> f_show;
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ String lang_name;
+ lang_name = scim_get_language_name (it->first);
+ if (std::find (_disabled_langs.begin (), _disabled_langs.end (), lang_name) == _disabled_langs.end ()) {
+ for (size_t i = 0; i < it->second.size (); i++) {
+ // protect from add the same ise more than once in case of multiple langs.-->f_show list
+ if (std::find (f_show.begin (), f_show.end (), _uuids[it->second[i]]) == f_show.end ()) {
+ gtk_list_store_append (_factory_list_store, &iter);
+ gtk_list_store_set (_factory_list_store, &iter,
+ FACTORY_LIST_NAME,
+ _names[it->second[i]].c_str (),
+ FACTORY_LIST_MODULE_NAME,
+ _module_names[it->second[i]].c_str (),
+ FACTORY_LIST_UUID,
+ _uuids[it->second[i]].c_str (),
+ FACTORY_LIST_TYPE, (gint)_modes[it->second[i]],
+ FACTORY_LIST_OPTION_PIX, icon,
+ FACTORY_LIST_HELP_PIX,icon2,
+ -1);
+ f_show.push_back (_uuids[it->second[i]]);
+
+
+ if (std::find (_disabled_ise_map[_app_name].begin (), _disabled_ise_map[_app_name].end (), _uuids[it->second[i]])
+ ==_disabled_ise_map[_app_name].end ()) {
+ gtk_list_store_set (_factory_list_store, &iter, FACTORY_LIST_ENABLE, true, -1);
+ _display_selected_items++;
+ } else {
+ gtk_list_store_set (_factory_list_store, &iter, FACTORY_LIST_ENABLE, false, -1);
+ }
+ }
+ }
+ }
+ }
+
+ if (icon) {
+ gdk_pixbuf_unref (icon);
+ icon = 0;
+ }
+ if (icon2) {
+ gdk_pixbuf_unref (icon2);
+ icon2 = 0;
+ }
+}
+
+GtkWidget * ISFSetupWin::create_factory_list_view (void)
+{
+ GtkCellRenderer* renderer = NULL;
+ GtkTreeViewColumn* column = NULL;
+
+ GtkWidget *tv = gtk_tree_view_new ();
+ g_object_set (tv, "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_NONE, NULL);
+ column = gtk_tree_view_column_new ();
+
+ //toggle renderer
+ renderer = gtk_cell_renderer_toggle_new ();
+ g_object_set (renderer, "activatable", TRUE, NULL);
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (column), renderer, FALSE);
+ gtk_cell_renderer_set_fixed_size (renderer, _screen_width/8, (gint)(40*_height_rate));
+ g_object_set (renderer, "xalign", 0.5, NULL);
+ g_object_set (renderer, "radio", 0, NULL);
+ g_object_set (renderer, "indicator-size", (gint)(26*(_width_rate < _height_rate ? _width_rate : _height_rate)), NULL);
+ gtk_tree_view_column_set_attributes (column, renderer, "active", FACTORY_LIST_ENABLE, NULL);
+ g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (on_factory_enable_box_clicked), (gpointer) NULL);
+
+ // text renderer
+ renderer = gtk_cell_renderer_text_new ();
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (column), renderer, FALSE);
+ gtk_tree_view_column_set_attributes (column, renderer, "text", FACTORY_LIST_NAME, NULL);
+ gtk_cell_renderer_set_fixed_size (renderer, (gint)(_screen_width*5/8), (gint)(40*_height_rate));
+ g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+ g_object_set (renderer, "xalign", 0.0, NULL);
+#if HAVE_GCONF
+ gtk_cell_renderer_set_cell_flag (tv, renderer, GTK_CELL_RENDERER_MAINCELL);
+#endif
+ gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column);
+
+ // pixbuf render
+ column = gtk_tree_view_column_new ();
+ renderer = gtk_cell_renderer_pixbuf_new ();
+#if HAVE_GCONF
+ renderer->cell_type = GTK_CELL_RENDERER_ICONCELL;
+#endif
+ gtk_tree_view_column_pack_start (column, renderer, FALSE);
+ gtk_tree_view_column_set_attributes (column, renderer, "pixbuf", FACTORY_LIST_HELP_PIX, NULL);
+ gtk_cell_renderer_set_fixed_size (renderer, _screen_width/11, _screen_width/10);
+ g_object_set (renderer, "xalign", 0.5, NULL);
+ g_object_set (renderer, "yalign", 0.5, NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column);
+
+ // pixbuf render
+ column = gtk_tree_view_column_new ();
+ renderer = gtk_cell_renderer_pixbuf_new ();
+#if HAVE_GCONF
+ renderer->cell_type = GTK_CELL_RENDERER_ICONCELL;
+#endif
+ gtk_tree_view_column_pack_start (column, renderer, FALSE);
+ gtk_tree_view_column_set_attributes (column, renderer, "pixbuf", FACTORY_LIST_OPTION_PIX, NULL);
+ gtk_cell_renderer_set_fixed_size (renderer, _screen_width/11, _screen_width/10);
+ g_object_set (renderer, "yalign", 0.5, NULL);
+ g_object_set (renderer, "xalign", 0.5, NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column);
+
+#if HAVE_GCONF
+ gtk_tree_view_set_special_row_selection_indicator (GTK_TREE_VIEW (tv), TRUE);
+#endif
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tv), false);
+ g_signal_connect (GTK_TREE_VIEW (tv), "button_press_event", G_CALLBACK (button_press_cb), this);
+ gtk_widget_show_all (tv);
+
+ return tv;
+}
+
+gboolean ISFSetupWin::button_press_cb (GtkWidget *widget, GdkEventButton *event, gpointer data)
+{
+ ISFSetupWin *obj = (ISFSetupWin *)data;
+ GtkTreePath *path = NULL;
+ GtkTreeModel *model = GTK_TREE_MODEL (_factory_list_store);
+ GtkTreeIter iter;
+ gchar *module_name = NULL, *title = NULL;
+ int type;
+ int cell_x, cell_y;
+
+ GtkTreeViewColumn *column = NULL;
+ if (!gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget),
+ (gint)event->x, (gint)event->y,
+ &path, &column, &cell_x, &cell_y))
+ return (gboolean)FALSE;
+
+ if (path != NULL) {
+ gtk_tree_model_get_iter (model, &iter, path);
+ gtk_tree_path_free (path);
+ gtk_tree_model_get (model, &iter, FACTORY_LIST_MODULE_NAME,
+ &module_name, FACTORY_LIST_NAME, &title, FACTORY_LIST_TYPE, &type, -1);
+
+ GtkTreeView *tree_view = NULL;
+ tree_view = GTK_TREE_VIEW (widget);
+ if (event->window == gtk_tree_view_get_bin_window (tree_view)) {
+ if (event->type == GDK_BUTTON_PRESS) {
+ if (column == gtk_tree_view_get_column (tree_view, 1)) {
+ obj->create_ise_help_main (type, module_name, title);
+ return (gboolean)TRUE;
+ } else if (column == gtk_tree_view_get_column (tree_view, 2)) {
+ obj->create_ise_option_main (module_name);
+ return (gboolean)TRUE;
+ }
+ }
+ }
+ }
+ return (gboolean)FALSE;
+}
+
+void ISFSetupWin::create_ise_option_main (const char *str)
+{
+ if (!_setup_ui)
+ _setup_ui = new SetupUI (_config);
+ if (!_setup_ui)
+ return;
+
+ String setup_module_name;
+ setup_module_name = utf8_wcstombs (utf8_mbstowcs (str)) + String ("-imengine-setup");
+
+ SetupModule *setup_module = new SetupModule (setup_module_name);
+
+ if (setup_module) {
+ _setup_ui->add_module (setup_module);
+ delete setup_module;
+ }
+}
+
+
+void ISFSetupWin::create_ise_help_main (gint type, char *name, char *title)
+{
+ if (!_ise_help_win)
+ _ise_help_win = new ISFHelpWin ();
+ if (!_ise_help_win)
+ return;
+
+ TOOLBAR_MODE_T mode = TOOLBAR_MODE_T (type);
+ // for mutually exclusive ISEs
+ if (TOOLBAR_HELPER_MODE == mode) {
+ String help_filename, help_line;
+
+ if (TOOLBAR_HELPER_MODE == mode) {
+ help_filename = String (SCIM_MODULE_PATH) + String (SCIM_PATH_DELIM_STRING)
+ + String (SCIM_BINARY_VERSION) + String (SCIM_PATH_DELIM_STRING) + String ("Helper")
+ + String (SCIM_PATH_DELIM_STRING) + String (name)
+ + String (".help");
+ }
+
+ std::ifstream helpfile (help_filename.c_str ());
+ if (!helpfile) {
+ std::cerr << "Can't open help file : " << help_filename << "!!!!!!!!!! \n";
+
+ help_line = String (_("Input Service Framework ")) +
+ String (_("\n(C) 2008 SAMSUNG")) +
+ String (_("\n\n Help file is needed!!"));
+ } else {
+ /* FIXME -- 256 char per line for now -- mingbin.qu */
+ char str[256];
+ while (helpfile.getline (str, sizeof (str))) {
+ help_line = help_line + String (str) + String("\n");
+ }
+ helpfile.close ();
+ }
+ _ise_help_win->show_help (title, (char *)help_line.c_str ());
+ } else {
+ // FIXME
+ _ise_help_win->show_help (title, (char *)_keyboard_ise_help_map[String(name)].c_str ());
+ }
+}
+
+// Check before back
+int ISFSetupWin::get_app_active_ise_number (String app_name)
+{
+ if (app_name.length () <= 0)
+ return 0;
+
+ int nCount = 0;
+ String lang_name;
+
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ lang_name = scim_get_language_name (it->first);
+ if (std::find (_disabled_langs.begin (), _disabled_langs.end (), lang_name) == _disabled_langs.end ()) {
+ for (size_t i = 0; i < it->second.size (); i++) {
+ if (std::find (_disabled_ise_map_bak[app_name].begin (), _disabled_ise_map_bak[app_name].end (), _uuids[it->second[i]])
+ ==_disabled_ise_map_bak[app_name].end ()) {
+ nCount++;
+ }
+ }
+ }
+ }
+ return nCount;
+}
+
+void ISFSetupWin::isf_setup_save_callback (GtkWidget *softkey, gpointer user_data)
+{
+ if (_display_selected_items == 0) {
+ GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW (_main_window),
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_INFO,
+ GTK_BUTTONS_OK,
+ _("At least select one ISE!\n"));
+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+ return;
+ }
+
+ for (size_t i = 0; i < _isf_app_list.size (); i++) {
+ String app = _isf_app_list[i];
+ _disabled_ise_map_bak[app].clear ();
+ if (_disabled_ise_map[app].size ()) {
+ for (size_t j = 0; j < _disabled_ise_map[app].size (); j++) {
+ _disabled_ise_map_bak[app].push_back (_disabled_ise_map[app][j]);
+ }
+ }
+ }
+
+ if (_setup_enable_changed) {
+ for (size_t i = 0; i < _isf_app_list.size (); i++) {
+ String app = _isf_app_list[i];
+ scim_global_config_write (String (SCIM_GLOBAL_CONFIG_DISABLED_IMENGINE_FACTORIES
+ "/") + _isf_app_list[i], _disabled_ise_map[app]);
+ }
+ scim_global_config_flush ();
+ }
+ gtk_widget_hide (_main_window);
+ gtk_main_quit ();
+}
+
+void ISFSetupWin::isf_setup_back_callback (GtkWidget *softkey, gpointer user_data)
+{
+ if (get_app_active_ise_number (_isf_app_list[0]) == 0) {
+ GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW (_main_window),
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_INFO,
+ GTK_BUTTONS_OK,
+ _("Please select ISE, then save.\n"));
+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+ return;
+ }
+ _setup_enable_changed = false;
+ for (size_t i = 0; i < _isf_app_list.size (); i++) {
+ String app = _isf_app_list[i];
+ _disabled_ise_map[app].clear ();
+ if (_disabled_ise_map_bak[app].size ()) {
+ for (size_t j = 0; j < _disabled_ise_map_bak[app].size (); j++) {
+ _disabled_ise_map[app].push_back (_disabled_ise_map_bak[app][j]);
+ }
+ }
+ }
+
+ gtk_widget_hide (_main_window);
+ gtk_main_quit ();
+}
+
+void ISFSetupWin::on_factory_enable_box_clicked (GtkCellRendererToggle *cell, gchar *arg1, gpointer data)
+{
+ GtkTreePath *path = 0;
+ GtkTreeIter iter;
+ gboolean enable;
+
+ std::vector < String >::iterator it;
+
+ _setup_enable_changed = true;
+
+ path = gtk_tree_path_new_from_string (arg1);
+ if (gtk_tree_model_get_iter (GTK_TREE_MODEL (_factory_list_store), &iter, path)) {
+ gtk_tree_model_get (GTK_TREE_MODEL (_factory_list_store), &iter,
+ FACTORY_LIST_ENABLE, &enable, -1);
+ gtk_list_store_set (GTK_LIST_STORE (_factory_list_store), &iter,
+ FACTORY_LIST_ENABLE, !enable, -1);
+ if (enable)
+ _display_selected_items--;
+ else
+ _display_selected_items++;
+ }
+ if (path) {
+ gtk_tree_path_free (path);
+ path = 0;
+ }
+
+ gchar *cuuid = 0;
+ String uuid;
+ gtk_tree_model_get (GTK_TREE_MODEL (_factory_list_store),
+ &iter, FACTORY_LIST_UUID,
+ &cuuid, -1);
+ uuid = (String)cuuid;
+ if (cuuid) {
+ g_free (cuuid);
+ cuuid = 0;
+ }
+ String _app_name = gtk_combo_box_get_active_text ((GtkComboBox *) _combo_app);
+ it = std::find (_disabled_ise_map[_app_name].begin (), _disabled_ise_map[_app_name].end (), uuid);
+
+ if (it != _disabled_ise_map[_app_name].end ())
+ _disabled_ise_map[_app_name].erase (it);
+ else
+ _disabled_ise_map[_app_name].push_back (uuid);
+}
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Shuo Liu <shuo0805.liu@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#if !defined (__ISF_SETUP_WIN_H)
+#define __ISF_SETUP_WIN_H
+
+#include <gtk/gtk.h>
+
+using namespace scim;
+
+
+#define ISE_SETUP_ICON_FILE (SCIM_ICONDIR "/ISF_icon_option.png")
+#define ISE_HELP_ICON_FILE (SCIM_ICONDIR "/ISF_icon_help.png")
+#define ISE_SETUP_ICON_T_FILE (SCIM_ICONDIR "/ISF_icon_option_t.png")
+#define ISE_HELP_ICON_T_FILE (SCIM_ICONDIR "/ISF_icon_help_t.png")
+
+
+class ISFSetupWin
+{
+ ISFSetupWin (const ISFSetupWin &);
+ ISFSetupWin & operator = (const ISFSetupWin &);
+
+public:
+ ISFSetupWin (const ConfigPointer & config);
+ ~ISFSetupWin ();
+
+ void show_window (void);
+private:
+ GtkWidget *create_factory_list_view (void);
+ GtkWidget *create_isf_setup_widget (void);
+ void create_and_fill_factory_list_store (void);
+ void update_factory_list_store (void);
+ void on_isf_help_back_callback (GtkWidget * softkey, gpointer user_data);
+ void create_ise_option_main (const char *str);
+ void create_ise_help_main (gint type, char *name, char *title);
+
+ static gboolean button_press_cb (GtkWidget *widget, GdkEventButton *event, gpointer data);
+ static int get_app_active_ise_number (String app_name);
+ static void isf_setup_save_callback (GtkWidget *softkey, gpointer user_data);
+ static void isf_setup_back_callback (GtkWidget *softkey, gpointer user_data);
+ static void on_factory_enable_box_clicked (GtkCellRendererToggle *cell, gchar *arg1, gpointer data);
+ static void app_selection_changed_callback (GtkComboBox *combo, gpointer data);
+ static void on_language_button_clicked_callback (GtkButton *button, gpointer user_data);
+};
+
+#endif // __ISF_SETUP_WIN_H
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/** @file scim_panel_gtk.cpp
+ */
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_panel_gtk.cpp,v 1.118.2.15 2007/04/11 11:30:31 suzhe Exp $
+ */
+
+#include <sys/wait.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/times.h>
+#include <signal.h>
+#include <glib.h>
+#include <string.h>
+#include <gdk/gdk.h>
+#undef GDK_WINDOWING_X11
+#ifdef GDK_WINDOWING_X11
+#include <gdk/gdkx.h>
+#endif
+
+#include <gdk/gdkx.h>
+#include <gtk/gtk.h>
+#include <stdlib.h>
+#include <list>
+
+#define Uses_C_STDIO
+#define Uses_C_STDLIB
+#define Uses_SCIM_LOOKUP_TABLE
+#define Uses_SCIM_SOCKET
+#define Uses_SCIM_TRANSACTION
+#define Uses_SCIM_TRANS_COMMANDS
+#define Uses_SCIM_CONFIG
+#define Uses_SCIM_CONFIG_MODULE
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_SCIM_DEBUG
+#define Uses_SCIM_HELPER
+#define Uses_SCIM_HELPER_MODULE
+#define Uses_SCIM_PANEL_AGENT
+
+#define Uses_SCIM_MODULE
+#define Uses_SCIM_COMPOSE_KEY
+#define Uses_SCIM_CONFIG_BASE
+#define Uses_SCIM_IMENGINE_MODULE
+#define Uses_SCIM_HOTKEY
+#define Uses_SCIM_FILTER_MANAGER
+#define Uses_SCIM_UTILITY
+
+#include "scim_private.h"
+#include "scim.h"
+#include "scim_stl_map.h"
+#include "scimstringview.h"
+
+#if HAVE_GCONF
+#include <gtk/gtkimscreenresolution.h>
+#include <gconf/gconf-client.h>
+#include <global-gconf.h>
+#include <phonestatus.h>
+#include "limo-event-delivery.h"
+#endif
+
+#include "scim_setup_module.h"
+#include "isf_setup_utility.h"
+#include "isf_help_win.h"
+#include "isf_setup_win.h"
+
+using namespace scim;
+
+#include "icons/up.xpm"
+#include "icons/down.xpm"
+#include "icons/left.xpm"
+#include "icons/right.xpm"
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Declaration of macro.
+/////////////////////////////////////////////////////////////////////////////
+#define MAX_FONT_STR_SIZE 200
+#define FONT_SIZE_OF_CANDIDATE_WIDGET change_screen_resolution_P_H_RATE(11)
+
+#define SCIM_CONFIG_PANEL_GTK_FONT "/Panel/Gtk/Font"
+#define SCIM_CONFIG_PANEL_GTK_COLOR_NORMAL_BG "/Panel/Gtk/Color/NormalBackground"
+#define SCIM_CONFIG_PANEL_GTK_COLOR_ACTIVE_BG "/Panel/Gtk/Color/ActiveBackground"
+#define SCIM_CONFIG_PANEL_GTK_COLOR_NORMAL_TEXT "/Panel/Gtk/Color/NormalText"
+#define SCIM_CONFIG_PANEL_GTK_COLOR_ACTIVE_TEXT "/Panel/Gtk/Color/ActiveText"
+#define SCIM_CONFIG_PANEL_GTK_COLOR_HIGHLIGHT_TEXT "/Panel/Gtk/Color/HighlightText"
+#define SCIM_CONFIG_PANEL_GTK_COLOR_SEPARATOR "/Panel/Gtk/Color/Separator"
+#define SCIM_CONFIG_PANEL_GTK_LOOKUP_TABLE_VERTICAL "/Panel/Gtk/LookupTableVertical"
+#define SCIM_CONFIG_PANEL_GTK_LOOKUP_TABLE_STYLE "/Panel/Gtk/LookupTableStyle"
+#define SCIM_CONFIG_PANEL_GTK_LOOKUP_TABLE_MODE "/Panel/Gtk/LookupTableMode"
+#define SCIM_CONFIG_PANEL_GTK_DEFAULT_STICKED "/Panel/Gtk/DefaultSticked"
+
+#define LOOKUP_ICON_SIZE 12
+
+#define BLANK_SIZE 0
+#define VERTICAL_SHOW_LINE 7
+
+#define CANDIDATE_TABLE 0
+#define ASSOCIATE_TABLE 1
+
+#define PORTRAIT_DEGREE 0
+#define LANDSCAPE_DEGREE 90
+
+/////////////////////////////////////////////////////////////////////////////
+// Declaration of external variables.
+/////////////////////////////////////////////////////////////////////////////
+extern MapStringVectorSizeT _groups;
+extern std::vector < String > _uuids;
+extern std::vector < String > _names;
+extern std::vector < String > _module_names;
+extern std::vector < String > _langs;
+extern std::vector < String > _icons;
+extern std::vector < uint32 > _options;
+extern std::vector <TOOLBAR_MODE_T> _modes;
+extern MapStringString _keyboard_ise_help_map;
+extern MapStringVectorString _disabled_ise_map;
+extern std::vector < String > _disabled_langs;
+extern MapStringVectorString _disabled_ise_map_bak;
+extern std::vector < String > _disabled_langs_bak;
+extern std::vector < String > _isf_app_list;
+extern gboolean _ise_list_changed;
+extern gboolean _setup_enable_changed;
+
+extern CommonLookupTable g_isf_candidate_table;
+
+/////////////////////////////////////////////////////////////////////////////
+// Declaration of internal data types.
+/////////////////////////////////////////////////////////////////////////////
+enum {
+ IME_SETTING_KEYPAD_TYPE_3X4 = 0,
+ IME_SETTING_KEYPAD_TYPE_QTY,
+ IME_SETTING_KEYPAD_TYPE_NUM
+};
+
+typedef enum {
+ IME_BIT_0 = 0,
+ IME_BIT_1,
+ IME_BIT_2,
+ IME_BIT_3,
+ IME_BIT_4,
+ IME_BIT_5,
+ IME_BIT_6,
+ IME_BIT_7,
+ IME_BITL_MAX
+} ImeBitPosition_E;
+
+typedef struct _ImeSettingPredictionEngineOptionInfo_S {
+ gint keypad_type; /* IME_SETTING_KEYPAD_TYPE_3X4, IME_SETTING_KEYPAD_TYPE_QTY */
+
+ gint word_cmpletion_point; /* 0(Off) - 6 */
+ gboolean spell_correction; /* On - Off */
+ gboolean next_word_prediction; /* On - Off */
+ gboolean auto_substitution; /* On - Off */
+ gboolean multitap_word_completion; /* On - Off */
+ gboolean regional_input; /* On - Off */
+
+ gint word_cmpletion_point_prev; /* 0(Off) - 6 */
+ gboolean spell_correction_prev; /* On - Off */
+ gboolean next_word_prediction_prev; /* On - Off */
+ gboolean auto_substitution_prev; /* On - Off */
+ gboolean multitap_word_completion_prev; /* On - Off */
+ gboolean regional_input_prev; /* On - Off */
+} ImeSettingPredictionEngineOptionInfo_S;
+
+enum {
+ ACTIVE_ISE_LIST_ENABLE = 0,
+ ACTIVE_ISE_NAME,
+ ACTIVE_ISE_UUID,
+ ACTIVE_ISE_TYPE,
+ ACTIVE_ISE_ICON,
+ ACTIVE_ISE_OPTION,
+ ACTIVE_ISE_NUM_COLUMS
+};
+
+#if SCIM_USE_STL_EXT_HASH_MAP
+typedef __gnu_cxx::hash_map <String, std::vector <size_t>, scim_hash_string> MapStringVectorSizeT;
+#elif SCIM_USE_STL_HASH_MAP
+typedef std::hash_map <String, std::vector <size_t>, scim_hash_string> MapStringVectorSizeT;
+#else
+typedef std::map <String, std::vector <size_t> > MapStringVectorSizeT;
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// Declaration of internal functions.
+/////////////////////////////////////////////////////////////////////////////
+static void update_active_ise_list_store (bool set_default_ise);
+static void ui_config_reload_callback (const ConfigPointer &config);
+static void ui_load_config (void);
+static void ui_initialize (void);
+static void ui_settle_input_window (bool relative = false,
+ bool force = false);
+static int ui_screen_width (void);
+static int ui_screen_height (void);
+
+#if GDK_MULTIHEAD_SAFE
+static void ui_switch_screen (GdkScreen *screen);
+#endif
+
+static GdkPixbuf* ui_scale_pixbuf (GdkPixbuf *pixbuf,
+ int width,
+ int height);
+static GtkWidget* ui_create_icon (const String &iconfile,
+ const char **xpm = NULL,
+ int width = -1,
+ int height = -1,
+ bool force_create = false);
+static GtkWidget* ui_create_up_icon (void);
+static GtkWidget* ui_create_down_icon (void);
+static GtkWidget* ui_create_left_icon (void);
+static GtkWidget* ui_create_right_icon (void);
+
+// callback functions
+static void ui_preedit_area_move_cursor_cb (ScimStringView *view,
+ guint position);
+static gboolean ui_lookup_table_vertical_click_cb (GtkWidget *item,
+ GdkEventButton *event,
+ gpointer user_data);
+static void ui_lookup_table_horizontal_click_cb (GtkWidget *item,
+ guint position,
+ gpointer user_data);
+static void ui_lookup_table_up_button_click_cb (GtkButton *button,
+ gpointer user_data);
+static void ui_lookup_table_down_button_click_cb (GtkButton *button,
+ gpointer user_data);
+static gboolean ui_associate_table_vertical_click_cb (GtkWidget *item,
+ GdkEventButton *event,
+ gpointer user_data);
+static void ui_associate_table_horizontal_click_cb (GtkWidget *item,
+ guint position,
+ gpointer user_data);
+static void ui_associate_table_up_button_click_cb (GtkButton *button,
+ gpointer user_data);
+static void ui_associate_table_down_button_click_cb (GtkButton *button,
+ gpointer user_data);
+static gboolean ui_input_window_motion_cb (GtkWidget *window,
+ GdkEventMotion *event,
+ gpointer user_data);
+static gboolean ui_input_window_click_cb (GtkWidget *window,
+ GdkEventButton *event,
+ gpointer user_data);
+
+static bool ui_can_hide_input_window (void);
+static PangoAttrList * create_pango_attrlist (const String &str,
+ const AttributeList &attrs);
+
+// PanelAgent related functions
+static bool initialize_panel_agent (const String &config, const String &display, bool resident);
+static bool run_panel_agent (void);
+static gpointer panel_agent_thread_func (gpointer data);
+
+static void slot_transaction_start (void);
+static void slot_transaction_end (void);
+static void slot_reload_config (void);
+static void slot_turn_on (void);
+static void slot_turn_off (void);
+static void slot_focus_in (void);
+static void slot_focus_out (void);
+static void slot_show_panel (void);
+static void slot_hide_panel (void);
+static void slot_update_screen (int screen);
+static void slot_update_spot_location (int x, int y, int top_y);
+static void slot_update_factory_info (const PanelFactoryInfo &info);
+static void slot_show_preedit_string (void);
+static void slot_show_aux_string (void);
+static void slot_show_lookup_table (void);
+static void slot_show_associate_table (void);
+static void slot_hide_preedit_string (void);
+static void slot_hide_aux_string (void);
+static void slot_hide_lookup_table (void);
+static void slot_hide_associate_table (void);
+static void slot_update_preedit_string (const String &str, const AttributeList &attrs);
+static void slot_update_preedit_caret (int caret);
+static void slot_update_aux_string (const String &str, const AttributeList &attrs);
+static void slot_update_candidate_table (const LookupTable &table);
+static void slot_update_associate_table (const LookupTable &table);
+static void slot_set_active_ise_by_uuid (const String &uuid, bool);
+static void slot_set_active_ise_by_name (const String &name);
+static bool slot_get_ise_list (std::vector<String> &name);
+static bool slot_get_keyboard_ise_list (std::vector<String> &name);
+static void slot_get_language_list (std::vector<String> &name);
+static void slot_get_all_language (std::vector<String> &lang);
+static void slot_get_ise_language (char *, std::vector<String> &name);
+static void slot_set_isf_language (const String &language);
+static bool slot_get_ise_info_by_uuid (const String &uuid, ISE_INFO &info);
+static bool slot_get_ise_info_by_name (const String &name, ISE_INFO &info);
+static void slot_set_candidate_ui (int style, int mode);
+static void slot_get_candidate_ui (int &style, int &mode);
+static void slot_set_candidate_position (int left, int top);
+static void slot_get_candidate_rect (struct rectinfo &info);
+static void slot_set_keyboard_ise (int type, const String &ise);
+static void slot_get_keyboard_ise (String &ise_name, String &ise_uuid);
+static void slot_start_default_ise ();
+static void slot_send_key_event (const KeyEvent &key);
+static void slot_lock (void);
+static void slot_unlock (void);
+
+static gboolean candidate_show_timeout_cb (gpointer data);
+static gboolean check_exit_timeout_cb (gpointer data);
+
+/////////////////////////////////////////////////////////////////////////////
+// Declaration of internal variables.
+/////////////////////////////////////////////////////////////////////////////
+#if GDK_MULTIHEAD_SAFE
+static GdkScreen *_current_screen = 0;
+#endif
+
+static GtkWidget *_input_window = 0;
+static GtkWidget *_preedit_area = 0;
+static GtkWidget *_aux_area = 0;
+
+static GtkWidget *_lookup_table_window = 0;
+static GtkWidget *_lookup_table_up_button = 0;
+static GtkWidget *_lookup_table_down_button = 0;
+static GtkWidget *_lookup_table_items [SCIM_LOOKUP_TABLE_MAX_PAGESIZE];
+
+static GtkWidget *_associate_table_window = 0;
+static GtkWidget *_associate_table_up_button = 0;
+static GtkWidget *_associate_table_down_button = 0;
+static GtkWidget *_associate_table_items [SCIM_LOOKUP_TABLE_MAX_PAGESIZE];
+
+static GtkWidget *_toolbar_window = 0;
+
+static PangoFontDescription *_default_font_desc = 0;
+
+static gboolean _input_window_draging = FALSE;
+static gint _input_window_drag_x = 0;
+static gint _input_window_drag_y = 0;
+static gint _input_window_x = 0;
+static gint _input_window_y = 0;
+
+static bool _lookup_table_vertical = false;
+static bool _window_sticked = false;
+
+static int _spot_location_x = -1;
+static int _spot_location_y = -1;
+static int _spot_location_top_y = -1;
+
+static int _lookup_table_index [SCIM_LOOKUP_TABLE_MAX_PAGESIZE+1];
+static int _associate_table_index [SCIM_LOOKUP_TABLE_MAX_PAGESIZE+1];
+static int _lookup_table_index_pos [SCIM_LOOKUP_TABLE_MAX_PAGESIZE+1];
+static int _associate_table_index_pos [SCIM_LOOKUP_TABLE_MAX_PAGESIZE+1];
+
+static GdkColor _normal_bg;
+static GdkColor _normal_text;
+static GdkColor _active_bg;
+static GdkColor _active_text;
+static GdkColor *_theme_color = NULL;
+
+static ConfigPointer _config;
+
+static guint _check_exit_timeout = 0;
+static bool _should_exit = false;
+
+static bool _panel_is_on = true;
+
+static GThread *_panel_agent_thread = 0;
+PanelAgent *_panel_agent = 0;
+
+static std::vector<HelperInfo> _helper_list;
+static std::vector<String> _load_ise_list;
+
+static DEFAULT_ISE_T _initial_ise;
+
+static int _lookup_icon_size = 0;
+
+int _screen_width = 0;
+static int _screen_height = 0;
+float _width_rate = 0;
+float _height_rate = 0;
+static int _softkeybar_height = 0;
+static int _panel_width = 0;
+static int _panel_height = 0;
+static int _setup_button_width = 0;
+static int _setup_button_height = 0;
+static int _help_icon_width = 0;
+static int _help_icon_height = 0;
+
+
+static bool _candidate_is_showed = false;
+static ISF_CANDIDATE_STYLE_T _candidate_style = PREDICTION_ENGINE_CANDIDATE_STYLE;
+static ISF_CANDIDATE_MODE_T _candidate_mode = PORTRAIT_HORIZONTAL_CANDIDATE_MODE;
+static GtkWidget *_candidate_scroll = 0;
+static GtkWidget *_associate_scroll = 0;
+static GtkWidget *_candidate_separator = 0;
+static GtkWidget *_associate_separator = 0;
+static GtkWidget *_middle_separator = 0;
+static int _candidate_left = -1;
+static int _candidate_top = -1;
+static bool _show_scroll = false;
+static int _candidate_motion = 0;
+static gdouble _scroll_start = -10000;
+static String _split_string1 = String ("");
+static String _split_string2 = String ("");
+static String _space_string = String ("");
+
+static guint _candidate_timer = 0;
+
+#if HAVE_GCONF
+static const gchar *_ime_setting_ed_id[] = { "PhoneStatus.Application.Ise.NWordCompPoint",
+ "PhoneStatus.Application.Ise.QWordCompPoint",
+ "PhoneStatus.Application.Ise.KeyboardEngineOption" };
+static const gint _ime_setting_ed_number = sizeof (_ime_setting_ed_id) / sizeof (gchar*);
+static unsigned int _ed_subscription_id[_ime_setting_ed_number] = {0};
+#endif
+
+static GdkBitmap *_panel_window_mask = 0;
+static GdkPixbuf *_panel_bg_pixbuf = 0;
+
+static ISFSetupWin *_isf_setup_win = 0;
+static ISFHelpWin *_isf_help_win = 0;
+static GtkListStore *_active_ise_list_store = 0;
+
+static clock_t _clock_start;
+
+G_LOCK_DEFINE_STATIC (_global_resource_lock);
+G_LOCK_DEFINE_STATIC (_panel_agent_lock);
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Implementation of internal functions.
+/////////////////////////////////////////////////////////////////////////////
+/**
+ * @brief Print system time point for panel performance.
+ *
+ * @param str_info The output information.
+ */
+static void check_time (const char *str_info)
+{
+ gettime (_clock_start, str_info);
+}
+
+#if HAVE_GCONF
+/**
+ * @brief Set default language by given language ID.
+ *
+ * @param id The given language ID.
+ */
+static void set_default_language_by_id (int id)
+{
+ String sys_input_language = String (SCIM_CONFIG_SYSTEM_INPUT_LANGUAGE);
+#if HAVE_GCONF
+ switch (id) {
+ case SETTINGS_LANGUAGE_ENGLISH:
+ _config->write (sys_input_language, String ("English"));
+ break;
+ case SETTINGS_LANGUAGE_GERMAN:
+ _config->write (sys_input_language, String ("German"));
+ break;
+ case SETTINGS_LANGUAGE_FRENCH:
+ _config->write (sys_input_language, String ("French"));
+ break;
+ case SETTINGS_LANGUAGE_ITALIAN:
+ _config->write (sys_input_language, String ("Italian"));
+ break;
+ case SETTINGS_LANGUAGE_DUTCH:
+ _config->write (sys_input_language, String ("Dutch"));
+ break;
+ case SETTINGS_LANGUAGE_SPANISH:
+ _config->write (sys_input_language, String ("Spanish"));
+ break;
+ case SETTINGS_LANGUAGE_GREEK:
+ _config->write (sys_input_language, String ("Greek"));
+ break;
+ case SETTINGS_LANGUAGE_PORTUGUESE:
+ _config->write (sys_input_language, String ("Portuguese"));
+ break;
+ case SETTINGS_LANGUAGE_TURKISH:
+ _config->write (sys_input_language, String ("Turkish"));
+ break;
+ default:
+ _config->write (sys_input_language, String ("English"));
+ break;
+ }
+#endif
+
+ _config->flush ();
+ _config->reload ();
+ //_panel_agent->reload_config ();
+}
+
+/**
+ * @brief Callback function for input language change.
+ *
+ * @param client The GConf client handler.
+ * @param cnxn_id An ID.
+ * @param entry The handler of GConf entry.
+ * @param user_data The data to pass to this callback.
+ */
+static void input_lang_key_changed_callback (GConfClient *client,
+ guint cnxn_id,
+ GConfEntry *entry,
+ gpointer user_data)
+{
+ GConfValue *value = gconf_entry_get_value (entry);
+ if (value->type == GCONF_VALUE_INT) {
+ int id = gconf_value_get_int (value);
+ set_default_language_by_id (id);
+
+ String sys_input_lang;
+ sys_input_lang = _config->read (String (SCIM_CONFIG_SYSTEM_INPUT_LANGUAGE), sys_input_lang);
+
+ String lang_info ("English");
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ String lang_name;
+ lang_name = scim_get_language_name (it->first);
+ if (!strcmp (sys_input_lang.c_str (), lang_name.c_str ()))
+ lang_info = sys_input_lang;
+ }
+
+ _disabled_langs.clear ();
+ _disabled_langs_bak.clear ();
+
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ String lang_name;
+ lang_name = scim_get_language_name (it->first);
+ if (strcmp (lang_info.c_str (), lang_name.c_str ())) {
+ _disabled_langs.push_back (lang_name);
+ _disabled_langs_bak.push_back (lang_name);
+ }
+ }
+
+ scim_global_config_write (String (SCIM_GLOBAL_CONFIG_ISF_DEFAULT_LANGUAGES), lang_info);
+ scim_global_config_write (String (SCIM_GLOBAL_CONFIG_DISABLED_LANGS), _disabled_langs);
+
+ for (size_t i = 0; i < _isf_app_list.size (); i++) {
+ String active_app = _isf_app_list[i];
+
+ _disabled_ise_map[active_app].clear ();
+ _disabled_ise_map_bak[active_app].clear ();
+ }
+
+ for (size_t i = 0; i < _isf_app_list.size (); i++) {
+ String app = _isf_app_list[i];
+ scim_global_config_write (String (SCIM_GLOBAL_CONFIG_DISABLED_IMENGINE_FACTORIES
+ "/") + _isf_app_list[i], _disabled_ise_map[app]);
+ }
+
+ scim_global_config_flush ();
+
+ update_active_ise_list_store (true);
+ }
+}
+#endif
+
+/**
+ * @brief This function is used to judge whether ISE should be hidden in control panel.
+ *
+ * @param uuid The ISE uuid.
+ *
+ * @return true if ISE should be hidden, otherwise return false.
+ */
+static bool hide_ise_in_control_panel (String uuid)
+{
+ if (uuid.length () <= 0)
+ return true;
+
+ for (unsigned int i = 0; i < _helper_list.size (); i++) {
+ if (uuid == _helper_list[i].uuid) {
+ if (_helper_list[i].option & ISM_ISE_HIDE_IN_CONTROL_PANEL)
+ return true;
+ else
+ return false;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * @brief Update active ISE list in control panel.
+ *
+ * @param set_default_ise The variable decides whether default ISE is set when update.
+ */
+static void update_active_ise_list_store (bool set_default_ise)
+{
+ String ise_name = _panel_agent->get_current_ise_name ();
+
+ bool find_current_ise = false;
+
+ gtk_list_store_clear (_active_ise_list_store);
+ GtkTreeIter iter;
+ std::vector<String> f_show;
+ String active_app = _isf_app_list [0];
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ String lang_name = scim_get_language_name (it->first);
+ if (std::find (_disabled_langs.begin (), _disabled_langs.end (), lang_name) == _disabled_langs.end ()) {
+ for (size_t i = 0; i < it->second.size (); i++) {
+ if (std::find (_disabled_ise_map[active_app].begin (), _disabled_ise_map[active_app].end (), _uuids[it->second[i]])
+ ==_disabled_ise_map[active_app].end ()) {
+ if (hide_ise_in_control_panel (_uuids[it->second[i]]))
+ continue;
+
+ // Protect from add the same ISE more than once in case of multiple langs
+ if (std::find (f_show.begin (), f_show.end (), _uuids[it->second[i]]) == f_show.end ()) {
+ gtk_list_store_append (_active_ise_list_store, &iter);
+ gtk_list_store_set (_active_ise_list_store, &iter,
+ ACTIVE_ISE_NAME, _names[it->second[i]].c_str (),
+ ACTIVE_ISE_UUID, _uuids[it->second[i]].c_str (),
+ ACTIVE_ISE_TYPE, (gint)_modes[it->second[i]],
+ ACTIVE_ISE_ICON, _icons[it->second[i]].c_str (),
+ ACTIVE_ISE_OPTION, (gint)_options[it->second[i]], -1);
+ f_show.push_back (_uuids[it->second[i]]);
+
+ if (!strcmp (_names[it->second[i]].c_str (), ise_name.c_str ())) {
+ gtk_list_store_set (GTK_LIST_STORE (_active_ise_list_store), &iter,
+ ACTIVE_ISE_LIST_ENABLE, TRUE, -1);
+ find_current_ise = true;
+ } else {
+ gtk_list_store_set (GTK_LIST_STORE (_active_ise_list_store), &iter,
+ ACTIVE_ISE_LIST_ENABLE, FALSE, -1);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (!find_current_ise && set_default_ise) {
+ std::cerr << " not find current ISE : " << ise_name << "\n";
+ _panel_agent->set_default_ise (_initial_ise);
+ }
+}
+
+/**
+ * @brief Callback function for setup button of control panel.
+ *
+ * @param button The GtkButton handler.
+ * @param user_data Data to pass when it is called.
+ */
+static void on_isf_setup_button_clicked (GtkButton * button,
+ gpointer user_data)
+{
+ gboolean has_lookup_popwin = false;
+ gboolean has_input_popwin = false;
+
+ slot_hide_panel ();
+ // Check whether candidate window is showed
+ if (_lookup_table_window && GTK_WIDGET_VISIBLE (_lookup_table_window)) {
+ has_lookup_popwin = true;
+ gtk_widget_hide (_lookup_table_window);
+ }
+ if (_input_window && GTK_WIDGET_VISIBLE (_input_window)) {
+ has_input_popwin = true;
+ gtk_widget_hide (_input_window);
+ }
+
+ if (!_isf_setup_win)
+ _isf_setup_win = new ISFSetupWin (_config);
+ if (_isf_setup_win)
+ _isf_setup_win->show_window ();
+
+ if (_ise_list_changed ||_setup_enable_changed) {
+ update_active_ise_list_store (true);
+ _ise_list_changed = false;
+ _setup_enable_changed = false;
+ }
+
+ if (has_input_popwin) {
+ gtk_widget_show (_input_window);
+ gdk_window_raise (_input_window->window);
+ ui_settle_input_window (false, true);
+ }
+ if (has_lookup_popwin)
+ gtk_widget_show (_lookup_table_window);
+ slot_show_panel ();
+}
+
+/**
+ * @brief Callback function for help button of control panel.
+ *
+ * @param button The GtkButton handler.
+ * @param user_data Data to pass when it is called.
+ */
+static void on_isf_help_button_clicked (GtkButton * button,
+ gpointer user_data)
+{
+ gboolean has_lookup_popwin = false;
+ gboolean has_input_popwin = false;
+
+ slot_hide_panel ();
+ // Check whether candidate window is showed
+ if (_lookup_table_window && GTK_WIDGET_VISIBLE (_lookup_table_window)) {
+ has_lookup_popwin = true;
+ gtk_widget_hide (_lookup_table_window);
+ }
+ if (_input_window && GTK_WIDGET_VISIBLE (_input_window)) {
+ has_input_popwin = true;
+ gtk_widget_hide (_input_window);
+ }
+
+ if (!_isf_help_win)
+ _isf_help_win = new ISFHelpWin ();
+ if (_isf_help_win)
+ _isf_help_win->show_help ("ISF Help", "ISF (Input Service Framework)\n © 2008 SAMSUNG");
+
+ if (has_input_popwin) {
+ gtk_widget_show (_input_window);
+ gdk_window_raise (_input_window->window);
+ ui_settle_input_window (false, true);
+ }
+ if (has_lookup_popwin)
+ gtk_widget_show (_lookup_table_window);
+ slot_show_panel ();
+}
+
+/**
+ * @brief Callback function for press event of ISE help button.
+ *
+ * @param button The GtkButton handler.
+ * @param user_data Data to pass when it is called.
+ */
+static void on_isf_help_button_pressed (GtkButton * button,
+ gpointer user_data)
+{
+ GtkWidget *isf_help_bt_img = ui_create_icon (ISF_ICON_HELP_T_FILE, NULL, _help_icon_width, _help_icon_height, TRUE);
+ gtk_button_set_image (GTK_BUTTON (button), isf_help_bt_img);
+}
+
+/**
+ * @brief Callback function for release event of ISE help button.
+ *
+ * @param button The GtkButton handler.
+ * @param user_data Data to pass when it is called.
+ */
+static void on_isf_help_button_released (GtkButton * button,
+ gpointer user_data)
+{
+ GtkWidget *isf_help_bt_img = ui_create_icon (ISF_ICON_HELP_FILE, NULL, _help_icon_width, _help_icon_height, TRUE);
+ gtk_button_set_image (GTK_BUTTON (button), isf_help_bt_img);
+}
+
+/**
+ * @brief Change keyboard ISE.
+ *
+ * @param uuid The keyboard ISE's uuid.
+ * @param uuid The keyboard ISE's name.
+ * @param uuid The keyboard ISE's icon.
+ * @param uuid The keyboard ISE's option.
+ *
+ * @return false if keyboard ISE change is failed, otherwise return true.
+ */
+static bool ui_active_ise_box_keyboardise_activate_cb (String &uuid, String &name, String &icon, uint32 &option)
+{
+ SCIM_DEBUG_MAIN (1) << "ui_active_ise_box_keyboardise_activate_cb\n";
+
+ TOOLBAR_MODE_T mode = _panel_agent->get_current_toolbar_mode ();
+
+ if (TOOLBAR_HELPER_MODE == mode) {
+ String pre_uuid = _panel_agent->get_current_helper_uuid ();
+ _panel_agent->stop_helper (pre_uuid);
+ } else if (TOOLBAR_KEYBOARD_MODE == mode) {
+ String pre_name = _panel_agent->get_current_ise_name ();
+ if (!pre_name.compare (name))
+ return false;
+ }
+
+ mode = TOOLBAR_KEYBOARD_MODE;
+ _panel_agent->set_current_toolbar_mode (mode);
+ _panel_agent->set_current_ise_name (name);
+
+ uint32 style = (option & ISM_ISE_FULL_STYLE) != 0;
+ _panel_agent->set_current_ise_style (style);
+
+ String language = String ("~other");//scim_get_locale_language (scim_get_current_locale ());
+ _config->write (String (SCIM_CONFIG_DEFAULT_IMENGINE_FACTORY) + String ("/") + language, uuid);
+ _config->flush ();
+
+ _panel_agent->change_factory (uuid);
+
+ return true;
+}
+
+/**
+ * @brief Change helper ISE.
+ *
+ * @param uuid The helper ISE's uuid.
+ * @param uuid The helper ISE's name.
+ * @param uuid The helper ISE's icon.
+ * @param uuid The helper ISE's option.
+ *
+ * @return false if helper ISE change is failed, otherwise return true.
+ */
+static bool ui_active_ise_box_helper_activate_cb (String &uuid, String &name, String &icon, uint32 &option)
+{
+ SCIM_DEBUG_MAIN (1) << "ui_active_ise_box_helper_activate_cb\n";
+
+ TOOLBAR_MODE_T mode = _panel_agent->get_current_toolbar_mode ();
+
+ if (TOOLBAR_HELPER_MODE == mode) {
+ String pre_uuid = _panel_agent->get_current_helper_uuid ();
+ if (!pre_uuid.compare (uuid))
+ return false;
+ _panel_agent->stop_helper (pre_uuid);
+ } else if (TOOLBAR_KEYBOARD_MODE == mode) {
+ //_panel_agent->change_factory ("");
+ }
+
+ _panel_agent->set_current_toolbar_mode (TOOLBAR_HELPER_MODE);
+ _panel_agent->set_current_ise_name (name);
+ _panel_agent->set_current_factory_icon (icon);
+
+ uint32 style = (option & ISM_ISE_FULL_STYLE) != 0;
+ _panel_agent->set_current_ise_style (style);
+
+ _panel_agent->start_helper (uuid);
+ PanelFactoryInfo not_an_factoryinfo (uuid, name, "", icon);
+ slot_update_factory_info (not_an_factoryinfo);
+
+ return true;
+}
+
+/**
+ * @brief Callback function for click event of ISE enable button.
+ *
+ * @param cell The GtkCellRendererToggle handler.
+ * @param arg1 The string for GtkTreePath.
+ * @param data Data pointer to pass when it is called.
+ */
+static void on_active_ise_enable_box_clicked (GtkCellRendererToggle * cell,
+ gchar * arg1, gpointer data)
+{
+ bool ise_changed = false;
+ GtkTreePath *path = 0;
+ GtkTreePath *path_valid = 0;
+ GtkTreeIter iter, iter_valid;
+
+ std::vector < String >::iterator it;
+
+ path_valid = gtk_tree_path_new_from_string (arg1);
+ if (gtk_tree_model_get_iter (GTK_TREE_MODEL (_active_ise_list_store), &iter_valid, path_valid)) {
+ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (_active_ise_list_store), &iter)) {
+ do {
+ path = gtk_tree_model_get_path (GTK_TREE_MODEL (_active_ise_list_store), &iter);
+ if (gtk_tree_path_compare (path, path_valid) == 0) {
+ gtk_list_store_set (GTK_LIST_STORE (_active_ise_list_store), &iter,
+ ACTIVE_ISE_LIST_ENABLE, TRUE, -1);
+ } else {
+ gtk_list_store_set (GTK_LIST_STORE (_active_ise_list_store), &iter,
+ ACTIVE_ISE_LIST_ENABLE, FALSE, -1);
+ }
+ if (path) {
+ gtk_tree_path_free (path);
+ path = 0;
+ }
+ } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (_active_ise_list_store), &iter));
+ }
+
+ gchar *g_name = 0;
+ gchar *g_uuid = 0;
+ gchar *g_icon = 0;
+ gint g_mode;
+ gint g_option;
+
+ gtk_tree_model_get (GTK_TREE_MODEL (_active_ise_list_store),
+ &iter_valid,
+ ACTIVE_ISE_NAME,&g_name,
+ ACTIVE_ISE_UUID,&g_uuid,
+ ACTIVE_ISE_ICON,&g_icon,
+ ACTIVE_ISE_TYPE,&g_mode,
+ ACTIVE_ISE_OPTION,&g_option,
+ -1);
+
+ TOOLBAR_MODE_T mode = (TOOLBAR_MODE_T) g_mode;
+ String name (g_name);
+ String uuid (g_uuid);
+ String icon (g_icon);
+ uint32 option = (uint32) g_option;
+
+ if (g_name) {
+ g_free (g_name);
+ g_name = 0;
+ }
+ if (g_uuid) {
+ g_free (g_uuid);
+ g_uuid = 0;
+ }
+ if (g_icon) {
+ g_free (g_icon);
+ g_icon = 0;
+ }
+
+ if (TOOLBAR_KEYBOARD_MODE == mode)
+ ise_changed = ui_active_ise_box_keyboardise_activate_cb (uuid, name, icon, option);
+ else if (TOOLBAR_HELPER_MODE == mode)
+ ise_changed = ui_active_ise_box_helper_activate_cb (uuid, name, icon, option);
+
+ if (ise_changed) {
+ _panel_agent->update_ise_name (name);
+ uint32 style = (option & ISM_ISE_FULL_STYLE) != 0;
+ _panel_agent->update_ise_style (style);
+
+ DEFAULT_ISE_T default_ise;
+ default_ise.type = mode;
+ default_ise.uuid = uuid;
+ default_ise.name = name;
+ _panel_agent->set_default_ise (default_ise);
+ //slot_hide_panel ();
+ }
+ }
+
+ if (path_valid) {
+ gtk_tree_path_free (path_valid);
+ path_valid = 0;
+ }
+}
+
+/**
+ * @brief Create active ISE list view.
+ *
+ * @return The GtkWidget handler of active ise list view.
+ */
+static GtkWidget *create_active_ise_list_view (void)
+{
+ GtkWidget *view = NULL;
+
+ GtkCellRenderer *renderer = NULL;
+ GtkTreeViewColumn *column = NULL;
+
+ view = gtk_tree_view_new ();
+ g_object_set (view, "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_NONE, NULL);
+ gtk_widget_show (view);
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (view), false);
+ gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view), false);
+
+ // Invoke ISE in mutually-exclusive
+ gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (view)),
+ GTK_SELECTION_SINGLE);
+
+ // Enable column
+ column = gtk_tree_view_column_new ();
+ gtk_tree_view_column_set_title (column, _("Enable"));
+
+ renderer = gtk_cell_renderer_toggle_new ();
+ g_object_set (renderer, "indicator-size", (gint)(26*(_width_rate < _height_rate ? _width_rate : _height_rate)), NULL);
+ g_object_set (renderer, "xpad", 0, NULL);
+ gtk_cell_renderer_toggle_set_radio (GTK_CELL_RENDERER_TOGGLE (renderer), true);
+ gtk_tree_view_column_pack_start (column, renderer, FALSE);
+ gtk_cell_renderer_set_fixed_size (renderer, -1, (gint)(31*_height_rate));
+ gtk_tree_view_column_set_attributes (column, renderer, "active", ACTIVE_ISE_LIST_ENABLE, NULL);
+
+ g_signal_connect (G_OBJECT (renderer), "toggled",
+ G_CALLBACK (on_active_ise_enable_box_clicked),
+ (gpointer) view);
+
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);
+
+ // Name column
+ column = gtk_tree_view_column_new ();
+ //gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+ //gtk_tree_view_column_set_fixed_width (column, 232);
+
+ gtk_tree_view_column_set_title (column, _("Name"));
+
+ renderer = gtk_cell_renderer_text_new ();
+ g_object_set (renderer, "foreground", "black", NULL);
+ gtk_tree_view_column_pack_start (column, renderer, TRUE);
+ gtk_tree_view_column_set_attributes (column, renderer, "text", ACTIVE_ISE_NAME, NULL);
+ gtk_cell_renderer_set_fixed_size (renderer, -1, (gint)(31*_height_rate));
+ g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+ g_object_set (renderer, "xpad", (gint)(4*_width_rate), NULL);
+ //gtk_cell_renderer_set_cell_font_size (renderer, GTK_CELL_RENDERER_NORMAL, 18);
+
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);
+
+ return view;
+}
+
+/**
+ * @brief Create and fill active ISE list store.
+ */
+static void create_and_fill_active_ise_list_store (void)
+{
+ // Create model.
+ _active_ise_list_store = gtk_list_store_new (ACTIVE_ISE_NUM_COLUMS, G_TYPE_BOOLEAN,
+ G_TYPE_STRING, G_TYPE_STRING,
+ G_TYPE_INT, G_TYPE_STRING, G_TYPE_INT);
+
+ update_active_ise_list_store (false);
+}
+
+/**
+ * @brief Normalize language string.
+ *
+ * @param src_str The source string for language.
+ *
+ * @return The normalized language string.
+ */
+static String get_langs (String src_str)
+{
+ std::vector<String> str_list, dst_list;
+ scim_split_string_list (str_list, src_str);
+
+ for (size_t i = 0; i < str_list.size (); i++)
+ dst_list.push_back (scim_get_normalized_language (str_list[i]));
+
+ String dst_str = scim_combine_string_list (dst_list);
+
+ return dst_str;
+}
+
+/**
+ * @brief Load all ISEs to initialize.
+ *
+ * @param config The config pointer for loading keyboard ISE.
+ * @param uuids The ISE uuid list.
+ * @param names The ISE name list.
+ * @param module_names The ISE module name list.
+ * @param langs The ISE language list.
+ * @param icons The ISE icon list.
+ * @param modes The ISE type list.
+ * @param options The ISE option list.
+ */
+static void get_factory_list (const ConfigPointer & config,
+ std::vector < String > &uuids,
+ std::vector < String > &names,
+ std::vector < String > &module_names,
+ std::vector < String > &langs,
+ std::vector < String > &icons,
+ std::vector <TOOLBAR_MODE_T> &modes,
+ std::vector <uint32> &options)
+{
+ std::vector < String > imengine_list;
+ std::vector < String > helper_list;
+ std::vector<String>::iterator it;
+
+ IMEngineFactoryPointer factory;
+ IMEngineModule ime_module;
+
+ HelperModule helper_module;
+ HelperInfo helper_info;
+
+ scim_get_imengine_module_list (imengine_list);
+ scim_get_helper_module_list (helper_list);
+
+ uuids.clear ();
+ names.clear ();
+ module_names.clear ();
+ langs.clear ();
+ icons.clear ();
+ modes.clear ();
+
+ // Add "English/Keyboard" factory first.
+ factory = new ComposeKeyFactory ();
+ uuids.push_back (factory->get_uuid ());
+ names.push_back (utf8_wcstombs (factory->get_name ()));
+ String module_name = String ("English/Keyboard");
+ module_names.push_back (module_name);
+ langs.push_back (get_langs (factory->get_language ()));
+ _keyboard_ise_help_map[utf8_wcstombs (factory->get_name ())] = utf8_wcstombs (factory->get_help ());
+ icons.push_back (factory->get_icon_file ());
+ modes.push_back (TOOLBAR_KEYBOARD_MODE);
+ options.push_back (0);
+
+ for (size_t i = 0; i < imengine_list.size (); ++i) {
+ if (_load_ise_list.size () > 0) {
+ if (std::find (_load_ise_list.begin (), _load_ise_list.end (), imengine_list [i]) == _load_ise_list.end ())
+ continue;
+ }
+
+ if (imengine_list[i] != "socket") {
+ ime_module.load (imengine_list[i], config);
+
+ if (ime_module.valid ()) {
+ for (size_t j = 0; j < ime_module.number_of_factories (); ++j) {
+ try {
+ factory = ime_module.create_factory (j);
+ } catch (...) {
+ factory.reset ();
+ }
+
+ if (!factory.null ()) {
+ if (std::find (uuids.begin (), uuids.end (), factory->get_uuid ()) == uuids.end ()) {
+ uuids.push_back (factory->get_uuid ());
+ names.push_back (utf8_wcstombs (factory->get_name ()));
+ module_name = imengine_list[i];
+ module_names.push_back (module_name);
+ _keyboard_ise_help_map[module_name] = utf8_wcstombs (factory->get_help ());
+ langs.push_back (get_langs (factory->get_language ()));
+ icons.push_back (factory->get_icon_file ());
+ modes.push_back (TOOLBAR_KEYBOARD_MODE);
+ options.push_back (0);
+ }
+ factory.reset ();
+ }
+ }
+ ime_module.unload ();
+ }
+ }
+ }
+
+ for (size_t i = 0; i < helper_list.size (); ++i) {
+ if (_load_ise_list.size () > 0) {
+ if (std::find (_load_ise_list.begin (), _load_ise_list.end (), helper_list [i]) == _load_ise_list.end ())
+ continue;
+ }
+
+ helper_module.load (helper_list[i]);
+ if (helper_module.valid ()) {
+ for (size_t j = 0; j < helper_module.number_of_helpers (); ++j) {
+ helper_module.get_helper_info (j, helper_info);
+ uuids.push_back (helper_info.uuid);
+ names.push_back (helper_info.name);
+ langs.push_back (get_langs (helper_module.get_helper_lang (j)));
+ module_names.push_back (helper_list[i]);
+ icons.push_back (helper_info.icon);
+ modes.push_back (TOOLBAR_HELPER_MODE);
+ options.push_back (helper_info.option);
+ }
+ helper_module.unload ();
+ }
+ }
+}
+
+/**
+ * @brief Load all disabled languages.
+ *
+ * @param disabled This variable is used to store disabled language.
+ */
+static void load_disabled_lang_list (std::vector<String> &disabled)
+{
+ disabled = scim_global_config_read (String (SCIM_GLOBAL_CONFIG_DISABLED_LANGS), disabled);
+}
+
+/**
+ * @brief Load ISF configuration and ISEs information.
+ */
+static void isf_load_config (void)
+{
+ // Load app list
+ _isf_app_list.push_back ("Default");
+
+ // Load ISE engine info
+ get_factory_list (_config, _uuids, _names, _module_names, _langs, _icons, _modes, _options);
+
+ std::vector<String> ise_langs;
+
+ for (size_t i = 0; i < _uuids.size (); ++i) {
+ scim_split_string_list (ise_langs, _langs[i]);
+ for (size_t j = 0; j < ise_langs.size (); j++) {
+ if (std::find (_groups[ise_langs[j]].begin (), _groups[ise_langs[j]].end (), i) == _groups[ise_langs[j]].end ())
+ _groups[ise_langs[j]].push_back (i);
+ }
+ ise_langs.clear ();
+ }
+
+ std::vector<String> isf_default_langs;
+ isf_default_langs = scim_global_config_read (String (SCIM_GLOBAL_CONFIG_ISF_DEFAULT_LANGUAGES), isf_default_langs);
+
+ // No default ISF lang
+ if (isf_default_langs.size () == 0) {
+ String sys_input_lang, lang_info ("English");
+ sys_input_lang = _config->read (String (SCIM_CONFIG_SYSTEM_INPUT_LANGUAGE), sys_input_lang);
+ MapStringVectorSizeT::iterator g = _groups.find (sys_input_lang);
+ if (g != _groups.end ())
+ lang_info = sys_input_lang;
+ else
+ std::cerr << "System input language is not included in the ISF languages.\n";
+
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ String lang_name = scim_get_language_name (it->first);
+ if (strcmp (lang_info.c_str (), lang_name.c_str ())) {
+ _disabled_langs.push_back (lang_name);
+ _disabled_langs_bak.push_back (lang_name);
+ }
+ }
+ } else {
+ std::vector<String> disabled;
+
+ load_disabled_lang_list (disabled);
+ for (size_t i = 0; i < disabled.size (); i++) {
+ _disabled_langs.push_back (disabled[i]);
+ _disabled_langs_bak.push_back (disabled[i]);
+ }
+ }
+}
+
+/**
+ * @brief Create control panel window.
+ */
+static void create_panel_window (void)
+{
+ check_time ("\nEnter create_panel_window");
+
+ GtkWidget *isf_setup_bt = NULL;
+ GtkWidget *isf_help_bt = NULL;
+ GtkWidget *scroll = NULL;
+ GtkWidget *view = NULL;
+
+ gint softkeybar_height = _softkeybar_height;
+
+ if (_toolbar_window) {
+ gtk_widget_destroy (_toolbar_window);
+ _toolbar_window = 0;
+ }
+
+ _toolbar_window = gtk_window_new (GTK_WINDOW_POPUP);
+
+#ifdef USING_ISF_SWITCH_BUTTON
+ GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (_toolbar_window));
+ g_object_get (settings, "gtk-softkeybar-height", &softkeybar_height, NULL);
+#endif
+
+ gint panel_x = (_screen_width - _panel_width) / 2;
+ gint panel_y = _screen_height - softkeybar_height - _panel_height;
+ gtk_window_move (GTK_WINDOW (_toolbar_window), panel_x, panel_y);
+ gtk_widget_set_size_request (GTK_WIDGET (_toolbar_window), _panel_width, _panel_height);
+ gtk_window_set_policy (GTK_WINDOW (_toolbar_window), TRUE, TRUE, FALSE);
+ //gtk_window_set_accept_focus (GTK_WINDOW (_toolbar_window), FALSE);
+ gtk_window_set_resizable (GTK_WINDOW (_toolbar_window), FALSE);
+
+ GtkWidget *fixed = gtk_fixed_new ();
+ gtk_container_add (GTK_CONTAINER (_toolbar_window), fixed);
+ gtk_widget_show (fixed);
+
+ GtkWidget *panel_bg = ui_create_icon (ISF_PANEL_BG_FILE, NULL, _panel_width, _panel_height, TRUE);
+ _panel_bg_pixbuf = gtk_image_get_pixbuf (GTK_IMAGE (panel_bg));
+ gtk_fixed_put (GTK_FIXED (fixed), panel_bg, 0, 0);
+ gtk_widget_show (panel_bg);
+
+ isf_setup_bt = gtk_button_new_with_label ("Setup");
+
+ GtkWidget *newlabel = gtk_label_new ("Setup");
+ gtk_label_set_markup (GTK_LABEL (newlabel), "<span foreground='black'>Setup</span>");
+
+ if (newlabel) {
+ GtkWidget *old = gtk_bin_get_child (GTK_BIN (isf_setup_bt));
+ if (old)
+ gtk_container_remove (GTK_CONTAINER (isf_setup_bt), old);
+ gtk_container_add (GTK_CONTAINER (isf_setup_bt), newlabel);
+ gtk_widget_show (newlabel);
+ }
+ gtk_widget_set_size_request (isf_setup_bt, _setup_button_width, _setup_button_height);
+
+ gint setup_button_x = (int)(_panel_width - (75+3+31+11)*_width_rate);
+ gint setup_button_y = (int)(9 * _height_rate);
+
+ gtk_fixed_put (GTK_FIXED (fixed), isf_setup_bt, setup_button_x, setup_button_y);
+ gtk_widget_show (isf_setup_bt);
+
+ g_signal_connect ((gpointer) isf_setup_bt, "clicked",
+ G_CALLBACK (on_isf_setup_button_clicked), NULL);
+
+ GtkWidget *isf_help_bt_img = ui_create_icon (ISF_ICON_HELP_FILE, NULL, _help_icon_width, _help_icon_height, TRUE);
+ isf_help_bt = gtk_button_new ();
+ gtk_widget_set_size_request (isf_help_bt, _help_icon_width, _help_icon_height);
+ gtk_button_set_image (GTK_BUTTON (isf_help_bt), isf_help_bt_img);
+ gtk_widget_show (isf_help_bt_img);
+
+ gint help_icon_x = setup_button_x + _setup_button_width + 3*_width_rate;
+ gint help_icon_y = setup_button_y;
+ gtk_fixed_put (GTK_FIXED (fixed), isf_help_bt, help_icon_x, help_icon_y);
+ gtk_widget_show (isf_help_bt);
+ g_signal_connect ((gpointer) isf_help_bt, "clicked",
+ G_CALLBACK (on_isf_help_button_clicked), NULL);
+ g_signal_connect ((gpointer) isf_help_bt, "pressed",
+ G_CALLBACK (on_isf_help_button_pressed), NULL);
+ g_signal_connect ((gpointer) isf_help_bt, "released",
+ G_CALLBACK (on_isf_help_button_released), NULL);
+
+ scroll = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gint scroll_width = (gint)(_panel_width - 16*_width_rate - 16*_width_rate);
+ gint scroll_height = (gint)(_panel_height - 43*_height_rate);
+ gtk_widget_set_size_request (scroll, scroll_width, scroll_height);
+
+ gint scroll_x = (gint)(16 * _width_rate);
+ gint scroll_y = (gint)(43 * _height_rate);
+ gtk_fixed_put (GTK_FIXED (fixed), scroll, scroll_x, scroll_y);
+ gtk_widget_show (scroll);
+
+ view = create_active_ise_list_view ();
+ if (view && view->style) {
+ gtk_widget_modify_bg (view, GTK_STATE_NORMAL, &(view->style->white));
+
+ gtk_tree_view_set_model (GTK_TREE_VIEW (view),
+ GTK_TREE_MODEL (_active_ise_list_store));
+
+ gtk_container_add (GTK_CONTAINER (scroll), view);
+ gtk_widget_show (view);
+ }
+ check_time ("Exit create_panel_window");
+}
+
+/**
+ * @brief Create SCIM style candidate window.
+ *
+ * @param vertical An indicator for vertical window or horizontal window.
+ */
+static void create_scim_candidate_window (bool vertical)
+{
+ GtkWidget *input_window_vbox = NULL;
+ GtkWidget *input_window_hbox = NULL;
+ gint input_window_width;
+ gint thickness = 1;
+
+ input_window_width = gdk_screen_width ();
+
+ _lookup_icon_size = input_window_width / 24;
+ if (_lookup_icon_size < LOOKUP_ICON_SIZE)
+ _lookup_icon_size = LOOKUP_ICON_SIZE;
+
+ // Create input window
+ {
+ GtkWidget *vbox = NULL;
+ GtkWidget *hbox = NULL;
+ GtkWidget *frame = NULL;
+
+ _input_window = gtk_window_new (GTK_WINDOW_POPUP);
+
+ if (_candidate_mode == LANDSCAPE_HORIZONTAL_CANDIDATE_MODE) {
+#if HAVE_GCONF
+ gtk_window_set_rotate (GTK_WINDOW (_input_window), LANDSCAPE_DEGREE);
+#endif
+ gtk_widget_set_size_request (GTK_WIDGET (_input_window), gdk_screen_height (), -1);
+ } else if (_candidate_mode == LANDSCAPE_VERTICAL_CANDIDATE_MODE) {
+#if HAVE_GCONF
+ gtk_window_set_rotate (GTK_WINDOW (_input_window), LANDSCAPE_DEGREE);
+#endif
+ }
+
+ //gtk_window_set_keep_above (GTK_WINDOW (_input_window), TRUE);
+ gtk_container_set_border_width (GTK_CONTAINER (_input_window), 5);
+ //gtk_widget_modify_bg (_input_window, GTK_STATE_NORMAL, &(_active_bg));
+ gtk_widget_modify_bg (_input_window, GTK_STATE_NORMAL, &_normal_bg);
+ gtk_window_set_policy (GTK_WINDOW (_input_window), TRUE, TRUE, FALSE);
+ gtk_window_set_accept_focus (GTK_WINDOW (_input_window), FALSE);
+ gtk_window_set_resizable (GTK_WINDOW (_input_window), FALSE);
+ gtk_widget_add_events (_input_window, GDK_BUTTON_PRESS_MASK);
+ gtk_widget_add_events (_input_window, GDK_BUTTON_RELEASE_MASK);
+ gtk_widget_add_events (_input_window, GDK_POINTER_MOTION_MASK);
+ g_signal_connect (G_OBJECT (_input_window), "button-press-event",
+ G_CALLBACK (ui_input_window_click_cb),
+ GINT_TO_POINTER (0));
+ g_signal_connect (G_OBJECT (_input_window), "button-release-event",
+ G_CALLBACK (ui_input_window_click_cb),
+ GINT_TO_POINTER (1));
+
+ frame = gtk_frame_new (0);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT);
+ gtk_container_add (GTK_CONTAINER (_input_window), frame);
+ gtk_widget_show (frame);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (frame), hbox);
+ gtk_widget_show (hbox);
+
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+ gtk_widget_show (vbox);
+ input_window_vbox = vbox;
+
+ // Create preedit area
+ _preedit_area = scim_string_view_new ();
+ //if (_default_font_desc)
+ // gtk_widget_modify_font (_preedit_area, _default_font_desc);
+ gtk_widget_modify_base (_preedit_area, GTK_STATE_NORMAL, &_normal_bg);
+ gtk_widget_modify_base (_preedit_area, GTK_STATE_ACTIVE, &_active_bg);
+ gtk_widget_modify_text (_preedit_area, GTK_STATE_NORMAL, &_normal_text);
+ gtk_widget_modify_text (_preedit_area, GTK_STATE_ACTIVE, &_active_text);
+ scim_string_view_set_width_chars (SCIM_STRING_VIEW (_preedit_area), 24);
+ scim_string_view_set_forward_event (SCIM_STRING_VIEW (_preedit_area), TRUE);
+ scim_string_view_set_auto_resize (SCIM_STRING_VIEW (_preedit_area), TRUE);
+ scim_string_view_set_has_frame (SCIM_STRING_VIEW (_preedit_area), FALSE);
+ g_signal_connect (G_OBJECT (_preedit_area), "move_cursor",
+ G_CALLBACK (ui_preedit_area_move_cursor_cb),
+ 0);
+ gtk_box_pack_start (GTK_BOX (vbox), _preedit_area, TRUE, TRUE, 0);
+
+ // Create aux area
+ _aux_area = scim_string_view_new ();
+ //if (_default_font_desc)
+ // gtk_widget_modify_font (_aux_area, _default_font_desc);
+ gtk_widget_modify_base (_aux_area, GTK_STATE_NORMAL, &_normal_bg);
+ gtk_widget_modify_base (_aux_area, GTK_STATE_ACTIVE, &_active_bg);
+ gtk_widget_modify_text (_aux_area, GTK_STATE_NORMAL, &_normal_text);
+ gtk_widget_modify_text (_aux_area, GTK_STATE_ACTIVE, &_active_text);
+ scim_string_view_set_width_chars (SCIM_STRING_VIEW (_aux_area), 24);
+ scim_string_view_set_draw_cursor (SCIM_STRING_VIEW (_aux_area), FALSE);
+ scim_string_view_set_forward_event (SCIM_STRING_VIEW (_aux_area), TRUE);
+ scim_string_view_set_auto_resize (SCIM_STRING_VIEW (_aux_area), TRUE);
+ scim_string_view_set_has_frame (SCIM_STRING_VIEW (_aux_area), FALSE);
+ gtk_box_pack_start (GTK_BOX (vbox), _aux_area, TRUE, TRUE, 0);
+ }
+
+ // Create lookup table window
+ {
+ GtkWidget *vbox = NULL;
+ GtkWidget *hbox = NULL;
+ GtkWidget *lookup_table_parent = NULL;
+ GtkWidget *image = NULL;
+ GtkWidget *separator = NULL;
+
+ _lookup_table_window = gtk_vbox_new (FALSE, 0);
+ if (vertical) {
+ input_window_hbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (input_window_vbox), input_window_hbox, TRUE, TRUE, 0);
+ gtk_widget_show (input_window_hbox);
+ gtk_box_pack_start (GTK_BOX (input_window_hbox), _lookup_table_window, TRUE, TRUE, 0);
+ } else {
+ gtk_box_pack_start (GTK_BOX (input_window_vbox), _lookup_table_window, TRUE, TRUE, 0);
+ }
+ lookup_table_parent = _lookup_table_window;
+ _candidate_separator = gtk_hseparator_new ();
+ GtkStyle *style = gtk_widget_get_style (_candidate_separator);
+ if (style != NULL) {
+ style->xthickness = thickness;
+ style->ythickness = thickness;
+ gtk_widget_set_style (_candidate_separator, style);
+ }
+ gtk_box_pack_start (GTK_BOX (lookup_table_parent), _candidate_separator, FALSE, FALSE, 0);
+ gtk_widget_show (_candidate_separator);
+
+ // Vertical lookup table
+ if (vertical) {
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (lookup_table_parent), vbox);
+ gtk_widget_show (vbox);
+
+ // New table items
+ for (int i=0; i<SCIM_LOOKUP_TABLE_MAX_PAGESIZE; ++i) {
+ _lookup_table_items [i] = scim_string_view_new ();
+ //if (_default_font_desc)
+ // gtk_widget_modify_font (_lookup_table_items [i], _default_font_desc);
+ gtk_widget_modify_base (_lookup_table_items [i], GTK_STATE_NORMAL, &_normal_bg);
+ gtk_widget_modify_base (_lookup_table_items [i], GTK_STATE_ACTIVE, &_active_bg);
+ gtk_widget_modify_text (_lookup_table_items [i], GTK_STATE_NORMAL, &_normal_text);
+ gtk_widget_modify_text (_lookup_table_items [i], GTK_STATE_ACTIVE, &_active_text);
+ scim_string_view_set_width_chars (SCIM_STRING_VIEW (_lookup_table_items [i]), 80);
+ scim_string_view_set_has_frame (SCIM_STRING_VIEW (_lookup_table_items [i]), FALSE);
+ scim_string_view_set_forward_event (SCIM_STRING_VIEW (_lookup_table_items [i]), TRUE);
+ scim_string_view_set_auto_resize (SCIM_STRING_VIEW (_lookup_table_items [i]), TRUE);
+ scim_string_view_set_draw_cursor (SCIM_STRING_VIEW (_lookup_table_items [i]), FALSE);
+ scim_string_view_set_auto_move_cursor (SCIM_STRING_VIEW (_lookup_table_items [i]), FALSE);
+ g_signal_connect (G_OBJECT (_lookup_table_items [i]), "button-press-event",
+ G_CALLBACK (ui_lookup_table_vertical_click_cb),
+ GINT_TO_POINTER (i));
+ gtk_box_pack_start (GTK_BOX (vbox), _lookup_table_items [i], FALSE, FALSE, 0);
+ }
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+ gtk_widget_show (hbox);
+
+ // New down button
+ image = ui_create_down_icon ();
+ _lookup_table_down_button = gtk_button_new ();
+ gtk_container_add (GTK_CONTAINER (_lookup_table_down_button), image);
+ gtk_widget_show (image);
+ gtk_box_pack_end (GTK_BOX (hbox), _lookup_table_down_button, TRUE, TRUE, 0);
+ gtk_widget_show (_lookup_table_down_button);
+ g_signal_connect (G_OBJECT (_lookup_table_down_button), "clicked",
+ G_CALLBACK (ui_lookup_table_down_button_click_cb),
+ image);
+
+ // New up button
+ image = ui_create_up_icon ();
+ _lookup_table_up_button = gtk_button_new ();
+ gtk_container_add (GTK_CONTAINER (_lookup_table_up_button), image);
+ gtk_widget_show (image);
+ gtk_box_pack_end (GTK_BOX (hbox), _lookup_table_up_button, TRUE, TRUE, 0);
+ gtk_widget_show (_lookup_table_up_button);
+ g_signal_connect (G_OBJECT (_lookup_table_up_button), "clicked",
+ G_CALLBACK (ui_lookup_table_up_button_click_cb),
+ image);
+
+ separator = gtk_hseparator_new ();
+ GtkStyle *style = gtk_widget_get_style (separator);
+ if (style != NULL) {
+ style->xthickness = thickness;
+ style->ythickness = thickness;
+ gtk_widget_set_style (separator, style);
+ }
+ //gtk_box_pack_end (GTK_BOX (vbox), separator, FALSE, FALSE, 0);
+ gtk_widget_show (separator);
+ } else {
+ gtk_widget_set_size_request (GTK_WIDGET (_input_window), input_window_width, -1);
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (lookup_table_parent), hbox);
+ gtk_widget_show (hbox);
+
+ _lookup_table_items [0] = scim_string_view_new ();
+ //if (_default_font_desc)
+ // gtk_widget_modify_font (_lookup_table_items [0], _default_font_desc);
+ gtk_widget_modify_base (_lookup_table_items [0], GTK_STATE_NORMAL, &_normal_bg);
+ gtk_widget_modify_base (_lookup_table_items [0], GTK_STATE_ACTIVE, &_active_bg);
+ gtk_widget_modify_text (_lookup_table_items [0], GTK_STATE_NORMAL, &_normal_text);
+ gtk_widget_modify_text (_lookup_table_items [0], GTK_STATE_ACTIVE, &_active_text);
+ scim_string_view_set_forward_event (SCIM_STRING_VIEW (_lookup_table_items [0]), TRUE);
+ scim_string_view_set_auto_resize (SCIM_STRING_VIEW (_lookup_table_items [0]), TRUE);
+ scim_string_view_set_has_frame (SCIM_STRING_VIEW (_lookup_table_items [0]), FALSE);
+ scim_string_view_set_draw_cursor (SCIM_STRING_VIEW (_lookup_table_items [0]), FALSE);
+ scim_string_view_set_auto_move_cursor (SCIM_STRING_VIEW (_lookup_table_items [0]), FALSE);
+ g_signal_connect (G_OBJECT (_lookup_table_items [0]), "move_cursor",
+ G_CALLBACK (ui_lookup_table_horizontal_click_cb),
+ 0);
+ gtk_box_pack_start (GTK_BOX (hbox), _lookup_table_items [0], TRUE, TRUE, 0);
+ gtk_widget_show (_lookup_table_items [0]);
+
+ separator = gtk_vseparator_new ();
+ GtkStyle *style = gtk_widget_get_style (separator);
+ if (style != NULL) {
+ style->xthickness = thickness;
+ style->ythickness = thickness;
+ gtk_widget_set_style (separator, style);
+ }
+ //gtk_box_pack_start (GTK_BOX (hbox), separator, FALSE, FALSE, 0);
+ gtk_widget_show (separator);
+
+ // New left button
+ image = ui_create_left_icon ();
+ _lookup_table_up_button = gtk_button_new ();
+ gtk_container_add (GTK_CONTAINER (_lookup_table_up_button), image);
+ gtk_widget_show (image);
+ gtk_box_pack_start (GTK_BOX (hbox), _lookup_table_up_button, FALSE, FALSE, 0);
+ gtk_widget_show (_lookup_table_up_button);
+ g_signal_connect (G_OBJECT (_lookup_table_up_button), "clicked",
+ G_CALLBACK (ui_lookup_table_up_button_click_cb),
+ image);
+
+ // New right button
+ image = ui_create_right_icon ();
+ _lookup_table_down_button = gtk_button_new ();
+ gtk_container_add (GTK_CONTAINER (_lookup_table_down_button), image);
+ gtk_widget_show (image);
+ gtk_box_pack_start (GTK_BOX (hbox), _lookup_table_down_button, FALSE, FALSE, 0);
+ gtk_widget_show (_lookup_table_down_button);
+ g_signal_connect (G_OBJECT (_lookup_table_down_button), "clicked",
+ G_CALLBACK (ui_lookup_table_down_button_click_cb),
+ image);
+ }
+
+ gtk_button_set_relief (GTK_BUTTON (_lookup_table_up_button), GTK_RELIEF_NONE);
+ gtk_widget_modify_bg (_lookup_table_up_button, GTK_STATE_ACTIVE, &_normal_bg);
+ gtk_widget_modify_bg (_lookup_table_up_button, GTK_STATE_INSENSITIVE, &_normal_bg);
+ gtk_widget_modify_bg (_lookup_table_up_button, GTK_STATE_PRELIGHT, &_normal_bg);
+
+ gtk_button_set_relief (GTK_BUTTON (_lookup_table_down_button), GTK_RELIEF_NONE);
+ gtk_widget_modify_bg (_lookup_table_down_button, GTK_STATE_ACTIVE, &_normal_bg);
+ gtk_widget_modify_bg (_lookup_table_down_button, GTK_STATE_INSENSITIVE, &_normal_bg);
+ gtk_widget_modify_bg (_lookup_table_down_button, GTK_STATE_PRELIGHT, &_normal_bg);
+ }
+
+ // Create associate table window
+ {
+ GtkWidget *vbox = NULL;
+ GtkWidget *hbox = NULL;
+ GtkWidget *image = NULL;
+ GtkWidget *separator = NULL;
+ GtkWidget *associate_table_parent = NULL;
+
+ _associate_table_window = gtk_vbox_new (FALSE, 0);
+ if (vertical) {
+ _middle_separator = gtk_vseparator_new ();
+ GtkStyle *style = gtk_widget_get_style (_middle_separator);
+ if (style != NULL) {
+ style->xthickness = thickness;
+ style->ythickness = thickness;
+ gtk_widget_set_style (_middle_separator, style);
+ }
+ gtk_box_pack_start (GTK_BOX (input_window_hbox), _middle_separator, FALSE, FALSE, 0);
+ gtk_widget_show (_middle_separator);
+
+ gtk_box_pack_start (GTK_BOX (input_window_hbox), _associate_table_window, TRUE, TRUE, 0);
+ } else {
+ gtk_box_pack_start (GTK_BOX (input_window_vbox), _associate_table_window, TRUE, TRUE, 0);
+ }
+ associate_table_parent = _associate_table_window;
+ _associate_separator = gtk_hseparator_new ();
+ GtkStyle *style = gtk_widget_get_style (_associate_separator);
+ if (style != NULL) {
+ style->xthickness = thickness;
+ style->ythickness = thickness;
+ gtk_widget_set_style (_associate_separator, style);
+ }
+ gtk_box_pack_start (GTK_BOX (associate_table_parent), _associate_separator, FALSE, FALSE, 0);
+ gtk_widget_show (_associate_separator);
+
+ if (vertical) {
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (associate_table_parent), vbox);
+ gtk_widget_show (vbox);
+
+ for (int i = 0; i < SCIM_LOOKUP_TABLE_MAX_PAGESIZE; ++i) {
+ _associate_table_items [i] = scim_string_view_new ();
+ //if (_default_font_desc)
+ // gtk_widget_modify_font (_associate_table_items [i], _default_font_desc);
+ gtk_widget_modify_base (_associate_table_items [i], GTK_STATE_NORMAL, &_normal_bg);
+ gtk_widget_modify_base (_associate_table_items [i], GTK_STATE_ACTIVE, &_active_bg);
+ gtk_widget_modify_text (_associate_table_items [i], GTK_STATE_NORMAL, &_normal_text);
+ gtk_widget_modify_text (_associate_table_items [i], GTK_STATE_ACTIVE, &_active_text);
+ scim_string_view_set_width_chars (SCIM_STRING_VIEW (_associate_table_items [i]), 80);
+ scim_string_view_set_has_frame (SCIM_STRING_VIEW (_associate_table_items [i]), FALSE);
+ scim_string_view_set_forward_event (SCIM_STRING_VIEW (_associate_table_items [i]), TRUE);
+ scim_string_view_set_auto_resize (SCIM_STRING_VIEW (_associate_table_items [i]), TRUE);
+ scim_string_view_set_draw_cursor (SCIM_STRING_VIEW (_associate_table_items [i]), FALSE);
+ scim_string_view_set_auto_move_cursor (SCIM_STRING_VIEW (_associate_table_items [i]), FALSE);
+ g_signal_connect (G_OBJECT (_associate_table_items [i]), "button-press-event",
+ G_CALLBACK (ui_associate_table_vertical_click_cb),
+ GINT_TO_POINTER (i));
+ gtk_box_pack_start (GTK_BOX (vbox), _associate_table_items [i], FALSE, FALSE, 0);
+ }
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+ gtk_widget_show (hbox);
+
+ // New down button
+ image = ui_create_down_icon ();
+ _associate_table_down_button = gtk_button_new ();
+ gtk_container_add (GTK_CONTAINER (_associate_table_down_button), image);
+ gtk_widget_show (image);
+ gtk_box_pack_end (GTK_BOX (hbox), _associate_table_down_button, TRUE, TRUE, 0);
+ gtk_widget_show (_associate_table_down_button);
+ g_signal_connect (G_OBJECT (_associate_table_down_button), "clicked",
+ G_CALLBACK (ui_associate_table_down_button_click_cb),
+ image);
+
+ // New up button
+ image = ui_create_up_icon ();
+ _associate_table_up_button = gtk_button_new ();
+ gtk_container_add (GTK_CONTAINER (_associate_table_up_button), image);
+ gtk_widget_show (image);
+ gtk_box_pack_end (GTK_BOX (hbox), _associate_table_up_button, TRUE, TRUE, 0);
+ gtk_widget_show (_associate_table_up_button);
+ g_signal_connect (G_OBJECT (_associate_table_up_button), "clicked",
+ G_CALLBACK (ui_associate_table_up_button_click_cb),
+ image);
+
+ separator = gtk_hseparator_new ();
+ GtkStyle *style = gtk_widget_get_style (separator);
+ if (style != NULL) {
+ style->xthickness = thickness;
+ style->ythickness = thickness;
+ gtk_widget_set_style (separator, style);
+ }
+ //gtk_box_pack_end (GTK_BOX (vbox), separator, FALSE, FALSE, 0);
+ gtk_widget_show (separator);
+ } else {
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (associate_table_parent), hbox);
+ gtk_widget_show (hbox);
+
+ _associate_table_items [0] = scim_string_view_new ();
+ //if (_default_font_desc)
+ // gtk_widget_modify_font (_associate_table_items [0], _default_font_desc);
+ gtk_widget_modify_base (_associate_table_items [0], GTK_STATE_NORMAL, &_normal_bg);
+ gtk_widget_modify_base (_associate_table_items [0], GTK_STATE_ACTIVE, &_active_bg);
+ gtk_widget_modify_text (_associate_table_items [0], GTK_STATE_NORMAL, &_normal_text);
+ gtk_widget_modify_text (_associate_table_items [0], GTK_STATE_ACTIVE, &_active_text);
+ scim_string_view_set_forward_event (SCIM_STRING_VIEW (_associate_table_items [0]), TRUE);
+ scim_string_view_set_auto_resize (SCIM_STRING_VIEW (_associate_table_items [0]), TRUE);
+ scim_string_view_set_has_frame (SCIM_STRING_VIEW (_associate_table_items [0]), FALSE);
+ scim_string_view_set_draw_cursor (SCIM_STRING_VIEW (_associate_table_items [0]), FALSE);
+ scim_string_view_set_auto_move_cursor (SCIM_STRING_VIEW (_associate_table_items [0]), FALSE);
+ g_signal_connect (G_OBJECT (_associate_table_items [0]), "move_cursor",
+ G_CALLBACK (ui_associate_table_horizontal_click_cb),
+ 0);
+ gtk_box_pack_start (GTK_BOX (hbox), _associate_table_items [0], TRUE, TRUE, 0);
+ gtk_widget_show (_associate_table_items [0]);
+
+ separator = gtk_vseparator_new ();
+ GtkStyle *style = gtk_widget_get_style (separator);
+ if (style != NULL) {
+ style->xthickness = thickness;
+ style->ythickness = thickness;
+ gtk_widget_set_style (separator, style);
+ }
+ //gtk_box_pack_start (GTK_BOX (hbox), separator, FALSE, FALSE, 0);
+ gtk_widget_show (separator);
+
+ // New right button
+ image = ui_create_left_icon ();
+ _associate_table_up_button = gtk_button_new ();
+ gtk_container_add (GTK_CONTAINER (_associate_table_up_button), image);
+ gtk_widget_show (image);
+ gtk_box_pack_start (GTK_BOX (hbox), _associate_table_up_button, FALSE, FALSE, 0);
+ gtk_widget_show (_associate_table_up_button);
+ g_signal_connect (G_OBJECT (_associate_table_up_button), "clicked",
+ G_CALLBACK (ui_associate_table_up_button_click_cb),
+ image);
+
+ // New left button
+ image = ui_create_right_icon ();
+ _associate_table_down_button = gtk_button_new ();
+ gtk_container_add (GTK_CONTAINER (_associate_table_down_button), image);
+ gtk_widget_show (image);
+ gtk_box_pack_start (GTK_BOX (hbox), _associate_table_down_button, FALSE, FALSE, 0);
+ gtk_widget_show (_associate_table_down_button);
+ g_signal_connect (G_OBJECT (_associate_table_down_button), "clicked",
+ G_CALLBACK (ui_associate_table_down_button_click_cb),
+ image);
+ }
+
+ gtk_button_set_relief (GTK_BUTTON (_associate_table_up_button), GTK_RELIEF_NONE);
+ gtk_widget_modify_bg (_associate_table_up_button, GTK_STATE_ACTIVE, &_normal_bg);
+ gtk_widget_modify_bg (_associate_table_up_button, GTK_STATE_INSENSITIVE, &_normal_bg);
+ gtk_widget_modify_bg (_associate_table_up_button, GTK_STATE_PRELIGHT, &_normal_bg);
+
+ gtk_button_set_relief (GTK_BUTTON (_associate_table_down_button), GTK_RELIEF_NONE);
+ gtk_widget_modify_bg (_associate_table_down_button, GTK_STATE_ACTIVE, &_normal_bg);
+ gtk_widget_modify_bg (_associate_table_down_button, GTK_STATE_INSENSITIVE, &_normal_bg);
+ gtk_widget_modify_bg (_associate_table_down_button, GTK_STATE_PRELIGHT, &_normal_bg);
+ }
+}
+
+/**
+ * @brief Callback function for press event of candidate scroller.
+ *
+ * @param widget The handler of candidate scroller.
+ * @param event The GdkEvent pointer for this event.
+ * @param user_data Data pointer to pass when it is called.
+ */
+static gboolean candidate_scroll_button_press_cb (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data)
+{
+ SCIM_DEBUG_MAIN (3) << "[candidate_scroll_button_press_cb] event type=" << event->type << "\n";
+
+ if (_scroll_start < -9999) {
+ GtkWidget *hscrollbar = gtk_scrolled_window_get_hscrollbar (GTK_SCROLLED_WINDOW (widget));
+ _scroll_start = gtk_range_get_value (GTK_RANGE (hscrollbar));
+ }
+ _show_scroll = true;
+
+ return FALSE;
+}
+
+/**
+ * @brief Callback function for motion event of candidate scroller.
+ *
+ * @param widget The handler of candidate scroller.
+ * @param event The GdkEvent pointer for this event.
+ * @param user_data Data pointer to pass when it is called.
+ */
+static gboolean candidate_scroll_motion_cb (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data)
+{
+ SCIM_DEBUG_MAIN (3) << "[candidate_scroll_motion_cb] event type=" << event->type << "\n";
+
+ _candidate_motion++;
+ if (_candidate_motion > 1)
+ _show_scroll = true;
+
+ return FALSE;
+}
+
+/**
+ * @brief Callback function for flick event of candidate scroller.
+ *
+ * @param widget The handler of candidate scroller.
+ * @param event The GdkEvent pointer for this event.
+ * @param user_data Data pointer to pass when it is called.
+ */
+static gboolean candidate_scroll_flick_cb (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data)
+{
+ SCIM_DEBUG_MAIN (3) << "[candidate_scroll_flick_cb] event type=" << event->type << "\n";
+
+ int *index_pos = NULL;
+ if (GPOINTER_TO_INT (user_data) == 1) {
+ scim_string_view_set_highlight (SCIM_STRING_VIEW (_lookup_table_items [0]), -1, -1);
+ index_pos = _lookup_table_index_pos;
+ } else if (GPOINTER_TO_INT (user_data) == 2) {
+ scim_string_view_set_highlight (SCIM_STRING_VIEW (_associate_table_items [0]), -1, -1);
+ index_pos = _associate_table_index_pos;
+ }
+
+ if (event->type != GDK_BUTTON_RELEASE && index_pos != NULL) {
+ GtkWidget *hscrollbar = gtk_scrolled_window_get_hscrollbar (GTK_SCROLLED_WINDOW (widget));
+ gdouble pos = gtk_range_get_value (GTK_RANGE (hscrollbar));
+ int new_pos = 0;
+ for (int i = 1; (int)pos > 0; i++) {
+ if (index_pos[i] <= 0 || ((pos-index_pos[i] > -0.01) && (pos-index_pos[i] < 0.01)))
+ break;
+ if (pos < index_pos[i]) {
+ if (_scroll_start < pos)
+ new_pos = index_pos[i];
+ else
+ new_pos = index_pos[i-1];
+ gtk_range_set_value (GTK_RANGE (hscrollbar), new_pos);
+ break;
+ }
+ }
+ }
+
+ _candidate_motion = 0;
+ _scroll_start = -10000;
+ _show_scroll = false;
+
+ return FALSE;
+}
+
+/**
+ * @brief Create prediction engine style candidate window.
+ *
+ * @param vertical An indicator for vertical window or horizontal window.
+ */
+static void create_prediction_engine_candidate_window (bool vertical)
+{
+ GtkWidget *input_window_vbox = NULL;
+ GtkWidget *input_window_hbox = NULL;
+ gint input_window_width;
+ gint thickness = 1;
+ gint border_width = 2;
+ gint new_height = ((69 * gdk_screen_height ()) / 800) - (2 * border_width);
+
+ input_window_width = gdk_screen_width ();
+
+ _lookup_icon_size = input_window_width / 24;
+ if (_lookup_icon_size < LOOKUP_ICON_SIZE)
+ _lookup_icon_size = LOOKUP_ICON_SIZE;
+
+ GtkWidget *default_label = gtk_label_new ("default label");
+ GtkStyle *label_style = gtk_widget_get_style (default_label);
+#ifdef USING_ISF_SWITCH_BUTTON
+ GdkColor base_normal = label_style->base[GTK_STATE_NORMAL];
+ GdkColor base_active = label_style->base[GTK_STATE_ACTIVE];
+ GdkColor text_normal = label_style->text[GTK_STATE_NORMAL];
+ GdkColor text_active = label_style->text[GTK_STATE_ACTIVE];
+#else
+ GdkColor base_normal = label_style->bg[GTK_STATE_NORMAL];
+ GdkColor base_active = label_style->bg[GTK_STATE_ACTIVE];
+ GdkColor text_normal = label_style->fg[GTK_STATE_NORMAL];
+ GdkColor text_active = label_style->fg[GTK_STATE_ACTIVE];
+#endif
+
+ GdkColor text_insensitive;
+ gdk_color_parse ("#333333", &text_insensitive);
+ //String strColor = _config->read (String (SCIM_CONFIG_PANEL_GTK_COLOR_SEPARATOR), String ("#333333"));
+ //gdk_color_parse (strColor.c_str (), &text_insensitive);
+ //_config->write (String (SCIM_CONFIG_PANEL_GTK_COLOR_SEPARATOR), strColor);
+
+ gdk_color_parse ("#2B2B2B", &base_normal);
+
+ // Create input window
+ {
+ GtkWidget *vbox = NULL;
+ GtkWidget *hbox = NULL;
+ GtkWidget *frame = NULL;
+ GtkWidget *event_box = NULL;
+
+ _input_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_type_hint (GTK_WINDOW (_input_window), GDK_WINDOW_TYPE_HINT_UTILITY);
+
+ if (!vertical)
+ gtk_widget_set_size_request (GTK_WIDGET (_input_window), input_window_width, -1);
+ if (_candidate_mode == LANDSCAPE_HORIZONTAL_CANDIDATE_MODE) {
+#if HAVE_GCONF
+ gtk_window_set_rotate (GTK_WINDOW (_input_window), LANDSCAPE_DEGREE);
+#endif
+ gtk_widget_set_size_request (GTK_WIDGET (_input_window), gdk_screen_height (), -1);
+ } else if (_candidate_mode == LANDSCAPE_VERTICAL_CANDIDATE_MODE) {
+#if HAVE_GCONF
+ gtk_window_set_rotate (GTK_WINDOW (_input_window), LANDSCAPE_DEGREE);
+#endif
+ }
+
+ //gtk_window_set_type_hint (GTK_WINDOW (_input_window), GDK_WINDOW_TYPE_HINT_NOTIFICATION);
+ //gtk_window_set_keep_above (GTK_WINDOW (_input_window), TRUE);
+ gtk_container_set_border_width (GTK_CONTAINER (_input_window), border_width);
+ //gtk_widget_modify_bg (_input_window, GTK_STATE_NORMAL, &(text_insensitive));
+ gtk_window_set_policy (GTK_WINDOW (_input_window), TRUE, TRUE, FALSE);
+ gtk_window_set_accept_focus (GTK_WINDOW (_input_window), FALSE);
+ gtk_window_set_resizable (GTK_WINDOW (_input_window), FALSE);
+ gtk_widget_add_events (_input_window, GDK_BUTTON_PRESS_MASK);
+ gtk_widget_add_events (_input_window, GDK_BUTTON_RELEASE_MASK);
+ gtk_widget_add_events (_input_window, GDK_POINTER_MOTION_MASK);
+ g_signal_connect (G_OBJECT (_input_window), "button-press-event",
+ G_CALLBACK (ui_input_window_click_cb),
+ GINT_TO_POINTER (0));
+ g_signal_connect (G_OBJECT (_input_window), "button-release-event",
+ G_CALLBACK (ui_input_window_click_cb),
+ GINT_TO_POINTER (1));
+
+ event_box = gtk_event_box_new ();
+ gtk_container_add (GTK_CONTAINER (_input_window), event_box);
+ gtk_widget_show (event_box);
+
+ frame = gtk_frame_new (0);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT);
+ gtk_container_add (GTK_CONTAINER (event_box), frame);
+ gtk_widget_show (frame);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (frame), hbox);
+ gtk_widget_show (hbox);
+
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+ gtk_widget_show (vbox);
+ input_window_vbox = vbox;
+
+ // Create preedit area
+ _preedit_area = scim_string_view_new ();
+ gtk_widget_modify_base (_preedit_area, GTK_STATE_NORMAL, &(base_normal));
+ gtk_widget_modify_base (_preedit_area, GTK_STATE_ACTIVE, &(base_active));
+ gtk_widget_modify_text (_preedit_area, GTK_STATE_NORMAL, &(text_normal));
+ gtk_widget_modify_text (_preedit_area, GTK_STATE_ACTIVE, &(text_active));
+ scim_string_view_set_width_chars (SCIM_STRING_VIEW (_preedit_area), 24);
+ scim_string_view_set_forward_event (SCIM_STRING_VIEW (_preedit_area), TRUE);
+ scim_string_view_set_auto_resize (SCIM_STRING_VIEW (_preedit_area), TRUE);
+ scim_string_view_set_has_frame (SCIM_STRING_VIEW (_preedit_area), FALSE);
+ g_signal_connect (G_OBJECT (_preedit_area), "move_cursor",
+ G_CALLBACK (ui_preedit_area_move_cursor_cb),
+ 0);
+ gtk_box_pack_start (GTK_BOX (vbox), _preedit_area, TRUE, TRUE, 0);
+
+ // Create aux area
+ _aux_area = scim_string_view_new ();
+ if (_default_font_desc)
+ gtk_widget_modify_font (_aux_area, _default_font_desc);
+ gtk_widget_modify_base (_aux_area, GTK_STATE_NORMAL, &(base_normal));
+ gtk_widget_modify_base (_aux_area, GTK_STATE_ACTIVE, &(base_active));
+ gtk_widget_modify_text (_aux_area, GTK_STATE_NORMAL, &(text_normal));
+ gtk_widget_modify_text (_aux_area, GTK_STATE_ACTIVE, &(text_active));
+ scim_string_view_set_width_chars (SCIM_STRING_VIEW (_aux_area), 24);
+ scim_string_view_set_draw_cursor (SCIM_STRING_VIEW (_aux_area), FALSE);
+ scim_string_view_set_forward_event (SCIM_STRING_VIEW (_aux_area), TRUE);
+ scim_string_view_set_auto_resize (SCIM_STRING_VIEW (_aux_area), TRUE);
+ scim_string_view_set_has_frame (SCIM_STRING_VIEW (_aux_area), FALSE);
+ gtk_box_pack_start (GTK_BOX (vbox), _aux_area, TRUE, TRUE, 0);
+ }
+
+ // Create lookup table window
+ {
+ GtkWidget *vbox = NULL;
+ GtkWidget *hbox = NULL;
+ GtkWidget *lookup_table_parent = NULL;
+
+ {
+ _lookup_table_window = gtk_vbox_new (FALSE, 0);
+ if (vertical) {
+ input_window_hbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (input_window_vbox), input_window_hbox, TRUE, TRUE, 0);
+ gtk_widget_show (input_window_hbox);
+ gtk_box_pack_start (GTK_BOX (input_window_hbox), _lookup_table_window, TRUE, TRUE, 0);
+ } else {
+ gtk_box_pack_start (GTK_BOX (input_window_vbox), _lookup_table_window, TRUE, TRUE, 0);
+ }
+ lookup_table_parent = _lookup_table_window;
+ _candidate_separator = gtk_hseparator_new ();
+ GtkStyle *style = gtk_widget_get_style (_candidate_separator);
+ if (style != NULL) {
+ style->xthickness = thickness;
+ style->ythickness = thickness;
+ gtk_widget_set_style (_candidate_separator, style);
+ }
+ gtk_box_pack_start (GTK_BOX (lookup_table_parent), _candidate_separator, FALSE, FALSE, 0);
+ gtk_widget_show (_candidate_separator);
+ }
+
+ // Vertical lookup table
+ if (vertical) {
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (lookup_table_parent), vbox);
+ gtk_widget_show (vbox);
+
+ _candidate_scroll = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (_candidate_scroll),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+ gtk_widget_set_size_request (_candidate_scroll, -1, gdk_screen_height () / 3);
+ gtk_box_pack_start (GTK_BOX (vbox), _candidate_scroll, TRUE, TRUE, 0);
+ gtk_widget_show (_candidate_scroll);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (_candidate_scroll), hbox);
+ gtk_widget_show (hbox);
+
+ GtkWidget *ilabel = gtk_label_new (" ");
+ gtk_widget_set_size_request (ilabel, BLANK_SIZE, -1);
+ gtk_box_pack_start (GTK_BOX (hbox), ilabel, FALSE, FALSE, 0);
+ gtk_widget_show (ilabel);
+
+ GtkWidget *vbox_candidate = gtk_vbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox_candidate, TRUE, TRUE, 0);
+ gtk_widget_show (vbox_candidate);
+
+ // New table items
+ for (int i=0; i<SCIM_LOOKUP_TABLE_MAX_PAGESIZE; ++i) {
+ _lookup_table_items [i] = scim_string_view_new ();
+ if (_default_font_desc)
+ gtk_widget_modify_font (_lookup_table_items [i], _default_font_desc);
+ gtk_widget_modify_base (_lookup_table_items [i], GTK_STATE_NORMAL, &(base_normal));
+ gtk_widget_modify_base (_lookup_table_items [i], GTK_STATE_ACTIVE, &(base_active));
+ gtk_widget_modify_text (_lookup_table_items [i], GTK_STATE_NORMAL, &(text_normal));
+ gtk_widget_modify_text (_lookup_table_items [i], GTK_STATE_ACTIVE, &(text_active));
+ scim_string_view_set_width_chars (SCIM_STRING_VIEW (_lookup_table_items [i]), 80);
+ scim_string_view_set_has_frame (SCIM_STRING_VIEW (_lookup_table_items [i]), FALSE);
+ scim_string_view_set_forward_event (SCIM_STRING_VIEW (_lookup_table_items [i]), TRUE);
+ scim_string_view_set_auto_resize (SCIM_STRING_VIEW (_lookup_table_items [i]), TRUE);
+ scim_string_view_set_draw_cursor (SCIM_STRING_VIEW (_lookup_table_items [i]), FALSE);
+ scim_string_view_set_auto_move_cursor (SCIM_STRING_VIEW (_lookup_table_items [i]), FALSE);
+ g_signal_connect (G_OBJECT (_lookup_table_items [i]), "button-release-event",
+ G_CALLBACK (ui_lookup_table_vertical_click_cb),
+ GINT_TO_POINTER (i));
+ gtk_box_pack_start (GTK_BOX (vbox_candidate), _lookup_table_items [i], FALSE, FALSE, 0);
+ }
+ } else {
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (lookup_table_parent), hbox);
+ gtk_widget_show (hbox);
+
+ _candidate_scroll = gtk_scrolled_window_new (NULL, NULL);
+#if HAVE_GCONF
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (_candidate_scroll),
+ GTK_POLICY_AUTOHIDE, GTK_POLICY_NEVER);
+#else
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (_candidate_scroll),
+ GTK_POLICY_ALWAYS, GTK_POLICY_NEVER);
+#endif
+ gtk_box_pack_start (GTK_BOX (hbox), _candidate_scroll, TRUE, TRUE, 0);
+ gtk_widget_show (_candidate_scroll);
+ g_signal_connect (G_OBJECT (_candidate_scroll), "button-press-event",
+ G_CALLBACK (candidate_scroll_button_press_cb),
+ GINT_TO_POINTER (1));
+ g_signal_connect (G_OBJECT (_candidate_scroll), "button-release-event",
+ G_CALLBACK (candidate_scroll_flick_cb),
+ GINT_TO_POINTER (1));
+ g_signal_connect (G_OBJECT (_candidate_scroll), "motion-notify-event",
+ G_CALLBACK (candidate_scroll_motion_cb),
+ GINT_TO_POINTER (1));
+ g_signal_connect (G_OBJECT (_candidate_scroll), "flick-event",
+ G_CALLBACK (candidate_scroll_flick_cb),
+ GINT_TO_POINTER (1));
+
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (_candidate_scroll), vbox);
+ gtk_widget_show (vbox);
+
+ _lookup_table_items [0] = scim_string_view_new ();
+ if (_default_font_desc)
+ gtk_widget_modify_font (_lookup_table_items [0], _default_font_desc);
+ gtk_widget_modify_base (_lookup_table_items [0], GTK_STATE_NORMAL, &(base_normal));
+ gtk_widget_modify_base (_lookup_table_items [0], GTK_STATE_ACTIVE, &(base_active));
+ gtk_widget_modify_text (_lookup_table_items [0], GTK_STATE_NORMAL, &(text_normal));
+ gtk_widget_modify_text (_lookup_table_items [0], GTK_STATE_ACTIVE, &(text_active));
+ gtk_widget_modify_text (_lookup_table_items [0], GTK_STATE_INSENSITIVE, &(text_insensitive));
+ scim_string_view_set_forward_event (SCIM_STRING_VIEW (_lookup_table_items [0]), TRUE);
+ scim_string_view_set_auto_resize (SCIM_STRING_VIEW (_lookup_table_items [0]), TRUE);
+ scim_string_view_set_press_move_cursor (SCIM_STRING_VIEW (_lookup_table_items [0]), FALSE);
+ scim_string_view_set_separator_index (SCIM_STRING_VIEW (_lookup_table_items [0]), _lookup_table_index);
+ scim_string_view_set_has_frame (SCIM_STRING_VIEW (_lookup_table_items [0]), FALSE);
+ scim_string_view_set_draw_cursor (SCIM_STRING_VIEW (_lookup_table_items [0]), FALSE);
+ scim_string_view_set_auto_move_cursor (SCIM_STRING_VIEW (_lookup_table_items [0]), FALSE);
+ g_signal_connect (G_OBJECT (_lookup_table_items [0]), "move_cursor",
+ G_CALLBACK (ui_lookup_table_horizontal_click_cb),
+ 0);
+
+ gtk_box_pack_start (GTK_BOX (vbox), _lookup_table_items [0], FALSE, FALSE, 0);
+ gtk_widget_show (_lookup_table_items [0]);
+
+ // Resize candidate height
+ GtkRequisition scroll_size, lookup_size;
+ gtk_widget_size_request (_candidate_scroll, &scroll_size);
+ if (scroll_size.height >= new_height) {
+ gtk_widget_set_size_request (GTK_WIDGET (_candidate_scroll), -1, scroll_size.height);
+ } else {
+ gtk_widget_size_request (_lookup_table_items [0], &lookup_size);
+ gtk_widget_set_size_request (GTK_WIDGET (_candidate_scroll), -1, new_height);
+ gtk_widget_set_size_request (GTK_WIDGET (_lookup_table_items [0]), -1,
+ lookup_size.height + (new_height - scroll_size.height));
+ }
+ }
+ }
+
+ //Create associate table window
+ {
+ GtkWidget *vbox = NULL;
+ GtkWidget *hbox = NULL;
+ GtkWidget *associate_table_parent = NULL;
+
+ _associate_table_window = gtk_vbox_new (FALSE, 0);
+ if (vertical) {
+ _middle_separator = gtk_vseparator_new ();
+ GtkStyle *style = gtk_widget_get_style (_middle_separator);
+ if (style != NULL) {
+ style->xthickness = thickness;
+ style->ythickness = thickness;
+ gtk_widget_set_style (_middle_separator, style);
+ }
+ //gtk_box_pack_start (GTK_BOX (input_window_hbox), _middle_separator, FALSE, FALSE, 0);
+ gtk_widget_show (_middle_separator);
+
+ gtk_box_pack_start (GTK_BOX (input_window_hbox), _associate_table_window, TRUE, TRUE, 0);
+ } else {
+ gtk_box_pack_start (GTK_BOX (input_window_vbox), _associate_table_window, TRUE, TRUE, 0);
+ }
+ associate_table_parent = _associate_table_window;
+ _associate_separator = gtk_hseparator_new ();
+ GtkStyle *style = gtk_widget_get_style (_associate_separator);
+ if (style != NULL) {
+ style->xthickness = thickness;
+ style->ythickness = thickness;
+ gtk_widget_set_style (_associate_separator, style);
+ }
+ gtk_box_pack_start (GTK_BOX (associate_table_parent), _associate_separator, FALSE, FALSE, 0);
+ gtk_widget_show (_associate_separator);
+
+ if (vertical) {
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (associate_table_parent), vbox);
+ gtk_widget_show (vbox);
+
+ _associate_scroll = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (_associate_scroll),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+ gtk_widget_set_size_request (_associate_scroll, -1, gdk_screen_height () / 3);
+ gtk_box_pack_start (GTK_BOX (vbox), _associate_scroll, TRUE, TRUE, 0);
+ gtk_widget_show (_associate_scroll);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (_associate_scroll), hbox);
+ gtk_widget_show (hbox);
+
+ GtkWidget *ilabel = gtk_label_new (" ");
+ gtk_widget_set_size_request (ilabel, BLANK_SIZE, -1);
+ gtk_box_pack_start (GTK_BOX (hbox), ilabel, FALSE, FALSE, 0);
+ gtk_widget_show (ilabel);
+
+ GtkWidget *vbox_associate = gtk_vbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox_associate, TRUE, TRUE, 0);
+ gtk_widget_show (vbox_associate);
+
+ // New table items
+ for (int i=0; i<SCIM_LOOKUP_TABLE_MAX_PAGESIZE; ++i) {
+ _associate_table_items [i] = scim_string_view_new ();
+ if (_default_font_desc)
+ gtk_widget_modify_font (_associate_table_items [i], _default_font_desc);
+ gtk_widget_modify_base (_associate_table_items [i], GTK_STATE_NORMAL, &(base_normal));
+ gtk_widget_modify_base (_associate_table_items [i], GTK_STATE_ACTIVE, &(base_active));
+ gtk_widget_modify_text (_associate_table_items [i], GTK_STATE_NORMAL, &(text_normal));
+ gtk_widget_modify_text (_associate_table_items [i], GTK_STATE_ACTIVE, &(text_active));
+ scim_string_view_set_width_chars (SCIM_STRING_VIEW (_associate_table_items [i]), 80);
+ scim_string_view_set_has_frame (SCIM_STRING_VIEW (_associate_table_items [i]), FALSE);
+ scim_string_view_set_forward_event (SCIM_STRING_VIEW (_associate_table_items [i]), TRUE);
+ scim_string_view_set_auto_resize (SCIM_STRING_VIEW (_associate_table_items [i]), TRUE);
+ scim_string_view_set_draw_cursor (SCIM_STRING_VIEW (_associate_table_items [i]), FALSE);
+ scim_string_view_set_auto_move_cursor (SCIM_STRING_VIEW (_associate_table_items [i]), FALSE);
+ g_signal_connect (G_OBJECT (_associate_table_items [i]), "button-release-event",
+ G_CALLBACK (ui_associate_table_vertical_click_cb),
+ GINT_TO_POINTER (i));
+ gtk_box_pack_start (GTK_BOX (vbox_associate), _associate_table_items [i], FALSE, FALSE, 0);
+ }
+ } else {
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (associate_table_parent), hbox);
+ gtk_widget_show (hbox);
+
+ _associate_scroll = gtk_scrolled_window_new (NULL, NULL);
+#if HAVE_GCONF
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (_associate_scroll),
+ GTK_POLICY_AUTOHIDE, GTK_POLICY_NEVER);
+#else
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (_associate_scroll),
+ GTK_POLICY_ALWAYS, GTK_POLICY_NEVER);
+#endif
+ gtk_box_pack_start (GTK_BOX (hbox), _associate_scroll, TRUE, TRUE, 0);
+ gtk_widget_show (_associate_scroll);
+ g_signal_connect (G_OBJECT (_associate_scroll), "button-press-event",
+ G_CALLBACK (candidate_scroll_button_press_cb),
+ GINT_TO_POINTER (2));
+ g_signal_connect (G_OBJECT (_associate_scroll), "button-release-event",
+ G_CALLBACK (candidate_scroll_flick_cb),
+ GINT_TO_POINTER (2));
+ g_signal_connect (G_OBJECT (_associate_scroll), "motion-notify-event",
+ G_CALLBACK (candidate_scroll_motion_cb),
+ GINT_TO_POINTER (2));
+ g_signal_connect (G_OBJECT (_associate_scroll), "flick-event",
+ G_CALLBACK (candidate_scroll_flick_cb),
+ GINT_TO_POINTER (2));
+
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (_associate_scroll), vbox);
+ gtk_widget_show (vbox);
+
+ _associate_table_items [0] = scim_string_view_new ();
+ if (_default_font_desc)
+ gtk_widget_modify_font (_associate_table_items [0], _default_font_desc);
+ gtk_widget_modify_base (_associate_table_items [0], GTK_STATE_NORMAL, &(base_normal));
+ gtk_widget_modify_base (_associate_table_items [0], GTK_STATE_ACTIVE, &(base_active));
+ gtk_widget_modify_text (_associate_table_items [0], GTK_STATE_NORMAL, &(text_normal));
+ gtk_widget_modify_text (_associate_table_items [0], GTK_STATE_ACTIVE, &(text_active));
+ gtk_widget_modify_text (_associate_table_items [0], GTK_STATE_INSENSITIVE, &(text_insensitive));
+ scim_string_view_set_forward_event (SCIM_STRING_VIEW (_associate_table_items [0]), TRUE);
+ scim_string_view_set_auto_resize (SCIM_STRING_VIEW (_associate_table_items [0]), TRUE);
+ scim_string_view_set_press_move_cursor (SCIM_STRING_VIEW (_associate_table_items [0]), FALSE);
+ scim_string_view_set_separator_index (SCIM_STRING_VIEW (_associate_table_items [0]), _associate_table_index);
+ scim_string_view_set_has_frame (SCIM_STRING_VIEW (_associate_table_items [0]), FALSE);
+ scim_string_view_set_draw_cursor (SCIM_STRING_VIEW (_associate_table_items [0]), FALSE);
+ scim_string_view_set_auto_move_cursor (SCIM_STRING_VIEW (_associate_table_items [0]), FALSE);
+ g_signal_connect (G_OBJECT (_associate_table_items [0]), "move_cursor",
+ G_CALLBACK (ui_associate_table_horizontal_click_cb),
+ 0);
+
+ gtk_box_pack_start (GTK_BOX (vbox), _associate_table_items [0], FALSE, FALSE, 0);
+ gtk_widget_show (_associate_table_items [0]);
+
+ // Resize associate height
+ GtkRequisition scroll_size, lookup_size;
+ gtk_widget_size_request (_associate_scroll, &scroll_size);
+ if (scroll_size.height >= new_height) {
+ gtk_widget_set_size_request (GTK_WIDGET (_associate_scroll), -1, scroll_size.height);
+ } else {
+ gtk_widget_size_request (_associate_table_items [0], &lookup_size);
+ gtk_widget_set_size_request (GTK_WIDGET (_associate_scroll), -1, new_height);
+ gtk_widget_set_size_request (GTK_WIDGET (_associate_table_items [0]), -1,
+ lookup_size.height + (new_height - scroll_size.height));
+ }
+ }
+ }
+
+ // Load background and divider
+ {
+ GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file (ISF_CANDIDATE_BG_FILE, NULL);
+ if (pixbuf != NULL && _input_window != NULL) {
+ gtk_widget_set_app_paintable (_input_window, TRUE);
+ gtk_widget_realize (_input_window);
+ GdkPixmap *pixmap = gdk_pixmap_new (_input_window->window, gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf), -1);
+ if (pixmap != NULL) {
+ gdk_draw_pixbuf (pixmap,
+ _input_window->style->fg_gc[GTK_STATE_NORMAL],
+ pixbuf,
+ 0, 0, 0, 0,
+ gdk_pixbuf_get_width (pixbuf),
+ gdk_pixbuf_get_height (pixbuf),
+ GDK_RGB_DITHER_NORMAL, 0, 0);
+ gdk_window_set_back_pixmap (_input_window->window, pixmap, FALSE);
+ }
+ g_object_unref (pixbuf);
+ }
+
+ pixbuf = gdk_pixbuf_new_from_file (ISF_CANDIDATE_DIVIDER_FILE, NULL);
+ if (pixbuf != NULL && _input_window != NULL) {
+ GdkPixmap *pixmap = gdk_pixmap_new (_input_window->window, gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf), -1);
+ gdk_pixbuf_render_pixmap_and_mask (pixbuf, &pixmap, NULL, 0);
+ if (pixmap != NULL) {
+ scim_string_view_set_divider (SCIM_STRING_VIEW (_lookup_table_items [0]), pixmap);
+ scim_string_view_set_divider (SCIM_STRING_VIEW (_associate_table_items [0]), pixmap);
+ }
+ g_object_unref (pixbuf);
+ }
+ }
+
+ // Get split string according to screen width
+ String str;
+ GtkRequisition size;
+ size.width = 0;
+ _split_string1 = String ("");
+ _split_string2 = String ("");
+ do {
+ _split_string1 = _split_string1 + String (" ");
+ _split_string2 = _split_string2 + String (" ");
+ str = _split_string2 + _split_string1;
+ scim_string_view_set_text (SCIM_STRING_VIEW (_lookup_table_items [0]), str.c_str ());
+ gtk_widget_size_request (_lookup_table_items [0], &size);
+ } while (size.width < (15*_width_rate));
+
+ // Get space string
+ _space_string = _split_string1;
+}
+
+/**
+ * @brief Create candidate window.
+ *
+ * @param style The candidate window style.
+ * @param vertical An indicator for vertical window or horizontal window.
+ */
+static void create_candidate_window (ISF_CANDIDATE_STYLE_T style, bool vertical)
+{
+ check_time ("\nEnter create_candidate_window");
+ SCIM_DEBUG_MAIN (1) << "Create candidate window...\n";
+
+ if (_associate_table_window) {
+ gtk_widget_destroy (_associate_table_window);
+ _associate_table_window = 0;
+ }
+ if (_lookup_table_window) {
+ gtk_widget_destroy (_lookup_table_window);
+ _lookup_table_window = 0;
+ }
+ if (_input_window) {
+ gtk_widget_destroy (_input_window);
+ _input_window = 0;
+ }
+
+ if (style == PREDICTION_ENGINE_CANDIDATE_STYLE)
+ create_prediction_engine_candidate_window (vertical);
+ else
+ create_scim_candidate_window (vertical);
+/*
+ if (_candidate_mode == LANDSCAPE_HORIZONTAL_CANDIDATE_MODE) {
+ gtk_window_set_rotate (GTK_WINDOW (_input_window), LANDSCAPE_DEGREE);
+ gtk_widget_set_size_request (GTK_WIDGET (_input_window), gdk_screen_height (), -1);
+ } else if (_candidate_mode == LANDSCAPE_VERTICAL_CANDIDATE_MODE) {
+ gtk_window_set_rotate (GTK_WINDOW (_input_window), LANDSCAPE_DEGREE);
+ }
+*/
+ check_time ("Exit create_candidate_window");
+}
+
+/**
+ * @brief Update separator for candidate window.
+ */
+static void update_separator_status (void)
+{
+ if (_lookup_table_vertical) {
+ if (GTK_WIDGET_VISIBLE (_aux_area)) {
+ gtk_widget_show (_candidate_separator);
+ gtk_widget_show (_associate_separator);
+ } else {
+ gtk_widget_hide (_candidate_separator);
+ gtk_widget_hide (_associate_separator);
+ }
+
+ if (GTK_IS_WIDGET (_middle_separator)) {
+ if (GTK_WIDGET_VISIBLE (_lookup_table_window) && GTK_WIDGET_VISIBLE (_associate_table_window))
+ gtk_widget_show (_middle_separator);
+ else
+ gtk_widget_hide (_middle_separator);
+ }
+ } else {
+ if (GTK_WIDGET_VISIBLE (_aux_area))
+ gtk_widget_show (_candidate_separator);
+ else
+ gtk_widget_hide (_candidate_separator);
+
+ if (_candidate_style == PREDICTION_ENGINE_CANDIDATE_STYLE) {
+ if (GTK_WIDGET_VISIBLE (_aux_area) && !GTK_WIDGET_VISIBLE (_lookup_table_window))
+ gtk_widget_show (_associate_separator);
+ else
+ gtk_widget_hide (_associate_separator);
+ } else {
+ if (GTK_WIDGET_VISIBLE (_aux_area) || GTK_WIDGET_VISIBLE (_lookup_table_window))
+ gtk_widget_show (_associate_separator);
+ else
+ gtk_widget_hide (_associate_separator);
+ }
+
+ if (GTK_IS_WIDGET (_middle_separator)) {
+ if (GTK_WIDGET_VISIBLE (_middle_separator))
+ gtk_widget_hide (_middle_separator);
+ }
+ }
+}
+
+/**
+ * @brief Set active ISE by uuid.
+ *
+ * @param uuid The ISE's uuid.
+ *
+ * @return false if ISE change is failed, otherwise return true.
+ */
+static bool set_active_ise_by_uuid (const String &ise_uuid, bool changeDefault)
+{
+ if (ise_uuid.length () <= 0)
+ return false;
+
+ GtkTreePath *path = 0;
+ gchar *uuid = 0;
+ gchar *arg1 = 0;
+ GtkTreeIter iter;
+
+ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (_active_ise_list_store), &iter)) {
+ do {
+ gtk_tree_model_get (GTK_TREE_MODEL (_active_ise_list_store), &iter, ACTIVE_ISE_UUID, &uuid, -1);
+ if (uuid != NULL && !strcmp (uuid, ise_uuid.c_str ())) {
+ path = gtk_tree_model_get_path (GTK_TREE_MODEL (_active_ise_list_store), &iter);
+ arg1 = gtk_tree_path_to_string (path);
+ on_active_ise_enable_box_clicked (NULL, arg1, NULL);
+ if (path) {
+ gtk_tree_path_free (path);
+ path = 0;
+ }
+ if (arg1) {
+ g_free (arg1);
+ arg1 = 0;
+ }
+ if (uuid) {
+ g_free (uuid);
+ uuid = 0;
+ }
+ return true;
+ }
+ if (uuid) {
+ g_free (uuid);
+ uuid = 0;
+ }
+ } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (_active_ise_list_store), &iter));
+ }
+
+ return false;
+}
+
+/**
+ * @brief Set active ISE by name.
+ *
+ * @param ise_name The ISE's name.
+ *
+ * @return false if ISE change is failed, otherwise return true.
+ */
+static bool set_active_ise_by_name (const String &ise_name)
+{
+ if (ise_name.length () <= 0)
+ return false;
+
+ GtkTreePath *path = 0;
+ gchar *name = 0;
+ gchar *arg1 = 0;
+ GtkTreeIter iter;
+
+ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (_active_ise_list_store), &iter)) {
+ do {
+ gtk_tree_model_get (GTK_TREE_MODEL (_active_ise_list_store), &iter, ACTIVE_ISE_NAME, &name, -1);
+ if (name != NULL && !strcmp (name, ise_name.c_str ())) {
+ path = gtk_tree_model_get_path (GTK_TREE_MODEL (_active_ise_list_store), &iter);
+ arg1 = gtk_tree_path_to_string (path);
+ on_active_ise_enable_box_clicked (NULL, arg1, NULL);
+ if (path) {
+ gtk_tree_path_free (path);
+ path = 0;
+ }
+ if (arg1) {
+ g_free (arg1);
+ arg1 = 0;
+ }
+ if (name) {
+ g_free (name);
+ name = 0;
+ }
+ return true;
+ }
+ if (name) {
+ g_free (name);
+ name = 0;
+ }
+ } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (_active_ise_list_store), &iter));
+ }
+
+ return false;
+}
+
+/**
+ * @brief Reload config callback function for ISF panel.
+ *
+ * @param config The config pointer.
+ */
+static void ui_config_reload_callback (const ConfigPointer &config)
+{
+ _config = config;
+ ui_initialize ();
+}
+
+/**
+ * @brief Load ISF configuration and ISEs information.
+ */
+static void ui_load_config (void)
+{
+ String str;
+ bool shared_ise = false;
+ gchar font_description_string[MAX_FONT_STR_SIZE];
+
+ // Read configurations.
+ gdk_color_parse ("gray92", &_normal_bg);
+ gdk_color_parse ("black", &_normal_text);
+ gdk_color_parse ("light blue", &_active_bg);
+ gdk_color_parse ("black", &_active_text);
+
+ if (_default_font_desc) {
+ pango_font_description_free (_default_font_desc);
+ _default_font_desc = 0;
+ }
+
+ if (!_config.null ()) {
+ str = _config->read (String (SCIM_CONFIG_PANEL_GTK_FONT), String ("default"));
+
+ if (str != String ("default")) {
+#if HAVE_GCONF
+ snprintf (font_description_string, sizeof (font_description_string), "Vodafone Rg Bold %d", FONT_SIZE_OF_CANDIDATE_WIDGET);
+#endif
+ } else {
+ snprintf (font_description_string, sizeof (font_description_string), "default");
+ }
+ _default_font_desc = pango_font_description_from_string (font_description_string);
+
+ str = _config->read (String (SCIM_CONFIG_PANEL_GTK_COLOR_NORMAL_BG), String ("gray92"));
+ gdk_color_parse (str.c_str (), &_normal_bg);
+
+ str = _config->read (String (SCIM_CONFIG_PANEL_GTK_COLOR_NORMAL_TEXT), String ("black"));
+ gdk_color_parse (str.c_str (), &_normal_text);
+
+ str = _config->read (String (SCIM_CONFIG_PANEL_GTK_COLOR_ACTIVE_BG), String ("light blue"));
+ gdk_color_parse (str.c_str (), &_active_bg);
+
+ str = _config->read (String (SCIM_CONFIG_PANEL_GTK_COLOR_ACTIVE_TEXT), String ("black"));
+ gdk_color_parse (str.c_str (), &_active_text);
+
+ _window_sticked = _config->read (String (SCIM_CONFIG_PANEL_GTK_DEFAULT_STICKED), _window_sticked);
+ _candidate_style = (ISF_CANDIDATE_STYLE_T)_config->read (String (SCIM_CONFIG_PANEL_GTK_LOOKUP_TABLE_STYLE), _candidate_style);
+ _candidate_mode = (ISF_CANDIDATE_MODE_T)_config->read (String (SCIM_CONFIG_PANEL_GTK_LOOKUP_TABLE_MODE), _candidate_mode);
+ _lookup_table_vertical = _config->read (String (SCIM_CONFIG_PANEL_GTK_LOOKUP_TABLE_VERTICAL), _lookup_table_vertical);
+ shared_ise = _config->read (String (SCIM_CONFIG_FRONTEND_SHARED_INPUT_METHOD), shared_ise);
+ _panel_agent->set_should_shared_ise (shared_ise);
+ }
+}
+
+#ifdef GDK_WINDOWING_X11
+/**
+ * @brief GDK X event filter function.
+ *
+ * @param gdk_xevent The handler of GDK X event.
+ * @param event The GdkEvent handler.
+ * @param data The data pointer to pass when it is called.
+ *
+ * @return GDK_FILTER_CONTINUE.
+ */
+static GdkFilterReturn ui_event_filter (GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data)
+{
+ g_return_val_if_fail (gdk_xevent, GDK_FILTER_CONTINUE);
+
+ XEvent *xev = (XEvent*)gdk_xevent;
+
+ if (xev->type == PropertyNotify) {
+ if (xev->xproperty.atom == gdk_x11_get_xatom_by_name ("_NET_WORKAREA") ||
+ xev->xproperty.atom == gdk_x11_get_xatom_by_name ("_NET_CURRENT_DESKTOP")) {
+ }
+ }
+
+ return GDK_FILTER_CONTINUE;
+}
+#endif
+
+/**
+ * @brief UI initialize function.
+ */
+static void ui_initialize (void)
+{
+ SCIM_DEBUG_MAIN (1) << "Initialize UI...\n";
+
+ ui_load_config ();
+
+#if GDK_MULTIHEAD_SAFE
+ // Initialize the Display and Screen.
+ _current_screen = gdk_screen_get_default ();
+#endif
+
+ isf_load_config ();
+ create_and_fill_active_ise_list_store ();
+
+#ifdef GDK_WINDOWING_X11
+ // Add an event filter function to observe X root window's properties.
+ GdkWindow *root_window = gdk_get_default_root_window ();
+#if GDK_MULTIHEAD_SAFE
+ if (_current_screen)
+ root_window = gdk_screen_get_root_window (_current_screen);
+#endif
+ gdk_window_set_events (root_window, (GdkEventMask)GDK_PROPERTY_NOTIFY);
+ gdk_window_add_filter (root_window, ui_event_filter, NULL);
+#endif
+}
+
+/**
+ * @brief Settle candidate window position.
+ *
+ * @param relative It indicates whether candidate position is relative.
+ * @param force It indicates whether candidate position is forced to update.
+ */
+static void ui_settle_input_window (bool relative, bool force)
+{
+ SCIM_DEBUG_MAIN (2) << " Settle input window...\n";
+ if (!_input_window)
+ return;
+
+ if (_window_sticked) {
+ if (force)
+ gtk_window_move (GTK_WINDOW (_input_window), _input_window_x, _input_window_y);
+ return;
+ }
+
+ GtkRequisition ws;
+ gint spot_x, spot_y;
+ gint screen_width, screen_height;
+
+ if (_candidate_mode == LANDSCAPE_HORIZONTAL_CANDIDATE_MODE ||
+ _candidate_mode == LANDSCAPE_VERTICAL_CANDIDATE_MODE) {
+ screen_width = ui_screen_height ();
+ screen_height = ui_screen_width ();
+ } else {
+ screen_width = ui_screen_width ();
+ screen_height = ui_screen_height ();
+ }
+
+ gtk_widget_size_request (_input_window, &ws);
+
+ if (_candidate_left >= 0 || _candidate_top >= 0) {
+ spot_x = _candidate_left;
+ spot_y = _candidate_top;
+ if (spot_x + ws.width > screen_width)
+ spot_x = screen_width - ws.width;
+ if (spot_y + ws.height > screen_height)
+ spot_y = screen_height - ws.height;
+ } else {
+ rectinfo ise_rect;
+ _panel_agent->get_current_ise_rect (ise_rect);
+ //std::cout << " ise x : " << ise_rect.pos_x << " ise y : " << ise_rect.pos_y;
+ //std::cout << " ise width : " << ise_rect.width << " ise height : " << ise_rect.height << "\n";
+
+ if (!relative) {
+ spot_x = _spot_location_x;
+ spot_y = _spot_location_y;
+ } else {
+ spot_x = _input_window_x;
+ spot_y = _input_window_y;
+ }
+
+ if (ise_rect.pos_y > 0 && spot_y + ws.height > (int)ise_rect.pos_y
+ && spot_y < (int)(ise_rect.pos_y + ise_rect.height / 2))
+ spot_y = _spot_location_top_y - ws.height;
+
+ if (spot_x + ws.width > screen_width)
+ spot_x = screen_width - ws.width;
+ if (spot_y + ws.height > screen_height)
+ spot_y = _spot_location_top_y - ws.height;
+ }
+
+ if (spot_x < 0) spot_x = 0;
+ if (spot_y < 0) spot_y = 0;
+
+ gtk_window_get_position (GTK_WINDOW (_input_window), &_input_window_x, &_input_window_y);
+
+ if (spot_x != _input_window_x || spot_y != _input_window_y || force) {
+ if (!_lookup_table_vertical)
+ spot_x = 0;
+
+ gtk_window_move (GTK_WINDOW (_input_window), spot_x, spot_y);
+
+ _input_window_x = spot_x;
+ _input_window_y = spot_y;
+ //std::cout << " candidate x : " << spot_x << " candidate y : " << spot_y << "\n";
+ }
+}
+
+/**
+ * @brief Get screen width.
+ *
+ * @return screen width.
+ */
+static int ui_screen_width (void)
+{
+#if GDK_MULTIHEAD_SAFE
+ if (_current_screen)
+ return gdk_screen_get_width (_current_screen);
+#endif
+ return gdk_screen_width ();
+}
+
+/**
+ * @brief Get screen height.
+ *
+ * @return screen height.
+ */
+static int ui_screen_height (void)
+{
+#if GDK_MULTIHEAD_SAFE
+ if (_current_screen)
+ return gdk_screen_get_height (_current_screen);
+#endif
+ return gdk_screen_height ();
+}
+
+#if GDK_MULTIHEAD_SAFE
+/**
+ * @brief Switch screen.
+ *
+ * @param screen The GdkScreen pointer.
+ */
+static void ui_switch_screen (GdkScreen *screen)
+{
+ if (screen) {
+ if (_input_window) {
+ gtk_window_set_screen (GTK_WINDOW (_input_window), screen);
+
+ _input_window_x = ui_screen_width ();
+ _input_window_y = ui_screen_height ();
+
+ gtk_window_move (GTK_WINDOW (_input_window), _input_window_x, _input_window_y);
+ }
+
+ if (_toolbar_window) {
+ gtk_window_set_screen (GTK_WINDOW (_toolbar_window), screen);
+ }
+
+#ifdef GDK_WINDOWING_X11
+ GdkWindow *root_window = gdk_get_default_root_window ();
+ if (_current_screen)
+ root_window = gdk_screen_get_root_window (_current_screen);
+ gdk_window_set_events (root_window, (GdkEventMask)GDK_PROPERTY_NOTIFY);
+ gdk_window_add_filter (root_window, ui_event_filter, NULL);
+#endif
+
+ ui_settle_input_window ();
+ }
+}
+#endif
+
+/**
+ * @brief Scale pixbuf.
+ *
+ * @param pixbuf The GdkPixbuf pointer.
+ * @param width The dest width.
+ * @param height The dest height.
+ *
+ * @return the pointer of dest GdkPixbuf.
+ */
+static GdkPixbuf * ui_scale_pixbuf (GdkPixbuf *pixbuf,
+ int width,
+ int height)
+{
+ if (pixbuf) {
+ if (gdk_pixbuf_get_width (pixbuf) != width ||
+ gdk_pixbuf_get_height (pixbuf) != height) {
+ GdkPixbuf *dest = gdk_pixbuf_scale_simple (pixbuf, width, height, GDK_INTERP_BILINEAR);
+ g_object_unref (pixbuf);
+ pixbuf = dest;
+ }
+ }
+ return pixbuf;
+}
+
+/**
+ * @brief Create icon.
+ *
+ * @param iconfile The icon file path.
+ * @param xpm The GdkPixbuf pointer of icon.
+ * @param width The dest icon width.
+ * @param height The dest icon height.
+ * @param force_create It indicates whether create one icon when error occurs.
+ *
+ * @return the GtkWidget pointer of dest icon.
+ */
+static GtkWidget * ui_create_icon (const String &iconfile,
+ const char **xpm,
+ int width,
+ int height,
+ bool force_create)
+{
+ String path = iconfile;
+ GdkPixbuf *pixbuf = 0;
+
+ if (path.length ()) {
+ // Not a absolute path, prepend SCIM_ICONDIR
+ if (path [0] != SCIM_PATH_DELIM)
+ path = String (SCIM_ICONDIR) + String (SCIM_PATH_DELIM_STRING) + path;
+
+ pixbuf = gdk_pixbuf_new_from_file (path.c_str (), 0);
+ }
+
+ if (!pixbuf && xpm) {
+ pixbuf = gdk_pixbuf_new_from_xpm_data (xpm);
+ }
+
+ if (!pixbuf && force_create) {
+ if (width <= 0 || height <= 0)
+ return 0;
+
+ pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, true, 8, width, height);
+
+ if (!pixbuf)
+ return 0;
+
+ gdk_pixbuf_fill (pixbuf, 0);
+ }
+
+ if (pixbuf) {
+ if (width <= 0) width = gdk_pixbuf_get_width (pixbuf);
+ if (height <= 0) height = gdk_pixbuf_get_height (pixbuf);
+
+ pixbuf = ui_scale_pixbuf (pixbuf, width, height);
+
+ GtkWidget *icon = gtk_image_new_from_pixbuf (pixbuf);
+ gtk_widget_show (icon);
+
+ gdk_pixbuf_unref (pixbuf);
+
+ return icon;
+ }
+ return 0;
+}
+
+/**
+ * @brief Create up icon.
+ *
+ * @return the GtkWidget pointer of up icon.
+ */
+static GtkWidget * ui_create_up_icon (void)
+{
+ return ui_create_icon (SCIM_UP_ICON_FILE,
+ (const char **) up_xpm,
+ _lookup_icon_size,
+ _lookup_icon_size);
+}
+
+/**
+ * @brief Create left icon.
+ *
+ * @return the GtkWidget pointer of left icon.
+ */
+static GtkWidget * ui_create_left_icon (void)
+{
+ return ui_create_icon (SCIM_LEFT_ICON_FILE,
+ (const char **) left_xpm,
+ _lookup_icon_size,
+ _lookup_icon_size);
+}
+
+/**
+ * @brief Create right icon.
+ *
+ * @return the GtkWidget pointer of right icon.
+ */
+static GtkWidget * ui_create_right_icon (void)
+{
+ return ui_create_icon (SCIM_RIGHT_ICON_FILE,
+ (const char **) right_xpm,
+ _lookup_icon_size,
+ _lookup_icon_size);
+}
+
+/**
+ * @brief Create down icon.
+ *
+ * @return the GtkWidget pointer of down icon.
+ */
+static GtkWidget * ui_create_down_icon (void)
+{
+ return ui_create_icon (SCIM_DOWN_ICON_FILE,
+ (const char **) down_xpm,
+ _lookup_icon_size,
+ _lookup_icon_size);
+}
+
+// Implementation of callback functions
+/**
+ * @brief Callback function for cursor move event of preedit area.
+ *
+ * @param view The ScimStringView pointer.
+ * @param position The caret position.
+ */
+static void ui_preedit_area_move_cursor_cb (ScimStringView *view,
+ guint position)
+{
+ SCIM_DEBUG_MAIN (3) << " ui_preedit_area_move_cursor_cb...\n";
+
+ _panel_agent->move_preedit_caret (position);
+}
+
+/**
+ * @brief Callback function for click event of vertical candidate table.
+ *
+ * @param item The GtkWidget handler.
+ * @param event The GdkEventButton handler for this event.
+ * @param user_data Data pointer to pass when it is called.
+ *
+ * @return true.
+ */
+static gboolean ui_lookup_table_vertical_click_cb (GtkWidget *item,
+ GdkEventButton *event,
+ gpointer user_data)
+{
+ SCIM_DEBUG_MAIN (3) << " ui_lookup_table_vertical_click_cb...\n";
+
+ _panel_agent->select_candidate ((uint32)GPOINTER_TO_INT (user_data));
+
+ return (gboolean)TRUE;
+}
+
+/**
+ * @brief Callback function for click event of horizontal candidate table.
+ *
+ * @param item The GtkWidget handler of candidate string view.
+ * @param position The click position.
+ * @param user_data Data pointer to pass when it is called.
+ */
+static void ui_lookup_table_horizontal_click_cb (GtkWidget *item,
+ guint position,
+ gpointer user_data)
+{
+ SCIM_DEBUG_MAIN (3) << " ui_lookup_table_horizontal_click_cb...\n";
+ uint32 type = (uint32)GPOINTER_TO_INT (user_data);
+
+ int *index = _lookup_table_index;
+ int pos = (int) position - 1;
+ for (int i = 0; i < SCIM_LOOKUP_TABLE_MAX_PAGESIZE && index [i] >= 0; ++i) {
+ if (pos >= index [i] && pos < index [i+1]) {
+ if (type == 0) { // button press event
+ if (_candidate_style == PREDICTION_ENGINE_CANDIDATE_STYLE) {
+ //gtk_widget_style_get (_input_window, "theme-color", &_theme_color, NULL);
+ if (_theme_color != NULL) {
+ gtk_widget_modify_base (item, GTK_STATE_ACTIVE, _theme_color);
+ gdk_color_free (_theme_color);
+ _theme_color = NULL;
+ }
+ }
+ scim_string_view_set_highlight (SCIM_STRING_VIEW (item), index [i], index [i+1]);
+ } else { // button release event
+ _panel_agent->select_candidate ((uint32) i);
+ scim_string_view_set_highlight (SCIM_STRING_VIEW (item), -1, - 1);
+ }
+
+ return;
+ }
+ }
+ scim_string_view_set_highlight (SCIM_STRING_VIEW (item), -1, - 1);
+}
+
+/**
+ * @brief Callback function for up button of candidate table.
+ *
+ * @param button The GtkButton handler.
+ * @param user_data Data pointer to pass when it is called.
+ */
+static void ui_lookup_table_up_button_click_cb (GtkButton *button,
+ gpointer user_data)
+{
+ SCIM_DEBUG_MAIN (3) << " ui_lookup_table_up_button_click_cb...\n";
+
+ _panel_agent->lookup_table_page_up ();
+}
+
+/**
+ * @brief Callback function for down button of candidate table.
+ *
+ * @param button The GtkButton handler.
+ * @param user_data Data pointer to pass when it is called.
+ */
+static void ui_lookup_table_down_button_click_cb (GtkButton *button,
+ gpointer user_data)
+{
+ SCIM_DEBUG_MAIN (3) << " ui_lookup_table_down_button_click_cb...\n";
+
+ _panel_agent->lookup_table_page_down ();
+}
+
+/**
+ * @brief Callback function for click event of vertical associate table.
+ *
+ * @param item The GtkWidget handler.
+ * @param event The GdkEventButton handler for this event.
+ * @param user_data Data pointer to pass when it is called.
+ *
+ * @return true.
+ */
+static gboolean ui_associate_table_vertical_click_cb (GtkWidget *item,
+ GdkEventButton *event,
+ gpointer user_data)
+{
+ SCIM_DEBUG_MAIN (3) << " ui_associate_table_vertical_click_cb...\n";
+
+ _panel_agent->select_associate ((uint32)GPOINTER_TO_INT (user_data));
+
+ return (gboolean)TRUE;
+}
+
+/**
+ * @brief Callback function for click event of horizontal associate table.
+ *
+ * @param item The GtkWidget handler of candidate string view.
+ * @param position The click position.
+ * @param user_data Data pointer to pass when it is called.
+ */
+static void ui_associate_table_horizontal_click_cb (GtkWidget *item,
+ guint position,
+ gpointer user_data)
+{
+ SCIM_DEBUG_MAIN (3) << " ui_associate_table_horizontal_click_cb...\n";
+ uint32 type = (uint32)GPOINTER_TO_INT (user_data);
+
+ int *index = _associate_table_index;
+ int pos = (int) position - 1;
+
+ for (int i = 0; i < SCIM_LOOKUP_TABLE_MAX_PAGESIZE && index [i] >= 0; ++i) {
+ if (pos >= index [i] && pos < index [i+1]) {
+ if (type == 0) { // button press event
+ if (_candidate_style == PREDICTION_ENGINE_CANDIDATE_STYLE) {
+ //gtk_widget_style_get (_input_window, "theme-color", &_theme_color, NULL);
+ if (_theme_color != NULL) {
+ gtk_widget_modify_base (item, GTK_STATE_ACTIVE, _theme_color);
+ gdk_color_free (_theme_color);
+ _theme_color = NULL;
+ }
+ }
+ scim_string_view_set_highlight (SCIM_STRING_VIEW (item), index [i], index [i+1]);
+ } else { // button release event
+ _panel_agent->select_associate ((uint32) i);
+ scim_string_view_set_highlight (SCIM_STRING_VIEW (item), -1, - 1);
+ }
+
+ return;
+ }
+ }
+ scim_string_view_set_highlight (SCIM_STRING_VIEW (item), -1, - 1);
+}
+
+/**
+ * @brief Callback function for up button of associate table.
+ *
+ * @param button The GtkButton handler.
+ * @param user_data Data pointer to pass when it is called.
+ */
+static void ui_associate_table_up_button_click_cb (GtkButton *button,
+ gpointer user_data)
+{
+ SCIM_DEBUG_MAIN (3) << " ui_associate_table_up_button_click_cb...\n";
+
+ _panel_agent->associate_table_page_up ();
+}
+
+/**
+ * @brief Callback function for down button of associate table.
+ *
+ * @param button The GtkButton handler.
+ * @param user_data Data pointer to pass when it is called.
+ */
+static void ui_associate_table_down_button_click_cb (GtkButton *button,
+ gpointer user_data)
+{
+ SCIM_DEBUG_MAIN (3) << " ui_associate_table_down_button_click_cb...\n";
+
+ _panel_agent->associate_table_page_down ();
+}
+
+/**
+ * @brief Callback function for motion event of candidate window.
+ *
+ * @param window The GtkWidget handler.
+ * @param event The GdkEventMotion handler.
+ * @param user_data Data pointer to pass when it is called.
+ *
+ * @return FALSE.
+ */
+static gboolean ui_input_window_motion_cb (GtkWidget *window,
+ GdkEventMotion *event,
+ gpointer user_data)
+{
+ return FALSE;
+}
+
+/**
+ * @brief Callback function for click event of candidate window.
+ *
+ * @param window The GtkWidget handler.
+ * @param event The GdkEventMotion handler.
+ * @param user_data Data pointer to pass when it is called.
+ *
+ * @return TRUE if this operation is successful, otherwise return FALSE.
+ */
+static gboolean ui_input_window_click_cb (GtkWidget *window,
+ GdkEventButton *event,
+ gpointer user_data)
+{
+ int click_type = GPOINTER_TO_INT (user_data);
+ static gulong motion_handler;
+
+ if (click_type == 0) {
+ if (_input_window_draging)
+ return (gboolean)FALSE;
+
+ // Connection pointer motion handler to this window.
+ motion_handler = g_signal_connect (G_OBJECT (window), "motion-notify-event",
+ G_CALLBACK (ui_input_window_motion_cb),
+ NULL);
+
+ _input_window_draging = TRUE;
+ _input_window_drag_x = (gint) event->x_root;
+ _input_window_drag_y = (gint) event->y_root;
+#ifdef ENABLE_CHANGE_CURSOR
+ cursor = gdk_cursor_new (GDK_TOP_LEFT_ARROW);
+
+ // Grab the cursor to prevent losing events.
+ gdk_pointer_grab (window->window, TRUE,
+ (GdkEventMask) (GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK),
+ NULL, cursor, event->time);
+ gdk_cursor_unref (cursor);
+#endif
+ return (gboolean)TRUE;
+ } else if (click_type == 1) {
+ if (!_input_window_draging)
+ return (gboolean)FALSE;
+
+ g_signal_handler_disconnect (G_OBJECT (window), motion_handler);
+ gdk_pointer_ungrab (event->time);
+ _input_window_draging = FALSE;
+
+ gtk_window_get_position (GTK_WINDOW (window), &_input_window_x, &_input_window_y);
+
+ return (gboolean)TRUE;
+ }
+
+ return (gboolean)FALSE;
+}
+
+/**
+ * @brief This function is used to judge whether candidate window should be hidden.
+ *
+ * @return true if candidate window should be hidden, otherwise return false.
+ */
+static bool ui_can_hide_input_window (void)
+{
+ if (!_panel_is_on)
+ return true;
+
+ if (GTK_WIDGET_VISIBLE (_preedit_area) ||
+ GTK_WIDGET_VISIBLE (_aux_area) ||
+ GTK_WIDGET_VISIBLE (_associate_table_window) ||
+ GTK_WIDGET_VISIBLE (_lookup_table_window))
+ return false;
+ return true;
+}
+
+/**
+ * @brief Create pango attribute list.
+ *
+ * @param mbs The source string.
+ * @param attrs The attribute list.
+ *
+ * @return the pointer of PangoAttrList.
+ */
+static PangoAttrList * create_pango_attrlist (const String &mbs,
+ const AttributeList &attrs)
+{
+ PangoAttrList *attrlist = pango_attr_list_new ();
+ PangoAttribute *attr = NULL;
+
+ guint start_index, end_index;
+ guint wlen = g_utf8_strlen (mbs.c_str (), mbs.length ());
+
+ for (int i=0; i < (int) attrs.size (); ++i) {
+ start_index = attrs[i].get_start ();
+ end_index = attrs[i].get_end ();
+
+ if (end_index <= wlen && start_index < end_index) {
+ start_index = g_utf8_offset_to_pointer (mbs.c_str (), attrs[i].get_start ()) - mbs.c_str ();
+ end_index = g_utf8_offset_to_pointer (mbs.c_str (), attrs[i].get_end ()) - mbs.c_str ();
+
+ if (attrs[i].get_type () == SCIM_ATTR_DECORATE) {
+ if (attrs[i].get_value () == SCIM_ATTR_DECORATE_UNDERLINE) {
+ attr = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE);
+ if (attr != NULL) {
+ attr->start_index = start_index;
+ attr->end_index = end_index;
+ pango_attr_list_insert (attrlist, attr);
+ }
+ } else if (attrs[i].get_value () == SCIM_ATTR_DECORATE_REVERSE) {
+ attr = pango_attr_foreground_new (_normal_bg.red, _normal_bg.green, _normal_bg.blue);
+ if (attr != NULL) {
+ attr->start_index = start_index;
+ attr->end_index = end_index;
+ pango_attr_list_insert (attrlist, attr);
+ }
+
+ attr = pango_attr_background_new (_normal_text.red, _normal_text.green, _normal_text.blue);
+ if (attr != NULL) {
+ attr->start_index = start_index;
+ attr->end_index = end_index;
+ pango_attr_list_insert (attrlist, attr);
+ }
+ } else if (attrs[i].get_value () == SCIM_ATTR_DECORATE_HIGHLIGHT) {
+ attr = pango_attr_foreground_new (_active_text.red, _active_text.green, _active_text.blue);
+ if (attr != NULL) {
+ attr->start_index = start_index;
+ attr->end_index = end_index;
+ pango_attr_list_insert (attrlist, attr);
+ }
+
+ attr = pango_attr_background_new (_active_bg.red, _active_bg.green, _active_bg.blue);
+ if (attr != NULL) {
+ attr->start_index = start_index;
+ attr->end_index = end_index;
+ pango_attr_list_insert (attrlist, attr);
+ }
+ }
+ } else if (attrs[i].get_type () == SCIM_ATTR_FOREGROUND) {
+ unsigned int color = attrs[i].get_value ();
+
+ attr = pango_attr_foreground_new (SCIM_RGB_COLOR_RED(color) * 256, SCIM_RGB_COLOR_GREEN(color) * 256, SCIM_RGB_COLOR_BLUE(color) * 256);
+ if (attr != NULL) {
+ attr->start_index = start_index;
+ attr->end_index = end_index;
+ pango_attr_list_insert (attrlist, attr);
+ }
+ } else if (attrs[i].get_type () == SCIM_ATTR_BACKGROUND) {
+ unsigned int color = attrs[i].get_value ();
+
+ attr = pango_attr_background_new (SCIM_RGB_COLOR_RED(color) * 256, SCIM_RGB_COLOR_GREEN(color) * 256, SCIM_RGB_COLOR_BLUE(color) * 256);
+ if (attr != NULL) {
+ attr->start_index = start_index;
+ attr->end_index = end_index;
+ pango_attr_list_insert (attrlist, attr);
+ }
+ }
+ }
+ }
+ return attrlist;
+}
+
+//////////////////////////////////////////////////////////////////////
+// Start of PanelAgent Functions
+//////////////////////////////////////////////////////////////////////
+/**
+ * @brief Initialize panel agent.
+ *
+ * @param config The config string for PanelAgent.
+ * @param display The current display.
+ * @param resident The variable indicates whether panel will be resident.
+ *
+ * @return true if initialize is successful, otherwise return false.
+ */
+static bool initialize_panel_agent (const String &config, const String &display, bool resident)
+{
+ _panel_agent = new PanelAgent ();
+
+ if (!_panel_agent || !_panel_agent->initialize (config, display, resident))
+ return false;
+
+ _panel_agent->signal_connect_transaction_start (slot (slot_transaction_start));
+ _panel_agent->signal_connect_transaction_end (slot (slot_transaction_end));
+ _panel_agent->signal_connect_reload_config (slot (slot_reload_config));
+ _panel_agent->signal_connect_turn_on (slot (slot_turn_on));
+ _panel_agent->signal_connect_turn_off (slot (slot_turn_off));
+ _panel_agent->signal_connect_focus_in (slot (slot_focus_in));
+ _panel_agent->signal_connect_focus_out (slot (slot_focus_out));
+ _panel_agent->signal_connect_show_panel (slot (slot_show_panel));
+ _panel_agent->signal_connect_hide_panel (slot (slot_hide_panel));
+ _panel_agent->signal_connect_update_screen (slot (slot_update_screen));
+ _panel_agent->signal_connect_update_spot_location (slot (slot_update_spot_location));
+ _panel_agent->signal_connect_update_factory_info (slot (slot_update_factory_info));
+ _panel_agent->signal_connect_start_default_ise (slot (slot_start_default_ise));
+ _panel_agent->signal_connect_set_candidate_ui (slot (slot_set_candidate_ui));
+ _panel_agent->signal_connect_get_candidate_ui (slot (slot_get_candidate_ui));
+ _panel_agent->signal_connect_set_candidate_position (slot (slot_set_candidate_position));
+ _panel_agent->signal_connect_get_candidate_rect (slot (slot_get_candidate_rect));
+ _panel_agent->signal_connect_set_keyboard_ise (slot (slot_set_keyboard_ise));
+ _panel_agent->signal_connect_get_keyboard_ise (slot (slot_get_keyboard_ise));
+ _panel_agent->signal_connect_show_preedit_string (slot (slot_show_preedit_string));
+ _panel_agent->signal_connect_show_aux_string (slot (slot_show_aux_string));
+ _panel_agent->signal_connect_show_lookup_table (slot (slot_show_lookup_table));
+ _panel_agent->signal_connect_show_associate_table (slot (slot_show_associate_table));
+ _panel_agent->signal_connect_hide_preedit_string (slot (slot_hide_preedit_string));
+ _panel_agent->signal_connect_hide_aux_string (slot (slot_hide_aux_string));
+ _panel_agent->signal_connect_hide_lookup_table (slot (slot_hide_lookup_table));
+ _panel_agent->signal_connect_hide_associate_table (slot (slot_hide_associate_table));
+ _panel_agent->signal_connect_update_preedit_string (slot (slot_update_preedit_string));
+ _panel_agent->signal_connect_update_preedit_caret (slot (slot_update_preedit_caret));
+ _panel_agent->signal_connect_update_aux_string (slot (slot_update_aux_string));
+ _panel_agent->signal_connect_update_lookup_table (slot (slot_update_candidate_table));
+ _panel_agent->signal_connect_update_associate_table (slot (slot_update_associate_table));
+ _panel_agent->signal_connect_set_active_ise_by_uuid (slot (slot_set_active_ise_by_uuid));
+ _panel_agent->signal_connect_set_active_ise_by_name (slot (slot_set_active_ise_by_name));
+ _panel_agent->signal_connect_get_ise_list (slot (slot_get_ise_list));
+ _panel_agent->signal_connect_get_keyboard_ise_list (slot (slot_get_keyboard_ise_list));
+ _panel_agent->signal_connect_get_language_list (slot (slot_get_language_list));
+ _panel_agent->signal_connect_get_all_language (slot (slot_get_all_language));
+ _panel_agent->signal_connect_get_ise_language (slot (slot_get_ise_language));
+ _panel_agent->signal_connect_set_isf_language (slot (slot_set_isf_language));
+ _panel_agent->signal_connect_get_ise_info_by_uuid (slot (slot_get_ise_info_by_uuid));
+ _panel_agent->signal_connect_get_ise_info_by_name (slot (slot_get_ise_info_by_name));
+ _panel_agent->signal_connect_send_key_event (slot (slot_send_key_event));
+ _panel_agent->signal_connect_lock (slot (slot_lock));
+ _panel_agent->signal_connect_unlock (slot (slot_unlock));
+
+ _panel_agent->get_helper_list (_helper_list);
+ _panel_agent->get_active_ise_list (_load_ise_list);
+
+ return true;
+}
+
+/**
+ * @brief Run PanelAgent thread.
+ *
+ * @return ture if run PanelAgent thread is successful, otherwise return false.
+ */
+static bool run_panel_agent (void)
+{
+ SCIM_DEBUG_MAIN(1) << "run_panel_agent ()\n";
+
+ _panel_agent_thread = NULL;
+
+ if (_panel_agent && _panel_agent->valid ())
+ _panel_agent_thread = g_thread_create (panel_agent_thread_func, NULL, TRUE, NULL);
+
+ return (_panel_agent_thread != NULL);
+}
+
+/**
+ * @brief PanelAgent thread function.
+ *
+ * @param data Data to pass when it is called.
+ *
+ * @return NULL.
+ */
+static gpointer panel_agent_thread_func (gpointer data)
+{
+ SCIM_DEBUG_MAIN(1) << "panel_agent_thread_func ()\n";
+
+ if (!_panel_agent->run ())
+ std::cerr << "Failed to run Panel.\n";
+
+ G_LOCK (_global_resource_lock);
+ _should_exit = true;
+ G_UNLOCK (_global_resource_lock);
+
+ g_thread_exit (NULL);
+ return ((gpointer) NULL);
+}
+
+/**
+ * @brief Start transaction slot function for PanelAgent.
+ */
+static void slot_transaction_start (void)
+{
+ gdk_threads_enter ();
+}
+
+/**
+ * @brief End transaction slot function for PanelAgent.
+ */
+static void slot_transaction_end (void)
+{
+ gdk_threads_leave ();
+}
+
+/**
+ * @brief Reload config slot function for PanelAgent.
+ */
+static void slot_reload_config (void)
+{
+ if (!_config.null ()) _config->reload ();
+}
+
+/**
+ * @brief Turn on slot function for PanelAgent.
+ */
+static void slot_turn_on (void)
+{
+ _panel_is_on = true;
+
+ if (_input_window) {
+ gtk_widget_hide (_input_window);
+ gtk_widget_hide (_lookup_table_window);
+ gtk_widget_hide (_associate_table_window);
+ gtk_widget_hide (_preedit_area);
+ gtk_widget_hide (_aux_area);
+ }
+}
+
+/**
+ * @brief Turn off slot function for PanelAgent.
+ */
+static void slot_turn_off (void)
+{
+ _panel_is_on = false;
+
+ if (_input_window) {
+ gtk_widget_hide (_input_window);
+ gtk_widget_hide (_lookup_table_window);
+ gtk_widget_hide (_associate_table_window);
+ gtk_widget_hide (_preedit_area);
+ gtk_widget_hide (_aux_area);
+ }
+}
+
+/**
+ * @brief Focus in slot function for PanelAgent.
+ */
+static void slot_focus_in (void)
+{
+ if (!GTK_IS_WIDGET (_input_window))
+ create_candidate_window (_candidate_style, _lookup_table_vertical);
+}
+
+/**
+ * @brief Focus out slot function for PanelAgent.
+ */
+static void slot_focus_out (void)
+{
+}
+
+/**
+ * @brief Show control panel slot function for PanelAgent.
+ */
+static void slot_show_panel (void)
+{
+ if (!_toolbar_window)
+ create_panel_window ();
+
+ gtk_widget_show (_toolbar_window);
+ gtk_window_present (GTK_WINDOW (_toolbar_window));
+ gdk_window_raise (_toolbar_window->window);
+
+ GdkDrawable * pixmap = (GdkDrawable *) gdk_pixmap_new (_toolbar_window->window,
+ _panel_width, _panel_height, -1);
+
+ gdk_pixbuf_render_pixmap_and_mask_for_colormap (_panel_bg_pixbuf,
+ gdk_drawable_get_colormap (pixmap),
+ &pixmap,
+ &_panel_window_mask,
+ 128);
+ gtk_widget_shape_combine_mask (_toolbar_window, _panel_window_mask, 0, 0);
+
+ _panel_agent->update_isf_control_status (true);
+}
+
+/**
+ * @brief Hide control panel slot function for PanelAgent.
+ */
+static void slot_hide_panel (void)
+{
+ if (_toolbar_window) {
+ gtk_widget_hide (_toolbar_window);
+ }
+
+ _panel_agent->update_isf_control_status (false);
+}
+
+/**
+ * @brief Update screen slot function for PanelAgent.
+ *
+ * @param num The screen number.
+ */
+static void slot_update_screen (int num)
+{
+#if GDK_MULTIHEAD_SAFE
+ if (gdk_display_get_n_screens (gdk_display_get_default ()) > num) {
+
+ GdkScreen *screen = gdk_display_get_screen (gdk_display_get_default (), num);
+
+ if (screen) {
+#ifdef GDK_WINDOWING_X11
+ GdkWindow *root_window = gdk_get_default_root_window ();
+ if (_current_screen)
+ root_window = gdk_screen_get_root_window (_current_screen);
+ gdk_window_remove_filter (root_window, ui_event_filter, NULL);
+#endif
+
+ _current_screen = screen;
+ ui_switch_screen (screen);
+ }
+ }
+#endif
+}
+
+/**
+ * @brief Update keyboard ISE information slot function for PanelAgent.
+ *
+ * @param info The information of current Keyboard ISE.
+ */
+static void slot_update_factory_info (const PanelFactoryInfo &info)
+{
+ String ise_name = info.name;
+ String ise_icon = info.icon;
+
+ TOOLBAR_MODE_T mode = _panel_agent->get_current_toolbar_mode ();
+
+ if (TOOLBAR_HELPER_MODE == mode)
+ ise_name = _panel_agent->get_current_helper_name ();
+
+ if (ise_name.length () > 0) {
+ _panel_agent->set_current_ise_name (ise_name);
+
+ gchar *name = 0, *icon_file = 0;
+ GtkTreeIter iter;
+
+ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (_active_ise_list_store), &iter)) {
+ do {
+ gtk_tree_model_get (GTK_TREE_MODEL (_active_ise_list_store), &iter, ACTIVE_ISE_NAME, &name, -1);
+
+ if (name == (void *)0)
+ continue;
+
+ if (!strcmp (name, ise_name.c_str ())) {
+ gtk_tree_model_get (GTK_TREE_MODEL (_active_ise_list_store), &iter, ACTIVE_ISE_ICON, &icon_file, -1);
+ ise_icon = String (icon_file);
+ gtk_list_store_set (GTK_LIST_STORE (_active_ise_list_store), &iter,
+ ACTIVE_ISE_LIST_ENABLE, TRUE, -1);
+ } else {
+ gtk_list_store_set (GTK_LIST_STORE (_active_ise_list_store), &iter,
+ ACTIVE_ISE_LIST_ENABLE, FALSE, -1);
+ }
+ if (name) {
+ g_free (name);
+ name = 0;
+ }
+ if (icon_file) {
+ g_free (icon_file);
+ icon_file = 0;
+ }
+ } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (_active_ise_list_store), &iter));
+ }
+ }
+}
+
+/**
+ * @brief Update cursor position slot function for PanelAgent.
+ *
+ * @param x The x position of current cursor.
+ * @param y The bottom y position of current cursor.
+ * @param top_y The top y position of current cursor.
+ */
+static void slot_update_spot_location (int x, int y, int top_y)
+{
+ if (x >= 0 && x < ui_screen_width () && y >= 0 && y < ui_screen_height ()) {
+ _spot_location_x = x;
+ _spot_location_y = y;
+ _spot_location_top_y = top_y;
+
+ ui_settle_input_window ();
+ }
+}
+
+/**
+ * @brief Show preedit slot function for PanelAgent.
+ */
+static void slot_show_preedit_string (void)
+{
+ if (!_preedit_area)
+ return;
+
+ gtk_widget_show (_preedit_area);
+
+ if (_panel_is_on && !GTK_WIDGET_VISIBLE (_input_window)) {
+ gtk_widget_show (_input_window);
+ gdk_window_raise (_input_window->window);
+ }
+
+ ui_settle_input_window (false, true);
+ update_separator_status ();
+}
+
+/**
+ * @brief Show aux slot function for PanelAgent.
+ */
+static void slot_show_aux_string (void)
+{
+ if (!_aux_area)
+ return;
+
+ gtk_widget_show (_aux_area);
+
+ if (_panel_is_on && !GTK_WIDGET_VISIBLE (_input_window)) {
+ gtk_widget_show (_input_window);
+ gdk_window_raise (_input_window->window);
+ }
+
+ ui_settle_input_window (false, true);
+ update_separator_status ();
+}
+
+/**
+ * @brief Show candidate table slot function for PanelAgent.
+ */
+static void slot_show_lookup_table (void)
+{
+ if (!_lookup_table_window)
+ return;
+
+ gtk_widget_show (_lookup_table_window);
+ _candidate_is_showed = true;
+
+ if (_panel_is_on) {
+ if (!GTK_WIDGET_VISIBLE (_input_window)) {
+ gtk_widget_show (_input_window);
+ gdk_window_raise (_input_window->window);// Move the window up in case it is not at the top
+ gtk_window_present (GTK_WINDOW (_input_window));
+ }
+ //ui_settle_input_window (false, true);
+ }
+
+ update_separator_status ();
+}
+
+/**
+ * @brief Show associate table slot function for PanelAgent.
+ */
+static void slot_show_associate_table (void)
+{
+ if (!_associate_table_window)
+ return;
+
+ gtk_widget_show (_associate_table_window);
+
+ if (_panel_is_on) {
+ if (!GTK_WIDGET_VISIBLE (_input_window)) {
+ gtk_widget_show (_input_window);
+ gdk_window_raise (_input_window->window);
+ }
+ ui_settle_input_window (false, true);
+ }
+
+ update_separator_status ();
+}
+
+/**
+ * @brief Hide preedit slot function for PanelAgent.
+ */
+static void slot_hide_preedit_string (void)
+{
+ SCIM_DEBUG_MAIN (1) << "slot_hide_preedit_string\n";
+ if (!_preedit_area)
+ return;
+
+ gtk_widget_hide (_preedit_area);
+ scim_string_view_set_text (SCIM_STRING_VIEW (_preedit_area), "");
+
+ if (ui_can_hide_input_window ())
+ gtk_widget_hide (_input_window);
+}
+
+/**
+ * @brief Hide aux slot function for PanelAgent.
+ */
+static void slot_hide_aux_string (void)
+{
+ if (!_aux_area)
+ return;
+
+ gtk_widget_hide (_aux_area);
+ scim_string_view_set_text (SCIM_STRING_VIEW (_aux_area), "");
+
+ if (ui_can_hide_input_window ())
+ gtk_widget_hide (_input_window);
+
+ update_separator_status ();
+}
+
+/**
+ * @brief Hide candidate table slot function for PanelAgent.
+ */
+static void slot_hide_lookup_table (void)
+{
+ if (!_lookup_table_window)
+ return;
+
+ slot_lock ();
+ g_isf_candidate_table.clear ();
+ if (_candidate_timer) {
+ g_source_remove (_candidate_timer);
+ _candidate_timer = 0;
+ }
+ slot_unlock ();
+
+ gtk_widget_hide (_lookup_table_window);
+ _candidate_is_showed = false;
+
+ if (ui_can_hide_input_window ())
+ gtk_widget_hide (_input_window);
+
+ update_separator_status ();
+}
+
+/**
+ * @brief Hide associate table slot function for PanelAgent.
+ */
+static void slot_hide_associate_table (void)
+{
+ if (!_associate_table_window)
+ return;
+
+ gtk_widget_hide (_associate_table_window);
+
+ if (ui_can_hide_input_window ())
+ gtk_widget_hide (_input_window);
+
+ update_separator_status ();
+}
+
+/**
+ * @brief Update preedit slot function for PanelAgent.
+ *
+ * @param str The new preedit string.
+ * @param attrs The attribute list of new preedit string.
+ */
+static void slot_update_preedit_string (const String &str, const AttributeList &attrs)
+{
+ if (!GTK_IS_WIDGET (_preedit_area))
+ create_candidate_window (_candidate_style, _lookup_table_vertical);
+
+ PangoAttrList *attrlist = create_pango_attrlist (str, attrs);
+
+ scim_string_view_set_attributes (SCIM_STRING_VIEW (_preedit_area), attrlist);
+ scim_string_view_set_text (SCIM_STRING_VIEW (_preedit_area), str.c_str ());
+
+ pango_attr_list_unref (attrlist);
+
+ ui_settle_input_window (false);
+}
+
+/**
+ * @brief Update caret slot function for PanelAgent.
+ *
+ * @param caret The caret position.
+ */
+static void slot_update_preedit_caret (int caret)
+{
+ if (!GTK_IS_WIDGET (_preedit_area))
+ create_candidate_window (_candidate_style, _lookup_table_vertical);
+
+ scim_string_view_set_position (SCIM_STRING_VIEW (_preedit_area), caret);
+}
+
+/**
+ * @brief Update aux slot function for PanelAgent.
+ *
+ * @param str The new aux string.
+ * @param attrs The attribute list of new aux string.
+ */
+static void slot_update_aux_string (const String &str, const AttributeList &attrs)
+{
+ if (!GTK_IS_WIDGET (_aux_area))
+ create_candidate_window (_candidate_style, _lookup_table_vertical);
+
+ PangoAttrList *attrlist = create_pango_attrlist (str, attrs);
+
+ String strAux = String (" ") + str;
+ scim_string_view_set_attributes (SCIM_STRING_VIEW (_aux_area), attrlist);
+ scim_string_view_set_text (SCIM_STRING_VIEW (_aux_area), strAux.c_str ());
+
+ pango_attr_list_unref (attrlist);
+
+ ui_settle_input_window (false);
+}
+
+/**
+ * @brief Update candidate/associate table.
+ *
+ * @param table_type The table type.
+ * @param table The lookup table for candidate or associate.
+ * @param table_items The table items for candidate or associate.
+ * @param table_index The index for candidate string or associate string.
+ * @param table_index_pos The index position for candidate or associate.
+ * @param scroll The candidate scroller or associate scroller.
+ */
+static void update_table (const int table_type, const LookupTable &table,
+ GtkWidget *table_items[], int table_index[], int table_index_pos[],
+ GtkWidget *scroll)
+{
+ int i;
+ int item_num = table.get_current_page_size ();
+
+ String mbs, tmp_mbs;
+ WideString wcs;
+ WideString label;
+ GtkRequisition size = {0, 0};
+ AttributeList attrs;
+ PangoAttrList *attrlist = NULL;
+ int max_width = 0;
+
+ if (_lookup_table_vertical) {
+ int show_line = VERTICAL_SHOW_LINE;
+
+ if (_candidate_style == PREDICTION_ENGINE_CANDIDATE_STYLE)
+ gtk_range_set_value (GTK_RANGE ((GTK_SCROLLED_WINDOW (scroll))->vscrollbar), 0);
+ for (i = 0; i < SCIM_LOOKUP_TABLE_MAX_PAGESIZE; ++ i) {
+ if (i < item_num) {
+ mbs = String ();
+
+ wcs = table.get_candidate_in_current_page (i);
+
+ if (_candidate_style == PREDICTION_ENGINE_CANDIDATE_STYLE) {
+ label = utf8_mbstowcs ("");
+ } else {
+ label = table.get_candidate_label (i);
+
+ if (label.length ()) {
+ label += utf8_mbstowcs (".");
+ }
+ }
+
+ mbs = utf8_wcstombs (label+wcs);
+
+ scim_string_view_set_text (SCIM_STRING_VIEW (table_items [i]), mbs.c_str ());
+
+ gtk_widget_size_request (table_items [i], &size);
+ max_width = max_width > size.width ? max_width : size.width;
+
+ if ((size.height * (i + 1)) > (gdk_screen_height () / 3))
+ show_line = show_line < i + 1 ? show_line : i + 1;
+
+ if (_candidate_style != PREDICTION_ENGINE_CANDIDATE_STYLE) {
+ if ((i + 1) == show_line)
+ item_num = i + 1;
+ }
+
+ // Update attributes
+ attrs = table.get_attributes_in_current_page (i);
+
+ if (attrs.size ()) {
+ for (AttributeList::iterator ait = attrs.begin (); ait != attrs.end (); ++ait)
+ ait->set_start (ait->get_start () + label.length ());
+
+ attrlist = create_pango_attrlist (mbs, attrs);
+ scim_string_view_set_attributes (SCIM_STRING_VIEW (table_items [i]), attrlist);
+ pango_attr_list_unref (attrlist);
+ } else {
+ scim_string_view_set_attributes (SCIM_STRING_VIEW (table_items [i]), 0);
+ }
+
+ gtk_widget_show (table_items [i]);
+ } else {
+ gtk_widget_hide (table_items [i]);
+ }
+ }
+ if (_candidate_style == PREDICTION_ENGINE_CANDIDATE_STYLE) {
+ if (item_num < show_line)
+ gtk_widget_set_size_request (scroll, max_width + size.height*2/3 + BLANK_SIZE, item_num*size.height);
+ else
+ gtk_widget_set_size_request (scroll, max_width + size.height*2/3 + BLANK_SIZE, show_line*size.height);
+ }
+ } else {
+ table_index [0] = 0;
+ table_index_pos [0] = 0;
+ if (_candidate_style == PREDICTION_ENGINE_CANDIDATE_STYLE)
+ gtk_range_set_value (GTK_RANGE ((GTK_SCROLLED_WINDOW (scroll))->hscrollbar), 0);
+ for (i = 0; i < SCIM_LOOKUP_TABLE_MAX_PAGESIZE; ++i) {
+ if (i < item_num) {
+ // Update attributes
+ AttributeList item_attrs = table.get_attributes_in_current_page (i);
+ size_t attr_start, attr_end;
+
+ if (_candidate_style == PREDICTION_ENGINE_CANDIDATE_STYLE) {
+ if (i > 0)
+ label = utf8_mbstowcs (_split_string1);
+ else
+ label = utf8_mbstowcs (_space_string);
+ } else {
+ label = table.get_candidate_label (i);
+
+ if (label.length ()) {
+ label += utf8_mbstowcs (".");
+ } else {
+ if (i > 0)
+ label = utf8_mbstowcs (" ");
+ }
+ }
+ wcs += label;
+
+ attr_start = wcs.length ();
+
+ wcs += table.get_candidate_in_current_page (i);
+
+ attr_end = wcs.length ();
+
+ wcs = wcs + utf8_mbstowcs (_split_string2);
+
+ table_index [i+1] = wcs.length ();
+
+ tmp_mbs = mbs;
+ mbs = utf8_wcstombs (wcs);
+
+ scim_string_view_set_text (SCIM_STRING_VIEW (table_items [0]), mbs.c_str ());
+
+ gtk_widget_size_request (table_items [0], &size);
+ table_index_pos [i+1] = size.width;
+ if (_candidate_style != PREDICTION_ENGINE_CANDIDATE_STYLE) {
+ if (i > 0 && size.width > (ui_screen_width () - 2*_lookup_icon_size - 2) && !table.is_page_size_fixed ()) {
+ item_num = i;
+ mbs = tmp_mbs;
+ scim_string_view_set_text (SCIM_STRING_VIEW (table_items [0]), mbs.c_str ());
+ }
+ }
+
+ if (item_attrs.size ()) {
+ for (AttributeList::iterator ait = item_attrs.begin (); ait != item_attrs.end (); ++ait) {
+ ait->set_start (ait->get_start () + attr_start);
+ if (ait->get_end () + attr_start > attr_end)
+ ait->set_length (attr_end - ait->get_start ());
+ }
+
+ attrs.insert (attrs.end (), item_attrs.begin (), item_attrs.end ());
+ }
+
+ } else {
+ table_index [i+1] = -1;
+ table_index_pos [i+1] = -1;
+ }
+ }
+
+ if (attrs.size ()) {
+ attrlist = create_pango_attrlist (mbs, attrs);
+ scim_string_view_set_attributes (SCIM_STRING_VIEW (table_items [0]), attrlist);
+ pango_attr_list_unref (attrlist);
+ } else {
+ scim_string_view_set_attributes (SCIM_STRING_VIEW (table_items [0]), 0);
+ }
+ }
+
+ int nCandidateCount = table.number_of_candidates ();
+ if (table_type == CANDIDATE_TABLE) {
+ if (_candidate_style == SCIM_CANDIDATE_STYLE) {
+ if (table.get_current_page_start ())
+ gtk_widget_set_sensitive (_lookup_table_up_button, TRUE);
+ else
+ gtk_widget_set_sensitive (_lookup_table_up_button, FALSE);
+
+ if (table.get_current_page_start () + item_num < nCandidateCount)
+ gtk_widget_set_sensitive (_lookup_table_down_button, TRUE);
+ else
+ gtk_widget_set_sensitive (_lookup_table_down_button, FALSE);
+
+ if (item_num < table.get_current_page_size ())
+ _panel_agent->update_lookup_table_page_size (item_num);
+ }
+
+ if (SCIM_STRING_VIEW (_lookup_table_items [0])->highlight_start != -1 ||
+ SCIM_STRING_VIEW (_lookup_table_items [0])->highlight_end != -1) {
+ scim_string_view_set_highlight (SCIM_STRING_VIEW (_lookup_table_items [0]), -1, -1);
+ }
+ } else if (table_type == ASSOCIATE_TABLE) {
+ if (_candidate_style == SCIM_CANDIDATE_STYLE) {
+ if (table.get_current_page_start ())
+ gtk_widget_set_sensitive (_associate_table_up_button, TRUE);
+ else
+ gtk_widget_set_sensitive (_associate_table_up_button, FALSE);
+
+ if (table.get_current_page_start () + item_num < nCandidateCount)
+ gtk_widget_set_sensitive (_associate_table_down_button, TRUE);
+ else
+ gtk_widget_set_sensitive (_associate_table_down_button, FALSE);
+
+ if (item_num < table.get_current_page_size ())
+ _panel_agent->update_associate_table_page_size (item_num);
+ }
+ if (SCIM_STRING_VIEW (_associate_table_items [0])->highlight_start != -1 ||
+ SCIM_STRING_VIEW (_associate_table_items [0])->highlight_end != -1) {
+ scim_string_view_set_highlight (SCIM_STRING_VIEW (_associate_table_items [0]), -1, -1);
+ }
+ }
+
+ //ui_settle_input_window ();
+}
+
+/**
+ * @brief Update candidate table slot function for PanelAgent.
+ *
+ * @param table The lookup table for candidate.
+ */
+static void slot_update_candidate_table (const LookupTable &table)
+{
+ if (!GTK_IS_WIDGET (_lookup_table_window))
+ create_candidate_window (_candidate_style, _lookup_table_vertical);
+
+ //update_table (CANDIDATE_TABLE, table, _lookup_table_items,
+ // _lookup_table_index, _lookup_table_index_pos, _candidate_scroll);
+ slot_lock ();
+ if (_candidate_timer) {
+ g_source_remove (_candidate_timer);
+ _candidate_timer = 0;
+ }
+ _candidate_timer = g_timeout_add (200, candidate_show_timeout_cb, GINT_TO_POINTER (CANDIDATE_TABLE));
+ slot_unlock ();
+}
+
+/**
+ * @brief Update associate table slot function for PanelAgent.
+ *
+ * @param table The lookup table for associate.
+ */
+static void slot_update_associate_table (const LookupTable &table)
+{
+ if (!GTK_IS_WIDGET (_associate_table_window))
+ create_candidate_window (_candidate_style, _lookup_table_vertical);
+
+ update_table (ASSOCIATE_TABLE, table, _associate_table_items,
+ _associate_table_index, _associate_table_index_pos, _associate_scroll);
+}
+
+/**
+ * @brief Set active ISE slot function for PanelAgent.
+ *
+ * @param ise_uuid The active ISE's uuid.
+ */
+static void slot_set_active_ise_by_uuid (const String &ise_uuid, bool changeDefault)
+{
+ set_active_ise_by_uuid (ise_uuid, changeDefault);
+ return;
+}
+
+/**
+ * @brief Set active ISE slot function for PanelAgent.
+ *
+ * @param ise_name The active ISE's name.
+ */
+static void slot_set_active_ise_by_name (const String &ise_name)
+{
+ set_active_ise_by_name (ise_name);
+ return;
+}
+
+/**
+ * @brief Get all ISEs list slot function for PanelAgent.
+ *
+ * @param list The list is used to store all ISEs.
+ *
+ * @return true if this operation is successful, otherwise return false.
+ */
+static bool slot_get_ise_list (std::vector<String> &list)
+{
+ bool ret = true;
+
+ std::vector<String> selected_lang;
+ get_selected_languages (selected_lang);
+ get_interested_iselist_in_languages (selected_lang, list);
+
+ return ret;
+}
+
+/**
+ * @brief Get keyboard ISEs list slot function for PanelAgent.
+ *
+ * @param list The list is used to store keyboard ISEs.
+ *
+ * @return true if this operation is successful, otherwise return false.
+ */
+static bool slot_get_keyboard_ise_list (std::vector<String> &list)
+{
+ gchar *uuid = 0;
+ gint ise_type = 0;
+ GtkTreeIter iter;
+
+ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (_active_ise_list_store), &iter)) {
+ do {
+ gtk_tree_model_get (GTK_TREE_MODEL (_active_ise_list_store), &iter,
+ ACTIVE_ISE_UUID, &uuid,
+ ACTIVE_ISE_TYPE, &ise_type, -1);
+ if (ise_type == TOOLBAR_KEYBOARD_MODE)
+ list.push_back (uuid);
+ if (uuid) {
+ g_free (uuid);
+ uuid = 0;
+ }
+ } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (_active_ise_list_store), &iter));
+ }
+
+ return true;
+}
+
+/**
+ * @brief Get enable languages list slot function for PanelAgent.
+ *
+ * @param list The list is used to store languages.
+ */
+static void slot_get_language_list (std::vector<String> &list)
+{
+ String lang_name;
+ MapStringVectorSizeT::iterator iter = _groups.begin ();
+
+ for (; iter != _groups.end (); iter++) {
+ lang_name = scim_get_language_name (iter->first);
+ if (std::find (_disabled_langs.begin (), _disabled_langs.end (), lang_name) ==_disabled_langs.end ())
+ list.push_back (lang_name);
+ }
+
+ return;
+}
+
+/**
+ * @brief Get all languages list slot function for PanelAgent.
+ *
+ * @param lang The list is used to store languages.
+ */
+static void slot_get_all_language (std::vector<String> &lang)
+{
+ get_all_languages (lang);
+}
+
+/**
+ * @brief Get specific ISE language list slot function for PanelAgent.
+ *
+ * @param name The ISE name.
+ * @param list The list is used to store ISE languages.
+ */
+static void slot_get_ise_language (char *name, std::vector<String> &list)
+{
+ if (name == NULL)
+ return;
+
+ unsigned int num = _names.size ();
+ std::vector<String> list_tmp;
+ list_tmp.clear ();
+ for (unsigned int i = 0; i < num; i++) {
+ if (!strcmp (_names[i].c_str (), name)) {
+ scim_split_string_list (list_tmp, _langs[i], ',');
+ for (i = 0; i < list_tmp.size (); i++)
+ list.push_back (scim_get_language_name (list_tmp[i]));
+ return;
+ }
+ }
+
+ return;
+}
+
+/**
+ * @brief Set ISF language slot function for PanelAgent.
+ *
+ * @param language The ISF language string.
+ */
+static void slot_set_isf_language (const String &language)
+{
+ SCIM_DEBUG_MAIN (1) << "<PanelGtk> enter slot_set_isf_language:" << language << "\n";
+
+ if (language.length () <= 0)
+ return;
+
+ std::vector<String> langlist, all_langs;
+ scim_split_string_list (langlist, language);
+ get_all_languages (all_langs);
+
+ _disabled_langs.clear ();
+ _disabled_langs_bak.clear ();
+ for (unsigned int i = 0; i < all_langs.size (); i++) {
+ if (std::find (langlist.begin (), langlist.end (), all_langs[i]) == langlist.end ()) {
+ _disabled_langs.push_back (all_langs[i]);
+ _disabled_langs_bak.push_back (all_langs[i]);
+ }
+ }
+ update_active_ise_list_store (true);
+
+ scim_global_config_write (String (SCIM_GLOBAL_CONFIG_DISABLED_LANGS), _disabled_langs);
+
+ std::vector<String> enable_langs;
+ for (MapStringVectorSizeT::iterator it = _groups.begin (); it != _groups.end (); ++it) {
+ String lang_name = scim_get_language_name (it->first);
+ if (std::find (_disabled_langs.begin (), _disabled_langs.end (), lang_name) == _disabled_langs.end ())
+ enable_langs.push_back (lang_name);
+ }
+ scim_global_config_write (String (SCIM_GLOBAL_CONFIG_ISF_DEFAULT_LANGUAGES), enable_langs);
+ scim_global_config_flush ();
+
+ return;
+}
+
+/**
+ * @brief Get ISE information slot function for PanelAgent.
+ *
+ * @param uuid The ISE uuid.
+ * @param info The variable is used to store ISE information.
+ *
+ * @return true if this operation is successful, otherwise return false.
+ */
+static bool slot_get_ise_info_by_uuid (const String &uuid, ISE_INFO &info)
+{
+ for (unsigned int i = 0; i < _uuids.size (); i++) {
+ if (!uuid.compare (_uuids[i])) {
+ info.uuid = _uuids[i];
+ info.name = _names[i];
+ info.icon = _icons[i];
+ info.lang = _langs[i];
+ info.option = _options[i];
+ info.type = _modes[i];
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * @brief Get ISE information slot function for PanelAgent.
+ *
+ * @param name The ISE name.
+ * @param info The variable is used to store ISE information.
+ *
+ * @return true if this operation is successful, otherwise return false.
+ */
+static bool slot_get_ise_info_by_name (const String &name, ISE_INFO &info)
+{
+ for (unsigned int i = 0; i < _names.size (); i++) {
+ if (!name.compare (_names[i])) {
+ info.uuid = _uuids[i];
+ info.name = _names[i];
+ info.icon = _icons[i];
+ info.lang = _langs[i];
+ info.option = _options[i];
+ info.type = _modes[i];
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * @brief Set candidate style slot function for PanelAgent.
+ *
+ * @param style The new candidate style.
+ * @param mode The new candidate mode.
+ */
+static void slot_set_candidate_ui (int style, int mode)
+{
+ if (GTK_IS_WIDGET (_input_window) && style == _candidate_style && mode == _candidate_mode)
+ return;
+
+ //int degree = 0;
+ bool vertical = false;
+ if (mode == PORTRAIT_VERTICAL_CANDIDATE_MODE || mode == LANDSCAPE_VERTICAL_CANDIDATE_MODE) {
+ vertical = true;
+ }
+ /*if (GTK_IS_WIDGET (_input_window))
+ {
+ gtk_window_get_rotate (GTK_WINDOW (_input_window), °ree);
+ }*/
+
+ if (GTK_IS_WIDGET (_input_window) && _candidate_style == style && _lookup_table_vertical == vertical) {
+ if (mode == LANDSCAPE_HORIZONTAL_CANDIDATE_MODE || mode == LANDSCAPE_VERTICAL_CANDIDATE_MODE) {
+ //if (degree == PORTRAIT_DEGREE)
+ {
+#if HAVE_GCONF
+ gtk_window_set_rotate (GTK_WINDOW (_input_window), LANDSCAPE_DEGREE);
+#endif
+ if (mode == LANDSCAPE_HORIZONTAL_CANDIDATE_MODE)
+ gtk_widget_set_size_request (GTK_WIDGET (_input_window), gdk_screen_height (), -1);
+ }
+ } else {
+ //if (degree == LANDSCAPE_DEGREE)
+ {
+#if HAVE_GCONF
+ gtk_window_set_rotate (GTK_WINDOW (_input_window), PORTRAIT_DEGREE);
+#endif
+ if (mode == PORTRAIT_HORIZONTAL_CANDIDATE_MODE)
+ gtk_widget_set_size_request (GTK_WIDGET (_input_window), gdk_screen_width (), -1);
+ }
+ }
+ _candidate_mode = (ISF_CANDIDATE_MODE_T)mode;
+ _config->write (String (SCIM_CONFIG_PANEL_GTK_LOOKUP_TABLE_MODE), mode);
+ _config->flush ();
+ } else {
+ _candidate_style = (ISF_CANDIDATE_STYLE_T)style;
+ _candidate_mode = (ISF_CANDIDATE_MODE_T)mode;
+ _lookup_table_vertical = vertical;
+
+ _config->write (String (SCIM_CONFIG_PANEL_GTK_LOOKUP_TABLE_STYLE), style);
+ _config->write (String (SCIM_CONFIG_PANEL_GTK_LOOKUP_TABLE_MODE), mode);
+ _config->write (String (SCIM_CONFIG_PANEL_GTK_LOOKUP_TABLE_VERTICAL), vertical);
+ _config->flush ();
+
+ //_panel_agent->reset_keyboard_ise ();
+ slot_hide_preedit_string ();
+ slot_hide_aux_string ();
+ slot_hide_lookup_table ();
+ slot_hide_associate_table ();
+ create_candidate_window ((ISF_CANDIDATE_STYLE_T)style, vertical);
+ }
+}
+
+/**
+ * @brief Get candidate style slot function for PanelAgent.
+ *
+ * @param style The current candidate style.
+ * @param mode The current candidate mode.
+ */
+static void slot_get_candidate_ui (int &style, int &mode)
+{
+ style = _candidate_style;
+ mode = _candidate_mode;
+}
+
+/**
+ * @brief Set candidate position slot function for PanelAgent.
+ *
+ * @param left The new candidate left position.
+ * @param top The new candidate top position.
+ */
+static void slot_set_candidate_position (int left, int top)
+{
+ SCIM_DEBUG_MAIN (3) << "[slot_set_candidate_position] left=" << left << " top=" << top << "\n";
+ _candidate_left = left;
+ _candidate_top = top;
+
+ ui_settle_input_window ();
+
+ // Set a transient window for window stack
+ // Gets the current XID of the active window into the root window property
+ if (GTK_IS_WINDOW (_input_window)) {
+ Atom type_return;
+ gulong nitems_return;
+ gulong bytes_after_return;
+ gint format_return;
+ guchar *data = NULL;
+ Window xParentWindow;
+ GdkDisplay *display = gdk_drawable_get_display (_input_window->window);
+ gdk_error_trap_push ();
+ if (XGetWindowProperty (gdk_x11_get_default_xdisplay (), gdk_x11_get_default_root_xwindow (),
+ gdk_x11_get_xatom_by_name_for_display (display, "_ISF_ACTIVE_WINDOW"),
+ 0, G_MAXLONG, False, ((Atom) 33), &type_return,
+ &format_return, &nitems_return, &bytes_after_return,
+ &data) == Success) {
+ if ((type_return == ((Atom) 33)) && (format_return == 32) && (data)) {
+ xParentWindow = *(Window *)data;
+
+ //printf ("#Mcf-Now ISE get the active window XID : %d\n", xParentWindow);
+
+ if (xParentWindow == 0) {
+ if (!GTK_WIDGET_VISIBLE (GTK_WINDOW (_input_window))) {
+ gtk_window_set_type_hint (GTK_WINDOW (_input_window), GDK_WINDOW_TYPE_HINT_NOTIFICATION);
+ }
+ } else {
+ if (!GTK_WIDGET_VISIBLE (GTK_WINDOW (_input_window))) {
+ gtk_window_set_type_hint (GTK_WINDOW (_input_window), GDK_WINDOW_TYPE_HINT_UTILITY);
+ }
+ XSetTransientForHint (GDK_WINDOW_XDISPLAY (_input_window->window),
+ GDK_WINDOW_XID (_input_window->window),
+ xParentWindow);
+ }
+ gdk_window_raise (_input_window->window);
+ if (data)
+ XFree (data);
+ }
+ }
+ if (gdk_error_trap_pop ()) {
+ /* FIXUP: monitor 'Invalid Window' error -mbqu */
+ std::cout << "Oops!!!!!! X error in slot_set_candidate_position()!!!" << "\n";
+ }
+ }
+}
+
+/**
+ * @brief Get candidate rect slot function for PanelAgent.
+ *
+ * @param info The data is used to store candidate position and size.
+ */
+static void slot_get_candidate_rect (struct rectinfo &info)
+{
+ if (!GTK_IS_WIDGET (_input_window))
+ create_candidate_window (_candidate_style, _lookup_table_vertical);
+
+ gint x = 0;
+ gint y = 0;
+ gint width = 0;
+ gint height = 0;
+ if (GTK_IS_WIDGET (_input_window)) {
+ gtk_window_get_position (GTK_WINDOW (_input_window), &x, &y);
+ if (GTK_WIDGET_VISIBLE (_input_window)) {
+ gtk_window_get_size (GTK_WINDOW (_input_window), &width, &height);
+ } else {
+ gtk_widget_hide (_preedit_area);
+ gtk_widget_hide (_aux_area);
+ gtk_widget_show (_lookup_table_window);
+ gtk_widget_hide (_associate_table_window);
+ gtk_widget_hide (_candidate_separator);
+ gtk_widget_hide (_associate_separator);
+ gtk_widget_hide (_middle_separator);
+ gtk_window_get_size (GTK_WINDOW (_input_window), &width, &height);
+ gtk_widget_hide (_lookup_table_window);
+ }
+ }
+ info.pos_x = x;
+ info.pos_y = y;
+ info.width = width;
+ info.height = height;
+ //std::cout << "[slot_get_candidate_rect] x=" << x << " y=" << y << " width=" << width << " height=" << height << "\n";
+}
+
+/**
+ * @brief Set keyboard ISE slot function for PanelAgent.
+ *
+ * @param type The variable is ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_NAME
+ or ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID.
+ * @param ise The variable is ISE name or ISE uuid.
+ */
+static void slot_set_keyboard_ise (int type, const String &ise)
+{
+ if (ise.length () <= 0)
+ return;
+
+ String ise_name, ise_uuid;
+ if (type == ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_NAME) {
+ ise_name = ise;
+ ise_uuid = String ("");
+ } else {
+ ise_name = String ("");
+ ise_uuid = ise;
+ }
+
+ bool ret = false;
+ gchar *name = 0;
+ gchar *uuid = 0;
+ GtkTreeIter iter;
+
+ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (_active_ise_list_store), &iter)) {
+ do {
+ gtk_tree_model_get (GTK_TREE_MODEL (_active_ise_list_store), &iter,
+ ACTIVE_ISE_NAME, &name,
+ ACTIVE_ISE_UUID, &uuid, -1);
+ if ((name != NULL && !strcmp (ise_name.c_str (), name)) || (uuid != NULL && !strcmp (ise_uuid.c_str (), uuid))) {
+ String language = String ("~other");//scim_get_locale_language (scim_get_current_locale ());
+ _config->write (String (SCIM_CONFIG_DEFAULT_IMENGINE_FACTORY) + String ("/") + language, String (uuid));
+ _config->flush ();
+ _panel_agent->change_factory (uuid);
+ ret = true;
+ }
+ if (name) {
+ g_free (name);
+ name = 0;
+ }
+ if (uuid) {
+ g_free (uuid);
+ uuid = 0;
+ }
+ if (ret)
+ return;
+ } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (_active_ise_list_store), &iter));
+ }
+}
+
+/**
+ * @brief Get current keyboard ISE name and uuid slot function for PanelAgent.
+ *
+ * @param ise_name The variable is used to store ISE name.
+ * @param ise_uuid The variable is used to store ISE uuid.
+ */
+static void slot_get_keyboard_ise (String &ise_name, String &ise_uuid)
+{
+ String language = String ("~other");//scim_get_locale_language (scim_get_current_locale ());
+ String uuid = _config->read (String (SCIM_CONFIG_DEFAULT_IMENGINE_FACTORY) + String ("/") + language, String (""));
+ if (ise_uuid.length () > 0)
+ uuid = ise_uuid;
+ for (unsigned int i = 0; i < _uuids.size (); i++) {
+ if (uuid == _uuids[i]) {
+ ise_name = _names[i];
+ ise_uuid = uuid;
+ return;
+ }
+ }
+ ise_name = String ("");
+ ise_uuid = String ("");
+}
+
+/**
+ * @brief Start default ISE slot function for PanelAgent.
+ */
+static void slot_start_default_ise ()
+{
+ DEFAULT_ISE_T default_ise;
+
+ default_ise.type = (TOOLBAR_MODE_T)scim_global_config_read (String (SCIM_GLOBAL_CONFIG_DEFAULT_ISE_TYPE), (int)_initial_ise.type);
+ default_ise.uuid = scim_global_config_read (String (SCIM_GLOBAL_CONFIG_DEFAULT_ISE_UUID), _initial_ise.uuid);
+ default_ise.name = scim_global_config_read (String (SCIM_GLOBAL_CONFIG_DEFAULT_ISE_NAME), _initial_ise.name);
+
+ if (!set_active_ise_by_uuid (default_ise.uuid, 1)) {
+ if (default_ise.uuid != _initial_ise.uuid)
+ set_active_ise_by_uuid (_initial_ise.uuid, 1);
+ }
+
+ return;
+}
+
+/**
+ * @brief Send key event slot function for PanelAgent.
+ *
+ * @param key The key event should be sent.
+ */
+static void slot_send_key_event (const KeyEvent &key)
+{
+ //std::cout << "[slot_send_key_event] code : " << key.code << " mask : " << key.mask << "\n";
+}
+
+/**
+ * @brief Lock slot function for PanelAgent.
+ */
+static void slot_lock (void)
+{
+ G_LOCK (_panel_agent_lock);
+}
+
+/**
+ * @brief Unlock slot function for PanelAgent.
+ */
+static void slot_unlock (void)
+{
+ G_UNLOCK (_panel_agent_lock);
+}
+//////////////////////////////////////////////////////////////////////
+// End of PanelAgent-Functions
+//////////////////////////////////////////////////////////////////////
+
+/**
+ * @brief Timeout function for candidate show timer.
+ *
+ * @param data Data pointer to pass when it is called.
+ *
+ * @return FALSE.
+ */
+static gboolean candidate_show_timeout_cb (gpointer data)
+{
+ SCIM_DEBUG_MAIN (1) << "candidate_show_timeout_cb......\n";
+
+ slot_lock ();
+ if (g_isf_candidate_table.get_current_page_size () && _candidate_timer) {
+ update_table (CANDIDATE_TABLE, g_isf_candidate_table, _lookup_table_items,
+ _lookup_table_index, _lookup_table_index_pos, _candidate_scroll);
+
+ if (!_candidate_is_showed)
+ slot_show_lookup_table ();
+ }
+
+ _candidate_timer = 0;
+ slot_unlock ();
+
+ return FALSE;
+}
+
+/**
+ * @brief Timeout function for check exit timer.
+ *
+ * @param data Data pointer to pass when it is called.
+ *
+ * return TRUE.
+ */
+static gboolean check_exit_timeout_cb (gpointer data)
+{
+ G_LOCK (_global_resource_lock);
+ if (_should_exit) {
+ gdk_threads_enter ();
+ gtk_main_quit ();
+ gdk_threads_leave ();
+ }
+ G_UNLOCK (_global_resource_lock);
+
+ return (gboolean)TRUE;
+}
+
+/**
+ * @brief Callback function for abnormal signal.
+ *
+ * @param sig The signal.
+ */
+static void signalhandler (int sig)
+{
+ SCIM_DEBUG_MAIN (1) << "In signal handler...\n";
+
+ if (_panel_agent != NULL)
+ _panel_agent->stop ();
+}
+
+#if HAVE_GCONF
+/**
+ * @brief Create prediction engine option information.
+ *
+ * @return the pointer of ImeSettingPredictionEngineOptionInfo_S.
+ */
+static ImeSettingPredictionEngineOptionInfo_S* prediction_engine_option_info_create (void)
+{
+ ImeSettingPredictionEngineOptionInfo_S *prediction_engine_option_info_s;
+
+ prediction_engine_option_info_s = g_slice_new0 (ImeSettingPredictionEngineOptionInfo_S);
+
+ prediction_engine_option_info_s->keypad_type = IME_SETTING_KEYPAD_TYPE_3X4;
+ prediction_engine_option_info_s->word_cmpletion_point = 0;
+ prediction_engine_option_info_s->spell_correction = FALSE;
+ prediction_engine_option_info_s->next_word_prediction = FALSE;
+ prediction_engine_option_info_s->auto_substitution = FALSE;
+ prediction_engine_option_info_s->multitap_word_completion = FALSE;
+ prediction_engine_option_info_s->regional_input = FALSE;
+ prediction_engine_option_info_s->word_cmpletion_point_prev = 0;
+ prediction_engine_option_info_s->spell_correction_prev = FALSE;
+ prediction_engine_option_info_s->next_word_prediction_prev = FALSE;
+ prediction_engine_option_info_s->auto_substitution_prev = FALSE;
+ prediction_engine_option_info_s->multitap_word_completion_prev = FALSE;
+ prediction_engine_option_info_s->regional_input_prev = FALSE;
+
+ return prediction_engine_option_info_s;
+}
+
+/**
+ * @brief Get bit mask for prediction engine option.
+ *
+ * @param value The source value.
+ * @param index The index for mask.
+ *
+ * @return TRUE or FALSE.
+ */
+static gboolean prediction_engine_option_get_noti_bit_mask (int value, int index)
+{
+ int mask;
+
+ mask = 1 << index;
+ if ((value & mask) ? TRUE : FALSE)
+ SCIM_DEBUG_MAIN (1) << "true.....\n";
+ else
+ SCIM_DEBUG_MAIN (1) << "false....\n";
+ return (value & mask) ? TRUE : FALSE;
+}
+
+/**
+ * @brief Set prediction engine option information.
+ *
+ * @param prediction_engine_option_info_s The ImeSettingPredictionEngineOptionInfo_S pointer.
+ * @param keypad_type The keypad layout is IME_SETTING_KEYPAD_TYPE_3X4 or IME_SETTING_KEYPAD_TYPE_QTY.
+ */
+static void prediction_engine_option_info_set (ImeSettingPredictionEngineOptionInfo_S *prediction_engine_option_info_s, gint keypad_type)
+{
+ GConfValue* value = NULL;
+ int error_code = 0;
+ gint gconfvalue = 0;
+
+ g_return_if_fail ((keypad_type >= 0) && (keypad_type < 2));
+
+ prediction_engine_option_info_s->keypad_type = keypad_type;
+
+ value = gconf_value_new (GCONF_VALUE_INT);
+
+ if (keypad_type == IME_SETTING_KEYPAD_TYPE_3X4) {
+ // WORD_COMPLETION_POINT
+ if (!(phonestatus_get ((char *)PS_KEY_APPL_ISE_NWORDCOMPPOINT, value, &error_code)))
+ g_printf ("\n>>>>>>[%s][%d]Error in get as result is no true,error =%d \n", __FUNCTION__, __LINE__, error_code);
+ gconfvalue = gconf_value_get_int (value);
+
+ prediction_engine_option_info_s->word_cmpletion_point_prev = prediction_engine_option_info_s->word_cmpletion_point = gconfvalue;
+ _config->write (String (SCIM_PREDICTION_ENGINE_CONFIG_3x4_WORD_COMPLETION_POINT), prediction_engine_option_info_s->word_cmpletion_point);
+
+ // OPTIONS
+ if (!(phonestatus_get ((char *)PS_KEY_APPL_ISE_PREDICTION_ENGINE_OPTION, value, &error_code)))
+ g_printf ("\n>>>>>>[%s][%d]Error in get as result is no true,error =%d \n", __FUNCTION__, __LINE__, error_code);
+ gconfvalue = gconf_value_get_int (value);
+
+ SCIM_DEBUG_MAIN (1) << "spell_correction_prev:";
+ prediction_engine_option_info_s->spell_correction_prev = prediction_engine_option_info_s->spell_correction = prediction_engine_option_get_noti_bit_mask (gconfvalue, IME_BIT_0);
+ _config->write (String (SCIM_PREDICTION_ENGINE_CONFIG_3x4_SPELL_CORRECTION), prediction_engine_option_info_s->spell_correction);
+
+ SCIM_DEBUG_MAIN (1) << "next_word_prediction_prev:";
+ prediction_engine_option_info_s->next_word_prediction_prev = prediction_engine_option_info_s->next_word_prediction = prediction_engine_option_get_noti_bit_mask (gconfvalue, IME_BIT_1);
+ _config->write (String (SCIM_PREDICTION_ENGINE_CONFIG_3x4_NEXT_WORD_PREDIECTION), prediction_engine_option_info_s->next_word_prediction);
+
+ SCIM_DEBUG_MAIN (1) << "auto_substitution_prev:";
+ prediction_engine_option_info_s->auto_substitution_prev = prediction_engine_option_info_s->auto_substitution = prediction_engine_option_get_noti_bit_mask (gconfvalue, IME_BIT_2);
+ _config->write (String (SCIM_PREDICTION_ENGINE_CONFIG_3x4_AUTO_SUBSTITUTION), prediction_engine_option_info_s->auto_substitution);
+
+ SCIM_DEBUG_MAIN (1) << "multitap_word_completion_prev:";
+ prediction_engine_option_info_s->multitap_word_completion_prev = prediction_engine_option_info_s->multitap_word_completion = prediction_engine_option_get_noti_bit_mask (gconfvalue, IME_BIT_3);
+ _config->write (String (SCIM_PREDICTION_ENGINE_CONFIG_3x4_MULTITAP_WORD_COMPLETION), prediction_engine_option_info_s->multitap_word_completion);
+
+ //prediction_engine_option_info_s->regional_input = 0; // unused !!
+ } else if (keypad_type == IME_SETTING_KEYPAD_TYPE_QTY) {
+ // WORD_COMPLETION_POINT
+ if (!(phonestatus_get ((char *)PS_KEY_APPL_ISE_QWORDCOMPPOINT, value, &error_code)))
+ g_printf ("\n>>>>>>[%s][%d]Error in get as result is no true,error =%d \n", __FUNCTION__, __LINE__, error_code);
+ gconfvalue = gconf_value_get_int (value);
+
+ prediction_engine_option_info_s->word_cmpletion_point_prev = prediction_engine_option_info_s->word_cmpletion_point = gconfvalue;
+ _config->write (String (SCIM_PREDICTION_ENGINE_CONFIG_QWERTY_WORD_COMPLETION_POINT), prediction_engine_option_info_s->word_cmpletion_point);
+
+ // OPTIONS
+ if (!(phonestatus_get ((char *)PS_KEY_APPL_ISE_PREDICTION_ENGINE_OPTION, value, &error_code)))
+ g_printf ("\n>>>>>>[%s][%d]Error in get as result is no true,error =%d \n", __FUNCTION__, __LINE__, error_code);
+ gconfvalue = gconf_value_get_int (value);
+
+ SCIM_DEBUG_MAIN (1) << "spell_correction_prev:";
+ prediction_engine_option_info_s->spell_correction_prev = prediction_engine_option_info_s->spell_correction = prediction_engine_option_get_noti_bit_mask (gconfvalue, IME_BIT_4);
+ _config->write (String (SCIM_PREDICTION_ENGINE_CONFIG_QWERTY_SPELL_CORRECTION), prediction_engine_option_info_s->spell_correction);
+
+ SCIM_DEBUG_MAIN (1) << "next_word_prediction_prev:";
+ prediction_engine_option_info_s->next_word_prediction_prev = prediction_engine_option_info_s->next_word_prediction = prediction_engine_option_get_noti_bit_mask (gconfvalue, IME_BIT_5);
+ _config->write (String (SCIM_PREDICTION_ENGINE_CONFIG_QWERTY_NEXT_WORD_PREDIECTION), prediction_engine_option_info_s->next_word_prediction);
+
+ SCIM_DEBUG_MAIN (1) << "auto_substitution_prev:";
+ prediction_engine_option_info_s->auto_substitution_prev = prediction_engine_option_info_s->auto_substitution = prediction_engine_option_get_noti_bit_mask (gconfvalue, IME_BIT_6);
+ _config->write (String (SCIM_PREDICTION_ENGINE_CONFIG_QWERTY_AUTO_SUBSTITUTION), prediction_engine_option_info_s->auto_substitution);
+
+ SCIM_DEBUG_MAIN (1) << "regional_input_prev:";
+ prediction_engine_option_info_s->regional_input_prev = prediction_engine_option_info_s->regional_input = prediction_engine_option_get_noti_bit_mask (gconfvalue, IME_BIT_7);
+ _config->write (String (SCIM_PREDICTION_ENGINE_CONFIG_QWERTY_REGIONAL_INPUT), prediction_engine_option_info_s->regional_input);
+
+ //prediction_engine_option_info_s->multitap_word_completion = 0; // unused !!
+ }
+
+ gconf_value_free (value);
+}
+
+/**
+ * @brief Callback function for prediction engine option setting.
+ *
+ * @param t_src_id The source id of system event.
+ * @param p_noti_id The handler of notice id.
+ * @param pg_parameters The GArray pointer.
+ * @param arg Data pointer to pass when it is called.
+ *
+ * @return FALSE.
+ */
+static bool prediction_engine_option_setting_ed_handler (EvtSysEventSourceId_t t_src_id,
+ const char *p_noti_id,
+ const GArray *pg_parameters,
+ void *arg)
+{
+ if (strcmp (p_noti_id, _ime_setting_ed_id[0]) != 0 &&
+ strcmp (p_noti_id, _ime_setting_ed_id[1]) != 0 &&
+ strcmp (p_noti_id, _ime_setting_ed_id[2]) != 0)
+ return FALSE;
+
+ ImeSettingPredictionEngineOptionInfo_S *prediction_engine_option_info_s;
+ prediction_engine_option_info_s = prediction_engine_option_info_create ();
+ for (gint i = IME_SETTING_KEYPAD_TYPE_3X4; i < IME_SETTING_KEYPAD_TYPE_NUM; i++) {
+ prediction_engine_option_info_set (prediction_engine_option_info_s, i);
+ }
+
+ _config->flush ();
+ _config->reload ();
+
+ g_slice_free (ImeSettingPredictionEngineOptionInfo_S, prediction_engine_option_info_s);
+
+ return FALSE;
+}
+
+/**
+ * @brief Subscrible prediction engine option setting.
+ *
+ * @return event handle if successfully, otherwise return -1.
+ */
+static int prediction_engine_option_setting_ed_subscribe (void)
+{
+ int i;
+ int ret;
+ int ierror;
+ int event_handle;
+
+ ierror = EvtSysLibraryOpen (&event_handle);
+ if (ierror) {
+ std::cerr << "Error EvtSysLibraryOpen ()!! Return Value :" << ierror << "\n";
+ return -1;
+ }
+
+ EvtSysEventSubscription_t *subscriptions = g_new (EvtSysEventSubscription_t, _ime_setting_ed_number);
+
+ for (i = 0; i < _ime_setting_ed_number; i++) {
+ subscriptions[i].noti_id = _ime_setting_ed_id[i];
+ subscriptions[i].filter_expression = NULL;
+ subscriptions[i].callback = prediction_engine_option_setting_ed_handler;
+ subscriptions[i].priv_data = NULL;
+ }
+
+ if (ret = EvtSysEventMultiSubscribe (event_handle, subscriptions, _ime_setting_ed_number)) {
+ std::cerr << "Error EvtSysEventMultiSubscribe ()!! Return Value :" << ret << "\n";
+ event_handle = -1;
+ } else {
+ for (i = 0; i < _ime_setting_ed_number; i++)
+ _ed_subscription_id[i] = subscriptions[i].subscription_id;
+ }
+ if (subscriptions)
+ g_free (subscriptions);
+
+ return event_handle;
+}
+#endif
+
+int main (int argc, char *argv [])
+{
+ struct tms tiks_buf;
+ _clock_start = times (&tiks_buf);
+
+ int i;
+ size_t j;
+ int ret = 0;
+#if HAVE_GCONF
+ int g_ed_event_handle = -1;
+ GConfClient *client = 0;
+ GError *err = 0;
+ int lang_id;
+#endif
+
+ bool daemon = false;
+ bool should_resident = true;
+
+ int new_argc = 0;
+ char **new_argv = new char * [40];
+ String config_name ("socket");
+ ConfigModule *config_module = 0;
+ String display_name;
+
+ check_time ("\nStarting ISF Panel ...... ");
+
+ DebugOutput::disable_debug (SCIM_DEBUG_AllMask);
+ DebugOutput::enable_debug (SCIM_DEBUG_MainMask);
+
+ // Parse command options
+ i = 0;
+ while (i<argc) {
+ if (++i >= argc) break;
+
+ if (String ("-c") == argv [i] ||
+ String ("--config") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "no argument for option " << argv [i-1] << "\n";
+ ret = -1;
+ goto cleanup;
+ }
+ config_name = argv [i];
+ continue;
+ }
+
+ if (String ("-h") == argv [i] ||
+ String ("--help") == argv [i]) {
+ std::cout << "Usage: " << argv [0] << " [option]...\n\n"
+ << "The options are: \n"
+ << " --display DISPLAY Run on display DISPLAY.\n"
+ << " -c, --config NAME Uses specified Config module.\n"
+ << " -d, --daemon Run " << argv [0] << " as a daemon.\n"
+ << " -ns, --no-stay Quit if no connected client.\n"
+#if ENABLE_DEBUG
+ << " -v, --verbose LEVEL Enable debug info, to specific LEVEL.\n"
+ << " -o, --output FILE Output debug information into FILE.\n"
+#endif
+ << " -h, --help Show this help message.\n";
+ delete []new_argv;
+ return 0;
+ }
+
+ if (String ("-d") == argv [i] ||
+ String ("--daemon") == argv [i]) {
+ daemon = true;
+ continue;
+ }
+
+ if (String ("-ns") == argv [i] ||
+ String ("--no-stay") == argv [i]) {
+ should_resident = false;
+ continue;
+ }
+
+ if (String ("-v") == argv [i] ||
+ String ("--verbose") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "no argument for option " << argv [i-1] << "\n";
+ ret = -1;
+ goto cleanup;
+ }
+ DebugOutput::set_verbose_level (atoi (argv [i]));
+ continue;
+ }
+
+ if (String ("-o") == argv [i] ||
+ String ("--output") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "No argument for option " << argv [i-1] << "\n";
+ ret = -1;
+ goto cleanup;
+ }
+ DebugOutput::set_output (argv [i]);
+ continue;
+ }
+
+ if (String ("--display") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "No argument for option " << argv [i-1] << "\n";
+ ret = -1;
+ goto cleanup;
+ }
+ display_name = argv [i];
+ continue;
+ }
+
+ if (String ("--") == argv [i])
+ break;
+
+ std::cerr << "Invalid command line option: " << argv [i] << "\n";
+ delete []new_argv;
+ return 0;
+ } // End of command line parsing.
+
+ new_argv [new_argc ++] = argv [0];
+
+ // Store the rest argvs into new_argv.
+ for (++i; i < argc && new_argc < 37; ++i) {
+ new_argv [new_argc ++] = argv [i];
+ }
+
+ // Make up DISPLAY env.
+ if (display_name.length ()) {
+ new_argv [new_argc ++] = const_cast <char*> ("--display");
+ new_argv [new_argc ++] = const_cast <char*> (display_name.c_str ());
+
+ setenv ("DISPLAY", display_name.c_str (), 1);
+ }
+
+ new_argv [new_argc] = 0;
+
+ if (!config_name.length ()) {
+ std::cerr << "No Config module is available!\n";
+ ret = -1;
+ goto cleanup;
+ }
+
+ if (config_name != "dummy") {
+ // Load config module
+ config_module = new ConfigModule (config_name);
+
+ if (!config_module || !config_module->valid ()) {
+ std::cerr << "Can not load " << config_name << " Config module.\n";
+ ret = -1;
+ goto cleanup;
+ }
+ } else {
+ _config = new DummyConfig ();
+ }
+
+ // Init threads
+ g_thread_init (NULL);
+ gdk_threads_init ();
+ check_time ("gdk_thread_init");
+
+ signal (SIGQUIT, signalhandler);
+ signal (SIGTERM, signalhandler);
+ signal (SIGINT, signalhandler);
+ //signal (SIGHUP, signalhandler);
+
+ gtk_init (&new_argc, &new_argv);
+ check_time ("gtk_init");
+
+ // Get current display.
+ {
+#if GDK_MULTIHEAD_SAFE
+ const char *p = gdk_display_get_name (gdk_display_get_default ());
+#else
+ const char *p = getenv ("DISPLAY");
+#endif
+ if (p) display_name = String (p);
+ }
+
+ try {
+ if (!initialize_panel_agent (config_name, display_name, should_resident)) {
+ std::cerr << "Failed to initialize Panel Agent!\n";
+ ret = -1;
+ goto cleanup;
+ }
+ } catch (scim::Exception & e) {
+ std::cerr << e.what() << "\n";
+ ret = -1;
+ goto cleanup;
+ }
+ check_time ("initialize_panel_agent");
+
+ // Create config instance
+ if (_config.null () && config_module && config_module->valid())
+ _config = config_module->create_config ();
+ if (_config.null ()) {
+ std::cerr << "Failed to create Config instance from " << config_name << " Config module.\n";
+ ret = -1;
+ goto cleanup;
+ }
+ check_time ("create config instance");
+
+#if HAVE_GCONF
+ //if (gconf_init (argc, argv, &err))
+ {
+ client = gconf_client_get_default ();
+ if (client && client->engine) {
+ lang_id = gconf_client_get_int (client, SETTINGS_INPUTLANGUAGETYPE, &err);
+ if (err) {
+ std::cerr << "gconf_client_get_int : " << err->message << "\n";
+ g_error_free (err);
+ err = NULL;
+ } else {
+ set_default_language_by_id (lang_id);
+ gconf_client_add_dir (client, "/Application/Settings", GCONF_CLIENT_PRELOAD_NONE, NULL);
+ gconf_client_notify_add (client, SETTINGS_INPUTLANGUAGETYPE,
+ input_lang_key_changed_callback,
+ NULL, NULL, &err);
+ check_time ("gconf_client_notify_add");
+ }
+ }
+ }
+ if (err) {
+ std::cerr << "gconf error : " << err->message << "\n";
+ g_error_free (err);
+ err = NULL;
+ }
+
+ g_ed_event_handle = prediction_engine_option_setting_ed_subscribe ();
+#endif
+
+ _screen_width = gdk_screen_get_width (gdk_screen_get_default ());
+ _screen_height = gdk_screen_get_height (gdk_screen_get_default ());
+ _width_rate = (float)(_screen_width / BASE_SCREEN_WIDTH);
+ _height_rate = (float)(_screen_height / BASE_SCREEN_HEIGHT);
+ _softkeybar_height = (int)(BASE_SOFTKEYBAR_HEIGHT * _height_rate);
+ _panel_width = (int)(BASE_PANEL_WIDTH * _width_rate);
+ _panel_height = (int)(BASE_PANEL_HEIGHT * _height_rate);
+ _setup_button_width = (int)(BASE_SETUP_BUTTON_WIDTH * _width_rate);
+ _setup_button_height = (int)(BASE_SETUP_BUTTON_HEIGHT * _height_rate);
+ _help_icon_width = (int)(BASE_HELP_ICON_WIDTH * _width_rate);
+ _help_icon_height = (int)(BASE_HELP_ICON_HEIGHT * _height_rate);
+
+ ui_initialize ();
+ check_time ("ui_initialize");
+
+ try {
+ _panel_agent->send_display_name (display_name);
+
+ _initial_ise.type = (TOOLBAR_MODE_T)scim_global_config_read (String (SCIM_GLOBAL_CONFIG_INITIAL_ISE_TYPE), (int)TOOLBAR_HELPER_MODE);
+ _initial_ise.uuid = scim_global_config_read (String (SCIM_GLOBAL_CONFIG_INITIAL_ISE_UUID), String ("ff110940-b8f0-4062-9ff6-a84f4f3575c0"));
+ _initial_ise.name = scim_global_config_read (String (SCIM_GLOBAL_CONFIG_INITIAL_ISE_NAME), String ("Input Pad"));
+
+ for (j = 0; j < _uuids.size (); ++j) {
+ if (!_uuids[j].compare(_initial_ise.uuid))
+ break;
+ }
+
+ if (j == _uuids.size ())
+ {
+ for (j = 0; j < _uuids.size (); ++j) {
+ if (_modes[j] == TOOLBAR_HELPER_MODE) {
+ _initial_ise.type = _modes[j];
+ _initial_ise.uuid = _uuids[j];
+ _initial_ise.name = _names[j];
+ }
+ }
+ }
+
+ slot_start_default_ise ();
+ } catch (scim::Exception & e) {
+ std::cerr << e.what() << "\n";
+ ret = -1;
+ goto cleanup;
+ }
+
+ if (daemon) {
+ check_time ("ISF Panel run as daemon");
+ scim_daemon ();
+ }
+
+ // Connect the configuration reload signal.
+ _config->signal_connect_reload (slot (ui_config_reload_callback));
+
+ if (!run_panel_agent ()) {
+ std::cerr << "Failed to run Socket Server!\n";
+ ret = -1;
+ goto cleanup;
+ }
+ check_time ("run_panel_agent");
+
+ _check_exit_timeout = gtk_timeout_add (500, check_exit_timeout_cb, NULL);
+
+ _ise_list_changed = false;
+ _setup_enable_changed = false;
+ gdk_threads_enter ();
+ check_time ("ISF Panel launch time");
+ gtk_main ();
+ gdk_threads_leave ();
+
+ // Exiting...
+ g_thread_join (_panel_agent_thread);
+
+ // Destroy candidate window
+ if (GTK_IS_WIDGET (_lookup_table_window))
+ gtk_widget_destroy (_lookup_table_window);
+ if (GTK_IS_WINDOW (_input_window))
+ gtk_widget_destroy (_input_window);
+
+ _config->flush ();
+ ret = 0;
+
+cleanup:
+ if (!_config.null ())
+ _config.reset ();
+ if (config_module)
+ delete config_module;
+#if HAVE_GCONF
+ if (client)
+ g_object_unref (client);
+
+ if (EvtSysEventHandleExist (g_ed_event_handle)) {
+ EvtSysEventMultiUnsubscribe (g_ed_event_handle, _ed_subscription_id, _ime_setting_ed_number);
+ if (g_ed_event_handle != -1)
+ EvtSysLibraryClose (g_ed_event_handle);
+ }
+#endif
+ if (_panel_agent)
+ delete _panel_agent;
+
+ delete []new_argv;
+
+ if (ret == 0) {
+ std::cerr << "Successfully exited.\n";
+ return 0;
+ } else {
+ std::cerr << "Abnormally exited.\n";
+ return -1;
+ }
+}
+
+/*
+vi:ts=4:nowrap:expandtab
+*/
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_setup_module.cpp,v 1.9 2005/01/10 08:30:45 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_CONFIG_BASE
+#define Uses_SCIM_MODULE
+
+#include "scim_private.h"
+#include "scim.h"
+#include "scim_setup_module.h"
+
+SetupModule::SetupModule ()
+ : m_create_ui (0),
+ m_get_category (0),
+ m_get_name (0),
+ m_get_description (0),
+ m_load_config (0),
+ m_save_config (0),
+ m_query_changed (0)
+{
+}
+
+SetupModule::SetupModule (const String &name)
+ : m_create_ui (0),
+ m_get_category (0),
+ m_get_name (0),
+ m_get_description (0),
+ m_load_config (0),
+ m_save_config (0),
+ m_query_changed (0)
+{
+ load (name);
+}
+
+bool
+SetupModule::load (const String &name)
+{
+ if (!m_module.load (name, "SetupUI"))
+ return false;
+
+ m_create_ui = (SetupModuleCreateUIFunc) m_module.symbol ("scim_setup_module_create_ui");
+ m_get_category = (SetupModuleGetCategoryFunc) m_module.symbol ("scim_setup_module_get_category");
+ m_get_name = (SetupModuleGetNameFunc) m_module.symbol ("scim_setup_module_get_name");
+ m_get_description = (SetupModuleGetDescriptionFunc) m_module.symbol ("scim_setup_module_get_description");
+ m_load_config = (SetupModuleLoadConfigFunc) m_module.symbol ("scim_setup_module_load_config");
+ m_save_config = (SetupModuleSaveConfigFunc) m_module.symbol ("scim_setup_module_save_config");
+ m_query_changed = (SetupModuleQueryChangedFunc) m_module.symbol ("scim_setup_module_query_changed");
+
+
+ if (!m_create_ui || !m_get_category || !m_get_name ||
+ !m_load_config || !m_save_config) {
+ m_module.unload ();
+ m_create_ui = 0;
+ m_get_category = 0;
+ m_get_name = 0;
+ m_get_description = 0;
+ m_load_config = 0;
+ m_save_config = 0;
+ m_query_changed = 0;
+ return false;
+ }
+ return true;
+}
+
+bool
+SetupModule::unload()
+{
+ m_module.unload ();
+
+ m_create_ui = 0;
+ m_get_category = 0;
+ m_get_name = 0;
+ m_get_description = 0;
+ m_load_config = 0;
+ m_save_config = 0;
+ m_query_changed = 0;
+
+ return true;
+}
+
+bool
+SetupModule::valid () const
+{
+ return (m_module.valid () &&
+ m_create_ui && m_get_category && m_get_name &&
+ m_load_config && m_save_config);
+}
+
+GtkWidget *
+SetupModule::create_ui () const
+{
+ if (valid ())
+ return m_create_ui ();
+
+ return 0;
+}
+
+String
+SetupModule::get_category () const
+{
+ if (valid ())
+ return m_get_category ();
+
+ return String ();
+}
+
+String
+SetupModule::get_name () const
+{
+ if (valid ())
+ return m_get_name ();
+
+ return String ();
+}
+
+String
+SetupModule::get_description () const
+{
+ if (valid () && m_get_description)
+ return m_get_description ();
+
+ return String ();
+}
+
+void
+SetupModule::load_config (const ConfigPointer &config) const
+{
+ if (valid ())
+ m_load_config (config);
+}
+
+void
+SetupModule::save_config (const ConfigPointer &config) const
+{
+ if (valid ())
+ m_save_config (config);
+}
+
+bool
+SetupModule::query_changed () const
+{
+ if (valid () && m_query_changed)
+ return m_query_changed ();
+ return false;
+}
+
+int scim_get_setup_module_list (std::vector <String>& mod_list)
+{
+ return scim_get_module_list (mod_list, "SetupUI");
+}
+
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_setup_module.h
+ * @brief definition of SetupModule related classes.
+ */
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_setup_module.h,v 1.9 2005/01/10 08:30:45 suzhe Exp $
+ */
+
+#if !defined (__SCIM_SETUP_MODULE_H)
+#define __SCIM_SETUP_MODULE_H
+
+#include <gtk/gtk.h>
+
+using namespace scim;
+
+typedef GtkWidget * (*SetupModuleCreateUIFunc) (void);
+typedef String (*SetupModuleGetCategoryFunc) (void);
+typedef String (*SetupModuleGetNameFunc) (void);
+typedef String (*SetupModuleGetDescriptionFunc) (void);
+typedef void (*SetupModuleLoadConfigFunc) (const ConfigPointer &config);
+typedef void (*SetupModuleSaveConfigFunc) (const ConfigPointer &config);
+typedef bool (*SetupModuleQueryChangedFunc) (void);
+
+class SetupModule
+{
+ Module m_module;
+
+ SetupModuleCreateUIFunc m_create_ui;
+ SetupModuleGetCategoryFunc m_get_category;
+ SetupModuleGetNameFunc m_get_name;
+ SetupModuleGetDescriptionFunc m_get_description;
+ SetupModuleLoadConfigFunc m_load_config;
+ SetupModuleSaveConfigFunc m_save_config;
+ SetupModuleQueryChangedFunc m_query_changed;
+
+ SetupModule (const SetupModule &);
+ SetupModule & operator= (const SetupModule &);
+
+public:
+ SetupModule ();
+ SetupModule (const String &name);
+
+ bool load (const String &name);
+ bool unload();
+ bool valid () const;
+
+ GtkWidget * create_ui () const;
+
+ String get_category () const;
+ String get_name () const;
+ String get_description () const;
+
+ void load_config (const ConfigPointer &config) const;
+ void save_config (const ConfigPointer &config) const;
+
+ bool query_changed () const;
+};
+
+int scim_get_setup_module_list (std::vector <String>& mod_list);
+
+#endif // __SCIM_SETUP_MODULE_H
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+2005-03-07 gettextize <bug-gnu-gettext@gnu.org>
+
+ * gettext.m4: Upgrade to gettext-0.14.1.
+ * intmax.m4: New file, from gettext-0.14.1.
+ * inttypes_h.m4: Upgrade to gettext-0.14.1.
+ * lib-ld.m4: Upgrade to gettext-0.14.1.
+ * lib-link.m4: Upgrade to gettext-0.14.1.
+ * lib-prefix.m4: Upgrade to gettext-0.14.1.
+ * longdouble.m4: New file, from gettext-0.14.1.
+ * longlong.m4: New file, from gettext-0.14.1.
+ * nls.m4: New file, from gettext-0.14.1.
+ * po.m4: New file, from gettext-0.14.1.
+ * printf-posix.m4: New file, from gettext-0.14.1.
+ * progtest.m4: Upgrade to gettext-0.14.1.
+ * signed.m4: New file, from gettext-0.14.1.
+ * size_max.m4: New file, from gettext-0.14.1.
+ * stdint_h.m4: Upgrade to gettext-0.14.1.
+ * uintmax_t.m4: Upgrade to gettext-0.14.1.
+ * ulonglong.m4: Upgrade to gettext-0.14.1.
+ * wchar_t.m4: New file, from gettext-0.14.1.
+ * wint_t.m4: New file, from gettext-0.14.1.
+ * xsize.m4: New file, from gettext-0.14.1.
+ * Makefile.am (EXTRA_DIST): Add the new files.
+
+2004-04-13 gettextize <bug-gnu-gettext@gnu.org>
+
+ * codeset.m4: New file, from gettext-0.11.5.
+ * gettext.m4: New file, from gettext-0.11.5.
+ * glibc21.m4: New file, from gettext-0.11.5.
+ * iconv.m4: New file, from gettext-0.11.5.
+ * intdiv0.m4: New file, from gettext-0.11.5.
+ * inttypes.m4: New file, from gettext-0.11.5.
+ * inttypes_h.m4: New file, from gettext-0.11.5.
+ * inttypes-pri.m4: New file, from gettext-0.11.5.
+ * isc-posix.m4: New file, from gettext-0.11.5.
+ * lcmessage.m4: New file, from gettext-0.11.5.
+ * lib-ld.m4: New file, from gettext-0.11.5.
+ * lib-link.m4: New file, from gettext-0.11.5.
+ * lib-prefix.m4: New file, from gettext-0.11.5.
+ * progtest.m4: New file, from gettext-0.11.5.
+ * stdint_h.m4: New file, from gettext-0.11.5.
+ * uintmax_t.m4: New file, from gettext-0.11.5.
+ * ulonglong.m4: New file, from gettext-0.11.5.
+ * Makefile.am: New file.
+
--- /dev/null
+MAINTAINERCLEANFILES = Makefile.in
+EXTRA_DIST = intmax.m4 longdouble.m4 longlong.m4 nls.m4 po.m4 printf-posix.m4 signed.m4 size_max.m4 wchar_t.m4 wint_t.m4 xsize.m4 codeset.m4 gettext.m4 glibc21.m4 iconv.m4 intdiv0.m4 inttypes.m4 inttypes_h.m4 inttypes-pri.m4 isc-posix.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 progtest.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4 intltool.m4
--- /dev/null
+# codeset.m4 serial AM1 (gettext-0.10.40)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+ AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset,
+ [AC_TRY_LINK([#include <langinfo.h>],
+ [char* cs = nl_langinfo(CODESET);],
+ am_cv_langinfo_codeset=yes,
+ am_cv_langinfo_codeset=no)
+ ])
+ if test $am_cv_langinfo_codeset = yes; then
+ AC_DEFINE(HAVE_LANGINFO_CODESET, 1,
+ [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+ fi
+])
--- /dev/null
+# gettext.m4 serial 28 (gettext-0.13)
+dnl Copyright (C) 1995-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+dnl Macro to add for using GNU gettext.
+
+dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
+dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The
+dnl default (if it is not specified or empty) is 'no-libtool'.
+dnl INTLSYMBOL should be 'external' for packages with no intl directory,
+dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory.
+dnl If INTLSYMBOL is 'use-libtool', then a libtool library
+dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static,
+dnl depending on --{enable,disable}-{shared,static} and on the presence of
+dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library
+dnl $(top_builddir)/intl/libintl.a will be created.
+dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
+dnl implementations (in libc or libintl) without the ngettext() function
+dnl will be ignored. If NEEDSYMBOL is specified and is
+dnl 'need-formatstring-macros', then GNU gettext implementations that don't
+dnl support the ISO C 99 <inttypes.h> formatstring macros will be ignored.
+dnl INTLDIR is used to find the intl libraries. If empty,
+dnl the value `$(top_builddir)/intl/' is used.
+dnl
+dnl The result of the configuration is one of three cases:
+dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
+dnl and used.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 2) GNU gettext has been found in the system's C library.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 3) No internationalization, always use English msgid.
+dnl Catalog format: none
+dnl Catalog extension: none
+dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
+dnl The use of .gmo is historical (it was needed to avoid overwriting the
+dnl GNU format catalogs when building on a platform with an X/Open gettext),
+dnl but we keep it in order not to force irrelevant filename changes on the
+dnl maintainers.
+dnl
+AC_DEFUN([AM_GNU_GETTEXT],
+[
+ dnl Argument checking.
+ ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
+ [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
+])])])])])
+ ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], ,
+ [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
+])])])])
+ define(gt_included_intl, ifelse([$1], [external], [no], [yes]))
+ define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], []))
+
+ AC_REQUIRE([AM_PO_SUBDIRS])dnl
+ ifelse(gt_included_intl, yes, [
+ AC_REQUIRE([AM_INTL_SUBDIR])dnl
+ ])
+
+ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+
+ dnl Sometimes libintl requires libiconv, so first search for libiconv.
+ dnl Ideally we would do this search only after the
+ dnl if test "$USE_NLS" = "yes"; then
+ dnl if test "$gt_cv_func_gnugettext_libc" != "yes"; then
+ dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT
+ dnl the configure script would need to contain the same shell code
+ dnl again, outside any 'if'. There are two solutions:
+ dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'.
+ dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE.
+ dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not
+ dnl documented, we avoid it.
+ ifelse(gt_included_intl, yes, , [
+ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+ ])
+
+ dnl Set USE_NLS.
+ AM_NLS
+
+ ifelse(gt_included_intl, yes, [
+ BUILD_INCLUDED_LIBINTL=no
+ USE_INCLUDED_LIBINTL=no
+ ])
+ LIBINTL=
+ LTLIBINTL=
+ POSUB=
+
+ dnl If we use NLS figure out what method
+ if test "$USE_NLS" = "yes"; then
+ gt_use_preinstalled_gnugettext=no
+ ifelse(gt_included_intl, yes, [
+ AC_MSG_CHECKING([whether included gettext is requested])
+ AC_ARG_WITH(included-gettext,
+ [ --with-included-gettext use the GNU gettext library included here],
+ nls_cv_force_use_gnu_gettext=$withval,
+ nls_cv_force_use_gnu_gettext=no)
+ AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
+
+ nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+ if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+ ])
+ dnl User does not insist on using GNU NLS library. Figure out what
+ dnl to use. If GNU gettext is available we use this. Else we have
+ dnl to fall back to GNU NLS library.
+
+ dnl Add a version number to the cache macros.
+ define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1)))
+ define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc])
+ define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl])
+
+ AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,
+ [AC_TRY_LINK([#include <libintl.h>
+]ifelse([$2], [need-formatstring-macros],
+[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+], [])[extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;],
+ [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings],
+ gt_cv_func_gnugettext_libc=yes,
+ gt_cv_func_gnugettext_libc=no)])
+
+ if test "$gt_cv_func_gnugettext_libc" != "yes"; then
+ dnl Sometimes libintl requires libiconv, so first search for libiconv.
+ ifelse(gt_included_intl, yes, , [
+ AM_ICONV_LINK
+ ])
+ dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
+ dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
+ dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
+ dnl even if libiconv doesn't exist.
+ AC_LIB_LINKFLAGS_BODY([intl])
+ AC_CACHE_CHECK([for GNU gettext in libintl],
+ gt_cv_func_gnugettext_libintl,
+ [gt_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $INCINTL"
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBINTL"
+ dnl Now see whether libintl exists and does not depend on libiconv.
+ AC_TRY_LINK([#include <libintl.h>
+]ifelse([$2], [need-formatstring-macros],
+[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+], [])[extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();],
+ [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)],
+ gt_cv_func_gnugettext_libintl=yes,
+ gt_cv_func_gnugettext_libintl=no)
+ dnl Now see whether libintl exists and depends on libiconv.
+ if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then
+ LIBS="$LIBS $LIBICONV"
+ AC_TRY_LINK([#include <libintl.h>
+]ifelse([$2], [need-formatstring-macros],
+[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+], [])[extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();],
+ [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)],
+ [LIBINTL="$LIBINTL $LIBICONV"
+ LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+ gt_cv_func_gnugettext_libintl=yes
+ ])
+ fi
+ CPPFLAGS="$gt_save_CPPFLAGS"
+ LIBS="$gt_save_LIBS"])
+ fi
+
+ dnl If an already present or preinstalled GNU gettext() is found,
+ dnl use it. But if this macro is used in GNU gettext, and GNU
+ dnl gettext is already preinstalled in libintl, we update this
+ dnl libintl. (Cf. the install rule in intl/Makefile.in.)
+ if test "$gt_cv_func_gnugettext_libc" = "yes" \
+ || { test "$gt_cv_func_gnugettext_libintl" = "yes" \
+ && test "$PACKAGE" != gettext-runtime \
+ && test "$PACKAGE" != gettext-tools; }; then
+ gt_use_preinstalled_gnugettext=yes
+ else
+ dnl Reset the values set by searching for libintl.
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
+ fi
+
+ ifelse(gt_included_intl, yes, [
+ if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+ dnl GNU gettext is not found in the C library.
+ dnl Fall back on included GNU gettext library.
+ nls_cv_use_gnu_gettext=yes
+ fi
+ fi
+
+ if test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Mark actions used to generate GNU NLS library.
+ BUILD_INCLUDED_LIBINTL=yes
+ USE_INCLUDED_LIBINTL=yes
+ LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV"
+ LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV"
+ LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+ fi
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Mark actions to use GNU gettext tools.
+ CATOBJEXT=.gmo
+ fi
+ ])
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ AC_DEFINE(ENABLE_NLS, 1,
+ [Define to 1 if translation of program messages to the user's native language
+ is requested.])
+ else
+ USE_NLS=no
+ fi
+ fi
+
+ AC_MSG_CHECKING([whether to use NLS])
+ AC_MSG_RESULT([$USE_NLS])
+ if test "$USE_NLS" = "yes"; then
+ AC_MSG_CHECKING([where the gettext function comes from])
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if test "$gt_cv_func_gnugettext_libintl" = "yes"; then
+ gt_source="external libintl"
+ else
+ gt_source="libc"
+ fi
+ else
+ gt_source="included intl directory"
+ fi
+ AC_MSG_RESULT([$gt_source])
+ fi
+
+ if test "$USE_NLS" = "yes"; then
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if test "$gt_cv_func_gnugettext_libintl" = "yes"; then
+ AC_MSG_CHECKING([how to link with libintl])
+ AC_MSG_RESULT([$LIBINTL])
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
+ fi
+
+ dnl For backward compatibility. Some packages may be using this.
+ AC_DEFINE(HAVE_GETTEXT, 1,
+ [Define if the GNU gettext() function is already present or preinstalled.])
+ AC_DEFINE(HAVE_DCGETTEXT, 1,
+ [Define if the GNU dcgettext() function is already present or preinstalled.])
+ fi
+
+ dnl We need to process the po/ directory.
+ POSUB=po
+ fi
+
+ ifelse(gt_included_intl, yes, [
+ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
+ dnl to 'yes' because some of the testsuite requires it.
+ if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
+ BUILD_INCLUDED_LIBINTL=yes
+ fi
+
+ dnl Make all variables we use known to autoconf.
+ AC_SUBST(BUILD_INCLUDED_LIBINTL)
+ AC_SUBST(USE_INCLUDED_LIBINTL)
+ AC_SUBST(CATOBJEXT)
+
+ dnl For backward compatibility. Some configure.ins may be using this.
+ nls_cv_header_intl=
+ nls_cv_header_libgt=
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ DATADIRNAME=share
+ AC_SUBST(DATADIRNAME)
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ INSTOBJEXT=.mo
+ AC_SUBST(INSTOBJEXT)
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ GENCAT=gencat
+ AC_SUBST(GENCAT)
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ if test "$USE_INCLUDED_LIBINTL" = yes; then
+ INTLOBJS="\$(GETTOBJS)"
+ fi
+ AC_SUBST(INTLOBJS)
+
+ dnl Enable libtool support if the surrounding package wishes it.
+ INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
+ AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX)
+ ])
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ INTLLIBS="$LIBINTL"
+ AC_SUBST(INTLLIBS)
+
+ dnl Make all documented variables known to autoconf.
+ AC_SUBST(LIBINTL)
+ AC_SUBST(LTLIBINTL)
+ AC_SUBST(POSUB)
+])
+
+
+dnl Checks for all prerequisites of the intl subdirectory,
+dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS,
+dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL.
+AC_DEFUN([AM_INTL_SUBDIR],
+[
+ AC_REQUIRE([AC_PROG_INSTALL])dnl
+ AC_REQUIRE([AM_MKINSTALLDIRS])dnl
+ AC_REQUIRE([AC_PROG_CC])dnl
+ AC_REQUIRE([AC_CANONICAL_HOST])dnl
+ AC_REQUIRE([AC_PROG_RANLIB])dnl
+ AC_REQUIRE([AC_ISC_POSIX])dnl
+ AC_REQUIRE([AC_HEADER_STDC])dnl
+ AC_REQUIRE([AC_C_CONST])dnl
+ AC_REQUIRE([bh_C_SIGNED])dnl
+ AC_REQUIRE([AC_C_INLINE])dnl
+ AC_REQUIRE([AC_TYPE_OFF_T])dnl
+ AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+ AC_REQUIRE([jm_AC_TYPE_LONG_LONG])dnl
+ AC_REQUIRE([gt_TYPE_LONGDOUBLE])dnl
+ AC_REQUIRE([gt_TYPE_WCHAR_T])dnl
+ AC_REQUIRE([gt_TYPE_WINT_T])dnl
+ AC_REQUIRE([jm_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([jm_AC_HEADER_STDINT_H])
+ AC_REQUIRE([gt_TYPE_INTMAX_T])
+ AC_REQUIRE([gt_PRINTF_POSIX])
+ AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+ AC_REQUIRE([AC_FUNC_MMAP])dnl
+ AC_REQUIRE([jm_GLIBC21])dnl
+ AC_REQUIRE([gt_INTDIV0])dnl
+ AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])dnl
+ AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl
+ AC_REQUIRE([gt_INTTYPES_PRI])dnl
+ AC_REQUIRE([gl_XSIZE])dnl
+
+ AC_CHECK_TYPE([ptrdiff_t], ,
+ [AC_DEFINE([ptrdiff_t], [long],
+ [Define as the type of the result of subtracting two pointers, if the system doesn't define it.])
+ ])
+ AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
+stdlib.h string.h unistd.h sys/param.h])
+ AC_CHECK_FUNCS([asprintf fwprintf getcwd getegid geteuid getgid getuid \
+mempcpy munmap putenv setenv setlocale snprintf stpcpy strcasecmp strdup \
+strtoul tsearch wcslen __argz_count __argz_stringify __argz_next \
+__fsetlocking])
+
+ dnl Use the _snprintf function only if it is declared (because on NetBSD it
+ dnl is defined as a weak alias of snprintf; we prefer to use the latter).
+ gt_CHECK_DECL(_snprintf, [#include <stdio.h>])
+ gt_CHECK_DECL(_snwprintf, [#include <stdio.h>])
+
+ dnl Use the *_unlocked functions only if they are declared.
+ dnl (because some of them were defined without being declared in Solaris
+ dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built
+ dnl on Solaris 2.5.1 to run on Solaris 2.6).
+ dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13.
+ gt_CHECK_DECL(feof_unlocked, [#include <stdio.h>])
+ gt_CHECK_DECL(fgets_unlocked, [#include <stdio.h>])
+ gt_CHECK_DECL(getc_unlocked, [#include <stdio.h>])
+
+ case $gt_cv_func_printf_posix in
+ *yes) HAVE_POSIX_PRINTF=1 ;;
+ *) HAVE_POSIX_PRINTF=0 ;;
+ esac
+ AC_SUBST([HAVE_POSIX_PRINTF])
+ if test "$ac_cv_func_asprintf" = yes; then
+ HAVE_ASPRINTF=1
+ else
+ HAVE_ASPRINTF=0
+ fi
+ AC_SUBST([HAVE_ASPRINTF])
+ if test "$ac_cv_func_snprintf" = yes; then
+ HAVE_SNPRINTF=1
+ else
+ HAVE_SNPRINTF=0
+ fi
+ AC_SUBST([HAVE_SNPRINTF])
+ if test "$ac_cv_func_wprintf" = yes; then
+ HAVE_WPRINTF=1
+ else
+ HAVE_WPRINTF=0
+ fi
+ AC_SUBST([HAVE_WPRINTF])
+
+ AM_ICONV
+ AM_LANGINFO_CODESET
+ if test $ac_cv_header_locale_h = yes; then
+ AM_LC_MESSAGES
+ fi
+
+ dnl intl/plural.c is generated from intl/plural.y. It requires bison,
+ dnl because plural.y uses bison specific features. It requires at least
+ dnl bison-1.26 because earlier versions generate a plural.c that doesn't
+ dnl compile.
+ dnl bison is only needed for the maintainer (who touches plural.y). But in
+ dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put
+ dnl the rule in general Makefile. Now, some people carelessly touch the
+ dnl files or have a broken "make" program, hence the plural.c rule will
+ dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not
+ dnl present or too old.
+ AC_CHECK_PROGS([INTLBISON], [bison])
+ if test -z "$INTLBISON"; then
+ ac_verc_fail=yes
+ else
+ dnl Found it, now check the version.
+ AC_MSG_CHECKING([version of bison])
+changequote(<<,>>)dnl
+ ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+ case $ac_prog_version in
+ '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+ 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
+changequote([,])dnl
+ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+ *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ esac
+ AC_MSG_RESULT([$ac_prog_version])
+ fi
+ if test $ac_verc_fail = yes; then
+ INTLBISON=:
+ fi
+])
+
+
+dnl gt_CHECK_DECL(FUNC, INCLUDES)
+dnl Check whether a function is declared.
+AC_DEFUN([gt_CHECK_DECL],
+[
+ AC_CACHE_CHECK([whether $1 is declared], ac_cv_have_decl_$1,
+ [AC_TRY_COMPILE([$2], [
+#ifndef $1
+ char *p = (char *) $1;
+#endif
+], ac_cv_have_decl_$1=yes, ac_cv_have_decl_$1=no)])
+ if test $ac_cv_have_decl_$1 = yes; then
+ gt_value=1
+ else
+ gt_value=0
+ fi
+ AC_DEFINE_UNQUOTED([HAVE_DECL_]translit($1, [a-z], [A-Z]), [$gt_value],
+ [Define to 1 if you have the declaration of `$1', and to 0 if you don't.])
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version])
+AC_DEFUN([AM_GNU_GETTEXT_VERSION], [])
--- /dev/null
+# glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+# Test for the GNU C Library, version 2.1 or newer.
+# From Bruno Haible.
+
+AC_DEFUN([jm_GLIBC21],
+ [
+ AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer,
+ ac_cv_gnu_library_2_1,
+ [AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ ac_cv_gnu_library_2_1=yes,
+ ac_cv_gnu_library_2_1=no)
+ ]
+ )
+ AC_SUBST(GLIBC21)
+ GLIBC21="$ac_cv_gnu_library_2_1"
+ ]
+)
--- /dev/null
+# iconv.m4 serial AM4 (gettext-0.11.3)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
+[
+ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+
+ dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+ dnl accordingly.
+ AC_LIB_LINKFLAGS_BODY([iconv])
+])
+
+AC_DEFUN([AM_ICONV_LINK],
+[
+ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+ dnl those with the standalone portable GNU libiconv installed).
+
+ dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+ dnl accordingly.
+ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+
+ dnl Add $INCICONV to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed libiconv and not disabled its use
+ dnl via --without-libiconv-prefix, he wants to use it. The first
+ dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed.
+ am_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
+
+ AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+ [iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);],
+ am_cv_func_iconv=yes)
+ if test "$am_cv_func_iconv" != yes; then
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+ [iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);],
+ am_cv_lib_iconv=yes
+ am_cv_func_iconv=yes)
+ LIBS="$am_save_LIBS"
+ fi
+ ])
+ if test "$am_cv_func_iconv" = yes; then
+ AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.])
+ fi
+ if test "$am_cv_lib_iconv" = yes; then
+ AC_MSG_CHECKING([how to link with libiconv])
+ AC_MSG_RESULT([$LIBICONV])
+ else
+ dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
+ dnl either.
+ CPPFLAGS="$am_save_CPPFLAGS"
+ LIBICONV=
+ LTLIBICONV=
+ fi
+ AC_SUBST(LIBICONV)
+ AC_SUBST(LTLIBICONV)
+])
+
+AC_DEFUN([AM_ICONV],
+[
+ AM_ICONV_LINK
+ if test "$am_cv_func_iconv" = yes; then
+ AC_MSG_CHECKING([for iconv declaration])
+ AC_CACHE_VAL(am_cv_proto_iconv, [
+ AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const")
+ am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+ am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+ AC_MSG_RESULT([$]{ac_t:-
+ }[$]am_cv_proto_iconv)
+ AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
+ [Define as const if the declaration of iconv() needs const.])
+ fi
+])
--- /dev/null
+# intdiv0.m4 serial 1 (gettext-0.11.3)
+dnl Copyright (C) 2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gt_INTDIV0],
+[
+ AC_REQUIRE([AC_PROG_CC])dnl
+ AC_REQUIRE([AC_CANONICAL_HOST])dnl
+
+ AC_CACHE_CHECK([whether integer division by zero raises SIGFPE],
+ gt_cv_int_divbyzero_sigfpe,
+ [
+ AC_TRY_RUN([
+#include <stdlib.h>
+#include <signal.h>
+
+static void
+#ifdef __cplusplus
+sigfpe_handler (int sig)
+#else
+sigfpe_handler (sig) int sig;
+#endif
+{
+ /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */
+ exit (sig != SIGFPE);
+}
+
+int x = 1;
+int y = 0;
+int z;
+int nan;
+
+int main ()
+{
+ signal (SIGFPE, sigfpe_handler);
+/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */
+#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP)
+ signal (SIGTRAP, sigfpe_handler);
+#endif
+/* Linux/SPARC yields signal SIGILL. */
+#if defined (__sparc__) && defined (__linux__)
+ signal (SIGILL, sigfpe_handler);
+#endif
+
+ z = x / y;
+ nan = y / y;
+ exit (1);
+}
+], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no,
+ [
+ # Guess based on the CPU.
+ case "$host_cpu" in
+ alpha* | i[34567]86 | m68k | s390*)
+ gt_cv_int_divbyzero_sigfpe="guessing yes";;
+ *)
+ gt_cv_int_divbyzero_sigfpe="guessing no";;
+ esac
+ ])
+ ])
+ case "$gt_cv_int_divbyzero_sigfpe" in
+ *yes) value=1;;
+ *) value=0;;
+ esac
+ AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value,
+ [Define if integer division by zero raises signal SIGFPE.])
+])
--- /dev/null
+## intltool.m4 - Configure intltool for the target system. -*-Shell-script-*-
+## Copyright (C) 2001 Eazel, Inc.
+## Author: Maciej Stachowiak <mjs@noisehavoc.org>
+## Kenneth Christiansen <kenneth@gnu.org>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+##
+## As a special exception to the GNU General Public License, if you
+## distribute this file as part of a program that contains a
+## configuration script generated by Autoconf, you may include it under
+## the same distribution terms that you use for the rest of that program.
+
+dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml])
+# serial 2 IT_PROG_INTLTOOL
+AC_DEFUN([IT_PROG_INTLTOOL],
+[
+
+if test -n "$1"; then
+ AC_MSG_CHECKING(for intltool >= $1)
+
+ INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ printf "%d", $[1] * 100 + $[2]; }'`
+ INTLTOOL_APPLIED_VERSION=`awk -F\" '/\\$VERSION / { printf $[2]; }' < ${ac_aux_dir}/intltool-update.in`
+ changequote({{,}})
+ INTLTOOL_APPLIED_VERSION_AS_INT=`awk -F\" '/\\$VERSION / { split(${{2}}, VERSION, "."); printf "%d\n", VERSION[1] * 100 + VERSION[2];}' < ${ac_aux_dir}/intltool-update.in`
+ changequote([,])
+
+ if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT"; then
+ AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found])
+ else
+ AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found. Your intltool is too old. You need intltool $1 or later.])
+ exit 1
+ fi
+fi
+
+ INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -p $(top_srcdir)/po $< [$]@'
+ INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u /tmp $< [$]@'
+ INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+
+AC_SUBST(INTLTOOL_DESKTOP_RULE)
+AC_SUBST(INTLTOOL_DIRECTORY_RULE)
+AC_SUBST(INTLTOOL_KEYS_RULE)
+AC_SUBST(INTLTOOL_PROP_RULE)
+AC_SUBST(INTLTOOL_OAF_RULE)
+AC_SUBST(INTLTOOL_PONG_RULE)
+AC_SUBST(INTLTOOL_SERVER_RULE)
+AC_SUBST(INTLTOOL_SHEET_RULE)
+AC_SUBST(INTLTOOL_SOUNDLIST_RULE)
+AC_SUBST(INTLTOOL_UI_RULE)
+AC_SUBST(INTLTOOL_XAM_RULE)
+AC_SUBST(INTLTOOL_KBD_RULE)
+AC_SUBST(INTLTOOL_XML_RULE)
+AC_SUBST(INTLTOOL_XML_NOMERGE_RULE)
+AC_SUBST(INTLTOOL_CAVES_RULE)
+AC_SUBST(INTLTOOL_SCHEMAS_RULE)
+AC_SUBST(INTLTOOL_THEME_RULE)
+
+# Use the tools built into the package, not the ones that are installed.
+
+INTLTOOL_EXTRACT='$(top_builddir)/intltool-extract'
+INTLTOOL_MERGE='$(top_builddir)/intltool-merge'
+INTLTOOL_UPDATE='$(top_builddir)/intltool-update'
+
+AC_SUBST(INTLTOOL_EXTRACT)
+AC_SUBST(INTLTOOL_MERGE)
+AC_SUBST(INTLTOOL_UPDATE)
+
+AC_PATH_PROG(INTLTOOL_PERL, perl)
+if test -z "$INTLTOOL_PERL"; then
+ AC_MSG_ERROR([perl not found; required for intltool])
+fi
+if test -z "`$INTLTOOL_PERL -v | fgrep '5.' 2> /dev/null`"; then
+ AC_MSG_ERROR([perl 5.x required for intltool])
+fi
+if test "x$2" != "xno-xml"; then
+ AC_MSG_CHECKING([for XML::Parser])
+ if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then
+ AC_MSG_RESULT([ok])
+ else
+ AC_MSG_ERROR([XML::Parser perl module is required for intltool])
+ fi
+fi
+
+AC_PATH_PROG(INTLTOOL_ICONV, iconv, iconv)
+AC_PATH_PROG(INTLTOOL_MSGFMT, msgfmt, msgfmt)
+AC_PATH_PROG(INTLTOOL_MSGMERGE, msgmerge, msgmerge)
+AC_PATH_PROG(INTLTOOL_XGETTEXT, xgettext, xgettext)
+
+# Remove file type tags (using []) from po/POTFILES.
+
+ifdef([AC_DIVERSION_ICMDS],[
+ AC_DIVERT_PUSH(AC_DIVERSION_ICMDS)
+ changequote(,)
+ mv -f po/POTFILES po/POTFILES.tmp
+ sed -e '/\[encoding.*\]/d' -e 's/\[.*\] *//' < po/POTFILES.tmp > po/POTFILES
+ rm -f po/POTFILES.tmp
+ changequote([,])
+ AC_DIVERT_POP()
+],[
+ ifdef([AC_CONFIG_COMMANDS_PRE],[
+ AC_CONFIG_COMMANDS_PRE([
+ changequote(,)
+ mv -f po/POTFILES po/POTFILES.tmp
+ sed -e '/\[encoding.*\]/d' -e 's/\[.*\] *//' < po/POTFILES.tmp > po/POTFILES
+ rm -f po/POTFILES.tmp
+ changequote([,])
+ ])
+ ])
+
+############################################################################
+## Take this bit from AM_PROG_MKDIR_P to set mkdir_p for automake 1.4 users
+############################################################################
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # Keeping the `.' argument allows $(mkdir_p) to be used without
+ # argument. Indeed, we sometimes output rules like
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined.
+ # (`test -n '$(somedir)' && $(mkdir_p) $(somedir)' is a more
+ # expensive solution, as it forces Make to start a sub-shell.)
+ mkdir_p='mkdir -p -- .'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+AC_SUBST([mkdir_p])
+])
+
+# Manually sed perl in so people don't have to put the intltool scripts in AC_OUTPUT.
+
+AC_CONFIG_COMMANDS([intltool], [
+
+intltool_edit="-e 's#@INTLTOOL_EXTRACT@#`pwd`/intltool-extract#g' \
+ -e 's#@INTLTOOL_ICONV@#${INTLTOOL_ICONV}#g' \
+ -e 's#@INTLTOOL_MSGFMT@#${INTLTOOL_MSGFMT}#g' \
+ -e 's#@INTLTOOL_MSGMERGE@#${INTLTOOL_MSGMERGE}#g' \
+ -e 's#@INTLTOOL_XGETTEXT@#${INTLTOOL_XGETTEXT}#g' \
+ -e 's#@INTLTOOL_PERL@#${INTLTOOL_PERL}#g'"
+
+eval sed ${intltool_edit} < ${ac_aux_dir}/intltool-extract.in \
+ > intltool-extract.out
+if cmp -s intltool-extract intltool-extract.out 2>/dev/null; then
+ rm -f intltool-extract.out
+else
+ mv -f intltool-extract.out intltool-extract
+fi
+chmod ugo+x intltool-extract
+chmod u+w intltool-extract
+
+eval sed ${intltool_edit} < ${ac_aux_dir}/intltool-merge.in \
+ > intltool-merge.out
+if cmp -s intltool-merge intltool-merge.out 2>/dev/null; then
+ rm -f intltool-merge.out
+else
+ mv -f intltool-merge.out intltool-merge
+fi
+chmod ugo+x intltool-merge
+chmod u+w intltool-merge
+
+eval sed ${intltool_edit} < ${ac_aux_dir}/intltool-update.in \
+ > intltool-update.out
+if cmp -s intltool-update intltool-update.out 2>/dev/null; then
+ rm -f intltool-update.out
+else
+ mv -f intltool-update.out intltool-update
+fi
+chmod ugo+x intltool-update
+chmod u+w intltool-update
+
+], INTLTOOL_PERL='${INTLTOOL_PERL}' ac_aux_dir=${ac_aux_dir}
+INTLTOOL_EXTRACT='${INTLTOOL_EXTRACT}' ICONV='${INTLTOOL_ICONV}'
+MSGFMT='${INTLTOOL_MSGFMT}' MSGMERGE='${INTLTOOL_MSGMERGE}'
+XGETTEXT='${INTLTOOL_XGETTEXT}')
+
+])
+
+# deprecated macros
+AC_DEFUN([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL($@)])
+
--- /dev/null
+# intmax.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 2002-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether the system has the 'intmax_t' type, but don't attempt to
+dnl find a replacement if it is lacking.
+
+AC_DEFUN([gt_TYPE_INTMAX_T],
+[
+ AC_REQUIRE([jm_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([jm_AC_HEADER_STDINT_H])
+ AC_CACHE_CHECK(for intmax_t, gt_cv_c_intmax_t,
+ [AC_TRY_COMPILE([
+#include <stddef.h>
+#include <stdlib.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+#include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+#include <inttypes.h>
+#endif
+], [intmax_t x = -1;], gt_cv_c_intmax_t=yes, gt_cv_c_intmax_t=no)])
+ if test $gt_cv_c_intmax_t = yes; then
+ AC_DEFINE(HAVE_INTMAX_T, 1,
+ [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
+ fi
+])
--- /dev/null
+# inttypes-pri.m4 serial 1 (gettext-0.11.4)
+dnl Copyright (C) 1997-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+# Define PRI_MACROS_BROKEN if <inttypes.h> exists and defines the PRI*
+# macros to non-string values. This is the case on AIX 4.3.3.
+
+AC_DEFUN([gt_INTTYPES_PRI],
+[
+ AC_REQUIRE([gt_HEADER_INTTYPES_H])
+ if test $gt_cv_header_inttypes_h = yes; then
+ AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken],
+ gt_cv_inttypes_pri_broken,
+ [
+ AC_TRY_COMPILE([#include <inttypes.h>
+#ifdef PRId32
+char *p = PRId32;
+#endif
+], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes)
+ ])
+ fi
+ if test "$gt_cv_inttypes_pri_broken" = yes; then
+ AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1,
+ [Define if <inttypes.h> exists and defines unusable PRI* macros.])
+ fi
+])
--- /dev/null
+# inttypes.m4 serial 1 (gettext-0.11.4)
+dnl Copyright (C) 1997-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H if <inttypes.h> exists and doesn't clash with
+# <sys/types.h>.
+
+AC_DEFUN([gt_HEADER_INTTYPES_H],
+[
+ AC_CACHE_CHECK([for inttypes.h], gt_cv_header_inttypes_h,
+ [
+ AC_TRY_COMPILE(
+ [#include <sys/types.h>
+#include <inttypes.h>],
+ [], gt_cv_header_inttypes_h=yes, gt_cv_header_inttypes_h=no)
+ ])
+ if test $gt_cv_header_inttypes_h = yes; then
+ AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1,
+ [Define if <inttypes.h> exists and doesn't clash with <sys/types.h>.])
+ fi
+])
--- /dev/null
+# inttypes_h.m4 serial 5 (gettext-0.12)
+dnl Copyright (C) 1997-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([jm_AC_HEADER_INTTYPES_H],
+[
+ AC_CACHE_CHECK([for inttypes.h], jm_ac_cv_header_inttypes_h,
+ [AC_TRY_COMPILE(
+ [#include <sys/types.h>
+#include <inttypes.h>],
+ [uintmax_t i = (uintmax_t) -1;],
+ jm_ac_cv_header_inttypes_h=yes,
+ jm_ac_cv_header_inttypes_h=no)])
+ if test $jm_ac_cv_header_inttypes_h = yes; then
+ AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1,
+ [Define if <inttypes.h> exists, doesn't clash with <sys/types.h>,
+ and declares uintmax_t. ])
+ fi
+])
--- /dev/null
+# isc-posix.m4 serial 2 (gettext-0.11.2)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+# This file is not needed with autoconf-2.53 and newer. Remove it in 2005.
+
+# This test replaces the one in autoconf.
+# Currently this macro should have the same name as the autoconf macro
+# because gettext's gettext.m4 (distributed in the automake package)
+# still uses it. Otherwise, the use in gettext.m4 makes autoheader
+# give these diagnostics:
+# configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX
+# configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX
+
+undefine([AC_ISC_POSIX])
+
+AC_DEFUN([AC_ISC_POSIX],
+ [
+ dnl This test replaces the obsolescent AC_ISC_POSIX kludge.
+ AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"])
+ ]
+)
--- /dev/null
+# lcmessage.m4 serial 3 (gettext-0.11.3)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995.
+
+# Check whether LC_MESSAGES is available in <locale.h>.
+
+AC_DEFUN([AM_LC_MESSAGES],
+[
+ AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+ [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+ am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+ if test $am_cv_val_LC_MESSAGES = yes; then
+ AC_DEFINE(HAVE_LC_MESSAGES, 1,
+ [Define if your <locale.h> file defines LC_MESSAGES.])
+ fi
+])
--- /dev/null
+# lib-ld.m4 serial 3 (gettext-0.13)
+dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
+dnl with libtool.m4.
+
+dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ acl_cv_prog_gnu_ld=yes ;;
+*)
+ acl_cv_prog_gnu_ld=no ;;
+esac])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-1.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_ARG_WITH(gnu-ld,
+[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by GCC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]* | [A-Za-z]:[\\/]*)]
+ [re_direlt='/[^/][^/]*/\.\./']
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(acl_cv_path_LD,
+[if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ acl_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break ;;
+ *)
+ test "$with_gnu_ld" != yes && break ;;
+ esac
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_LIB_PROG_LD_GNU
+])
--- /dev/null
+# lib-link.m4 serial 4 (gettext-0.12)
+dnl Copyright (C) 2001-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ define([Name],[translit([$1],[./-], [___])])
+ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+ ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+ ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+ ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+ ])
+ LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+ LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+ INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+ dnl results of this search when this library appears as a dependency.
+ HAVE_LIB[]NAME=yes
+ undefine([Name])
+ undefine([NAME])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. If found, it
+dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
+dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ define([Name],[translit([$1],[./-], [___])])
+ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+
+ dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+ dnl accordingly.
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+ dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed lib[]Name and not disabled its use
+ dnl via --without-lib[]Name-prefix, he wants to use it.
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+ AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+ ac_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIB[]NAME"
+ AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
+ LIBS="$ac_save_LIBS"
+ ])
+ if test "$ac_cv_lib[]Name" = yes; then
+ HAVE_LIB[]NAME=yes
+ AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
+ AC_MSG_CHECKING([how to link with lib[]$1])
+ AC_MSG_RESULT([$LIB[]NAME])
+ else
+ HAVE_LIB[]NAME=no
+ dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+ dnl $INC[]NAME either.
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LIB[]NAME=
+ LTLIB[]NAME=
+ fi
+ AC_SUBST([HAVE_LIB]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ undefine([Name])
+ undefine([NAME])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
+dnl hardcode_direct, hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+ AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
+ AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
+ AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+ AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
+ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+ . ./conftest.sh
+ rm -f ./conftest.sh
+ acl_cv_rpath=done
+ ])
+ wl="$acl_cv_wl"
+ libext="$acl_cv_libext"
+ shlibext="$acl_cv_shlibext"
+ hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+ hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+ hardcode_direct="$acl_cv_hardcode_direct"
+ hardcode_minus_L="$acl_cv_hardcode_minus_L"
+ dnl Determine whether the user wants rpath handling at all.
+ AC_ARG_ENABLE(rpath,
+ [ --disable-rpath do not hardcode runtime library paths],
+ :, enable_rpath=yes)
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_LIB_ARG_WITH([lib$1-prefix],
+[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib
+ --without-lib$1-prefix don't search for lib$1 in includedir and libdir],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/lib"
+ fi
+ fi
+])
+ dnl Search the library and its dependencies in $additional_libdir and
+ dnl $LDFLAGS. Using breadth-first-seach.
+ LIB[]NAME=
+ LTLIB[]NAME=
+ INC[]NAME=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='$1 $2'
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+ dnl or AC_LIB_HAVE_LINKFLAGS call.
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+ else
+ dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+ dnl that this library doesn't exist. So just drop it.
+ :
+ fi
+ else
+ dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+ dnl and the already constructed $LIBNAME/$LTLIBNAME.
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ if test $use_additional = yes; then
+ if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+ found_dir="$additional_libdir"
+ found_so="$additional_libdir/lib$name.$shlibext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ else
+ if test -f "$additional_libdir/lib$name.$libext"; then
+ found_dir="$additional_libdir"
+ found_a="$additional_libdir/lib$name.$libext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+ found_dir="$dir"
+ found_so="$dir/lib$name.$shlibext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ else
+ if test -f "$dir/lib$name.$libext"; then
+ found_dir="$dir"
+ found_a="$dir/lib$name.$libext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ dnl Found the library.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ dnl Linking with a shared library. We attempt to hardcode its
+ dnl directory into the executable's runpath, unless it's the
+ dnl standard /usr/lib.
+ if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+ dnl No hardcoding is needed.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ dnl The hardcoding into $LIBNAME is system dependent.
+ if test "$hardcode_direct" = yes; then
+ dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+ dnl resulting binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ dnl Rely on "-L$found_dir".
+ dnl But don't add it if it's already contained in the LDFLAGS
+ dnl or the already constructed $LIBNAME
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+ fi
+ if test "$hardcode_minus_L" != no; then
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
+ dnl here, because this doesn't fit in flags passed to the
+ dnl compiler. So give up. No hardcoding. This affects only
+ dnl very old systems.
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ dnl Linking with a static library.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+ else
+ dnl We shouldn't come here, but anyway it's good to have a
+ dnl fallback.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+ fi
+ fi
+ dnl Assume the include files are nearby.
+ additional_includedir=
+ case "$found_dir" in
+ */lib | */lib/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ dnl Potentially add $additional_includedir to $INCNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 3. if it's already present in $CPPFLAGS or the already
+ dnl constructed $INCNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INC[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $INCNAME.
+ INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ dnl Look for dependencies.
+ if test -n "$found_la"; then
+ dnl Read the .la file. It defines the variables
+ dnl dlname, library_names, old_library, dependency_libs, current,
+ dnl age, revision, installed, dlopen, dlpreopen, libdir.
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ dnl We use only dependency_libs.
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 3. if it's already present in $LDFLAGS or the already
+ dnl constructed $LIBNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/lib"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/lib"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LIBNAME.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LTLIBNAME.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dnl Handle this in the next round.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.la)
+ dnl Handle this in the next round. Throw away the .la's
+ dnl directory; it is already contained in a preceding -L
+ dnl option.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ dnl Most likely an immediate library name.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ dnl Didn't find the library; assume it is in the system directories
+ dnl known to the linker and runtime loader. (All the system
+ dnl directories known to the linker should also be known to the
+ dnl runtime loader, otherwise the system is severely misconfigured.)
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$hardcode_libdir_separator"; then
+ dnl Weird platform: only the last -rpath option counts, the user must
+ dnl pass all path elements in one option. We can arrange that for a
+ dnl single library, but not when more than one $LIBNAMEs are used.
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+ done
+ dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ else
+ dnl The -rpath options are cumulative.
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ dnl When using libtool, the option that works for both libraries and
+ dnl executables is -R. The -R options are cumulative.
+ for found_dir in $ltrpathdirs; do
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+ done
+ fi
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+ for element in [$2]; do
+ haveit=
+ for x in $[$1]; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ [$1]="${[$1]}${[$1]:+ }$element"
+ fi
+ done
+])
--- /dev/null
+# lib-prefix.m4 serial 3 (gettext-0.13)
+dnl Copyright (C) 2001-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
+dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
+dnl require excessive bracketing.
+ifdef([AC_HELP_STRING],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
+[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+ AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_LIB_ARG_WITH([lib-prefix],
+[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+ --without-lib-prefix don't search for libraries in includedir and libdir],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/lib"
+ fi
+ fi
+])
+ if test $use_additional = yes; then
+ dnl Potentially add $additional_includedir to $CPPFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's already present in $CPPFLAGS,
+ dnl 3. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ for x in $CPPFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $CPPFLAGS.
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ dnl Potentially add $additional_libdir to $LDFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's already present in $LDFLAGS,
+ dnl 3. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/lib"; then
+ haveit=
+ for x in $LDFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_libdir" = "X/usr/local/lib"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LDFLAGS.
+ LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+ dnl Unfortunately, prefix and exec_prefix get only finally determined
+ dnl at the end of configure.
+ if test "X$prefix" = "XNONE"; then
+ acl_final_prefix="$ac_default_prefix"
+ else
+ acl_final_prefix="$prefix"
+ fi
+ if test "X$exec_prefix" = "XNONE"; then
+ acl_final_exec_prefix='${prefix}'
+ else
+ acl_final_exec_prefix="$exec_prefix"
+ fi
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+ prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ $1
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+])
--- /dev/null
+# longdouble.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 2002-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether the compiler supports the 'long double' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_LONGDOUBLE],
+[
+ AC_CACHE_CHECK([for long double], gt_cv_c_long_double,
+ [if test "$GCC" = yes; then
+ gt_cv_c_long_double=yes
+ else
+ AC_TRY_COMPILE([
+ /* The Stardent Vistra knows sizeof(long double), but does not support it. */
+ long double foo = 0.0;
+ /* On Ultrix 4.3 cc, long double is 4 and double is 8. */
+ int array [2*(sizeof(long double) >= sizeof(double)) - 1];
+ ], ,
+ gt_cv_c_long_double=yes, gt_cv_c_long_double=no)
+ fi])
+ if test $gt_cv_c_long_double = yes; then
+ AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the 'long double' type.])
+ fi
+])
--- /dev/null
+# longlong.m4 serial 4
+dnl Copyright (C) 1999-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_LONG_LONG if 'long long' works.
+
+AC_DEFUN([jm_AC_TYPE_LONG_LONG],
+[
+ AC_CACHE_CHECK([for long long], ac_cv_type_long_long,
+ [AC_TRY_LINK([long long ll = 1LL; int i = 63;],
+ [long long llmax = (long long) -1;
+ return ll << i | ll >> i | llmax / ll | llmax % ll;],
+ ac_cv_type_long_long=yes,
+ ac_cv_type_long_long=no)])
+ if test $ac_cv_type_long_long = yes; then
+ AC_DEFINE(HAVE_LONG_LONG, 1,
+ [Define if you have the 'long long' type.])
+ fi
+])
--- /dev/null
+# nls.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 1995-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+AC_DEFUN([AM_NLS],
+[
+ AC_MSG_CHECKING([whether NLS is requested])
+ dnl Default is enabled NLS
+ AC_ARG_ENABLE(nls,
+ [ --disable-nls do not use Native Language Support],
+ USE_NLS=$enableval, USE_NLS=yes)
+ AC_MSG_RESULT($USE_NLS)
+ AC_SUBST(USE_NLS)
+])
+
+AC_DEFUN([AM_MKINSTALLDIRS],
+[
+ dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
+ dnl find the mkinstalldirs script in another subdir but $(top_srcdir).
+ dnl Try to locate it.
+ MKINSTALLDIRS=
+ if test -n "$ac_aux_dir"; then
+ case "$ac_aux_dir" in
+ /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;;
+ *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;;
+ esac
+ fi
+ if test -z "$MKINSTALLDIRS"; then
+ MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+ fi
+ AC_SUBST(MKINSTALLDIRS)
+])
--- /dev/null
+# po.m4 serial 3 (gettext-0.14)
+dnl Copyright (C) 1995-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+dnl Checks for all prerequisites of the po subdirectory.
+AC_DEFUN([AM_PO_SUBDIRS],
+[
+ AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+ AC_REQUIRE([AC_PROG_INSTALL])dnl
+ AC_REQUIRE([AM_MKINSTALLDIRS])dnl
+ AC_REQUIRE([AM_NLS])dnl
+
+ dnl Perform the following tests also if --disable-nls has been given,
+ dnl because they are needed for "make dist" to work.
+
+ dnl Search for GNU msgfmt in the PATH.
+ dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
+ dnl The second test excludes FreeBSD msgfmt.
+ AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+ [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 &&
+ (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+ :)
+ AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+
+ dnl Search for GNU xgettext 0.12 or newer in the PATH.
+ dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
+ dnl The second test excludes FreeBSD xgettext.
+ AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+ [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+ (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+ :)
+ dnl Remove leftover from FreeBSD xgettext call.
+ rm -f messages.po
+
+ dnl Search for GNU msgmerge 0.11 or newer in the PATH.
+ AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
+ [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :)
+
+ dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
+ dnl Test whether we really found GNU msgfmt.
+ if test "$GMSGFMT" != ":"; then
+ dnl If it is no GNU msgfmt we define it as : so that the
+ dnl Makefiles still can work.
+ if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 &&
+ (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ : ;
+ else
+ GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
+ AC_MSG_RESULT(
+ [found $GMSGFMT program is not GNU msgfmt; ignore it])
+ GMSGFMT=":"
+ fi
+ fi
+
+ dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
+ dnl Test whether we really found GNU xgettext.
+ if test "$XGETTEXT" != ":"; then
+ dnl If it is no GNU xgettext we define it as : so that the
+ dnl Makefiles still can work.
+ if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+ (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ : ;
+ else
+ AC_MSG_RESULT(
+ [found xgettext program is not GNU xgettext; ignore it])
+ XGETTEXT=":"
+ fi
+ dnl Remove leftover from FreeBSD xgettext call.
+ rm -f messages.po
+ fi
+
+ AC_OUTPUT_COMMANDS([
+ for ac_file in $CONFIG_FILES; do
+ # Support "outfile[:infile[:infile...]]"
+ case "$ac_file" in
+ *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ esac
+ # PO directories have a Makefile.in generated from Makefile.in.in.
+ case "$ac_file" in */Makefile.in)
+ # Adjust a relative srcdir.
+ ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+ ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+ ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+ # In autoconf-2.13 it is called $ac_given_srcdir.
+ # In autoconf-2.50 it is called $srcdir.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+ if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+ rm -f "$ac_dir/POTFILES"
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+ cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+ POMAKEFILEDEPS="POTFILES.in"
+ # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
+ # on $ac_dir but don't depend on user-specified configuration
+ # parameters.
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ if test -n "$OBSOLETE_ALL_LINGUAS"; then
+ test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+ fi
+ ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+ # Hide the ALL_LINGUAS assigment from automake.
+ eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+ POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+ else
+ # The set of available languages was given in configure.in.
+ eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+ fi
+ # Compute POFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+ # Compute UPDATEPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+ # Compute DUMMYPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+ # Compute GMOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ GMOFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ done
+ fi
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+ sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+ for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+ if test -f "$f"; then
+ case "$f" in
+ *.orig | *.bak | *~) ;;
+ *) cat "$f" >> "$ac_dir/Makefile" ;;
+ esac
+ fi
+ done
+ fi
+ ;;
+ esac
+ done],
+ [# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+ # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
+ # from automake.
+ eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+ # Capture the value of LINGUAS because we need it to compute CATALOGS.
+ LINGUAS="${LINGUAS-%UNSET%}"
+ ])
+])
+
+dnl Postprocesses a Makefile in a directory containing PO files.
+AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE],
+[
+ # When this code is run, in config.status, two variables have already been
+ # set:
+ # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in,
+ # - LINGUAS is the value of the environment variable LINGUAS at configure
+ # time.
+
+changequote(,)dnl
+ # Adjust a relative srcdir.
+ ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+ ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+ ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+ # In autoconf-2.13 it is called $ac_given_srcdir.
+ # In autoconf-2.50 it is called $srcdir.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ # Find a way to echo strings without interpreting backslash.
+ if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then
+ gt_echo='echo'
+ else
+ if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then
+ gt_echo='printf %s\n'
+ else
+ echo_func () {
+ cat <<EOT
+$*
+EOT
+ }
+ gt_echo='echo_func'
+ fi
+ fi
+
+ # A sed script that extracts the value of VARIABLE from a Makefile.
+ sed_x_variable='
+# Test if the hold space is empty.
+x
+s/P/P/
+x
+ta
+# Yes it was empty. Look if we have the expected variable definition.
+/^[ ]*VARIABLE[ ]*=/{
+ # Seen the first line of the variable definition.
+ s/^[ ]*VARIABLE[ ]*=//
+ ba
+}
+bd
+:a
+# Here we are processing a line from the variable definition.
+# Remove comment, more precisely replace it with a space.
+s/#.*$/ /
+# See if the line ends in a backslash.
+tb
+:b
+s/\\$//
+# Print the line, without the trailing backslash.
+p
+tc
+# There was no trailing backslash. The end of the variable definition is
+# reached. Clear the hold space.
+s/^.*$//
+x
+bd
+:c
+# A trailing backslash means that the variable definition continues in the
+# next line. Put a nonempty string into the hold space to indicate this.
+s/^.*$/P/
+x
+:d
+'
+changequote([,])dnl
+
+ # Set POTFILES to the value of the Makefile variable POTFILES.
+ sed_x_POTFILES="`$gt_echo \"$sed_x_variable\" | sed -e '/^ *#/d' -e 's/VARIABLE/POTFILES/g'`"
+ POTFILES=`sed -n -e "$sed_x_POTFILES" < "$ac_file"`
+ # Compute POTFILES_DEPS as
+ # $(foreach file, $(POTFILES), $(top_srcdir)/$(file))
+ POTFILES_DEPS=
+ for file in $POTFILES; do
+ POTFILES_DEPS="$POTFILES_DEPS "'$(top_srcdir)/'"$file"
+ done
+ POMAKEFILEDEPS=""
+
+ if test -n "$OBSOLETE_ALL_LINGUAS"; then
+ test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+ fi
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+ POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+ else
+ # Set ALL_LINGUAS to the value of the Makefile variable LINGUAS.
+ sed_x_LINGUAS="`$gt_echo \"$sed_x_variable\" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'`"
+ ALL_LINGUAS_=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"`
+ fi
+ # Hide the ALL_LINGUAS assigment from automake.
+ eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+ # Compute POFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+ # Compute UPDATEPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+ # Compute DUMMYPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+ # Compute GMOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+ # Compute PROPERTIESFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).properties)
+ # Compute CLASSFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).class)
+ # Compute QMFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).qm)
+ # Compute MSGFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang)).msg)
+ # Compute RESOURCESDLLFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang))/$(DOMAIN).resources.dll)
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ GMOFILES=
+ PROPERTIESFILES=
+ CLASSFILES=
+ QMFILES=
+ MSGFILES=
+ RESOURCESDLLFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ PROPERTIESFILES="$PROPERTIESFILES \$(top_srcdir)/\$(DOMAIN)_$lang.properties"
+ CLASSFILES="$CLASSFILES \$(top_srcdir)/\$(DOMAIN)_$lang.class"
+ QMFILES="$QMFILES $srcdirpre$lang.qm"
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ MSGFILES="$MSGFILES $srcdirpre$frobbedlang.msg"
+ frobbedlang=`echo $lang | sed -e 's/_/-/g'`
+ RESOURCESDLLFILES="$RESOURCESDLLFILES $srcdirpre$frobbedlang/\$(DOMAIN).resources.dll"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ JAVACATALOGS=
+ QTCATALOGS=
+ TCLCATALOGS=
+ CSHARPCATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ JAVACATALOGS="$JAVACATALOGS \$(DOMAIN)_$lang.properties"
+ QTCATALOGS="$QTCATALOGS $lang.qm"
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ TCLCATALOGS="$TCLCATALOGS $frobbedlang.msg"
+ frobbedlang=`echo $lang | sed -e 's/_/-/g'`
+ CSHARPCATALOGS="$CSHARPCATALOGS $frobbedlang/\$(DOMAIN).resources.dll"
+ done
+ fi
+
+ sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp"
+ if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then
+ # Add dependencies that cannot be formulated as a simple suffix rule.
+ for lang in $ALL_LINGUAS; do
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ cat >> "$ac_file.tmp" <<EOF
+$frobbedlang.msg: $lang.po
+ @echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
+ \$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+ done
+ fi
+ if grep -l '@CSHARPCATALOGS@' "$ac_file" > /dev/null; then
+ # Add dependencies that cannot be formulated as a simple suffix rule.
+ for lang in $ALL_LINGUAS; do
+ frobbedlang=`echo $lang | sed -e 's/_/-/g'`
+ cat >> "$ac_file.tmp" <<EOF
+$frobbedlang/\$(DOMAIN).resources.dll: $lang.po
+ @echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
+ \$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+ done
+ fi
+ if test -n "$POMAKEFILEDEPS"; then
+ cat >> "$ac_file.tmp" <<EOF
+Makefile: $POMAKEFILEDEPS
+EOF
+ fi
+ mv "$ac_file.tmp" "$ac_file"
+])
--- /dev/null
+# printf-posix.m4 serial 2 (gettext-0.13.1)
+dnl Copyright (C) 2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether the printf() function supports POSIX/XSI format strings with
+dnl positions.
+
+AC_DEFUN([gt_PRINTF_POSIX],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_CACHE_CHECK([whether printf() supports POSIX/XSI format strings],
+ gt_cv_func_printf_posix,
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+ dollar expansion (possibly an autoconf bug). */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+ sprintf (buf, format, 33, 55);
+ return (strcmp (buf, "55 33") != 0);
+}], gt_cv_func_printf_posix=yes, gt_cv_func_printf_posix=no,
+ [
+ AC_EGREP_CPP(notposix, [
+#if defined __NetBSD__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__
+ notposix
+#endif
+ ], gt_cv_func_printf_posix="guessing no",
+ gt_cv_func_printf_posix="guessing yes")
+ ])
+ ])
+ case $gt_cv_func_printf_posix in
+ *yes)
+ AC_DEFINE(HAVE_POSIX_PRINTF, 1,
+ [Define if your printf() function supports format strings with positions.])
+ ;;
+ esac
+])
--- /dev/null
+# progtest.m4 serial 3 (gettext-0.12)
+dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+# Search path for a program which passes the given test.
+
+dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST],
+[
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
+else
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+ [[\\/]]* | ?:[[\\/]]*)
+ ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in ifelse([$5], , $PATH, [$5]); do
+ IFS="$ac_save_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ if [$3]; then
+ ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$ac_save_IFS"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+ ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+ AC_MSG_RESULT([$]$1)
+else
+ AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])
--- /dev/null
+# signed.m4 serial 1 (gettext-0.10.40)
+dnl Copyright (C) 2001-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([bh_C_SIGNED],
+[
+ AC_CACHE_CHECK([for signed], bh_cv_c_signed,
+ [AC_TRY_COMPILE(, [signed char x;], bh_cv_c_signed=yes, bh_cv_c_signed=no)])
+ if test $bh_cv_c_signed = no; then
+ AC_DEFINE(signed, ,
+ [Define to empty if the C compiler doesn't support this keyword.])
+ fi
+])
--- /dev/null
+# size_max.m4 serial 2
+dnl Copyright (C) 2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_SIZE_MAX],
+[
+ AC_CHECK_HEADERS(stdint.h)
+ dnl First test whether the system already has SIZE_MAX.
+ AC_MSG_CHECKING([for SIZE_MAX])
+ result=
+ AC_EGREP_CPP([Found it], [
+#include <limits.h>
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef SIZE_MAX
+Found it
+#endif
+], result=yes)
+ if test -z "$result"; then
+ dnl Define it ourselves. Here we assume that the type 'size_t' is not wider
+ dnl than the type 'unsigned long'.
+ dnl The _AC_COMPUTE_INT macro works up to LONG_MAX, since it uses 'expr',
+ dnl which is guaranteed to work from LONG_MIN to LONG_MAX.
+ _AC_COMPUTE_INT([~(size_t)0 / 10], res_hi,
+ [#include <stddef.h>], result=?)
+ _AC_COMPUTE_INT([~(size_t)0 % 10], res_lo,
+ [#include <stddef.h>], result=?)
+ _AC_COMPUTE_INT([sizeof (size_t) <= sizeof (unsigned int)], fits_in_uint,
+ [#include <stddef.h>], result=?)
+ if test "$fits_in_uint" = 1; then
+ dnl Even though SIZE_MAX fits in an unsigned int, it must be of type
+ dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'.
+ AC_TRY_COMPILE([#include <stddef.h>
+ extern size_t foo;
+ extern unsigned long foo;
+ ], [], fits_in_uint=0)
+ fi
+ if test -z "$result"; then
+ if test "$fits_in_uint" = 1; then
+ result="$res_hi$res_lo"U
+ else
+ result="$res_hi$res_lo"UL
+ fi
+ else
+ dnl Shouldn't happen, but who knows...
+ result='~(size_t)0'
+ fi
+ fi
+ AC_MSG_RESULT([$result])
+ if test "$result" != yes; then
+ AC_DEFINE_UNQUOTED([SIZE_MAX], [$result],
+ [Define as the maximum value of type 'size_t', if the system doesn't define it.])
+ fi
+])
--- /dev/null
+# stdint_h.m4 serial 3 (gettext-0.12)
+dnl Copyright (C) 1997-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_STDINT_H_WITH_UINTMAX if <stdint.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([jm_AC_HEADER_STDINT_H],
+[
+ AC_CACHE_CHECK([for stdint.h], jm_ac_cv_header_stdint_h,
+ [AC_TRY_COMPILE(
+ [#include <sys/types.h>
+#include <stdint.h>],
+ [uintmax_t i = (uintmax_t) -1;],
+ jm_ac_cv_header_stdint_h=yes,
+ jm_ac_cv_header_stdint_h=no)])
+ if test $jm_ac_cv_header_stdint_h = yes; then
+ AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1,
+ [Define if <stdint.h> exists, doesn't clash with <sys/types.h>,
+ and declares uintmax_t. ])
+ fi
+])
--- /dev/null
+# uintmax_t.m4 serial 7 (gettext-0.12)
+dnl Copyright (C) 1997-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+AC_PREREQ(2.13)
+
+# Define uintmax_t to 'unsigned long' or 'unsigned long long'
+# if it is not already defined in <stdint.h> or <inttypes.h>.
+
+AC_DEFUN([jm_AC_TYPE_UINTMAX_T],
+[
+ AC_REQUIRE([jm_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([jm_AC_HEADER_STDINT_H])
+ if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then
+ AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG])
+ test $ac_cv_type_unsigned_long_long = yes \
+ && ac_type='unsigned long long' \
+ || ac_type='unsigned long'
+ AC_DEFINE_UNQUOTED(uintmax_t, $ac_type,
+ [Define to unsigned long or unsigned long long
+ if <stdint.h> and <inttypes.h> don't define.])
+ else
+ AC_DEFINE(HAVE_UINTMAX_T, 1,
+ [Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>.])
+ fi
+])
--- /dev/null
+# ulonglong.m4 serial 3
+dnl Copyright (C) 1999-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_UNSIGNED_LONG_LONG if 'unsigned long long' works.
+
+AC_DEFUN([jm_AC_TYPE_UNSIGNED_LONG_LONG],
+[
+ AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long,
+ [AC_TRY_LINK([unsigned long long ull = 1ULL; int i = 63;],
+ [unsigned long long ullmax = (unsigned long long) -1;
+ return ull << i | ull >> i | ullmax / ull | ullmax % ull;],
+ ac_cv_type_unsigned_long_long=yes,
+ ac_cv_type_unsigned_long_long=no)])
+ if test $ac_cv_type_unsigned_long_long = yes; then
+ AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1,
+ [Define if you have the 'unsigned long long' type.])
+ fi
+])
--- /dev/null
+# wchar_t.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 2002-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether <stddef.h> has the 'wchar_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WCHAR_T],
+[
+ AC_CACHE_CHECK([for wchar_t], gt_cv_c_wchar_t,
+ [AC_TRY_COMPILE([#include <stddef.h>
+ wchar_t foo = (wchar_t)'\0';], ,
+ gt_cv_c_wchar_t=yes, gt_cv_c_wchar_t=no)])
+ if test $gt_cv_c_wchar_t = yes; then
+ AC_DEFINE(HAVE_WCHAR_T, 1, [Define if you have the 'wchar_t' type.])
+ fi
+])
--- /dev/null
+# wint_t.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether <wchar.h> has the 'wint_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WINT_T],
+[
+ AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t,
+ [AC_TRY_COMPILE([#include <wchar.h>
+ wint_t foo = (wchar_t)'\0';], ,
+ gt_cv_c_wint_t=yes, gt_cv_c_wint_t=no)])
+ if test $gt_cv_c_wint_t = yes; then
+ AC_DEFINE(HAVE_WINT_T, 1, [Define if you have the 'wint_t' type.])
+ fi
+])
--- /dev/null
+# xsize.m4 serial 2
+dnl Copyright (C) 2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+AC_DEFUN([gl_XSIZE],
+[
+ dnl Prerequisites of lib/xsize.h.
+ AC_REQUIRE([gl_SIZE_MAX])
+ AC_CHECK_HEADERS(stdint.h)
+])
--- /dev/null
+## Makefile.am -- Process this file with automake to produce Makefile.in
+## Copyright (C) 2002 James Su
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+MAINTAINERCLEANFILES = Makefile.in
+CLEANFILES = *.bak
+
+SUBDIRS = frontend imengine config filter
--- /dev/null
+## Makefile.am -- Process this file with automake to produce Makefile.in
+## Copyright (C) 2002 James Su
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+MAINTAINERCLEANFILES = Makefile.in
+CLEANFILES = *.bak
+EXTRA_DIST = config.version-script
+
+INCLUDES = -I$(top_builddir) \
+ -I$(top_builddir)/ism/src \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/ism/src \
+ -I$(top_srcdir)/ism/intl \
+ -DSCIM_DATADIR=\"@SCIM_DATADIR@\" \
+ -DSCIM_LOCALEDIR=\"@SCIM_LOCALEDIR@\" \
+ -DSCIM_SYSCONFDIR=\"@SCIM_SYSCONFDIR@\" \
+ -DSCIM_LIBEXECDIR=\"@SCIM_LIBEXECDIR@\" \
+ -DSCIM_ICONDIR=\"@SCIM_ICONDIR@\" \
+ -DSCIM_MODULE_PATH=\"@SCIM_MODULE_PATH@\"
+
+moduledir = @SCIM_MODULE_PATH@/$(SCIM_BINARY_VERSION)/Config
+
+noinst_HEADERS = scim_simple_config.h \
+ scim_socket_config.h
+
+if SCIM_BUILD_CONFIG_SIMPLE
+CONFIG_SIMPLE_MODULE = simple.la
+endif
+
+if SCIM_BUILD_CONFIG_SOCKET
+CONFIG_SOCKET_MODULE = socket.la
+endif
+
+if SCIM_LD_VERSION_SCRIPT
+LD_VERSION_SCRIPT_OPTION="-Wl,--version-script=$(srcdir)/config.version-script"
+endif
+
+module_LTLIBRARIES = \
+ $(CONFIG_SIMPLE_MODULE) \
+ $(CONFIG_SOCKET_MODULE)
+
+simple_la_SOURCES = scim_simple_config.cpp
+
+simple_la_LDFLAGS = -avoid-version \
+ -rpath $(moduledir) \
+ -module \
+ $(LD_VERSION_SCRIPT_OPTION) \
+ @LIBTOOL_EXPORT_OPTIONS@ \
+ @LTLIBINTL@
+
+simple_la_LIBADD = $(top_builddir)/ism/src/libscim@SCIM_EPOCH@.la
+
+socket_la_SOURCES = scim_socket_config.cpp
+
+socket_la_LDFLAGS = -avoid-version \
+ -rpath $(moduledir) \
+ -module \
+ $(LD_VERSION_SCRIPT_OPTION) \
+ @LIBTOOL_EXPORT_OPTIONS@ \
+ @LTLIBINTL@
+
+socket_la_LIBADD = $(top_builddir)/ism/src/libscim@SCIM_EPOCH@.la
+
--- /dev/null
+SCIM_CONFIG_1.0 {
+ global:
+ extern "C" {
+ *scim_config_module_create_config*;
+ *scim_config_module_init*;
+ *scim_module_exit*;
+ *scim_module_init*;
+ };
+
+ local:
+ extern "C++" {
+ scim::*;
+ std::*;
+ __gnu_cxx::*;
+ };
+};
--- /dev/null
+/** @file scim_simple_config.cpp
+ * implementation of SimpleConfig class.
+ */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_simple_config.cpp,v 1.35 2005/07/06 03:57:04 suzhe Exp $
+ */
+
+#define Uses_SCIM_CONFIG_BASE
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_STL_IOSTREAM
+#define Uses_STL_FSTREAM
+#define Uses_C_STDIO
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include "scim_private.h"
+#include "scim.h"
+#include "scim_simple_config.h"
+
+#ifndef SCIM_SYSCONFDIR
+ #define SCIM_SYSCONFDIR "/etc"
+#endif
+
+#define scim_module_init simple_LTX_scim_module_init
+#define scim_module_exit simple_LTX_scim_module_exit
+#define scim_config_module_init simple_LTX_scim_config_module_init
+#define scim_config_module_create_config simple_LTX_scim_config_module_create_config
+
+using namespace scim;
+
+extern "C" {
+ void scim_module_init (void)
+ {
+ SCIM_DEBUG_CONFIG(1) << "Initializing Simple Config module...\n";
+ }
+
+ void scim_module_exit (void)
+ {
+ SCIM_DEBUG_CONFIG(1) << "Exiting Simple Config module...\n";
+ }
+
+ void scim_config_module_init ()
+ {
+ SCIM_DEBUG_CONFIG(1) << "Initializing Simple Config module (more)...\n";
+ }
+
+ ConfigPointer scim_config_module_create_config ()
+ {
+ SCIM_DEBUG_CONFIG(1) << "Creating a Simple Config instance...\n";
+ return new SimpleConfig ();
+ }
+}
+
+namespace scim {
+
+SimpleConfig::SimpleConfig ()
+ : m_need_reload (false)
+{
+ m_update_timestamp.tv_sec = 0;
+ m_update_timestamp.tv_usec = 0;
+
+ load_all_config ();
+}
+
+SimpleConfig::~SimpleConfig ()
+{
+ flush ();
+}
+
+bool
+SimpleConfig::valid () const
+{
+ return ConfigBase::valid();
+}
+
+String
+SimpleConfig::get_name () const
+{
+ return "simple";
+}
+
+// String
+bool
+SimpleConfig::read (const String& key, String *pStr) const
+{
+ if (!valid () || !pStr || key.empty()) return false;
+
+ KeyValueRepository::const_iterator i = m_new_config.find (key);
+ KeyValueRepository::const_iterator end = m_new_config.end ();
+
+ if (i == end) {
+ i = m_config.find (key);
+ end = m_config.end ();
+ }
+
+ if (i != end) {
+ *pStr = i->second;
+ return true;
+ }
+
+ *pStr = String ("");
+ return false;
+}
+
+// int
+bool
+SimpleConfig::read (const String& key, int *pl) const
+{
+ if (!valid () || !pl || key.empty()) return false;
+
+ KeyValueRepository::const_iterator i = m_new_config.find (key);
+ KeyValueRepository::const_iterator end = m_new_config.end ();
+
+ if (i == end || !i->second.length ()) {
+ i = m_config.find (key);
+ end = m_config.end ();
+ }
+
+ if (i != end && i->second.length ()) {
+ *pl = strtol (i->second.c_str (), (char**) NULL, 10);
+ return true;
+ }
+
+ *pl = 0;
+ return false;
+}
+
+// double
+bool
+SimpleConfig::read (const String& key, double* val) const
+{
+ if (!valid () || !val || key.empty()) return false;
+
+ KeyValueRepository::const_iterator i = m_new_config.find (key);
+ KeyValueRepository::const_iterator end = m_new_config.end ();
+
+ if (i == end || !i->second.length ()) {
+ i = m_config.find (key);
+ end = m_config.end ();
+ }
+
+ if (i != end && i->second.length ()) {
+ *val = strtod (i->second.c_str (), (char**) NULL);
+ return true;
+ }
+
+ *val = 0;
+ return false;
+}
+
+// bool
+bool
+SimpleConfig::read (const String& key, bool* val) const
+{
+ if (!valid () || !val || key.empty()) return false;
+
+ KeyValueRepository::const_iterator i = m_new_config.find (key);
+ KeyValueRepository::const_iterator end = m_new_config.end ();
+
+ if (i == end || !i->second.length ()) {
+ i = m_config.find (key);
+ end = m_config.end ();
+ }
+
+ if (i != end && i->second.length ()) {
+ if (i->second == "true" || i->second == "TRUE" || i->second == "True" ||
+ i->second == "1") {
+ *val = true;
+ return true;
+ } else if (i->second == "false" || i->second == "FALSE" || i->second == "False" ||
+ i->second == "0") {
+ *val = false;
+ return true;
+ }
+ }
+
+ *val = false;
+ return false;
+}
+
+//String list
+bool
+SimpleConfig::read (const String& key, std::vector <String>* val) const
+{
+ if (!valid () || !val || key.empty()) return false;
+
+ KeyValueRepository::const_iterator i = m_new_config.find (key);
+ KeyValueRepository::const_iterator end = m_new_config.end ();
+
+ if (i == end) {
+ i = m_config.find (key);
+ end = m_config.end ();
+ }
+
+ val->clear ();
+
+ if (i != end) {
+ scim_split_string_list (*val, i->second, ',');
+ return true;
+ }
+
+ return false;
+}
+
+//int list
+bool
+SimpleConfig::read (const String& key, std::vector <int>* val) const
+{
+ if (!valid () || !val || key.empty()) return false;
+
+ KeyValueRepository::const_iterator i = m_new_config.find (key);
+ KeyValueRepository::const_iterator end = m_new_config.end ();
+
+ if (i == end) {
+ i = m_config.find (key);
+ end = m_config.end ();
+ }
+
+ val->clear();
+
+ if (i != end) {
+ std::vector <String> vec;
+ scim_split_string_list (vec, i->second, ',');
+
+ for (std::vector <String>::iterator j = vec.begin (); j != vec.end (); ++j) {
+ int result = strtol (j->c_str (), (char**)NULL, 10);
+ val->push_back (result);
+ }
+ return true;
+ }
+
+ return false;
+}
+
+// write the value (return true on success)
+bool
+SimpleConfig::write (const String& key, const String& value)
+{
+ if (!valid () || key.empty()) return false;
+
+ m_new_config [key] = value;
+
+ remove_key_from_erased_list (key);
+
+ m_need_reload = true;
+
+ return true;
+}
+
+bool
+SimpleConfig::write (const String& key, int value)
+{
+ if (!valid () || key.empty()) return false;
+
+ char buf [256];
+
+ snprintf (buf, 255, "%d", value);
+
+ m_new_config [key] = String (buf);
+
+ remove_key_from_erased_list (key);
+
+ m_need_reload = true;
+
+ return true;
+}
+
+bool
+SimpleConfig::write (const String& key, double value)
+{
+ if (!valid () || key.empty()) return false;
+
+ char buf [256];
+
+ snprintf (buf, 255, "%lf", value);
+
+ m_new_config [key] = String (buf);
+
+ remove_key_from_erased_list (key);
+
+ m_need_reload = true;
+
+ return true;
+}
+
+bool
+SimpleConfig::write (const String& key, bool value)
+{
+ if (!valid () || key.empty()) return false;
+
+ if (value)
+ m_new_config [key] = String ("true");
+ else
+ m_new_config [key] = String ("false");
+
+ remove_key_from_erased_list (key);
+
+ m_need_reload = true;
+
+ return true;
+}
+
+bool
+SimpleConfig::write (const String& key, const std::vector <String>& value)
+{
+ if (!valid () || key.empty()) return false;
+
+ m_new_config [key] = scim_combine_string_list (value, ',');
+
+ remove_key_from_erased_list (key);
+
+ m_need_reload = true;
+
+ return true;
+}
+
+bool
+SimpleConfig::write (const String& key, const std::vector <int>& value)
+{
+ if (!valid () || key.empty()) return false;
+
+ std::vector <String> vec;
+ char buf [256];
+
+ for (std::vector <int>::const_iterator i = value.begin (); i != value.end (); ++i) {
+ snprintf (buf, 255, "%d", *i);
+ vec.push_back (String (buf));
+ }
+
+ m_new_config [key] = scim_combine_string_list (vec, ',');
+
+ remove_key_from_erased_list (key);
+
+ m_need_reload = true;
+
+ return true;
+}
+
+// permanently writes all changes
+bool
+SimpleConfig::flush()
+{
+ if (!valid ()) return false;
+
+ // If no config has been modified, then just return.
+ if (!m_new_config.size () && !m_erased_keys.size ())
+ return true;
+
+ String userconf = get_userconf_filename ();
+ String userconf_dir = get_userconf_dir ();
+
+ if (access (userconf_dir.c_str (), R_OK | W_OK) != 0) {
+ mkdir (userconf_dir.c_str (), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
+ if (access (userconf_dir.c_str (), R_OK | W_OK) != 0)
+ return false;
+ }
+
+ if (userconf.length ()) {
+ // Reload config to ensure user made modification won't lost.
+ load_all_config ();
+
+ std::ofstream os (userconf.c_str ());
+ if (!os) return false;
+
+ KeyValueRepository::iterator i;
+ std::vector<String>::iterator j;
+
+ // Merge new config with old ones.
+ for (i = m_new_config.begin (); i != m_new_config.end (); ++i)
+ m_config [i->first] = i->second;
+
+ // Remove all erased keys.
+ for (j = m_erased_keys.begin (); j != m_erased_keys.end (); ++j) {
+ if ((i = m_config.find (*j)) != m_config.end ())
+ m_config.erase (i);
+ }
+
+ m_new_config.clear ();
+ m_erased_keys.clear ();
+
+ gettimeofday (&m_update_timestamp, 0);
+
+ char buf [128];
+ snprintf (buf, 128, "%lu:%lu", m_update_timestamp.tv_sec, m_update_timestamp.tv_usec);
+
+ m_config [String (SCIM_CONFIG_UPDATE_TIMESTAMP)] = String (buf);
+
+ save_config (os);
+ return true;
+ }
+
+ return false;
+}
+
+// delete entries
+bool
+SimpleConfig::erase (const String& key)
+{
+ if (!valid ()) return false;
+
+ KeyValueRepository::iterator i = m_new_config.find(key);
+ KeyValueRepository::iterator j = m_config.find(key);
+ bool ok = false;
+
+ if (i != m_new_config.end ()) {
+ m_new_config.erase (i);
+ ok = true;
+ }
+
+ if (j != m_config.end ()) {
+ m_config.erase (j);
+ ok = true;
+ }
+
+ if (ok && std::find (m_erased_keys.begin (), m_erased_keys.end (), key) == m_erased_keys.end ())
+ m_erased_keys.push_back (key);
+
+ m_need_reload = true;
+
+ return ok;
+}
+
+bool
+SimpleConfig::reload ()
+{
+ if (!valid ()) return false;
+
+ if (load_all_config ()) {
+ m_new_config.clear ();
+ m_erased_keys.clear ();
+ m_need_reload = true;
+ }
+
+ if (m_need_reload) {
+ m_need_reload = false;
+ return ConfigBase::reload ();
+ }
+
+ return false;
+}
+
+String
+SimpleConfig::get_sysconf_dir ()
+{
+ return String (SCIM_SYSCONFDIR) +
+ String (SCIM_PATH_DELIM_STRING) +
+ String ("scim");
+}
+
+String
+SimpleConfig::get_userconf_dir ()
+{
+ return scim_get_user_data_dir ();
+}
+
+String
+SimpleConfig::get_sysconf_filename ()
+{
+ return get_sysconf_dir () +
+ String (SCIM_PATH_DELIM_STRING) +
+ String ("config");
+}
+
+String
+SimpleConfig::get_userconf_filename ()
+{
+ return get_userconf_dir () +
+ String (SCIM_PATH_DELIM_STRING) +
+ String ("config");
+}
+
+String
+SimpleConfig::trim_blank (const String &str)
+{
+ String::size_type begin, len;
+
+ begin = str.find_first_not_of (" \t\n\v");
+
+ if (begin == String::npos)
+ return String ();
+
+ len = str.find_last_not_of (" \t\n\v") - begin + 1;
+
+ return str.substr (begin, len);
+}
+
+String
+SimpleConfig::get_param_portion (const String &str)
+{
+ String::size_type begin = str.find_first_of (" \t\n\v=");
+
+ if (begin == String::npos) return str;
+
+ return str.substr (0, begin);
+}
+
+String
+SimpleConfig::get_value_portion (const String &str)
+{
+ String::size_type begin = str.find_first_of ("=");
+
+ if (begin == String::npos || (begin + 1) == str.length ()) return String ("");
+
+ return trim_blank (str.substr (begin + 1, String::npos));
+}
+
+void
+SimpleConfig::parse_config (std::istream &is, KeyValueRepository &config)
+{
+ char *conf_line = new char [SCIM_MAX_CONFIG_LINE_LENGTH];
+
+ while (!is.eof()) {
+ is.getline(conf_line, SCIM_MAX_CONFIG_LINE_LENGTH);
+ if (!is.eof()) {
+ String normalized_line = trim_blank(conf_line);
+
+ if ((normalized_line.find_first_of("#") > 0) && (normalized_line.length() != 0)) {
+ if (normalized_line.find_first_of("=") == String::npos) {
+ SCIM_DEBUG_CONFIG(2) << " Invalid config line : " << normalized_line << "\n";
+ continue;
+ }
+
+ if (normalized_line[0] == '=') {
+ SCIM_DEBUG_CONFIG(2) << " Invalid config line : " << normalized_line << "\n";
+ continue;
+ }
+
+ String param = get_param_portion(normalized_line);
+ KeyValueRepository::iterator i = config.find(param);
+
+ if (i != config.end()) {
+ SCIM_DEBUG_CONFIG(2) << " Config entry " << normalized_line << " has been read.\n";
+ } else {
+ String value = get_value_portion (normalized_line);
+ config [param] = value;
+ SCIM_DEBUG_CONFIG(2) << " Config entry " << param << "=" << value << " is successfully read.\n";
+ }
+ }
+ }
+ }
+
+ delete [] conf_line;
+}
+
+void
+SimpleConfig::save_config (std::ostream &os)
+{
+ KeyValueRepository::iterator i;
+ for (i = m_config.begin (); i != m_config.end (); ++i) {
+ os << i->first << " = " << i->second << "\n";
+ }
+}
+
+bool
+SimpleConfig::load_all_config ()
+{
+ String sysconf = get_sysconf_filename ();
+ String userconf = get_userconf_filename ();
+
+ KeyValueRepository config;
+
+ if (userconf.length ()) {
+ std::ifstream is (userconf.c_str ());
+ if (is) {
+ SCIM_DEBUG_CONFIG(1) << "Parsing user config file: "
+ << userconf << "\n";
+ parse_config (is, config);
+ }
+ }
+
+ if (sysconf.length ()) {
+ std::ifstream is (sysconf.c_str ());
+ if (is) {
+ SCIM_DEBUG_CONFIG(1) << "Parsing system config file: "
+ << sysconf << "\n";
+ parse_config (is, config);
+ }
+ }
+
+ if (!m_config.size () || (m_update_timestamp.tv_sec == 0 && m_update_timestamp.tv_usec == 0)) {
+ m_config.swap (config);
+ gettimeofday (&m_update_timestamp, 0);
+ return true;
+ }
+
+ KeyValueRepository::iterator it = config.find (String (SCIM_CONFIG_UPDATE_TIMESTAMP));
+
+ if (it != config.end ()) {
+ std::vector <String> strs;
+ if (scim_split_string_list (strs, it->second, ':') == 2) {
+ time_t sec = (time_t) strtol (strs [0].c_str (), 0, 10);
+ suseconds_t usec = (suseconds_t) strtol (strs [1].c_str (), 0, 10);
+
+ // The config file is newer, so load it.
+ if (m_update_timestamp.tv_sec < sec || (m_update_timestamp.tv_sec == sec && m_update_timestamp.tv_usec < usec)) {
+ m_config.swap (config);
+ m_update_timestamp.tv_sec = (time_t) sec;
+ m_update_timestamp.tv_usec = (suseconds_t) usec;
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+void
+SimpleConfig::remove_key_from_erased_list (const String &key)
+{
+ std::vector <String>::iterator it = std::find (m_erased_keys.begin (), m_erased_keys.end (), key);
+
+ if (it != m_erased_keys.end ())
+ m_erased_keys.erase (it);
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_simple_config.h
+ * definition of SimpleConfig class.
+ */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_simple_config.h,v 1.22 2005/07/06 03:57:04 suzhe Exp $
+ */
+
+#if !defined (__SCIM_SIMPLE_CONFIG_H)
+#define __SCIM_SIMPLE_CONFIG_H
+
+#include <sys/time.h>
+#include "scim_stl_map.h"
+
+namespace scim {
+
+const int SCIM_MAX_CONFIG_LINE_LENGTH = 16384;
+
+class SimpleConfig : public ConfigBase
+{
+#if SCIM_USE_STL_EXT_HASH_MAP
+typedef __gnu_cxx::hash_map <String, String, scim_hash_string> KeyValueRepository;
+#elif SCIM_USE_STL_HASH_MAP
+typedef std::hash_map <String, String, scim_hash_string> KeyValueRepository;
+#else
+typedef std::map <String, String> KeyValueRepository;
+#endif
+
+ KeyValueRepository m_config;
+ KeyValueRepository m_new_config;
+ std::vector <String> m_erased_keys;
+ timeval m_update_timestamp;
+ bool m_need_reload;
+
+public:
+ SimpleConfig ();
+
+ virtual ~SimpleConfig ();
+
+ virtual bool valid () const;
+
+ virtual String get_name () const;
+
+ // String
+ virtual bool read (const String& key, String *pStr) const;
+
+ // int
+ virtual bool read (const String& key, int *pl) const;
+
+ // double
+ virtual bool read (const String& key, double* val) const;
+
+ // bool
+ virtual bool read (const String& key, bool* val) const;
+
+ //String list
+ virtual bool read (const String& key, std::vector <String>* val) const;
+
+ //int list
+ virtual bool read (const String& key, std::vector <int>* val) const;
+
+ // write the value (return true on success)
+ virtual bool write (const String& key, const String& value);
+ virtual bool write (const String& key, int value);
+ virtual bool write (const String& key, double value);
+ virtual bool write (const String& key, bool value);
+ virtual bool write (const String& key, const std::vector <String>& value);
+ virtual bool write (const String& key, const std::vector <int>& value);
+
+ // permanently writes all changes
+ virtual bool flush();
+
+ // delete entries
+ virtual bool erase (const String& key );
+
+ // reload the configurations.
+ virtual bool reload ();
+private:
+ String get_sysconf_dir ();
+ String get_userconf_dir ();
+ String get_sysconf_filename ();
+ String get_userconf_filename ();
+
+ String trim_blank (const String &str);
+ String get_param_portion (const String &str);
+ String get_value_portion (const String &str);
+
+ void parse_config (std::istream &is, KeyValueRepository &config);
+
+ void save_config (std::ostream &os);
+
+ bool load_all_config ();
+
+ void remove_key_from_erased_list (const String &key);
+};
+
+} // namespace scim
+
+#endif
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_socket_config.cpp
+ * implementation of SocketConfig class.
+ */
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_socket_config.cpp,v 1.23 2005/12/16 11:12:26 suzhe Exp $
+ */
+
+#define Uses_SCIM_CONFIG_BASE
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_SCIM_SOCKET
+#define Uses_SCIM_TRANSACTION
+#define Uses_C_STDIO
+#define Uses_C_STDLIB
+
+#include "scim_private.h"
+#include "scim.h"
+#include "scim_socket_config.h"
+
+#define scim_module_init socket_LTX_scim_module_init
+#define scim_module_exit socket_LTX_scim_module_exit
+#define scim_config_module_init socket_LTX_scim_config_module_init
+#define scim_config_module_create_config socket_LTX_scim_config_module_create_config
+
+using namespace scim;
+
+extern "C" {
+ void scim_module_init (void)
+ {
+ SCIM_DEBUG_CONFIG(1) << "Initializing Socket Config module...\n";
+ }
+
+ void scim_module_exit (void)
+ {
+ SCIM_DEBUG_CONFIG(1) << "Exiting Socket Config module...\n";
+ }
+
+ void scim_config_module_init ()
+ {
+ SCIM_DEBUG_CONFIG(1) << "Initializing Socket Config module (more)...\n";
+ }
+
+ ConfigPointer scim_config_module_create_config ()
+ {
+ SCIM_DEBUG_CONFIG(1) << "Creating a Socket Config instance...\n";
+ return new SocketConfig ();
+ }
+}
+
+namespace scim {
+
+SocketConfig::SocketConfig ()
+ : m_socket_address (scim_get_default_socket_config_address ()),
+ m_socket_timeout (scim_get_default_socket_timeout ()),
+ m_valid (false),
+ m_connected (false)
+{
+ SCIM_DEBUG_CONFIG (2) << " Construct SocketConfig object.\n";
+
+ m_valid = open_connection ();
+}
+
+SocketConfig::~SocketConfig ()
+{
+ m_socket_client.close ();
+}
+
+bool
+SocketConfig::valid () const
+{
+ return ConfigBase::valid() && m_valid;
+}
+
+String
+SocketConfig::get_name () const
+{
+ return "socket";
+}
+
+// String
+bool
+SocketConfig::read (const String& key, String *pStr) const
+{
+ if (!valid () || !pStr || key.empty()) return false;
+ if (!m_connected && !open_connection ()) return false;
+
+ Transaction trans;
+
+ int cmd;
+
+ for (int retry = 0; retry < 3; ++retry) {
+ init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_GET_CONFIG_STRING);
+ trans.put_data (key);
+
+ if (trans.write_to_socket (m_socket_client) &&
+ trans.read_from_socket (m_socket_client, m_socket_timeout)) {
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_data (*pStr) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK)
+ return true;
+
+ break;
+ }
+
+ if (!open_connection ())
+ break;
+ }
+
+ *pStr = String ("");
+ return false;
+}
+
+// int
+bool
+SocketConfig::read (const String& key, int *pl) const
+{
+ if (!valid () || !pl || key.empty()) return false;
+ if (!m_connected && !open_connection ()) return false;
+
+ Transaction trans;
+ int cmd;
+
+ for (int retry = 0; retry < 3; ++retry) {
+ init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_GET_CONFIG_INT);
+ trans.put_data (key);
+
+ if (trans.write_to_socket (m_socket_client) &&
+ trans.read_from_socket (m_socket_client, m_socket_timeout)) {
+ uint32 val;
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_data (val) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) {
+ *pl = val;
+ return true;
+ }
+
+ break;
+ }
+
+ if (!open_connection ())
+ break;
+ }
+
+ *pl = 0;
+ return false;
+}
+
+// double
+bool
+SocketConfig::read (const String& key, double* val) const
+{
+ if (!valid () || !val || key.empty()) return false;
+ if (!m_connected && !open_connection ()) return false;
+
+ Transaction trans;
+ int cmd;
+
+ for (int retry = 0; retry < 3; ++retry) {
+ init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_GET_CONFIG_DOUBLE);
+ trans.put_data (key);
+
+ if (trans.write_to_socket (m_socket_client) &&
+ trans.read_from_socket (m_socket_client, m_socket_timeout)) {
+ String str;
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_data (str) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) {
+ sscanf (str.c_str (), "%lE", val);
+ return true;
+ }
+
+ break;
+ }
+
+ if (!open_connection ())
+ break;
+ }
+
+ *val = 0;
+ return false;
+}
+
+// bool
+bool
+SocketConfig::read (const String& key, bool* val) const
+{
+ if (!valid () || !val || key.empty()) return false;
+ if (!m_connected && !open_connection ()) return false;
+
+ Transaction trans;
+ int cmd;
+
+ for (int retry = 0; retry < 3; ++retry) {
+ init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_GET_CONFIG_BOOL);
+ trans.put_data (key);
+
+ if (trans.write_to_socket (m_socket_client) &&
+ trans.read_from_socket (m_socket_client, m_socket_timeout)) {
+ uint32 tmp;
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_data (tmp) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) {
+ *val = (bool)tmp;
+ return true;
+ }
+
+ break;
+ }
+
+ if (!open_connection ())
+ break;
+ }
+
+ *val = false;
+ return false;
+}
+
+//String list
+bool
+SocketConfig::read (const String& key, std::vector <String>* val) const
+{
+ if (!valid () || !val || key.empty()) return false;
+ if (!m_connected && !open_connection ()) return false;
+
+ val->clear ();
+
+ Transaction trans;
+ int cmd;
+
+ for (int retry = 0; retry < 3; ++retry) {
+ init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_GET_CONFIG_VECTOR_STRING);
+ trans.put_data (key);
+
+ if (trans.write_to_socket (m_socket_client) &&
+ trans.read_from_socket (m_socket_client, m_socket_timeout)) {
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_data (*val) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) {
+ return true;
+ }
+
+ break;
+ }
+
+ if (!open_connection ())
+ break;
+ }
+
+ return false;
+}
+
+//int list
+bool
+SocketConfig::read (const String& key, std::vector <int>* val) const
+{
+ if (!valid () || !val || key.empty()) return false;
+ if (!m_connected && !open_connection ()) return false;
+
+ val->clear();
+
+ Transaction trans;
+ int cmd;
+
+ for (int retry = 0; retry < 3; ++retry) {
+ init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_GET_CONFIG_VECTOR_INT);
+ trans.put_data (key);
+
+ if (trans.write_to_socket (m_socket_client) &&
+ trans.read_from_socket (m_socket_client, m_socket_timeout)) {
+ std::vector<uint32> vec;
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_data (vec) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) {
+ for (uint32 i=0; i<vec.size (); ++i)
+ val->push_back ((int) vec[i]);
+ return true;
+ }
+
+ break;
+ }
+
+ if (!open_connection ())
+ break;
+ }
+
+ return false;
+}
+
+// write the value (return true on success)
+bool
+SocketConfig::write (const String& key, const String& value)
+{
+ if (!valid () || key.empty()) return false;
+ if (!m_connected && !open_connection ()) return false;
+
+ Transaction trans;
+ int cmd;
+
+ for (int retry = 0; retry < 3; ++retry) {
+ init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_SET_CONFIG_STRING);
+ trans.put_data (key);
+ trans.put_data (value);
+
+ if (trans.write_to_socket (m_socket_client) &&
+ trans.read_from_socket (m_socket_client, m_socket_timeout)) {
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK)
+ return true;
+
+ break;
+ }
+
+ if (!open_connection ())
+ break;
+ }
+
+ return false;
+}
+
+bool
+SocketConfig::write (const String& key, int value)
+{
+ if (!valid () || key.empty()) return false;
+ if (!m_connected && !open_connection ()) return false;
+
+ Transaction trans;
+ int cmd;
+
+ for (int retry = 0; retry < 3; ++retry) {
+ init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_SET_CONFIG_INT);
+ trans.put_data (key);
+ trans.put_data ((uint32)value);
+
+ if (trans.write_to_socket (m_socket_client) &&
+ trans.read_from_socket (m_socket_client, m_socket_timeout)) {
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK)
+ return true;
+
+ break;
+ }
+
+ if (!open_connection ())
+ break;
+ }
+
+ return false;
+}
+
+bool
+SocketConfig::write (const String& key, double value)
+{
+ if (!valid () || key.empty()) return false;
+ if (!m_connected && !open_connection ()) return false;
+
+ char buf [256];
+ snprintf (buf, 255, "%lE", value);
+
+ Transaction trans;
+ int cmd;
+
+ for (int retry = 0; retry < 3; ++retry) {
+ init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_SET_CONFIG_DOUBLE);
+ trans.put_data (key);
+ trans.put_data (String (buf));
+
+ if (trans.write_to_socket (m_socket_client) &&
+ trans.read_from_socket (m_socket_client, m_socket_timeout)) {
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK)
+ return true;
+
+ break;
+ }
+
+ if (!open_connection ())
+ break;
+ }
+
+ return false;
+}
+
+bool
+SocketConfig::write (const String& key, bool value)
+{
+ if (!valid () || key.empty()) return false;
+ if (!m_connected && !open_connection ()) return false;
+
+ Transaction trans;
+ int cmd;
+
+ for (int retry = 0; retry < 3; ++retry) {
+ init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_SET_CONFIG_BOOL);
+ trans.put_data (key);
+ trans.put_data ((uint32)value);
+
+ if (trans.write_to_socket (m_socket_client) &&
+ trans.read_from_socket (m_socket_client, m_socket_timeout)) {
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK)
+ return true;
+
+ break;
+ }
+
+ if (!open_connection ())
+ break;
+ }
+
+ return false;
+}
+
+bool
+SocketConfig::write (const String& key, const std::vector <String>& value)
+{
+ if (!valid () || key.empty()) return false;
+ if (!m_connected && !open_connection ()) return false;
+
+ Transaction trans;
+ int cmd;
+
+ for (int retry = 0; retry < 3; ++retry) {
+ init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_SET_CONFIG_VECTOR_STRING);
+ trans.put_data (key);
+ trans.put_data (value);
+
+ if (trans.write_to_socket (m_socket_client) &&
+ trans.read_from_socket (m_socket_client, m_socket_timeout)) {
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK)
+ return true;
+
+ break;
+ }
+
+ if (!open_connection ())
+ break;
+ }
+
+ return false;
+}
+
+bool
+SocketConfig::write (const String& key, const std::vector <int>& value)
+{
+ if (!valid () || key.empty()) return false;
+ if (!m_connected && !open_connection ()) return false;
+
+ std::vector <uint32> vec;
+
+ for (uint32 i=0; i<value.size (); ++i)
+ vec.push_back ((uint32) value [i]);
+
+ Transaction trans;
+ int cmd;
+
+ for (int retry = 0; retry < 3; ++retry) {
+ init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_SET_CONFIG_VECTOR_INT);
+ trans.put_data (key);
+ trans.put_data (vec);
+
+ if (trans.write_to_socket (m_socket_client) &&
+ trans.read_from_socket (m_socket_client, m_socket_timeout)) {
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK)
+ return true;
+
+ break;
+ }
+
+ if (!open_connection ())
+ break;
+ }
+
+ return false;
+}
+
+// permanently writes all changes
+bool
+SocketConfig::flush()
+{
+ if (!valid ()) return false;
+ if (!m_connected && !open_connection ()) return false;
+
+ Transaction trans;
+ int cmd;
+
+ for (int retry = 0; retry < 3; ++retry) {
+ init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_FLUSH_CONFIG);
+
+ if (trans.write_to_socket (m_socket_client) &&
+ trans.read_from_socket (m_socket_client, m_socket_timeout)) {
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) {
+ gettimeofday (&m_update_timestamp, 0);
+ return true;
+ }
+ break;
+ }
+
+ if (!open_connection ())
+ break;
+ }
+
+ return false;
+}
+
+// delete entries
+bool
+SocketConfig::erase (const String& key)
+{
+ if (!valid ()) return false;
+ if (!m_connected && !open_connection ()) return false;
+
+ Transaction trans;
+ int cmd;
+
+ for (int retry = 0; retry < 3; ++retry) {
+ init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_ERASE_CONFIG);
+ trans.put_data (key);
+
+ if (trans.write_to_socket (m_socket_client) &&
+ trans.read_from_socket (m_socket_client, m_socket_timeout)) {
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK)
+ return true;
+
+ break;
+ }
+
+ if (!open_connection ())
+ break;
+ }
+
+ return false;
+}
+
+bool
+SocketConfig::reload ()
+{
+ if (!valid ()) return false;
+ if (!m_connected && !open_connection ()) return false;
+
+ Transaction trans;
+ int cmd;
+
+ for (int retry = 0; retry < 3; ++retry) {
+ init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_RELOAD_CONFIG);
+
+ // The reload process may take very long time, so wait a little longer time.
+ if (trans.write_to_socket (m_socket_client) &&
+ trans.read_from_socket (m_socket_client, m_socket_timeout * 10)) {
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) {
+ String str;
+ if (read (String (SCIM_CONFIG_UPDATE_TIMESTAMP), &str)) {
+ std::vector <String> strs;
+ if (scim_split_string_list (strs, str, ':') == 2) {
+ time_t sec = (time_t) strtol (strs [0].c_str (), 0, 10);
+ suseconds_t usec = (suseconds_t) strtol (strs [1].c_str (), 0, 10);
+
+ // The config file is newer, so load it.
+ if (m_update_timestamp.tv_sec < sec ||
+ (m_update_timestamp.tv_sec == sec && m_update_timestamp.tv_usec < usec)) {
+ m_update_timestamp.tv_sec = sec;
+ m_update_timestamp.tv_usec = usec;
+ return ConfigBase::reload ();
+ }
+ }
+ }
+ }
+ break;
+ }
+
+ if (!open_connection ())
+ break;
+ }
+
+ return false;
+}
+
+void
+SocketConfig::init_transaction (Transaction &trans) const
+{
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_data (m_socket_magic_key);
+}
+
+bool
+SocketConfig::open_connection () const
+{
+ SocketAddress socket_address (m_socket_address);
+
+ m_connected = false;
+
+ // Connect to SocketFrontEnd.
+ if (!m_socket_client.connect (socket_address)) {
+ for (int i = 0; i < 6; ++i) {
+ if (m_socket_client.connect (socket_address))
+ break;
+ scim_usleep (100000);
+ std::cerr << " Re-connecting to ISF(scim) server. SocketConfig connect count : " << i+1 << "\n";
+ ISF_SYSLOG (" Re-connecting to ISF(scim) server. SocketConfig connect count : %d\n", i+1);
+ }
+ }
+
+ if (!m_socket_client.is_connected ()) {
+ std::cerr << " Cannot connect to SocketFrontEnd (" << m_socket_address << ").\n";
+ ISF_SYSLOG (" Cannot connect to SocketFrontEnd (%s).\n", m_socket_address.c_str ());
+ return false;
+ }
+
+ // Init the connection,
+ if (!scim_socket_open_connection (m_socket_magic_key,
+ String ("SocketConfig"),
+ String ("SocketFrontEnd"),
+ m_socket_client,
+ m_socket_timeout)) {
+ m_socket_client.close ();
+ return false;
+ }
+
+ ISF_SYSLOG (" Connect to SocketFrontEnd (%s).\n", m_socket_address.c_str ());
+ m_connected = true;
+ gettimeofday (&m_update_timestamp, 0);
+ return true;
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_socket_config.h
+ * definition of SocketConfig class.
+ */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_socket_config.h,v 1.11 2005/07/06 03:57:04 suzhe Exp $
+ */
+
+#if !defined (__SCIM_SOCKET_CONFIG_H)
+#define __SCIM_SOCKET_CONFIG_H
+
+#include <sys/time.h>
+
+namespace scim {
+
+class SocketConfig : public ConfigBase
+{
+ String m_socket_address;
+ int m_socket_timeout;
+ bool m_valid;
+ mutable SocketClient m_socket_client;
+ mutable uint32 m_socket_magic_key;
+ mutable bool m_connected;
+ mutable timeval m_update_timestamp;
+
+public:
+ SocketConfig ();
+
+ virtual ~SocketConfig ();
+
+ virtual bool valid () const;
+
+ virtual String get_name () const;
+
+ // String
+ virtual bool read (const String& key, String *pStr) const;
+
+ // int
+ virtual bool read (const String& key, int *pl) const;
+
+ // double
+ virtual bool read (const String& key, double* val) const;
+
+ // bool
+ virtual bool read (const String& key, bool* val) const;
+
+ //String list
+ virtual bool read (const String& key, std::vector <String>* val) const;
+
+ //int list
+ virtual bool read (const String& key, std::vector <int>* val) const;
+
+ // write the value (return true on success)
+ virtual bool write (const String& key, const String& value);
+ virtual bool write (const String& key, int value);
+ virtual bool write (const String& key, double value);
+ virtual bool write (const String& key, bool value);
+ virtual bool write (const String& key, const std::vector <String>& value);
+ virtual bool write (const String& key, const std::vector <int>& value);
+
+ // permanently writes all changes
+ virtual bool flush();
+
+ // delete entries
+ virtual bool erase (const String& key );
+
+ // reload the configurations.
+ virtual bool reload ();
+private:
+ void init_transaction (Transaction &trans) const;
+ bool open_connection () const;
+};
+
+} // namespace scim
+
+#endif
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+## Makefile.am -- Process this file with automake to produce Makefile.in
+## Copyright (C) 2002 James Su
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+MAINTAINERCLEANFILES = Makefile.in
+CLEANFILES = *.bak
+
+INCLUDES = -I$(top_builddir) \
+ -I$(top_builddir)/ism/src \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/ism/src \
+ -I$(top_srcdir)/ism/intl \
+ -I$(top_srcdir)/ism/utils \
+ -DSCIM_DATADIR=\"@SCIM_DATADIR@\" \
+ -DSCIM_LOCALEDIR=\"@SCIM_LOCALEDIR@\" \
+ -DSCIM_SYSCONFDIR=\"@SCIM_SYSCONFDIR@\" \
+ -DSCIM_LIBEXECDIR=\"@SCIM_LIBEXECDIR@\" \
+ -DSCIM_ICONDIR=\"@SCIM_ICONDIR@\" \
+ -DSCIM_MODULE_PATH=\"@SCIM_MODULE_PATH@\" \
+ -DSCIM_TEMPDIR=\"@SCIM_TEMPDIR@\"
+
+if SCIM_BUILD_FILTER_SCTC
+CONFIG_FILTER_SCTC = sctc.la
+endif
+
+noinst_HEADERS = scim_sctc_filter.h \
+ scim_sctc_filter_data.h
+
+moduledir = @SCIM_MODULE_PATH@/$(SCIM_BINARY_VERSION)/Filter
+module_LTLIBRARIES = $(CONFIG_FILTER_SCTC)
+
+sctc_la_SOURCES = scim_sctc_filter.cpp
+
+sctc_la_LDFLAGS = -avoid-version \
+ -rpath $(moduledir) \
+ -module \
+ @LIBTOOL_EXPORT_OPTIONS@ \
+ @LTLIBINTL@
+
+sctc_la_LIBADD = $(top_builddir)/ism/src/libscim@SCIM_EPOCH@.la
+
--- /dev/null
+/** @file scim_sctc_filter.cpp
+ */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_sctc_filter.cpp,v 1.7.2.1 2006/01/09 13:37:25 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_FILTER
+#define Uses_SCIM_FILTER_MODULE
+#define Uses_SCIM_CONFIG_BASE
+#include "scim_private.h"
+#include "scim.h"
+#include "scim_stl_map.h"
+#include "scim_sctc_filter.h"
+#include "scim_sctc_filter_data.h"
+
+#define scim_module_init sctc_LTX_scim_module_init
+#define scim_module_exit sctc_LTX_scim_module_exit
+#define scim_filter_module_init sctc_LTX_scim_filter_module_init
+#define scim_filter_module_create_filter sctc_LTX_scim_filter_module_create_filter
+#define scim_filter_module_get_filter_info sctc_LTX_scim_filter_module_get_filter_info
+
+using namespace scim;
+
+// Private datatype definition.
+#if SCIM_USE_STL_EXT_HASH_MAP
+typedef __gnu_cxx::hash_map <unsigned short, unsigned short, __gnu_cxx::hash <unsigned short> > UUMap;
+#elif SCIM_USE_STL_HASH_MAP
+typedef std::hash_map <unsigned short, unsigned short, std::hash <unsigned short> > UUMap;
+#else
+typedef std::map <unsigned short, unsigned short> UUMap;
+#endif
+
+// Private data definition.
+static FilterInfo __filter_info (String ("adb861a9-76da-454c-941b-1957e644a94e"),
+ String (_("Simplified-Traditional Chinese Conversion")),
+ String ("zh_CN,zh_TW,zh_SG,zh_HK"),
+ String (SCTC_ICON_PNG),
+ String (_("Convert between Simplified Chinese and Traditional Chinese")));
+
+static std::vector <String> __sc_encodings;
+static std::vector <String> __tc_encodings;
+
+static UUMap __sc_to_tc_map;
+static UUMap __tc_to_sc_map;
+static bool __sc_to_tc_initialized = false;
+static bool __tc_to_sc_initialized = false;
+
+static Property __prop_root (String ("/Filter/SCTC"),
+ String (_("SC-TC")),
+ String (SCTC_ICON_PNG),
+ String (_("Simplified-Traditional Chinese conversion")));
+
+static Property __prop_off (String ("/Filter/SCTC/Off"),
+ String (_("No Conversion")),
+ String (SCTC_ICON_PNG),
+ String (_("Simplified-Traditional Chinese conversion")));
+
+static Property __prop_sc_to_tc (String ("/Filter/SCTC/SC-TC"),
+ String (_("Simplified to Traditional")),
+ String (SC_TO_TC_ICON_PNG),
+ String (_("Convert Simplified Chinese to Traditional Chinese")));
+
+static Property __prop_tc_to_sc (String ("/Filter/SCTC/TC-SC"),
+ String (_("Traditional to Simplified")),
+ String (TC_TO_SC_ICON_PNG),
+ String (_("Convert Traditional Chinese to Simplified Chinese")));
+
+//Private functions definition.
+static void __init_sc_to_tc ();
+static void __init_tc_to_sc ();
+
+static bool __is_sc_encoding (const String &encoding);
+static bool __is_tc_encoding (const String &encoding);
+
+static WideString __sc_to_tc (const WideString &sc);
+static WideString __tc_to_sc (const WideString &tc);
+
+
+//Module Interface
+extern "C" {
+ void scim_module_init (void)
+ {
+ //Initialize encoding information.
+ __sc_encodings.push_back ("GB2312");
+ __sc_encodings.push_back ("GBK");
+ __sc_encodings.push_back ("GB18030");
+ __sc_encodings.push_back ("EUC-CN");
+ __tc_encodings.push_back ("BIG5");
+ __tc_encodings.push_back ("BIG5-HKSCS");
+ __tc_encodings.push_back ("EUC-TW");
+ }
+
+ void scim_module_exit (void)
+ {
+ }
+
+ unsigned int scim_filter_module_init (const ConfigPointer &config)
+ {
+ return 1;
+ }
+
+ FilterFactoryPointer scim_filter_module_create_filter (unsigned int index)
+ {
+ if (index == 0)
+ return new SCTCFilterFactory ();
+
+ return FilterFactoryPointer (0);
+ }
+
+ bool scim_filter_module_get_filter_info (unsigned int index, FilterInfo &info)
+ {
+ if (index == 0) {
+ info = __filter_info;
+ return true;
+ }
+ return false;
+ }
+}
+
+//Implementation of private functions
+static void
+__init_sc_to_tc ()
+{
+ if (__sc_to_tc_initialized) return;
+
+ __sc_to_tc_map.clear ();
+
+ for (size_t i = 0; __sc_to_tc_table [i].first; ++i)
+ __sc_to_tc_map [__sc_to_tc_table [i].first] = __sc_to_tc_table [i].second;
+
+ __sc_to_tc_initialized = true;
+}
+
+static void
+__init_tc_to_sc ()
+{
+ if (__tc_to_sc_initialized) return;
+
+ __tc_to_sc_map.clear ();
+
+ for (size_t i = 0; __tc_to_sc_table [i].first; ++i)
+ __tc_to_sc_map [__tc_to_sc_table [i].first] = __tc_to_sc_table [i].second;
+
+ __tc_to_sc_initialized = true;
+}
+
+static WideString __sc_to_tc (const WideString &sc)
+{
+ WideString tc;
+ if (!__sc_to_tc_initialized) __init_sc_to_tc ();
+
+ UUMap::const_iterator mapit;
+ WideString::const_iterator sit;
+
+ for (sit = sc.begin (); sit != sc.end (); ++sit) {
+ if (*sit <= 0xFFFF) {
+ mapit = __sc_to_tc_map.find ((unsigned short) (*sit));
+ if (mapit != __sc_to_tc_map.end ()) {
+ tc.push_back (static_cast<ucs4_t> (mapit->second));
+ } else {
+ tc.push_back (*sit);
+ }
+ } else {
+ tc.push_back (*sit);
+ }
+ }
+ return tc;
+}
+
+static WideString __tc_to_sc (const WideString &tc)
+{
+ WideString sc;
+ if (!__tc_to_sc_initialized) __init_tc_to_sc ();
+
+ UUMap::const_iterator mapit;
+ WideString::const_iterator sit;
+
+ for (sit = tc.begin (); sit != tc.end (); ++sit) {
+ if (*sit <= 0xFFFF) {
+ mapit = __tc_to_sc_map.find ((unsigned short) (*sit));
+ if (mapit != __tc_to_sc_map.end ()) {
+ sc.push_back (static_cast<ucs4_t> (mapit->second));
+ } else {
+ sc.push_back (*sit);
+ }
+ } else {
+ sc.push_back (*sit);
+ }
+ }
+ return sc;
+}
+
+static bool
+__is_sc_encoding (const String &encoding)
+{
+ return std::find (__sc_encodings.begin (), __sc_encodings.end (), encoding) != __sc_encodings.end ();
+}
+
+static bool
+__is_tc_encoding (const String &encoding)
+{
+ return std::find (__tc_encodings.begin (), __tc_encodings.end (), encoding) != __tc_encodings.end ();
+}
+
+//Implementation of SCTCFilterFactory.
+SCTCFilterFactory::SCTCFilterFactory ()
+ : m_sc_ok(false),
+ m_tc_ok(false)
+{
+}
+
+void
+SCTCFilterFactory::attach_imengine_factory (const IMEngineFactoryPointer &orig)
+{
+ size_t i;
+
+ FilterFactoryBase::attach_imengine_factory (orig);
+
+ for (i = 0; i < __sc_encodings.size (); ++i) {
+ if (orig->validate_encoding (__sc_encodings [i])) {
+ m_sc_ok = true;
+ if (orig->validate_encoding ("GB18030"))
+ m_sc_encoding = "GB18030";
+ else
+ m_sc_encoding = __sc_encodings [i];
+
+ break;
+ }
+ }
+
+ for (i = 0; i < __tc_encodings.size (); ++i) {
+ if (orig->validate_encoding (__tc_encodings [i])) {
+ m_tc_ok = true;
+ if (orig->validate_encoding ("BIG5"))
+ m_tc_encoding = "BIG5";
+ else
+ m_tc_encoding = __tc_encodings [i];
+
+ break;
+ }
+ }
+
+ if (m_sc_ok || m_tc_ok) {
+ String locales = orig->get_locales ();
+ locales = locales + String (",") + scim_get_language_locales ("zh_CN");
+ locales = locales + String (",") + scim_get_language_locales ("zh_TW");
+ locales = locales + String (",") + scim_get_language_locales ("zh_SG");
+ locales = locales + String (",") + scim_get_language_locales ("zh_HK");
+ set_locales (locales);
+ }
+}
+
+WideString
+SCTCFilterFactory::get_name () const
+{
+ WideString name = FilterFactoryBase::get_name ();
+ return name.length () ? name : utf8_mbstowcs (__filter_info.name);
+}
+
+String
+SCTCFilterFactory::get_uuid () const
+{
+ String uuid = FilterFactoryBase::get_uuid ();
+ return uuid.length () ? uuid : __filter_info.uuid;
+}
+
+String
+SCTCFilterFactory::get_icon_file () const
+{
+ String icon = FilterFactoryBase::get_icon_file ();
+ return icon.length () ? icon : __filter_info.icon;
+}
+
+WideString
+SCTCFilterFactory::get_authors () const
+{
+ WideString authors = FilterFactoryBase::get_authors ();
+ return authors.length () ? authors : utf8_mbstowcs (_("James Su <suzhe@tsinghua.org.cn>"));
+}
+
+WideString
+SCTCFilterFactory::get_help () const
+{
+ // No help yet.
+ WideString help = FilterFactoryBase::get_help ();
+ return help;
+}
+
+bool
+SCTCFilterFactory::validate_encoding (const String& encoding) const
+{
+ // Bypass the original IMEngineFactory.
+ return IMEngineFactoryBase::validate_encoding (encoding);
+}
+
+bool
+SCTCFilterFactory::validate_locale (const String& locale) const
+{
+ // Bypass the original IMEngineFactory.
+ return IMEngineFactoryBase::validate_locale (locale);
+}
+
+IMEngineInstancePointer
+SCTCFilterFactory::create_instance (const String& encoding, int id)
+{
+ if (m_sc_ok || m_tc_ok) {
+ SCTCWorkMode mode = SCTC_MODE_OFF;
+
+ String orig_encoding = encoding;
+
+ // If the original IMEngineFactory doesn't support this encoding,
+ // then we must use another encoding to create the original IMEngineInstance.
+ // It means we must use a conversion mode.
+ if (!FilterFactoryBase::validate_encoding (encoding)) {
+ // The client encoding is Simplified Chinese encoding, but is not supported by the IMEngine.
+ // So use Traditional Chinese encoding instead.
+ if (__is_sc_encoding (encoding)) {
+ if (FilterFactoryBase::validate_encoding (m_sc_encoding)) {
+ orig_encoding = m_sc_encoding;
+ } else {
+ orig_encoding = m_tc_encoding;
+ mode = SCTC_MODE_FORCE_TC_TO_SC;
+ }
+ } else if (__is_tc_encoding (encoding)) {
+ if (FilterFactoryBase::validate_encoding (m_tc_encoding)) {
+ orig_encoding = m_tc_encoding;
+ } else {
+ orig_encoding = m_sc_encoding;
+ mode = SCTC_MODE_FORCE_SC_TO_TC;
+ }
+ }
+ } else if ((__is_sc_encoding (encoding) && !FilterFactoryBase::validate_encoding (m_tc_encoding)) ||
+ (__is_tc_encoding (encoding) && !FilterFactoryBase::validate_encoding (m_sc_encoding))) {
+ mode = SCTC_MODE_FORCE_OFF;
+ }
+
+ return new SCTCFilterInstance (this, mode, encoding, FilterFactoryBase::create_instance (orig_encoding, id));
+ }
+
+ return FilterFactoryBase::create_instance (encoding, id);
+}
+
+//Implementation of SCTCFilterInstance
+SCTCFilterInstance::SCTCFilterInstance (SCTCFilterFactory *factory, const SCTCWorkMode &mode, const String &client_encoding, const IMEngineInstancePointer &orig_inst)
+ : FilterInstanceBase (factory, orig_inst),
+ m_factory (factory),
+ m_props_registered (false),
+ m_work_mode (mode)
+{
+ IMEngineInstanceBase::set_encoding (client_encoding);
+}
+
+bool
+SCTCFilterInstance::set_encoding (const String &encoding)
+{
+ if (m_work_mode == SCTC_MODE_SC_TO_TC || m_work_mode == SCTC_MODE_FORCE_SC_TO_TC) {
+ if (__is_tc_encoding (encoding))
+ FilterInstanceBase::set_encoding (m_factory->m_sc_encoding);
+ } else if (m_work_mode == SCTC_MODE_TC_TO_SC || m_work_mode == SCTC_MODE_FORCE_TC_TO_SC) {
+ if (__is_sc_encoding (encoding))
+ FilterInstanceBase::set_encoding (m_factory->m_tc_encoding);
+ } else {
+ FilterInstanceBase::set_encoding (encoding);
+ }
+ reset ();
+ return IMEngineInstanceBase::set_encoding (encoding);
+}
+
+void
+SCTCFilterInstance::focus_in ()
+{
+ m_props_registered = false;
+
+ FilterInstanceBase::focus_in ();
+
+ if (!m_props_registered) {
+ PropertyList props;
+ filter_register_properties (props);
+ }
+}
+
+void
+SCTCFilterInstance::trigger_property (const String &property)
+{
+ if (property != __prop_off.get_key () && property != __prop_sc_to_tc.get_key () && property != __prop_tc_to_sc.get_key ()) {
+ FilterInstanceBase::trigger_property (property);
+ return;
+ }
+
+ if (m_work_mode == SCTC_MODE_FORCE_SC_TO_TC || m_work_mode == SCTC_MODE_FORCE_TC_TO_SC || m_work_mode == SCTC_MODE_FORCE_OFF)
+ return;
+
+ Property prop = __prop_root;
+ bool changed = false;
+
+ if (property == __prop_off.get_key () && (m_work_mode == SCTC_MODE_SC_TO_TC || m_work_mode == SCTC_MODE_TC_TO_SC)) {
+ m_work_mode = SCTC_MODE_OFF;
+ changed = true;
+ } else if (property == __prop_sc_to_tc.get_key () && m_factory->m_sc_ok && !__is_sc_encoding (get_encoding ()) &&
+ (m_work_mode == SCTC_MODE_OFF || m_work_mode == SCTC_MODE_TC_TO_SC)) {
+ m_work_mode = SCTC_MODE_SC_TO_TC;
+ prop.set_icon (__prop_sc_to_tc.get_icon ());
+ prop.set_label (_("SC->TC"));
+ changed = true;
+ } else if (property == __prop_tc_to_sc.get_key () && m_factory->m_tc_ok && !__is_tc_encoding (get_encoding ()) &&
+ (m_work_mode == SCTC_MODE_OFF || m_work_mode == SCTC_MODE_SC_TO_TC)) {
+ m_work_mode = SCTC_MODE_TC_TO_SC;
+ prop.set_icon (__prop_tc_to_sc.get_icon ());
+ prop.set_label (_("TC->SC"));
+ changed = true;
+ }
+
+ if (changed) {
+ set_encoding (get_encoding ());
+ update_property (prop);
+ }
+}
+
+void
+SCTCFilterInstance::filter_update_preedit_string (const WideString &str,
+ const AttributeList &attrs)
+{
+ WideString nstr = str;
+
+ if (m_work_mode == SCTC_MODE_SC_TO_TC || m_work_mode == SCTC_MODE_FORCE_SC_TO_TC)
+ nstr = __sc_to_tc (str);
+ if (m_work_mode == SCTC_MODE_TC_TO_SC || m_work_mode == SCTC_MODE_FORCE_TC_TO_SC)
+ nstr = __tc_to_sc (str);
+
+ update_preedit_string (nstr, attrs);
+}
+
+void
+SCTCFilterInstance::filter_update_aux_string (const WideString &str,
+ const AttributeList &attrs)
+{
+ WideString nstr = str;
+
+ if (m_work_mode == SCTC_MODE_SC_TO_TC || m_work_mode == SCTC_MODE_FORCE_SC_TO_TC)
+ nstr = __sc_to_tc (str);
+ if (m_work_mode == SCTC_MODE_TC_TO_SC || m_work_mode == SCTC_MODE_FORCE_TC_TO_SC)
+ nstr = __tc_to_sc (str);
+
+ update_aux_string (nstr, attrs);
+}
+
+void
+SCTCFilterInstance::filter_update_lookup_table (const LookupTable &table)
+{
+ if (m_work_mode == SCTC_MODE_OFF) {
+ update_lookup_table (table);
+ } else {
+ CommonLookupTable ntable;
+ std::vector<WideString> labels;
+ size_t i;
+
+ // Can be paged up.
+ if (table.get_current_page_start ())
+ ntable.append_candidate (0x3400);
+
+ if (m_work_mode == SCTC_MODE_SC_TO_TC || m_work_mode == SCTC_MODE_FORCE_SC_TO_TC) {
+ for (i = 0; i < table.get_current_page_size (); ++i) {
+ ntable.append_candidate (__sc_to_tc (table.get_candidate_in_current_page (i)), table.get_attributes_in_current_page (i));
+ labels.push_back (__sc_to_tc (table.get_candidate_label (i)));
+ }
+ } else {
+ for (i = 0; i < table.get_current_page_size (); ++i) {
+ ntable.append_candidate (__tc_to_sc (table.get_candidate_in_current_page (i)), table.get_attributes_in_current_page (i));
+ labels.push_back (__tc_to_sc (table.get_candidate_label (i)));
+ }
+ }
+
+ if (table.get_current_page_start () + table.get_current_page_size () < table.number_of_candidates ())
+ ntable.append_candidate (0x3400);
+
+ if (table.get_current_page_start ()) {
+ ntable.set_page_size (1);
+ ntable.page_down ();
+ }
+
+ ntable.set_page_size (table.get_current_page_size ());
+ ntable.set_cursor_pos_in_current_page (table.get_cursor_pos_in_current_page ());
+ ntable.show_cursor (table.is_cursor_visible ());
+ ntable.fix_page_size (table.is_page_size_fixed ());
+ ntable.set_candidate_labels (labels);
+
+ update_lookup_table (ntable);
+ }
+}
+
+void
+SCTCFilterInstance::filter_commit_string (const WideString &str)
+{
+ WideString nstr = str;
+
+ if (m_work_mode == SCTC_MODE_SC_TO_TC || m_work_mode == SCTC_MODE_FORCE_SC_TO_TC)
+ nstr = __sc_to_tc (str);
+ if (m_work_mode == SCTC_MODE_TC_TO_SC || m_work_mode == SCTC_MODE_FORCE_TC_TO_SC)
+ nstr = __tc_to_sc (str);
+
+ commit_string (nstr);
+}
+
+void
+SCTCFilterInstance::filter_register_properties (const PropertyList &properties)
+{
+ PropertyList props;
+
+ if (m_work_mode == SCTC_MODE_SC_TO_TC || m_work_mode == SCTC_MODE_FORCE_SC_TO_TC) {
+ for (size_t i = 0; i < properties.size (); ++i) {
+ Property prop = properties [i];
+ prop.set_label (utf8_wcstombs (__sc_to_tc (utf8_mbstowcs (prop.get_label ()))));
+ prop.set_tip (utf8_wcstombs (__sc_to_tc (utf8_mbstowcs (prop.get_tip ()))));
+ props.push_back (prop);
+ }
+ } else if (m_work_mode == SCTC_MODE_TC_TO_SC || m_work_mode == SCTC_MODE_FORCE_TC_TO_SC) {
+ for (size_t i = 0; i < properties.size (); ++i) {
+ Property prop = properties [i];
+ prop.set_label (utf8_wcstombs (__tc_to_sc (utf8_mbstowcs (prop.get_label ()))));
+ prop.set_tip (utf8_wcstombs (__tc_to_sc (utf8_mbstowcs (prop.get_tip ()))));
+ props.push_back (prop);
+ }
+ } else {
+ props = properties;
+ }
+
+ if (m_work_mode == SCTC_MODE_OFF || m_work_mode == SCTC_MODE_SC_TO_TC || m_work_mode == SCTC_MODE_TC_TO_SC) {
+ Property root = __prop_root;
+
+ if (m_work_mode == SCTC_MODE_SC_TO_TC) {
+ root.set_icon (__prop_sc_to_tc.get_icon ());
+ root.set_tip (__prop_sc_to_tc.get_tip ());
+ root.set_label (_("SC->TC"));
+ } else if (m_work_mode == SCTC_MODE_TC_TO_SC) {
+ root.set_icon (__prop_tc_to_sc.get_icon ());
+ root.set_tip (__prop_tc_to_sc.get_tip ());
+ root.set_label (_("TC->SC"));
+ }
+
+ props.push_back (root);
+ props.push_back (__prop_off);
+
+ if (!__is_sc_encoding (get_encoding ()) && m_factory->m_sc_ok)
+ props.push_back (__prop_sc_to_tc);
+ if (!__is_tc_encoding (get_encoding ()) && m_factory->m_tc_ok)
+ props.push_back (__prop_tc_to_sc);
+ } else if (m_work_mode == SCTC_MODE_FORCE_SC_TO_TC) {
+ Property root = __prop_sc_to_tc;
+ root.set_label (_("SC->TC"));
+ props.push_back (root);
+ } else if (m_work_mode == SCTC_MODE_FORCE_TC_TO_SC) {
+ Property root = __prop_tc_to_sc;
+ root.set_label (_("TC->SC"));
+ props.push_back (root);
+ }
+
+ register_properties (props);
+
+ m_props_registered = true;
+}
+
+void
+SCTCFilterInstance::filter_update_property (const Property &property)
+{
+ Property prop = property;
+
+ if (m_work_mode == SCTC_MODE_SC_TO_TC || m_work_mode == SCTC_MODE_FORCE_SC_TO_TC) {
+ prop.set_label (utf8_wcstombs (__sc_to_tc (utf8_mbstowcs (prop.get_label ()))));
+ prop.set_tip (utf8_wcstombs (__sc_to_tc (utf8_mbstowcs (prop.get_tip ()))));
+ } else if (m_work_mode == SCTC_MODE_TC_TO_SC || m_work_mode == SCTC_MODE_FORCE_TC_TO_SC) {
+ prop.set_label (utf8_wcstombs (__tc_to_sc (utf8_mbstowcs (prop.get_label ()))));
+ prop.set_tip (utf8_wcstombs (__tc_to_sc (utf8_mbstowcs (prop.get_tip ()))));
+ }
+
+ update_property (prop);
+}
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_sctc_filter.h
+ * definition of SCTCFilter (Simplified Chinese <-> Traditional Chinese Filter) related classes.
+ */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_sctc_filter.h,v 1.2 2005/05/17 14:56:39 suzhe Exp $
+ */
+
+#if !defined (__SCIM_SCTC_FILTER_H)
+#define __SCIM_SCTC_FILTER_H
+
+using namespace scim;
+
+#define SCTC_ICON_PNG (SCIM_ICONDIR "/sctc.png")
+#define SC_TO_TC_ICON_PNG (SCIM_ICONDIR "/sctc-sc-to-tc.png")
+#define TC_TO_SC_ICON_PNG (SCIM_ICONDIR "/sctc-tc-to-sc.png")
+
+enum SCTCWorkMode
+{
+ SCTC_MODE_OFF = 0,
+ SCTC_MODE_SC_TO_TC,
+ SCTC_MODE_TC_TO_SC,
+ SCTC_MODE_FORCE_OFF,
+ SCTC_MODE_FORCE_SC_TO_TC,
+ SCTC_MODE_FORCE_TC_TO_SC
+};
+
+class SCTCFilterFactory : public FilterFactoryBase
+{
+ bool m_sc_ok;
+ String m_sc_encoding;
+
+ bool m_tc_ok;
+ String m_tc_encoding;
+
+ friend class SCTCFilterInstance;
+
+public:
+ SCTCFilterFactory ();
+
+ virtual void attach_imengine_factory (const IMEngineFactoryPointer &orig);
+ virtual WideString get_name () const;
+ virtual String get_uuid () const;
+ virtual String get_icon_file () const;
+ virtual WideString get_authors () const;
+ virtual WideString get_help () const;
+ virtual bool validate_encoding (const String& encoding) const;
+ virtual bool validate_locale (const String& locale) const;
+ virtual IMEngineInstancePointer create_instance (const String& encoding, int id = -1);
+};
+
+class SCTCFilterInstance : public FilterInstanceBase
+{
+ SCTCFilterFactory *m_factory;
+
+ bool m_props_registered;
+
+ SCTCWorkMode m_work_mode;
+
+public:
+ SCTCFilterInstance (SCTCFilterFactory *factory,
+ const SCTCWorkMode &mode,
+ const String &client_encoding,
+ const IMEngineInstancePointer &orig_inst);
+
+ virtual bool set_encoding (const String &encoding);
+
+public:
+ virtual void focus_in ();
+
+ virtual void trigger_property (const String &property);
+
+protected:
+ virtual void filter_update_preedit_string (const WideString &str,
+ const AttributeList &attrs = AttributeList ());
+ virtual void filter_update_aux_string (const WideString &str,
+ const AttributeList &attrs = AttributeList ());
+ virtual void filter_update_lookup_table (const LookupTable &table);
+ virtual void filter_commit_string (const WideString &str);
+ virtual void filter_register_properties (const PropertyList &properties);
+ virtual void filter_update_property (const Property &property);
+};
+
+#endif
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/** @file scim_sctc_filter_data.h
+ */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_sctc_filter_data.h,v 1.1 2005/05/16 05:22:49 suzhe Exp $
+ */
+
+#if !defined (__SCIM_SCTC_FILTER_DATA_H)
+#define __SCIM_SCTC_FILTER_DATA_H
+struct UShortPair
+{
+ unsigned short first;
+ unsigned short second;
+};
+
+static UShortPair __sc_to_tc_table [] = {
+ { 0x00a8, 0x2025 },{ 0x2015, 0x2500 },{ 0x2016, 0x2225 },{ 0x2033, 0x301e },
+ { 0x220f, 0x03a0 },{ 0x2211, 0x03a3 },{ 0x2227, 0xfe3f },{ 0x2228, 0xfe40 },
+ { 0x2236, 0xfe30 },{ 0x2248, 0x2252 },{ 0x2264, 0x2266 },{ 0x2265, 0x2267 },
+ { 0x2501, 0x2500 },{ 0x2503, 0x2502 },{ 0x250f, 0x250c },{ 0x2513, 0x2510 },
+ { 0x2517, 0x2514 },{ 0x251b, 0x2518 },{ 0x2523, 0x251c },{ 0x252b, 0x2524 },
+ { 0x2533, 0x252c },{ 0x253b, 0x2534 },{ 0x254b, 0x253c },{ 0x30fb, 0x00b7 },
+ { 0x4e07, 0x842c },{ 0x4e0e, 0x8207 },{ 0x4e11, 0x919c },{ 0x4e13, 0x5c08 },
+ { 0x4e1a, 0x696d },{ 0x4e1b, 0x53e2 },{ 0x4e1c, 0x6771 },{ 0x4e1d, 0x7d72 },
+ { 0x4e22, 0x4e1f },{ 0x4e24, 0x5169 },{ 0x4e25, 0x56b4 },{ 0x4e27, 0x55aa },
+ { 0x4e2a, 0x500b },{ 0x4e2c, 0x723f },{ 0x4e30, 0x8c50 },{ 0x4e34, 0x81e8 },
+ { 0x4e3a, 0x70ba },{ 0x4e3d, 0x9e97 },{ 0x4e3e, 0x8209 },{ 0x4e48, 0x9ebc },
+ { 0x4e49, 0x7fa9 },{ 0x4e4c, 0x70cf },{ 0x4e50, 0x6a02 },{ 0x4e54, 0x55ac },
+ { 0x4e60, 0x7fd2 },{ 0x4e61, 0x9109 },{ 0x4e66, 0x66f8 },{ 0x4e70, 0x8cb7 },
+ { 0x4e71, 0x4e82 },{ 0x4e89, 0x722d },{ 0x4e8f, 0x8667 },{ 0x4e91, 0x96f2 },
+ { 0x4e98, 0x4e99 },{ 0x4e9a, 0x4e9e },{ 0x4ea7, 0x7522 },{ 0x4ea9, 0x755d },
+ { 0x4eb2, 0x89aa },{ 0x4eb5, 0x893b },{ 0x4ebb, 0x4eba },{ 0x4ebf, 0x5104 },
+ { 0x4ec5, 0x50c5 },{ 0x4ec6, 0x50d5 },{ 0x4ece, 0x5f9e },{ 0x4ed1, 0x4f96 },
+ { 0x4ed3, 0x5009 },{ 0x4eea, 0x5100 },{ 0x4eec, 0x5011 },{ 0x4ef7, 0x50f9 },
+ { 0x4f17, 0x773e },{ 0x4f18, 0x512a },{ 0x4f1a, 0x6703 },{ 0x4f1b, 0x50b4 },
+ { 0x4f1e, 0x5098 },{ 0x4f1f, 0x5049 },{ 0x4f20, 0x50b3 },{ 0x4f24, 0x50b7 },
+ { 0x4f25, 0x5000 },{ 0x4f26, 0x502b },{ 0x4f27, 0x5096 },{ 0x4f2a, 0x507d },
+ { 0x4f2b, 0x4f47 },{ 0x4f32, 0x4f60 },{ 0x4f53, 0x9ad4 },{ 0x4f59, 0x9918 },
+ { 0x4f63, 0x50ad },{ 0x4f65, 0x50c9 },{ 0x4f84, 0x59ea },{ 0x4fa0, 0x4fe0 },
+ { 0x4fa3, 0x4fb6 },{ 0x4fa5, 0x50e5 },{ 0x4fa6, 0x5075 },{ 0x4fa7, 0x5074 },
+ { 0x4fa8, 0x50d1 },{ 0x4fa9, 0x5108 },{ 0x4faa, 0x5115 },{ 0x4fac, 0x5102 },
+ { 0x4fe3, 0x4fc1 },{ 0x4fe6, 0x5114 },{ 0x4fe8, 0x513c },{ 0x4fe9, 0x5006 },
+ { 0x4fea, 0x5137 },{ 0x4fed, 0x5109 },{ 0x502e, 0x88f8 },{ 0x503a, 0x50b5 },
+ { 0x503e, 0x50be },{ 0x506c, 0x50af },{ 0x507b, 0x50c2 },{ 0x507e, 0x50e8 },
+ { 0x507f, 0x511f },{ 0x50a5, 0x513b },{ 0x50a7, 0x5110 },{ 0x50a8, 0x5132 },
+ { 0x50a9, 0x513a },{ 0x513f, 0x5152 },{ 0x5151, 0x514c },{ 0x5156, 0x5157 },
+ { 0x515a, 0x9ee8 },{ 0x5170, 0x862d },{ 0x5173, 0x95dc },{ 0x5174, 0x8208 },
+ { 0x5179, 0x8332 },{ 0x517b, 0x990a },{ 0x517d, 0x7378 },{ 0x5181, 0x56c5 },
+ { 0x5185, 0x5167 },{ 0x5188, 0x5ca1 },{ 0x518c, 0x518a },{ 0x5199, 0x5beb },
+ { 0x519b, 0x8ecd },{ 0x519c, 0x8fb2 },{ 0x51a2, 0x585a },{ 0x51af, 0x99ae },
+ { 0x51b2, 0x885d },{ 0x51b3, 0x6c7a },{ 0x51b5, 0x6cc1 },{ 0x51bb, 0x51cd },
+ { 0x51c0, 0x6de8 },{ 0x51c4, 0x6dd2 },{ 0x51c6, 0x6e96 },{ 0x51c7, 0x6dde },
+ { 0x51c9, 0x6dbc },{ 0x51cf, 0x6e1b },{ 0x51d1, 0x6e4a },{ 0x51db, 0x51dc },
+ { 0x51e0, 0x5e7e },{ 0x51e4, 0x9cf3 },{ 0x51eb, 0x9ce7 },{ 0x51ed, 0x6191 },
+ { 0x51ef, 0x51f1 },{ 0x51f6, 0x5147 },{ 0x51fb, 0x64ca },{ 0x51fc, 0x5e7d },
+ { 0x51ff, 0x947f },{ 0x5202, 0x5200 },{ 0x520d, 0x82bb },{ 0x5212, 0x5283 },
+ { 0x5218, 0x5289 },{ 0x5219, 0x5247 },{ 0x521a, 0x525b },{ 0x521b, 0x5275 },
+ { 0x5220, 0x522a },{ 0x522b, 0x5225 },{ 0x522d, 0x5244 },{ 0x5239, 0x524e },
+ { 0x523d, 0x528a },{ 0x523f, 0x528c },{ 0x5240, 0x5274 },{ 0x5242, 0x5291 },
+ { 0x5250, 0x526e },{ 0x5251, 0x528d },{ 0x5265, 0x525d },{ 0x5267, 0x5287 },
+ { 0x527f, 0x52e6 },{ 0x529d, 0x52f8 },{ 0x529e, 0x8fa6 },{ 0x52a1, 0x52d9 },
+ { 0x52a2, 0x52f1 },{ 0x52a8, 0x52d5 },{ 0x52b1, 0x52f5 },{ 0x52b2, 0x52c1 },
+ { 0x52b3, 0x52de },{ 0x52bf, 0x52e2 },{ 0x52cb, 0x52f3 },{ 0x52d6, 0x52d7 },
+ { 0x5300, 0x52fb },{ 0x5326, 0x532d },{ 0x532e, 0x5331 },{ 0x533a, 0x5340 },
+ { 0x533b, 0x91ab },{ 0x534e, 0x83ef },{ 0x534f, 0x5354 },{ 0x5355, 0x55ae },
+ { 0x5356, 0x8ce3 },{ 0x5360, 0x4f54 },{ 0x5362, 0x76e7 },{ 0x5364, 0x6ef7 },
+ { 0x5367, 0x81e5 },{ 0x5369, 0x90e8 },{ 0x536b, 0x885b },{ 0x5374, 0x537b },
+ { 0x537a, 0x5df9 },{ 0x5382, 0x5ee0 },{ 0x5385, 0x5ef3 },{ 0x5386, 0x6b77 },
+ { 0x5389, 0x53b2 },{ 0x538b, 0x58d3 },{ 0x538c, 0x53ad },{ 0x538d, 0x5399 },
+ { 0x5395, 0x5ec1 },{ 0x5398, 0x91d0 },{ 0x53a2, 0x5ec2 },{ 0x53a3, 0x53b4 },
+ { 0x53a6, 0x5ec8 },{ 0x53a8, 0x5eda },{ 0x53a9, 0x5ec4 },{ 0x53ae, 0x5edd },
+ { 0x53b6, 0x79c1 },{ 0x53bf, 0x7e23 },{ 0x53c1, 0x53c3 },{ 0x53c2, 0x53c3 },
+ { 0x53cc, 0x96d9 },{ 0x53d1, 0x767c },{ 0x53d8, 0x8b8a },{ 0x53d9, 0x6558 },
+ { 0x53e0, 0x758a },{ 0x53f6, 0x8449 },{ 0x53f7, 0x865f },{ 0x53f9, 0x5606 },
+ { 0x53fd, 0x5630 },{ 0x5401, 0x7c72 },{ 0x540e, 0x5f8c },{ 0x5413, 0x5687 },
+ { 0x5415, 0x5442 },{ 0x5417, 0x55ce },{ 0x5428, 0x5678 },{ 0x542c, 0x807d },
+ { 0x542f, 0x555f },{ 0x5434, 0x5433 },{ 0x5450, 0x5436 },{ 0x5452, 0x5638 },
+ { 0x5453, 0x56c8 },{ 0x5455, 0x5614 },{ 0x5456, 0x56a6 },{ 0x5457, 0x5504 },
+ { 0x5458, 0x54e1 },{ 0x5459, 0x54bc },{ 0x545b, 0x55c6 },{ 0x545c, 0x55da },
+ { 0x5468, 0x9031 },{ 0x548f, 0x8a60 },{ 0x5499, 0x56a8 },{ 0x549b, 0x5680 },
+ { 0x54b8, 0x9e79 },{ 0x54cc, 0x5471 },{ 0x54cd, 0x97ff },{ 0x54d1, 0x555e },
+ { 0x54d2, 0x5660 },{ 0x54d3, 0x5635 },{ 0x54d4, 0x55f6 },{ 0x54d5, 0x5666 },
+ { 0x54d7, 0x5629 },{ 0x54d9, 0x5672 },{ 0x54dc, 0x568c },{ 0x54dd, 0x5665 },
+ { 0x54df, 0x55b2 },{ 0x551b, 0x561c },{ 0x5520, 0x562e },{ 0x5522, 0x55e9 },
+ { 0x5524, 0x559a },{ 0x5567, 0x5616 },{ 0x556c, 0x55c7 },{ 0x556d, 0x56c0 },
+ { 0x556e, 0x56d3 },{ 0x5578, 0x562f },{ 0x55b7, 0x5674 },{ 0x55bd, 0x560d },
+ { 0x55be, 0x56b3 },{ 0x55eb, 0x56c1 },{ 0x55ec, 0x5475 },{ 0x55f3, 0x566f },
+ { 0x5618, 0x5653 },{ 0x5624, 0x56b6 },{ 0x5631, 0x56d1 },{ 0x565c, 0x5695 },
+ { 0x56a3, 0x56c2 },{ 0x56e2, 0x5718 },{ 0x56ed, 0x5712 },{ 0x56f1, 0x56ea },
+ { 0x56f4, 0x570d },{ 0x56f5, 0x5707 },{ 0x56fd, 0x570b },{ 0x56fe, 0x5716 },
+ { 0x5706, 0x5713 },{ 0x5723, 0x8056 },{ 0x5739, 0x58d9 },{ 0x573a, 0x5834 },
+ { 0x5742, 0x962a },{ 0x574f, 0x58de },{ 0x5757, 0x584a },{ 0x575a, 0x5805 },
+ { 0x575b, 0x58c7 },{ 0x575c, 0x58e2 },{ 0x575d, 0x58e9 },{ 0x575e, 0x5862 },
+ { 0x575f, 0x58b3 },{ 0x5760, 0x589c },{ 0x5784, 0x58df },{ 0x5785, 0x58df },
+ { 0x5786, 0x58da },{ 0x5792, 0x58d8 },{ 0x57a6, 0x58be },{ 0x57a9, 0x580a },
+ { 0x57ab, 0x588a },{ 0x57ad, 0x57e1 },{ 0x57b2, 0x584f },{ 0x57d8, 0x5852 },
+ { 0x57d9, 0x58ce },{ 0x57da, 0x581d },{ 0x5811, 0x5879 },{ 0x5815, 0x58ae },
+ { 0x5892, 0x5891 },{ 0x5899, 0x7246 },{ 0x58ee, 0x58ef },{ 0x58f0, 0x8072 },
+ { 0x58f3, 0x6bbc },{ 0x58f6, 0x58fa },{ 0x5904, 0x8655 },{ 0x5907, 0x5099 },
+ { 0x590d, 0x5fa9 },{ 0x591f, 0x5920 },{ 0x5934, 0x982d },{ 0x5938, 0x8a87 },
+ { 0x5939, 0x593e },{ 0x593a, 0x596a },{ 0x5941, 0x5969 },{ 0x5942, 0x5950 },
+ { 0x594b, 0x596e },{ 0x5956, 0x734e },{ 0x5965, 0x5967 },{ 0x5986, 0x599d },
+ { 0x5987, 0x5a66 },{ 0x5988, 0x5abd },{ 0x59a9, 0x5af5 },{ 0x59aa, 0x5ad7 },
+ { 0x59ab, 0x5aaf },{ 0x59d7, 0x59cd },{ 0x5a04, 0x5a41 },{ 0x5a05, 0x5a6d },
+ { 0x5a06, 0x5b08 },{ 0x5a07, 0x5b0c },{ 0x5a08, 0x5b4c },{ 0x5a31, 0x5a1b },
+ { 0x5a32, 0x5aa7 },{ 0x5a34, 0x5afb },{ 0x5a74, 0x5b30 },{ 0x5a75, 0x5b0b },
+ { 0x5a76, 0x5b38 },{ 0x5aaa, 0x5abc },{ 0x5ad2, 0x5b21 },{ 0x5ad4, 0x5b2a },
+ { 0x5af1, 0x5b19 },{ 0x5b37, 0x5b24 },{ 0x5b59, 0x5b6b },{ 0x5b66, 0x5b78 },
+ { 0x5b6a, 0x5b7f },{ 0x5b81, 0x5be7 },{ 0x5b9d, 0x5bf6 },{ 0x5b9e, 0x5be6 },
+ { 0x5ba0, 0x5bf5 },{ 0x5ba1, 0x5be9 },{ 0x5baa, 0x61b2 },{ 0x5bab, 0x5bae },
+ { 0x5bbd, 0x5bec },{ 0x5bbe, 0x8cd3 },{ 0x5bdd, 0x5be2 },{ 0x5bf9, 0x5c0d },
+ { 0x5bfb, 0x5c0b },{ 0x5bfc, 0x5c0e },{ 0x5bff, 0x58fd },{ 0x5c06, 0x5c07 },
+ { 0x5c14, 0x723e },{ 0x5c18, 0x5875 },{ 0x5c1c, 0x560e },{ 0x5c1d, 0x5617 },
+ { 0x5c27, 0x582f },{ 0x5c34, 0x5c37 },{ 0x5c38, 0x5c4d },{ 0x5c3d, 0x76e1 },
+ { 0x5c42, 0x5c64 },{ 0x5c49, 0x5c5c },{ 0x5c4a, 0x5c46 },{ 0x5c5e, 0x5c6c },
+ { 0x5c61, 0x5c62 },{ 0x5c66, 0x5c68 },{ 0x5c7f, 0x5dbc },{ 0x5c81, 0x6b72 },
+ { 0x5c82, 0x8c48 },{ 0x5c96, 0x5d87 },{ 0x5c97, 0x5d17 },{ 0x5c98, 0x5cf4 },
+ { 0x5c9a, 0x5d50 },{ 0x5c9b, 0x5cf6 },{ 0x5cad, 0x5dba },{ 0x5cbd, 0x5d20 },
+ { 0x5cbf, 0x5dcb },{ 0x5cc4, 0x5da7 },{ 0x5ce1, 0x5cfd },{ 0x5ce4, 0x5da0 },
+ { 0x5ce5, 0x5d22 },{ 0x5ce6, 0x5dd2 },{ 0x5d02, 0x5d97 },{ 0x5d03, 0x5d0d },
+ { 0x5d2d, 0x5d84 },{ 0x5d58, 0x5db8 },{ 0x5d5b, 0x5d33 },{ 0x5d5d, 0x5d81 },
+ { 0x5dc5, 0x5dd4 },{ 0x5de9, 0x978f },{ 0x5def, 0x5df0 },{ 0x5e01, 0x5e63 },
+ { 0x5e05, 0x5e25 },{ 0x5e08, 0x5e2b },{ 0x5e0f, 0x5e43 },{ 0x5e10, 0x5e33 },
+ { 0x5e18, 0x7c3e },{ 0x5e1c, 0x5e5f },{ 0x5e26, 0x5e36 },{ 0x5e27, 0x5e40 },
+ { 0x5e2e, 0x5e6b },{ 0x5e31, 0x5e6c },{ 0x5e3b, 0x5e58 },{ 0x5e3c, 0x5e57 },
+ { 0x5e42, 0x51aa },{ 0x5e72, 0x5e79 },{ 0x5e76, 0x4e26 },{ 0x5e7a, 0x4e48 },
+ { 0x5e7f, 0x5ee3 },{ 0x5e84, 0x838a },{ 0x5e86, 0x6176 },{ 0x5e90, 0x5eec },
+ { 0x5e91, 0x5ee1 },{ 0x5e93, 0x5eab },{ 0x5e94, 0x61c9 },{ 0x5e99, 0x5edf },
+ { 0x5e9e, 0x9f90 },{ 0x5e9f, 0x5ee2 },{ 0x5eea, 0x5ee9 },{ 0x5f00, 0x958b },
+ { 0x5f02, 0x7570 },{ 0x5f03, 0x68c4 },{ 0x5f11, 0x5f12 },{ 0x5f20, 0x5f35 },
+ { 0x5f25, 0x5f4c },{ 0x5f2a, 0x5f33 },{ 0x5f2f, 0x5f4e },{ 0x5f39, 0x5f48 },
+ { 0x5f3a, 0x5f37 },{ 0x5f52, 0x6b78 },{ 0x5f53, 0x7576 },{ 0x5f55, 0x9304 },
+ { 0x5f66, 0x5f65 },{ 0x5f7b, 0x5fb9 },{ 0x5f84, 0x5f91 },{ 0x5f95, 0x5fa0 },
+ { 0x5fa1, 0x79a6 },{ 0x5fc4, 0x5fc3 },{ 0x5fc6, 0x61b6 },{ 0x5fcf, 0x61fa },
+ { 0x5fe7, 0x6182 },{ 0x5ffe, 0x613e },{ 0x6000, 0x61f7 },{ 0x6001, 0x614b },
+ { 0x6002, 0x616b },{ 0x6003, 0x61ae },{ 0x6004, 0x616a },{ 0x6005, 0x60b5 },
+ { 0x6006, 0x6134 },{ 0x601c, 0x6190 },{ 0x603b, 0x7e3d },{ 0x603c, 0x61df },
+ { 0x603f, 0x61cc },{ 0x604b, 0x6200 },{ 0x6052, 0x6046 },{ 0x6073, 0x61c7 },
+ { 0x6076, 0x60e1 },{ 0x6078, 0x615f },{ 0x6079, 0x61e8 },{ 0x607a, 0x6137 },
+ { 0x607b, 0x60fb },{ 0x607c, 0x60f1 },{ 0x607d, 0x60f2 },{ 0x60a6, 0x6085 },
+ { 0x60ab, 0x6128 },{ 0x60ac, 0x61f8 },{ 0x60ad, 0x6173 },{ 0x60af, 0x61ab },
+ { 0x60ca, 0x9a5a },{ 0x60e7, 0x61fc },{ 0x60e8, 0x6158 },{ 0x60e9, 0x61f2 },
+ { 0x60eb, 0x618a },{ 0x60ec, 0x611c },{ 0x60ed, 0x615a },{ 0x60ee, 0x619a },
+ { 0x60ef, 0x6163 },{ 0x6120, 0x614d },{ 0x6124, 0x61a4 },{ 0x6126, 0x6192 },
+ { 0x613f, 0x9858 },{ 0x6151, 0x61fe },{ 0x61d1, 0x61e3 },{ 0x61d2, 0x61f6 },
+ { 0x61d4, 0x61cd },{ 0x6206, 0x6207 },{ 0x620b, 0x6214 },{ 0x620f, 0x6232 },
+ { 0x6217, 0x6227 },{ 0x6218, 0x6230 },{ 0x622c, 0x6229 },{ 0x6237, 0x6236 },
+ { 0x624c, 0x624b },{ 0x6251, 0x64b2 },{ 0x6258, 0x8a17 },{ 0x6267, 0x57f7 },
+ { 0x6269, 0x64f4 },{ 0x626a, 0x636b },{ 0x626b, 0x6383 },{ 0x626c, 0x63da },
+ { 0x6270, 0x64fe },{ 0x629a, 0x64ab },{ 0x629b, 0x62cb },{ 0x629f, 0x6476 },
+ { 0x62a0, 0x6473 },{ 0x62a1, 0x6384 },{ 0x62a2, 0x6436 },{ 0x62a4, 0x8b77 },
+ { 0x62a5, 0x5831 },{ 0x62c5, 0x64d4 },{ 0x62df, 0x64ec },{ 0x62e2, 0x650f },
+ { 0x62e3, 0x63c0 },{ 0x62e5, 0x64c1 },{ 0x62e6, 0x6514 },{ 0x62e7, 0x64f0 },
+ { 0x62e8, 0x64a5 },{ 0x62e9, 0x64c7 },{ 0x6302, 0x639b },{ 0x631a, 0x646f },
+ { 0x631b, 0x6523 },{ 0x631d, 0x64be },{ 0x631e, 0x64bb },{ 0x631f, 0x633e },
+ { 0x6320, 0x6493 },{ 0x6321, 0x64cb },{ 0x6322, 0x649f },{ 0x6323, 0x6399 },
+ { 0x6324, 0x64e0 },{ 0x6325, 0x63ee },{ 0x6342, 0x6440 },{ 0x635e, 0x6488 },
+ { 0x635f, 0x640d },{ 0x6361, 0x64bf },{ 0x6362, 0x63db },{ 0x6363, 0x6417 },
+ { 0x636e, 0x64da },{ 0x63b3, 0x64c4 },{ 0x63b4, 0x6451 },{ 0x63b7, 0x64f2 },
+ { 0x63b8, 0x64a2 },{ 0x63ba, 0x647b },{ 0x63bc, 0x645c },{ 0x63fd, 0x652c },
+ { 0x63ff, 0x64b3 },{ 0x6400, 0x6519 },{ 0x6401, 0x64f1 },{ 0x6402, 0x645f },
+ { 0x6405, 0x652a },{ 0x643a, 0x651c },{ 0x6444, 0x651d },{ 0x6445, 0x6504 },
+ { 0x6446, 0x64fa },{ 0x6447, 0x6416 },{ 0x6448, 0x64ef },{ 0x644a, 0x6524 },
+ { 0x6484, 0x6516 },{ 0x6491, 0x6490 },{ 0x64b5, 0x6506 },{ 0x64b7, 0x64f7 },
+ { 0x64b8, 0x64fc },{ 0x64ba, 0x651b },{ 0x64c0, 0x641f },{ 0x64de, 0x64fb },
+ { 0x6512, 0x6522 },{ 0x6534, 0x64b2 },{ 0x654c, 0x6575 },{ 0x655b, 0x6582 },
+ { 0x6570, 0x6578 },{ 0x658b, 0x9f4b },{ 0x6593, 0x6595 },{ 0x6597, 0x9b25 },
+ { 0x65a9, 0x65ac },{ 0x65ad, 0x65b7 },{ 0x65e0, 0x7121 },{ 0x65e7, 0x820a },
+ { 0x65f6, 0x6642 },{ 0x65f7, 0x66e0 },{ 0x6619, 0x66c7 },{ 0x6635, 0x66b1 },
+ { 0x663c, 0x665d },{ 0x663e, 0x986f },{ 0x664b, 0x6649 },{ 0x6652, 0x66ec },
+ { 0x6653, 0x66c9 },{ 0x6654, 0x66c4 },{ 0x6655, 0x6688 },{ 0x6656, 0x6689 },
+ { 0x6682, 0x66ab },{ 0x66a7, 0x66d6 },{ 0x6710, 0x80ca },{ 0x672f, 0x8853 },
+ { 0x6734, 0x6a38 },{ 0x673a, 0x6a5f },{ 0x6740, 0x6bba },{ 0x6742, 0x96dc },
+ { 0x6743, 0x6b0a },{ 0x6746, 0x687f },{ 0x6760, 0x69d3 },{ 0x6761, 0x689d },
+ { 0x6765, 0x4f86 },{ 0x6768, 0x694a },{ 0x6769, 0x69aa },{ 0x6770, 0x5091 },
+ { 0x677e, 0x9b06 },{ 0x6781, 0x6975 },{ 0x6784, 0x69cb },{ 0x679e, 0x6a05 },
+ { 0x67a2, 0x6a1e },{ 0x67a3, 0x68d7 },{ 0x67a5, 0x6aea },{ 0x67a8, 0x68d6 },
+ { 0x67aa, 0x69cd },{ 0x67ab, 0x6953 },{ 0x67ad, 0x689f },{ 0x67dc, 0x6ac3 },
+ { 0x67e0, 0x6ab8 },{ 0x67fd, 0x6a89 },{ 0x6800, 0x6894 },{ 0x6805, 0x67f5 },
+ { 0x6807, 0x6a19 },{ 0x6808, 0x68e7 },{ 0x6809, 0x6adb },{ 0x680a, 0x6af3 },
+ { 0x680b, 0x68df },{ 0x680c, 0x6ae8 },{ 0x680e, 0x6adf },{ 0x680f, 0x6b04 },
+ { 0x6811, 0x6a39 },{ 0x6816, 0x68f2 },{ 0x6837, 0x6a23 },{ 0x683e, 0x6b12 },
+ { 0x6860, 0x690f },{ 0x6861, 0x6a48 },{ 0x6862, 0x6968 },{ 0x6863, 0x6a94 },
+ { 0x6864, 0x69bf },{ 0x6865, 0x6a4b },{ 0x6866, 0x6a3a },{ 0x6867, 0x6a9c },
+ { 0x6868, 0x69f3 },{ 0x6869, 0x6a01 },{ 0x68a6, 0x5922 },{ 0x68c0, 0x6aa2 },
+ { 0x68c2, 0x6afa },{ 0x68f0, 0x7ba0 },{ 0x68f1, 0x7a1c },{ 0x6901, 0x69e8 },
+ { 0x691f, 0x6add },{ 0x6920, 0x69e7 },{ 0x6924, 0x6b0f },{ 0x692d, 0x6a62 },
+ { 0x697c, 0x6a13 },{ 0x6984, 0x6b16 },{ 0x6987, 0x6aec },{ 0x6988, 0x6ada },
+ { 0x6989, 0x6af8 },{ 0x6998, 0x77e9 },{ 0x69db, 0x6abb },{ 0x69df, 0x6ab3 },
+ { 0x69e0, 0x6ae7 },{ 0x6a2a, 0x6a6b },{ 0x6a2f, 0x6aa3 },{ 0x6a31, 0x6afb },
+ { 0x6a65, 0x6aeb },{ 0x6a71, 0x6ae5 },{ 0x6a79, 0x6ad3 },{ 0x6a7c, 0x6ade },
+ { 0x6a90, 0x7c37 },{ 0x6aa9, 0x6a81 },{ 0x6b22, 0x6b61 },{ 0x6b24, 0x6b5f },
+ { 0x6b27, 0x6b50 },{ 0x6b7c, 0x6bb2 },{ 0x6b81, 0x6b7f },{ 0x6b87, 0x6ba4 },
+ { 0x6b8b, 0x6b98 },{ 0x6b92, 0x6b9e },{ 0x6b93, 0x6bae },{ 0x6b9a, 0x6bab },
+ { 0x6ba1, 0x6baf },{ 0x6bb4, 0x6bc6 },{ 0x6bc1, 0x6bc0 },{ 0x6bc2, 0x8f42 },
+ { 0x6bd5, 0x7562 },{ 0x6bd9, 0x6583 },{ 0x6be1, 0x6c08 },{ 0x6bf5, 0x6bff },
+ { 0x6c07, 0x6c0c },{ 0x6c14, 0x6c23 },{ 0x6c22, 0x6c2b },{ 0x6c29, 0x6c2c },
+ { 0x6c32, 0x6c33 },{ 0x6c35, 0x6c34 },{ 0x6c3d, 0x6c46 },{ 0x6c47, 0x532f },
+ { 0x6c49, 0x6f22 },{ 0x6c64, 0x6e6f },{ 0x6c79, 0x6d36 },{ 0x6c9f, 0x6e9d },
+ { 0x6ca1, 0x6c92 },{ 0x6ca3, 0x7043 },{ 0x6ca4, 0x6f1a },{ 0x6ca5, 0x701d },
+ { 0x6ca6, 0x6dea },{ 0x6ca7, 0x6ec4 },{ 0x6ca9, 0x6e88 },{ 0x6caa, 0x6eec },
+ { 0x6cb2, 0x6cb1 },{ 0x6cc4, 0x6d29 },{ 0x6cde, 0x6fd8 },{ 0x6cea, 0x6dda },
+ { 0x6cf6, 0x6fa9 },{ 0x6cf7, 0x7027 },{ 0x6cf8, 0x7018 },{ 0x6cfa, 0x6ffc },
+ { 0x6cfb, 0x7009 },{ 0x6cfc, 0x6f51 },{ 0x6cfd, 0x6fa4 },{ 0x6cfe, 0x6d87 },
+ { 0x6d01, 0x6f54 },{ 0x6d12, 0x7051 },{ 0x6d3c, 0x7aaa },{ 0x6d43, 0x6d79 },
+ { 0x6d45, 0x6dfa },{ 0x6d46, 0x6f3f },{ 0x6d47, 0x6f86 },{ 0x6d48, 0x6e5e },
+ { 0x6d4a, 0x6fc1 },{ 0x6d4b, 0x6e2c },{ 0x6d4d, 0x6fae },{ 0x6d4e, 0x6fdf },
+ { 0x6d4f, 0x700f },{ 0x6d51, 0x6e3e },{ 0x6d52, 0x6ef8 },{ 0x6d53, 0x6fc3 },
+ { 0x6d54, 0x6f6f },{ 0x6d5c, 0x6ff1 },{ 0x6d82, 0x5857 },{ 0x6d8c, 0x6e67 },
+ { 0x6d9b, 0x6fe4 },{ 0x6d9d, 0x6f87 },{ 0x6d9e, 0x6df6 },{ 0x6d9f, 0x6f23 },
+ { 0x6da0, 0x6f7f },{ 0x6da1, 0x6e26 },{ 0x6da3, 0x6e19 },{ 0x6da4, 0x6ecc },
+ { 0x6da6, 0x6f64 },{ 0x6da7, 0x6f97 },{ 0x6da8, 0x6f32 },{ 0x6da9, 0x6f80 },
+ { 0x6dc0, 0x6fb1 },{ 0x6e0a, 0x6df5 },{ 0x6e0c, 0x6de5 },{ 0x6e0d, 0x6f2c },
+ { 0x6e0e, 0x7006 },{ 0x6e10, 0x6f38 },{ 0x6e11, 0x6fa0 },{ 0x6e14, 0x6f01 },
+ { 0x6e16, 0x700b },{ 0x6e17, 0x6ef2 },{ 0x6e29, 0x6eab },{ 0x6e38, 0x904a },
+ { 0x6e7e, 0x7063 },{ 0x6e7f, 0x6fd5 },{ 0x6e83, 0x6f70 },{ 0x6e85, 0x6ffa },
+ { 0x6e86, 0x6f35 },{ 0x6ed7, 0x6f77 },{ 0x6eda, 0x6efe },{ 0x6ede, 0x6eef },
+ { 0x6edf, 0x7069 },{ 0x6ee0, 0x7044 },{ 0x6ee1, 0x6eff },{ 0x6ee2, 0x7005 },
+ { 0x6ee4, 0x6ffe },{ 0x6ee5, 0x6feb },{ 0x6ee6, 0x7064 },{ 0x6ee8, 0x6ff1 },
+ { 0x6ee9, 0x7058 },{ 0x6f46, 0x7020 },{ 0x6f47, 0x701f },{ 0x6f4b, 0x7032 },
+ { 0x6f4d, 0x6ff0 },{ 0x6f5c, 0x6f5b },{ 0x6f74, 0x7026 },{ 0x6f9c, 0x703e },
+ { 0x6fd1, 0x7028 },{ 0x6fd2, 0x7015 },{ 0x704f, 0x705d },{ 0x706c, 0x706b },
+ { 0x706d, 0x6ec5 },{ 0x706f, 0x71c8 },{ 0x7075, 0x9748 },{ 0x707e, 0x707d },
+ { 0x707f, 0x71e6 },{ 0x7080, 0x716c },{ 0x7089, 0x7210 },{ 0x7096, 0x71c9 },
+ { 0x709c, 0x7152 },{ 0x709d, 0x7197 },{ 0x70ae, 0x7832 },{ 0x70b9, 0x9ede },
+ { 0x70bc, 0x934a },{ 0x70bd, 0x71be },{ 0x70c1, 0x720d },{ 0x70c2, 0x721b },
+ { 0x70c3, 0x70f4 },{ 0x70db, 0x71ed },{ 0x70df, 0x7159 },{ 0x70e6, 0x7169 },
+ { 0x70e7, 0x71d2 },{ 0x70e8, 0x71c1 },{ 0x70e9, 0x71f4 },{ 0x70eb, 0x71d9 },
+ { 0x70ec, 0x71fc },{ 0x70ed, 0x71b1 },{ 0x7115, 0x7165 },{ 0x7116, 0x71dc },
+ { 0x7118, 0x71fe },{ 0x7130, 0x71c4 },{ 0x7145, 0x935b },{ 0x718f, 0x71fb },
+ { 0x7231, 0x611b },{ 0x7237, 0x723a },{ 0x724d, 0x7258 },{ 0x7266, 0x729b },
+ { 0x7275, 0x727d },{ 0x727a, 0x72a7 },{ 0x728a, 0x72a2 },{ 0x72ad, 0x72ac },
+ { 0x72b6, 0x72c0 },{ 0x72b7, 0x7377 },{ 0x72b9, 0x7336 },{ 0x72c8, 0x72fd },
+ { 0x72de, 0x7370 },{ 0x72ec, 0x7368 },{ 0x72ed, 0x72f9 },{ 0x72ee, 0x7345 },
+ { 0x72ef, 0x736a },{ 0x72f0, 0x7319 },{ 0x72f1, 0x7344 },{ 0x72f2, 0x733b },
+ { 0x7303, 0x736b },{ 0x730e, 0x7375 },{ 0x7315, 0x737c },{ 0x7321, 0x7380 },
+ { 0x732a, 0x8c6c },{ 0x732b, 0x8c93 },{ 0x732c, 0x875f },{ 0x732e, 0x737b },
+ { 0x736d, 0x737a },{ 0x7391, 0x74a3 },{ 0x739b, 0x746a },{ 0x73ae, 0x744b },
+ { 0x73af, 0x74b0 },{ 0x73b0, 0x73fe },{ 0x73ba, 0x74bd },{ 0x73c9, 0x739f },
+ { 0x73cf, 0x73a8 },{ 0x73d0, 0x743a },{ 0x73d1, 0x74cf },{ 0x73f2, 0x743f },
+ { 0x740f, 0x7489 },{ 0x7410, 0x7463 },{ 0x743c, 0x74ca },{ 0x7476, 0x7464 },
+ { 0x7477, 0x74a6 },{ 0x748e, 0x74d4 },{ 0x74d2, 0x74da },{ 0x74ee, 0x7515 },
+ { 0x74ef, 0x750c },{ 0x7535, 0x96fb },{ 0x753b, 0x756b },{ 0x7545, 0x66a2 },
+ { 0x7572, 0x756c },{ 0x7574, 0x7587 },{ 0x7596, 0x7664 },{ 0x7597, 0x7642 },
+ { 0x759f, 0x7627 },{ 0x75a0, 0x7658 },{ 0x75a1, 0x760d },{ 0x75ae, 0x7621 },
+ { 0x75af, 0x760b },{ 0x75b1, 0x76b0 },{ 0x75b4, 0x75fe },{ 0x75c8, 0x7670 },
+ { 0x75c9, 0x75d9 },{ 0x75d2, 0x7662 },{ 0x75e8, 0x7646 },{ 0x75ea, 0x7613 },
+ { 0x75eb, 0x7647 },{ 0x75f4, 0x7661 },{ 0x75f9, 0x75fa },{ 0x7605, 0x7649 },
+ { 0x7617, 0x761e },{ 0x7618, 0x763a },{ 0x762a, 0x765f },{ 0x762b, 0x7671 },
+ { 0x763e, 0x766e },{ 0x763f, 0x766d },{ 0x765e, 0x7669 },{ 0x7663, 0x766c },
+ { 0x766b, 0x7672 },{ 0x7691, 0x769a },{ 0x76b1, 0x76ba },{ 0x76b2, 0x76b8 },
+ { 0x76cf, 0x76de },{ 0x76d0, 0x9e7d },{ 0x76d1, 0x76e3 },{ 0x76d6, 0x84cb },
+ { 0x76d7, 0x76dc },{ 0x76d8, 0x76e4 },{ 0x7726, 0x7725 },{ 0x772f, 0x7787 },
+ { 0x7740, 0x8457 },{ 0x7741, 0x775c },{ 0x7750, 0x775e },{ 0x7751, 0x77bc },
+ { 0x777e, 0x776a },{ 0x777f, 0x53e1 },{ 0x7792, 0x779e },{ 0x77a9, 0x77da },
+ { 0x77eb, 0x77ef },{ 0x77f6, 0x78ef },{ 0x77fe, 0x792c },{ 0x77ff, 0x7926 },
+ { 0x7800, 0x78ad },{ 0x7801, 0x78bc },{ 0x7816, 0x78da },{ 0x7817, 0x7868 },
+ { 0x781a, 0x786f },{ 0x783a, 0x792a },{ 0x783b, 0x7931 },{ 0x783e, 0x792b },
+ { 0x7840, 0x790e },{ 0x7855, 0x78a9 },{ 0x7856, 0x7864 },{ 0x7857, 0x78fd },
+ { 0x786e, 0x78ba },{ 0x7877, 0x9e7c },{ 0x788d, 0x7919 },{ 0x789b, 0x78e7 },
+ { 0x789c, 0x78e3 },{ 0x78b1, 0x583f },{ 0x7934, 0x7921 },{ 0x793b, 0x793a },
+ { 0x793c, 0x79ae },{ 0x795b, 0x88aa },{ 0x7962, 0x79b0 },{ 0x796f, 0x798e },
+ { 0x7977, 0x79b1 },{ 0x7978, 0x798d },{ 0x7980, 0x7a1f },{ 0x7984, 0x797f },
+ { 0x7985, 0x79aa },{ 0x79bb, 0x96e2 },{ 0x79c3, 0x79bf },{ 0x79c6, 0x7a08 },
+ { 0x79cd, 0x7a2e },{ 0x79ef, 0x7a4d },{ 0x79f0, 0x7a31 },{ 0x79fd, 0x7a62 },
+ { 0x7a0e, 0x7a05 },{ 0x7a23, 0x7a4c },{ 0x7a33, 0x7a69 },{ 0x7a51, 0x7a61 },
+ { 0x7a77, 0x7aae },{ 0x7a83, 0x7aca },{ 0x7a8d, 0x7ac5 },{ 0x7a91, 0x7aaf },
+ { 0x7a9c, 0x7ac4 },{ 0x7a9d, 0x7aa9 },{ 0x7aa5, 0x7aba },{ 0x7aa6, 0x7ac7 },
+ { 0x7aad, 0x7ab6 },{ 0x7ad6, 0x8c4e },{ 0x7ade, 0x7af6 },{ 0x7b03, 0x7be4 },
+ { 0x7b0b, 0x7b4d },{ 0x7b14, 0x7b46 },{ 0x7b15, 0x7b67 },{ 0x7b3a, 0x7b8b },
+ { 0x7b3c, 0x7c60 },{ 0x7b3e, 0x7c69 },{ 0x7b47, 0x7b3b },{ 0x7b51, 0x7bc9 },
+ { 0x7b5a, 0x7bf3 },{ 0x7b5b, 0x7be9 },{ 0x7b5d, 0x7b8f },{ 0x7b71, 0x7be0 },
+ { 0x7b79, 0x7c4c },{ 0x7b7e, 0x7c3d },{ 0x7b80, 0x7c21 },{ 0x7ba6, 0x7c00 },
+ { 0x7ba7, 0x7bcb },{ 0x7ba8, 0x7c5c },{ 0x7ba9, 0x7c6e },{ 0x7baa, 0x7c1e },
+ { 0x7bab, 0x7c2b },{ 0x7bd1, 0x7c23 },{ 0x7bd3, 0x7c0d },{ 0x7bee, 0x7c43 },
+ { 0x7bf1, 0x7c6c },{ 0x7c16, 0x7c6a },{ 0x7c41, 0x7c5f },{ 0x7c74, 0x7cf4 },
+ { 0x7c7b, 0x985e },{ 0x7c7c, 0x79c8 },{ 0x7c9c, 0x7cf6 },{ 0x7c9d, 0x7cf2 },
+ { 0x7ca4, 0x7cb5 },{ 0x7caa, 0x7cde },{ 0x7cae, 0x7ce7 },{ 0x7cc1, 0x7cdd },
+ { 0x7cc7, 0x9931 },{ 0x7ccd, 0x9908 },{ 0x7d27, 0x7dca },{ 0x7d77, 0x7e36 },
+ { 0x7e9f, 0x7d72 },{ 0x7ea0, 0x7cfe },{ 0x7ea1, 0x7d06 },{ 0x7ea2, 0x7d05 },
+ { 0x7ea3, 0x7d02 },{ 0x7ea4, 0x7e96 },{ 0x7ea5, 0x7d07 },{ 0x7ea6, 0x7d04 },
+ { 0x7ea7, 0x7d1a },{ 0x7ea8, 0x7d08 },{ 0x7ea9, 0x7e8a },{ 0x7eaa, 0x7d00 },
+ { 0x7eab, 0x7d09 },{ 0x7eac, 0x7def },{ 0x7ead, 0x7d1c },{ 0x7eaf, 0x7d14 },
+ { 0x7eb0, 0x7d15 },{ 0x7eb1, 0x7d17 },{ 0x7eb2, 0x7db1 },{ 0x7eb3, 0x7d0d },
+ { 0x7eb5, 0x7e31 },{ 0x7eb6, 0x7db8 },{ 0x7eb7, 0x7d1b },{ 0x7eb8, 0x7d19 },
+ { 0x7eb9, 0x7d0b },{ 0x7eba, 0x7d21 },{ 0x7ebd, 0x7d10 },{ 0x7ebe, 0x7d13 },
+ { 0x7ebf, 0x7dda },{ 0x7ec0, 0x7d3a },{ 0x7ec1, 0x7d32 },{ 0x7ec2, 0x7d31 },
+ { 0x7ec3, 0x7df4 },{ 0x7ec4, 0x7d44 },{ 0x7ec5, 0x7d33 },{ 0x7ec6, 0x7d30 },
+ { 0x7ec7, 0x7e54 },{ 0x7ec8, 0x7d42 },{ 0x7ec9, 0x7e10 },{ 0x7eca, 0x7d46 },
+ { 0x7ecb, 0x7d3c },{ 0x7ecc, 0x7d40 },{ 0x7ecd, 0x7d39 },{ 0x7ece, 0x7e79 },
+ { 0x7ecf, 0x7d93 },{ 0x7ed0, 0x7d3f },{ 0x7ed1, 0x7d81 },{ 0x7ed2, 0x7d68 },
+ { 0x7ed3, 0x7d50 },{ 0x7ed4, 0x8932 },{ 0x7ed5, 0x7e5e },{ 0x7ed7, 0x7d4e },
+ { 0x7ed8, 0x7e6a },{ 0x7ed9, 0x7d66 },{ 0x7eda, 0x7d62 },{ 0x7edb, 0x7d73 },
+ { 0x7edc, 0x7d61 },{ 0x7edd, 0x7d55 },{ 0x7ede, 0x7d5e },{ 0x7edf, 0x7d71 },
+ { 0x7ee0, 0x7d86 },{ 0x7ee1, 0x7d83 },{ 0x7ee2, 0x7d79 },{ 0x7ee3, 0x7e61 },
+ { 0x7ee5, 0x7d8f },{ 0x7ee6, 0x7d5b },{ 0x7ee7, 0x7e7c },{ 0x7ee8, 0x7d88 },
+ { 0x7ee9, 0x7e3e },{ 0x7eea, 0x7dd2 },{ 0x7eeb, 0x7dbe },{ 0x7eed, 0x7e8c },
+ { 0x7eee, 0x7dba },{ 0x7eef, 0x7dcb },{ 0x7ef0, 0x7dbd },{ 0x7ef2, 0x7dc4 },
+ { 0x7ef3, 0x7e69 },{ 0x7ef4, 0x7dad },{ 0x7ef5, 0x7dbf },{ 0x7ef6, 0x7dac },
+ { 0x7ef7, 0x7e43 },{ 0x7ef8, 0x7da2 },{ 0x7efa, 0x7db9 },{ 0x7efb, 0x7da3 },
+ { 0x7efc, 0x7d9c },{ 0x7efd, 0x7dbb },{ 0x7efe, 0x7db0 },{ 0x7eff, 0x7da0 },
+ { 0x7f00, 0x7db4 },{ 0x7f01, 0x7dc7 },{ 0x7f02, 0x7dd9 },{ 0x7f03, 0x7dd7 },
+ { 0x7f04, 0x7dd8 },{ 0x7f05, 0x7dec },{ 0x7f06, 0x7e9c },{ 0x7f07, 0x7df9 },
+ { 0x7f08, 0x7df2 },{ 0x7f09, 0x7ddd },{ 0x7f0b, 0x7e62 },{ 0x7f0c, 0x7de6 },
+ { 0x7f0d, 0x7d9e },{ 0x7f0e, 0x7dde },{ 0x7f0f, 0x7df6 },{ 0x7f11, 0x7df1 },
+ { 0x7f12, 0x7e0b },{ 0x7f13, 0x7de9 },{ 0x7f14, 0x7de0 },{ 0x7f15, 0x7e37 },
+ { 0x7f16, 0x7de8 },{ 0x7f17, 0x7de1 },{ 0x7f18, 0x7de3 },{ 0x7f19, 0x7e09 },
+ { 0x7f1a, 0x7e1b },{ 0x7f1b, 0x7e1f },{ 0x7f1c, 0x7e1d },{ 0x7f1d, 0x7e2b },
+ { 0x7f1f, 0x7e1e },{ 0x7f20, 0x7e8f },{ 0x7f21, 0x7e2d },{ 0x7f22, 0x7e0a },
+ { 0x7f23, 0x7e11 },{ 0x7f24, 0x7e7d },{ 0x7f25, 0x7e39 },{ 0x7f26, 0x7e35 },
+ { 0x7f27, 0x7e32 },{ 0x7f28, 0x7e93 },{ 0x7f29, 0x7e2e },{ 0x7f2a, 0x7e46 },
+ { 0x7f2b, 0x7e45 },{ 0x7f2c, 0x7e88 },{ 0x7f2d, 0x7e5a },{ 0x7f2e, 0x7e55 },
+ { 0x7f2f, 0x7e52 },{ 0x7f30, 0x97c1 },{ 0x7f31, 0x7e7e },{ 0x7f32, 0x7e70 },
+ { 0x7f33, 0x7e6f },{ 0x7f34, 0x7e73 },{ 0x7f35, 0x7e98 },{ 0x7f42, 0x7f4c },
+ { 0x7f51, 0x7db2 },{ 0x7f57, 0x7f85 },{ 0x7f5a, 0x7f70 },{ 0x7f62, 0x7f77 },
+ { 0x7f74, 0x7f86 },{ 0x7f81, 0x7f88 },{ 0x7f9f, 0x7fa5 },{ 0x7fa1, 0x7fa8 },
+ { 0x7fd8, 0x7ff9 },{ 0x8027, 0x802c },{ 0x8038, 0x8073 },{ 0x803b, 0x6065 },
+ { 0x8042, 0x8076 },{ 0x804b, 0x807e },{ 0x804c, 0x8077 },{ 0x804d, 0x8079 },
+ { 0x8054, 0x806f },{ 0x8069, 0x8075 },{ 0x806a, 0x8070 },{ 0x8080, 0x807f },
+ { 0x8083, 0x8085 },{ 0x80a0, 0x8178 },{ 0x80a4, 0x819a },{ 0x80ae, 0x9aaf },
+ { 0x80b4, 0x991a },{ 0x80be, 0x814e },{ 0x80bf, 0x816b },{ 0x80c0, 0x8139 },
+ { 0x80c1, 0x8105 },{ 0x80c4, 0x5191 },{ 0x80c6, 0x81bd },{ 0x80dc, 0x52dd },
+ { 0x80e7, 0x6727 },{ 0x80ea, 0x81da },{ 0x80eb, 0x811b },{ 0x80f6, 0x81a0 },
+ { 0x8109, 0x8108 },{ 0x810d, 0x81be },{ 0x810f, 0x9ad2 },{ 0x8110, 0x81cd },
+ { 0x8111, 0x8166 },{ 0x8113, 0x81bf },{ 0x8114, 0x81e0 },{ 0x811a, 0x8173 },
+ { 0x8131, 0x812b },{ 0x8132, 0x5c3f },{ 0x8136, 0x8161 },{ 0x8138, 0x81c9 },
+ { 0x814a, 0x81d8 },{ 0x814c, 0x9183 },{ 0x816d, 0x9f76 },{ 0x817b, 0x81a9 },
+ { 0x817c, 0x9766 },{ 0x817d, 0x8183 },{ 0x817e, 0x9a30 },{ 0x8191, 0x81cf },
+ { 0x8206, 0x8f3f },{ 0x8223, 0x8264 },{ 0x8230, 0x8266 },{ 0x8231, 0x8259 },
+ { 0x823b, 0x826b },{ 0x8270, 0x8271 },{ 0x8273, 0x8c54 },{ 0x8279, 0x8278 },
+ { 0x827a, 0x85dd },{ 0x8282, 0x7bc0 },{ 0x8288, 0x7f8b },{ 0x8297, 0x858c },
+ { 0x829c, 0x856a },{ 0x82a6, 0x8606 },{ 0x82c1, 0x84ef },{ 0x82c7, 0x8466 },
+ { 0x82c8, 0x85f6 },{ 0x82cb, 0x83a7 },{ 0x82cc, 0x8407 },{ 0x82cd, 0x84bc },
+ { 0x82ce, 0x82e7 },{ 0x82cf, 0x8607 },{ 0x82f9, 0x860b },{ 0x8303, 0x7bc4 },
+ { 0x830e, 0x8396 },{ 0x830f, 0x8622 },{ 0x8311, 0x8526 },{ 0x8314, 0x584b },
+ { 0x8315, 0x7162 },{ 0x8327, 0x7e6d },{ 0x8346, 0x834a },{ 0x8350, 0x85a6 },
+ { 0x835a, 0x83a2 },{ 0x835b, 0x8558 },{ 0x835c, 0x84fd },{ 0x835e, 0x854e },
+ { 0x835f, 0x8588 },{ 0x8360, 0x85ba },{ 0x8361, 0x8569 },{ 0x8363, 0x69ae },
+ { 0x8364, 0x8477 },{ 0x8365, 0x6ece },{ 0x8366, 0x7296 },{ 0x8367, 0x7192 },
+ { 0x8368, 0x8541 },{ 0x8369, 0x85ce },{ 0x836a, 0x84c0 },{ 0x836b, 0x852d },
+ { 0x836c, 0x85da },{ 0x836d, 0x8452 },{ 0x836f, 0x85e5 },{ 0x8385, 0x849e },
+ { 0x83b1, 0x840a },{ 0x83b2, 0x84ee },{ 0x83b3, 0x8494 },{ 0x83b4, 0x8435 },
+ { 0x83b6, 0x859f },{ 0x83b7, 0x7372 },{ 0x83b8, 0x8555 },{ 0x83b9, 0x7469 },
+ { 0x83ba, 0x9daf },{ 0x83bc, 0x84f4 },{ 0x841d, 0x863f },{ 0x8424, 0x87a2 },
+ { 0x8425, 0x71df },{ 0x8426, 0x7e08 },{ 0x8427, 0x856d },{ 0x8428, 0x85a9 },
+ { 0x8471, 0x8525 },{ 0x8487, 0x8546 },{ 0x8489, 0x8562 },{ 0x848b, 0x8523 },
+ { 0x848c, 0x851e },{ 0x84d1, 0x7c11 },{ 0x84dd, 0x85cd },{ 0x84df, 0x858a },
+ { 0x84e0, 0x863a },{ 0x84e3, 0x8577 },{ 0x84e5, 0x93a3 },{ 0x84e6, 0x9a40 },
+ { 0x8537, 0x8594 },{ 0x8539, 0x861e },{ 0x853a, 0x85fa },{ 0x853c, 0x85f9 },
+ { 0x8572, 0x8604 },{ 0x8574, 0x860a },{ 0x85ae, 0x85ea },{ 0x85d3, 0x861a },
+ { 0x8616, 0x8617 },{ 0x864f, 0x865c },{ 0x8651, 0x616e },{ 0x865a, 0x865b },
+ { 0x866b, 0x87f2 },{ 0x866c, 0x866f },{ 0x866e, 0x87e3 },{ 0x867d, 0x96d6 },
+ { 0x867e, 0x8766 },{ 0x867f, 0x8806 },{ 0x8680, 0x8755 },{ 0x8681, 0x87fb },
+ { 0x8682, 0x879e },{ 0x8695, 0x8836 },{ 0x869d, 0x8814 },{ 0x86ac, 0x8706 },
+ { 0x86ca, 0x8831 },{ 0x86ce, 0x8823 },{ 0x86cf, 0x87f6 },{ 0x86ee, 0x883b },
+ { 0x86f0, 0x87c4 },{ 0x86f1, 0x86fa },{ 0x86f2, 0x87ef },{ 0x86f3, 0x8784 },
+ { 0x86f4, 0x8810 },{ 0x8715, 0x86fb },{ 0x8717, 0x8778 },{ 0x8721, 0x881f },
+ { 0x8747, 0x8805 },{ 0x8748, 0x87c8 },{ 0x8749, 0x87ec },{ 0x874e, 0x880d },
+ { 0x8770, 0x867a },{ 0x877c, 0x87bb },{ 0x877e, 0x8811 },{ 0x87ee, 0x87fa },
+ { 0x8845, 0x91c1 },{ 0x8854, 0x929c },{ 0x8864, 0x8863 },{ 0x8865, 0x88dc },
+ { 0x886c, 0x896f },{ 0x886e, 0x889e },{ 0x8884, 0x8956 },{ 0x8885, 0x88ca },
+ { 0x889c, 0x896a },{ 0x88ad, 0x8972 },{ 0x88c5, 0x88dd },{ 0x88c6, 0x8960 },
+ { 0x88e2, 0x8933 },{ 0x88e3, 0x895d },{ 0x88e4, 0x8932 },{ 0x88e5, 0x8949 },
+ { 0x891b, 0x8938 },{ 0x8934, 0x8964 },{ 0x89c1, 0x898b },{ 0x89c2, 0x89c0 },
+ { 0x89c4, 0x898f },{ 0x89c5, 0x8993 },{ 0x89c6, 0x8996 },{ 0x89c7, 0x8998 },
+ { 0x89c8, 0x89bd },{ 0x89c9, 0x89ba },{ 0x89ca, 0x89ac },{ 0x89cb, 0x89a1 },
+ { 0x89cc, 0x89bf },{ 0x89ce, 0x89a6 },{ 0x89cf, 0x89af },{ 0x89d0, 0x89b2 },
+ { 0x89d1, 0x89b7 },{ 0x89de, 0x89f4 },{ 0x89e6, 0x89f8 },{ 0x89ef, 0x89f6 },
+ { 0x8a89, 0x8b7d },{ 0x8a8a, 0x8b04 },{ 0x8ba0, 0x8a00 },{ 0x8ba1, 0x8a08 },
+ { 0x8ba2, 0x8a02 },{ 0x8ba3, 0x8a03 },{ 0x8ba4, 0x8a8d },{ 0x8ba5, 0x8b4f },
+ { 0x8ba6, 0x8a10 },{ 0x8ba7, 0x8a0c },{ 0x8ba8, 0x8a0e },{ 0x8ba9, 0x8b93 },
+ { 0x8baa, 0x8a15 },{ 0x8bab, 0x8a16 },{ 0x8bad, 0x8a13 },{ 0x8bae, 0x8b70 },
+ { 0x8baf, 0x8a0a },{ 0x8bb0, 0x8a18 },{ 0x8bb2, 0x8b1b },{ 0x8bb3, 0x8af1 },
+ { 0x8bb4, 0x8b33 },{ 0x8bb5, 0x8a4e },{ 0x8bb6, 0x8a1d },{ 0x8bb7, 0x8a25 },
+ { 0x8bb8, 0x8a31 },{ 0x8bb9, 0x8a1b },{ 0x8bba, 0x8ad6 },{ 0x8bbc, 0x8a1f },
+ { 0x8bbd, 0x8af7 },{ 0x8bbe, 0x8a2d },{ 0x8bbf, 0x8a2a },{ 0x8bc0, 0x8a23 },
+ { 0x8bc1, 0x8b49 },{ 0x8bc2, 0x8a41 },{ 0x8bc3, 0x8a36 },{ 0x8bc4, 0x8a55 },
+ { 0x8bc5, 0x8a5b },{ 0x8bc6, 0x8b58 },{ 0x8bc8, 0x8a50 },{ 0x8bc9, 0x8a34 },
+ { 0x8bca, 0x8a3a },{ 0x8bcb, 0x8a46 },{ 0x8bcc, 0x8b05 },{ 0x8bcd, 0x8a5e },
+ { 0x8bce, 0x8a58 },{ 0x8bcf, 0x8a54 },{ 0x8bd1, 0x8b6f },{ 0x8bd2, 0x8a52 },
+ { 0x8bd3, 0x8a86 },{ 0x8bd4, 0x8a84 },{ 0x8bd5, 0x8a66 },{ 0x8bd6, 0x8a7f },
+ { 0x8bd7, 0x8a69 },{ 0x8bd8, 0x8a70 },{ 0x8bd9, 0x8a7c },{ 0x8bda, 0x8aa0 },
+ { 0x8bdb, 0x8a85 },{ 0x8bdc, 0x8a75 },{ 0x8bdd, 0x8a71 },{ 0x8bde, 0x8a95 },
+ { 0x8bdf, 0x8a6c },{ 0x8be0, 0x8a6e },{ 0x8be1, 0x8a6d },{ 0x8be2, 0x8a62 },
+ { 0x8be3, 0x8a63 },{ 0x8be4, 0x8acd },{ 0x8be5, 0x8a72 },{ 0x8be6, 0x8a73 },
+ { 0x8be7, 0x8a6b },{ 0x8be8, 0x8ae2 },{ 0x8be9, 0x8a61 },{ 0x8beb, 0x8aa1 },
+ { 0x8bec, 0x8aa3 },{ 0x8bed, 0x8a9e },{ 0x8bee, 0x8a9a },{ 0x8bef, 0x8aa4 },
+ { 0x8bf0, 0x8aa5 },{ 0x8bf1, 0x8a98 },{ 0x8bf2, 0x8aa8 },{ 0x8bf3, 0x8a91 },
+ { 0x8bf4, 0x8aaa },{ 0x8bf5, 0x8aa6 },{ 0x8bf6, 0x8a92 },{ 0x8bf7, 0x8acb },
+ { 0x8bf8, 0x8af8 },{ 0x8bf9, 0x8acf },{ 0x8bfa, 0x8afe },{ 0x8bfb, 0x8b80 },
+ { 0x8bfc, 0x8ad1 },{ 0x8bfd, 0x8ab9 },{ 0x8bfe, 0x8ab2 },{ 0x8bff, 0x8ac9 },
+ { 0x8c00, 0x8adb },{ 0x8c01, 0x8ab0 },{ 0x8c02, 0x8ad7 },{ 0x8c03, 0x8abf },
+ { 0x8c04, 0x8ac2 },{ 0x8c05, 0x8ad2 },{ 0x8c06, 0x8ac4 },{ 0x8c07, 0x8ab6 },
+ { 0x8c08, 0x8ac7 },{ 0x8c0a, 0x8abc },{ 0x8c0b, 0x8b00 },{ 0x8c0c, 0x8af6 },
+ { 0x8c0d, 0x8adc },{ 0x8c0e, 0x8b0a },{ 0x8c0f, 0x8aeb },{ 0x8c10, 0x8ae7 },
+ { 0x8c11, 0x8b14 },{ 0x8c12, 0x8b01 },{ 0x8c13, 0x8b02 },{ 0x8c14, 0x8ae4 },
+ { 0x8c15, 0x8aed },{ 0x8c16, 0x8afc },{ 0x8c17, 0x8b92 },{ 0x8c18, 0x8aee },
+ { 0x8c19, 0x8af3 },{ 0x8c1a, 0x8afa },{ 0x8c1b, 0x8ae6 },{ 0x8c1c, 0x8b0e },
+ { 0x8c1d, 0x8ade },{ 0x8c1f, 0x8b28 },{ 0x8c20, 0x8b9c },{ 0x8c21, 0x8b16 },
+ { 0x8c22, 0x8b1d },{ 0x8c23, 0x8b20 },{ 0x8c24, 0x8b17 },{ 0x8c25, 0x8b1a },
+ { 0x8c26, 0x8b19 },{ 0x8c27, 0x8b10 },{ 0x8c28, 0x8b39 },{ 0x8c29, 0x8b3e },
+ { 0x8c2a, 0x8b2b },{ 0x8c2b, 0x8b7e },{ 0x8c2c, 0x8b2c },{ 0x8c2d, 0x8b5a },
+ { 0x8c2e, 0x8b56 },{ 0x8c2f, 0x8b59 },{ 0x8c30, 0x8b95 },{ 0x8c31, 0x8b5c },
+ { 0x8c32, 0x8b4e },{ 0x8c33, 0x8b9e },{ 0x8c34, 0x8b74 },{ 0x8c35, 0x8b6b },
+ { 0x8c36, 0x8b96 },{ 0x8d1d, 0x8c9d },{ 0x8d1e, 0x8c9e },{ 0x8d1f, 0x8ca0 },
+ { 0x8d21, 0x8ca2 },{ 0x8d22, 0x8ca1 },{ 0x8d23, 0x8cac },{ 0x8d24, 0x8ce2 },
+ { 0x8d25, 0x6557 },{ 0x8d26, 0x8cec },{ 0x8d27, 0x8ca8 },{ 0x8d28, 0x8cea },
+ { 0x8d29, 0x8ca9 },{ 0x8d2a, 0x8caa },{ 0x8d2b, 0x8ca7 },{ 0x8d2c, 0x8cb6 },
+ { 0x8d2d, 0x8cfc },{ 0x8d2e, 0x8caf },{ 0x8d2f, 0x8cab },{ 0x8d30, 0x8cb3 },
+ { 0x8d31, 0x8ce4 },{ 0x8d32, 0x8cc1 },{ 0x8d33, 0x8cb0 },{ 0x8d34, 0x8cbc },
+ { 0x8d35, 0x8cb4 },{ 0x8d36, 0x8cba },{ 0x8d37, 0x8cb8 },{ 0x8d38, 0x8cbf },
+ { 0x8d39, 0x8cbb },{ 0x8d3a, 0x8cc0 },{ 0x8d3b, 0x8cbd },{ 0x8d3c, 0x8cca },
+ { 0x8d3d, 0x8d04 },{ 0x8d3e, 0x8cc8 },{ 0x8d3f, 0x8cc4 },{ 0x8d40, 0x8cb2 },
+ { 0x8d41, 0x8cc3 },{ 0x8d42, 0x8cc2 },{ 0x8d43, 0x8d13 },{ 0x8d44, 0x8cc7 },
+ { 0x8d45, 0x8cc5 },{ 0x8d46, 0x8d10 },{ 0x8d47, 0x8cd5 },{ 0x8d48, 0x8cd1 },
+ { 0x8d49, 0x8cda },{ 0x8d4a, 0x8cd2 },{ 0x8d4b, 0x8ce6 },{ 0x8d4c, 0x8ced },
+ { 0x8d4d, 0x9f4e },{ 0x8d4e, 0x8d16 },{ 0x8d4f, 0x8cde },{ 0x8d50, 0x8cdc },
+ { 0x8d53, 0x8ce1 },{ 0x8d54, 0x8ce0 },{ 0x8d55, 0x8ce7 },{ 0x8d56, 0x8cf4 },
+ { 0x8d58, 0x8d05 },{ 0x8d59, 0x8cfb },{ 0x8d5a, 0x8cfa },{ 0x8d5b, 0x8cfd },
+ { 0x8d5c, 0x8cfe },{ 0x8d5d, 0x8d17 },{ 0x8d5e, 0x8d0a },{ 0x8d60, 0x8d08 },
+ { 0x8d61, 0x8d0d },{ 0x8d62, 0x8d0f },{ 0x8d63, 0x8d1b },{ 0x8d75, 0x8d99 },
+ { 0x8d76, 0x8d95 },{ 0x8d8b, 0x8da8 },{ 0x8db1, 0x8db2 },{ 0x8db8, 0x8e89 },
+ { 0x8dc3, 0x8e8d },{ 0x8dc4, 0x8e4c },{ 0x8dde, 0x8e92 },{ 0x8df5, 0x8e10 },
+ { 0x8df7, 0x8e7a },{ 0x8df8, 0x8e55 },{ 0x8df9, 0x8e9a },{ 0x8dfb, 0x8e8b },
+ { 0x8e0a, 0x8e34 },{ 0x8e0c, 0x8e8a },{ 0x8e2a, 0x8e64 },{ 0x8e2c, 0x8e93 },
+ { 0x8e2f, 0x8e91 },{ 0x8e51, 0x8ea1 },{ 0x8e52, 0x8e63 },{ 0x8e70, 0x8e95 },
+ { 0x8e7f, 0x8ea5 },{ 0x8e8f, 0x8eaa },{ 0x8e9c, 0x8ea6 },{ 0x8eaf, 0x8ec0 },
+ { 0x8f66, 0x8eca },{ 0x8f67, 0x8ecb },{ 0x8f68, 0x8ecc },{ 0x8f69, 0x8ed2 },
+ { 0x8f6b, 0x8ed4 },{ 0x8f6c, 0x8f49 },{ 0x8f6d, 0x8edb },{ 0x8f6e, 0x8f2a },
+ { 0x8f6f, 0x8edf },{ 0x8f70, 0x8f5f },{ 0x8f72, 0x8efb },{ 0x8f73, 0x8f64 },
+ { 0x8f74, 0x8ef8 },{ 0x8f75, 0x8ef9 },{ 0x8f76, 0x8efc },{ 0x8f78, 0x8eeb },
+ { 0x8f79, 0x8f62 },{ 0x8f7a, 0x8efa },{ 0x8f7b, 0x8f15 },{ 0x8f7c, 0x8efe },
+ { 0x8f7d, 0x8f09 },{ 0x8f7e, 0x8f0a },{ 0x8f7f, 0x8f4e },{ 0x8f81, 0x8f07 },
+ { 0x8f82, 0x8f05 },{ 0x8f83, 0x8f03 },{ 0x8f84, 0x8f12 },{ 0x8f85, 0x8f14 },
+ { 0x8f86, 0x8f1b },{ 0x8f87, 0x8f26 },{ 0x8f88, 0x8f29 },{ 0x8f89, 0x8f1d },
+ { 0x8f8a, 0x8f25 },{ 0x8f8b, 0x8f1e },{ 0x8f8d, 0x8f1f },{ 0x8f8e, 0x8f1c },
+ { 0x8f8f, 0x8f33 },{ 0x8f90, 0x8f3b },{ 0x8f91, 0x8f2f },{ 0x8f93, 0x8f38 },
+ { 0x8f94, 0x8f61 },{ 0x8f95, 0x8f45 },{ 0x8f96, 0x8f44 },{ 0x8f97, 0x8f3e },
+ { 0x8f98, 0x8f46 },{ 0x8f99, 0x8f4d },{ 0x8f9a, 0x8f54 },{ 0x8f9e, 0x8fad },
+ { 0x8f9f, 0x95e2 },{ 0x8fa9, 0x8faf },{ 0x8fab, 0x8fae },{ 0x8fb9, 0x908a },
+ { 0x8fbd, 0x907c },{ 0x8fbe, 0x9054 },{ 0x8fc1, 0x9077 },{ 0x8fc7, 0x904e },
+ { 0x8fc8, 0x9081 },{ 0x8fd0, 0x904b },{ 0x8fd8, 0x9084 },{ 0x8fd9, 0x9019 },
+ { 0x8fdb, 0x9032 },{ 0x8fdc, 0x9060 },{ 0x8fdd, 0x9055 },{ 0x8fde, 0x9023 },
+ { 0x8fdf, 0x9072 },{ 0x8fe9, 0x9087 },{ 0x8ff3, 0x9015 },{ 0x8ff9, 0x8e5f },
+ { 0x9002, 0x9069 },{ 0x9009, 0x9078 },{ 0x900a, 0x905c },{ 0x9012, 0x905e },
+ { 0x9026, 0x9090 },{ 0x903b, 0x908f },{ 0x9057, 0x907a },{ 0x9065, 0x9059 },
+ { 0x9093, 0x9127 },{ 0x909d, 0x913a },{ 0x90ac, 0x9114 },{ 0x90ae, 0x90f5 },
+ { 0x90b9, 0x9112 },{ 0x90ba, 0x9134 },{ 0x90bb, 0x9130 },{ 0x90c1, 0x9b31 },
+ { 0x90c4, 0x9699 },{ 0x90cf, 0x90df },{ 0x90d0, 0x9136 },{ 0x90d1, 0x912d },
+ { 0x90d3, 0x9106 },{ 0x90e6, 0x9148 },{ 0x90e7, 0x9116 },{ 0x90f8, 0x9132 },
+ { 0x915d, 0x919e },{ 0x9171, 0x91ac },{ 0x917d, 0x91c5 },{ 0x917e, 0x91c3 },
+ { 0x917f, 0x91c0 },{ 0x91c7, 0x63a1 },{ 0x91ca, 0x91cb },{ 0x91cc, 0x88e1 },
+ { 0x9274, 0x9451 },{ 0x92ae, 0x947e },{ 0x933e, 0x93e8 },{ 0x9485, 0x91d1 },
+ { 0x9486, 0x91d3 },{ 0x9487, 0x91d4 },{ 0x9488, 0x91dd },{ 0x9489, 0x91d8 },
+ { 0x948a, 0x91d7 },{ 0x948b, 0x91d9 },{ 0x948c, 0x91d5 },{ 0x948d, 0x91f7 },
+ { 0x948e, 0x91ec },{ 0x948f, 0x91e7 },{ 0x9490, 0x91e4 },{ 0x9492, 0x91e9 },
+ { 0x9493, 0x91e3 },{ 0x9494, 0x9346 },{ 0x9495, 0x91f9 },{ 0x9497, 0x91f5 },
+ { 0x9499, 0x9223 },{ 0x949b, 0x9226 },{ 0x949c, 0x9245 },{ 0x949d, 0x920d },
+ { 0x949e, 0x9214 },{ 0x949f, 0x9418 },{ 0x94a0, 0x9209 },{ 0x94a1, 0x92c7 },
+ { 0x94a2, 0x92fc },{ 0x94a3, 0x9211 },{ 0x94a4, 0x9210 },{ 0x94a5, 0x9470 },
+ { 0x94a6, 0x6b3d },{ 0x94a7, 0x921e },{ 0x94a8, 0x93a2 },{ 0x94a9, 0x9264 },
+ { 0x94aa, 0x9227 },{ 0x94ab, 0x9201 },{ 0x94ac, 0x9225 },{ 0x94ad, 0x9204 },
+ { 0x94ae, 0x9215 },{ 0x94af, 0x9200 },{ 0x94b0, 0x923a },{ 0x94b1, 0x9322 },
+ { 0x94b2, 0x9266 },{ 0x94b3, 0x9257 },{ 0x94b4, 0x9237 },{ 0x94b5, 0x7f3d },
+ { 0x94b6, 0x9233 },{ 0x94b8, 0x923d },{ 0x94b9, 0x9238 },{ 0x94ba, 0x925e },
+ { 0x94bb, 0x947d },{ 0x94bc, 0x926c },{ 0x94bd, 0x926d },{ 0x94be, 0x9240 },
+ { 0x94bf, 0x923f },{ 0x94c0, 0x923e },{ 0x94c1, 0x9435 },{ 0x94c2, 0x9251 },
+ { 0x94c3, 0x9234 },{ 0x94c4, 0x9460 },{ 0x94c5, 0x925b },{ 0x94c6, 0x925a },
+ { 0x94c8, 0x9230 },{ 0x94c9, 0x9249 },{ 0x94ca, 0x9248 },{ 0x94cb, 0x924d },
+ { 0x94cc, 0x922e },{ 0x94cd, 0x9239 },{ 0x94ce, 0x9438 },{ 0x94d0, 0x92ac },
+ { 0x94d1, 0x92a0 },{ 0x94d2, 0x927a },{ 0x94d5, 0x92aa },{ 0x94d6, 0x92ee },
+ { 0x94d7, 0x92cf },{ 0x94d9, 0x9403 },{ 0x94db, 0x943a },{ 0x94dc, 0x9285 },
+ { 0x94dd, 0x92c1 },{ 0x94df, 0x92a6 },{ 0x94e0, 0x93a7 },{ 0x94e1, 0x9358 },
+ { 0x94e2, 0x9296 },{ 0x94e3, 0x9291 },{ 0x94e4, 0x92cc },{ 0x94e5, 0x92a9 },
+ { 0x94e7, 0x93f5 },{ 0x94e8, 0x9293 },{ 0x94e9, 0x93a9 },{ 0x94ea, 0x927f },
+ { 0x94eb, 0x929a },{ 0x94ec, 0x927b },{ 0x94ed, 0x9298 },{ 0x94ee, 0x931a },
+ { 0x94ef, 0x92ab },{ 0x94f0, 0x9278 },{ 0x94f1, 0x92a5 },{ 0x94f2, 0x93df },
+ { 0x94f3, 0x9283 },{ 0x94f4, 0x940b },{ 0x94f5, 0x92a8 },{ 0x94f6, 0x9280 },
+ { 0x94f7, 0x92a3 },{ 0x94f8, 0x9444 },{ 0x94f9, 0x9412 },{ 0x94fa, 0x92ea },
+ { 0x94fc, 0x9338 },{ 0x94fd, 0x92f1 },{ 0x94fe, 0x93c8 },{ 0x94ff, 0x93d7 },
+ { 0x9500, 0x92b7 },{ 0x9501, 0x9396 },{ 0x9502, 0x92f0 },{ 0x9504, 0x92e4 },
+ { 0x9505, 0x934b },{ 0x9506, 0x92ef },{ 0x9507, 0x92e8 },{ 0x9508, 0x93fd },
+ { 0x9509, 0x92bc },{ 0x950a, 0x92dd },{ 0x950b, 0x92d2 },{ 0x950c, 0x92c5 },
+ { 0x9510, 0x92b3 },{ 0x9511, 0x92bb },{ 0x9512, 0x92c3 },{ 0x9513, 0x92df },
+ { 0x9514, 0x92e6 },{ 0x9515, 0x9312 },{ 0x9516, 0x9306 },{ 0x9517, 0x937a },
+ { 0x9519, 0x932f },{ 0x951a, 0x9328 },{ 0x951b, 0x931b },{ 0x951e, 0x9301 },
+ { 0x951f, 0x9315 },{ 0x9521, 0x932b },{ 0x9522, 0x932e },{ 0x9523, 0x947c },
+ { 0x9524, 0x939a },{ 0x9525, 0x9310 },{ 0x9526, 0x9326 },{ 0x9529, 0x9308 },
+ { 0x952c, 0x931f },{ 0x952d, 0x9320 },{ 0x952e, 0x9375 },{ 0x952f, 0x92f8 },
+ { 0x9530, 0x9333 },{ 0x9531, 0x9319 },{ 0x9532, 0x9365 },{ 0x9534, 0x9347 },
+ { 0x9535, 0x93d8 },{ 0x9536, 0x9376 },{ 0x9537, 0x9354 },{ 0x9538, 0x9364 },
+ { 0x9539, 0x936c },{ 0x953a, 0x937e },{ 0x953b, 0x935b },{ 0x953c, 0x93aa },
+ { 0x953e, 0x9370 },{ 0x9540, 0x934d },{ 0x9541, 0x9382 },{ 0x9542, 0x93e4 },
+ { 0x9544, 0x9428 },{ 0x9546, 0x93cc },{ 0x9547, 0x93ae },{ 0x9549, 0x9398 },
+ { 0x954a, 0x9477 },{ 0x954c, 0x942b },{ 0x954d, 0x93b3 },{ 0x954f, 0x93a6 },
+ { 0x9550, 0x93ac },{ 0x9551, 0x938a },{ 0x9552, 0x93b0 },{ 0x9553, 0x93b5 },
+ { 0x9554, 0x944c },{ 0x9556, 0x93e2 },{ 0x9557, 0x93dc },{ 0x9558, 0x93dd },
+ { 0x9559, 0x93cd },{ 0x955b, 0x93de },{ 0x955c, 0x93e1 },{ 0x955d, 0x93d1 },
+ { 0x955e, 0x93c3 },{ 0x955f, 0x93c7 },{ 0x9561, 0x9414 },{ 0x9563, 0x9410 },
+ { 0x9564, 0x93f7 },{ 0x9566, 0x9413 },{ 0x9567, 0x946d },{ 0x9568, 0x9420 },
+ { 0x956a, 0x93f9 },{ 0x956b, 0x9419 },{ 0x956c, 0x944a },{ 0x956d, 0x9433 },
+ { 0x956f, 0x9432 },{ 0x9570, 0x942e },{ 0x9571, 0x943f },{ 0x9573, 0x9463 },
+ { 0x9576, 0x9472 },{ 0x957f, 0x9577 },{ 0x95e8, 0x9580 },{ 0x95e9, 0x9582 },
+ { 0x95ea, 0x9583 },{ 0x95eb, 0x9586 },{ 0x95ed, 0x9589 },{ 0x95ee, 0x554f },
+ { 0x95ef, 0x95d6 },{ 0x95f0, 0x958f },{ 0x95f1, 0x95c8 },{ 0x95f2, 0x9592 },
+ { 0x95f3, 0x958e },{ 0x95f4, 0x9593 },{ 0x95f5, 0x9594 },{ 0x95f6, 0x958c },
+ { 0x95f7, 0x60b6 },{ 0x95f8, 0x9598 },{ 0x95f9, 0x9b27 },{ 0x95fa, 0x95a8 },
+ { 0x95fb, 0x805e },{ 0x95fc, 0x95e5 },{ 0x95fd, 0x95a9 },{ 0x95fe, 0x95ad },
+ { 0x9600, 0x95a5 },{ 0x9601, 0x95a3 },{ 0x9602, 0x95a1 },{ 0x9603, 0x95ab },
+ { 0x9604, 0x9b2e },{ 0x9605, 0x95b1 },{ 0x9606, 0x95ac },{ 0x9608, 0x95be },
+ { 0x9609, 0x95b9 },{ 0x960a, 0x95b6 },{ 0x960b, 0x9b29 },{ 0x960c, 0x95bf },
+ { 0x960d, 0x95bd },{ 0x960e, 0x95bb },{ 0x960f, 0x95bc },{ 0x9610, 0x95e1 },
+ { 0x9611, 0x95cc },{ 0x9612, 0x95c3 },{ 0x9614, 0x95ca },{ 0x9615, 0x95cb },
+ { 0x9616, 0x95d4 },{ 0x9617, 0x95d0 },{ 0x9619, 0x95d5 },{ 0x961a, 0x95de },
+ { 0x961d, 0x961c },{ 0x961f, 0x968a },{ 0x9633, 0x967d },{ 0x9634, 0x9670 },
+ { 0x9635, 0x9663 },{ 0x9636, 0x968e },{ 0x9645, 0x969b },{ 0x9646, 0x9678 },
+ { 0x9647, 0x96b4 },{ 0x9648, 0x9673 },{ 0x9649, 0x9658 },{ 0x9655, 0x965d },
+ { 0x9667, 0x9689 },{ 0x9668, 0x9695 },{ 0x9669, 0x96aa },{ 0x968f, 0x96a8 },
+ { 0x9690, 0x96b1 },{ 0x96b6, 0x96b8 },{ 0x96bd, 0x96cb },{ 0x96be, 0x96e3 },
+ { 0x96cf, 0x96db },{ 0x96e0, 0x8b8e },{ 0x96f3, 0x9742 },{ 0x96fe, 0x9727 },
+ { 0x9701, 0x973d },{ 0x972d, 0x9744 },{ 0x9753, 0x975a },{ 0x9759, 0x975c },
+ { 0x9765, 0x9768 },{ 0x9791, 0x97c3 },{ 0x9792, 0x6a47 },{ 0x97af, 0x97c9 },
+ { 0x97e6, 0x97cb },{ 0x97e7, 0x97cc },{ 0x97e9, 0x97d3 },{ 0x97ea, 0x97d9 },
+ { 0x97eb, 0x97de },{ 0x97ec, 0x97dc },{ 0x97f5, 0x97fb },{ 0x9875, 0x9801 },
+ { 0x9876, 0x9802 },{ 0x9877, 0x9803 },{ 0x9878, 0x9807 },{ 0x9879, 0x9805 },
+ { 0x987a, 0x9806 },{ 0x987b, 0x9808 },{ 0x987c, 0x980a },{ 0x987d, 0x9811 },
+ { 0x987e, 0x9867 },{ 0x987f, 0x9813 },{ 0x9880, 0x980e },{ 0x9881, 0x9812 },
+ { 0x9882, 0x980c },{ 0x9883, 0x980f },{ 0x9884, 0x9810 },{ 0x9885, 0x9871 },
+ { 0x9886, 0x9818 },{ 0x9887, 0x9817 },{ 0x9888, 0x9838 },{ 0x9889, 0x9821 },
+ { 0x988a, 0x9830 },{ 0x988c, 0x981c },{ 0x988d, 0x6f41 },{ 0x988f, 0x9826 },
+ { 0x9890, 0x9824 },{ 0x9891, 0x983b },{ 0x9893, 0x9839 },{ 0x9894, 0x9837 },
+ { 0x9896, 0x7a4e },{ 0x9897, 0x9846 },{ 0x9898, 0x984c },{ 0x989a, 0x984e },
+ { 0x989b, 0x9853 },{ 0x989c, 0x984f },{ 0x989d, 0x984d },{ 0x989e, 0x9873 },
+ { 0x989f, 0x9862 },{ 0x98a0, 0x985b },{ 0x98a1, 0x9859 },{ 0x98a2, 0x9865 },
+ { 0x98a4, 0x986b },{ 0x98a6, 0x9870 },{ 0x98a7, 0x9874 },{ 0x98ce, 0x98a8 },
+ { 0x98d1, 0x98ae },{ 0x98d2, 0x98af },{ 0x98d3, 0x98b6 },{ 0x98d5, 0x98bc },
+ { 0x98d8, 0x98c4 },{ 0x98d9, 0x98c6 },{ 0x98de, 0x98db },{ 0x98e8, 0x9957 },
+ { 0x990d, 0x995c },{ 0x9963, 0x98df },{ 0x9965, 0x98e2 },{ 0x9967, 0x9933 },
+ { 0x9968, 0x98e9 },{ 0x9969, 0x993c },{ 0x996a, 0x98ea },{ 0x996b, 0x98eb },
+ { 0x996c, 0x98ed },{ 0x996d, 0x98ef },{ 0x996e, 0x98f2 },{ 0x996f, 0x991e },
+ { 0x9970, 0x98fe },{ 0x9971, 0x98fd },{ 0x9972, 0x98fc },{ 0x9974, 0x98f4 },
+ { 0x9975, 0x990c },{ 0x9976, 0x9952 },{ 0x9977, 0x9909 },{ 0x997a, 0x9903 },
+ { 0x997c, 0x9905 },{ 0x997d, 0x9911 },{ 0x997f, 0x9913 },{ 0x9980, 0x9918 },
+ { 0x9981, 0x9912 },{ 0x9984, 0x991b },{ 0x9985, 0x9921 },{ 0x9986, 0x9928 },
+ { 0x9988, 0x994b },{ 0x998a, 0x993f },{ 0x998b, 0x995e },{ 0x998d, 0x7ce2 },
+ { 0x998f, 0x993e },{ 0x9990, 0x9948 },{ 0x9991, 0x9949 },{ 0x9992, 0x9945 },
+ { 0x9994, 0x994c },{ 0x9a6c, 0x99ac },{ 0x9a6d, 0x99ad },{ 0x9a6e, 0x99b1 },
+ { 0x9a6f, 0x99b4 },{ 0x9a70, 0x99b3 },{ 0x9a71, 0x9a45 },{ 0x9a73, 0x99c1 },
+ { 0x9a74, 0x9a62 },{ 0x9a75, 0x99d4 },{ 0x9a76, 0x99db },{ 0x9a77, 0x99df },
+ { 0x9a78, 0x99d9 },{ 0x9a79, 0x99d2 },{ 0x9a7a, 0x9a36 },{ 0x9a7b, 0x99d0 },
+ { 0x9a7c, 0x99dd },{ 0x9a7d, 0x99d1 },{ 0x9a7e, 0x99d5 },{ 0x9a7f, 0x9a5b },
+ { 0x9a80, 0x99d8 },{ 0x9a81, 0x9a4d },{ 0x9a82, 0x7f75 },{ 0x9a84, 0x9a55 },
+ { 0x9a85, 0x9a4a },{ 0x9a86, 0x99f1 },{ 0x9a87, 0x99ed },{ 0x9a88, 0x99e2 },
+ { 0x9a8a, 0x9a6a },{ 0x9a8b, 0x9a01 },{ 0x9a8c, 0x9a57 },{ 0x9a8f, 0x99ff },
+ { 0x9a90, 0x9a0f },{ 0x9a91, 0x9a0e },{ 0x9a92, 0x9a0d },{ 0x9a93, 0x9a05 },
+ { 0x9a96, 0x9a42 },{ 0x9a97, 0x9a19 },{ 0x9a98, 0x9a2d },{ 0x9a9a, 0x9a37 },
+ { 0x9a9b, 0x9a16 },{ 0x9a9c, 0x9a41 },{ 0x9a9d, 0x9a2e },{ 0x9a9e, 0x9a2b },
+ { 0x9a9f, 0x9a38 },{ 0x9aa0, 0x9a43 },{ 0x9aa1, 0x9a3e },{ 0x9aa2, 0x9a44 },
+ { 0x9aa3, 0x9a4f },{ 0x9aa4, 0x9a5f },{ 0x9aa5, 0x9a65 },{ 0x9aa7, 0x9a64 },
+ { 0x9ac5, 0x9acf },{ 0x9acb, 0x9ad6 },{ 0x9acc, 0x9ad5 },{ 0x9b13, 0x9b22 },
+ { 0x9b47, 0x9b58 },{ 0x9b49, 0x9b4e },{ 0x9c7c, 0x9b5a },{ 0x9c7f, 0x9b77 },
+ { 0x9c81, 0x9b6f },{ 0x9c82, 0x9b74 },{ 0x9c87, 0x9bf0 },{ 0x9c88, 0x9c78 },
+ { 0x9c8b, 0x9b92 },{ 0x9c8d, 0x9b91 },{ 0x9c8e, 0x9c5f },{ 0x9c90, 0x9b90 },
+ { 0x9c91, 0x9bad },{ 0x9c92, 0x9b9a },{ 0x9c94, 0x9baa },{ 0x9c95, 0x9b9e },
+ { 0x9c9a, 0x9c6d },{ 0x9c9b, 0x9bab },{ 0x9c9c, 0x9bae },{ 0x9c9e, 0x9bd7 },
+ { 0x9c9f, 0x9c58 },{ 0x9ca0, 0x9bc1 },{ 0x9ca1, 0x9c7a },{ 0x9ca2, 0x9c31 },
+ { 0x9ca3, 0x9c39 },{ 0x9ca4, 0x9bc9 },{ 0x9ca5, 0x9c23 },{ 0x9ca6, 0x9c37 },
+ { 0x9ca7, 0x9bc0 },{ 0x9ca8, 0x9bca },{ 0x9ca9, 0x9bc7 },{ 0x9cab, 0x9bfd },
+ { 0x9cad, 0x9bd6 },{ 0x9cae, 0x9bea },{ 0x9cb0, 0x9beb },{ 0x9cb1, 0x9be1 },
+ { 0x9cb2, 0x9be4 },{ 0x9cb3, 0x9be7 },{ 0x9cb5, 0x9be2 },{ 0x9cb6, 0x9bf0 },
+ { 0x9cb7, 0x9bdb },{ 0x9cb8, 0x9be8 },{ 0x9cbb, 0x9bd4 },{ 0x9cbd, 0x9c08 },
+ { 0x9cc3, 0x9c13 },{ 0x9cc4, 0x9c77 },{ 0x9cc5, 0x9c0d },{ 0x9cc6, 0x9c12 },
+ { 0x9cc7, 0x9c09 },{ 0x9ccc, 0x9c32 },{ 0x9ccd, 0x9c2d },{ 0x9cce, 0x9c28 },
+ { 0x9ccf, 0x9c25 },{ 0x9cd0, 0x9c29 },{ 0x9cd3, 0x9c33 },{ 0x9cd4, 0x9c3e },
+ { 0x9cd5, 0x9c48 },{ 0x9cd6, 0x9c49 },{ 0x9cd7, 0x9c3b },{ 0x9cdc, 0x9c56 },
+ { 0x9cdd, 0x9c54 },{ 0x9cde, 0x9c57 },{ 0x9cdf, 0x9c52 },{ 0x9ce2, 0x9c67 },
+ { 0x9e1f, 0x9ce5 },{ 0x9e20, 0x9ce9 },{ 0x9e21, 0x96de },{ 0x9e22, 0x9cf6 },
+ { 0x9e23, 0x9cf4 },{ 0x9e25, 0x9dd7 },{ 0x9e26, 0x9d09 },{ 0x9e28, 0x9d07 },
+ { 0x9e29, 0x9d06 },{ 0x9e2a, 0x9d23 },{ 0x9e2b, 0x9d87 },{ 0x9e2c, 0x9e15 },
+ { 0x9e2d, 0x9d28 },{ 0x9e2f, 0x9d26 },{ 0x9e31, 0x9d1f },{ 0x9e32, 0x9d1d },
+ { 0x9e33, 0x9d1b },{ 0x9e35, 0x9d15 },{ 0x9e36, 0x9de5 },{ 0x9e37, 0x9dd9 },
+ { 0x9e38, 0x9d2f },{ 0x9e39, 0x9d30 },{ 0x9e3a, 0x9d42 },{ 0x9e3d, 0x9d3f },
+ { 0x9e3e, 0x9e1e },{ 0x9e3f, 0x9d3b },{ 0x9e41, 0x9d53 },{ 0x9e42, 0x9e1d },
+ { 0x9e43, 0x9d51 },{ 0x9e44, 0x9d60 },{ 0x9e45, 0x9d5d },{ 0x9e46, 0x9d52 },
+ { 0x9e47, 0x9df4 },{ 0x9e48, 0x9d5c },{ 0x9e49, 0x9d61 },{ 0x9e4a, 0x9d72 },
+ { 0x9e4c, 0x9d6a },{ 0x9e4e, 0x9d6f },{ 0x9e4f, 0x9d6c },{ 0x9e51, 0x9d89 },
+ { 0x9e55, 0x9d98 },{ 0x9e57, 0x9d9a },{ 0x9e58, 0x9dbb },{ 0x9e5a, 0x9dbf },
+ { 0x9e5c, 0x9da9 },{ 0x9e5e, 0x9dc2 },{ 0x9e63, 0x9dbc },{ 0x9e64, 0x9db4 },
+ { 0x9e66, 0x9e1a },{ 0x9e67, 0x9dd3 },{ 0x9e68, 0x9dda },{ 0x9e69, 0x9def },
+ { 0x9e6a, 0x9de6 },{ 0x9e6b, 0x9df2 },{ 0x9e6c, 0x9df8 },{ 0x9e6d, 0x9dfa },
+ { 0x9e70, 0x9df9 },{ 0x9e73, 0x9e1b },{ 0x9e7e, 0x9e7a },{ 0x9ea6, 0x9ea5 },
+ { 0x9eb8, 0x9ea9 },{ 0x9ebd, 0x9ebc },{ 0x9ec4, 0x9ec3 },{ 0x9ec9, 0x9ecc },
+ { 0x9ee9, 0x9ef7 },{ 0x9eea, 0x9ef2 },{ 0x9efe, 0x9efd },{ 0x9f0b, 0x9eff },
+ { 0x9f0d, 0x9f09 },{ 0x9f39, 0x9f34 },{ 0x9f50, 0x9f4a },{ 0x9f51, 0x9f4f },
+ { 0x9f7f, 0x9f52 },{ 0x9f80, 0x9f54 },{ 0x9f83, 0x9f5f },{ 0x9f84, 0x9f61 },
+ { 0x9f85, 0x9f59 },{ 0x9f86, 0x9f60 },{ 0x9f87, 0x9f5c },{ 0x9f88, 0x9f66 },
+ { 0x9f89, 0x9f6c },{ 0x9f8a, 0x9f6a },{ 0x9f8b, 0x9f72 },{ 0x9f8c, 0x9f77 },
+ { 0x9f99, 0x9f8d },{ 0x9f9a, 0x9f94 },{ 0x9f9b, 0x9f95 },{ 0x9f9f, 0x9f9c },
+ { 0xff02, 0x301e },{ 0xff3b, 0xfe5d },{ 0xff3d, 0xfe5e },{ 0xff40, 0x2035 },
+ { 0, 0 }
+};
+
+static UShortPair __tc_to_sc_table [] = {
+ { 0x00af, 0x02c9 },{ 0x00b7, 0x30fb },{ 0x03a0, 0x220f },{ 0x03a3, 0x2211 },
+ { 0x2025, 0x00a8 },{ 0x2027, 0x30fb },{ 0x2035, 0xff40 },{ 0x2225, 0x2016 },
+ { 0x2252, 0x2248 },{ 0x2266, 0x2264 },{ 0x2267, 0x2265 },{ 0x2500, 0x2015 },
+ { 0x2571, 0xff0f },{ 0x2572, 0xff3c },{ 0x2574, 0xff3f },{ 0x301d, 0xff02 },
+ { 0x301e, 0x2033 },{ 0x4e1f, 0x4e22 },{ 0x4e26, 0x5e76 },{ 0x4e3c, 0x4e95 },
+ { 0x4e7e, 0x5e72 },{ 0x4e82, 0x4e71 },{ 0x4e99, 0x4e98 },{ 0x4e9e, 0x4e9a },
+ { 0x4f15, 0x592b },{ 0x4f47, 0x4f2b },{ 0x4f48, 0x5e03 },{ 0x4f54, 0x5360 },
+ { 0x4f6a, 0x5f8a },{ 0x4f75, 0x5e76 },{ 0x4f86, 0x6765 },{ 0x4f96, 0x4ed1 },
+ { 0x4f9a, 0x5f87 },{ 0x4fb6, 0x4fa3 },{ 0x4fb7, 0x5c40 },{ 0x4fc1, 0x4fe3 },
+ { 0x4fc2, 0x7cfb },{ 0x4fe0, 0x4fa0 },{ 0x5000, 0x4f25 },{ 0x5006, 0x4fe9 },
+ { 0x5009, 0x4ed3 },{ 0x500b, 0x4e2a },{ 0x5011, 0x4eec },{ 0x5016, 0x5e78 },
+ { 0x5023, 0x4eff },{ 0x502b, 0x4f26 },{ 0x5049, 0x4f1f },{ 0x506a, 0x903c },
+ { 0x5074, 0x4fa7 },{ 0x5075, 0x4fa6 },{ 0x507a, 0x54b1 },{ 0x507d, 0x4f2a },
+ { 0x5091, 0x6770 },{ 0x5096, 0x4f27 },{ 0x5098, 0x4f1e },{ 0x5099, 0x5907 },
+ { 0x509a, 0x6548 },{ 0x50a2, 0x5bb6 },{ 0x50ad, 0x4f63 },{ 0x50af, 0x506c },
+ { 0x50b3, 0x4f20 },{ 0x50b4, 0x4f1b },{ 0x50b5, 0x503a },{ 0x50b7, 0x4f24 },
+ { 0x50be, 0x503e },{ 0x50c2, 0x507b },{ 0x50c5, 0x4ec5 },{ 0x50c9, 0x4f65 },
+ { 0x50ca, 0x4ed9 },{ 0x50d1, 0x4fa8 },{ 0x50d5, 0x4ec6 },{ 0x50e3, 0x50ed },
+ { 0x50e5, 0x4fa5 },{ 0x50e8, 0x507e },{ 0x50f1, 0x96c7 },{ 0x50f9, 0x4ef7 },
+ { 0x5100, 0x4eea },{ 0x5102, 0x4fac },{ 0x5104, 0x4ebf },{ 0x5105, 0x5f53 },
+ { 0x5108, 0x4fa9 },{ 0x5109, 0x4fed },{ 0x5110, 0x50a7 },{ 0x5114, 0x4fe6 },
+ { 0x5115, 0x4faa },{ 0x5118, 0x5c3d },{ 0x511f, 0x507f },{ 0x512a, 0x4f18 },
+ { 0x5132, 0x50a8 },{ 0x5137, 0x4fea },{ 0x5138, 0x7f57 },{ 0x513a, 0x50a9 },
+ { 0x513b, 0x50a5 },{ 0x513c, 0x4fe8 },{ 0x5147, 0x51f6 },{ 0x514c, 0x5151 },
+ { 0x5152, 0x513f },{ 0x5157, 0x5156 },{ 0x5167, 0x5185 },{ 0x5169, 0x4e24 },
+ { 0x518a, 0x518c },{ 0x5191, 0x80c4 },{ 0x51aa, 0x5e42 },{ 0x51c5, 0x6db8 },
+ { 0x51c8, 0x51c0 },{ 0x51cd, 0x51bb },{ 0x51dc, 0x51db },{ 0x51f1, 0x51ef },
+ { 0x5225, 0x522b },{ 0x522a, 0x5220 },{ 0x5244, 0x522d },{ 0x5247, 0x5219 },
+ { 0x5249, 0x9509 },{ 0x524b, 0x514b },{ 0x524e, 0x5239 },{ 0x525b, 0x521a },
+ { 0x525d, 0x5265 },{ 0x526e, 0x5250 },{ 0x5274, 0x5240 },{ 0x5275, 0x521b },
+ { 0x5277, 0x94f2 },{ 0x5283, 0x5212 },{ 0x5284, 0x672d },{ 0x5287, 0x5267 },
+ { 0x5289, 0x5218 },{ 0x528a, 0x523d },{ 0x528c, 0x523f },{ 0x528d, 0x5251 },
+ { 0x5291, 0x5242 },{ 0x52bb, 0x5321 },{ 0x52c1, 0x52b2 },{ 0x52d5, 0x52a8 },
+ { 0x52d7, 0x52d6 },{ 0x52d9, 0x52a1 },{ 0x52db, 0x52cb },{ 0x52dd, 0x80dc },
+ { 0x52de, 0x52b3 },{ 0x52e2, 0x52bf },{ 0x52e3, 0x7ee9 },{ 0x52e6, 0x527f },
+ { 0x52f1, 0x52a2 },{ 0x52f3, 0x52cb },{ 0x52f5, 0x52b1 },{ 0x52f8, 0x529d },
+ { 0x52fb, 0x5300 },{ 0x530b, 0x9676 },{ 0x532d, 0x5326 },{ 0x532f, 0x6c47 },
+ { 0x5331, 0x532e },{ 0x5340, 0x533a },{ 0x5344, 0x5eff },{ 0x5354, 0x534f },
+ { 0x536c, 0x6602 },{ 0x5379, 0x6064 },{ 0x537b, 0x5374 },{ 0x5399, 0x538d },
+ { 0x53ad, 0x538c },{ 0x53b2, 0x5389 },{ 0x53b4, 0x53a3 },{ 0x53c3, 0x53c2 },
+ { 0x53e1, 0x777f },{ 0x53e2, 0x4e1b },{ 0x540b, 0x5bf8 },{ 0x5433, 0x5434 },
+ { 0x5436, 0x5450 },{ 0x5442, 0x5415 },{ 0x544e, 0x5c3a },{ 0x54b7, 0x5555 },
+ { 0x54bc, 0x5459 },{ 0x54e1, 0x5458 },{ 0x5504, 0x5457 },{ 0x5538, 0x5ff5 },
+ { 0x554f, 0x95ee },{ 0x5557, 0x5556 },{ 0x555e, 0x54d1 },{ 0x555f, 0x542f },
+ { 0x5563, 0x8854 },{ 0x559a, 0x5524 },{ 0x55aa, 0x4e27 },{ 0x55ab, 0x5403 },
+ { 0x55ac, 0x4e54 },{ 0x55ae, 0x5355 },{ 0x55b2, 0x54df },{ 0x55c6, 0x545b },
+ { 0x55c7, 0x556c },{ 0x55ce, 0x5417 },{ 0x55da, 0x545c },{ 0x55e9, 0x5522 },
+ { 0x55f6, 0x54d4 },{ 0x5606, 0x53f9 },{ 0x560d, 0x55bd },{ 0x5614, 0x5455 },
+ { 0x5616, 0x5567 },{ 0x5617, 0x5c1d },{ 0x561c, 0x551b },{ 0x5629, 0x54d7 },
+ { 0x562e, 0x5520 },{ 0x562f, 0x5578 },{ 0x5630, 0x53fd },{ 0x5635, 0x54d3 },
+ { 0x5638, 0x5452 },{ 0x5641, 0x6076 },{ 0x5653, 0x5618 },{ 0x5660, 0x54d2 },
+ { 0x5665, 0x54dd },{ 0x5666, 0x54d5 },{ 0x566f, 0x55f3 },{ 0x5672, 0x54d9 },
+ { 0x5674, 0x55b7 },{ 0x5678, 0x5428 },{ 0x5679, 0x5f53 },{ 0x5680, 0x549b },
+ { 0x5687, 0x5413 },{ 0x568c, 0x54dc },{ 0x5690, 0x5c1d },{ 0x5695, 0x565c },
+ { 0x5699, 0x556e },{ 0x56a5, 0x54bd },{ 0x56a6, 0x5456 },{ 0x56a8, 0x5499 },
+ { 0x56ae, 0x5411 },{ 0x56b3, 0x55be },{ 0x56b4, 0x4e25 },{ 0x56b6, 0x5624 },
+ { 0x56c0, 0x556d },{ 0x56c1, 0x55eb },{ 0x56c2, 0x56a3 },{ 0x56c5, 0x5181 },
+ { 0x56c8, 0x5453 },{ 0x56c9, 0x7f57 },{ 0x56cc, 0x82cf },{ 0x56d1, 0x5631 },
+ { 0x56d3, 0x556e },{ 0x56ea, 0x56f1 },{ 0x5707, 0x56f5 },{ 0x570b, 0x56fd },
+ { 0x570d, 0x56f4 },{ 0x5712, 0x56ed },{ 0x5713, 0x5706 },{ 0x5716, 0x56fe },
+ { 0x5718, 0x56e2 },{ 0x5775, 0x4e18 },{ 0x57dc, 0x91ce },{ 0x57e1, 0x57ad },
+ { 0x57f7, 0x6267 },{ 0x57fc, 0x5d0e },{ 0x5805, 0x575a },{ 0x580a, 0x57a9 },
+ { 0x581d, 0x57da },{ 0x582f, 0x5c27 },{ 0x5831, 0x62a5 },{ 0x5834, 0x573a },
+ { 0x583f, 0x78b1 },{ 0x584a, 0x5757 },{ 0x584b, 0x8314 },{ 0x584f, 0x57b2 },
+ { 0x5852, 0x57d8 },{ 0x5857, 0x6d82 },{ 0x585a, 0x51a2 },{ 0x5862, 0x575e },
+ { 0x5864, 0x57d9 },{ 0x5875, 0x5c18 },{ 0x5879, 0x5811 },{ 0x588a, 0x57ab },
+ { 0x5891, 0x5892 },{ 0x589c, 0x5760 },{ 0x58ab, 0x6a3d },{ 0x58ae, 0x5815 },
+ { 0x58b3, 0x575f },{ 0x58bb, 0x5899 },{ 0x58be, 0x57a6 },{ 0x58c7, 0x575b },
+ { 0x58ce, 0x57d9 },{ 0x58d3, 0x538b },{ 0x58d8, 0x5792 },{ 0x58d9, 0x5739 },
+ { 0x58da, 0x5786 },{ 0x58de, 0x574f },{ 0x58df, 0x5784 },{ 0x58e2, 0x575c },
+ { 0x58e9, 0x575d },{ 0x58ef, 0x58ee },{ 0x58fa, 0x58f6 },{ 0x58fd, 0x5bff },
+ { 0x5920, 0x591f },{ 0x5922, 0x68a6 },{ 0x5925, 0x4f19 },{ 0x593e, 0x5939 },
+ { 0x5950, 0x5942 },{ 0x5967, 0x5965 },{ 0x5969, 0x5941 },{ 0x596a, 0x593a },
+ { 0x596e, 0x594b },{ 0x599d, 0x5986 },{ 0x59b3, 0x4f60 },{ 0x59cd, 0x59d7 },
+ { 0x59e6, 0x5978 },{ 0x59ea, 0x4f84 },{ 0x5a1b, 0x5a31 },{ 0x5a41, 0x5a04 },
+ { 0x5a66, 0x5987 },{ 0x5a6c, 0x6deb },{ 0x5a6d, 0x5a05 },{ 0x5aa7, 0x5a32 },
+ { 0x5aae, 0x5077 },{ 0x5aaf, 0x59ab },{ 0x5abc, 0x5aaa },{ 0x5abd, 0x5988 },
+ { 0x5abf, 0x6127 },{ 0x5acb, 0x8885 },{ 0x5ad7, 0x59aa },{ 0x5af5, 0x59a9 },
+ { 0x5afb, 0x5a34 },{ 0x5b08, 0x5a06 },{ 0x5b0b, 0x5a75 },{ 0x5b0c, 0x5a07 },
+ { 0x5b19, 0x5af1 },{ 0x5b1d, 0x8885 },{ 0x5b21, 0x5ad2 },{ 0x5b24, 0x5b37 },
+ { 0x5b2a, 0x5ad4 },{ 0x5b2d, 0x5976 },{ 0x5b30, 0x5a74 },{ 0x5b38, 0x5a76 },
+ { 0x5b43, 0x5a18 },{ 0x5b4c, 0x5a08 },{ 0x5b6b, 0x5b59 },{ 0x5b78, 0x5b66 },
+ { 0x5b7f, 0x5b6a },{ 0x5bae, 0x5bab },{ 0x5bd8, 0x7f6e },{ 0x5be2, 0x5bdd },
+ { 0x5be6, 0x5b9e },{ 0x5be7, 0x5b81 },{ 0x5be9, 0x5ba1 },{ 0x5beb, 0x5199 },
+ { 0x5bec, 0x5bbd },{ 0x5bf5, 0x5ba0 },{ 0x5bf6, 0x5b9d },{ 0x5c07, 0x5c06 },
+ { 0x5c08, 0x4e13 },{ 0x5c0b, 0x5bfb },{ 0x5c0d, 0x5bf9 },{ 0x5c0e, 0x5bfc },
+ { 0x5c37, 0x5c34 },{ 0x5c46, 0x5c4a },{ 0x5c4d, 0x5c38 },{ 0x5c5c, 0x5c49 },
+ { 0x5c5d, 0x6249 },{ 0x5c62, 0x5c61 },{ 0x5c64, 0x5c42 },{ 0x5c68, 0x5c66 },
+ { 0x5c6c, 0x5c5e },{ 0x5ca1, 0x5188 },{ 0x5cf4, 0x5c98 },{ 0x5cf6, 0x5c9b },
+ { 0x5cfd, 0x5ce1 },{ 0x5d0d, 0x5d03 },{ 0x5d11, 0x6606 },{ 0x5d17, 0x5c97 },
+ { 0x5d19, 0x4ed1 },{ 0x5d20, 0x5cbd },{ 0x5d22, 0x5ce5 },{ 0x5d33, 0x5d5b },
+ { 0x5d50, 0x5c9a },{ 0x5d52, 0x5ca9 },{ 0x5d81, 0x5d5d },{ 0x5d84, 0x5d2d },
+ { 0x5d87, 0x5c96 },{ 0x5d97, 0x5d02 },{ 0x5da0, 0x5ce4 },{ 0x5da7, 0x5cc4 },
+ { 0x5db8, 0x5d58 },{ 0x5dba, 0x5cad },{ 0x5dbc, 0x5c7f },{ 0x5dbd, 0x5cb3 },
+ { 0x5dcb, 0x5cbf },{ 0x5dd2, 0x5ce6 },{ 0x5dd4, 0x5dc5 },{ 0x5dd6, 0x5ca9 },
+ { 0x5df0, 0x5def },{ 0x5df9, 0x537a },{ 0x5e25, 0x5e05 },{ 0x5e2b, 0x5e08 },
+ { 0x5e33, 0x5e10 },{ 0x5e36, 0x5e26 },{ 0x5e40, 0x5e27 },{ 0x5e43, 0x5e0f },
+ { 0x5e57, 0x5e3c },{ 0x5e58, 0x5e3b },{ 0x5e5f, 0x5e1c },{ 0x5e63, 0x5e01 },
+ { 0x5e6b, 0x5e2e },{ 0x5e6c, 0x5e31 },{ 0x5e75, 0x5f00 },{ 0x5e79, 0x5e72 },
+ { 0x5e7e, 0x51e0 },{ 0x5e82, 0x4ec4 },{ 0x5eab, 0x5e93 },{ 0x5ec1, 0x5395 },
+ { 0x5ec2, 0x53a2 },{ 0x5ec4, 0x53a9 },{ 0x5ec8, 0x53a6 },{ 0x5eda, 0x53a8 },
+ { 0x5edd, 0x53ae },{ 0x5edf, 0x5e99 },{ 0x5ee0, 0x5382 },{ 0x5ee1, 0x5e91 },
+ { 0x5ee2, 0x5e9f },{ 0x5ee3, 0x5e7f },{ 0x5ee9, 0x5eea },{ 0x5eec, 0x5e90 },
+ { 0x5ef1, 0x75c8 },{ 0x5ef3, 0x5385 },{ 0x5f12, 0x5f11 },{ 0x5f14, 0x540a },
+ { 0x5f33, 0x5f2a },{ 0x5f35, 0x5f20 },{ 0x5f37, 0x5f3a },{ 0x5f46, 0x522b },
+ { 0x5f48, 0x5f39 },{ 0x5f4a, 0x5f3a },{ 0x5f4c, 0x5f25 },{ 0x5f4e, 0x5f2f },
+ { 0x5f59, 0x6c47 },{ 0x5f65, 0x5f66 },{ 0x5f6b, 0x96d5 },{ 0x5f7f, 0x4f5b },
+ { 0x5f8c, 0x540e },{ 0x5f91, 0x5f84 },{ 0x5f9e, 0x4ece },{ 0x5fa0, 0x5f95 },
+ { 0x5fa9, 0x590d },{ 0x5fac, 0x65c1 },{ 0x5fb9, 0x5f7b },{ 0x6046, 0x6052 },
+ { 0x6065, 0x803b },{ 0x6085, 0x60a6 },{ 0x60b5, 0x6005 },{ 0x60b6, 0x95f7 },
+ { 0x60bd, 0x51c4 },{ 0x60c7, 0x6566 },{ 0x60e1, 0x6076 },{ 0x60f1, 0x607c },
+ { 0x60f2, 0x607d },{ 0x60f7, 0x8822 },{ 0x60fb, 0x607b },{ 0x611b, 0x7231 },
+ { 0x611c, 0x60ec },{ 0x6128, 0x60ab },{ 0x6134, 0x6006 },{ 0x6137, 0x607a },
+ { 0x613e, 0x5ffe },{ 0x6144, 0x6817 },{ 0x6147, 0x6bb7 },{ 0x614b, 0x6001 },
+ { 0x614d, 0x6120 },{ 0x6158, 0x60e8 },{ 0x615a, 0x60ed },{ 0x615f, 0x6078 },
+ { 0x6163, 0x60ef },{ 0x616a, 0x6004 },{ 0x616b, 0x6002 },{ 0x616e, 0x8651 },
+ { 0x6173, 0x60ad },{ 0x6176, 0x5e86 },{ 0x617c, 0x621a },{ 0x617e, 0x6b32 },
+ { 0x6182, 0x5fe7 },{ 0x618a, 0x60eb },{ 0x6190, 0x601c },{ 0x6191, 0x51ed },
+ { 0x6192, 0x6126 },{ 0x619a, 0x60ee },{ 0x61a4, 0x6124 },{ 0x61ab, 0x60af },
+ { 0x61ae, 0x6003 },{ 0x61b2, 0x5baa },{ 0x61b6, 0x5fc6 },{ 0x61c3, 0x52e4 },
+ { 0x61c7, 0x6073 },{ 0x61c9, 0x5e94 },{ 0x61cc, 0x603f },{ 0x61cd, 0x61d4 },
+ { 0x61de, 0x8499 },{ 0x61df, 0x603c },{ 0x61e3, 0x61d1 },{ 0x61e8, 0x6079 },
+ { 0x61f2, 0x60e9 },{ 0x61f6, 0x61d2 },{ 0x61f7, 0x6000 },{ 0x61f8, 0x60ac },
+ { 0x61fa, 0x5fcf },{ 0x61fc, 0x60e7 },{ 0x61fe, 0x6151 },{ 0x6200, 0x604b },
+ { 0x6207, 0x6206 },{ 0x6209, 0x94ba },{ 0x6214, 0x620b },{ 0x6227, 0x6217 },
+ { 0x6229, 0x622c },{ 0x6230, 0x6218 },{ 0x6232, 0x620f },{ 0x6236, 0x6237 },
+ { 0x6250, 0x4ec2 },{ 0x625e, 0x634d },{ 0x6271, 0x63d2 },{ 0x627a, 0x62b5 },
+ { 0x6283, 0x62da },{ 0x6294, 0x62b1 },{ 0x62b4, 0x66f3 },{ 0x62cb, 0x629b },
+ { 0x62d1, 0x94b3 },{ 0x630c, 0x683c },{ 0x6336, 0x5c40 },{ 0x633e, 0x631f },
+ { 0x6368, 0x820d },{ 0x636b, 0x626a },{ 0x6372, 0x5377 },{ 0x6383, 0x626b },
+ { 0x6384, 0x62a1 },{ 0x6399, 0x6323 },{ 0x639b, 0x6302 },{ 0x63a1, 0x91c7 },
+ { 0x63c0, 0x62e3 },{ 0x63da, 0x626c },{ 0x63db, 0x6362 },{ 0x63ee, 0x6325 },
+ { 0x63f9, 0x80cc },{ 0x6406, 0x6784 },{ 0x640d, 0x635f },{ 0x6416, 0x6447 },
+ { 0x6417, 0x6363 },{ 0x641f, 0x64c0 },{ 0x6425, 0x6376 },{ 0x6428, 0x6253 },
+ { 0x642f, 0x638f },{ 0x6436, 0x62a2 },{ 0x643e, 0x69a8 },{ 0x6440, 0x6342 },
+ { 0x6443, 0x625b },{ 0x6451, 0x63b4 },{ 0x645c, 0x63bc },{ 0x645f, 0x6402 },
+ { 0x646f, 0x631a },{ 0x6473, 0x62a0 },{ 0x6476, 0x629f },{ 0x647b, 0x63ba },
+ { 0x6488, 0x635e },{ 0x6490, 0x6491 },{ 0x6493, 0x6320 },{ 0x649a, 0x637b },
+ { 0x649f, 0x6322 },{ 0x64a2, 0x63b8 },{ 0x64a3, 0x63b8 },{ 0x64a5, 0x62e8 },
+ { 0x64a6, 0x626f },{ 0x64ab, 0x629a },{ 0x64b2, 0x6251 },{ 0x64b3, 0x63ff },
+ { 0x64bb, 0x631e },{ 0x64be, 0x631d },{ 0x64bf, 0x6361 },{ 0x64c1, 0x62e5 },
+ { 0x64c4, 0x63b3 },{ 0x64c7, 0x62e9 },{ 0x64ca, 0x51fb },{ 0x64cb, 0x6321 },
+ { 0x64d4, 0x62c5 },{ 0x64da, 0x636e },{ 0x64e0, 0x6324 },{ 0x64e3, 0x6363 },
+ { 0x64ec, 0x62df },{ 0x64ef, 0x6448 },{ 0x64f0, 0x62e7 },{ 0x64f1, 0x6401 },
+ { 0x64f2, 0x63b7 },{ 0x64f4, 0x6269 },{ 0x64f7, 0x64b7 },{ 0x64fa, 0x6446 },
+ { 0x64fb, 0x64de },{ 0x64fc, 0x64b8 },{ 0x64fe, 0x6270 },{ 0x6504, 0x6445 },
+ { 0x6506, 0x64b5 },{ 0x650f, 0x62e2 },{ 0x6514, 0x62e6 },{ 0x6516, 0x6484 },
+ { 0x6519, 0x6400 },{ 0x651b, 0x64ba },{ 0x651c, 0x643a },{ 0x651d, 0x6444 },
+ { 0x6522, 0x6512 },{ 0x6523, 0x631b },{ 0x6524, 0x644a },{ 0x652a, 0x6405 },
+ { 0x652c, 0x63fd },{ 0x6537, 0x8003 },{ 0x6557, 0x8d25 },{ 0x6558, 0x53d9 },
+ { 0x6575, 0x654c },{ 0x6578, 0x6570 },{ 0x6582, 0x655b },{ 0x6583, 0x6bd9 },
+ { 0x6595, 0x6593 },{ 0x65ac, 0x65a9 },{ 0x65b7, 0x65ad },{ 0x65c2, 0x65d7 },
+ { 0x65db, 0x5e61 },{ 0x6607, 0x5347 },{ 0x6642, 0x65f6 },{ 0x6649, 0x664b },
+ { 0x665d, 0x663c },{ 0x665e, 0x66e6 },{ 0x6662, 0x6670 },{ 0x667b, 0x6697 },
+ { 0x6688, 0x6655 },{ 0x6689, 0x6656 },{ 0x6698, 0x9633 },{ 0x66a2, 0x7545 },
+ { 0x66ab, 0x6682 },{ 0x66b1, 0x6635 },{ 0x66b8, 0x4e86 },{ 0x66c4, 0x6654 },
+ { 0x66c6, 0x5386 },{ 0x66c7, 0x6619 },{ 0x66c9, 0x6653 },{ 0x66cf, 0x5411 },
+ { 0x66d6, 0x66a7 },{ 0x66e0, 0x65f7 },{ 0x66ec, 0x6652 },{ 0x66f8, 0x4e66 },
+ { 0x6703, 0x4f1a },{ 0x6722, 0x671b },{ 0x6727, 0x80e7 },{ 0x672e, 0x672f },
+ { 0x6747, 0x572c },{ 0x6771, 0x4e1c },{ 0x67b4, 0x62d0 },{ 0x67f5, 0x6805 },
+ { 0x67fa, 0x62d0 },{ 0x6812, 0x65ec },{ 0x686e, 0x676f },{ 0x687f, 0x6746 },
+ { 0x6894, 0x6800 },{ 0x689d, 0x6761 },{ 0x689f, 0x67ad },{ 0x68b1, 0x6346 },
+ { 0x68c4, 0x5f03 },{ 0x68d6, 0x67a8 },{ 0x68d7, 0x67a3 },{ 0x68df, 0x680b },
+ { 0x68e7, 0x6808 },{ 0x68f2, 0x6816 },{ 0x690f, 0x6860 },{ 0x6944, 0x533e },
+ { 0x694a, 0x6768 },{ 0x6953, 0x67ab },{ 0x6959, 0x8302 },{ 0x695c, 0x80e1 },
+ { 0x6968, 0x6862 },{ 0x696d, 0x4e1a },{ 0x6975, 0x6781 },{ 0x69a6, 0x5e72 },
+ { 0x69aa, 0x6769 },{ 0x69ae, 0x8363 },{ 0x69bf, 0x6864 },{ 0x69c3, 0x76d8 },
+ { 0x69cb, 0x6784 },{ 0x69cd, 0x67aa },{ 0x69d3, 0x6760 },{ 0x69e7, 0x6920 },
+ { 0x69e8, 0x6901 },{ 0x69f3, 0x6868 },{ 0x6a01, 0x6869 },{ 0x6a02, 0x4e50 },
+ { 0x6a05, 0x679e },{ 0x6a11, 0x6881 },{ 0x6a13, 0x697c },{ 0x6a19, 0x6807 },
+ { 0x6a1e, 0x67a2 },{ 0x6a23, 0x6837 },{ 0x6a38, 0x6734 },{ 0x6a39, 0x6811 },
+ { 0x6a3a, 0x6866 },{ 0x6a48, 0x6861 },{ 0x6a4b, 0x6865 },{ 0x6a5f, 0x673a },
+ { 0x6a62, 0x692d },{ 0x6a66, 0x5e62 },{ 0x6a6b, 0x6a2a },{ 0x6a81, 0x6aa9 },
+ { 0x6a89, 0x67fd },{ 0x6a94, 0x6863 },{ 0x6a9c, 0x6867 },{ 0x6aa2, 0x68c0 },
+ { 0x6aa3, 0x6a2f },{ 0x6aaf, 0x53f0 },{ 0x6ab3, 0x69df },{ 0x6ab8, 0x67e0 },
+ { 0x6abb, 0x69db },{ 0x6ac2, 0x68f9 },{ 0x6ac3, 0x67dc },{ 0x6ad0, 0x7d2f },
+ { 0x6ad3, 0x6a79 },{ 0x6ada, 0x6988 },{ 0x6adb, 0x6809 },{ 0x6add, 0x691f },
+ { 0x6ade, 0x6a7c },{ 0x6adf, 0x680e },{ 0x6ae5, 0x6a71 },{ 0x6ae7, 0x69e0 },
+ { 0x6ae8, 0x680c },{ 0x6aea, 0x67a5 },{ 0x6aeb, 0x6a65 },{ 0x6aec, 0x6987 },
+ { 0x6af3, 0x680a },{ 0x6af8, 0x6989 },{ 0x6afa, 0x68c2 },{ 0x6afb, 0x6a31 },
+ { 0x6b04, 0x680f },{ 0x6b0a, 0x6743 },{ 0x6b0f, 0x6924 },{ 0x6b12, 0x683e },
+ { 0x6b16, 0x6984 },{ 0x6b1e, 0x68c2 },{ 0x6b38, 0x5509 },{ 0x6b3d, 0x94a6 },
+ { 0x6b4e, 0x53f9 },{ 0x6b50, 0x6b27 },{ 0x6b5f, 0x6b24 },{ 0x6b61, 0x6b22 },
+ { 0x6b72, 0x5c81 },{ 0x6b77, 0x5386 },{ 0x6b78, 0x5f52 },{ 0x6b7f, 0x6b81 },
+ { 0x6b80, 0x592d },{ 0x6b98, 0x6b8b },{ 0x6b9e, 0x6b92 },{ 0x6ba4, 0x6b87 },
+ { 0x6bab, 0x6b9a },{ 0x6bad, 0x50f5 },{ 0x6bae, 0x6b93 },{ 0x6baf, 0x6ba1 },
+ { 0x6bb2, 0x6b7c },{ 0x6bba, 0x6740 },{ 0x6bbc, 0x58f3 },{ 0x6bbd, 0x80b4 },
+ { 0x6bc0, 0x6bc1 },{ 0x6bc6, 0x6bb4 },{ 0x6bcc, 0x6bcb },{ 0x6bd8, 0x6bd7 },
+ { 0x6bec, 0x7403 },{ 0x6bff, 0x6bf5 },{ 0x6c08, 0x6be1 },{ 0x6c0c, 0x6c07 },
+ { 0x6c23, 0x6c14 },{ 0x6c2b, 0x6c22 },{ 0x6c2c, 0x6c29 },{ 0x6c33, 0x6c32 },
+ { 0x6c3e, 0x6cdb },{ 0x6c46, 0x6c3d },{ 0x6c4d, 0x4e38 },{ 0x6c4e, 0x6cdb },
+ { 0x6c59, 0x6c61 },{ 0x6c7a, 0x51b3 },{ 0x6c8d, 0x51b1 },{ 0x6c92, 0x6ca1 },
+ { 0x6c96, 0x51b2 },{ 0x6cc1, 0x51b5 },{ 0x6cdd, 0x6eaf },{ 0x6d1f, 0x6d95 },
+ { 0x6d29, 0x6cc4 },{ 0x6d36, 0x6c79 },{ 0x6d6c, 0x91cc },{ 0x6d79, 0x6d43 },
+ { 0x6d87, 0x6cfe },{ 0x6dbc, 0x51c9 },{ 0x6dd2, 0x51c4 },{ 0x6dda, 0x6cea },
+ { 0x6de5, 0x6e0c },{ 0x6de8, 0x51c0 },{ 0x6dea, 0x6ca6 },{ 0x6df5, 0x6e0a },
+ { 0x6df6, 0x6d9e },{ 0x6dfa, 0x6d45 },{ 0x6e19, 0x6da3 },{ 0x6e1b, 0x51cf },
+ { 0x6e26, 0x6da1 },{ 0x6e2c, 0x6d4b },{ 0x6e3e, 0x6d51 },{ 0x6e4a, 0x51d1 },
+ { 0x6e5e, 0x6d48 },{ 0x6e63, 0x95f5 },{ 0x6e67, 0x6d8c },{ 0x6e6f, 0x6c64 },
+ { 0x6e88, 0x6ca9 },{ 0x6e96, 0x51c6 },{ 0x6e9d, 0x6c9f },{ 0x6eab, 0x6e29 },
+ { 0x6ebc, 0x6e7f },{ 0x6ec4, 0x6ca7 },{ 0x6ec5, 0x706d },{ 0x6ecc, 0x6da4 },
+ { 0x6ece, 0x8365 },{ 0x6eec, 0x6caa },{ 0x6eef, 0x6ede },{ 0x6ef2, 0x6e17 },
+ { 0x6ef7, 0x5364 },{ 0x6ef8, 0x6d52 },{ 0x6efe, 0x6eda },{ 0x6eff, 0x6ee1 },
+ { 0x6f01, 0x6e14 },{ 0x6f1a, 0x6ca4 },{ 0x6f22, 0x6c49 },{ 0x6f23, 0x6d9f },
+ { 0x6f2c, 0x6e0d },{ 0x6f32, 0x6da8 },{ 0x6f35, 0x6e86 },{ 0x6f38, 0x6e10 },
+ { 0x6f3f, 0x6d46 },{ 0x6f41, 0x988d },{ 0x6f51, 0x6cfc },{ 0x6f54, 0x6d01 },
+ { 0x6f5b, 0x6f5c },{ 0x6f5f, 0x8204 },{ 0x6f64, 0x6da6 },{ 0x6f6f, 0x6d54 },
+ { 0x6f70, 0x6e83 },{ 0x6f77, 0x6ed7 },{ 0x6f7f, 0x6da0 },{ 0x6f80, 0x6da9 },
+ { 0x6f82, 0x6f84 },{ 0x6f86, 0x6d47 },{ 0x6f87, 0x6d9d },{ 0x6f94, 0x6d69 },
+ { 0x6f97, 0x6da7 },{ 0x6fa0, 0x6e11 },{ 0x6fa4, 0x6cfd },{ 0x6fa9, 0x6cf6 },
+ { 0x6fae, 0x6d4d },{ 0x6fb1, 0x6dc0 },{ 0x6fc1, 0x6d4a },{ 0x6fc3, 0x6d53 },
+ { 0x6fd5, 0x6e7f },{ 0x6fd8, 0x6cde },{ 0x6fdb, 0x8499 },{ 0x6fdf, 0x6d4e },
+ { 0x6fe4, 0x6d9b },{ 0x6feb, 0x6ee5 },{ 0x6fec, 0x6d5a },{ 0x6ff0, 0x6f4d },
+ { 0x6ff1, 0x6ee8 },{ 0x6ffa, 0x6e85 },{ 0x6ffc, 0x6cfa },{ 0x6ffe, 0x6ee4 },
+ { 0x7001, 0x6f3e },{ 0x7005, 0x6ee2 },{ 0x7006, 0x6e0e },{ 0x7009, 0x6cfb },
+ { 0x700b, 0x6c88 },{ 0x700f, 0x6d4f },{ 0x7015, 0x6fd2 },{ 0x7018, 0x6cf8 },
+ { 0x701d, 0x6ca5 },{ 0x701f, 0x6f47 },{ 0x7020, 0x6f46 },{ 0x7026, 0x6f74 },
+ { 0x7027, 0x6cf7 },{ 0x7028, 0x6fd1 },{ 0x7030, 0x5f25 },{ 0x7032, 0x6f4b },
+ { 0x703e, 0x6f9c },{ 0x7043, 0x6ca3 },{ 0x7044, 0x6ee0 },{ 0x7051, 0x6d12 },
+ { 0x7055, 0x6f13 },{ 0x7058, 0x6ee9 },{ 0x705d, 0x704f },{ 0x7063, 0x6e7e },
+ { 0x7064, 0x6ee6 },{ 0x7069, 0x6edf },{ 0x707d, 0x707e },{ 0x70a4, 0x7167 },
+ { 0x70b0, 0x70ae },{ 0x70ba, 0x4e3a },{ 0x70cf, 0x4e4c },{ 0x70f4, 0x70c3 },
+ { 0x7121, 0x65e0 },{ 0x7149, 0x70bc },{ 0x7152, 0x709c },{ 0x7156, 0x6696 },
+ { 0x7159, 0x70df },{ 0x7162, 0x8315 },{ 0x7165, 0x7115 },{ 0x7169, 0x70e6 },
+ { 0x716c, 0x7080 },{ 0x7192, 0x8367 },{ 0x7197, 0x709d },{ 0x71b1, 0x70ed },
+ { 0x71be, 0x70bd },{ 0x71c1, 0x70e8 },{ 0x71c4, 0x7130 },{ 0x71c8, 0x706f },
+ { 0x71c9, 0x7096 },{ 0x71d0, 0x78f7 },{ 0x71d2, 0x70e7 },{ 0x71d9, 0x70eb },
+ { 0x71dc, 0x7116 },{ 0x71df, 0x8425 },{ 0x71e6, 0x707f },{ 0x71ec, 0x6bc1 },
+ { 0x71ed, 0x70db },{ 0x71f4, 0x70e9 },{ 0x71fb, 0x718f },{ 0x71fc, 0x70ec },
+ { 0x71fe, 0x7118 },{ 0x71ff, 0x8000 },{ 0x720d, 0x70c1 },{ 0x7210, 0x7089 },
+ { 0x721b, 0x70c2 },{ 0x722d, 0x4e89 },{ 0x723a, 0x7237 },{ 0x723e, 0x5c14 },
+ { 0x7246, 0x5899 },{ 0x7258, 0x724d },{ 0x7260, 0x5b83 },{ 0x7274, 0x62b5 },
+ { 0x727d, 0x7275 },{ 0x7296, 0x8366 },{ 0x729b, 0x7266 },{ 0x72a2, 0x728a },
+ { 0x72a7, 0x727a },{ 0x72c0, 0x72b6 },{ 0x72da, 0x65e6 },{ 0x72f9, 0x72ed },
+ { 0x72fd, 0x72c8 },{ 0x7319, 0x72f0 },{ 0x7336, 0x72b9 },{ 0x733b, 0x72f2 },
+ { 0x7343, 0x5446 },{ 0x7344, 0x72f1 },{ 0x7345, 0x72ee },{ 0x734e, 0x5956 },
+ { 0x7368, 0x72ec },{ 0x736a, 0x72ef },{ 0x736b, 0x7303 },{ 0x7370, 0x72de },
+ { 0x7372, 0x83b7 },{ 0x7375, 0x730e },{ 0x7377, 0x72b7 },{ 0x7378, 0x517d },
+ { 0x737a, 0x736d },{ 0x737b, 0x732e },{ 0x737c, 0x7315 },{ 0x7380, 0x7321 },
+ { 0x7385, 0x5999 },{ 0x7386, 0x5179 },{ 0x73a8, 0x73cf },{ 0x73ea, 0x572d },
+ { 0x73ee, 0x4f69 },{ 0x73fe, 0x73b0 },{ 0x7431, 0x96d5 },{ 0x743a, 0x73d0 },
+ { 0x743f, 0x73f2 },{ 0x744b, 0x73ae },{ 0x7463, 0x7410 },{ 0x7464, 0x7476 },
+ { 0x7469, 0x83b9 },{ 0x746a, 0x739b },{ 0x746f, 0x7405 },{ 0x7489, 0x740f },
+ { 0x74a3, 0x7391 },{ 0x74a6, 0x7477 },{ 0x74b0, 0x73af },{ 0x74bd, 0x73ba },
+ { 0x74bf, 0x7487 },{ 0x74ca, 0x743c },{ 0x74cf, 0x73d1 },{ 0x74d4, 0x748e },
+ { 0x74d6, 0x9576 },{ 0x74da, 0x74d2 },{ 0x750c, 0x74ef },{ 0x7515, 0x74ee },
+ { 0x7522, 0x4ea7 },{ 0x7526, 0x82cf },{ 0x752a, 0x89d2 },{ 0x752f, 0x5b81 },
+ { 0x755d, 0x4ea9 },{ 0x7562, 0x6bd5 },{ 0x756b, 0x753b },{ 0x756c, 0x7572 },
+ { 0x7570, 0x5f02 },{ 0x7576, 0x5f53 },{ 0x7587, 0x7574 },{ 0x758a, 0x53e0 },
+ { 0x75bf, 0x75f1 },{ 0x75d9, 0x75c9 },{ 0x75e0, 0x9178 },{ 0x75f2, 0x9ebb },
+ { 0x75f3, 0x9ebb },{ 0x75fa, 0x75f9 },{ 0x75fe, 0x75b4 },{ 0x7609, 0x6108 },
+ { 0x760b, 0x75af },{ 0x760d, 0x75a1 },{ 0x7613, 0x75ea },{ 0x761e, 0x7617 },
+ { 0x7621, 0x75ae },{ 0x7627, 0x759f },{ 0x763a, 0x7618 },{ 0x7642, 0x7597 },
+ { 0x7646, 0x75e8 },{ 0x7647, 0x75eb },{ 0x7649, 0x7605 },{ 0x7652, 0x6108 },
+ { 0x7658, 0x75a0 },{ 0x765f, 0x762a },{ 0x7661, 0x75f4 },{ 0x7662, 0x75d2 },
+ { 0x7664, 0x7596 },{ 0x7665, 0x75c7 },{ 0x7669, 0x765e },{ 0x766c, 0x7663 },
+ { 0x766d, 0x763f },{ 0x766e, 0x763e },{ 0x7670, 0x75c8 },{ 0x7671, 0x762b },
+ { 0x7672, 0x766b },{ 0x767c, 0x53d1 },{ 0x7681, 0x7682 },{ 0x769a, 0x7691 },
+ { 0x76b0, 0x75b1 },{ 0x76b8, 0x76b2 },{ 0x76ba, 0x76b1 },{ 0x76c3, 0x676f },
+ { 0x76dc, 0x76d7 },{ 0x76de, 0x76cf },{ 0x76e1, 0x5c3d },{ 0x76e3, 0x76d1 },
+ { 0x76e4, 0x76d8 },{ 0x76e7, 0x5362 },{ 0x76ea, 0x8361 },{ 0x7725, 0x7726 },
+ { 0x773e, 0x4f17 },{ 0x774f, 0x56f0 },{ 0x775c, 0x7741 },{ 0x775e, 0x7750 },
+ { 0x776a, 0x777e },{ 0x7787, 0x772f },{ 0x779e, 0x7792 },{ 0x77ad, 0x4e86 },
+ { 0x77bc, 0x7751 },{ 0x77c7, 0x8499 },{ 0x77d3, 0x80e7 },{ 0x77da, 0x77a9 },
+ { 0x77ef, 0x77eb },{ 0x7832, 0x70ae },{ 0x7843, 0x6731 },{ 0x7864, 0x7856 },
+ { 0x7868, 0x7817 },{ 0x786f, 0x781a },{ 0x7881, 0x68cb },{ 0x7895, 0x5d0e },
+ { 0x78a9, 0x7855 },{ 0x78aa, 0x7827 },{ 0x78ad, 0x7800 },{ 0x78ba, 0x786e },
+ { 0x78bc, 0x7801 },{ 0x78da, 0x7816 },{ 0x78e3, 0x789c },{ 0x78e7, 0x789b },
+ { 0x78ef, 0x77f6 },{ 0x78fd, 0x7857 },{ 0x790e, 0x7840 },{ 0x7919, 0x788d },
+ { 0x7921, 0x7934 },{ 0x7926, 0x77ff },{ 0x792a, 0x783a },{ 0x792b, 0x783e },
+ { 0x792c, 0x77fe },{ 0x7931, 0x783b },{ 0x7942, 0x4ed6 },{ 0x7945, 0x7946 },
+ { 0x7947, 0x53ea },{ 0x7950, 0x4f51 },{ 0x7955, 0x79d8 },{ 0x797c, 0x88f8 },
+ { 0x797f, 0x7984 },{ 0x798d, 0x7978 },{ 0x798e, 0x796f },{ 0x79a6, 0x5fa1 },
+ { 0x79aa, 0x7985 },{ 0x79ae, 0x793c },{ 0x79b0, 0x7962 },{ 0x79b1, 0x7977 },
+ { 0x79bf, 0x79c3 },{ 0x79c8, 0x7c7c },{ 0x79cf, 0x8017 },{ 0x7a05, 0x7a0e },
+ { 0x7a08, 0x79c6 },{ 0x7a1c, 0x68f1 },{ 0x7a1f, 0x7980 },{ 0x7a28, 0x6241 },
+ { 0x7a2e, 0x79cd },{ 0x7a31, 0x79f0 },{ 0x7a40, 0x8c37 },{ 0x7a4c, 0x7a23 },
+ { 0x7a4d, 0x79ef },{ 0x7a4e, 0x9896 },{ 0x7a61, 0x7a51 },{ 0x7a62, 0x79fd },
+ { 0x7a68, 0x9893 },{ 0x7a69, 0x7a33 },{ 0x7a6b, 0x83b7 },{ 0x7aa9, 0x7a9d },
+ { 0x7aaa, 0x6d3c },{ 0x7aae, 0x7a77 },{ 0x7aaf, 0x7a91 },{ 0x7ab6, 0x7aad },
+ { 0x7aba, 0x7aa5 },{ 0x7ac4, 0x7a9c },{ 0x7ac5, 0x7a8d },{ 0x7ac7, 0x7aa6 },
+ { 0x7aca, 0x7a83 },{ 0x7af6, 0x7ade },{ 0x7b3b, 0x7b47 },{ 0x7b46, 0x7b14 },
+ { 0x7b4d, 0x7b0b },{ 0x7b67, 0x7b15 },{ 0x7b74, 0x7b56 },{ 0x7b84, 0x7b85 },
+ { 0x7b87, 0x4e2a },{ 0x7b8b, 0x7b3a },{ 0x7b8f, 0x7b5d },{ 0x7ba0, 0x68f0 },
+ { 0x7bc0, 0x8282 },{ 0x7bc4, 0x8303 },{ 0x7bc9, 0x7b51 },{ 0x7bcb, 0x7ba7 },
+ { 0x7bdb, 0x7bac },{ 0x7be0, 0x7b71 },{ 0x7be4, 0x7b03 },{ 0x7be9, 0x7b5b },
+ { 0x7bf2, 0x5f57 },{ 0x7bf3, 0x7b5a },{ 0x7c00, 0x7ba6 },{ 0x7c0d, 0x7bd3 },
+ { 0x7c11, 0x84d1 },{ 0x7c1e, 0x7baa },{ 0x7c21, 0x7b80 },{ 0x7c23, 0x7bd1 },
+ { 0x7c2b, 0x7bab },{ 0x7c37, 0x6a90 },{ 0x7c3d, 0x7b7e },{ 0x7c3e, 0x5e18 },
+ { 0x7c43, 0x7bee },{ 0x7c4c, 0x7b79 },{ 0x7c50, 0x85e4 },{ 0x7c5c, 0x7ba8 },
+ { 0x7c5f, 0x7c41 },{ 0x7c60, 0x7b3c },{ 0x7c64, 0x7b7e },{ 0x7c65, 0x9fa0 },
+ { 0x7c69, 0x7b3e },{ 0x7c6a, 0x7c16 },{ 0x7c6c, 0x7bf1 },{ 0x7c6e, 0x7ba9 },
+ { 0x7c72, 0x5401 },{ 0x7ca7, 0x5986 },{ 0x7cb5, 0x7ca4 },{ 0x7cdd, 0x7cc1 },
+ { 0x7cde, 0x7caa },{ 0x7ce2, 0x998d },{ 0x7ce7, 0x7cae },{ 0x7cf0, 0x56e2 },
+ { 0x7cf2, 0x7c9d },{ 0x7cf4, 0x7c74 },{ 0x7cf6, 0x7c9c },{ 0x7cfe, 0x7ea0 },
+ { 0x7d00, 0x7eaa },{ 0x7d02, 0x7ea3 },{ 0x7d04, 0x7ea6 },{ 0x7d05, 0x7ea2 },
+ { 0x7d06, 0x7ea1 },{ 0x7d07, 0x7ea5 },{ 0x7d08, 0x7ea8 },{ 0x7d09, 0x7eab },
+ { 0x7d0b, 0x7eb9 },{ 0x7d0d, 0x7eb3 },{ 0x7d10, 0x7ebd },{ 0x7d13, 0x7ebe },
+ { 0x7d14, 0x7eaf },{ 0x7d15, 0x7eb0 },{ 0x7d17, 0x7eb1 },{ 0x7d19, 0x7eb8 },
+ { 0x7d1a, 0x7ea7 },{ 0x7d1b, 0x7eb7 },{ 0x7d1c, 0x7ead },{ 0x7d21, 0x7eba },
+ { 0x7d2e, 0x624e },{ 0x7d30, 0x7ec6 },{ 0x7d31, 0x7ec2 },{ 0x7d32, 0x7ec1 },
+ { 0x7d33, 0x7ec5 },{ 0x7d39, 0x7ecd },{ 0x7d3a, 0x7ec0 },{ 0x7d3c, 0x7ecb },
+ { 0x7d3f, 0x7ed0 },{ 0x7d40, 0x7ecc },{ 0x7d42, 0x7ec8 },{ 0x7d43, 0x5f26 },
+ { 0x7d44, 0x7ec4 },{ 0x7d46, 0x7eca },{ 0x7d4e, 0x7ed7 },{ 0x7d50, 0x7ed3 },
+ { 0x7d55, 0x7edd },{ 0x7d5b, 0x7ee6 },{ 0x7d5e, 0x7ede },{ 0x7d61, 0x7edc },
+ { 0x7d62, 0x7eda },{ 0x7d66, 0x7ed9 },{ 0x7d68, 0x7ed2 },{ 0x7d71, 0x7edf },
+ { 0x7d72, 0x4e1d },{ 0x7d73, 0x7edb },{ 0x7d79, 0x7ee2 },{ 0x7d81, 0x7ed1 },
+ { 0x7d83, 0x7ee1 },{ 0x7d86, 0x7ee0 },{ 0x7d88, 0x7ee8 },{ 0x7d8f, 0x7ee5 },
+ { 0x7d91, 0x6346 },{ 0x7d93, 0x7ecf },{ 0x7d9c, 0x7efc },{ 0x7d9e, 0x7f0d },
+ { 0x7da0, 0x7eff },{ 0x7da2, 0x7ef8 },{ 0x7da3, 0x7efb },{ 0x7dac, 0x7ef6 },
+ { 0x7dad, 0x7ef4 },{ 0x7db0, 0x7efe },{ 0x7db1, 0x7eb2 },{ 0x7db2, 0x7f51 },
+ { 0x7db4, 0x7f00 },{ 0x7db5, 0x5f69 },{ 0x7db8, 0x7eb6 },{ 0x7db9, 0x7efa },
+ { 0x7dba, 0x7eee },{ 0x7dbb, 0x7efd },{ 0x7dbd, 0x7ef0 },{ 0x7dbe, 0x7eeb },
+ { 0x7dbf, 0x7ef5 },{ 0x7dc4, 0x7ef2 },{ 0x7dc7, 0x7f01 },{ 0x7dca, 0x7d27 },
+ { 0x7dcb, 0x7eef },{ 0x7dd2, 0x7eea },{ 0x7dd7, 0x7f03 },{ 0x7dd8, 0x7f04 },
+ { 0x7dd9, 0x7f02 },{ 0x7dda, 0x7ebf },{ 0x7ddd, 0x7f09 },{ 0x7dde, 0x7f0e },
+ { 0x7de0, 0x7f14 },{ 0x7de1, 0x7f17 },{ 0x7de3, 0x7f18 },{ 0x7de6, 0x7f0c },
+ { 0x7de8, 0x7f16 },{ 0x7de9, 0x7f13 },{ 0x7dec, 0x7f05 },{ 0x7def, 0x7eac },
+ { 0x7df1, 0x7f11 },{ 0x7df2, 0x7f08 },{ 0x7df4, 0x7ec3 },{ 0x7df6, 0x7f0f },
+ { 0x7df9, 0x7f07 },{ 0x7dfb, 0x81f4 },{ 0x7e08, 0x8426 },{ 0x7e09, 0x7f19 },
+ { 0x7e0a, 0x7f22 },{ 0x7e0b, 0x7f12 },{ 0x7e10, 0x7ec9 },{ 0x7e11, 0x7f23 },
+ { 0x7e1a, 0x7ee6 },{ 0x7e1b, 0x7f1a },{ 0x7e1d, 0x7f1c },{ 0x7e1e, 0x7f1f },
+ { 0x7e1f, 0x7f1b },{ 0x7e23, 0x53bf },{ 0x7e2b, 0x7f1d },{ 0x7e2d, 0x7f21 },
+ { 0x7e2e, 0x7f29 },{ 0x7e2f, 0x6f14 },{ 0x7e31, 0x7eb5 },{ 0x7e32, 0x7f27 },
+ { 0x7e33, 0x7f1a },{ 0x7e34, 0x7ea4 },{ 0x7e35, 0x7f26 },{ 0x7e36, 0x7d77 },
+ { 0x7e37, 0x7f15 },{ 0x7e39, 0x7f25 },{ 0x7e3d, 0x603b },{ 0x7e3e, 0x7ee9 },
+ { 0x7e43, 0x7ef7 },{ 0x7e45, 0x7f2b },{ 0x7e46, 0x7f2a },{ 0x7e48, 0x8941 },
+ { 0x7e52, 0x7f2f },{ 0x7e54, 0x7ec7 },{ 0x7e55, 0x7f2e },{ 0x7e59, 0x7ffb },
+ { 0x7e5a, 0x7f2d },{ 0x7e5e, 0x7ed5 },{ 0x7e61, 0x7ee3 },{ 0x7e62, 0x7f0b },
+ { 0x7e69, 0x7ef3 },{ 0x7e6a, 0x7ed8 },{ 0x7e6b, 0x7cfb },{ 0x7e6d, 0x8327 },
+ { 0x7e6f, 0x7f33 },{ 0x7e70, 0x7f32 },{ 0x7e73, 0x7f34 },{ 0x7e79, 0x7ece },
+ { 0x7e7c, 0x7ee7 },{ 0x7e7d, 0x7f24 },{ 0x7e7e, 0x7f31 },{ 0x7e88, 0x7f2c },
+ { 0x7e8a, 0x7ea9 },{ 0x7e8c, 0x7eed },{ 0x7e8d, 0x7d2f },{ 0x7e8f, 0x7f20 },
+ { 0x7e93, 0x7f28 },{ 0x7e94, 0x624d },{ 0x7e96, 0x7ea4 },{ 0x7e98, 0x7f35 },
+ { 0x7e9c, 0x7f06 },{ 0x7f3d, 0x94b5 },{ 0x7f3e, 0x74f6 },{ 0x7f48, 0x575b },
+ { 0x7f4c, 0x7f42 },{ 0x7f66, 0x7f58 },{ 0x7f70, 0x7f5a },{ 0x7f75, 0x9a82 },
+ { 0x7f77, 0x7f62 },{ 0x7f85, 0x7f57 },{ 0x7f86, 0x7f74 },{ 0x7f88, 0x7f81 },
+ { 0x7f8b, 0x8288 },{ 0x7fa5, 0x7f9f },{ 0x7fa8, 0x7fa1 },{ 0x7fa9, 0x4e49 },
+ { 0x7fb6, 0x81bb },{ 0x7fd2, 0x4e60 },{ 0x7ff9, 0x7fd8 },{ 0x8011, 0x7aef },
+ { 0x8021, 0x52a9 },{ 0x8024, 0x85c9 },{ 0x802c, 0x8027 },{ 0x8056, 0x5723 },
+ { 0x805e, 0x95fb },{ 0x806f, 0x8054 },{ 0x8070, 0x806a },{ 0x8072, 0x58f0 },
+ { 0x8073, 0x8038 },{ 0x8075, 0x8069 },{ 0x8076, 0x8042 },{ 0x8077, 0x804c },
+ { 0x8079, 0x804d },{ 0x807d, 0x542c },{ 0x807e, 0x804b },{ 0x8085, 0x8083 },
+ { 0x808f, 0x64cd },{ 0x8090, 0x80f3 },{ 0x80c7, 0x80ba },{ 0x80ca, 0x6710 },
+ { 0x8105, 0x80c1 },{ 0x8108, 0x8109 },{ 0x811b, 0x80eb },{ 0x8123, 0x5507 },
+ { 0x8129, 0x4fee },{ 0x812b, 0x8131 },{ 0x8139, 0x80c0 },{ 0x814e, 0x80be },
+ { 0x8161, 0x8136 },{ 0x8166, 0x8111 },{ 0x816b, 0x80bf },{ 0x8173, 0x811a },
+ { 0x8178, 0x80a0 },{ 0x8183, 0x817d },{ 0x8186, 0x55c9 },{ 0x819a, 0x80a4 },
+ { 0x81a0, 0x80f6 },{ 0x81a9, 0x817b },{ 0x81bd, 0x80c6 },{ 0x81be, 0x810d },
+ { 0x81bf, 0x8113 },{ 0x81c9, 0x8138 },{ 0x81cd, 0x8110 },{ 0x81cf, 0x8191 },
+ { 0x81d5, 0x8198 },{ 0x81d8, 0x814a },{ 0x81d9, 0x80ed },{ 0x81da, 0x80ea },
+ { 0x81df, 0x810f },{ 0x81e0, 0x8114 },{ 0x81e5, 0x5367 },{ 0x81e8, 0x4e34 },
+ { 0x81fa, 0x53f0 },{ 0x8207, 0x4e0e },{ 0x8208, 0x5174 },{ 0x8209, 0x4e3e },
+ { 0x820a, 0x65e7 },{ 0x820b, 0x8845 },{ 0x8216, 0x94fa },{ 0x8259, 0x8231 },
+ { 0x8263, 0x6a79 },{ 0x8264, 0x8223 },{ 0x8266, 0x8230 },{ 0x826b, 0x823b },
+ { 0x8271, 0x8270 },{ 0x8277, 0x8273 },{ 0x8278, 0x8279 },{ 0x82bb, 0x520d },
+ { 0x82e7, 0x82ce },{ 0x82fa, 0x8393 },{ 0x830d, 0x82df },{ 0x8332, 0x5179 },
+ { 0x8345, 0x7b54 },{ 0x834a, 0x8346 },{ 0x8373, 0x8c46 },{ 0x838a, 0x5e84 },
+ { 0x8396, 0x830e },{ 0x83a2, 0x835a },{ 0x83a7, 0x82cb },{ 0x83eb, 0x5807 },
+ { 0x83ef, 0x534e },{ 0x83f4, 0x5eb5 },{ 0x8407, 0x82cc },{ 0x840a, 0x83b1 },
+ { 0x842c, 0x4e07 },{ 0x8435, 0x83b4 },{ 0x8449, 0x53f6 },{ 0x8452, 0x836d },
+ { 0x8466, 0x82c7 },{ 0x846f, 0x836f },{ 0x8477, 0x8364 },{ 0x8490, 0x641c },
+ { 0x8494, 0x83b3 },{ 0x849e, 0x8385 },{ 0x84bc, 0x82cd },{ 0x84c0, 0x836a },
+ { 0x84c6, 0x5e2d },{ 0x84cb, 0x76d6 },{ 0x84ee, 0x83b2 },{ 0x84ef, 0x82c1 },
+ { 0x84f4, 0x83bc },{ 0x84fd, 0x835c },{ 0x8506, 0x83f1 },{ 0x8514, 0x535c },
+ { 0x851e, 0x848c },{ 0x8523, 0x848b },{ 0x8525, 0x8471 },{ 0x8526, 0x8311 },
+ { 0x852d, 0x836b },{ 0x8541, 0x8368 },{ 0x8546, 0x8487 },{ 0x854e, 0x835e },
+ { 0x8553, 0x82b8 },{ 0x8555, 0x83b8 },{ 0x8558, 0x835b },{ 0x8562, 0x8489 },
+ { 0x8569, 0x8361 },{ 0x856a, 0x829c },{ 0x856d, 0x8427 },{ 0x8577, 0x84e3 },
+ { 0x8588, 0x835f },{ 0x858a, 0x84df },{ 0x858c, 0x8297 },{ 0x8591, 0x59dc },
+ { 0x8594, 0x8537 },{ 0x8599, 0x5243 },{ 0x859f, 0x83b6 },{ 0x85a6, 0x8350 },
+ { 0x85a9, 0x8428 },{ 0x85ba, 0x8360 },{ 0x85cd, 0x84dd },{ 0x85ce, 0x8369 },
+ { 0x85da, 0x836c },{ 0x85dd, 0x827a },{ 0x85e5, 0x836f },{ 0x85ea, 0x85ae },
+ { 0x85f6, 0x82c8 },{ 0x85f7, 0x85af },{ 0x85f9, 0x853c },{ 0x85fa, 0x853a },
+ { 0x8604, 0x8572 },{ 0x8606, 0x82a6 },{ 0x8607, 0x82cf },{ 0x860a, 0x8574 },
+ { 0x860b, 0x82f9 },{ 0x8617, 0x8616 },{ 0x861a, 0x85d3 },{ 0x861e, 0x8539 },
+ { 0x8622, 0x830f },{ 0x862d, 0x5170 },{ 0x863a, 0x84e0 },{ 0x863f, 0x841d },
+ { 0x8655, 0x5904 },{ 0x8656, 0x547c },{ 0x865b, 0x865a },{ 0x865c, 0x864f },
+ { 0x865f, 0x53f7 },{ 0x8667, 0x4e8f },{ 0x866f, 0x866c },{ 0x86fa, 0x86f1 },
+ { 0x86fb, 0x8715 },{ 0x8706, 0x86ac },{ 0x873a, 0x9713 },{ 0x8755, 0x8680 },
+ { 0x875f, 0x732c },{ 0x8766, 0x867e },{ 0x8768, 0x8671 },{ 0x8778, 0x8717 },
+ { 0x8784, 0x86f3 },{ 0x879e, 0x8682 },{ 0x87a2, 0x8424 },{ 0x87bb, 0x877c },
+ { 0x87c4, 0x86f0 },{ 0x87c8, 0x8748 },{ 0x87e3, 0x866e },{ 0x87ec, 0x8749 },
+ { 0x87ef, 0x86f2 },{ 0x87f2, 0x866b },{ 0x87f6, 0x86cf },{ 0x87fa, 0x87ee },
+ { 0x87fb, 0x8681 },{ 0x8805, 0x8747 },{ 0x8806, 0x867f },{ 0x880d, 0x874e },
+ { 0x8810, 0x86f4 },{ 0x8811, 0x877e },{ 0x8814, 0x869d },{ 0x881f, 0x8721 },
+ { 0x8823, 0x86ce },{ 0x8831, 0x86ca },{ 0x8836, 0x8695 },{ 0x8837, 0x883c },
+ { 0x883b, 0x86ee },{ 0x884a, 0x8511 },{ 0x8852, 0x70ab },{ 0x8853, 0x672f },
+ { 0x885a, 0x80e1 },{ 0x885b, 0x536b },{ 0x885d, 0x51b2 },{ 0x8879, 0x53ea },
+ { 0x889e, 0x886e },{ 0x88aa, 0x795b },{ 0x88ca, 0x8885 },{ 0x88cf, 0x91cc },
+ { 0x88dc, 0x8865 },{ 0x88dd, 0x88c5 },{ 0x88e1, 0x91cc },{ 0x88fd, 0x5236 },
+ { 0x8907, 0x590d },{ 0x890e, 0x8896 },{ 0x8932, 0x88e4 },{ 0x8933, 0x88e2 },
+ { 0x8938, 0x891b },{ 0x893b, 0x4eb5 },{ 0x8949, 0x88e5 },{ 0x8956, 0x8884 },
+ { 0x895d, 0x88e3 },{ 0x8960, 0x88c6 },{ 0x8964, 0x8934 },{ 0x896a, 0x889c },
+ { 0x896c, 0x6446 },{ 0x896f, 0x886c },{ 0x8972, 0x88ad },{ 0x897e, 0x897f },
+ { 0x8988, 0x6838 },{ 0x898b, 0x89c1 },{ 0x898f, 0x89c4 },{ 0x8993, 0x89c5 },
+ { 0x8996, 0x89c6 },{ 0x8998, 0x89c7 },{ 0x899c, 0x773a },{ 0x89a1, 0x89cb },
+ { 0x89a6, 0x89ce },{ 0x89aa, 0x4eb2 },{ 0x89ac, 0x89ca },{ 0x89af, 0x89cf },
+ { 0x89b2, 0x89d0 },{ 0x89b7, 0x89d1 },{ 0x89ba, 0x89c9 },{ 0x89bd, 0x89c8 },
+ { 0x89bf, 0x89cc },{ 0x89c0, 0x89c2 },{ 0x89d4, 0x7b4b },{ 0x89dd, 0x62b5 },
+ { 0x89f4, 0x89de },{ 0x89f6, 0x89ef },{ 0x89f8, 0x89e6 },{ 0x8a02, 0x8ba2 },
+ { 0x8a03, 0x8ba3 },{ 0x8a08, 0x8ba1 },{ 0x8a0a, 0x8baf },{ 0x8a0c, 0x8ba7 },
+ { 0x8a0e, 0x8ba8 },{ 0x8a10, 0x8ba6 },{ 0x8a13, 0x8bad },{ 0x8a15, 0x8baa },
+ { 0x8a16, 0x8bab },{ 0x8a17, 0x6258 },{ 0x8a18, 0x8bb0 },{ 0x8a1b, 0x8bb9 },
+ { 0x8a1d, 0x8bb6 },{ 0x8a1f, 0x8bbc },{ 0x8a22, 0x6b23 },{ 0x8a23, 0x8bc0 },
+ { 0x8a25, 0x8bb7 },{ 0x8a2a, 0x8bbf },{ 0x8a2d, 0x8bbe },{ 0x8a31, 0x8bb8 },
+ { 0x8a34, 0x8bc9 },{ 0x8a36, 0x8bc3 },{ 0x8a3a, 0x8bca },{ 0x8a3b, 0x6ce8 },
+ { 0x8a3c, 0x8bc1 },{ 0x8a41, 0x8bc2 },{ 0x8a46, 0x8bcb },{ 0x8a4e, 0x8bb5 },
+ { 0x8a50, 0x8bc8 },{ 0x8a52, 0x8bd2 },{ 0x8a54, 0x8bcf },{ 0x8a55, 0x8bc4 },
+ { 0x8a58, 0x8bce },{ 0x8a5b, 0x8bc5 },{ 0x8a5e, 0x8bcd },{ 0x8a60, 0x548f },
+ { 0x8a61, 0x8be9 },{ 0x8a62, 0x8be2 },{ 0x8a63, 0x8be3 },{ 0x8a66, 0x8bd5 },
+ { 0x8a69, 0x8bd7 },{ 0x8a6b, 0x8be7 },{ 0x8a6c, 0x8bdf },{ 0x8a6d, 0x8be1 },
+ { 0x8a6e, 0x8be0 },{ 0x8a70, 0x8bd8 },{ 0x8a71, 0x8bdd },{ 0x8a72, 0x8be5 },
+ { 0x8a73, 0x8be6 },{ 0x8a75, 0x8bdc },{ 0x8a76, 0x916c },{ 0x8a7b, 0x54af },
+ { 0x8a7c, 0x8bd9 },{ 0x8a7f, 0x8bd6 },{ 0x8a84, 0x8bd4 },{ 0x8a85, 0x8bdb },
+ { 0x8a86, 0x8bd3 },{ 0x8a87, 0x5938 },{ 0x8a8c, 0x5fd7 },{ 0x8a8d, 0x8ba4 },
+ { 0x8a91, 0x8bf3 },{ 0x8a92, 0x8bf6 },{ 0x8a95, 0x8bde },{ 0x8a98, 0x8bf1 },
+ { 0x8a9a, 0x8bee },{ 0x8a9e, 0x8bed },{ 0x8aa0, 0x8bda },{ 0x8aa1, 0x8beb },
+ { 0x8aa3, 0x8bec },{ 0x8aa4, 0x8bef },{ 0x8aa5, 0x8bf0 },{ 0x8aa6, 0x8bf5 },
+ { 0x8aa8, 0x8bf2 },{ 0x8aaa, 0x8bf4 },{ 0x8ab0, 0x8c01 },{ 0x8ab2, 0x8bfe },
+ { 0x8ab6, 0x8c07 },{ 0x8ab9, 0x8bfd },{ 0x8abc, 0x8c0a },{ 0x8abf, 0x8c03 },
+ { 0x8ac2, 0x8c04 },{ 0x8ac4, 0x8c06 },{ 0x8ac7, 0x8c08 },{ 0x8ac9, 0x8bff },
+ { 0x8acb, 0x8bf7 },{ 0x8acd, 0x8be4 },{ 0x8acf, 0x8bf9 },{ 0x8ad1, 0x8bfc },
+ { 0x8ad2, 0x8c05 },{ 0x8ad6, 0x8bba },{ 0x8ad7, 0x8c02 },{ 0x8adb, 0x8c00 },
+ { 0x8adc, 0x8c0d },{ 0x8ade, 0x8c1d },{ 0x8ae0, 0x55a7 },{ 0x8ae2, 0x8be8 },
+ { 0x8ae4, 0x8c14 },{ 0x8ae6, 0x8c1b },{ 0x8ae7, 0x8c10 },{ 0x8aeb, 0x8c0f },
+ { 0x8aed, 0x8c15 },{ 0x8aee, 0x8c18 },{ 0x8af1, 0x8bb3 },{ 0x8af3, 0x8c19 },
+ { 0x8af6, 0x8c0c },{ 0x8af7, 0x8bbd },{ 0x8af8, 0x8bf8 },{ 0x8afa, 0x8c1a },
+ { 0x8afc, 0x8c16 },{ 0x8afe, 0x8bfa },{ 0x8b00, 0x8c0b },{ 0x8b01, 0x8c12 },
+ { 0x8b02, 0x8c13 },{ 0x8b04, 0x8a8a },{ 0x8b05, 0x8bcc },{ 0x8b0a, 0x8c0e },
+ { 0x8b0e, 0x8c1c },{ 0x8b10, 0x8c27 },{ 0x8b14, 0x8c11 },{ 0x8b16, 0x8c21 },
+ { 0x8b17, 0x8c24 },{ 0x8b19, 0x8c26 },{ 0x8b1a, 0x8c25 },{ 0x8b1b, 0x8bb2 },
+ { 0x8b1d, 0x8c22 },{ 0x8b20, 0x8c23 },{ 0x8b28, 0x8c1f },{ 0x8b2b, 0x8c2a },
+ { 0x8b2c, 0x8c2c },{ 0x8b33, 0x8bb4 },{ 0x8b39, 0x8c28 },{ 0x8b3c, 0x547c },
+ { 0x8b3e, 0x8c29 },{ 0x8b41, 0x54d7 },{ 0x8b46, 0x563b },{ 0x8b49, 0x8bc1 },
+ { 0x8b4e, 0x8c32 },{ 0x8b4f, 0x8ba5 },{ 0x8b54, 0x64b0 },{ 0x8b56, 0x8c2e },
+ { 0x8b58, 0x8bc6 },{ 0x8b59, 0x8c2f },{ 0x8b5a, 0x8c2d },{ 0x8b5c, 0x8c31 },
+ { 0x8b5f, 0x566a },{ 0x8b6b, 0x8c35 },{ 0x8b6d, 0x6bc1 },{ 0x8b6f, 0x8bd1 },
+ { 0x8b70, 0x8bae },{ 0x8b74, 0x8c34 },{ 0x8b77, 0x62a4 },{ 0x8b7d, 0x8a89 },
+ { 0x8b7e, 0x8c2b },{ 0x8b80, 0x8bfb },{ 0x8b8a, 0x53d8 },{ 0x8b8c, 0x5bb4 },
+ { 0x8b8e, 0x96e0 },{ 0x8b92, 0x8c17 },{ 0x8b93, 0x8ba9 },{ 0x8b95, 0x8c30 },
+ { 0x8b96, 0x8c36 },{ 0x8b9a, 0x8d5e },{ 0x8b9c, 0x8c20 },{ 0x8b9e, 0x8c33 },
+ { 0x8c3f, 0x6eaa },{ 0x8c48, 0x5c82 },{ 0x8c4e, 0x7ad6 },{ 0x8c50, 0x4e30 },
+ { 0x8c54, 0x8273 },{ 0x8c56, 0x4e8d },{ 0x8c6c, 0x732a },{ 0x8c8d, 0x72f8 },
+ { 0x8c93, 0x732b },{ 0x8c9d, 0x8d1d },{ 0x8c9e, 0x8d1e },{ 0x8ca0, 0x8d1f },
+ { 0x8ca1, 0x8d22 },{ 0x8ca2, 0x8d21 },{ 0x8ca7, 0x8d2b },{ 0x8ca8, 0x8d27 },
+ { 0x8ca9, 0x8d29 },{ 0x8caa, 0x8d2a },{ 0x8cab, 0x8d2f },{ 0x8cac, 0x8d23 },
+ { 0x8caf, 0x8d2e },{ 0x8cb0, 0x8d33 },{ 0x8cb2, 0x8d40 },{ 0x8cb3, 0x8d30 },
+ { 0x8cb4, 0x8d35 },{ 0x8cb6, 0x8d2c },{ 0x8cb7, 0x4e70 },{ 0x8cb8, 0x8d37 },
+ { 0x8cba, 0x8d36 },{ 0x8cbb, 0x8d39 },{ 0x8cbc, 0x8d34 },{ 0x8cbd, 0x8d3b },
+ { 0x8cbf, 0x8d38 },{ 0x8cc0, 0x8d3a },{ 0x8cc1, 0x8d32 },{ 0x8cc2, 0x8d42 },
+ { 0x8cc3, 0x8d41 },{ 0x8cc4, 0x8d3f },{ 0x8cc5, 0x8d45 },{ 0x8cc7, 0x8d44 },
+ { 0x8cc8, 0x8d3e },{ 0x8cca, 0x8d3c },{ 0x8cd1, 0x8d48 },{ 0x8cd2, 0x8d4a },
+ { 0x8cd3, 0x5bbe },{ 0x8cd5, 0x8d47 },{ 0x8cd9, 0x5468 },{ 0x8cda, 0x8d49 },
+ { 0x8cdc, 0x8d50 },{ 0x8cde, 0x8d4f },{ 0x8ce0, 0x8d54 },{ 0x8ce1, 0x8d53 },
+ { 0x8ce2, 0x8d24 },{ 0x8ce3, 0x5356 },{ 0x8ce4, 0x8d31 },{ 0x8ce6, 0x8d4b },
+ { 0x8ce7, 0x8d55 },{ 0x8cea, 0x8d28 },{ 0x8cec, 0x8d26 },{ 0x8ced, 0x8d4c },
+ { 0x8cf4, 0x8d56 },{ 0x8cf8, 0x5269 },{ 0x8cfa, 0x8d5a },{ 0x8cfb, 0x8d59 },
+ { 0x8cfc, 0x8d2d },{ 0x8cfd, 0x8d5b },{ 0x8cfe, 0x8d5c },{ 0x8d04, 0x8d3d },
+ { 0x8d05, 0x8d58 },{ 0x8d08, 0x8d60 },{ 0x8d0a, 0x8d5e },{ 0x8d0d, 0x8d61 },
+ { 0x8d0f, 0x8d62 },{ 0x8d10, 0x8d46 },{ 0x8d13, 0x8d43 },{ 0x8d16, 0x8d4e },
+ { 0x8d17, 0x8d5d },{ 0x8d1b, 0x8d63 },{ 0x8d95, 0x8d76 },{ 0x8d99, 0x8d75 },
+ { 0x8da8, 0x8d8b },{ 0x8db2, 0x8db1 },{ 0x8de1, 0x8ff9 },{ 0x8dfc, 0x5c40 },
+ { 0x8e10, 0x8df5 },{ 0x8e21, 0x8737 },{ 0x8e2b, 0x78b0 },{ 0x8e30, 0x903e },
+ { 0x8e34, 0x8e0a },{ 0x8e4c, 0x8dc4 },{ 0x8e55, 0x8df8 },{ 0x8e5f, 0x8ff9 },
+ { 0x8e60, 0x8dd6 },{ 0x8e63, 0x8e52 },{ 0x8e64, 0x8e2a },{ 0x8e67, 0x7cdf },
+ { 0x8e7a, 0x8df7 },{ 0x8e89, 0x8db8 },{ 0x8e8a, 0x8e0c },{ 0x8e8b, 0x8dfb },
+ { 0x8e8d, 0x8dc3 },{ 0x8e91, 0x8e2f },{ 0x8e92, 0x8dde },{ 0x8e93, 0x8e2c },
+ { 0x8e95, 0x8e70 },{ 0x8e9a, 0x8df9 },{ 0x8ea1, 0x8e51 },{ 0x8ea5, 0x8e7f },
+ { 0x8ea6, 0x8e9c },{ 0x8eaa, 0x8e8f },{ 0x8ec0, 0x8eaf },{ 0x8eca, 0x8f66 },
+ { 0x8ecb, 0x8f67 },{ 0x8ecc, 0x8f68 },{ 0x8ecd, 0x519b },{ 0x8ed2, 0x8f69 },
+ { 0x8ed4, 0x8f6b },{ 0x8edb, 0x8f6d },{ 0x8edf, 0x8f6f },{ 0x8eeb, 0x8f78 },
+ { 0x8ef8, 0x8f74 },{ 0x8ef9, 0x8f75 },{ 0x8efa, 0x8f7a },{ 0x8efb, 0x8f72 },
+ { 0x8efc, 0x8f76 },{ 0x8efe, 0x8f7c },{ 0x8f03, 0x8f83 },{ 0x8f05, 0x8f82 },
+ { 0x8f07, 0x8f81 },{ 0x8f09, 0x8f7d },{ 0x8f0a, 0x8f7e },{ 0x8f12, 0x8f84 },
+ { 0x8f13, 0x633d },{ 0x8f14, 0x8f85 },{ 0x8f15, 0x8f7b },{ 0x8f1b, 0x8f86 },
+ { 0x8f1c, 0x8f8e },{ 0x8f1d, 0x8f89 },{ 0x8f1e, 0x8f8b },{ 0x8f1f, 0x8f8d },
+ { 0x8f25, 0x8f8a },{ 0x8f26, 0x8f87 },{ 0x8f29, 0x8f88 },{ 0x8f2a, 0x8f6e },
+ { 0x8f2f, 0x8f91 },{ 0x8f33, 0x8f8f },{ 0x8f38, 0x8f93 },{ 0x8f3b, 0x8f90 },
+ { 0x8f3e, 0x8f97 },{ 0x8f3f, 0x8206 },{ 0x8f42, 0x6bc2 },{ 0x8f44, 0x8f96 },
+ { 0x8f45, 0x8f95 },{ 0x8f46, 0x8f98 },{ 0x8f49, 0x8f6c },{ 0x8f4d, 0x8f99 },
+ { 0x8f4e, 0x8f7f },{ 0x8f54, 0x8f9a },{ 0x8f5f, 0x8f70 },{ 0x8f61, 0x8f94 },
+ { 0x8f62, 0x8f79 },{ 0x8f64, 0x8f73 },{ 0x8fa6, 0x529e },{ 0x8fad, 0x8f9e },
+ { 0x8fae, 0x8fab },{ 0x8faf, 0x8fa9 },{ 0x8fb2, 0x519c },{ 0x8fc6, 0x8fe4 },
+ { 0x8ff4, 0x56de },{ 0x8ffa, 0x4e43 },{ 0x9015, 0x8ff3 },{ 0x9019, 0x8fd9 },
+ { 0x9023, 0x8fde },{ 0x9031, 0x5468 },{ 0x9032, 0x8fdb },{ 0x904a, 0x6e38 },
+ { 0x904b, 0x8fd0 },{ 0x904e, 0x8fc7 },{ 0x9054, 0x8fbe },{ 0x9055, 0x8fdd },
+ { 0x9059, 0x9065 },{ 0x905c, 0x900a },{ 0x905e, 0x9012 },{ 0x9060, 0x8fdc },
+ { 0x9069, 0x9002 },{ 0x9072, 0x8fdf },{ 0x9077, 0x8fc1 },{ 0x9078, 0x9009 },
+ { 0x907a, 0x9057 },{ 0x907c, 0x8fbd },{ 0x9081, 0x8fc8 },{ 0x9084, 0x8fd8 },
+ { 0x9087, 0x8fe9 },{ 0x908a, 0x8fb9 },{ 0x908f, 0x903b },{ 0x9090, 0x9026 },
+ { 0x90df, 0x90cf },{ 0x90f5, 0x90ae },{ 0x9106, 0x90d3 },{ 0x9109, 0x4e61 },
+ { 0x9112, 0x90b9 },{ 0x9114, 0x90ac },{ 0x9116, 0x90e7 },{ 0x9127, 0x9093 },
+ { 0x912d, 0x90d1 },{ 0x9130, 0x90bb },{ 0x9132, 0x90f8 },{ 0x9134, 0x90ba },
+ { 0x9136, 0x90d0 },{ 0x913a, 0x909d },{ 0x9148, 0x90e6 },{ 0x9156, 0x9e29 },
+ { 0x9183, 0x814c },{ 0x9186, 0x76cf },{ 0x919c, 0x4e11 },{ 0x919e, 0x915d },
+ { 0x91ab, 0x533b },{ 0x91ac, 0x9171 },{ 0x91b1, 0x53d1 },{ 0x91bc, 0x5bb4 },
+ { 0x91c0, 0x917f },{ 0x91c1, 0x8845 },{ 0x91c3, 0x917e },{ 0x91c5, 0x917d },
+ { 0x91c6, 0x91c7 },{ 0x91cb, 0x91ca },{ 0x91d0, 0x5398 },{ 0x91d3, 0x9486 },
+ { 0x91d4, 0x9487 },{ 0x91d5, 0x948c },{ 0x91d7, 0x948a },{ 0x91d8, 0x9489 },
+ { 0x91d9, 0x948b },{ 0x91dd, 0x9488 },{ 0x91e3, 0x9493 },{ 0x91e4, 0x9490 },
+ { 0x91e6, 0x6263 },{ 0x91e7, 0x948f },{ 0x91e9, 0x9492 },{ 0x91ec, 0x948e },
+ { 0x91f5, 0x9497 },{ 0x91f7, 0x948d },{ 0x91f9, 0x9495 },{ 0x9200, 0x94af },
+ { 0x9201, 0x94ab },{ 0x9204, 0x94ad },{ 0x9209, 0x94a0 },{ 0x920d, 0x949d },
+ { 0x9210, 0x94a4 },{ 0x9211, 0x94a3 },{ 0x9214, 0x949e },{ 0x9215, 0x94ae },
+ { 0x921e, 0x94a7 },{ 0x9223, 0x9499 },{ 0x9225, 0x94ac },{ 0x9226, 0x949b },
+ { 0x9227, 0x94aa },{ 0x922e, 0x94cc },{ 0x9230, 0x94c8 },{ 0x9233, 0x94b6 },
+ { 0x9234, 0x94c3 },{ 0x9237, 0x94b4 },{ 0x9238, 0x94b9 },{ 0x9239, 0x94cd },
+ { 0x923a, 0x94b0 },{ 0x923d, 0x94b8 },{ 0x923e, 0x94c0 },{ 0x923f, 0x94bf },
+ { 0x9240, 0x94be },{ 0x9245, 0x5de8 },{ 0x9246, 0x94bb },{ 0x9248, 0x94ca },
+ { 0x9249, 0x94c9 },{ 0x924b, 0x5228 },{ 0x924d, 0x94cb },{ 0x9251, 0x94c2 },
+ { 0x9257, 0x94b3 },{ 0x925a, 0x94c6 },{ 0x925b, 0x94c5 },{ 0x925e, 0x94ba },
+ { 0x9264, 0x94a9 },{ 0x9266, 0x94b2 },{ 0x926c, 0x94bc },{ 0x926d, 0x94bd },
+ { 0x9278, 0x94f0 },{ 0x927a, 0x94d2 },{ 0x927b, 0x94ec },{ 0x927f, 0x94ea },
+ { 0x9280, 0x94f6 },{ 0x9283, 0x94f3 },{ 0x9285, 0x94dc },{ 0x9291, 0x94e3 },
+ { 0x9293, 0x94e8 },{ 0x9296, 0x94e2 },{ 0x9298, 0x94ed },{ 0x929a, 0x94eb },
+ { 0x929c, 0x8854 },{ 0x92a0, 0x94d1 },{ 0x92a3, 0x94f7 },{ 0x92a5, 0x94f1 },
+ { 0x92a6, 0x94df },{ 0x92a8, 0x94f5 },{ 0x92a9, 0x94e5 },{ 0x92aa, 0x94d5 },
+ { 0x92ab, 0x94ef },{ 0x92ac, 0x94d0 },{ 0x92b2, 0x710a },{ 0x92b3, 0x9510 },
+ { 0x92b7, 0x9500 },{ 0x92b9, 0x9508 },{ 0x92bb, 0x9511 },{ 0x92bc, 0x9509 },
+ { 0x92c1, 0x94dd },{ 0x92c3, 0x9512 },{ 0x92c5, 0x950c },{ 0x92c7, 0x94a1 },
+ { 0x92cc, 0x94e4 },{ 0x92cf, 0x94d7 },{ 0x92d2, 0x950b },{ 0x92dd, 0x950a },
+ { 0x92df, 0x9513 },{ 0x92e4, 0x9504 },{ 0x92e6, 0x9514 },{ 0x92e8, 0x9507 },
+ { 0x92ea, 0x94fa },{ 0x92ee, 0x94d6 },{ 0x92ef, 0x9506 },{ 0x92f0, 0x9502 },
+ { 0x92f1, 0x94fd },{ 0x92f8, 0x952f },{ 0x92fb, 0x9274 },{ 0x92fc, 0x94a2 },
+ { 0x9301, 0x951e },{ 0x9304, 0x5f55 },{ 0x9306, 0x9516 },{ 0x9308, 0x9529 },
+ { 0x9310, 0x9525 },{ 0x9312, 0x9515 },{ 0x9315, 0x951f },{ 0x9318, 0x9524 },
+ { 0x9319, 0x9531 },{ 0x931a, 0x94ee },{ 0x931b, 0x951b },{ 0x931f, 0x952c },
+ { 0x9320, 0x952d },{ 0x9322, 0x94b1 },{ 0x9326, 0x9526 },{ 0x9328, 0x951a },
+ { 0x932b, 0x9521 },{ 0x932e, 0x9522 },{ 0x932f, 0x9519 },{ 0x9333, 0x9530 },
+ { 0x9336, 0x8868 },{ 0x9338, 0x94fc },{ 0x9346, 0x9494 },{ 0x9347, 0x9534 },
+ { 0x934a, 0x70bc },{ 0x934b, 0x9505 },{ 0x934d, 0x9540 },{ 0x9354, 0x9537 },
+ { 0x9358, 0x94e1 },{ 0x935b, 0x953b },{ 0x9364, 0x9538 },{ 0x9365, 0x9532 },
+ { 0x936c, 0x9539 },{ 0x9370, 0x953e },{ 0x9375, 0x952e },{ 0x9376, 0x9536 },
+ { 0x937a, 0x9517 },{ 0x937c, 0x9488 },{ 0x937e, 0x949f },{ 0x9382, 0x9541 },
+ { 0x938a, 0x9551 },{ 0x938c, 0x9570 },{ 0x9394, 0x7194 },{ 0x9396, 0x9501 },
+ { 0x9397, 0x67aa },{ 0x9398, 0x9549 },{ 0x939a, 0x9524 },{ 0x93a2, 0x94a8 },
+ { 0x93a3, 0x84e5 },{ 0x93a6, 0x954f },{ 0x93a7, 0x94e0 },{ 0x93a9, 0x94e9 },
+ { 0x93aa, 0x953c },{ 0x93ac, 0x9550 },{ 0x93ae, 0x9547 },{ 0x93b0, 0x9552 },
+ { 0x93b3, 0x954d },{ 0x93b5, 0x9553 },{ 0x93c3, 0x955e },{ 0x93c7, 0x955f },
+ { 0x93c8, 0x94fe },{ 0x93cc, 0x9546 },{ 0x93cd, 0x9559 },{ 0x93d1, 0x955d },
+ { 0x93d7, 0x94ff },{ 0x93d8, 0x9535 },{ 0x93dc, 0x9557 },{ 0x93dd, 0x9558 },
+ { 0x93de, 0x955b },{ 0x93df, 0x94f2 },{ 0x93e1, 0x955c },{ 0x93e2, 0x9556 },
+ { 0x93e4, 0x9542 },{ 0x93e8, 0x933e },{ 0x93f5, 0x94e7 },{ 0x93f7, 0x9564 },
+ { 0x93f9, 0x956a },{ 0x93fd, 0x9508 },{ 0x9403, 0x94d9 },{ 0x9409, 0x94e3 },
+ { 0x940b, 0x94f4 },{ 0x9410, 0x9563 },{ 0x9412, 0x94f9 },{ 0x9413, 0x9566 },
+ { 0x9414, 0x9561 },{ 0x9418, 0x949f },{ 0x9419, 0x956b },{ 0x9420, 0x9568 },
+ { 0x9428, 0x9544 },{ 0x942b, 0x954c },{ 0x942e, 0x9570 },{ 0x9432, 0x956f },
+ { 0x9433, 0x956d },{ 0x9435, 0x94c1 },{ 0x9436, 0x73af },{ 0x9438, 0x94ce },
+ { 0x943a, 0x94db },{ 0x943f, 0x9571 },{ 0x9444, 0x94f8 },{ 0x944a, 0x956c },
+ { 0x944c, 0x9554 },{ 0x9451, 0x9274 },{ 0x9452, 0x9274 },{ 0x9460, 0x94c4 },
+ { 0x9463, 0x9573 },{ 0x9464, 0x5228 },{ 0x946a, 0x7089 },{ 0x946d, 0x9567 },
+ { 0x9470, 0x94a5 },{ 0x9472, 0x9576 },{ 0x9475, 0x7f50 },{ 0x9477, 0x954a },
+ { 0x947c, 0x9523 },{ 0x947d, 0x94bb },{ 0x947e, 0x92ae },{ 0x947f, 0x51ff },
+ { 0x9577, 0x957f },{ 0x9580, 0x95e8 },{ 0x9582, 0x95e9 },{ 0x9583, 0x95ea },
+ { 0x9586, 0x95eb },{ 0x9589, 0x95ed },{ 0x958b, 0x5f00 },{ 0x958c, 0x95f6 },
+ { 0x958e, 0x95f3 },{ 0x958f, 0x95f0 },{ 0x9591, 0x95f2 },{ 0x9592, 0x95f2 },
+ { 0x9593, 0x95f4 },{ 0x9594, 0x95f5 },{ 0x9598, 0x95f8 },{ 0x95a1, 0x9602 },
+ { 0x95a3, 0x9601 },{ 0x95a4, 0x5408 },{ 0x95a5, 0x9600 },{ 0x95a8, 0x95fa },
+ { 0x95a9, 0x95fd },{ 0x95ab, 0x9603 },{ 0x95ac, 0x9606 },{ 0x95ad, 0x95fe },
+ { 0x95b1, 0x9605 },{ 0x95b6, 0x960a },{ 0x95b9, 0x9609 },{ 0x95bb, 0x960e },
+ { 0x95bc, 0x960f },{ 0x95bd, 0x960d },{ 0x95be, 0x9608 },{ 0x95bf, 0x960c },
+ { 0x95c3, 0x9612 },{ 0x95c6, 0x677f },{ 0x95c7, 0x6697 },{ 0x95c8, 0x95f1 },
+ { 0x95ca, 0x9614 },{ 0x95cb, 0x9615 },{ 0x95cc, 0x9611 },{ 0x95d0, 0x9617 },
+ { 0x95d4, 0x9616 },{ 0x95d5, 0x9619 },{ 0x95d6, 0x95ef },{ 0x95dc, 0x5173 },
+ { 0x95de, 0x961a },{ 0x95e1, 0x9610 },{ 0x95e2, 0x8f9f },{ 0x95e5, 0x95fc },
+ { 0x9628, 0x5384 },{ 0x962c, 0x5751 },{ 0x962f, 0x5740 },{ 0x964f, 0x968b },
+ { 0x9658, 0x9649 },{ 0x965d, 0x9655 },{ 0x965e, 0x5347 },{ 0x9663, 0x9635 },
+ { 0x9670, 0x9634 },{ 0x9673, 0x9648 },{ 0x9678, 0x9646 },{ 0x967d, 0x9633 },
+ { 0x9684, 0x5824 },{ 0x9689, 0x9667 },{ 0x968a, 0x961f },{ 0x968e, 0x9636 },
+ { 0x9695, 0x9668 },{ 0x969b, 0x9645 },{ 0x96a4, 0x9893 },{ 0x96a8, 0x968f },
+ { 0x96aa, 0x9669 },{ 0x96b1, 0x9690 },{ 0x96b4, 0x9647 },{ 0x96b8, 0x96b6 },
+ { 0x96bb, 0x53ea },{ 0x96cb, 0x96bd },{ 0x96d6, 0x867d },{ 0x96d9, 0x53cc },
+ { 0x96db, 0x96cf },{ 0x96dc, 0x6742 },{ 0x96de, 0x9e21 },{ 0x96e2, 0x79bb },
+ { 0x96e3, 0x96be },{ 0x96f2, 0x4e91 },{ 0x96fb, 0x7535 },{ 0x9711, 0x6cbe },
+ { 0x9724, 0x6e9c },{ 0x9727, 0x96fe },{ 0x973d, 0x9701 },{ 0x9742, 0x96f3 },
+ { 0x9744, 0x972d },{ 0x9748, 0x7075 },{ 0x975a, 0x9753 },{ 0x975c, 0x9759 },
+ { 0x9766, 0x817c },{ 0x9768, 0x9765 },{ 0x978f, 0x5de9 },{ 0x97a6, 0x79cb },
+ { 0x97c1, 0x7f30 },{ 0x97c3, 0x9791 },{ 0x97c6, 0x5343 },{ 0x97c9, 0x97af },
+ { 0x97cb, 0x97e6 },{ 0x97cc, 0x97e7 },{ 0x97d3, 0x97e9 },{ 0x97d9, 0x97ea },
+ { 0x97dc, 0x97ec },{ 0x97de, 0x97eb },{ 0x97fb, 0x97f5 },{ 0x97ff, 0x54cd },
+ { 0x9801, 0x9875 },{ 0x9802, 0x9876 },{ 0x9803, 0x9877 },{ 0x9805, 0x9879 },
+ { 0x9806, 0x987a },{ 0x9807, 0x9878 },{ 0x9808, 0x987b },{ 0x980a, 0x987c },
+ { 0x980c, 0x9882 },{ 0x980e, 0x9880 },{ 0x980f, 0x9883 },{ 0x9810, 0x9884 },
+ { 0x9811, 0x987d },{ 0x9812, 0x9881 },{ 0x9813, 0x987f },{ 0x9817, 0x9887 },
+ { 0x9818, 0x9886 },{ 0x981c, 0x988c },{ 0x9821, 0x9889 },{ 0x9824, 0x9890 },
+ { 0x9826, 0x988f },{ 0x982b, 0x4fef },{ 0x982d, 0x5934 },{ 0x9830, 0x988a },
+ { 0x9837, 0x9894 },{ 0x9838, 0x9888 },{ 0x9839, 0x9893 },{ 0x983b, 0x9891 },
+ { 0x9846, 0x9897 },{ 0x984c, 0x9898 },{ 0x984d, 0x989d },{ 0x984e, 0x989a },
+ { 0x984f, 0x989c },{ 0x9853, 0x989b },{ 0x9858, 0x613f },{ 0x9859, 0x98a1 },
+ { 0x985b, 0x98a0 },{ 0x985e, 0x7c7b },{ 0x9862, 0x989f },{ 0x9865, 0x98a2 },
+ { 0x9867, 0x987e },{ 0x986b, 0x98a4 },{ 0x986f, 0x663e },{ 0x9870, 0x98a6 },
+ { 0x9871, 0x9885 },{ 0x9873, 0x989e },{ 0x9874, 0x98a7 },{ 0x98a8, 0x98ce },
+ { 0x98ae, 0x98d1 },{ 0x98af, 0x98d2 },{ 0x98b1, 0x53f0 },{ 0x98b3, 0x522e },
+ { 0x98b6, 0x98d3 },{ 0x98ba, 0x626c },{ 0x98bc, 0x98d5 },{ 0x98c4, 0x98d8 },
+ { 0x98c6, 0x98d9 },{ 0x98db, 0x98de },{ 0x98e2, 0x9965 },{ 0x98e9, 0x9968 },
+ { 0x98ea, 0x996a },{ 0x98eb, 0x996b },{ 0x98ed, 0x996c },{ 0x98ef, 0x996d },
+ { 0x98f2, 0x996e },{ 0x98f4, 0x9974 },{ 0x98fc, 0x9972 },{ 0x98fd, 0x9971 },
+ { 0x98fe, 0x9970 },{ 0x9903, 0x997a },{ 0x9905, 0x997c },{ 0x9908, 0x7ccd },
+ { 0x9909, 0x9977 },{ 0x990a, 0x517b },{ 0x990c, 0x9975 },{ 0x9911, 0x997d },
+ { 0x9912, 0x9981 },{ 0x9913, 0x997f },{ 0x9914, 0x54fa },{ 0x9918, 0x4f59 },
+ { 0x991a, 0x80b4 },{ 0x991b, 0x9984 },{ 0x991e, 0x996f },{ 0x9921, 0x9985 },
+ { 0x9928, 0x9986 },{ 0x992c, 0x7cca },{ 0x9931, 0x7cc7 },{ 0x9933, 0x9967 },
+ { 0x9935, 0x5582 },{ 0x993c, 0x9969 },{ 0x993d, 0x9988 },{ 0x993e, 0x998f },
+ { 0x993f, 0x998a },{ 0x9943, 0x998d },{ 0x9945, 0x9992 },{ 0x9948, 0x9990 },
+ { 0x9949, 0x9991 },{ 0x994b, 0x9988 },{ 0x994c, 0x9994 },{ 0x9951, 0x9965 },
+ { 0x9952, 0x9976 },{ 0x9957, 0x98e8 },{ 0x995c, 0x990d },{ 0x995e, 0x998b },
+ { 0x995f, 0x9977 },{ 0x99ac, 0x9a6c },{ 0x99ad, 0x9a6d },{ 0x99ae, 0x51af },
+ { 0x99b1, 0x9a6e },{ 0x99b3, 0x9a70 },{ 0x99b4, 0x9a6f },{ 0x99c1, 0x9a73 },
+ { 0x99d0, 0x9a7b },{ 0x99d1, 0x9a7d },{ 0x99d2, 0x9a79 },{ 0x99d4, 0x9a75 },
+ { 0x99d5, 0x9a7e },{ 0x99d8, 0x9a80 },{ 0x99d9, 0x9a78 },{ 0x99db, 0x9a76 },
+ { 0x99dd, 0x9a7c },{ 0x99df, 0x9a77 },{ 0x99e2, 0x9a88 },{ 0x99ed, 0x9a87 },
+ { 0x99ee, 0x9a73 },{ 0x99f1, 0x9a86 },{ 0x99ff, 0x9a8f },{ 0x9a01, 0x9a8b },
+ { 0x9a03, 0x5446 },{ 0x9a05, 0x9a93 },{ 0x9a0d, 0x9a92 },{ 0x9a0e, 0x9a91 },
+ { 0x9a0f, 0x9a90 },{ 0x9a16, 0x9a9b },{ 0x9a19, 0x9a97 },{ 0x9a23, 0x9b03 },
+ { 0x9a2b, 0x9a9e },{ 0x9a2d, 0x9a98 },{ 0x9a2e, 0x9a9d },{ 0x9a30, 0x817e },
+ { 0x9a36, 0x9a7a },{ 0x9a37, 0x9a9a },{ 0x9a38, 0x9a9f },{ 0x9a3e, 0x9aa1 },
+ { 0x9a40, 0x84e6 },{ 0x9a41, 0x9a9c },{ 0x9a42, 0x9a96 },{ 0x9a43, 0x9aa0 },
+ { 0x9a44, 0x9aa2 },{ 0x9a45, 0x9a71 },{ 0x9a4a, 0x9a85 },{ 0x9a4d, 0x9a81 },
+ { 0x9a4f, 0x9aa3 },{ 0x9a55, 0x9a84 },{ 0x9a57, 0x9a8c },{ 0x9a5a, 0x60ca },
+ { 0x9a5b, 0x9a7f },{ 0x9a5f, 0x9aa4 },{ 0x9a62, 0x9a74 },{ 0x9a64, 0x9aa7 },
+ { 0x9a65, 0x9aa5 },{ 0x9a6a, 0x9a8a },{ 0x9aaf, 0x80ae },{ 0x9acf, 0x9ac5 },
+ { 0x9ad2, 0x810f },{ 0x9ad4, 0x4f53 },{ 0x9ad5, 0x9acc },{ 0x9ad6, 0x9acb },
+ { 0x9ae3, 0x4eff },{ 0x9aee, 0x53d1 },{ 0x9b06, 0x677e },{ 0x9b0d, 0x80e1 },
+ { 0x9b1a, 0x987b },{ 0x9b22, 0x9b13 },{ 0x9b25, 0x6597 },{ 0x9b27, 0x95f9 },
+ { 0x9b28, 0x54c4 },{ 0x9b29, 0x960b },{ 0x9b2e, 0x9604 },{ 0x9b31, 0x90c1 },
+ { 0x9b4e, 0x9b49 },{ 0x9b58, 0x9b47 },{ 0x9b5a, 0x9c7c },{ 0x9b68, 0x8c5a },
+ { 0x9b6f, 0x9c81 },{ 0x9b74, 0x9c82 },{ 0x9b77, 0x9c7f },{ 0x9b90, 0x9c90 },
+ { 0x9b91, 0x9c8d },{ 0x9b92, 0x9c8b },{ 0x9b9a, 0x9c92 },{ 0x9b9e, 0x9c95 },
+ { 0x9baa, 0x9c94 },{ 0x9bab, 0x9c9b },{ 0x9bad, 0x9c91 },{ 0x9bae, 0x9c9c },
+ { 0x9bc0, 0x9ca7 },{ 0x9bc1, 0x9ca0 },{ 0x9bc7, 0x9ca9 },{ 0x9bc9, 0x9ca4 },
+ { 0x9bca, 0x9ca8 },{ 0x9bd4, 0x9cbb },{ 0x9bd6, 0x9cad },{ 0x9bd7, 0x9c9e },
+ { 0x9bdb, 0x9cb7 },{ 0x9be1, 0x9cb1 },{ 0x9be2, 0x9cb5 },{ 0x9be4, 0x9cb2 },
+ { 0x9be7, 0x9cb3 },{ 0x9be8, 0x9cb8 },{ 0x9bea, 0x9cae },{ 0x9beb, 0x9cb0 },
+ { 0x9bf0, 0x9c87 },{ 0x9bfd, 0x9cab },{ 0x9c08, 0x9cbd },{ 0x9c09, 0x9cc7 },
+ { 0x9c0d, 0x9cc5 },{ 0x9c12, 0x9cc6 },{ 0x9c13, 0x9cc3 },{ 0x9c23, 0x9ca5 },
+ { 0x9c25, 0x9ccf },{ 0x9c28, 0x9cce },{ 0x9c29, 0x9cd0 },{ 0x9c2d, 0x9ccd },
+ { 0x9c31, 0x9ca2 },{ 0x9c32, 0x9ccc },{ 0x9c33, 0x9cd3 },{ 0x9c37, 0x9ca6 },
+ { 0x9c39, 0x9ca3 },{ 0x9c3b, 0x9cd7 },{ 0x9c3e, 0x9cd4 },{ 0x9c48, 0x9cd5 },
+ { 0x9c49, 0x9cd6 },{ 0x9c52, 0x9cdf },{ 0x9c54, 0x9cdd },{ 0x9c56, 0x9cdc },
+ { 0x9c57, 0x9cde },{ 0x9c58, 0x9c9f },{ 0x9c5f, 0x9c8e },{ 0x9c67, 0x9ce2 },
+ { 0x9c6d, 0x9c9a },{ 0x9c77, 0x9cc4 },{ 0x9c78, 0x9c88 },{ 0x9c7a, 0x9ca1 },
+ { 0x9ce5, 0x9e1f },{ 0x9ce7, 0x51eb },{ 0x9ce9, 0x9e20 },{ 0x9cf3, 0x51e4 },
+ { 0x9cf4, 0x9e23 },{ 0x9cf6, 0x9e22 },{ 0x9d06, 0x9e29 },{ 0x9d07, 0x9e28 },
+ { 0x9d08, 0x96c1 },{ 0x9d09, 0x9e26 },{ 0x9d15, 0x9e35 },{ 0x9d1b, 0x9e33 },
+ { 0x9d1d, 0x9e32 },{ 0x9d1f, 0x9e31 },{ 0x9d23, 0x9e2a },{ 0x9d26, 0x9e2f },
+ { 0x9d28, 0x9e2d },{ 0x9d2f, 0x9e38 },{ 0x9d30, 0x9e39 },{ 0x9d3b, 0x9e3f },
+ { 0x9d3f, 0x9e3d },{ 0x9d42, 0x9e3a },{ 0x9d51, 0x9e43 },{ 0x9d52, 0x9e46 },
+ { 0x9d53, 0x9e41 },{ 0x9d5c, 0x9e48 },{ 0x9d5d, 0x9e45 },{ 0x9d60, 0x9e44 },
+ { 0x9d61, 0x9e49 },{ 0x9d6a, 0x9e4c },{ 0x9d6c, 0x9e4f },{ 0x9d6f, 0x9e4e },
+ { 0x9d70, 0x96d5 },{ 0x9d72, 0x9e4a },{ 0x9d87, 0x9e2b },{ 0x9d89, 0x9e51 },
+ { 0x9d98, 0x9e55 },{ 0x9d9a, 0x9e57 },{ 0x9da9, 0x9e5c },{ 0x9daf, 0x83ba },
+ { 0x9db1, 0x9a9e },{ 0x9db4, 0x9e64 },{ 0x9dbb, 0x9e58 },{ 0x9dbc, 0x9e63 },
+ { 0x9dbf, 0x9e5a },{ 0x9dc2, 0x9e5e },{ 0x9dd3, 0x9e67 },{ 0x9dd7, 0x9e25 },
+ { 0x9dd9, 0x9e37 },{ 0x9dda, 0x9e68 },{ 0x9de5, 0x9e36 },{ 0x9de6, 0x9e6a },
+ { 0x9def, 0x9e69 },{ 0x9df0, 0x71d5 },{ 0x9df2, 0x9e6b },{ 0x9df3, 0x9e47 },
+ { 0x9df4, 0x9e47 },{ 0x9df8, 0x9e6c },{ 0x9df9, 0x9e70 },{ 0x9dfa, 0x9e6d },
+ { 0x9e15, 0x9e2c },{ 0x9e1a, 0x9e66 },{ 0x9e1b, 0x9e73 },{ 0x9e1d, 0x9e42 },
+ { 0x9e1e, 0x9e3e },{ 0x9e75, 0x5364 },{ 0x9e79, 0x54b8 },{ 0x9e7a, 0x9e7e },
+ { 0x9e7c, 0x7877 },{ 0x9e7d, 0x76d0 },{ 0x9e97, 0x4e3d },{ 0x9ea5, 0x9ea6 },
+ { 0x9ea9, 0x9eb8 },{ 0x9eb5, 0x9762 },{ 0x9ebc, 0x4e48 },{ 0x9ec3, 0x9ec4 },
+ { 0x9ecc, 0x9ec9 },{ 0x9ede, 0x70b9 },{ 0x9ee8, 0x515a },{ 0x9ef2, 0x9eea },
+ { 0x9ef4, 0x9709 },{ 0x9ef7, 0x9ee9 },{ 0x9efd, 0x9efe },{ 0x9eff, 0x9f0b },
+ { 0x9f07, 0x9ccc },{ 0x9f09, 0x9f0d },{ 0x9f15, 0x51ac },{ 0x9f34, 0x9f39 },
+ { 0x9f4a, 0x9f50 },{ 0x9f4b, 0x658b },{ 0x9f4e, 0x8d4d },{ 0x9f4f, 0x9f51 },
+ { 0x9f52, 0x9f7f },{ 0x9f54, 0x9f80 },{ 0x9f59, 0x9f85 },{ 0x9f5c, 0x9f87 },
+ { 0x9f5f, 0x9f83 },{ 0x9f60, 0x9f86 },{ 0x9f61, 0x9f84 },{ 0x9f63, 0x51fa },
+ { 0x9f66, 0x9f88 },{ 0x9f67, 0x556e },{ 0x9f6a, 0x9f8a },{ 0x9f6c, 0x9f89 },
+ { 0x9f72, 0x9f8b },{ 0x9f76, 0x816d },{ 0x9f77, 0x9f8c },{ 0x9f8d, 0x9f99 },
+ { 0x9f90, 0x5e9e },{ 0x9f94, 0x9f9a },{ 0x9f95, 0x9f9b },{ 0x9f9c, 0x9f9f },
+ { 0x9fa2, 0x548c },{ 0xfa0c, 0x5140 },{ 0xfe30, 0x2236 },{ 0xfe31, 0xff5c },
+ { 0xfe33, 0xff5c },{ 0xfe3f, 0x2227 },{ 0xfe40, 0x2228 },{ 0xfe50, 0xff0c },
+ { 0xfe51, 0x3001 },{ 0xfe52, 0xff0e },{ 0xfe54, 0xff1b },{ 0xfe55, 0xff1a },
+ { 0xfe56, 0xff1f },{ 0xfe57, 0xff01 },{ 0xfe59, 0xff08 },{ 0xfe5a, 0xff09 },
+ { 0xfe5b, 0xff5b },{ 0xfe5c, 0xff5d },{ 0xfe5d, 0xff3b },{ 0xfe5e, 0xff3d },
+ { 0xfe5f, 0xff03 },{ 0xfe60, 0xff06 },{ 0xfe61, 0xff0a },{ 0xfe62, 0xff0b },
+ { 0xfe63, 0xff0d },{ 0xfe64, 0xff1c },{ 0xfe65, 0xff1e },{ 0xfe66, 0xff1d },
+ { 0xfe69, 0xff04 },{ 0xfe6a, 0xff05 },{ 0xfe6b, 0xff20 },{ 0, 0}
+};
+
+#endif
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+## Makefile.am -- Process this file with automake to produce Makefile.in
+## Copyright (C) 2002 James Su
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+MAINTAINERCLEANFILES = Makefile.in
+CLEANFILES = *.bak
+
+INCLUDES = -I$(top_builddir) \
+ -I$(top_builddir)/ism/src \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/ism/src \
+ -I$(top_srcdir)/ism/intl \
+ -I$(top_srcdir)/ism/data \
+ -I$(top_srcdir)/ism/utils \
+ -I$(top_srcdir)/ism/extras/panel \
+ -I$(top_srcdir)/idm/src \
+ -DSCIM_DATADIR=\"@SCIM_DATADIR@\" \
+ -DSCIM_LOCALEDIR=\"@SCIM_LOCALEDIR@\" \
+ -DSCIM_SYSCONFDIR=\"@SCIM_SYSCONFDIR@\" \
+ -DSCIM_LIBEXECDIR=\"@SCIM_LIBEXECDIR@\" \
+ -DSCIM_ICONDIR=\"@SCIM_ICONDIR@\" \
+ -DSCIM_MODULE_PATH=\"@SCIM_MODULE_PATH@\"
+
+if SCIM_BUILD_FRONTEND_SOCKET
+CONFIG_FRONTEND_SOCKET_MODULE = socket.la
+endif
+
+noinst_HEADERS = scim_socket_frontend.h
+
+moduledir = @SCIM_MODULE_PATH@/$(SCIM_BINARY_VERSION)/FrontEnd
+
+module_LTLIBRARIES = $(CONFIG_FRONTEND_SOCKET_MODULE)
+
+socket_la_SOURCES = scim_socket_frontend.cpp
+
+socket_la_CXXFLAGS = @GTK2_CFLAGS@
+
+socket_la_LDFLAGS = -avoid-version \
+ -rpath $(moduledir) \
+ -module \
+ @LIBTOOL_EXPORT_OPTIONS@
+
+socket_la_LIBADD = $(top_builddir)/ism/src/libscim@SCIM_EPOCH@.la
+
--- /dev/null
+/** @file scim_socket_frontend.cpp
+ * implementation of class SocketFrontEnd.
+ */
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_socket_frontend.cpp,v 1.37 2005/07/03 08:36:42 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_SCIM_FRONTEND
+#define Uses_SCIM_SOCKET
+#define Uses_SCIM_TRANSACTION
+#define Uses_STL_UTILITY
+#define Uses_C_STDIO
+#define Uses_C_STDLIB
+#define Uses_SCIM_CONFIG_BASE
+#define Uses_SCIM_UTILITY
+#define Uses_SCIM_IMENGINE_MODULE
+#define Uses_SCIM_PANEL_AGENT
+
+#include <string.h>
+
+#include <limits.h>
+#include "scim_private.h"
+#include "scim.h"
+#include "scim_socket_frontend.h"
+#include "scim_helper.h"
+#include "scim_helper_module.h"
+#include "isf_query_utility.h"
+#include <sys/time.h>
+#include <sys/times.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <signal.h>
+
+#define scim_module_init socket_LTX_scim_module_init
+#define scim_module_exit socket_LTX_scim_module_exit
+#define scim_frontend_module_init socket_LTX_scim_frontend_module_init
+#define scim_frontend_module_run socket_LTX_scim_frontend_module_run
+
+#define SCIM_CONFIG_FRONTEND_SOCKET_CONFIG_READONLY "/FrontEnd/Socket/ConfigReadOnly"
+#define SCIM_CONFIG_FRONTEND_SOCKET_MAXCLIENTS "/FrontEnd/Socket/MaxClients"
+
+using namespace scim;
+
+static Pointer <SocketFrontEnd> _scim_frontend (0);
+
+static int _argc;
+static char **_argv = NULL;
+
+//Module Interface
+extern "C" {
+ void scim_module_init (void)
+ {
+ SCIM_DEBUG_FRONTEND(1) << "Initializing Socket FrontEnd module...\n";
+ }
+
+ void scim_module_exit (void)
+ {
+ SCIM_DEBUG_FRONTEND(1) << "Exiting Socket FrontEnd module...\n";
+ _scim_frontend.reset ();
+ }
+
+ void scim_frontend_module_init (const BackEndPointer &backend,
+ const ConfigPointer &config,
+ int argc,
+ char **argv)
+ {
+ if (_scim_frontend.null ()) {
+ SCIM_DEBUG_FRONTEND(1) << "Initializing Socket FrontEnd module (more)...\n";
+ _scim_frontend = new SocketFrontEnd (backend, config);
+ _argc = argc;
+ _argv = argv;
+ }
+ }
+
+ void scim_frontend_module_run (void)
+ {
+ struct tms tiks_buf;
+ clock_t start = times (&tiks_buf);
+ if (!_scim_frontend.null ()) {
+ SCIM_DEBUG_FRONTEND(1) << "Starting Socket FrontEnd module...\n";
+ _scim_frontend->init (_argc, _argv);
+ gettime (start, "Init socket frontend");
+ _scim_frontend->run ();
+ }
+ }
+}
+
+/**
+ * To reduce the number of the servers, we merge the function of
+ * HelperManager process into the SocketFrontEnd.
+*/
+
+typedef std::vector < std::pair <HelperInfo, String> > HelperRepository;
+
+static HelperRepository __helpers;
+static std::vector<String> __load_engine_list;
+
+void SocketFrontEnd::load_helper_modules (const std::vector<String> &load_engine_list)
+{
+ SCIM_DEBUG_MAIN (1) << "load_helper_modules ()\n";
+
+ size_t i;
+
+ __load_engine_list.clear ();
+ for (i = 0; i < load_engine_list.size (); ++i)
+ __load_engine_list.push_back (load_engine_list [i]);
+
+ std::vector <String> mod_list;
+ std::vector <String> all_helper_list;
+
+ scim_get_helper_module_list (all_helper_list);
+
+ // Get the helper module list which should be loaded.
+ if (load_engine_list.size () && all_helper_list.size ()) {
+ for (i = 0; i < all_helper_list.size (); ++i) {
+ if (std::find (load_engine_list.begin (),
+ load_engine_list.end (),
+ all_helper_list [i]) != load_engine_list.end ())
+ mod_list.push_back (all_helper_list [i]);
+ }
+ }
+
+ if (mod_list.size ()) {
+ HelperInfo info;
+ std::vector<ISEINFO> info_list;
+ std::vector<String> tmp_list;
+ isf_read_ise_info_list (USER_ENGINE_FILE_NAME, info_list);
+ for (size_t i = 0; i < info_list.size (); ++i) {
+ if (info_list [i].mode != TOOLBAR_HELPER_MODE)
+ continue;
+ if (std::find (mod_list.begin (), mod_list.end (), info_list [i].module) != mod_list.end ()) {
+ info.uuid = info_list [i].uuid;
+ info.name = info_list [i].name;
+ info.icon = info_list [i].icon;
+ info.option = info_list [i].option;
+ SCIM_DEBUG_MAIN (3) << " " << info.uuid << ": " << info.name << "\n";
+ __helpers.push_back (std::make_pair (info, info_list [i].module));
+ tmp_list.push_back (info_list [i].module);
+ }
+ }
+
+ HelperModule module;
+
+ for (size_t i = 0; i < mod_list.size (); ++i) {
+ if (std::find (tmp_list.begin (), tmp_list.end (), mod_list [i]) != tmp_list.end ())
+ continue;
+
+ SCIM_DEBUG_MAIN (2) << " Load module: " << mod_list [i] << "\n";
+
+ if (module.load (mod_list [i]) && module.valid ()) {
+ size_t num = module.number_of_helpers ();
+
+ SCIM_DEBUG_MAIN (2) << " Find " << num << " Helpers:\n";
+
+ for (size_t j = 0; j < num; ++j) {
+ if (module.get_helper_info (j, info)) {
+ SCIM_DEBUG_MAIN (3) << " " << info.uuid << ": " << info.name << "\n";
+ __helpers.push_back (std::make_pair (info, mod_list [i]));
+ }
+ }
+ }
+
+ module.unload ();
+ }
+ }
+}
+
+void SocketFrontEnd::get_helper_list (const Socket &client)
+{
+ HelperRepository::iterator it = __helpers.begin ();
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32)__helpers.size ());
+
+ for (; it != __helpers.end (); ++it) {
+ m_send_trans.put_data (it->first.uuid);
+ m_send_trans.put_data (it->first.name);
+ m_send_trans.put_data (it->first.icon);
+ m_send_trans.put_data (it->first.description);
+ m_send_trans.put_data (it->first.option);
+ }
+}
+
+#ifndef SCIM_HELPER_LAUNCHER_PROGRAM
+ #define SCIM_HELPER_LAUNCHER_PROGRAM (SCIM_LIBEXECDIR "/scim-helper-launcher")
+#endif
+static std::vector<String> __active_helpers;
+
+void SocketFrontEnd::run_helper (const Socket &client)
+{
+ String uuid;
+ String config;
+ String display;
+ if (!(m_receive_trans.get_data (uuid) && uuid.length ()
+ && m_receive_trans.get_data (config)
+ && m_receive_trans.get_data (display)))
+ {
+ m_send_trans.put_command (SCIM_TRANS_CMD_FAIL);
+ return;
+ }
+
+ for (size_t i = 0; i < __helpers.size (); ++i) {
+ if (__helpers [i].first.uuid == uuid && __helpers [i].second.length ()) {
+
+ __active_helpers.push_back(__helpers [i].first.name);
+
+ int pid;
+
+ pid = fork ();
+
+ if (pid < 0) return;
+
+ if (pid == 0) {
+ const char *argv [] = { SCIM_HELPER_LAUNCHER_PROGRAM,
+ "--daemon",
+ "--config", const_cast<char*> (config.c_str ()),
+ "--display", const_cast<char*> (display.c_str ()),
+ const_cast<char*> (__helpers [i].second.c_str ()),
+ const_cast<char*> (__helpers [i].first.uuid.c_str ()),
+ 0};
+
+ SCIM_DEBUG_MAIN(2) << " Call scim-helper-launcher.\n";
+
+ execv (SCIM_HELPER_LAUNCHER_PROGRAM, (char **)argv);
+ exit (-1);
+ }
+
+ //int status;
+ //waitpid (pid, &status, 0);
+
+ break;
+ }
+ }
+
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ SCIM_DEBUG_MAIN(2) << " exit run_helper ().\n";
+}
+
+/**
+ * get_active_ise_list
+ * Get the active ise list. we can control the loading of ISEs through
+ * the command option "-e" of scim process.
+ */
+void
+SocketFrontEnd::get_active_ise_list (int clientid)
+{
+ m_send_trans.put_data (__load_engine_list);
+}
+
+void
+SocketFrontEnd::unregister_helper ()
+{
+ String name;
+ if (m_receive_trans.get_data (name) && name.length ())
+ {
+ std::vector<String>::iterator iter = __active_helpers.begin ();
+ for (; iter != __active_helpers.end (); iter++)
+ {
+ if (!name.compare (*iter))
+ {
+ __active_helpers.erase (iter);
+ break;
+ }
+ }
+ }
+
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+}
+
+SocketFrontEnd::SocketFrontEnd (const BackEndPointer &backend,
+ const ConfigPointer &config)
+ : FrontEndBase (backend),
+ m_config (config),
+ m_stay (true),
+ m_config_readonly (false),
+ m_socket_timeout (scim_get_default_socket_timeout ()),
+ m_current_instance (-1),
+ m_current_socket_client (-1),
+ m_current_socket_client_key (0)
+{
+ SCIM_DEBUG_FRONTEND (2) << " Constructing SocketFrontEnd object...\n";
+}
+
+SocketFrontEnd::~SocketFrontEnd ()
+{
+ SCIM_DEBUG_FRONTEND (2) << " Destructing SocketFrontEnd object...\n";
+ if (m_socket_server.is_running ())
+ m_socket_server.shutdown ();
+}
+
+void
+SocketFrontEnd::show_preedit_string (int id)
+{
+ if (m_current_instance == id)
+ m_send_trans.put_command (SCIM_TRANS_CMD_SHOW_PREEDIT_STRING);
+}
+
+void
+SocketFrontEnd::show_aux_string (int id)
+{
+ if (m_current_instance == id)
+ m_send_trans.put_command (SCIM_TRANS_CMD_SHOW_AUX_STRING);
+}
+
+void
+SocketFrontEnd::show_lookup_table (int id)
+{
+ if (m_current_instance == id)
+ m_send_trans.put_command (SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE);
+}
+
+void
+SocketFrontEnd::hide_preedit_string (int id)
+{
+ if (m_current_instance == id)
+ m_send_trans.put_command (SCIM_TRANS_CMD_HIDE_PREEDIT_STRING);
+}
+
+void
+SocketFrontEnd::hide_aux_string (int id)
+{
+ if (m_current_instance == id)
+ m_send_trans.put_command (SCIM_TRANS_CMD_HIDE_AUX_STRING);
+}
+
+void
+SocketFrontEnd::hide_lookup_table (int id)
+{
+ if (m_current_instance == id)
+ m_send_trans.put_command (SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE);
+}
+
+void
+SocketFrontEnd::update_preedit_caret (int id, int caret)
+{
+ if (m_current_instance == id) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET);
+ m_send_trans.put_data ((uint32) caret);
+ }
+}
+
+void
+SocketFrontEnd::update_preedit_string (int id,
+ const WideString & str,
+ const AttributeList & attrs)
+{
+ if (m_current_instance == id) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
+ m_send_trans.put_data (str);
+ m_send_trans.put_data (attrs);
+ }
+}
+
+void
+SocketFrontEnd::update_aux_string (int id,
+ const WideString & str,
+ const AttributeList & attrs)
+{
+ if (m_current_instance == id) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_AUX_STRING);
+ m_send_trans.put_data (str);
+ m_send_trans.put_data (attrs);
+ }
+}
+
+void
+SocketFrontEnd::commit_string (int id, const WideString & str)
+{
+ if (m_current_instance == id) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_COMMIT_STRING);
+ m_send_trans.put_data (str);
+ }
+}
+
+void
+SocketFrontEnd::forward_key_event (int id, const KeyEvent & key)
+{
+ if (m_current_instance == id) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_FORWARD_KEY_EVENT);
+ m_send_trans.put_data (key);
+ }
+}
+
+void
+SocketFrontEnd::update_lookup_table (int id, const LookupTable & table)
+{
+ if (m_current_instance == id) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE);
+ m_send_trans.put_data (table);
+ }
+}
+
+void
+SocketFrontEnd::register_properties (int id, const PropertyList &properties)
+{
+ if (m_current_instance == id) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_REGISTER_PROPERTIES);
+ m_send_trans.put_data (properties);
+ }
+}
+
+void
+SocketFrontEnd::update_property (int id, const Property &property)
+{
+ if (m_current_instance == id) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_PROPERTY);
+ m_send_trans.put_data (property);
+ }
+}
+
+void
+SocketFrontEnd::beep (int id)
+{
+ if (m_current_instance == id) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_BEEP);
+ }
+}
+
+void
+SocketFrontEnd::start_helper (int id, const String &helper_uuid)
+{
+ SCIM_DEBUG_FRONTEND (2) << "start_helper (" << helper_uuid << ")\n";
+ if (m_current_instance == id) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_START_HELPER);
+ m_send_trans.put_data (helper_uuid);
+ }
+}
+
+void
+SocketFrontEnd::stop_helper (int id, const String &helper_uuid)
+{
+ SCIM_DEBUG_FRONTEND (2) << "stop_helper (" << helper_uuid << ")\n";
+
+ if (m_current_instance == id) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_STOP_HELPER);
+ m_send_trans.put_data (helper_uuid);
+ }
+}
+
+void
+SocketFrontEnd::send_helper_event (int id, const String &helper_uuid, const Transaction &trans)
+{
+ if (m_current_instance == id) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_SEND_HELPER_EVENT);
+ m_send_trans.put_data (helper_uuid);
+ m_send_trans.put_data (trans);
+ }
+}
+
+bool
+SocketFrontEnd::get_surrounding_text (int id, WideString &text, int &cursor, int maxlen_before, int maxlen_after)
+{
+ text.clear ();
+ cursor = 0;
+
+ if (m_current_instance == id && m_current_socket_client >= 0 && (maxlen_before != 0 || maxlen_after != 0)) {
+ if (maxlen_before < 0) maxlen_before = -1;
+ if (maxlen_after < 0) maxlen_after = -1;
+
+ m_temp_trans.clear ();
+ m_temp_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_temp_trans.put_command (SCIM_TRANS_CMD_GET_SURROUNDING_TEXT);
+ m_temp_trans.put_data ((uint32) maxlen_before);
+ m_temp_trans.put_data ((uint32) maxlen_after);
+
+ Socket socket_client (m_current_socket_client);
+
+ if (m_temp_trans.write_to_socket (socket_client) &&
+ m_temp_trans.read_from_socket (socket_client, m_socket_timeout)) {
+
+ int cmd;
+ uint32 key;
+ uint32 cur;
+
+ if (m_temp_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REQUEST &&
+ m_temp_trans.get_data (key) && key == m_current_socket_client_key &&
+ m_temp_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_GET_SURROUNDING_TEXT &&
+ m_temp_trans.get_data (text) && m_temp_trans.get_data (cur)) {
+ cursor = (int) cur;
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+bool
+SocketFrontEnd::delete_surrounding_text (int id, int offset, int len)
+{
+ if (m_current_instance == id && m_current_socket_client >= 0 && len > 0) {
+ m_temp_trans.clear ();
+ m_temp_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_temp_trans.put_command (SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
+ m_temp_trans.put_data ((uint32) offset);
+ m_temp_trans.put_data ((uint32) len);
+
+ Socket socket_client (m_current_socket_client);
+
+ if (m_temp_trans.write_to_socket (socket_client) &&
+ m_temp_trans.read_from_socket (socket_client, m_socket_timeout)) {
+
+ int cmd;
+ uint32 key;
+
+ if (m_temp_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REQUEST &&
+ m_temp_trans.get_data (key) && key == m_current_socket_client_key &&
+ m_temp_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT &&
+ m_temp_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK)
+ return true;
+ }
+ }
+ return false;
+}
+
+void
+SocketFrontEnd::init (int argc, char **argv)
+{
+ int max_clients = -1;
+
+ std::vector<String> engine_list;
+
+ if (!m_config.null ()) {
+ String str;
+
+ m_config_readonly = m_config->read (String (SCIM_CONFIG_FRONTEND_SOCKET_CONFIG_READONLY), false);
+
+ max_clients = m_config->read (String (SCIM_CONFIG_FRONTEND_SOCKET_MAXCLIENTS), -1);
+
+ m_config->signal_connect_reload (slot (this, &SocketFrontEnd::reload_config_callback));
+ } else {
+ m_config_readonly = false;
+ max_clients = -1;
+ }
+
+ if (!m_socket_server.create (scim_get_default_socket_frontend_address ()))
+ throw FrontEndError ("SocketFrontEnd -- Cannot create SocketServer.");
+
+ m_socket_server.set_max_clients (max_clients);
+
+ m_socket_server.signal_connect_accept (
+ slot (this, &SocketFrontEnd::socket_accept_callback));
+
+ m_socket_server.signal_connect_receive (
+ slot (this, &SocketFrontEnd::socket_receive_callback));
+
+ m_socket_server.signal_connect_exception(
+ slot (this, &SocketFrontEnd::socket_exception_callback));
+
+ if (argv && argc > 1) {
+ for (int i = 1; i < argc && argv [i]; ++i) {
+ if (String ("-e") == argv [i] || String ("--engines") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "No argument for option " << argv [i-1] << "\n";
+ break;
+ }
+ if (String (argv [i]) != "none") {
+ scim_split_string_list (engine_list, String (argv [i]), ',');
+ }
+ continue;
+ }
+ if (String ("--no-stay") == argv [i])
+ m_stay = false;
+ }
+ }
+
+ load_helper_modules (engine_list);
+
+ /**
+ * initialize the random number generator.
+ */
+ srand (time (0));
+
+ signal (SIGCHLD, SIG_IGN);
+}
+
+void
+SocketFrontEnd::run ()
+{
+ if (m_socket_server.valid ())
+ m_socket_server.run ();
+}
+
+uint32
+SocketFrontEnd::generate_key () const
+{
+ return (uint32)rand ();
+}
+
+bool
+SocketFrontEnd::check_client_connection (const Socket &client) const
+{
+ SCIM_DEBUG_FRONTEND (1) << "check_client_connection (" << client.get_id () << ").\n";
+
+ unsigned char buf [sizeof(uint32)];
+
+ int nbytes = client.read_with_timeout (buf, sizeof(uint32), m_socket_timeout);
+
+ if (nbytes == sizeof (uint32))
+ return true;
+
+ if (nbytes < 0) {
+ SCIM_DEBUG_FRONTEND (2) << " Error occurred when reading socket (" << client.get_id ()
+ << "):" << client.get_error_message () << "\n";
+ } else {
+ SCIM_DEBUG_FRONTEND (2) << " Timeout when reading socket (" << client.get_id ()
+ << ").\n";
+ }
+
+ return false;
+}
+
+void
+SocketFrontEnd::socket_accept_callback (SocketServer *server, const Socket &client)
+{
+ SCIM_DEBUG_FRONTEND (1) << "socket_accept_callback (" << client.get_id () << ").\n";
+}
+
+void
+SocketFrontEnd::socket_receive_callback (SocketServer *server, const Socket &client)
+{
+ int id = client.get_id ();
+ int cmd;
+ uint32 key;
+ bool reply = true;
+
+ ClientInfo client_info;
+
+ SCIM_DEBUG_FRONTEND (1) << "socket_receive_callback (" << id << ").\n";
+
+ // Check if the client is closed.
+ if (!check_client_connection (client)) {
+ SCIM_DEBUG_FRONTEND (2) << " closing client connection.\n";
+ socket_close_connection (server, client);
+ return;
+ }
+
+ client_info = socket_get_client_info (client);
+
+ // If it's a new client, then request to open the connection first.
+ if (client_info.type == UNKNOWN_CLIENT) {
+ socket_open_connection (server, client);
+ return;
+ }
+
+ // If can not read the transaction,
+ // or the transaction is not started with SCIM_TRANS_CMD_REQUEST,
+ // or the key is mismatch,
+ // just return.
+ if (!m_receive_trans.read_from_socket (client, m_socket_timeout) ||
+ !m_receive_trans.get_command (cmd) || cmd != SCIM_TRANS_CMD_REQUEST ||
+ !m_receive_trans.get_data (key) || key != (uint32) client_info.key)
+ return;
+
+ m_current_socket_client = id;
+ m_current_socket_client_key = key;
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+
+ // Move the read ptr to the end.
+ if (!m_send_trans.get_command (cmd))
+ return;
+
+ while (m_receive_trans.get_command (cmd)) {
+ if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT)
+ socket_process_key_event (id);
+ else if (cmd == SCIM_TRANS_CMD_MOVE_PREEDIT_CARET)
+ socket_move_preedit_caret (id);
+ else if (cmd == ISM_TRANS_CMD_SELECT_AUX)
+ socket_select_aux (id);
+ else if (cmd == SCIM_TRANS_CMD_SELECT_CANDIDATE)
+ socket_select_candidate (id);
+ else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE)
+ socket_update_lookup_table_page_size (id);
+ else if (cmd == SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP)
+ socket_lookup_table_page_up (id);
+ else if (cmd == SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN)
+ socket_lookup_table_page_down (id);
+ else if (cmd == ISM_TRANS_CMD_RESET_ISE_OPTION)
+ socket_reset_option (id);
+ else if (cmd == SCIM_TRANS_CMD_RESET)
+ socket_reset (id);
+ else if (cmd == SCIM_TRANS_CMD_FOCUS_IN)
+ socket_focus_in (id);
+ else if (cmd == SCIM_TRANS_CMD_FOCUS_OUT)
+ socket_focus_out (id);
+ else if (cmd == SCIM_TRANS_CMD_TRIGGER_PROPERTY)
+ socket_trigger_property (id);
+ else if (cmd == SCIM_TRANS_CMD_PROCESS_HELPER_EVENT)
+ socket_process_helper_event (id);
+ else if (cmd == SCIM_TRANS_CMD_UPDATE_CLIENT_CAPABILITIES)
+ socket_update_client_capabilities (id);
+ else if (cmd == SCIM_TRANS_CMD_GET_FACTORY_LIST)
+ socket_get_factory_list (id);
+ else if (cmd == SCIM_TRANS_CMD_GET_FACTORY_NAME)
+ socket_get_factory_name (id);
+ else if (cmd == SCIM_TRANS_CMD_GET_FACTORY_AUTHORS)
+ socket_get_factory_authors (id);
+ else if (cmd == SCIM_TRANS_CMD_GET_FACTORY_CREDITS)
+ socket_get_factory_credits (id);
+ else if (cmd == SCIM_TRANS_CMD_GET_FACTORY_HELP)
+ socket_get_factory_help (id);
+ else if (cmd == SCIM_TRANS_CMD_GET_FACTORY_LOCALES)
+ socket_get_factory_locales (id);
+ else if (cmd == SCIM_TRANS_CMD_GET_FACTORY_ICON_FILE)
+ socket_get_factory_icon_file (id);
+ else if (cmd == SCIM_TRANS_CMD_GET_FACTORY_LANGUAGE)
+ socket_get_factory_language (id);
+ else if (cmd == SCIM_TRANS_CMD_NEW_INSTANCE)
+ socket_new_instance (id);
+ else if (cmd == SCIM_TRANS_CMD_DELETE_INSTANCE)
+ socket_delete_instance (id);
+ else if (cmd == SCIM_TRANS_CMD_DELETE_ALL_INSTANCES)
+ socket_delete_all_instances (id);
+ else if (cmd == SCIM_TRANS_CMD_FLUSH_CONFIG)
+ socket_flush_config (id);
+ else if (cmd == SCIM_TRANS_CMD_ERASE_CONFIG)
+ socket_erase_config (id);
+ else if (cmd == SCIM_TRANS_CMD_RELOAD_CONFIG)
+ socket_reload_config (id);
+ else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_STRING)
+ socket_get_config_string (id);
+ else if (cmd == SCIM_TRANS_CMD_SET_CONFIG_STRING)
+ socket_set_config_string (id);
+ else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_INT)
+ socket_get_config_int (id);
+ else if (cmd == SCIM_TRANS_CMD_SET_CONFIG_INT)
+ socket_set_config_int (id);
+ else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_BOOL)
+ socket_get_config_bool (id);
+ else if (cmd == SCIM_TRANS_CMD_SET_CONFIG_BOOL)
+ socket_set_config_bool (id);
+ else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_DOUBLE)
+ socket_get_config_double (id);
+ else if (cmd == SCIM_TRANS_CMD_SET_CONFIG_DOUBLE)
+ socket_set_config_double (id);
+ else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_VECTOR_STRING)
+ socket_get_config_vector_string (id);
+ else if (cmd == SCIM_TRANS_CMD_SET_CONFIG_VECTOR_STRING)
+ socket_set_config_vector_string (id);
+ else if (cmd == SCIM_TRANS_CMD_GET_CONFIG_VECTOR_INT)
+ socket_get_config_vector_int (id);
+ else if (cmd == SCIM_TRANS_CMD_SET_CONFIG_VECTOR_INT)
+ socket_set_config_vector_int (id);
+ else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_LIST)
+ get_active_ise_list (id);
+ else if (cmd == SCIM_TRANS_CMD_LOAD_FILE)
+ socket_load_file (id);
+ else if (cmd == SCIM_TRANS_CMD_CLOSE_CONNECTION) {
+ socket_close_connection (server, client);
+ m_current_socket_client = -1;
+ m_current_socket_client_key = 0;
+ return;
+ }else if(cmd == SCIM_TRANS_CMD_HELPER_MANAGER_GET_HELPER_LIST) {
+ SCIM_DEBUG_FRONTEND (1) << "receive cmd SCIM_TRANS_CMD_HELPER_MANAGER_GET_HELPER_LIST\n";
+ get_helper_list (client);
+ } else if (cmd == SCIM_TRANS_CMD_HELPER_MANAGER_RUN_HELPER) {
+ SCIM_DEBUG_FRONTEND (1) << "receive cmd SCIM_TRANS_CMD_HELPER_MANAGER_RUN_HELPER\n";
+ reply = false;
+ run_helper (client);
+ } else if (cmd == SCIM_TRANS_CMD_HELPER_MANAGER_STOP_HELPER) {
+ SCIM_DEBUG_FRONTEND (1) << "receive cmd SCIM_TRANS_CMD_HELPER_MANAGER_STOP_HELPER\n";
+ unregister_helper ();
+ } else if (cmd == SCIM_TRANS_CMD_HELPER_MANAGER_SEND_DISPLAY) {
+ SCIM_DEBUG_FRONTEND (1) << "receive cmd SCIM_TRANS_CMD_HELPER_MANAGER_SEND_DISPLAY\n";
+ socket_set_display_name (id);
+ } else if (cmd == SCIM_TRANS_CMD_HELPER_MANAGER_SEND_ISE_LIST) {
+ SCIM_DEBUG_FRONTEND (1) << "receive cmd SCIM_TRANS_CMD_HELPER_MANAGER_SEND_ISE_LIST\n";
+ reply = false;
+ socket_update_ise_list (id);
+ } else if (cmd == ISM_TRANS_CMD_TURN_ON_LOG) {
+ SCIM_DEBUG_FRONTEND (1) << "receive cmd ISM_TRANS_CMD_TURN_ON_LOG\n";
+ socket_turn_on_log (id);
+ }
+ }
+
+ // Send reply to client
+ if (m_send_trans.get_data_type () == SCIM_TRANS_DATA_UNKNOWN)
+ m_send_trans.put_command (SCIM_TRANS_CMD_FAIL);
+
+ if (reply)
+ m_send_trans.write_to_socket (client);
+
+ m_current_socket_client = -1;
+ m_current_socket_client_key = 0;
+
+ SCIM_DEBUG_FRONTEND (1) << "End of socket_receive_callback (" << id << ").\n";
+}
+
+bool
+SocketFrontEnd::socket_open_connection (SocketServer *server, const Socket &client)
+{
+ SCIM_DEBUG_FRONTEND (2) << " Open socket connection for client " << client.get_id () << " number of clients=" << m_socket_client_repository.size () << ".\n";
+
+ uint32 key;
+ String type = scim_socket_accept_connection (key,
+ String ("SocketFrontEnd,HelperLauncher"),
+ String ("SocketIMEngine,SocketConfig,HelperManager"),
+ client,
+ m_socket_timeout);
+
+ if (type.length ()) {
+ ClientInfo info;
+ info.key = key;
+ info.type = ((type == "SocketIMEngine") ? IMENGINE_CLIENT
+ : ((type == "SocketConfig") ? CONFIG_CLIENT : HELPER_MANAGER_CLIENT));
+
+ SCIM_DEBUG_MAIN (2) << " Add client to repository. Type=" << type << " key=" << key << "\n";
+ m_socket_client_repository [client.get_id ()] = info;
+ return true;
+ }
+
+ // Client did not pass the registration process, close it.
+ SCIM_DEBUG_FRONTEND (2) << " Failed to create new connection.\n";
+ server->close_connection (client);
+ return false;
+}
+
+void
+SocketFrontEnd::socket_close_connection (SocketServer *server, const Socket &client)
+{
+ SCIM_DEBUG_FRONTEND (2) << " Close client connection " << client.get_id () << " number of clients=" << m_socket_client_repository.size () << ".\n";
+
+ ClientInfo client_info = socket_get_client_info (client);
+
+ server->close_connection (client);
+
+ if (client_info.type != UNKNOWN_CLIENT) {
+ m_socket_client_repository.erase (client.get_id ());
+
+ if (client_info.type == IMENGINE_CLIENT)
+ socket_delete_all_instances (client.get_id ());
+
+ if (!m_socket_client_repository.size () && !m_stay)
+ server->shutdown ();
+ }
+}
+
+SocketFrontEnd::ClientInfo
+SocketFrontEnd::socket_get_client_info (const Socket &client)
+{
+ static ClientInfo null_client = { 0, UNKNOWN_CLIENT };
+ SocketClientRepository::iterator it = m_socket_client_repository.find (client.get_id ());
+
+ if (it != m_socket_client_repository.end ())
+ return it->second;
+
+ return null_client;
+}
+
+void
+SocketFrontEnd::socket_exception_callback (SocketServer *server, const Socket &client)
+{
+ SCIM_DEBUG_FRONTEND (1) << "socket_exception_callback (" << client.get_id () << ").\n";
+
+ socket_close_connection (server, client);
+}
+
+//client_id is client's socket id
+void
+SocketFrontEnd::socket_get_factory_list (int /*client_id*/)
+{
+ String encoding;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_get_factory_list.\n";
+
+ if (m_receive_trans.get_data (encoding)) {
+ std::vector<String> uuids;
+
+ if (encoding == "")
+ get_factory_list (uuids);
+ else
+ get_factory_list_for_encoding (uuids, encoding);
+
+ SCIM_DEBUG_FRONTEND (3) << " Encoding (" << encoding
+ << ") Num(" << uuids.size () << ").\n";
+
+ m_send_trans.put_data (uuids);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+}
+
+void
+SocketFrontEnd::socket_get_factory_name (int /*client_id*/)
+{
+ String sfid;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_get_factory_name.\n";
+
+ if (m_receive_trans.get_data (sfid)) {
+ WideString name = get_factory_name (sfid);
+
+ m_send_trans.put_data (name);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+}
+
+void
+SocketFrontEnd::socket_get_factory_authors (int /*client_id*/)
+{
+ String sfid;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_get_factory_authors.\n";
+
+ if (m_receive_trans.get_data (sfid)) {
+ WideString authors = get_factory_authors (sfid);
+
+ m_send_trans.put_data (authors);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+}
+
+void
+SocketFrontEnd::socket_get_factory_credits (int /*client_id*/)
+{
+ String sfid;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_get_factory_credits.\n";
+
+ if (m_receive_trans.get_data (sfid)) {
+ WideString credits = get_factory_credits (sfid);
+
+ m_send_trans.put_data (credits);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+}
+
+void
+SocketFrontEnd::socket_get_factory_help (int /*client_id*/)
+{
+ String sfid;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_get_factory_help.\n";
+
+ if (m_receive_trans.get_data (sfid)) {
+ WideString help = get_factory_help (sfid);
+
+ m_send_trans.put_data (help);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+}
+
+void
+SocketFrontEnd::socket_get_factory_locales (int /*client_id*/)
+{
+ String sfid;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_get_factory_locales.\n";
+
+ if (m_receive_trans.get_data (sfid)) {
+ String locales = get_factory_locales (sfid);
+
+ SCIM_DEBUG_FRONTEND (3) << " Locales (" << locales << ").\n";
+
+ m_send_trans.put_data (locales);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+}
+
+void
+SocketFrontEnd::socket_get_factory_icon_file (int /*client_id*/)
+{
+ String sfid;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_get_factory_icon_file.\n";
+
+ if (m_receive_trans.get_data (sfid)) {
+ String iconfile = get_factory_icon_file (sfid);
+
+ SCIM_DEBUG_FRONTEND (3) << " ICON File (" << iconfile << ").\n";
+
+ m_send_trans.put_data (iconfile);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+}
+
+void
+SocketFrontEnd::socket_get_factory_language (int /*client_id*/)
+{
+ String sfid;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_get_factory_language.\n";
+
+ if (m_receive_trans.get_data (sfid)) {
+ String language = get_factory_language (sfid);
+
+ SCIM_DEBUG_FRONTEND (3) << " Language (" << language << ").\n";
+
+ m_send_trans.put_data (language);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+}
+
+void
+SocketFrontEnd::socket_new_instance (int client_id)
+{
+ String sfid;
+ String encoding;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_new_instance.\n";
+
+ if (m_receive_trans.get_data (sfid) &&
+ m_receive_trans.get_data (encoding)) {
+ int siid = new_instance (m_config, sfid, encoding);
+
+ // Instance created OK.
+ if (siid >= 0) {
+ SocketInstanceRepository::iterator it =
+ std::lower_bound (m_socket_instance_repository.begin (),
+ m_socket_instance_repository.end (),
+ std::pair <int, int> (client_id, siid));
+
+ if (it == m_socket_instance_repository.end ())
+ m_socket_instance_repository.push_back (std::pair <int, int> (client_id, siid));
+ else
+ m_socket_instance_repository.insert (it, std::pair <int, int> (client_id, siid));
+
+ SCIM_DEBUG_FRONTEND (3) << " InstanceID (" << siid << ").\n";
+
+ m_send_trans.put_data ((uint32)siid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+ }
+}
+
+void
+SocketFrontEnd::socket_delete_instance (int client_id)
+{
+ uint32 siid;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_delete_instance.\n";
+
+ if (m_receive_trans.get_data (siid)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " InstanceID (" << siid << ").\n";
+
+ m_current_instance = (int) siid;
+
+ delete_instance ((int) siid);
+
+ m_current_instance = -1;
+
+ SocketInstanceRepository::iterator it =
+ std::lower_bound (m_socket_instance_repository.begin (),
+ m_socket_instance_repository.end (),
+ std::pair <int, int> (client_id, siid));
+
+ if (it != m_socket_instance_repository.end () &&
+ *it == std::pair <int, int> (client_id, siid))
+ m_socket_instance_repository.erase (it);
+
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+}
+
+void
+SocketFrontEnd::socket_delete_all_instances (int client_id)
+{
+ SCIM_DEBUG_FRONTEND (2) << " socket_delete_all_instances.\n";
+
+ SocketInstanceRepository::iterator it;
+
+ SocketInstanceRepository::iterator lit =
+ std::lower_bound (m_socket_instance_repository.begin (),
+ m_socket_instance_repository.end (),
+ std::pair <int, int> (client_id, 0));
+
+ SocketInstanceRepository::iterator uit =
+ std::upper_bound (m_socket_instance_repository.begin (),
+ m_socket_instance_repository.end (),
+ std::pair <int, int> (client_id, INT_MAX));
+
+ if (lit != uit) {
+ for (it = lit; it != uit; ++it) {
+ m_current_instance = it->second;
+ delete_instance (it->second);
+ }
+ m_current_instance = -1;
+ m_socket_instance_repository.erase (lit, uit);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+}
+
+void
+SocketFrontEnd::socket_process_key_event (int /*client_id*/)
+{
+ uint32 siid;
+ KeyEvent event;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_process_key_event.\n";
+
+ if (m_receive_trans.get_data (siid) &&
+ m_receive_trans.get_data (event)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " SI (" << siid << ") KeyEvent ("
+ << event.code << "," << event.mask << ").\n";
+
+ m_current_instance = (int) siid;
+
+ if (process_key_event ((int) siid, event))
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ else
+ m_send_trans.put_command (SCIM_TRANS_CMD_FAIL);
+
+ m_current_instance = -1;
+ }
+}
+
+void
+SocketFrontEnd::socket_move_preedit_caret (int /*client_id*/)
+{
+ uint32 siid;
+ uint32 caret;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_move_preedit_caret.\n";
+
+ if (m_receive_trans.get_data (siid) &&
+ m_receive_trans.get_data (caret)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " SI (" << siid
+ << ") Caret (" << caret << ").\n";
+
+ m_current_instance = (int) siid;
+
+ move_preedit_caret ((int) siid, caret);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+
+ m_current_instance = -1;
+ }
+}
+
+void
+SocketFrontEnd::socket_select_aux (int /*client_id*/)
+{
+ uint32 siid;
+ uint32 item;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_select_aux.\n";
+
+ if (m_receive_trans.get_data (siid) &&
+ m_receive_trans.get_data (item)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " SI (" << siid << ") Item (" << item << ").\n";
+
+ m_current_instance = (int) siid;
+
+ select_aux ((int) siid, item);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+
+ m_current_instance = -1;
+ }
+}
+
+void
+SocketFrontEnd::socket_select_candidate (int /*client_id*/)
+{
+ uint32 siid;
+ uint32 item;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_select_candidate.\n";
+
+ if (m_receive_trans.get_data (siid) &&
+ m_receive_trans.get_data (item)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " SI (" << siid << ") Item (" << item << ").\n";
+
+ m_current_instance = (int) siid;
+
+ select_candidate ((int) siid, item);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+
+ m_current_instance = -1;
+ }
+}
+
+void
+SocketFrontEnd::socket_update_lookup_table_page_size (int /*client_id*/)
+{
+ uint32 siid;
+ uint32 size;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_update_lookup_table_page_size.\n";
+
+ if (m_receive_trans.get_data (siid) &&
+ m_receive_trans.get_data (size)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " SI (" << siid << ") PageSize (" << size << ").\n";
+
+ m_current_instance = (int) siid;
+
+ update_lookup_table_page_size ((int) siid, size);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+
+ m_current_instance = -1;
+ }
+}
+
+void
+SocketFrontEnd::socket_lookup_table_page_up (int /*client_id*/)
+{
+ uint32 siid;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_lookup_table_page_up.\n";
+
+ if (m_receive_trans.get_data (siid)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " SI (" << siid << ").\n";
+
+ m_current_instance = (int) siid;
+
+ lookup_table_page_up ((int) siid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+
+ m_current_instance = -1;
+ }
+}
+
+void
+SocketFrontEnd::socket_lookup_table_page_down (int /*client_id*/)
+{
+ uint32 siid;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_lookup_table_page_down.\n";
+
+ if (m_receive_trans.get_data (siid)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " SI (" << siid << ").\n";
+
+ m_current_instance = (int) siid;
+
+ lookup_table_page_down ((int) siid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+
+ m_current_instance = -1;
+ }
+}
+
+void
+SocketFrontEnd::socket_reset_option (int /*client_id*/)
+{
+ uint32 siid;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_reset_option.\n";
+
+ if (m_receive_trans.get_data (siid)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " SI (" << siid << ").\n";
+
+ m_current_instance = (int) siid;
+
+ reset_option ((int) siid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+
+ m_current_instance = -1;
+ }
+}
+
+void
+SocketFrontEnd::socket_reset (int /*client_id*/)
+{
+ uint32 siid;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_reset.\n";
+
+ if (m_receive_trans.get_data (siid)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " SI (" << siid << ").\n";
+
+ m_current_instance = (int) siid;
+
+ reset ((int) siid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+
+ m_current_instance = -1;
+ }
+}
+
+void
+SocketFrontEnd::socket_focus_in (int /*client_id*/)
+{
+ uint32 siid;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_focus_in.\n";
+
+ if (m_receive_trans.get_data (siid)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " SI (" << siid << ").\n";
+
+ m_current_instance = (int) siid;
+
+ focus_in ((int) siid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+
+ m_current_instance = -1;
+ }
+}
+
+void
+SocketFrontEnd::socket_focus_out (int /*client_id*/)
+{
+ uint32 siid;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_focus_out.\n";
+
+ if (m_receive_trans.get_data (siid)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " SI (" << siid << ").\n";
+
+ m_current_instance = (int) siid;
+
+ focus_out ((int) siid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+
+ m_current_instance = -1;
+ }
+}
+
+void
+SocketFrontEnd::socket_trigger_property (int /*client_id*/)
+{
+ uint32 siid;
+ String property;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_trigger_property.\n";
+
+ if (m_receive_trans.get_data (siid) &&
+ m_receive_trans.get_data (property)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " SI (" << siid << ").\n";
+
+ m_current_instance = (int) siid;
+
+ trigger_property ((int) siid, property);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+
+ m_current_instance = -1;
+ }
+}
+
+void
+SocketFrontEnd::socket_process_helper_event (int /*client_id*/)
+{
+ uint32 siid;
+ String helper_uuid;
+ Transaction trans;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_process_helper_event.\n";
+
+ if (m_receive_trans.get_data (siid) &&
+ m_receive_trans.get_data (helper_uuid) &&
+ m_receive_trans.get_data (trans)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " SI (" << siid << ").\n";
+
+ m_current_instance = (int) siid;
+
+ process_helper_event ((int) siid, helper_uuid, trans);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+
+ m_current_instance = -1;
+ }
+}
+
+void
+SocketFrontEnd::socket_update_client_capabilities (int /*client_id*/)
+{
+ uint32 siid;
+ uint32 cap;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_update_client_capabilities.\n";
+
+ if (m_receive_trans.get_data (siid) && m_receive_trans.get_data (cap)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " SI (" << siid << ").\n";
+
+ m_current_instance = (int) siid;
+
+ update_client_capabilities ((int) siid, cap);
+
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+
+ m_current_instance = -1;
+ }
+}
+
+
+void
+SocketFrontEnd::socket_flush_config (int /*client_id*/)
+{
+ if (m_config_readonly || m_config.null ())
+ return;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_flush_config.\n";
+
+ if (m_config->flush ())
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+}
+
+void
+SocketFrontEnd::socket_erase_config (int /*client_id*/)
+{
+ if (m_config_readonly || m_config.null ())
+ return;
+
+ String key;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_erase_config.\n";
+
+ if (m_receive_trans.get_data (key)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n";
+
+ if (m_config->erase (key))
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+}
+
+void
+SocketFrontEnd::socket_reload_config (int /*client_id*/)
+{
+ static timeval last_timestamp = {0, 0};
+
+ if (m_config.null ())
+ return;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_reload_config.\n";
+
+ timeval timestamp;
+
+ gettimeofday (×tamp, 0);
+
+ if (timestamp.tv_sec >= last_timestamp.tv_sec)
+ m_config->reload ();
+
+ gettimeofday (&last_timestamp, 0);
+
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+}
+
+void
+SocketFrontEnd::socket_set_display_name (int /*client_id*/)
+{
+ String name;
+
+ if (m_receive_trans.get_data (name) && name.length () > 0)
+ m_display = name;
+
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+}
+
+void
+SocketFrontEnd::socket_update_ise_list (int /*client_id*/)
+{
+ String strName;
+ //std::vector<String> name_list;
+ std::vector<String> imengine_list;
+ std::vector<String> helper_list;
+
+ if (m_receive_trans.get_data (strName) && strName.length () > 0) {
+ //std::cout << "ISE name list:" << strName << "\n";
+ //scim_split_string_list (name_list, strName);
+
+ scim_get_imengine_module_list (imengine_list);
+ scim_get_helper_module_list (helper_list);
+
+ for (size_t i = 0; i < imengine_list.size (); ++i) {
+ if (std::find (__load_engine_list.begin (), __load_engine_list.end (), imengine_list [i]) == __load_engine_list.end ()) {
+ SCIM_DEBUG_FRONTEND (3) << "add_module " << imengine_list [i] << " in " << __FUNCTION__ << "\n";
+ //add_module (m_config, imengine_list [i], true);
+ add_module_info (m_config, imengine_list [i]);
+ __load_engine_list.push_back (imengine_list [i]);
+ }
+ }
+
+ HelperModule module;
+ HelperInfo info;
+ for (size_t i = 0; i < helper_list.size (); ++i) {
+ if (std::find (__load_engine_list.begin (), __load_engine_list.end (), helper_list [i]) == __load_engine_list.end ()) {
+ if (module.load (helper_list [i]) && module.valid ()) {
+ size_t num = module.number_of_helpers ();
+ for (size_t j = 0; j < num; ++j) {
+ if (module.get_helper_info (j, info))
+ __helpers.push_back (std::make_pair (info, helper_list [i]));
+ }
+ __load_engine_list.push_back (helper_list [i]);
+ }
+ module.unload ();
+ }
+ }
+ }
+
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+}
+
+void
+SocketFrontEnd::socket_get_config_string (int /*client_id*/)
+{
+ if (m_config.null ()) return;
+
+ String key;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_get_config_string.\n";
+
+ if (m_receive_trans.get_data (key)) {
+ String value;
+
+ SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n";
+
+ if (m_config->read (key, &value)) {
+ m_send_trans.put_data (value);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+ }
+}
+
+void
+SocketFrontEnd::socket_set_config_string (int /*client_id*/)
+{
+ if (m_config_readonly || m_config.null ())
+ return;
+
+ String key;
+ String value;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_set_config_string.\n";
+
+ if (m_receive_trans.get_data (key) &&
+ m_receive_trans.get_data (value)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n";
+ SCIM_DEBUG_FRONTEND (3) << " Value (" << value << ").\n";
+
+ if (m_config->write (key, value))
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+}
+
+void
+SocketFrontEnd::socket_get_config_int (int /*client_id*/)
+{
+ if (m_config.null ()) return;
+
+ String key;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_get_config_int.\n";
+
+ if (m_receive_trans.get_data (key)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n";
+
+ int value;
+ if (m_config->read (key, &value)) {
+ m_send_trans.put_data ((uint32) value);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+ }
+}
+
+void
+SocketFrontEnd::socket_set_config_int (int /*client_id*/)
+{
+ if (m_config_readonly || m_config.null ())
+ return;
+
+ String key;
+ uint32 value;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_set_config_int.\n";
+
+ if (m_receive_trans.get_data (key) &&
+ m_receive_trans.get_data (value)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n";
+ SCIM_DEBUG_FRONTEND (3) << " Value (" << value << ").\n";
+
+ if (m_config->write (key, (int) value))
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+}
+
+void
+SocketFrontEnd::socket_get_config_bool (int /*client_id*/)
+{
+ if (m_config.null ()) return;
+
+ String key;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_get_config_bool.\n";
+
+ if (m_receive_trans.get_data (key)) {
+ bool value;
+
+ SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n";
+
+ if (m_config->read (key, &value)) {
+ m_send_trans.put_data ((uint32) value);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+ }
+}
+
+void
+SocketFrontEnd::socket_set_config_bool (int /*client_id*/)
+{
+ if (m_config_readonly || m_config.null ())
+ return;
+
+ String key;
+ uint32 value;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_set_config_bool.\n";
+
+ if (m_receive_trans.get_data (key) &&
+ m_receive_trans.get_data (value)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n";
+ SCIM_DEBUG_FRONTEND (3) << " Value (" << value << ").\n";
+
+ if (m_config->write (key, (bool) value))
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+}
+
+void
+SocketFrontEnd::socket_get_config_double (int /*client_id*/)
+{
+ if (m_config.null ()) return;
+
+ String key;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_get_config_double.\n";
+
+ if (m_receive_trans.get_data (key)) {
+ double value;
+
+ SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n";
+
+ if (m_config->read (key, &value)) {
+ char buf [80];
+ snprintf (buf, 79, "%lE", value);
+ m_send_trans.put_data (String (buf));
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+ }
+}
+
+void
+SocketFrontEnd::socket_set_config_double (int /*client_id*/)
+{
+ if (m_config_readonly || m_config.null ())
+ return;
+
+ String key;
+ String str;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_set_config_double.\n";
+
+ if (m_receive_trans.get_data (key) &&
+ m_receive_trans.get_data (str)) {
+ double value;
+ sscanf (str.c_str (), "%lE", &value);
+
+ SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n";
+ SCIM_DEBUG_FRONTEND (3) << " Value (" << value << ").\n";
+
+ if (m_config->write (key, value))
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+}
+
+void
+SocketFrontEnd::socket_get_config_vector_string (int /*client_id*/)
+{
+ if (m_config.null ()) return;
+
+ String key;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_get_config_vector_string.\n";
+
+ if (m_receive_trans.get_data (key)) {
+ std::vector <String> vec;
+
+ SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n";
+
+ if (m_config->read (key, &vec)) {
+ m_send_trans.put_data (vec);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+ }
+}
+
+void
+SocketFrontEnd::socket_set_config_vector_string (int /*client_id*/)
+{
+ if (m_config_readonly || m_config.null ())
+ return;
+
+ String key;
+ std::vector<String> vec;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_set_config_vector_string.\n";
+
+ if (m_receive_trans.get_data (key) &&
+ m_receive_trans.get_data (vec)) {
+
+ SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n";
+
+ if (m_config->write (key, vec))
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+}
+
+void
+SocketFrontEnd::socket_get_config_vector_int (int /*client_id*/)
+{
+ if (m_config.null ()) return;
+
+ String key;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_get_config_vector_int.\n";
+
+ if (m_receive_trans.get_data (key)) {
+ std::vector <int> vec;
+
+ SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n";
+
+ if (m_config->read (key, &vec)) {
+ std::vector <uint32> reply;
+
+ for (uint32 i=0; i<vec.size (); ++i)
+ reply.push_back ((uint32) vec[i]);
+
+ m_send_trans.put_data (reply);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+ }
+}
+
+void
+SocketFrontEnd::socket_set_config_vector_int (int /*client_id*/)
+{
+ if (m_config_readonly || m_config.null ())
+ return;
+
+ String key;
+ std::vector<uint32> vec;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_set_config_vector_int.\n";
+
+ if (m_receive_trans.get_data (key) &&
+ m_receive_trans.get_data (vec)) {
+ std::vector<int> req;
+
+ SCIM_DEBUG_FRONTEND (3) << " Key (" << key << ").\n";
+
+ for (uint32 i=0; i<vec.size (); ++i)
+ req.push_back ((int) vec[i]);
+
+ if (m_config->write (key, req))
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+}
+
+void
+SocketFrontEnd::socket_load_file (int /*client_id*/)
+{
+ String filename;
+ char *bufptr = 0;
+ size_t filesize = 0;
+
+ SCIM_DEBUG_FRONTEND (2) << " socket_load_file.\n";
+
+ if (m_receive_trans.get_data (filename)) {
+ SCIM_DEBUG_FRONTEND (3) << " File (" << filename << ").\n";
+
+ filesize = scim_load_file (filename, &bufptr);
+ if (filesize > 0) {
+ m_send_trans.put_data (bufptr, filesize);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ }
+
+ delete [] bufptr;
+ }
+}
+
+void
+SocketFrontEnd::socket_turn_on_log (int /*client_id*/)
+{
+ uint32 isOn;
+ SCIM_DEBUG_FRONTEND (2) << " socket_turn_on_log.\n";
+
+ if (m_receive_trans.get_data (isOn)) {
+ if (isOn) {
+ DebugOutput::enable_debug (SCIM_DEBUG_AllMask);
+ DebugOutput::set_verbose_level (7);
+ } else {
+ DebugOutput::disable_debug (SCIM_DEBUG_AllMask);
+ DebugOutput::set_verbose_level (0);
+ }
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+ return;
+ }
+
+ m_send_trans.put_command (SCIM_TRANS_CMD_FAIL);
+ return;
+}
+
+void
+SocketFrontEnd::reload_config_callback (const ConfigPointer &config)
+{
+ SCIM_DEBUG_FRONTEND (1) << "Reload configuration.\n";
+
+ int max_clients = -1;
+
+ m_config_readonly = config->read (String (SCIM_CONFIG_FRONTEND_SOCKET_CONFIG_READONLY), false);
+ max_clients = config->read (String (SCIM_CONFIG_FRONTEND_SOCKET_MAXCLIENTS), -1);
+
+ m_socket_server.set_max_clients (max_clients);
+}
+
+/*
+vi:ts=4:nowrap:expandtab
+*/
--- /dev/null
+/**
+ * @file scim_socket_frontend.h
+ * @brief definition of SocketFrontEnd related classes.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_socket_frontend.h,v 1.26 2005/04/14 17:01:56 suzhe Exp $
+ */
+
+#if !defined (__SCIM_SOCKET_FRONTEND_H)
+#define __SCIM_SOCKET_FRONTEND_H
+
+#include "scim_stl_map.h"
+
+using namespace scim;
+
+class SocketFrontEnd : public FrontEndBase
+{
+ enum ClientType {
+ UNKNOWN_CLIENT,
+ IMENGINE_CLIENT,
+ CONFIG_CLIENT,
+ HELPER_MANAGER_CLIENT
+ };
+
+ struct ClientInfo {
+ uint32 key;
+ ClientType type;
+ };
+
+ /**
+ * ::first = socket id, ::second = instance id.
+ */
+ typedef std::vector <std::pair <int, int> > SocketInstanceRepository;
+
+#if SCIM_USE_STL_EXT_HASH_MAP
+ typedef __gnu_cxx::hash_map <int, ClientInfo, __gnu_cxx::hash <int> > SocketClientRepository;
+#elif SCIM_USE_STL_HASH_MAP
+ typedef std::hash_map <int, ClientInfo, std::hash <int> > SocketClientRepository;
+#else
+ typedef std::map <int, ClientInfo> SocketClientRepository;
+#endif
+
+ ConfigPointer m_config;
+ String m_display;
+
+ SocketServer m_socket_server;
+
+ Transaction m_send_trans;
+ Transaction m_receive_trans;
+ Transaction m_temp_trans;
+
+ SocketInstanceRepository m_socket_instance_repository;
+
+ SocketClientRepository m_socket_client_repository;
+
+ bool m_stay;
+
+ bool m_config_readonly;
+
+ int m_socket_timeout;
+
+ int m_current_instance;
+
+ int m_current_socket_client;
+
+ uint32 m_current_socket_client_key;
+
+public:
+ SocketFrontEnd (const BackEndPointer &backend,
+ const ConfigPointer &config);
+
+ virtual ~SocketFrontEnd ();
+
+protected:
+ virtual void show_preedit_string (int id);
+ virtual void show_aux_string (int id);
+ virtual void show_lookup_table (int id);
+
+ virtual void hide_preedit_string (int id);
+ virtual void hide_aux_string (int id);
+ virtual void hide_lookup_table (int id);
+
+ virtual void update_preedit_caret (int id, int caret);
+ virtual void update_preedit_string (int id, const WideString & str, const AttributeList & attrs);
+ virtual void update_aux_string (int id, const WideString & str, const AttributeList & attrs);
+ virtual void commit_string (int id, const WideString & str);
+ virtual void forward_key_event (int id, const KeyEvent & key);
+ virtual void update_lookup_table (int id, const LookupTable & table);
+
+ virtual void register_properties (int id, const PropertyList & properties);
+ virtual void update_property (int id, const Property & property);
+
+ virtual void beep (int id);
+
+ virtual void start_helper (int id, const String &helper_uuid);
+ virtual void stop_helper (int id, const String &helper_uuid);
+ virtual void send_helper_event (int id, const String &helper_uuid, const Transaction &trans);
+
+ virtual bool get_surrounding_text (int id, WideString &text, int &cursor, int maxlen_before, int maxlen_after);
+ virtual bool delete_surrounding_text (int id, int offset, int len);
+
+public:
+ virtual void init (int argc, char **argv);
+ virtual void run ();
+
+private:
+ void load_helper_modules (const std::vector<String> &load_engine_list);
+ void get_helper_list (const Socket &client);
+ void run_helper (const Socket &client);
+
+ void get_active_ise_list (int client_id);
+ void unregister_helper ();
+
+ uint32 generate_key () const;
+
+ bool check_client_connection (const Socket &client) const;
+
+ void socket_accept_callback (SocketServer *server, const Socket &client);
+ void socket_receive_callback (SocketServer *server, const Socket &client);
+ void socket_exception_callback (SocketServer *server, const Socket &client);
+
+ bool socket_open_connection (SocketServer *server, const Socket &client);
+ void socket_close_connection (SocketServer *server, const Socket &client);
+ ClientInfo socket_get_client_info (const Socket &client);
+
+ //client_id is client's socket id
+ void socket_get_factory_list (int client_id);
+ void socket_get_factory_name (int client_id);
+ void socket_get_factory_authors (int client_id);
+ void socket_get_factory_credits (int client_id);
+ void socket_get_factory_help (int client_id);
+ void socket_get_factory_locales (int client_id);
+ void socket_get_factory_icon_file (int client_id);
+ void socket_get_factory_language (int client_id);
+
+ void socket_new_instance (int client_id);
+ void socket_delete_instance (int client_id);
+ void socket_delete_all_instances (int client_id);
+
+ void socket_process_key_event (int client_id);
+ void socket_move_preedit_caret (int client_id);
+ void socket_select_aux (int client_id);
+ void socket_select_candidate (int client_id);
+ void socket_update_lookup_table_page_size (int client_id);
+ void socket_lookup_table_page_up (int client_id);
+ void socket_lookup_table_page_down (int client_id);
+ void socket_reset_option (int client_id);
+ void socket_reset (int client_id);
+ void socket_focus_in (int client_id);
+ void socket_focus_out (int client_id);
+ void socket_trigger_property (int client_id);
+ void socket_process_helper_event (int client_id);
+ void socket_update_client_capabilities (int client_id);
+
+ void socket_flush_config (int client_id);
+ void socket_erase_config (int client_id);
+ void socket_get_config_string (int client_id);
+ void socket_set_config_string (int client_id);
+ void socket_get_config_int (int client_id);
+ void socket_set_config_int (int client_id);
+ void socket_get_config_bool (int client_id);
+ void socket_set_config_bool (int client_id);
+ void socket_get_config_double (int client_id);
+ void socket_set_config_double (int client_id);
+ void socket_get_config_vector_string (int client_id);
+ void socket_set_config_vector_string (int client_id);
+ void socket_get_config_vector_int (int client_id);
+ void socket_set_config_vector_int (int client_id);
+ void socket_reload_config (int client_id);
+ void socket_set_display_name (int client_id);
+ void socket_update_ise_list (int client_id);
+
+ void socket_load_file (int client_id);
+ void socket_turn_on_log (int client_id);
+
+ void reload_config_callback (const ConfigPointer &config);
+};
+
+#endif
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+## Makefile.am -- Process this file with automake to produce Makefile.in
+## Copyright (C) 2002 James Su
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+MAINTAINERCLEANFILES = Makefile.in
+CLEANFILES = *.bak
+EXTRA_DIST = imengine.version-script
+
+INCLUDES = -I$(top_builddir) \
+ -I$(top_builddir)/ism/src \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/ism/src \
+ -I$(top_srcdir)/ism/intl \
+ -I$(top_srcdir)/ism/utils \
+ -DSCIM_DATADIR=\"@SCIM_DATADIR@\" \
+ -DSCIM_LOCALEDIR=\"@SCIM_LOCALEDIR@\" \
+ -DSCIM_SYSCONFDIR=\"@SCIM_SYSCONFDIR@\" \
+ -DSCIM_LIBEXECDIR=\"@SCIM_LIBEXECDIR@\" \
+ -DSCIM_ICONDIR=\"@SCIM_ICONDIR@\" \
+ -DSCIM_MODULE_PATH=\"@SCIM_MODULE_PATH@\" \
+ -DSCIM_TEMPDIR=\"@SCIM_TEMPDIR@\"
+
+if SCIM_BUILD_IMENGINE_SOCKET
+CONFIG_IMENGINE_SOCKET_MODULE = socket.la
+endif
+
+if SCIM_LD_VERSION_SCRIPT
+LD_VERSION_SCRIPT_OPTION="-Wl,--version-script=$(srcdir)/imengine.version-script"
+endif
+
+noinst_HEADERS = scim_socket_imengine.h
+
+moduledir = @SCIM_MODULE_PATH@/$(SCIM_BINARY_VERSION)/IMEngine
+module_LTLIBRARIES = $(CONFIG_IMENGINE_SOCKET_MODULE)
+
+socket_la_SOURCES = scim_socket_imengine.cpp
+
+socket_la_LDFLAGS = -avoid-version \
+ -rpath $(moduledir) \
+ -module \
+ $(LD_VERSION_SCRIPT_OPTION) \
+ @LIBTOOL_EXPORT_OPTIONS@ \
+ @LTLIBINTL@
+
+socket_la_LIBADD = $(top_builddir)/ism/src/libscim@SCIM_EPOCH@.la
+
--- /dev/null
+SCIM_IMENGINE_1.0 {
+ global:
+ extern "C" {
+ *scim_imengine_module_create_factory*;
+ *scim_imengine_module_init*;
+ *scim_module_exit*;
+ *scim_module_init*;
+ };
+
+ local:
+ extern "C++" {
+ scim::*;
+ std::*;
+ __gnu_cxx::*;
+ };
+};
--- /dev/null
+/** @file scim_socket_imengine.cpp
+ * implementation of class SocketFactory and SocketInstance.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_socket_imengine.cpp,v 1.21 2005/07/06 03:57:04 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_IMENGINE
+#define Uses_SCIM_CONFIG_BASE
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_SCIM_SOCKET
+#define Uses_SCIM_TRANSACTION
+#define Uses_C_STDLIB
+#define Uses_SCIM_PANEL_AGENT
+
+
+#include <string.h>
+#include <unistd.h>
+#include "scim_private.h"
+#include "scim.h"
+#include "scim_socket_imengine.h"
+#include "scim_stl_map.h"
+#include "isf_query_utility.h"
+
+
+#define scim_module_init socket_LTX_scim_module_init
+#define scim_module_exit socket_LTX_scim_module_exit
+#define scim_imengine_module_init socket_LTX_scim_imengine_module_init
+#define scim_imengine_module_create_factory socket_LTX_scim_imengine_module_create_factory
+
+#define SCIM_CONFIG_IMENGINE_SOCKET_TIMEOUT "/IMEngine/Socket/Timeout"
+#define SCIM_CONFIG_IMENGINE_SOCKET_ADDRESS "/IMEngine/Socket/Address"
+
+#define SCIM_SOCKET_FRONTEND_DEF_ADDRESS "local:/tmp/scim-socket-frontend"
+
+#ifndef SCIM_TEMPDIR
+ #define SCIM_TEMPDIR "/tmp"
+#endif
+
+using namespace scim;
+
+
+class scim::SocketIMEngineGlobal
+{
+#if SCIM_USE_STL_EXT_HASH_MAP
+typedef __gnu_cxx::hash_map <String, String, scim_hash_string> IconRepository;
+#elif SCIM_USE_STL_HASH_MAP
+typedef std::hash_map <String, String, scim_hash_string> IconRepository;
+#else
+typedef std::map <String, String> IconRepository;
+#endif
+
+ SocketClient m_socket_client;
+ SocketAddress m_socket_address;
+ uint32 m_socket_magic_key;
+ int m_socket_timeout;
+
+ std::vector<String> m_peer_factories;
+
+ IconRepository m_icon_repository;
+
+ Signal0<void> m_signal_reconnect;
+
+public:
+ SocketIMEngineGlobal ();
+ ~SocketIMEngineGlobal ();
+
+ bool create_connection ();
+ unsigned int number_of_factories ();
+ SocketFactory * create_factory (unsigned int index);
+
+ void init_transaction (Transaction &trans);
+ bool send_transaction (Transaction &trans);
+ bool receive_transaction (Transaction &trans);
+
+ void get_ise_info_map (const char *filename);
+ String load_icon (const String &icon);
+
+ Connection connect_reconnect_signal (Slot0<void> *slot_reconnect);
+
+private:
+ void init ();
+ void destroy ();
+
+ void destroy_all_icons ();
+};
+
+static SocketIMEngineGlobal *global = 0;
+static std::map<String, ISEINFO> ise_info_repository;
+
+extern "C" {
+ void scim_module_init (void)
+ {
+ if (!global)
+ global = new SocketIMEngineGlobal;
+ }
+
+ void scim_module_exit (void)
+ {
+ if (global) {
+ delete global;
+ global = 0;
+ }
+ }
+
+ unsigned int scim_imengine_module_init (const ConfigPointer &config)
+ {
+ if (global)
+ return global->number_of_factories ();
+ return 0;
+ }
+
+ IMEngineFactoryPointer scim_imengine_module_create_factory (unsigned int index)
+ {
+ if (!global)
+ return 0;
+
+ SocketFactory *sf = global->create_factory (index);
+
+ if (!sf || !sf->valid ()) {
+ delete sf;
+ sf = 0;
+ }
+
+ return sf;
+ }
+}
+
+namespace scim {
+
+SocketIMEngineGlobal::SocketIMEngineGlobal ()
+ : m_socket_magic_key (0),
+ m_socket_timeout (-1)
+{
+ init ();
+}
+
+SocketIMEngineGlobal::~SocketIMEngineGlobal ()
+{
+ destroy ();
+}
+
+void
+SocketIMEngineGlobal::init ()
+{
+ SCIM_DEBUG_IMENGINE(1) << "Init SocketIMEngine Global.\n";
+
+ String address = scim_get_default_socket_imengine_address ();
+
+ m_socket_timeout = scim_get_default_socket_timeout ();
+ m_socket_address.set_address (address);
+
+ if (!m_socket_address.valid ())
+ return;
+
+ // Connect to SocketFrontEnd.
+ if (!create_connection ()) {
+ SCIM_DEBUG_IMENGINE(2) << " Cannot connect to SocketFrontEnd (" << address << ").\n";
+ return;
+ }
+
+ SCIM_DEBUG_IMENGINE(2) << " Connected to SocketFrontEnd (" << address
+ << ") MagicKey (" << m_socket_magic_key << ").\n";
+
+ // Get IMEngineFactory list.
+ String user_file_name = String (USER_ENGINE_FILE_NAME);
+
+ ise_info_repository.clear ();
+ m_peer_factories.clear ();
+ get_ise_info_map (user_file_name.c_str ());
+}
+
+bool
+SocketIMEngineGlobal::create_connection ()
+{
+ SCIM_DEBUG_IMENGINE(1) << __FUNCTION__ << "...\n";
+
+ // Connect to SocketFrontEnd.
+ if (!m_socket_client.connect (m_socket_address))
+ return false;
+
+ if (!scim_socket_open_connection (m_socket_magic_key,
+ String ("SocketIMEngine"),
+ String ("SocketFrontEnd"),
+ m_socket_client,
+ m_socket_timeout)) {
+ m_socket_client.close ();
+ return false;
+ }
+
+ m_signal_reconnect.emit ();
+
+ return true;
+}
+
+void
+SocketIMEngineGlobal::destroy ()
+{
+ SCIM_DEBUG_IMENGINE(1) << "Destroy SocketIMEngine Global.\n";
+
+ m_socket_client.close ();
+
+ destroy_all_icons ();
+}
+
+unsigned int
+SocketIMEngineGlobal::number_of_factories ()
+{
+ return m_peer_factories.size ();
+}
+
+SocketFactory *
+SocketIMEngineGlobal::create_factory (unsigned int index)
+{
+ if (index < m_peer_factories.size ()) {
+ return new SocketFactory (m_peer_factories [index]);
+ }
+ return 0;
+}
+
+void
+SocketIMEngineGlobal::init_transaction (Transaction &trans)
+{
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_data (m_socket_magic_key);
+}
+
+bool
+SocketIMEngineGlobal::send_transaction (Transaction &trans)
+{
+ return trans.write_to_socket (m_socket_client);
+}
+
+bool
+SocketIMEngineGlobal::receive_transaction (Transaction &trans)
+{
+ return trans.read_from_socket (m_socket_client, m_socket_timeout);
+}
+
+void
+SocketIMEngineGlobal::get_ise_info_map (const char *filename)
+{
+ FILE *engine_list_file = fopen (filename, "r");
+ if (engine_list_file == NULL) {
+ std::cerr << "failed to open " << filename << "\n";
+ return;
+ }
+
+ char buf[MAXLINE];
+
+ while (fgets (buf, MAXLINE, engine_list_file) != NULL && strlen (buf) > 0) {
+ ISEINFO info;
+ isf_get_ise_info_from_string (buf, info);
+
+ if (info.mode == TOOLBAR_KEYBOARD_MODE) {
+ m_peer_factories.push_back (info.uuid);
+ ise_info_repository[info.uuid] = info;
+ }
+ }
+
+ fclose (engine_list_file);
+ return;
+}
+
+String
+SocketIMEngineGlobal::load_icon (const String &icon)
+{
+ String local_icon = icon;
+
+ IconRepository::const_iterator it = m_icon_repository.find (icon);
+
+ // The icon has been loaded, just return the local copy filename.
+ if (it != m_icon_repository.end ())
+ local_icon = it->second;
+
+ // This icon is already available in local system, just return.
+ if (scim_load_file (local_icon, 0) != 0)
+ return local_icon;
+
+ Transaction trans;
+ int cmd;
+ char *bufptr = 0;
+ size_t filesize = 0;
+
+ local_icon = String ("");
+
+ init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_LOAD_FILE);
+ trans.put_data (icon);
+
+ // Load icon file from remote SocketFrontEnd.
+ if (send_transaction (trans) && receive_transaction (trans) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_data (&bufptr, filesize) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) {
+
+ String tempfile;
+ String::size_type pos = icon.rfind (SCIM_PATH_DELIM);
+
+ if (pos != String::npos) {
+ tempfile = icon.substr (pos + 1, String::npos);
+ } else {
+ tempfile = icon;
+ }
+
+ char tmp [80];
+ snprintf (tmp, 80, "%lu", (unsigned long) m_socket_magic_key);
+
+ tempfile = String (SCIM_TEMPDIR) + String (SCIM_PATH_DELIM_STRING) +
+ String ("scim-") + String (tmp) + String ("-") +
+ tempfile;
+
+ SCIM_DEBUG_IMENGINE(1) << "Creating temporary icon file: " << tempfile << "\n";
+
+ std::ofstream os (tempfile.c_str ());
+
+ if (os) {
+ os.write (bufptr, filesize);
+ os.close ();
+
+ // Check if the file is written correctly.
+ if (scim_load_file (tempfile, 0) == filesize) {
+ m_icon_repository [icon] = tempfile;
+ local_icon = tempfile;
+ } else {
+ unlink (tempfile.c_str ());
+ }
+ }
+ }
+
+ delete [] bufptr;
+
+ return local_icon;
+}
+
+Connection
+SocketIMEngineGlobal::connect_reconnect_signal (Slot0<void> *slot_reconnect)
+{
+ return m_signal_reconnect.connect (slot_reconnect);
+}
+
+void
+SocketIMEngineGlobal::destroy_all_icons ()
+{
+ IconRepository::const_iterator it = m_icon_repository.begin ();
+
+ for (; it != m_icon_repository.end (); ++ it) {
+ unlink (it->second.c_str ());
+ }
+
+ m_icon_repository.clear ();
+}
+
+int
+SocketFactory::create_peer_instance (const String &encoding)
+{
+ int cmd;
+ int si_peer_id = -1;
+ uint32 val;
+ Transaction trans;
+
+ SCIM_DEBUG_IMENGINE(1) << "Create IMEngine Instance " << m_peer_uuid << ".\n";
+
+ global->init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_NEW_INSTANCE);
+ trans.put_data (m_peer_uuid);
+ trans.put_data (encoding);
+ if (global->send_transaction (trans)) {
+ if (global->receive_transaction (trans) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_data (val) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) {
+
+ si_peer_id = (int) val;
+ }
+ }
+
+ SCIM_DEBUG_IMENGINE(2) << " IMEngineInstance created (" << si_peer_id << ")\n";
+
+ return si_peer_id;
+}
+
+SocketFactory::SocketFactory (const String &peer_uuid)
+ : m_name (utf8_mbstowcs (_("Unknown"))),
+ m_language (String ("")),
+ m_peer_uuid (peer_uuid),
+ m_icon_file (String ("")),
+ m_ok (false)
+{
+ String locales;
+ String iconfile;
+ Transaction trans;
+
+ SCIM_DEBUG_IMENGINE(1) << "Create SocketFactory " << peer_uuid << ".\n";
+
+ // Get factory name, locales, language and icon file.
+ std::map<String, ISEINFO>::iterator iter;
+ iter = ise_info_repository.find (m_peer_uuid);
+ if (iter != ise_info_repository.end ()) {
+ m_name = utf8_mbstowcs (iter->second.name);
+ set_locales (iter->second.locales);
+ m_language = iter->second.language;
+ //m_icon_file = global->load_icon (iter->second.icon);
+ m_ok = true;
+ } else {
+ m_language.clear ();
+ }
+}
+
+SocketFactory::~SocketFactory ()
+{
+}
+
+WideString
+SocketFactory::get_name () const
+{
+ return m_name;
+}
+
+WideString
+SocketFactory::get_authors () const
+{
+ int cmd;
+ WideString authors;
+ Transaction trans;
+
+ SCIM_DEBUG_IMENGINE(1) << "Get Authors " << m_peer_uuid << ".\n";
+
+ // Get factory authors.
+ for (int retry = 0; retry < 3; ++retry) {
+ global->init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_GET_FACTORY_AUTHORS);
+ trans.put_data (m_peer_uuid);
+
+ if (global->send_transaction (trans) && global->receive_transaction (trans) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_data (authors) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK)
+ break;
+
+ authors = utf8_mbstowcs (_("Unknown"));
+
+ if (!global->create_connection ())
+ break;
+ }
+
+ return authors;
+}
+
+WideString
+SocketFactory::get_credits () const
+{
+ int cmd;
+ WideString credits;
+ Transaction trans;
+
+ SCIM_DEBUG_IMENGINE(1) << "Get Credits " << m_peer_uuid << ".\n";
+
+ // Get factory credits.
+ for (int retry = 0; retry < 3; ++retry) {
+ global->init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_GET_FACTORY_CREDITS);
+ trans.put_data (m_peer_uuid);
+
+ if (global->send_transaction (trans) && global->receive_transaction (trans) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_data (credits) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK)
+ break;
+
+ credits = utf8_mbstowcs (_("Unknown"));
+
+ if (!global->create_connection ())
+ break;
+ }
+
+ return credits;
+}
+
+WideString
+SocketFactory::get_help () const
+{
+ int cmd;
+ WideString help;
+ Transaction trans;
+
+ SCIM_DEBUG_IMENGINE(1) << "Get Help " << m_peer_uuid << ".\n";
+
+ // Get factory help.
+ for (int retry = 0; retry < 3; ++retry) {
+ global->init_transaction (trans);
+ trans.put_command (SCIM_TRANS_CMD_GET_FACTORY_HELP);
+ trans.put_data (m_peer_uuid);
+
+ if (global->send_transaction (trans) && global->receive_transaction (trans) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_data (help) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK)
+ break;
+
+ help = utf8_mbstowcs (_("Unknown"));
+
+ if (!global->create_connection ())
+ break;
+ }
+
+ return help;
+}
+
+String
+SocketFactory::get_uuid () const
+{
+ return m_peer_uuid;
+}
+
+String
+SocketFactory::get_icon_file () const
+{
+ return m_icon_file;
+}
+
+String
+SocketFactory::get_language () const
+{
+ if (m_language.length ())
+ return m_language;
+ else
+ return IMEngineFactoryBase::get_language ();
+}
+
+IMEngineInstancePointer
+SocketFactory::create_instance (const String& encoding, int id)
+{
+ int si_peer_id = create_peer_instance (encoding);
+
+ SCIM_DEBUG_IMENGINE(2) << " IMEngineInstance created (" << si_peer_id << ")\n";
+
+ return new SocketInstance (this, encoding, id, si_peer_id);
+}
+
+SocketInstance::SocketInstance (SocketFactory *factory,
+ const String& encoding,
+ int id,
+ int peer_id)
+ : IMEngineInstanceBase (factory, encoding, id),
+ m_factory (factory),
+ m_peer_id (peer_id)
+{
+ m_signal_reconnect_connection = global->connect_reconnect_signal (slot (this, &SocketInstance::reconnect_callback));
+}
+
+SocketInstance::~SocketInstance ()
+{
+ Transaction trans;
+
+ SCIM_DEBUG_IMENGINE(1) << "Destroy IMEngine Instance " << m_peer_id << ".\n";
+
+ m_signal_reconnect_connection.disconnect ();
+
+ if (m_peer_id >= 0) {
+ global->init_transaction (trans);
+
+ trans.put_command (SCIM_TRANS_CMD_DELETE_INSTANCE);
+ trans.put_data (m_peer_id);
+
+ commit_transaction (trans);
+ }
+}
+
+bool
+SocketInstance::process_key_event (const KeyEvent& key)
+{
+ Transaction trans;
+
+ global->init_transaction (trans);
+
+ SCIM_DEBUG_IMENGINE(1) << "process_key_event (" << m_peer_id << ")\n";
+
+ trans.put_command (SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
+ trans.put_data (m_peer_id);
+ trans.put_data (key);
+
+ return commit_transaction (trans);
+}
+
+void
+SocketInstance::move_preedit_caret (unsigned int pos)
+{
+ Transaction trans;
+
+ global->init_transaction (trans);
+
+ SCIM_DEBUG_IMENGINE(1) << "move_preedit_caret (" << m_peer_id << ")\n";
+
+ trans.put_command (SCIM_TRANS_CMD_MOVE_PREEDIT_CARET);
+ trans.put_data (m_peer_id);
+ trans.put_data ((uint32) pos);
+
+ commit_transaction (trans);
+}
+
+void
+SocketInstance::select_aux (unsigned int item)
+{
+ Transaction trans;
+
+ global->init_transaction (trans);
+
+ SCIM_DEBUG_IMENGINE(1) << "select_aux (" << m_peer_id << ")\n";
+
+ trans.put_command (ISM_TRANS_CMD_SELECT_AUX);
+ trans.put_data (m_peer_id);
+ trans.put_data ((uint32) item);
+
+ commit_transaction (trans);
+}
+
+void
+SocketInstance::select_candidate (unsigned int item)
+{
+ Transaction trans;
+
+ global->init_transaction (trans);
+
+ SCIM_DEBUG_IMENGINE(1) << "select_candidate (" << m_peer_id << ")\n";
+
+ trans.put_command (SCIM_TRANS_CMD_SELECT_CANDIDATE);
+ trans.put_data (m_peer_id);
+ trans.put_data ((uint32) item);
+
+ commit_transaction (trans);
+}
+
+void
+SocketInstance::update_lookup_table_page_size (unsigned int page_size)
+{
+ Transaction trans;
+
+ global->init_transaction (trans);
+
+ SCIM_DEBUG_IMENGINE(1) << "update_lookup_table_page_size (" << m_peer_id << ")\n";
+
+ trans.put_command (SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE);
+ trans.put_data (m_peer_id);
+ trans.put_data ((uint32) page_size);
+
+ commit_transaction (trans);
+}
+
+void
+SocketInstance::lookup_table_page_up ()
+{
+ Transaction trans;
+
+ global->init_transaction (trans);
+
+ SCIM_DEBUG_IMENGINE(1) << "lookup_table_page_up (" << m_peer_id << ")\n";
+
+ trans.put_command (SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP);
+ trans.put_data (m_peer_id);
+
+ commit_transaction (trans);
+}
+
+void
+SocketInstance::lookup_table_page_down ()
+{
+ Transaction trans;
+
+ global->init_transaction (trans);
+
+ SCIM_DEBUG_IMENGINE(1) << "lookup_table_page_up (" << m_peer_id << ")\n";
+
+ trans.put_command (SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN);
+ trans.put_data (m_peer_id);
+
+ commit_transaction (trans);
+}
+
+void
+SocketInstance::reset_option ()
+{
+ Transaction trans;
+
+ global->init_transaction (trans);
+
+ SCIM_DEBUG_IMENGINE(1) << "reset_option (" << m_peer_id << ")\n";
+
+ trans.put_command (ISM_TRANS_CMD_RESET_ISE_OPTION);
+ trans.put_data (m_peer_id);
+
+ commit_transaction (trans);
+}
+
+void
+SocketInstance::reset ()
+{
+ Transaction trans;
+
+ global->init_transaction (trans);
+
+ SCIM_DEBUG_IMENGINE(1) << "reset (" << m_peer_id << ")\n";
+
+ trans.put_command (SCIM_TRANS_CMD_RESET);
+ trans.put_data (m_peer_id);
+
+ commit_transaction (trans);
+}
+
+void
+SocketInstance::focus_in ()
+{
+ Transaction trans;
+
+ global->init_transaction (trans);
+
+ SCIM_DEBUG_IMENGINE(1) << "focus_in (" << m_peer_id << ")\n";
+
+ trans.put_command (SCIM_TRANS_CMD_FOCUS_IN);
+ trans.put_data (m_peer_id);
+
+ commit_transaction (trans);
+}
+
+void
+SocketInstance::focus_out ()
+{
+ Transaction trans;
+
+ global->init_transaction (trans);
+
+ SCIM_DEBUG_IMENGINE(1) << "focus_out (" << m_peer_id << ")\n";
+
+ trans.put_command (SCIM_TRANS_CMD_FOCUS_OUT);
+ trans.put_data (m_peer_id);
+
+ commit_transaction (trans);
+}
+
+void
+SocketInstance::trigger_property (const String &property)
+{
+ Transaction trans;
+
+ global->init_transaction (trans);
+
+ SCIM_DEBUG_IMENGINE(1) << "trigger_property (" << m_peer_id << ", " << property << ")\n";
+
+ trans.put_command (SCIM_TRANS_CMD_TRIGGER_PROPERTY);
+ trans.put_data (m_peer_id);
+ trans.put_data (property);
+
+ commit_transaction (trans);
+}
+
+void
+SocketInstance::process_helper_event (const String &helper_uuid, const Transaction &helper_trans)
+{
+ Transaction trans;
+
+ global->init_transaction (trans);
+
+ SCIM_DEBUG_IMENGINE(1) << "process_helper_event (" << m_peer_id << ", " << helper_uuid << ")\n";
+
+ trans.put_command (SCIM_TRANS_CMD_PROCESS_HELPER_EVENT);
+ trans.put_data (m_peer_id);
+ trans.put_data (helper_uuid);
+ trans.put_data (helper_trans);
+
+ commit_transaction (trans);
+}
+
+void
+SocketInstance::update_client_capabilities (unsigned int cap)
+{
+ Transaction trans;
+
+ global->init_transaction (trans);
+
+ SCIM_DEBUG_IMENGINE(1) << "update_client_capabilities (" << m_peer_id << ", " << cap << ")\n";
+
+ trans.put_command (SCIM_TRANS_CMD_UPDATE_CLIENT_CAPABILITIES);
+ trans.put_data (m_peer_id);
+ trans.put_data ((uint32) cap);
+
+ commit_transaction (trans);
+}
+
+bool
+SocketInstance::commit_transaction (Transaction &trans)
+{
+ SCIM_DEBUG_IMENGINE(2) << " commit_transaction:\n";
+
+ bool ret = false;
+
+ if (m_peer_id >= 0) {
+ if (global->send_transaction (trans)) {
+ while (1) {
+ if (!global->receive_transaction (trans)) break;
+ if (!do_transaction (trans, ret)) return ret;
+ }
+ }
+ }
+
+ if (global->create_connection ())
+ reset ();
+
+ return ret;
+}
+
+bool
+SocketInstance::do_transaction (Transaction &trans, bool &ret)
+{
+ int cmd = -1;
+ bool cont = false;
+
+ ret = false;
+
+ SCIM_DEBUG_IMENGINE(2) << " Do transaction:\n";
+
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY) {
+ while (trans.get_command (cmd)) {
+ switch (cmd) {
+ case SCIM_TRANS_CMD_SHOW_PREEDIT_STRING:
+ {
+ SCIM_DEBUG_IMENGINE(3) << " show_preedit_string ()\n";
+ show_preedit_string ();
+ break;
+ }
+ case SCIM_TRANS_CMD_SHOW_AUX_STRING:
+ {
+ SCIM_DEBUG_IMENGINE(3) << " show_aux_string ()\n";
+ show_aux_string ();
+ break;
+ }
+ case SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE:
+ {
+ SCIM_DEBUG_IMENGINE(3) << " show_lookup_table ()\n";
+ show_lookup_table ();
+ break;
+ }
+ case SCIM_TRANS_CMD_HIDE_PREEDIT_STRING:
+ {
+ SCIM_DEBUG_IMENGINE(3) << " hide_preedit_string ()\n";
+ hide_preedit_string ();
+ break;
+ }
+ case SCIM_TRANS_CMD_HIDE_AUX_STRING:
+ {
+ SCIM_DEBUG_IMENGINE(3) << " hide_aux_string ()\n";
+ hide_aux_string ();
+ break;
+ }
+ case SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE:
+ {
+ SCIM_DEBUG_IMENGINE(3) << " hide_lookup_table ()\n";
+ hide_lookup_table ();
+ break;
+ }
+ case SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET:
+ {
+ uint32 caret;
+ if (trans.get_data (caret)) {
+ SCIM_DEBUG_IMENGINE(3) << " update_preedit_caret (" << caret << ")\n";
+ update_preedit_caret (caret);
+ }
+ break;
+ }
+ case SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING:
+ {
+ WideString str;
+ AttributeList attrs;
+ if (trans.get_data (str) && trans.get_data (attrs)) {
+ SCIM_DEBUG_IMENGINE(3) << " update_preedit_string ()\n";
+ update_preedit_string (str, attrs);
+ }
+ break;
+ }
+ case SCIM_TRANS_CMD_UPDATE_AUX_STRING:
+ {
+ WideString str;
+ AttributeList attrs;
+ if (trans.get_data (str) && trans.get_data (attrs)) {
+ SCIM_DEBUG_IMENGINE(3) << " update_aux_string ()\n";
+ update_aux_string (str, attrs);
+ }
+ break;
+ }
+ case SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE:
+ {
+ CommonLookupTable table;
+ if (trans.get_data (table)) {
+ SCIM_DEBUG_IMENGINE(3) << " update_lookup_table ()\n";
+ update_lookup_table (table);
+ }
+ break;
+ }
+ case SCIM_TRANS_CMD_COMMIT_STRING:
+ {
+ WideString str;
+ if (trans.get_data (str)) {
+ SCIM_DEBUG_IMENGINE(3) << " commit_string ()\n";
+ commit_string (str);
+ }
+ break;
+ }
+ case SCIM_TRANS_CMD_FORWARD_KEY_EVENT:
+ {
+ KeyEvent key;
+ if (trans.get_data (key)) {
+ SCIM_DEBUG_IMENGINE(3) << " forward_key_event ()\n";
+ forward_key_event (key);
+ }
+ break;
+ }
+ case SCIM_TRANS_CMD_REGISTER_PROPERTIES:
+ {
+ PropertyList proplist;
+ if (trans.get_data (proplist)) {
+ SCIM_DEBUG_IMENGINE(3) << " register_properties ()\n";
+
+ // Load icon files of these properties from remote SocketFrontEnd.
+ for (PropertyList::iterator it = proplist.begin (); it != proplist.end (); ++it)
+ it->set_icon (global->load_icon (it->get_icon ()));
+
+ register_properties (proplist);
+ }
+ break;
+ }
+ case SCIM_TRANS_CMD_UPDATE_PROPERTY:
+ {
+ Property prop;
+ if (trans.get_data (prop)) {
+ SCIM_DEBUG_IMENGINE(3) << " update_property ()\n";
+
+ // Load the icon file of this property from remote SocketFrontEnd.
+ prop.set_icon (global->load_icon (prop.get_icon ()));
+
+ update_property (prop);
+ }
+ break;
+ }
+ case SCIM_TRANS_CMD_BEEP:
+ {
+ SCIM_DEBUG_IMENGINE(3) << " beep ()\n";
+ beep ();
+ break;
+ }
+ case SCIM_TRANS_CMD_START_HELPER:
+ {
+ String helper_uuid;
+ if (trans.get_data (helper_uuid)) {
+ SCIM_DEBUG_IMENGINE(3) << " start_helper (" << helper_uuid << ")\n";
+ start_helper (helper_uuid);
+ }
+ break;
+ }
+ case SCIM_TRANS_CMD_STOP_HELPER:
+ {
+ String helper_uuid;
+ if (trans.get_data (helper_uuid)) {
+ SCIM_DEBUG_IMENGINE(3) << " stop_helper (" << helper_uuid << ")\n";
+ stop_helper (helper_uuid);
+ }
+ break;
+ }
+ case SCIM_TRANS_CMD_SEND_HELPER_EVENT:
+ {
+ String helper_uuid;
+ Transaction temp_trans;
+ if (trans.get_data (helper_uuid) && trans.get_data (temp_trans)) {
+ SCIM_DEBUG_IMENGINE(3) << " send_helper_event (" << helper_uuid << ")\n";
+ send_helper_event (helper_uuid, temp_trans);
+ }
+ break;
+ }
+ case SCIM_TRANS_CMD_OK:
+ {
+ SCIM_DEBUG_IMENGINE(3) << " ret = true\n";
+ ret = true;
+ break;
+ }
+ case SCIM_TRANS_CMD_GET_SURROUNDING_TEXT:
+ {
+ WideString text;
+ int cursor;
+ uint32 maxlen_before;
+ uint32 maxlen_after;
+ Transaction temp_trans;
+ if (trans.get_data (maxlen_before) && trans.get_data (maxlen_after)) {
+ global->init_transaction (temp_trans);
+ if (get_surrounding_text (text, cursor, (int) maxlen_before, (int) maxlen_after)) {
+ temp_trans.put_command (SCIM_TRANS_CMD_GET_SURROUNDING_TEXT);
+ temp_trans.put_data (text);
+ temp_trans.put_data ((uint32) cursor);
+ } else {
+ temp_trans.put_command (SCIM_TRANS_CMD_FAIL);
+ }
+ if (!global->send_transaction (temp_trans))
+ std::cerr << "GET_SURROUNDING_TEXT: global->send_transaction () is failed!!!\n";
+ }
+ cont = true;
+ break;
+ }
+ case SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT:
+ {
+ uint32 offset;
+ uint32 len;
+ Transaction temp_trans;
+ if (trans.get_data (offset) && trans.get_data (len)) {
+ global->init_transaction (temp_trans);
+ if (delete_surrounding_text ((int) offset, (int) len)) {
+ temp_trans.put_command (SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
+ temp_trans.put_command (SCIM_TRANS_CMD_OK);
+ } else {
+ temp_trans.put_command (SCIM_TRANS_CMD_FAIL);
+ }
+ if (!global->send_transaction (temp_trans))
+ std::cerr << "DELETE_SURROUNDING_TEXT: global->send_transaction () is failed!!!\n";
+ }
+ cont = true;
+ break;
+ }
+ default:
+ SCIM_DEBUG_IMENGINE(3) << " Strange cmd: " << cmd << "\n";;
+ }
+ }
+ } else {
+ SCIM_DEBUG_IMENGINE(3) << " Failed to get cmd: " << cmd << "\n";
+ }
+
+ SCIM_DEBUG_IMENGINE(2) << " End of Do transaction\n";
+
+ return cont;
+}
+
+void
+SocketInstance::reconnect_callback (void)
+{
+ m_peer_id = m_factory->create_peer_instance (get_encoding ());
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_socket_imengine.h
+ * definition of SocketFactory related classes.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_socket_imengine.h,v 1.13 2005/07/06 03:57:05 suzhe Exp $
+ */
+
+#if !defined (__SCIM_SOCKET_IMENGINE_H)
+#define __SCIM_SOCKET_IMENGINE_H
+
+namespace scim {
+
+class SocketFactory;
+
+class SocketFactory : public IMEngineFactoryBase
+{
+ WideString m_name;
+
+ String m_language;
+
+ String m_peer_uuid;
+
+ String m_icon_file;
+
+ bool m_ok;
+
+ friend class SocketInstance;
+
+public:
+ SocketFactory (const String &peer_uuid);
+
+ bool valid () const { return m_ok; }
+
+ virtual ~SocketFactory ();
+
+ virtual WideString get_name () const;
+ virtual WideString get_authors () const;
+ virtual WideString get_credits () const;
+ virtual WideString get_help () const;
+ virtual String get_uuid () const;
+ virtual String get_icon_file () const;
+ virtual String get_language () const;
+
+ virtual IMEngineInstancePointer create_instance (const String& encoding, int id = -1);
+
+private:
+ int create_peer_instance (const String &encoding);
+};
+
+class SocketInstance : public IMEngineInstanceBase
+{
+ SocketFactory *m_factory;
+ int m_peer_id;
+ Connection m_signal_reconnect_connection;
+
+public:
+ SocketInstance (SocketFactory *factory, const String& encoding, int id, int peer_id);
+ virtual ~SocketInstance ();
+
+ virtual bool process_key_event (const KeyEvent& key);
+ virtual void move_preedit_caret (unsigned int pos);
+ virtual void select_aux (unsigned int item);
+ virtual void select_candidate (unsigned int item);
+ virtual void update_lookup_table_page_size (unsigned int page_size);
+ virtual void lookup_table_page_up ();
+ virtual void lookup_table_page_down ();
+ virtual void reset_option ();
+ virtual void reset ();
+ virtual void focus_in ();
+ virtual void focus_out ();
+ virtual void trigger_property (const String &property);
+ virtual void process_helper_event (const String &helper_uuid, const Transaction &trans);
+ virtual void update_client_capabilities (unsigned int cap);
+
+private:
+ bool commit_transaction (Transaction &trans);
+ bool do_transaction (Transaction &trans, bool &ret);
+ void reconnect_callback (void);
+};
+
+// Forward declaration
+class SocketIMEngineGlobal;
+
+} // namespace scim
+
+#endif
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+## Makefile.am -- Process this file with automake to produce Makefile.in
+## Copyright (C) 2002 James Su
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+MAINTAINERCLEANFILES = Makefile.in scim_types.h
+CLEANFILES = libltdlc.la libscim.la *.bak
+DISTCLEANFILES = scim_types.h
+EXTRA_DIST = libscim.version-script
+
+INCLUDES = -I$(top_builddir) \
+ -I$(top_builddir)/ism/src \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/ism/src \
+ -I$(top_srcdir)/ism/intl \
+ -I$(includedir) \
+ -DISF_VERSION=\"@ISF_VERSION@\" \
+ -DSCIM_BINDIR=\"@SCIM_BINDIR@\" \
+ -DSCIM_DATADIR=\"@SCIM_DATADIR@\" \
+ -DSCIM_LOCALEDIR=\"@SCIM_LOCALEDIR@\" \
+ -DSCIM_SYSCONFDIR=\"@SCIM_SYSCONFDIR@\" \
+ -DSCIM_LIBEXECDIR=\"@SCIM_LIBEXECDIR@\" \
+ -DSCIM_ICONDIR=\"@SCIM_ICONDIR@\" \
+ -DSCIM_MODULE_PATH=\"@SCIM_MODULE_PATH@\"
+
+
+noinst_HEADERS = ltdl.h \
+ scim_private.h \
+ scim_compose_key_data.h \
+ scim_keyboard_layout_data.h \
+ scim_keyevent_data.h \
+ scim_stl_map.h \
+ isf_query_utility.h
+
+libscimincludedir = $(includedir)/scim@SCIM_EPOCH@
+
+libsciminclude_HEADERS = scim.h \
+ scim_attribute.h \
+ scim_backend.h \
+ scim_bind.h \
+ scim_compose_key.h \
+ scim_config_base.h \
+ scim_config_module.h \
+ scim_config_path.h \
+ scim_connection.h \
+ scim_debug.h \
+ scim_event.h \
+ scim_exception.h \
+ scim_filter.h \
+ scim_filter_module.h \
+ scim_filter_manager.h \
+ scim_frontend.h \
+ scim_frontend_module.h \
+ scim_global_config.h \
+ scim_helper.h \
+ scim_helper_manager.h \
+ scim_helper_module.h \
+ scim_hotkey.h \
+ scim_iconv.h \
+ scim_imengine.h \
+ scim_imengine_module.h \
+ scim_lookup_table.h \
+ scim_module.h \
+ scim_object.h \
+ scim_panel_agent.h \
+ scim_panel_client.h \
+ scim_panel_common.h \
+ scim_pointer.h \
+ scim_property.h \
+ scim_signals.h \
+ scim_slot.h \
+ scim_socket.h \
+ scim_trans_commands.h \
+ scim_transaction.h \
+ scim_types.h \
+ scim_utility.h \
+ isf_control.h \
+ isf_imcontrol_client.h \
+ ise_context.h
+
+noinst_LTLIBRARIES = libltdlc.la
+
+libltdlc_la_SOURCES = ltdl.cpp
+libltdlc_la_LIBADD = $(LIBADD_DL)
+
+if SCIM_LD_VERSION_SCRIPT
+LD_VERSION_SCRIPT_OPTION="-Wl,--version-script=$(srcdir)/libscim.version-script"
+endif
+
+lib_LTLIBRARIES = libscim@SCIM_EPOCH@.la
+
+libscim@SCIM_EPOCH@_la_SOURCES = scim_backend.cpp \
+ scim_chartraits.cpp \
+ scim_compose_key.cpp \
+ scim_config_base.cpp \
+ scim_config_module.cpp \
+ scim_connection.cpp \
+ scim_debug.cpp \
+ scim_event.cpp \
+ scim_filter.cpp \
+ scim_filter_module.cpp \
+ scim_filter_manager.cpp \
+ scim_frontend.cpp \
+ scim_frontend_module.cpp \
+ scim_global_config.cpp \
+ scim_helper.cpp \
+ scim_helper_manager.cpp \
+ scim_helper_module.cpp \
+ scim_hotkey.cpp \
+ scim_iconv.cpp \
+ scim_imengine.cpp \
+ scim_imengine_module.cpp \
+ scim_lookup_table.cpp \
+ scim_module.cpp \
+ scim_object.cpp \
+ scim_panel_agent.cpp \
+ scim_panel_client.cpp \
+ scim_private.cpp \
+ scim_signals.cpp \
+ scim_slot.cpp \
+ scim_socket.cpp \
+ scim_transaction.cpp \
+ scim_utility.cpp \
+ isf_control.cpp \
+ isf_imcontrol_client.cpp \
+ isf_query_utility.cpp
+
+libscim@SCIM_EPOCH@_la_CXXFLAGS = @GTK2_CFLAGS@
+
+libscim@SCIM_EPOCH@_la_LDFLAGS = -version-info $(SCIM_CURRENT):$(SCIM_REVISION):$(SCIM_AGE) \
+ -export-dynamic \
+ -rpath $(libdir) \
+ $(LD_VERSION_SCRIPT_OPTION) \
+ @LIBTOOL_EXPORT_OPTIONS@ \
+ @LIBICONV@ \
+ @LTLIBINTL@ \
+ -lstdc++
+
+libscim@SCIM_EPOCH@_la_LIBADD = libltdlc.la
+
+
+bin_PROGRAMS = scim isf-log isf-query-engines
+
+scim_SOURCES = scim.cpp
+scim_LDADD = libscim@SCIM_EPOCH@.la
+scim_LDFLAGS = @LTLIBINTL@
+
+isf_log_SOURCES = isf_log.cpp
+isf_log_LDADD = libscim@SCIM_EPOCH@.la
+if SCIM_BUILD_GTK_UTILS
+isf_log_CXXFLAGS = @GTK2_CFLAGS@
+isf_log_LDFLAGS = @LTLIBINTL@ -rpath $(libdir) -lgtk-x11-2.0 -lgdk-x11-2.0 -lglib-2.0 -lgobject-2.0
+else
+isf_log_LDFLAGS = @LTLIBINTL@ -rpath $(libdir) -lglib-2.0 -lgobject-2.0
+endif
+
+isf_query_engines_SOURCES = isf_query_engines.cpp
+isf_query_engines_CXXFLAGS = @VCONF_CFLAGS@
+isf_query_engines_LDADD = libscim@SCIM_EPOCH@.la
+isf_query_engines_LDFLAGS = @LTLIBINTL@ @VCONF_LIBS@
+
+libexecdir = $(libdir)/scim@SCIM_EPOCH@
+libexec_PROGRAMS = scim-launcher scim-helper-launcher
+
+scim_launcher_SOURCES = scim_launcher.cpp
+scim_launcher_LDADD = libscim@SCIM_EPOCH@.la
+scim_launcher_LDFLAGS = @LTLIBINTL@
+
+scim_helper_launcher_SOURCES = scim_helper_launcher.cpp
+scim_helper_launcher_LDADD = libscim@SCIM_EPOCH@.la
+scim_helper_launcher_LDFLAGS = @LTLIBINTL@
+
+
+
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jihoon Kim <jihoon48.kim@samsung.com>, Haifeng Deng <haifeng.deng@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+/**
+ * @ingroup SLP_PG
+ * @defgroup InputServiceFramework_PG InputServiceFW
+ * @{
+
+ <h1 class="pg">Introduction</h1>
+The Input Service Framework (ISF) is based on the open source project SCIM-1.4.7. The Input Service Framework is capable of supporting advanced input methods like full touch input, voice input, handwriting etc.
+
+ <h2 class="pg">Purpose</h2>
+This document is aimed to describe how to develop application using TIZEN ISE (Input Service Engine) based on the ISF (Input Service Framework). The contents include: the introduction which is whole of the TIZEN ISE sample screen followed in GUI, the introduction of type and interface function of TIZEN ISE developing, and use from some sample application programs.
+
+ <h2 class="pg">Scope</h2>
+The intention is that this document will provide a guide to enable the application programmer to be familiar with using TIZEN ISE as soon as possible. In this document it will only cover part of TIZEN ISE APIs, which are close to the development of ISF and other ISE.
+
+<h2 class="pg">Intended Readers</h2>
+This document is intended for the TIZEN ISE application programmer and the related project managers. (Actually, this document is focused on application developer who uses TIZEN ISE).
+
+<h2 class="pg">Abbreviations</h2>
+- ISF - Input Service Framework
+- ISE - Input Service Engine
+
+<h2 class="pg">Abstract</h2>
+ISF is to monitor and handle all the input events and provide the input service to meet the requirement of applications. Then how does the application to get the input service of ISEs. For KeyboardISE and TouchISE, the interface is the ISF implementation of STKImControl. So the application programmer can easily program to the interface of STKImControl to get the service.
+The application programmer who wants to use the traditional input service (like keyboard, soft-keyboard) does not need to change any code.
+@}
+
+@defgroup ISF_Architecture Architecture
+@ingroup InputServiceFramework_PG
+@{
+ <h1 class="pg">Architecture</h1>
+@image html TIZEN_ISF_PG_architecture.png
+<center><b>Figure.</b> UI Framework Architecture Diagram</center>
+
+<h2 class="pg">UI Framework</h2>
+The UI framework is a middleware that consists of several modules like UI toolkit and Document-View framework (for building work-based application user interface), UI Contention manager (which implements various UI policies regarding screen state management), resource manager (which manages application and system resources), , font system, Flash engine (which takes care of 3D screens in applications), Input service framework, and windowing and graphics (including Vector, and raster graphics) system.
+
+@image html TIZEN_ISF_PG_isf_diagram.png
+<center><b>Figure.</b> UI Framework Architecture Diagram</center>
+
+<h2 class="pg">ISF</h2>
+The Input Service Framework (ISF) is an abstraction layer with a well defined interface to allow text editor widgets to utilize the input methods. It is the responsibility of the widgets to request the assistance of the ISF, through the exported interface layer (Ecore IMF/GtkIM).
+
+The Input Service Framework (ISF) monitors and handles all the input events from kernel which means ISF should manage all kinds of input events and dispatch them. On the other hand, as a service provider, ISF provides the input service to fulfill the requirement of applications and users in platform, which means ISF is a container for loading Input Service Engine (ISE) to provide services.
+
+ISF consists of following components
+-# ISF-IMF API Layer
+-# ISM
+-# Panel (UI)
+
+<h3 class="pg">ISM</h3>
+- Registration/Load/Unload/Running/Pause/Resume/Mutually exclusive for ISEs
+- Interfaces among applications/ISE
+- The program of ISM is highly modular. All ISEs are required to program according to specific interface and each ISE will be compiled into individual dynamic library and be placed into the predefine directory. So when ISE module run, ISF will search the predefine directory and dynamically load the ISE module.
+
+@image html TIZEN_ISF_PG_ism_ise_interaction_diagram.png
+<center><b>Figure.</b> ISM-ISE interaction Diagram</center>
+
+<h3 class="pg">Panel (UI)</h3>
+- Provide the ISF control panel, enable the user configure ISF and ISE, providing the help information, providing the switch of active ISEs.
+- Provide the visual feedback from the user, such as candidates, associated phrases.
+
+<h3 class="pg">ISE</h3>
+- Helper ISE is based on HelperAgent. HelperAgent is responsible for the communication between Helper ISE and ISF.
+- Keyboard ISE is the traditional ISE, and it is running in ISM process.
+@}
+
+@defgroup ISF_Use_Cases1 App Dev Guide for EFL
+@brief Application Guide for EFL
+
+@defgroup ISF_Use_Cases1_1 How to show soft keyboard as soon as application is launched.
+@ingroup ISF_Use_Cases1
+@{
+<h3 class="pg">How to show soft keyboard as soon as application is launched.</h3>
+Call elm_object_focus() API to let entry have a focus.
+@code
+void create_entry(struct appdata *ad)
+{
+ ad->eb = elm_entry_add(ad->eb_layout);
+ elm_layout_content_set (ad->eb_layout, "btn_text", ad->eb);
+
+ // Set the layout of soft keyboard when entry has a focus or is clicked.
+ elm_entry_input_panel_layout_set(ad->eb, ELM_INPUT_PANEL_LAYOUT_URL);
+ elm_object_focus(ad->eb); //give focus to the entry and then soft keyboard will be shown automatically
+}
+@endcode
+@}
+@defgroup ISF_Use_Cases1_2 Example of Applications to be hidden soft keyboard
+@ingroup ISF_Use_Cases1
+@{
+
+<h3 class="pg">Example of Applications that must avoid showing soft keyboard even though entry has a focus or is clicked</h3>
+To avoid showing soft keyboard automatically, use elm_entry_input_panel_enabled_set(Evas_Object *obj, Eina_Bool enabled) API.
+@code
+Evas_Object *eo;
+
+eo = elm_entry_add(ad->win_main);
+
+//avoid showing soft keyboard automatically
+elm_entry_input_panel_enabled_set(eo, EINA_FALSE);
+@endcode
+@}
+@defgroup ISF_Use_Cases1_3 How to show soft keyboard manually
+@ingroup ISF_Use_Cases1
+@{
+
+<h3 class="pg">How to show the current active soft keyboard manually</h3>
+<table>
+<tr>
+ <td>
+ <b>Note:</b> If you use elm_entry widget, you don't need to call this API.<br>
+ Please give a focus to entry widget using elm_object_focus() if you want to show a soft keyboard.
+ </td>
+</tr>
+</table>
+@code
+static void entry_application(appdata * ad)
+{
+ Evas_Object *en;
+ Ecore_IMF_Context *imf_context = NULL;
+
+ en = elm_entry_add(ad->win_main);
+ imf_context = elm_entry_imf_context_get(en);
+ ecore_imf_context_input_panel_show(imf_context);
+}
+@endcode
+@}
+@defgroup ISF_Use_Cases1_4 How to hide soft keyboard manually
+@ingroup ISF_Use_Cases1
+@{
+
+<h3 class="pg">How to hide the current active soft keyboard manually</h3>
+<table>
+<tr>
+ <td>
+ <b>Note:</b> If you use elm_entry widget, you don't need to call this API.<br>
+ Soft keyboard will be hidden when entry widget loses a focus.
+ </td>
+</tr>
+</table>
+@code
+static void entry_application(appdata * ad)
+{
+ Evas_Object *bt;
+ bt = elm_button_add(ad->win_main);
+ evas_object_smart_callback_add(bt, "clicked", button_cb, ad);
+}
+
+static void button_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ struct appdata *ad = (struct appdata *)data;
+ Ecore_IMF_Context *imf_context = NULL;
+ imf_context = elm_entry_imf_context_get(ad->entry);
+
+ if (imf_context)
+ ecore_imf_context_input_panel_hide(imf_context);
+}
+@endcode
+@}
+@defgroup ISF_Use_Cases1_5 How to set ISE Specific data
+@ingroup ISF_Use_Cases1
+@{
+
+<h3 class="pg">How to set ISE Specific data before show ISE</h3>
+Use ecore_imf_context_input_panel_imdata_set() API when application wants to deliver specific data to ISE.<br>
+In this case, application and ISE negotiate the data format.
+@code
+#include <Ecore_IMF.h>
+
+void create_entry(struct appdata *ad)
+{
+ char *im_data = "application sample imdata";
+ Ecore_IMF_Context *imf_context = NULL;
+ ad->entry = elm_entry_add(ad->layout_main);
+ imf_context = elm_entry_imf_context_get(ad->entry);
+
+ if (imf_context)
+ {
+ ecore_imf_context_input_panel_imdata_set(imf_context, im_data, strlen(im_data)+1);
+ }
+}
+@endcode
+@}
+@defgroup ISF_Use_Cases1_6 How to get ISE specific data
+@ingroup ISF_Use_Cases1
+@{
+
+<h3 class="pg">How to get ISE specific data of current active ISE.</h3>
+@code
+#include <Ecore_IMF.h>
+
+void get_imdata(struct appdata *ad)
+{
+ int len = 256;
+ char *im_data = (char*) malloc(len);
+ Ecore_IMF_Context *imf_context = NULL;
+ imf_context = elm_entry_imf_context_get(ad->entry);
+ if (imf_context)
+ ecore_imf_context_input_panel_imdata_get(imf_context, im_data, &len);
+
+ free(im_data);
+}
+@endcode
+@}
+@defgroup ISF_Use_Cases1_7 How to detect whether soft keyboard is shown or hidden
+@ingroup ISF_Use_Cases1
+@{
+
+<h3 class="pg">Example code to detect whether soft keyboard is shown or hidden </h3>
+@code
+void _input_panel_event_callback(void *data, Ecore_IMF_Context *imf_context, int value)
+{
+ int x, y, w, h;
+ if (value == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
+ // ISE state has changed to INPUT_PANEL_STATE_SHOW status
+ // Get ISE position of current active ISE
+ ecore_imf_context_input_panel_geometry_get(imf_context, &x, &y, &w, &h);
+ printf("keypad is shown\n");
+ printf("The coordination of input panel. x : %d, y : %d, w : %d, h : %d\n", x, y, w, h);
+ } else if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
+ // ISE state has changed to INPUT_PANEL_STATE_HIDE status
+ printf("keypad is hidden\n");
+ }
+}
+
+static void create_entry(struct appdata *ad)
+{
+ Evas_Object *en;
+ Ecore_IMF_Context *imf_context = NULL;
+ en = elm_entry_add(ad->layout_main);
+ elm_layout_content_set(ad->layout_main, "entry", en);
+
+ imf_context = elm_entry_imf_context_get(en);
+
+ if (imf_context)
+ {
+ ecore_imf_context_input_panel_event_callback_add(imf_context, ECORE_IMF_INPUT_PANEL_STATE_EVENT, _input_panel_event_callback, data);
+ }
+}
+@endcode
+@}
+@defgroup ISF_Use_Cases1_8 Sets up a private key of active ISE keyboard layout
+@ingroup ISF_Use_Cases1
+@{
+
+<h3 class="pg">Sets up a private key of active ISE keyboard layout</h3>
+@code
+int create_entry(struct appdata *ad)
+{
+ Ecore_IMF_Context *imf_context = NULL;
+ ad->entry = elm_entry_add(ad->layout_main);
+ elm_entry_input_panel_layout_set(ad->entry, ELM_ INPUT_PANEL_LAYOUT_NUMBER);
+ imf_context = elm_entry_imf_context_get(ad->entry);
+
+ if (imf_context)
+ {
+ ecore_imf_context_input_panel_private_key_set(imf_context, ECORE_IMF_INPUT_PANEL_LAYOUT_NORMAL,
+ ECORE_IMF_INPUT_PANEL_KEY_ENTER, NULL, "Go", ECORE_IMF_INPUT_PANEL_KEY_ENTER, NULL);
+ }
+}
+@endcode
+
+@image html TIZEN_ISF_PG_private_key.png<br>
+<center><b>Figure.</b> Example of private key "Go" instead of "Enter"</center>
+@}
+@defgroup ISF_Use_Cases1_91 How to set the layout of soft keyboard ISE Layout
+@ingroup ISF_Use_Cases1
+@{
+
+<h3 class="pg">How to set the layout of soft keyboard</h3>
+The layouts that are currently supported by ISEs are<br>
+ECORE_IMF_INPUT_PANEL_LAYOUT_NORMAL<br>
+ECORE_IMF_INPUT_PANEL_LAYOUT_NUMBER (in qwerty mode)<br>
+ECORE_IMF_INPUT_PANEL_LAYOUT_EMAIL (in qwerty mode)<br>
+ECORE_IMF_INPUT_PANEL_LAYOUT_URL (in qwerty mode)<br>
+ECORE_IMF_INPUT_PANEL_LAYOUT_PHONENUMBER (in 4x4 modes)<br>
+ECORE_IMF_INPUT_PANEL_LAYOUT_IP (including IPv4, IPv6)<br>
+ECORE_IMF_INPUT_PANEL_LAYOUT_MONTH (in 3x4 mode)<br>
+ECORE_IMF_INPUT_PANEL_LAYOUT_NUMBERONLY (in 3x4 mode)<p>
+<b>Sample code</b>: Refer to the example of ecore_imf_context_input_panel_layout_set () API<br>
+The snapshots of common layouts supported in Korean ISE are shown below
+
+<table>
+<tr>
+ <th>NORMAL layout</th>
+ <th>NUMBER layout</th>
+ <th>EMAIL layout</th>
+ <th>URL layout</th>
+</tr>
+<tr>
+ <td>@image html TIZEN_ISF_PG_normal_layout.png</td>
+ <td>@image html TIZEN_ISF_PG_number_layout.png</td>
+ <td>@image html TIZEN_ISF_PG_email_layout.png</td>
+ <td>@image html TIZEN_ISF_PG_url_layout.png</td>
+</tr>
+</table>
+
+<table>
+<tr>
+ <th>PHONENUMBER layout</th>
+ <th>IP layout</th>
+ <th>MONTH layout</th>
+ <th>NUMBERONLY layout</th>
+</tr>
+<tr>
+ <td>@image html TIZEN_ISF_PG_phonenumber_layout.png</td>
+ <td>@image html TIZEN_ISF_PG_ip_layout.png</td>
+ <td>@image html TIZEN_ISF_PG_month_layout.png</td>
+ <td>@image html TIZEN_ISF_PG_numberonly_layout.png</td>
+</tr>
+</table>
+@code
+static void entry_application(appdata * ad)
+{
+ Evas_Object *en;
+ Ecore_IMF_Context *imf_context;
+ en = elm_entry_add(ad->win_main);
+
+ elm_entry_input_panel_layout_set(en, ELM_INPUT_PANEL_LAYOUT_URL);
+}
+@endcode
+@}
+@defgroup ISF_Use_Cases1_92 Get ISE Layout of current active ISE
+@ingroup ISF_Use_Cases1
+@{
+
+<h3 class="pg">Get ISE Layout of current active ISE</h3>
+@code
+void get_layout(struct appdata)
+{
+ Elm_Input_Panel_Layout layout ;
+ Ecore_IMF_Context *imf_context = NULL;
+
+ layout = elm_entry_input_panel_layout_get(en);
+ //here you can see what the current layout is
+ printf("the current layout is %d", layout);
+}
+@endcode
+@}
+@defgroup ISF_Use_Cases1_93 How to register a callback for any change in ISE values
+@ingroup ISF_Use_Cases1
+@{
+
+<h3 class="pg">How to register a callback for any change in ISE values</h3>
+@code
+void _input_panel_event_callback(void *data, Ecore_IMF_Context *ctx, int value)
+{
+ if(value == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
+ // ISE state has changed to ECORE_IMF_INPUT_PANEL_STATE_SHOW status
+ } else if(value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
+ // ISE state has changed to ECORE_IMF_INPUT_PANEL_STATE_HIDE status
+ }
+ printf("value: %d\n", value);
+}
+
+static void create_entry(struct appdata *ad)
+{
+ Evas_Object *en;
+ en = elm_entry_add(ad->layout_main);
+ elm_layout_content_set(ad->layout_main, "entry", en);
+
+ Ecore_IMF_Context *imf_context = elm_entry_imf_context_get(en); // Get the input context in the entry
+
+ if (imf_context)
+ {
+ ecore_imf_context_input_panel_event_callback_add(imf_context, ECORE_IMF_INPUT_PANEL_STATE_EVENT, _input_panel_event_callback, data);
+ }
+}
+@endcode
+@}
+@defgroup ISF_Use_Cases1_94 Unregister a callback for any change in ISE values
+@ingroup ISF_Use_Cases1
+@{
+
+<h3 class="pg">Unregister a callback for any change in ISE values.</h3>
+@code
+static void deregister_callback(struct appdata *ad)
+{
+ Ecore_IMF_Context *imf_context = elm_entry_imf_context_get(ad->entry); // Get the input context in the entry
+
+ if (imf_context)
+ {
+ ecore_imf_context_input_panel_event_callback_del(imf_context, ECORE_IMF_INPUT_PANEL_STATE_EVENT, _input_panel_event_callback);
+ }
+}
+@endcode
+@}
+
+<h2 class="pg">Sample codes</h2>
+<h3 class="pg">Sample 1 - How application uses IMControl APIs (European ISE Launch)</h3>
+@code
+static int init(struct appdata *ad)
+{
+ Evas_Object *en;
+
+ en = elm_entry_add(ad->win_main);
+ elm_layout_content_set(ad->layout_main, "entry", en);
+ elm_entry_input_panel_layout_set(en, ELM_INPUT_PANEL_LAYOUT_NUMBER);
+}
+@endcode
+@}
+@defgroup ISF_Use_Cases1_95 How Application gets ISE Input String
+@ingroup ISF_Use_Cases1
+@{
+
+<h3 class="pg">Sample 2 - How Application gets ISE Input String</h3>
+@code
+static Eina_Bool _imf_event_commit_cb(void *data, int type, void *event)
+{
+ Ecore_IMF_Event_Commit *ev = event;
+ printf("input string from ISE is %s \n", ev->str); //here you get the Input String from ISE
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+Ecore_IMF_Context *imf_context_create(Evas_Object *obj)
+{
+ Ecore_IMF_Context *imf_context = NULL;
+ const char *ctx_id = ecore_imf_context_default_id_get();
+ Evas *evas = evas_object_evas_get(obj);
+ if (ctx_id)
+ {
+ imf_context = ecore_imf_context_add(ctx_id);
+ if (obj)
+ {
+ ecore_imf_context_client_window_set(imf_context, (void *)ecore_evas_window_get(ecore_evas_ecore_evas_get(evas)));
+ // the canvas information is used for supporting the auto rotation of input panel
+ ecore_imf_context_client_canvas_set(imf_context, evas);
+ }
+ }
+
+ return imf_context;
+}
+
+void test_ise_show(void *data, Evas_Object *obj, void *event_info)
+{
+ Ecore_IMF_Context *imf_context = NULL;
+ imf_context = imf_context_create(NULL);
+
+ ecore_imf_context_reset(imf_context);
+ ecore_imf_context_focus_in(imf_context);
+
+ if (imf_context)
+ ecore_imf_context_input_panel_show(imf_context);
+
+ ecore_event_handler_add(ECORE_IMF_EVENT_COMMIT, _imf_event_commit_cb, NULL);
+ //please use ECORE_IMF_EVENT_PREEDIT_CHANGED if want preedit string
+ //ecore_event_handler_add(ECORE_IMF_EVENT_PREEDIT_CHANGED, _imf_event_changed_cb, NULL);
+}
+
+static void my_win_main(void)
+{
+ ...
+ elm_list_item_append(li, "ISE SHOW", NULL, NULL, test_ise_show, NULL);
+ ...
+}
+@endcode
+@}
+@defgroup ISF_Use_Cases1_96 How Application gets ISE-Specific Key Event
+@ingroup ISF_Use_Cases1
+@{
+
+<h3 class="pg">Sample 3 - How Application gets ISE-Specific Key Event</h3>
+@code
+static Eina_Bool _imf_event_commit_cb(void *data, int type, void *event)
+{
+ Ecore_IMF_Event_Commit *ev = event;
+ printf("input string from ISE is %s \n", ev->str); //here you get the Input String from ISE
+
+ return ECORE_CALLBACK_PASS_ON;
+};
+
+Ecore_IMF_Context *imf_context_create(Evas_Object *obj)
+{
+ Ecore_IMF_Context *imf_context = NULL;
+ const char *ctx_id = ecore_imf_context_default_id_get();
+ Evas_Object *evas = evas_object_evas_get(obj);
+
+ if (ctx_id)
+ {
+ imf_context = ecore_imf_context_add(ctx_id);
+ if (obj)
+ {
+ ecore_imf_context_client_window_set(imf_context, (void *)ecore_evas_window_get(ecore_evas_ecore_evas_get(evas)));
+ // the canvas information is used for supporting the auto rotation of input panel
+ ecore_imf_context_client_canvas_set(imf_context, evas_object_evas_get(obj));
+ }
+ }
+
+ return imf_context;
+}
+
+void test_ise_show(void *data, Evas_Object *obj, void *event_info)
+{
+ Ecore_IMF_Context *imf_context = NULL;
+ imf_context = imf_context_create(NULL);
+
+ if (imf_context)
+ ecore_imf_context_input_panel_show(imf_context);
+
+ ecore_imf_context_reset(imf_context);
+ ecore_imf_context_focus_in(imf_context);
+
+ ecore_event_handler_add(ECORE_IMF_EVENT_COMMIT, _imf_event_commit_cb, NULL);
+ //please use ECORE_IMF_EVENT_PREEDIT_CHANGED if want preedit string
+ //ecore_event_handler_add(ECORE_IMF_EVENT_PREEDIT_CHANGED, _imf_event_changed_cb, NULL);
+}
+
+static void my_win_main(void)
+{
+ ...
+ elm_list_item_append(li, "ISE SHOW", NULL, NULL, test_ise_show, NULL);
+ ...
+}
+@endcode
+@code
+static void
+_edje_key_down_cb(void *data, Evas *e , Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Key_Down *ev = event_info;
+ //if (!strcmp(ev->key, "BackSpace"))
+ printf("Key Event from ISE is %s \n", ev->key); //here you can get the Key Event from ISE
+}
+
+Ecore_IMF_Context *imf_context_create(Evas_Object *obj)
+{
+ Ecore_IMF_Context *imf_context = NULL;
+ const char *ctx_id = ecore_imf_context_default_id_get();
+ Evas *evas = evas_object_evas_get(obj);
+
+ if (ctx_id)
+ {
+ imf_context = ecore_imf_context_add(ctx_id);
+ if (obj)
+ {
+ ecore_imf_context_client_window_set(imf_context, (void *)ecore_evas_window_get(ecore_evas_ecore_evas_get(evas)));
+ // the canvas information is used for supporting the auto rotation of input panel
+ ecore_imf_context_client_canvas_set(imf_context, evas);
+ }
+ }
+
+ return imf_context;
+}
+
+void test_ise_show(void *data, Evas_Object *obj, void *event_info)
+{
+ Ecore_IMF_Context *imf_context = NULL;
+
+ imf_context = imf_context_create(obj);
+ //printf("imf_context = %d\n", imf_context);
+
+ if (imf_context)
+ ecore_imf_context_input_panel_show(imf_context);
+
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN, _edje_key_down_cb, NULL);
+ evas_object_focus_set(obj, EINA_TRUE);
+}
+
+static void my_win_main(void)
+{
+ ...
+ elm_list_item_append(li, "ISE SHOW", NULL, NULL, test_ise_show, NULL);
+ ...
+}
+@endcode
+@}
+@defgroup ISF_Use_Cases1_97 How Application can set layout
+@ingroup ISF_Use_Cases1
+@{
+
+<h3 class="pg">Sample 4 - How to get key event</h3>
+- How to get key event and identify entry
+ -# Register the event EVAS_CALLBACK_KEY_UP callback function for each entry which needs to process key up event.
+ @code
+evas_object_event_callback_add(_entry1, EVAS_CALLBACK_KEY_UP, _evas_key_up_cb, (void *)NULL);
+ @endcode
+ -# Make callback function like below to identify which entry received key event
+ @code
+static void
+_evas_key_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ static char str [100];
+ Evas_Event_Key_Up *ev = (Evas_Event_Key_Up *) event_info;
+
+ if (obj == _entry1)
+ sprintf (str, "entry 1 get keyEvent: %s", ev->keyname);
+ else if (obj == _entry2)
+ sprintf (str, "entry 2 get keyEvent: %s", ev->keyname);
+ else
+ sprintf (str, "");
+
+ elm_object_label_set(_key_event_label, str);
+}
+ @endcode
+
+- How to use Ecore event handlers
+ -# The ECORE_IMF_EVENT_PREEDIT_CHANGED and ECORE_IMF_EVENT_COMMIT are not bound to object. However ISF always sends the preedit string and commit string to the focused entry. So in the callback functions for the two events, we can determine which entry receives the preedit string and commit string by checking which entry gets the focus. The function to determine which widget gets the focus is elm_object_focus_get().
+ -# For preedit string, we need call ecore_imf_context_preedit_string_get() to get the preedit string in its callback function.
+ -# For commit string, the third parameter ev of _ecore_imf_event_commit_cb contain the commit string.
+
+- How to get pre-edit string and identify entry
+ -# Register the event ECORE_IMF_EVENT_PREEDIT_CHANGED callback function for each entry which needs to process pre-edit.
+ @code
+ecore_event_handler_add(ECORE_IMF_EVENT_PREEDIT_CHANGED, _ecore_imf_event_changed_cb, NULL);
+ @endcode
+ -# Make callback function like below
+ @code
+static Eina_Bool _ecore_imf_event_changed_cb(void *data, int type, void *event)
+{
+ static char str [100];
+ char *preedit_string;
+ int len;
+ Ecore_IMF_Context *imf_context = NULL;
+
+ if (elm_object_focus_get(_entry1))
+ {
+ imf_context = elm_entry_imf_context_get(_entry1);
+ ecore_imf_context_preedit_string_get(imf_context, &preedit_string, &len);
+
+ sprintf(str, "entry 1 get preedit string: %s", preedit_string);
+ }
+ else if (elm_object_focus_get(_entry2))
+ {
+ imf_context = elm_entry_imf_context_get(_entry2);
+ ecore_imf_context_preedit_string_get(imf_context, &preedit_string, &len);
+
+ sprintf(str, "entry 1 get preedit string: %s", preedit_string);
+ }
+ else
+ sprintf(str, "");
+
+ free(preedit_string);
+
+ elm_object_label_set(_preedit_event_label,str);
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+ @endcode
+
+- How to get commit string and identify entry
+ -# Register the event ECORE_IMF_EVENT_COMMIT callback function for each entry which needs to process pre-edit.
+ @code
+ecore_event_handler_add(ECORE_IMF_EVENT_COMMIT, _ecore_imf_event_commit_cb, NULL);
+ @endcode
+ -# Make callback function like below
+ @code
+static Eina_Bool _ecore_imf_event_commit_cb(void *data, int type, void *event)
+{
+ static char str [100];
+ Ecore_IMF_Event_Commit *ev = (Ecore_IMF_Event_Commit *) event;
+
+ if (elm_object_focus_get(_entry1))
+ sprintf(str, "entry 1 get commit string: %s", ev->str);
+ else if (elm_object_focus_get(_entry2))
+ sprintf (str, "entry 2 get commit string: %s", ev->str);
+ else
+ sprintf (str, "");
+
+ elm_object_label_set(_commit_event_label,str);
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+ @endcode
+- How to use Ecore event handlers
+ -# The ECORE_IMF_EVENT_PREEDIT_CHANGED and ECORE_IMF_EVENT_COMMIT are not bound to object. But ISF always send the preedit string and commit string to the focused entry. So in the callback functions for the two events, we can determine which entry receive the preedit string and commit string by checking which entry get the focus. The function to determine which widget gets the focus is elm_object_focus_get().
+ -# For preedit string, we need call ecore_imf_context_preedit_string_get() to get the preedit string in its callback function. After getting preedit_string, you should deallocate memory by using free().
+ -# For commit string, the third parameter ev of _ecore_imf_event_commit_cb contain the commit string.
+
+- Example - In case the application does not use an Entry
+ -# We use elm_label as the sample for showing how to get the key event, commit string and preedit string in case the application does not use an entry. Most part is similar to the application using entry except the following b) and c).
+ -# Creating an imcontext instance.
+@code
+Evas_Object *label;
+
+......
+static Eina_Bool _ecore_imf_event_changed_cb(void *data, int type, void *event)
+{
+ //example how to get preedit string
+ static char str [100];
+ char *preedit_string;
+ int len;
+ Ecore_IMF_Context * imf_context = (Ecore_IMF_Context *)data;
+
+ ecore_imf_context_preedit_string_get(imf_context, &preedit_string, &len);
+ sprint(str, "preedit string : %s\n", preedit_string);
+
+ elm_object_label_set(label, str);
+ free(preedit_string);
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool _ecore_imf_event_commit_cb(void *data, int type, void *event)
+{
+ //example how to get commit string
+ Ecore_IMF_Event_Commit *ev = (Ecore_IMF_Event_Commit *) event;
+
+ sprint(str, "commit string : %s\n", ev->str);
+ elm_object_label_set(label, ev->str);
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+void
+isf_label_event_demo_bt(void *data, Evas_Object *obj, void *event_info)
+{
+ struct appdata *ad = (struct appdata *)data;
+ Ecore_IMF_Context * _imf_context;
+ Evas *evas = evas_object_evas_get(obj);
+
+ if (ad == NULL) return;
+
+ label = elm_label_add(ad->win_main);
+
+ const char *ctx_id = ecore_imf_context_default_id_get();
+ _imf_context = ecore_imf_context_add(ctx_id);
+
+ ecore_imf_context_client_window_set(imf_context, (void *)ecore_evas_window_get(ecore_evas_ecore_evas_get(evas)));
+ // the canvas information is used for supporting the auto rotation of input panel
+ ecore_imf_context_client_canvas_set(imf_context, evas);
+
+ ecore_event_handler_add(ECORE_IMF_EVENT_COMMIT, _ecore_imf_event_commit_cb, _imf_context);
+ ecore_event_handler_add(ECORE_IMF_EVENT_PREEDIT_CHANGED, _ecore_imf_event_changed_cb, _imf_context);
+}
+@endcode
+@}
+
+@defgroup ISF_Use_Cases3 ISE Dev Guide
+@ingroup ISF_Use_Cases
+@{
+<h1 class="pg">ISE Development Guide</h1>
+<h2 class="pg">Purpose</h2>
+This document aimed at ISE (Input Service Engine) developers to make their own keyboard (i.e. ISE) quickly, with using of ISF (Input Service Framework) in TIZEN.
+The contents include:
+- Making ISE step by step
+- How to install ISE on target
+- An example
+- Other you may be interested
+
+<h2 class="pg">Let's get started</h2>
+ISF in TIZEN is designed to support a variety of ISEs, including soft keyboard, hand-writing recognizers, and hard keyboard. In this document our focus will be on soft keyboards, since this is most often developing ISE in support TIZEN text input. For more detail about other ISE types, you can refer to "ISF User Manual" for getting more information.
+With ISE of soft keyboard, the life-cycle of input flow looks like below:
+
+@image html TIZEN_ISF_PG_lifecycle_of_input_flow.png
+<center><b>Figure.</b> Life Cycle of Input Flow</center>
+@}
+
+@defgroup ISF_Use_Cases3_1 Step1 : Define and Include
+@ingroup ISF_Use_Cases3
+@{
+
+<h2 class="pg">For generating a new ISE with soft keyboard, let's follow 6 steps to make it. </h2>
+<h3 class="pg">Step 1 : Define and Include</h3>
+@code
+#define Uses_SCIM_HELPER
+#define Uses_SCIM_CONFIG_BASE
+#include <scim.h>
+using namespace scim;
+
+#define YOUR_ISE_UUID "ff119040-4062-b8f0-9ff6-3575c0a84f4f"
+#define YOUR_ISE_NAME "Your ISE Name"
+#define YOUR_ISE_ICON (SCIM_ICONDIR "/your_ise_icon.png")
+#define YOUR_ISE_DESCRIPTION "Your ISE Description"
+@endcode
+Here, HELPER mainly means ISEs with using touch screen device.
+@}
+
+@defgroup ISF_Use_Cases3_2 Step2 : Implement 2 objects
+@ingroup ISF_Use_Cases3
+@{
+
+<h3 class="pg">Step 2 : Implement 2 objects</h3>
+@code
+static HelperInfo helper_info (YOUR_ISE_UUID,
+ YOUR_ISE_NAME,
+ String (YOUR_ISE_ICON),
+ YOUR_ISE_DESCRIPTION,
+ SCIM_HELPER_STAND_ALONE|SCIM_HELPER_AUTO_RESTART);
+@endcode
+
+Structure helper_info collects basic information of your ISE. UUID is the unique ID for your ISE, also the NAME and ICON.
+
+The most often using helper_info options:
+<table>
+<tr><th>Option</th><th>Description</th></tr>
+<tr><td>SCIM_HELPER_STAND_ALONE</td><td>compulsory option</td></tr>
+<tr><td>SCIM_HELPER_AUTO_RESTART</td><td>Option indicates ISE will be restarted when it exits abnormally. We strongly recommend you use this option only in your release version, for not hiding abnormal cases.</td></tr>
+</table>
+
+@code
+HelperAgent _helper_agent;
+@endcode
+
+Class HelperAgent is an accessory class to write a Helper object. This class implements all Socket transaction protocol between Helper object and Panel. Helper objects and Panel communicate with each other via the Socket created by Panel. Helper object could use command and signal through Panel Socket to do some operations with Application, Hard Keyboard ISE and Configure Module.
+
+About detailed description of HelperAgent, please refer to "ISF User Manual", and the most often using methods of HelperAgent object are listed here.
+@}
+
+@defgroup ISF_Use_Cases3_3 Step3 : Implement 6 interfaces
+@ingroup ISF_Use_Cases3
+@{
+
+<h3 class="pg">Step 3 : Implement 6 interfaces</h3>
+First of all, you need implement scim_module_init and scim_module_exit, for your ISE will be a module loaded by ISF.
+scim_module_init will be called by ISF when the ISE module is loaded. You can do your general module initialization work in it.
+
+scim_module_exit will be called by ISF when the ISE module is unloaded. You can do the general module cleaning work in it.
+@code
+void scim_module_init(void)
+{
+ bindtextdomain(GETTEXT_PACKAGE, SCIM_INPUT_PAD_LOCALEDIR);
+ bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
+ ...
+ Do your initializing work here
+ ...
+}
+
+void scim_module_exit(void)
+{
+ ...
+ Do your finalizing work here
+ ...
+}
+@endcode
+
+Then you will implement the information collection interfaces for your Helper.
+scim_helper_module_number_of_helpers gets the number of Helpers in this module. Because a Helper module can have multiple Helpers in it, and each Helper should run in its own process space.
+scim_helper_module_get_helper_info gets the basic information of a Helper.
+scim_helper_module_get_helper_language gets supported language for the specific Helper ISE.
+
+@code
+unsigned int scim_helper_module_number_of_helpers(void)
+{
+ return 1; //1 for common use
+}
+
+bool scim_helper_module_get_helper_info(unsigned int idx, HelperInfo &info)
+{
+ if (idx == 0)
+ {
+ info = _helper_info;
+ return true;
+ }
+ return false;
+}
+
+String scim_helper_module_get_helper_language(unsigned int idx)
+{
+ if (idx == 0)
+ {
+ String strLanguage("en,de_DE,fr_FR,es,pt,it_IT,nl_NL,ar,ru_RU");
+ return strLanguage;
+ }
+ return "other";
+}
+@endcode
+
+Then, you need implement scim_helper_module_run_helper.
+
+This interface is the last but the most important one, because most of your real implementation of your ISE will be here.
+
+@code
+void scim_helper_module_run_helper(const String &uuid, const ConfigPointer &config, const String &display)
+{
+ _config = config;
+ if (uuid == YOUR_ISE_UUID)
+ {
+ ...
+ Read your configure here
+ ...
+ run(display);
+ }
+}
+@endcode
+
+@code
+void run(const String &display)
+{
+ char **argv = new char * [4];
+ int argc = 3;
+ argv [0] = const_cast<char *> ("input-pad");
+ argv [1] = const_cast<char *> ("--display");
+ argv [2] = const_cast<char *> (display.c_str ());
+ argv [3] = 0;
+ setenv("DISPLAY", display.c_str(), 1);
+
+ elm_init(argc, argv);
+
+ _helper_agent.signal_connect_exit(slot(slot_exit));
+ ...
+ Do your signal connection work here
+ ...
+
+ int id, fd;
+ id = _helper_agent.open_connection(_helper_info, display);
+ if (id == -1)
+ {
+ std::cerr << " open_connection failed!!!!!!\n";
+ goto ise_exit;
+ }
+
+ fd = _helper_agent.get_connection_number();
+ if (fd >= 0)
+ {
+ _read_handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ, helper_agent_input_handler, NULL, NULL, NULL);
+ }
+
+ elm_run();
+ elm_shutdown();
+
+ise_exit:
+ if (argv)
+ delete []argv;
+
+}
+@endcode
+
+In scim_helper_module_run_helper, you should implement a set of signal connection for combination the signal with your real implemented functions (slots), which we'll describe in step 4.
+@}
+
+@defgroup ISF_Use_Cases3_4 Step4 : Implement main signal/slots
+@ingroup ISF_Use_Cases3
+@{
+
+<h3 class="pg">Step 4 : Implement main signal/slots</h3>
+
+- Introduction of signal/slot
+ISF adopts Signal/Slot to implement some callback function mechanism. It defines one-to-many relationship between a signal object and any number of slot objects, so that when the signal is emitted, all its slots will be called automatically.
+The class diagram of Signal/Slot shown like this:
+
+@image html TIZEN_ISF_PG_slot_and_signal.png
+
+SignalN
+- Knows the prototype of its slots
+- Can hold any number of slots
+- Provide a interface to attach slot object at run time
+SlotN
+- Provides a call interface to let signal object call.
+FunctionSlotN
+- Derived from SlotN
+- Implement the call operation.
+
+- Implementation of signal/slot
+ISE can receive many signals from ISF by HelperAgent, and you should implement those slot functions for concerned signals, then call signal connection function to connect those slots functions. About all slot functions interface and parameters, please reference to scim_helper.h and Input-pad ISE demo. Normally below slot functions should be implemented.<br><br>
+_helper_agent.signal_connect_exit(slot(slot_exit));<br>
+_helper_agent.signal_connect_focus_out(slot(slot_focus_out));<br>
+_helper_agent.signal_connect_focus_in(slot(slot_focus_in));<br>
+_helper_agent.signal_connect_reload_config(slot(slot_reload_config));<br>
+
+The mapping of EFLIMFControl APIs and HelperAgent signals:
+<table>
+<tr>
+ <th>EFLIMFControl API</th>
+ <th>Signal</th>
+</tr>
+<tr>
+ <td>ecore_imf_context_input_panel_show</td><td>signal_ise_show</td>
+</tr>
+<tr>
+ <td>ecore_imf_context_input_panel_hide</td><td>signal_ise_hide</td>
+</tr>
+<tr>
+ <td>ecore_imf_context_input_panel_imdata_set</td><td>signal_set_imdata</td>
+</tr>
+<tr>
+ <td>ecore_imf_context_input_panel_imdata_get</td><td>signal_get_imdata</td>
+</tr>
+<tr>
+ <td>ecore_imf_context_input_panel_private_key_set</td><td>signal_set_private_key_by_label</td>
+</tr>
+<tr>
+ <td>ecore_imf_context_input_panel_layout_set</td><td>signal_set_layout</td>
+</tr>
+<tr>
+ <td>ecore_imf_context_input_panel_layout_get</td><td>signal_get_layout</td>
+</tr>
+<tr>
+ <td>ecore_imf_context_input_panel_geometry_get</td><td>signal_get_size</td>
+</tr>
+</table>
+@}
+
+@defgroup ISF_Use_Cases3_5 Step5 : Interacting with window manager
+@ingroup ISF_Use_Cases3
+@{
+
+<h3 class="pg">Step 5 : Interacting with window manager</h3>
+In TIZEN, window manager should treat soft keyboard window differently from other normal application windows. When an ISE creates its soft keyboard window, it should notify the window manager that the created window's type is a soft keyboard type, by calling following function.
+
+@code
+elm_win_keyboard_win_set(main_window, EINA_TRUE);
+@endcode
+
+And when an application rotates its window, the window manager sends a X Client Message to a soft keyboard to let it know the state change of target application window. To handle the X client message, the following handler function should be implemented inside ISE.
+@code
+static int _client_message_cb(void *data, int type, void *event)
+{
+ Ecore_X_Event_Client_Message *ev = (Ecore_X_Event_Client_Message *)event;
+ int angle;
+
+ if (ev->message_type == ECORE_X_ATOM_E_ILLUME_ROTATE_ROOT_ANGLE) {
+ angle = ev->data.l[0];
+ ...
+ Do your keyboard rotation work here
+ ...
+ }
+
+ return ECORE_CALLBACK_RENEW;
+}
+@endcode
+
+And the handler function should be registered as a handler function to ECORE_X_EVENT_CLIENT_MESSAGE when initializing, as shown below.
+
+@code
+Ecore_Event_Handler *handler = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, _client_message_cb, NULL);
+@endcode
+@}
+
+@defgroup ISF_Use_Cases3_6 Step6 : How to install ISE on target
+@ingroup ISF_Use_Cases3
+@{
+
+<h3 class="pg">Step 6 : How to install ISE on target</h3>
+To integrate an ISE into ISF, you should build ISE module as a dynamic library and install it into the predefined directory \$(TOP_INSTALL_DIR)/lib/scim-1.0/1.4.0/\$(ISE_TYPE)/. Then ISF will search the predefined directory to find the ISE module.<br>
+The TOP_INSTALL_DIR is the top-level ISF installation directory. By default its value is "/usr".<br>
+The ISE_TYPE is "IMEngine" (KeyboardISE) or "Helper" (HelperISE). The ISE developer should select one value according to the ISE type.<br>
+If the ISE has one setup UI module, this setup UI module should be installed into "\$(TOP_INSTALL_DIR)/lib/scim-1.0/1.4.0/SetupUI" directory.<br>
+The setup UI module's name should be defined as ISE file name + "-imengine-setup.so".<br>
+For example, Input-pad ISE file name is "input-pad.so", its setup UI module's name is "input-pad-imengine-setup.so".
+
+Below are the repository directories for three modules:<br>
+- KeyboardISE<br>
+\$(TOP_INSTALL_DIR)/lib/scim-1.0/1.4.0/IMEngine.
+- HelperISE<br>
+\$(TOP_INSTALL_DIR)/lib/scim-1.0/1.4.0/Helper
+- ISE Setup Module<br>
+\$(TOP_INSTALL_DIR)/lib/scim-1.0/1.4.0/SetupUI
+@}
+
+@defgroup ISF_Ref References
+@ingroup InputServiceFramework_PG
+@{
+
+<h3 class="pg"> Demo for Softkeyboard ISE</h3>
+The HelperISE uses an object of accessory class HelperAgent to deal with all Socket Transaction between HelperISE objects and PanelAgent.<br>
+It needs to implement the necessary slot functions and connect the slots to the corresponding signals if they want to accept the specific events.
+@code
+static HelperAgent helper_agent;
+static HelperInfo helper_info(
+ String ("ff110940-b8f0-4062-9ff6-a84f4f3575c0"),
+ "Input Pad",
+ String (SCIM_INPUT_PAD_ICON),
+ "",
+ SCIM_HELPER_STAND_ALONE|SCIM_HELPER_NEED_SCREEN_INFO);
+
+void scim_module_init(void)
+{
+ bindtextdomain(GETTEXT_PACKAGE, SCIM_INPUT_PAD_LOCALEDIR);
+ bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
+
+ _helper_info.name = String (_("Input Pad"));
+ _helper_info.description = String (_("An On Screen Input Pad to input characters easily."));
+}
+
+void scim_module_exit(void)
+{
+}
+
+unsigned int scim_helper_module_number_of_helpers(void)
+{
+ return 1;
+}
+
+bool scim_helper_module_get_helper_info(unsigned int idx, HelperInfo &info)
+{
+ if (idx == 0) {
+ info = helper_info;
+ return true;
+ }
+ return false;
+}
+
+String scim_helper_module_get_helper_language(unsigned int idx)
+{
+ if (idx == 0)
+ {
+ String
+ strLanguage ("en,de_DE,fr_FR,es,pt,tr_TR,el_GR,it_IT,nl_NL,ar,ru_RU,"
+ "az_AZ,bn,bg_BG,ca_ES,cs_CZ,cy_GB,da_DK,et_EE,"
+ "eu_ES,fi_FI,ga_IE,gl_ES,gu_IN,he_IL,hi_IN,hu_HU,"
+ "is_IS,ka_GE,kk_KZ,km,kn_IN,lt_LT,lv_LV,mk_MK,"
+ "ml_IN,mn_MN,Marathi,ms_MY,no_NO,pa_IN,pl_PL,"
+ "ro_RO,si_LK,sk_SK,sl_SI,sq_AL,sr_CS,sv,ta_IN,"
+ "te_IN,th_TH,uk_UA,ur_PK,z_UZ,vi_VN,"
+ "zh_CN,zh_TW,zh_HK,zh_SG");
+
+ return strLanguage;
+ }
+ return "other";
+}
+
+void scim_helper_module_run_helper(const String &uuid, const ConfigPointer &config, const String &display)
+{
+ char **argv = new char * [4];
+ int argc = 3;
+
+ argv [0] = const_cast<char *> ("input-pad");
+ argv [1] = const_cast<char *> ("--display");
+ argv [2] = const_cast<char *> (display.c_str ());
+ argv [3] = 0;
+
+ setenv("DISPLAY", display.c_str(), 1);
+
+ elm_init(argc, argv);
+ ......
+ helper_agent.signal_connect_exit(slot(slot_exit));
+ helper_agent.signal_connect_focus_out(slot(slot_focus_out));
+ helper_agent.signal_connect_focus_in(slot(slot_focus_in));
+ ......
+ int id, fd;
+ id = _helper_agent.open_connection(_helper_info, display);
+ if (id == -1)
+ {
+ std::cerr << " open_connection failed!!!!!!\n";
+ goto ise_exit;
+ }
+
+ fd = _helper_agent.get_connection_number();
+ if (fd >= 0)
+ {
+ _read_handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ,
+ helper_agent_input_handler, NULL, NULL, NULL);
+ //ecore_main_fd_handler_active_set(_read_handler, ECORE_FD_READ);
+ }
+
+ create_ise_window();
+ init_candidate_table_labels();
+ ......
+ _helper_agent.get_keyboard_ise_list(_helper_info.uuid);
+ _helper_agent.get_candidate_ui(_helper_info.uuid);
+ _helper_agent.get_candidate_window_rect(_helper_info.uuid);
+ _helper_agent.get_keyboard_ise(_helper_info.uuid);
+
+ _helper_agent.set_candidate_position(-1, -1);
+ elm_run();
+ elm_shutdown();
+
+ise_exit:
+ if (argv)
+ delete []argv;
+ ......
+}
+@endcode
+
+Here, we will use the skeleton of InputPad ISE as an example. InputPad is a software keyboard ISE. By studying the code segment example, you can see:
+-# As mentioned in step 3, the HelperISE should at least implement the six interfaces "scim_module_init()", "scim_module_exit()", "scim_helper_module_number_of_helpers()", "scim_helper_module_get_helper_info()", "scim_helper_module_get_helper_language()" and "scim_helper_module_run_helper()"
+-# How to send the result to the target input widget
+HelperAgent class provides two member functions to do this job, helper_agent.commit_string() and helper_agent.send_key_event(). As indicated by the function name, commit_string() is to send a string to the target input widget while send_key_event() is to send a key event to the target input widget.
+ -# helper_agent.commit_string(-1, "", scim::utf8_mbstowcs(str));
+ -# helper_agent.send_key_event(-1, "", key);
+In InputPad, the first parameters of commit_string and send_key_event are assigned with -1 and "", then the result will be sent to the last focused widget.
+-# How to receive the ISF events
+Here, we adopt Signal/Slot to connect the callback functions (Slot) to the corresponding events (Signal). In InputPad, helper_agent.signal_connect_exit(), helper_agent.signal_connect_update_screen() etc will do the connection. Currently, the InputPad will emit the following signals:
+ -# signal_exit
+ -# signal_ise_show
+ -# signal_ise_hide
+ -# signal_get_size
+ -# signal_set_layout
+ -# signal_update_candidate_ui
+ -# signal_update_keyboard_ise
+
+Most often HelperAgent Methods
+<table>
+<tr>
+ <th>Method</th>
+ <th>Description</th>
+<tr>
+ <td>int open_connection(const HelperInfo &info, const String &display);</td>
+ <td>Open socket connection to the Panel.
+- Param info: The information of this Helper object.
+- Param display: The display which this Helper object should run on.
+Return the connection socket id. -1 means failed to create the connection
+ </td>
+</tr>
+<tr>
+ <td>void close_connection();</td><td>Close the socket connection to Panel.</td>
+</tr>
+<tr>
+ <td>int get_connection_number() const;</td><td>Get the connection id previously returned by open_connection().</td>
+</tr>
+<tr>
+ <td>bool is_connected() const;</td>
+ <td>Return whether this HelperAgent has been connected to a Panel.
+Return true if there are any events available.
+</td>
+</tr>
+<tr>
+ <td>bool has_pending_event() const;</td>
+ <td>Check if there are any events available to be processed. If it returns true then Helper object should call HelperAgent::filter_event() to process them.</td>
+</tr>
+<tr>
+ <td>bool filter_event();</td>
+ <td>Process the pending events. This function will emit the corresponding signals according to the events.
+Return false if the connection is broken, otherwise return true.
+</td>
+</tr>
+<tr>
+ <td>void reload_config() const;</td><td>Request ISF to reload all configurations. This function should only be used by Setup Helper to request ISF's reloading the configuration.</td>
+</tr>
+<tr>
+ <td>void send_imengine_event(int ic, const String &ic_uuid, const Transaction &trans) const;</td>
+ <td>Send a set of events to a Hard Keyboard ISE Instance. All events should be put into a Transaction. And the events can only be received by one IMEngineInstance (Hard keyboard ISE) object.
+- Param ic: The handle of the Input Context to receive the events.
+- Param ic_uuid: The UUID of the Input Context.
+- Param trans: The Transaction object holds the events.
+</td>
+</tr>
+<tr>
+ <td>void send_key_event(int ic, const String &ic_uuid, const KeyEvent &key) const;</td>
+ <td>Send a KeyEvent to an IMEngineInstance.
+- Param ic: The handle of the IMEngineInstance to receive the event. -1 means the currently focused IMEngineInstance.
+- Param ic_uuid: The UUID of the IMEngineInstance. Empty means don't match.
+- Param key: The KeyEvent to be sent.
+</td>
+</tr>
+<tr>
+ <td>void forward_key_event(int ic, const String &ic_uuid, const KeyEvent &key) const;</td>
+ <td>Forward a KeyEvent to client application directly.
+- Param ic: The handle of the IMEngineInstance to receive the event. -1 means the currently focused IMEngineInstance.
+- Param ic_uuid: The UUID of the IMEngineInstance. Empty means don't match.
+ </td>
+</tr>
+<tr>
+ <td>void commit_string(int ic, const String &ic_uuid, const WideString &wstr) const;</td>
+ <td>Commit a WideString to client application directly.
+- Param ic: The handle of the client Input Context to receive the WideString. -1 means the currently focused Input Context.
+- Param ic_uuid: The UUID of the IMEngine used by the Input Context. Empty means don't match.
+- Param wstr: The WideString to be committed.
+ </td>
+</tr>
+<tr>
+ <td>void update_input_context(uint32 type, uint32 value) const;</td>
+ <td>When the input context of ISE is changed, ISE can call this function to notify application.
+- Param type: type of event. The type of event may differ in different project. It is an engagement between ISE and the applications. One example definition is ECORE_IMF_INPUT_PANEL_EVENT in Ecore_IMF.h in TIZEN project.
+- Param value: value of event.
+ </td>
+</tr>
+<tr>
+ <td>void set_candidate_ui(const ISF_CANDIDATE_STYLE_T style, const ISF_CANDIDATE_MODE_T mode) const;</td>
+ <td>Set the style and mode for candidate window.
+- Param style: The candidate window style.
+ISF_CANDIDATE_STYLE_T may differ in different project. Please refer the latest definition in scim_utility.h.
+- Param mode: The candidate window mode.
+ISF_CANDIDATE_MODE_T may differ in different project. Please refer the latest definition in scim_utility.h.
+ </td>
+</tr>
+<tr>
+ <td>void get_candidate_ui(const String &uuid) const;</td><td>Send request to get the candidate window's style and mode.</td>
+</tr>
+<tr>
+ <td>void set_candidate_position(int left, int top) const;</td>
+ <td>Set the position for candidate window.
+- Param left: The candidate window's left position.
+- Param top: The candidate window's top position.
+- If both Params set <0, the candidate will be default set to cursor following mode.
+ </td>
+</tr>
+<tr>
+ <td>void candidate_hide(void) const;</td>
+ <td>Send request to hide the candidate window, including Aux, Candidate and Associate area</td>
+</tr>
+<tr>
+ <td>void get_candidate_window_rect(const String &uuid) const;</td>
+ <td>Send request to get the candidate window's size and position.
+- Param uuid: The Helper ISE's uuid.
+ </td>
+</tr>
+<tr>
+ <td>void set_keyboard_ise_by_uuid(const String &uuid) const;</td>
+ <td>Set the keyboard ISE by ISE's uuid.
+- Param uuid: The keyboard ISE's uuid.
+</td>
+</tr>
+<tr>
+ <td>void get_keyboard_ise(const String &uuid) const;</td>
+ <td>Send request to get the current keyboard ISE.
+- Param uuid: The Helper ISE's uuid.
+</td>
+</tr>
+</table>
+@}
+*/
+
+/**
+* @addtogroup InputServiceFramework_PG Input Service FW
+ @{
+* @defgroup ISF_Use_Cases Use Cases
+ @{
+* @defgroup ISF_Use_Cases1
+* @defgroup ISF_Use_Cases2
+* @defgroup ISF_Use_Cases3
+ @brief For generating a new ISE with soft keyboard, let's follow 6 steps to make it.
+ @}
+ @}
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jihoon Kim <jihoon48.kim@samsung.com>, Haifeng Deng <haifeng.deng@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __ISE_CONTEXT_H
+#define __ISE_CONTEXT_H
+
+#include <Ecore_IMF.h>
+
+typedef struct {
+ char name[_POSIX_PATH_MAX];
+ int IfAlwaysShow;
+ int IfFullStyle;
+ Ecore_IMF_Input_Panel_State state;
+ int fUseImEffect;
+ Ecore_IMF_Input_Panel_Lang language;
+ Ecore_IMF_Input_Panel_Layout layout;
+ Ecore_IMF_Input_Panel_Orient orient;
+ unsigned int disabled_key_num;
+ unsigned int private_key_num;
+ int input_panel_x;
+ int input_panel_y;
+} Ise_Context;
+
+#endif /* __ISE_CONTEXT_H */
+
+/*
+vi:ts=4:expandtab:nowrap
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Haifeng Deng <haifeng.deng@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#define Uses_SCIM_TRANSACTION
+#define Uses_ISF_IMCONTROL_CLIENT
+
+
+#include <string.h>
+#include "scim.h"
+
+
+namespace scim
+{
+
+int isf_control_set_active_ise_by_uuid (const char *uuid)
+{
+ IMControlClient imcontrol_client;
+ imcontrol_client.open_connection ();
+ imcontrol_client.prepare ();
+ imcontrol_client.set_active_ise_by_uuid (uuid);
+ imcontrol_client.close_connection ();
+ return 0;
+}
+
+int isf_control_get_iselist (char ***iselist)
+{
+ int count;
+ IMControlClient imcontrol_client;
+ imcontrol_client.open_connection ();
+ imcontrol_client.prepare ();
+ imcontrol_client.get_iselist (&count, iselist);
+ imcontrol_client.close_connection ();
+ return count;
+}
+
+int isf_control_reset_ise_option (void)
+{
+ IMControlClient imcontrol_client;
+ imcontrol_client.open_connection ();
+ imcontrol_client.prepare ();
+ imcontrol_client.reset_ise_option ();
+ imcontrol_client.close_connection ();
+ return 0;
+}
+
+};
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Haifeng Deng <haifeng.deng@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __ISF_CONTROL_H
+#define __ISF_CONTROL_H
+
+namespace scim
+{
+
+ int isf_control_set_active_ise_by_uuid (const char *uuid);
+ int isf_control_get_iselist (char ***iselist);
+ int isf_control_reset_ise_option (void);
+
+}
+
+#endif /* __ISF_CONTROL_H */
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Haifeng Deng <haifeng.deng@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#define Uses_SCIM_TRANSACTION
+#define Uses_ISF_IMCONTROL_CLIENT
+
+
+#include <string.h>
+#include "scim.h"
+
+#define IMCONTROLDBG(str...)
+#define IMCONTROLERR(str...) printf(str)
+
+namespace scim
+{
+
+typedef Signal1<void, int> IMControlClientSignalVoid;
+
+class IMControlClient::IMControlClientImpl
+{
+ SocketClient m_socket_imclient2panel;
+ SocketClient m_socket_panel2imclient;
+ int m_socket_timeout;
+ uint32 m_socket_i2p_magic_key;
+ uint32 m_socket_p2i_magic_key;
+ Transaction m_trans;
+
+ IMControlClientSignalVoid m_signal_show_ise;
+ IMControlClientSignalVoid m_signal_hide_ise;
+
+public:
+ IMControlClientImpl ()
+ : m_socket_timeout (scim_get_default_socket_timeout ()),
+ m_socket_i2p_magic_key (0),
+ m_socket_p2i_magic_key (0) {
+ }
+
+ int open_connection () {
+ String config = "";
+ String display = String(getenv ("DISPLAY"));
+
+ SocketAddress addr (scim_get_default_panel_socket_address (display));
+
+ if (m_socket_imclient2panel.is_connected ()) close_connection ();
+
+ bool ret=false, ret2=false;
+ int count = 0;
+
+ /* Try three times. */
+ while (1) {
+ ret = m_socket_imclient2panel.connect (addr);
+ ret2 = m_socket_panel2imclient.connect (addr);
+ if (!ret) {
+ scim_usleep (100000);
+ scim_launch_panel (true, config, display, NULL);
+ for (int i = 0; i < 200; ++i) {
+ if (m_socket_imclient2panel.connect (addr)) {
+ ret = true;
+ break;
+ }
+ scim_usleep (100000);
+ }
+ }
+
+ if (ret && scim_socket_open_connection (m_socket_i2p_magic_key, String ("IMControl_Active"), String ("Panel"), m_socket_imclient2panel, m_socket_timeout)) {
+ if (ret2 && scim_socket_open_connection (m_socket_p2i_magic_key, String ("IMControl_Passive"), String ("Panel"), m_socket_panel2imclient, m_socket_timeout))
+ break;
+ }
+ m_socket_imclient2panel.close ();
+ m_socket_panel2imclient.close ();
+
+ if (count++ >= 3) break;
+
+ scim_usleep (100000);
+ }
+
+ return m_socket_imclient2panel.get_id ();
+ }
+
+ void close_connection () {
+ m_socket_imclient2panel.close ();
+ m_socket_panel2imclient.close ();
+ m_socket_i2p_magic_key = 0;
+ m_socket_p2i_magic_key = 0;
+ }
+
+ bool is_connected () const {
+ return (m_socket_imclient2panel.is_connected () && m_socket_panel2imclient.is_connected ());
+ }
+
+ int get_panel2imclient_connection_number () const {
+ return m_socket_panel2imclient.get_id ();
+ }
+
+ bool prepare () {
+ if (!m_socket_imclient2panel.is_connected ()) return false;
+
+ m_trans.clear ();
+ m_trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_trans.put_data (m_socket_i2p_magic_key);
+
+ return true;
+ }
+
+ bool send () {
+ if (!m_socket_imclient2panel.is_connected ()) return false;
+ if (m_trans.get_data_type () != SCIM_TRANS_DATA_UNKNOWN)
+ return m_trans.write_to_socket (m_socket_imclient2panel, 0x4d494353);
+ return false;
+ }
+
+
+ void show_ise (void *data, int length) {
+ m_trans.put_command (ISM_TRANS_CMD_SHOW_ISE_PANEL);
+ m_trans.put_data ((const char *)data, (size_t)length);
+ }
+
+ void hide_ise () {
+ m_trans.put_command (ISM_TRANS_CMD_HIDE_ISE_PANEL);
+ }
+
+ void show_control_panel () {
+ m_trans.put_command (ISM_TRANS_CMD_SHOW_ISF_CONTROL);
+ }
+
+ void hide_control_panel () {
+ m_trans.put_command (ISM_TRANS_CMD_HIDE_ISF_CONTROL);
+ }
+
+ void set_mode (int mode) {
+ m_trans.put_command (ISM_TRANS_CMD_SET_ISE_MODE);
+ m_trans.put_data (mode);
+ }
+
+ void set_imdata (const char* data, int len) {
+ m_trans.put_command (ISM_TRANS_CMD_SET_ISE_IMDATA);
+ m_trans.put_data (data, len);
+ }
+ void get_imdata (char* data, int* len) {
+ int cmd;
+ size_t datalen = 0;
+ char* data_temp = NULL;
+
+ m_trans.put_command (ISM_TRANS_CMD_GET_ISE_IMDATA);
+ m_trans.write_to_socket (m_socket_imclient2panel);
+ if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
+ IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
+
+ if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
+ m_trans.get_data (&data_temp, datalen)) {
+ memcpy (data, data_temp, datalen);
+ *len = datalen;
+ } else {
+ IMCONTROLERR ("%s:: get_command() or get_data() may fail!!!\n", __FUNCTION__);
+ }
+ delete [] data_temp;
+ }
+
+ void get_window_rect (int* x, int* y, int* width, int* height) {
+ int cmd;
+ uint32 x_temp = 0;
+ uint32 y_temp = 0;
+ uint32 w_temp = 0;
+ uint32 h_temp = 0;
+
+ m_trans.put_command (ISM_TRANS_CMD_GET_ACTIVE_ISE_SIZE);
+ m_trans.write_to_socket (m_socket_imclient2panel);
+
+ if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
+ IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
+
+ if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
+ m_trans.get_data (x_temp) &&
+ m_trans.get_data (y_temp) &&
+ m_trans.get_data (w_temp) &&
+ m_trans.get_data (h_temp)) {
+ *x = x_temp;
+ *y = y_temp;
+ *width = w_temp;
+ *height = h_temp;
+ } else {
+ IMCONTROLERR ("%s:: get_command() or get_data() may fail!!!\n", __FUNCTION__);
+ }
+ }
+
+ void set_private_key (int layout_index, int key_index, const char *label, const char *value) {
+ m_trans.put_command (ISM_TRANS_CMD_SET_PRIVATE_KEY);
+ m_trans.put_data (layout_index);
+ m_trans.put_data (key_index);
+ m_trans.put_data (label, strlen(label)+1);
+ m_trans.put_data (value, strlen(value)+1);
+
+ }
+ void set_private_key_by_image (int layout_index, int key_index, const char *img_path, const char *value) {
+ m_trans.put_command (ISM_TRANS_CMD_SET_PRIVATE_KEY_BY_IMG);
+ m_trans.put_data (layout_index);
+ m_trans.put_data (key_index);
+ m_trans.put_data (img_path, strlen(img_path)+1);
+ m_trans.put_data (value, strlen(value)+1);
+ }
+
+ void set_disable_key (int layout_index, int key_index, int disabled) {
+ m_trans.put_command (ISM_TRANS_CMD_SET_DISABLE_KEY);
+ m_trans.put_data (layout_index);
+ m_trans.put_data (key_index);
+ m_trans.put_data (disabled);
+ }
+
+ void set_layout (int layout) {
+ m_trans.put_command (ISM_TRANS_CMD_SET_LAYOUT);
+ m_trans.put_data (layout);
+ }
+
+ void get_layout (int* layout) {
+ int cmd;
+ uint32 layout_temp;
+
+ m_trans.put_command (ISM_TRANS_CMD_GET_LAYOUT);
+ m_trans.write_to_socket (m_socket_imclient2panel);
+ if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
+ IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
+
+ if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
+ m_trans.get_data (layout_temp)) {
+ *layout = layout_temp;
+ } else {
+ IMCONTROLERR ("%s:: get_command() or get_data() may fail!!!\n", __FUNCTION__);
+ }
+ }
+
+ void set_ise_language (int language) {
+ m_trans.put_command (ISM_TRANS_CMD_SET_ISE_LANGUAGE);
+ m_trans.put_data (language);
+ }
+
+ void reset () {
+ m_trans.put_command (ISM_TRANS_CMD_RESET_ISE_CONTEXT);
+ }
+
+ void set_screen_orientation (int orientation) {
+ m_trans.put_command (ISM_TRANS_CMD_SET_ISE_SCREEN_DIRECTION);
+ m_trans.put_data (orientation);
+
+ }
+
+ void get_active_isename (char* name) {
+ int cmd;
+ size_t datalen = 0;
+ char* name_temp = NULL;
+
+ m_trans.put_command (ISM_TRANS_CMD_GET_ACTIVE_ISE_NAME);
+ m_trans.write_to_socket (m_socket_imclient2panel);
+ if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
+ IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
+
+ if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
+ m_trans.get_data (&name_temp, datalen) ) {
+ strncpy (name, name_temp, strlen (name_temp));
+ } else {
+ IMCONTROLERR ("%s:: get_command() or get_data() may fail!!!\n", __FUNCTION__);
+ }
+ if (name_temp)
+ delete [] name_temp;
+ }
+
+ void set_active_ise_by_name (const char* name) {
+ int cmd;
+ m_trans.put_command (ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_NAME);
+ m_trans.put_data (name, strlen(name)+1);
+ m_trans.write_to_socket (m_socket_imclient2panel);
+ if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
+ IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
+
+ if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) {
+ } else {
+ IMCONTROLERR ("%s:: get_command() or get_data() may fail!!!\n", __FUNCTION__);
+ }
+ }
+
+ void set_active_ise_by_uuid (const char* uuid) {
+ int cmd;
+ m_trans.put_command (ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID);
+ m_trans.put_data (uuid, strlen(uuid)+1);
+ m_trans.write_to_socket (m_socket_imclient2panel);
+ if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
+ IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
+
+ if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) {
+ } else {
+ IMCONTROLERR ("%s:: get_command() or get_data() may fail!!!\n", __FUNCTION__);
+ }
+ }
+
+ void get_iselist (int* count, char*** iselist) {
+ int cmd;
+ uint32 count_temp = 0;
+ char **buf = NULL;
+ size_t len;
+ char * buf_temp = NULL;
+
+ m_trans.put_command (ISM_TRANS_CMD_GET_ISE_LIST);
+ m_trans.write_to_socket (m_socket_imclient2panel);
+ if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
+ IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
+
+ if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
+ m_trans.get_data (count_temp) ) {
+ *count = count_temp;
+ } else {
+ *count = 0;
+ IMCONTROLERR ("%s:: get_command() or get_data() may fail!!!\n", __FUNCTION__);
+ }
+
+ if (count_temp > 0) {
+ buf = (char**)malloc(count_temp * sizeof (char*));
+ if (buf) {
+ memset (buf, 0, count_temp*sizeof(char*));
+ for (uint32 i = 0; i < count_temp; i++) {
+ if (m_trans.get_data (&buf_temp, len))
+ buf[i] = buf_temp;
+ }
+ }
+ }
+ *iselist = buf;
+ }
+
+ void reset_ise_option (void) {
+ int cmd;
+
+ m_trans.put_command (ISM_TRANS_CMD_RESET_ISE_OPTION);
+ m_trans.write_to_socket (m_socket_imclient2panel);
+ if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
+ IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
+
+ if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) {
+ ;
+ } else {
+ IMCONTROLERR ("%s:: get_command() is failed!!!\n", __FUNCTION__);
+ }
+ }
+
+ void set_caps_mode (int mode) {
+ m_trans.put_command (ISM_TRANS_CMD_SET_CAPS_MODE);
+ m_trans.put_data (mode);
+ }
+};
+
+IMControlClient::IMControlClient ()
+ : m_impl (new IMControlClientImpl ())
+{
+}
+
+IMControlClient::~IMControlClient ()
+{
+ delete m_impl;
+}
+
+int
+IMControlClient::open_connection ()
+{
+ return m_impl->open_connection ();
+}
+
+void
+IMControlClient::close_connection ()
+{
+ m_impl->close_connection ();
+}
+
+bool IMControlClient::is_connected () const
+{
+ return m_impl->is_connected ();
+}
+
+int IMControlClient::get_panel2imclient_connection_number () const
+{
+ return m_impl->get_panel2imclient_connection_number ();
+}
+
+bool
+IMControlClient::prepare ()
+{
+ return m_impl->prepare ();
+}
+
+bool
+IMControlClient::send ()
+{
+ return m_impl->send ();
+}
+
+void IMControlClient::show_ise (void *data, int length)
+{
+ m_impl->show_ise (data,length);
+}
+
+void IMControlClient::hide_ise ()
+{
+ m_impl->hide_ise ();
+}
+
+void IMControlClient::show_control_panel ()
+{
+ m_impl->show_control_panel ();
+}
+
+void IMControlClient::hide_control_panel ()
+{
+ m_impl->hide_control_panel ();
+}
+
+void IMControlClient::set_mode (int mode)
+{
+ m_impl->set_mode (mode);
+}
+
+void IMControlClient::set_imdata (const char* data, int len)
+{
+ m_impl->set_imdata (data, len);
+}
+
+void IMControlClient::get_imdata (char* data, int* len)
+{
+ m_impl->get_imdata (data, len);
+}
+
+void IMControlClient::get_window_rect (int* x, int* y, int* width, int* height)
+{
+ m_impl->get_window_rect (x, y, width, height);
+}
+
+void IMControlClient::set_private_key (int layout_index, int key_index, const char *label, const char *value)
+{
+ m_impl->set_private_key (layout_index, key_index, label, value);
+}
+
+void IMControlClient::set_private_key_by_image (int layout_index, int key_index, const char *img_path, const char *value)
+{
+ m_impl->set_private_key_by_image (layout_index, key_index, img_path, value);
+}
+
+void IMControlClient::set_disable_key (int layout_index, int key_index, int disabled)
+{
+ m_impl->set_disable_key (layout_index, key_index, disabled);
+}
+
+void IMControlClient::set_layout (int layout)
+{
+ m_impl->set_layout (layout);
+}
+
+void IMControlClient::get_layout (int* layout)
+{
+ m_impl->get_layout (layout);
+}
+
+void IMControlClient::set_ise_language (int language)
+{
+ m_impl->set_ise_language (language);
+}
+
+void IMControlClient::reset ()
+{
+ m_impl->reset ();
+}
+
+void IMControlClient::set_screen_orientation (int orientation)
+{
+ m_impl->set_screen_orientation (orientation);
+}
+
+void IMControlClient::get_active_isename (char* name)
+{
+ m_impl->get_active_isename (name);
+}
+
+void IMControlClient::set_active_ise_by_name (const char* name)
+{
+ m_impl->set_active_ise_by_name (name);
+}
+
+void IMControlClient::set_active_ise_by_uuid (const char* uuid)
+{
+ m_impl->set_active_ise_by_uuid (uuid);
+}
+
+void IMControlClient::get_iselist (int* count, char*** iselist)
+{
+ m_impl->get_iselist (count, iselist);
+}
+
+void IMControlClient::reset_ise_option (void)
+{
+ m_impl->reset_ise_option ();
+}
+
+void IMControlClient::set_caps_mode (int mode)
+{
+ m_impl->set_caps_mode (mode);
+}
+
+};
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Haifeng Deng <haifeng.deng@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __ISF_IMCONTROL_CLIENT_H
+#define __ISF_IMCONTROL_CLIENT_H
+
+namespace scim
+{
+
+typedef Slot1<void, int> IMControlClientSlotVoid;
+
+
+class IMControlClient
+{
+ class IMControlClientImpl;
+ IMControlClientImpl *m_impl;
+
+ IMControlClient (const IMControlClient &);
+ const IMControlClient & operator = (const IMControlClient &);
+
+public:
+ IMControlClient ();
+ ~IMControlClient ();
+
+ int open_connection ();
+ void close_connection ();
+ bool is_connected () const;
+ int get_panel2imclient_connection_number () const;
+ bool prepare ();
+ bool send ();
+
+ void show_ise (void *data, int length);
+ void hide_ise ();
+ void show_control_panel ();
+ void hide_control_panel ();
+ void set_mode (int mode);
+ void set_lang (int lang);
+
+ void set_imdata (const char* data, int len);
+ void get_imdata (char* data, int* len);
+ void get_window_rect (int* x, int* y, int* width, int* height);
+ void set_private_key (int layout_index, int key_index, const char *label, const char *value);
+ void set_private_key_by_image (int layout_index, int key_index, const char *img_path, const char *value);
+ void set_disable_key (int layout_index, int key_index, int disabled);
+ void set_layout (int layout);
+ void get_layout (int* layout);
+ void set_ise_language (int language);
+ void reset ();
+ void set_screen_orientation (int orientation);
+ void get_active_isename (char* name);
+ void set_active_ise_by_name (const char* name);
+ void set_active_ise_by_uuid (const char* uuid);
+ void get_iselist (int* count, char*** iselist);
+ void reset_ise_option (void);
+ void set_caps_mode (int mode);
+};
+
+}
+
+#endif /* __ISF_IMCONTROL_CLIENT_H */
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Haifeng Deng <haifeng.deng@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#define Uses_SCIM_HELPER_MANAGER
+#define Uses_SCIM_PANEL_CLIENT
+
+#include "scim.h"
+#include "scim_private.h"
+
+#undef GDK_WINDOWING_X11
+
+#if GDK_MULTIHEAD_SAFE
+#include <gdk/gdk.h>
+#include <gdk/gdkx.h>
+#include <gtk/gtk.h>
+#endif
+
+#include <string.h>
+#include <list>
+
+
+using namespace scim;
+
+static void _enable_panel_agent_log (bool _enable_debug)
+{
+ String display_name;
+ String config_name ("socket");
+ int id = 0;
+
+ {
+#if GDK_MULTIHEAD_SAFE
+ const char *p = gdk_display_get_name (gdk_display_get_default ());
+#else
+ const char *p = getenv ("DISPLAY");
+#endif
+ if (p) display_name = String (p);
+ }
+
+ String address = scim_get_default_panel_socket_address (display_name);
+
+ SocketAddress m_socket_address;
+ SocketClient m_socket_client;
+ m_socket_address.set_address (address);
+
+ printf ("%s:%d...\n", __FUNCTION__, __LINE__);
+ if (!m_socket_address.valid ())
+ return;
+ printf ("%s:%d...\n", __FUNCTION__, __LINE__);
+ PanelClient panel_client;
+ if (panel_client.open_connection (config_name, display_name) >= 0) {
+ panel_client.prepare (id);
+ panel_client.turn_on_log (id, _enable_debug);
+ panel_client.send ();
+ }
+}
+
+static void _enable_frontend_log (bool _enable_debug)
+{
+ HelperManager m_helper_manager;
+
+ m_helper_manager.turn_on_log (_enable_debug);
+}
+
+int main (int argc, char **argv)
+{
+ bool _enable_debug;
+
+ if (argc != 2) {
+ printf ("usage: isf_log [on/off]\n");
+ return -1;
+ }
+
+ if (!strcmp (argv[1], "on"))
+ _enable_debug = true;
+ else if (!strcmp (argv[1], "off"))
+ _enable_debug = false;
+ else {
+ printf ("usage: isf_log [on/off]\n");
+ return -1;
+ }
+
+#if GDK_MULTIHEAD_SAFE
+ gtk_init (&argc, &argv);
+#endif
+
+ printf ("after gtk_init...\n");
+ try {
+ _enable_panel_agent_log (_enable_debug);
+ _enable_frontend_log (_enable_debug);
+ } catch (...) {
+ printf ("exception happen...\n");
+ }
+ return 0;
+}
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Haifeng Deng <haifeng.deng@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#define Uses_SCIM_DEBUG
+#define Uses_SCIM_CONFIG
+#define Uses_SCIM_CONFIG_MODULE
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_SCIM_UTILITY
+#define Uses_SCIM_PANEL_AGENT
+
+
+#include <sys/stat.h>
+#include <string.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <vconf.h>
+#include "scim_private.h"
+#include "scim.h"
+#include "isf_query_utility.h"
+
+
+using namespace scim;
+
+
+static void print_help (void)
+{
+ std::cout << "Usage: isf-query-engines [option] ISE_MODULE_NAME\n\n"
+ << "The options are: \n"
+ << " -u, --uninstall If this option is not specified, the default action is to install.\n"
+ << " -t, --type isetype If this option is not specified, the default type is 0(keyboardISE).\n"
+ << " -h, --help Show this help message.\n";
+}
+
+int main (int argc, char *argv[])
+{
+ char *isename = NULL;
+ int isetype = 0;
+ int uninstall = 0;
+
+ int i = 1;
+ while (i < argc) {
+ if (String ("-t") == String (argv[i]) || String ("--type") == String (argv[i])) {
+ if (++i >= argc) {
+ std::cerr << "No argument for option " << argv [i-1] << "\n";
+ return -1;
+ }
+ isetype = atoi (argv[i]);
+ i++;
+ continue;
+ }
+
+ if (String ("-u") == String (argv[i]) || String ("--uninstall") == String (argv[i])) {
+ i++;
+ uninstall = 1;
+ continue;
+ }
+
+ if (String ("-h") == String (argv[i]) || String ("--help") == String (argv[i])) {
+ print_help ();
+ return 0;
+ }
+
+ isename = argv[i];
+ i++;
+ }
+
+ String sys_file_name = String (SYS_ENGINE_FILE_NAME);
+ String user_file_name = String (USER_ENGINE_FILE_NAME);
+ String engine_file_name = sys_file_name;
+
+ if (access (engine_file_name.c_str (), F_OK | W_OK) != 0) {
+ FILE *filp = fopen (engine_file_name.c_str (), "a");
+ if (filp == NULL)
+ engine_file_name = user_file_name;
+ else
+ fclose (filp);
+ }
+
+ if (uninstall == 1) {
+ isf_remove_ise_info_from_file (engine_file_name.c_str (), isename);
+ return 0;
+ }
+
+ ConfigModule *_config_module = 0;
+ ConfigPointer _config;
+
+ _config_module = new ConfigModule ("simple");
+ if (_config_module != NULL && _config_module->valid ())
+ _config = _config_module->create_config ();
+ if (_config.null ()) {
+ std::cerr << "Config module cannot be loaded, using dummy Config.\n";
+
+ if (_config_module) delete _config_module;
+ _config_module = NULL;
+
+ _config = new DummyConfig ();
+ }
+
+ char *lang_str = vconf_get_str (VCONFKEY_LANGSET);
+
+ if (strlen (lang_str)) {
+ setenv ("LANG", lang_str, 1);
+ setlocale (LC_MESSAGES, lang_str);
+ free(lang_str);
+ } else {
+ setenv ("LANG", "en_US.utf8", 1);
+ setlocale (LC_MESSAGES, "en_US.utf8");
+ }
+
+ if (argc == 1) {
+ isf_update_ise_info_to_file (engine_file_name.c_str (), _config);
+ return 0;
+ }
+
+ if (isetype == 0)
+ isf_add_keyboard_info_to_file (engine_file_name.c_str (), isename, _config);
+ else
+ isf_add_helper_info_to_file (engine_file_name.c_str (), isename);
+
+ return 0;
+}
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Haifeng Deng <haifeng.deng@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#define Uses_SCIM_DEBUG
+#define Uses_SCIM_IMENGINE
+#define Uses_SCIM_IMENGINE_MODULE
+#define Uses_SCIM_HELPER_MODULE
+#define Uses_SCIM_CONFIG
+#define Uses_SCIM_CONFIG_MODULE
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_C_LOCALE
+#define Uses_SCIM_UTILITY
+#define Uses_SCIM_PANEL_AGENT
+
+
+#include <sys/stat.h>
+#include <string.h>
+#include <stdio.h>
+#include <unistd.h>
+#include "scim_private.h"
+#include "scim.h"
+#include "isf_query_utility.h"
+
+
+using namespace scim;
+
+
+/**
+ * @brief Get normalized language name.
+ *
+ * @param src_str The language name before normalized.
+ *
+ * @return normalized language name.
+ */
+String isf_get_normalized_language (String src_str)
+{
+ std::vector<String> str_list, dst_list;
+ scim_split_string_list (str_list, src_str);
+
+ for (size_t i = 0; i < str_list.size (); i++)
+ dst_list.push_back (scim_get_normalized_language (str_list[i]));
+
+ String dst_str = scim_combine_string_list (dst_list);
+
+ return dst_str;
+}
+
+void isf_get_ise_info_from_string (const char *str, ISEINFO &info)
+{
+ if (str == NULL || strlen (str) == 0)
+ return;
+
+ char *buf = strdup (str);
+ if (buf == NULL)
+ return;
+
+ int len = strlen (buf);
+ for (int i = 0; i < len; i++) {
+ if (buf[i] == ':' || buf[i] == '\n')
+ buf[i] = '\0';
+ }
+
+ int j = 0;
+ info.name = buf + j;
+ j += strlen (buf + j) + 1;
+ info.uuid = buf + j;
+ j += strlen (buf + j) + 1;
+ info.module = buf + j;
+ j += strlen (buf + j) + 1;
+ info.language = buf + j;
+ j += strlen (buf + j) + 1;
+ info.icon = buf + j;
+ j += strlen (buf + j) + 1;
+ info.mode = (TOOLBAR_MODE_T)atoi (buf + j);
+ j += strlen (buf + j) + 1;
+ info.option = (uint32)atoi (buf + j);
+ j += strlen (buf + j) + 1;
+ info.locales = buf + j;
+
+ free (buf);
+}
+
+String isf_combine_ise_info_string (String name, String uuid, String module, String language,
+ String icon, String mode, String option, String locales)
+{
+ String line = name + String (":") + uuid + String (":") + module + String (":") + language + String (":") +
+ icon + String (":") + mode + String (":") + option + String (":") + locales + String ("\n");
+ return line;
+}
+
+bool isf_read_ise_info_list (const char *filename, std::vector<ISEINFO> &info_list)
+{
+ info_list.clear ();
+ FILE *engine_list_file = fopen (filename, "r");
+ if (engine_list_file == NULL) {
+ std::cerr << "failed to open " << filename << "\n";
+ return false;
+ }
+
+ char buf[MAXLINE];
+ while (fgets (buf, MAXLINE, engine_list_file) != NULL && strlen (buf) > 0) {
+ ISEINFO info;
+ isf_get_ise_info_from_string (buf, info);
+
+ info_list.push_back (info);
+ }
+
+ fclose (engine_list_file);
+ return true;
+}
+
+bool isf_write_ise_info_list (const char *filename, std::vector<ISEINFO> &info_list)
+{
+ if (info_list.size () <= 0)
+ return false;
+
+ FILE *engine_list_file = fopen (filename, "w+");
+ if (engine_list_file == NULL) {
+ std::cerr << "failed to open " << filename << "\n";
+ return false;
+ }
+
+ std::vector<ISEINFO>::iterator iter;
+ for (iter = info_list.begin (); iter != info_list.end (); iter++) {
+ char mode[12];
+ char option[12];
+ snprintf (mode, sizeof (mode), "%d", (int)iter->mode);
+ snprintf (option, sizeof (option), "%d", iter->option);
+
+ String line = isf_combine_ise_info_string (iter->name, iter->uuid, iter->module, iter->language,
+ iter->icon, String (mode), String (option), iter->locales);
+ if (fputs (line.c_str (), engine_list_file) < 0) {
+ std::cerr << "write to ise cache file failed:" << line << "\n";
+ break;
+ }
+ }
+
+ fclose (engine_list_file);
+ return true;
+}
+
+static void add_keyboard_info_to_list (std::vector<ISEINFO> &info_list, const char *module_name, const ConfigPointer &config)
+{
+ if (module_name == NULL)
+ return;
+
+ IMEngineFactoryPointer factory;
+ IMEngineModule ime_module;
+ ime_module.load (module_name, config);
+ if (ime_module.valid ()) {
+ for (size_t j = 0; j < ime_module.number_of_factories (); ++j) {
+ try {
+ factory = ime_module.create_factory (j);
+ } catch (...) {
+ factory.reset ();
+ }
+
+ if (!factory.null ()) {
+ ISEINFO info;
+
+ info.name = utf8_wcstombs (factory->get_name ());
+ info.uuid = factory->get_uuid ();
+ info.module = module_name;
+ info.language = isf_get_normalized_language (factory->get_language ());
+ info.icon = factory->get_icon_file ();
+ info.mode = TOOLBAR_KEYBOARD_MODE;
+ info.option = 0;
+ info.locales = factory->get_locales ();
+
+ info_list.push_back (info);
+ factory.reset ();
+ }
+ }
+ ime_module.unload ();
+ }
+}
+
+static void add_helper_info_to_list (std::vector<ISEINFO> &info_list, const char *module_name)
+{
+ if (module_name == NULL)
+ return;
+
+ HelperModule helper_module;
+ HelperInfo helper_info;
+ helper_module.load (module_name);
+ if (helper_module.valid ()) {
+ for (size_t j = 0; j < helper_module.number_of_helpers (); ++j) {
+ ISEINFO info;
+ helper_module.get_helper_info (j, helper_info);
+ info.name = helper_info.name;
+ info.uuid = helper_info.uuid;
+ info.module = module_name;
+ info.language = isf_get_normalized_language (helper_module.get_helper_lang (j));
+ info.icon = helper_info.icon;
+ info.mode = TOOLBAR_HELPER_MODE;
+ info.option = helper_info.option;
+ info.locales = String ("");
+
+ info_list.push_back (info);
+ }
+ helper_module.unload ();
+ }
+}
+
+static void remove_ise_info_from_list (std::vector<ISEINFO> &info_list, const char *module_name)
+{
+ if (module_name == NULL)
+ return;
+
+ std::vector<ISEINFO>::iterator iter;
+ while (info_list.size () > 0) {
+ for (iter = info_list.begin (); iter != info_list.end (); iter++) {
+ if (iter->module == module_name)
+ break;
+ }
+
+ if (iter != info_list.end ())
+ info_list.erase (iter);
+ else
+ break;
+ }
+}
+
+bool isf_add_keyboard_info_to_file (const char *filename, const char *module_name, const ConfigPointer &config)
+{
+ std::vector<ISEINFO> info_list;
+ std::vector<ISEINFO>::iterator iter;
+ isf_read_ise_info_list (filename, info_list);
+
+ /* Firstly, remove the info of the specified modules from info_list */
+ remove_ise_info_from_list (info_list, module_name);
+
+ add_keyboard_info_to_list (info_list, module_name, config);
+
+ return isf_write_ise_info_list (filename, info_list);
+}
+
+bool isf_add_helper_info_to_file (const char *filename, const char *module_name)
+{
+ std::vector<ISEINFO> info_list;
+ std::vector<ISEINFO>::iterator iter;
+ isf_read_ise_info_list (filename, info_list);
+
+ /* Firstly, remove the info of the specified modules from info_list */
+ remove_ise_info_from_list (info_list, module_name);
+
+ add_helper_info_to_list (info_list, module_name);
+
+ return isf_write_ise_info_list (filename, info_list);
+}
+
+void isf_remove_ise_info_from_file (const char *filename, const char *module_name)
+{
+ std::vector<ISEINFO> info_list;
+ std::vector<ISEINFO>::iterator iter;
+ isf_read_ise_info_list (filename, info_list);
+
+ remove_ise_info_from_list (info_list, module_name);
+
+ isf_write_ise_info_list (filename, info_list);
+}
+
+void isf_update_ise_info_to_file (const char *filename, const ConfigPointer &config)
+{
+ if (filename == NULL)
+ return;
+
+ std::vector<ISEINFO> info_list;
+
+ std::vector<String> imengine_list;
+ scim_get_imengine_module_list (imengine_list);
+ for (size_t i = 0; i < imengine_list.size (); ++i) {
+ if (imengine_list[i] != String ("socket"))
+ add_keyboard_info_to_list (info_list, imengine_list[i].c_str (), config);
+ }
+
+ std::vector<String> helper_list;
+ scim_get_helper_module_list (helper_list);
+ for (size_t i = 0; i < helper_list.size (); ++i) {
+ add_helper_info_to_list (info_list, helper_list[i].c_str ());
+ }
+
+ isf_write_ise_info_list (filename, info_list);
+}
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Haifeng Deng <haifeng.deng@samsung.com>, Hengliang Luo <hl.luo@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __ISF_QUERY_UTILITY_H
+#define __ISF_QUERY_UTILITY_H
+
+using namespace scim;
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Declaration of macro.
+/////////////////////////////////////////////////////////////////////////////
+#define MAXLINE 4096
+#define USER_ENGINE_LIST_PATH "/opt/home/root/.scim"
+
+#ifndef SCIM_SYSCONFDIR
+ #define SCIM_SYSCONFDIR "/usr/etc"
+#endif
+
+#define USER_ENGINE_FILE_NAME (USER_ENGINE_LIST_PATH "/engines_list")
+#define SYS_ENGINE_FILE_NAME (SCIM_SYSCONFDIR "/scim/engines_list")
+
+
+typedef struct {
+ String name;
+ String uuid;
+ String module;
+ String language;
+ String icon;
+ TOOLBAR_MODE_T mode;
+ uint32 option;
+ String locales;
+} ISEINFO;
+
+String isf_get_normalized_language (String src_str);
+String isf_combine_ise_info_string (String name, String uuid, String module, String language,
+ String icon, String mode, String option, String locales);
+void isf_get_ise_info_from_string (const char *str, ISEINFO &info);
+bool isf_read_ise_info_list (const char *filename, std::vector<ISEINFO> &info_list);
+bool isf_write_ise_info_list (const char *filename, std::vector<ISEINFO> &info_list);
+bool isf_add_keyboard_info_to_file (const char *filename, const char *module_name, const ConfigPointer &config);
+bool isf_add_helper_info_to_file (const char *filename, const char *module_name);
+void isf_remove_ise_info_from_file (const char *filename, const char *module_name);
+void isf_update_ise_info_to_file (const char *filename, const ConfigPointer &config);
+
+#endif /* __ISF_QUERY_UTILITY_H */
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+LIBSCIM_1.0 {
+ global:
+ extern "C++" {
+ *scim::*;
+ };
+
+ local:
+ *;
+};
--- /dev/null
+/* ltdl.c -- system independent dlopen wrapper
+ Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+ Originally by Thomas Tanner <tanner@ffii.org>
+ This file is part of GNU Libtool.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+As a special exception to the GNU Lesser General Public License,
+if you distribute this file as part of a program or library that
+is built using GNU libtool, you may include it under the same
+distribution terms that you use for the rest of that program.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA
+
+*/
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if HAVE_STDIO_H
+# include <stdio.h>
+#endif
+
+/* Include the header defining malloc. On K&R C compilers,
+ that's <malloc.h>, on ANSI C and ISO C compilers, that's <stdlib.h>. */
+#if HAVE_STDLIB_H
+# include <stdlib.h>
+#else
+# if HAVE_MALLOC_H
+# include <malloc.h>
+# endif
+#endif
+
+#if HAVE_STRING_H
+# include <string.h>
+#else
+# if HAVE_STRINGS_H
+# include <strings.h>
+# endif
+#endif
+
+#if HAVE_CTYPE_H
+# include <ctype.h>
+#endif
+
+#if HAVE_MEMORY_H
+# include <memory.h>
+#endif
+
+#if HAVE_ERRNO_H
+# include <errno.h>
+#endif
+
+
+#ifndef __WINDOWS__
+# ifdef __WIN32__
+# define __WINDOWS__
+# endif
+#endif
+
+
+#undef LT_USE_POSIX_DIRENT
+#ifdef HAVE_CLOSEDIR
+# ifdef HAVE_OPENDIR
+# ifdef HAVE_READDIR
+# ifdef HAVE_DIRENT_H
+# define LT_USE_POSIX_DIRENT
+# endif /* HAVE_DIRENT_H */
+# endif /* HAVE_READDIR */
+# endif /* HAVE_OPENDIR */
+#endif /* HAVE_CLOSEDIR */
+
+
+#undef LT_USE_WINDOWS_DIRENT_EMULATION
+#ifndef LT_USE_POSIX_DIRENT
+# ifdef __WINDOWS__
+# define LT_USE_WINDOWS_DIRENT_EMULATION
+# endif /* __WINDOWS__ */
+#endif /* LT_USE_POSIX_DIRENT */
+
+
+#ifdef LT_USE_POSIX_DIRENT
+# include <dirent.h>
+# define LT_D_NAMLEN(dirent) (strlen((dirent)->d_name))
+#else
+# ifdef LT_USE_WINDOWS_DIRENT_EMULATION
+# define LT_D_NAMLEN(dirent) (strlen((dirent)->d_name))
+# else
+# define dirent direct
+# define LT_D_NAMLEN(dirent) ((dirent)->d_namlen)
+# if HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+# endif
+# if HAVE_SYS_DIR_H
+# include <sys/dir.h>
+# endif
+# if HAVE_NDIR_H
+# include <ndir.h>
+# endif
+# endif
+#endif
+
+#if HAVE_ARGZ_H
+# include <argz.h>
+#endif
+
+#if HAVE_ASSERT_H
+# include <assert.h>
+#else
+# define assert(arg) ((void) 0)
+#endif
+
+#include "ltdl.h"
+
+#if WITH_DMALLOC
+# include <dmalloc.h>
+#endif
+
+
+
+\f
+/* --- WINDOWS SUPPORT --- */
+
+
+#ifdef DLL_EXPORT
+# define LT_GLOBAL_DATA __declspec(dllexport)
+#else
+# define LT_GLOBAL_DATA
+#endif
+
+/* fopen() mode flags for reading a text file */
+#undef LT_READTEXT_MODE
+#ifdef __WINDOWS__
+# define LT_READTEXT_MODE "rt"
+#else
+# define LT_READTEXT_MODE "r"
+#endif
+
+#ifdef LT_USE_WINDOWS_DIRENT_EMULATION
+
+#include <windows.h>
+
+#define dirent lt_dirent
+#define DIR lt_DIR
+
+struct dirent
+{
+ char d_name[2048];
+ int d_namlen;
+};
+
+typedef struct _DIR
+{
+ HANDLE hSearch;
+ WIN32_FIND_DATA Win32FindData;
+ BOOL firsttime;
+ struct dirent file_info;
+} DIR;
+
+#endif /* LT_USE_WINDOWS_DIRENT_EMULATION */
+
+namespace scim {
+
+\f
+/* --- MANIFEST CONSTANTS --- */
+
+
+/* Standard libltdl search path environment variable name */
+#undef LTDL_SEARCHPATH_VAR
+#define LTDL_SEARCHPATH_VAR "LTDL_LIBRARY_PATH"
+
+/* Standard libtool archive file extension. */
+#undef LTDL_ARCHIVE_EXT
+#define LTDL_ARCHIVE_EXT ".la"
+
+#ifndef LTDL_OBJDIR
+# ifdef LT_OBJDIR
+# define LTDL_OBJDIR LT_OBJDIR
+# endif
+#endif
+
+#ifndef LTDL_SHLIBPATH_VAR
+# ifdef LT_MODULE_PATH_VAR
+# define LTDL_SHLIBPATH_VAR LT_MODULE_PATH_VAR
+# endif
+#endif
+
+#ifndef LTDL_SHLIB_EXT
+# ifdef LT_MODULE_EXT
+# define LTDL_SHLIB_EXT LT_MODULE_EXT
+# endif
+#endif
+
+#ifndef LTDL_SYSSEARCHPATH
+# ifdef LT_DLSEARCH_PATH
+# define LTDL_SYSSEARCHPATH LT_DLSEARCH_PATH
+# endif
+#endif
+
+/* max. filename length */
+#ifndef LT_FILENAME_MAX
+# define LT_FILENAME_MAX 1024
+#endif
+
+/* This is the maximum symbol size that won't require malloc/free */
+#undef LT_SYMBOL_LENGTH
+#define LT_SYMBOL_LENGTH 128
+
+/* This accounts for the _LTX_ separator */
+#undef LT_SYMBOL_OVERHEAD
+#define LT_SYMBOL_OVERHEAD 5
+
+
+
+\f
+/* --- MEMORY HANDLING --- */
+
+
+/* These are the functions used internally. In addition to making
+ use of the associated function pointers above, they also perform
+ error handling. */
+static char *lt_estrdup LT_PARAMS((const char *str));
+static lt_ptr lt_emalloc LT_PARAMS((size_t size));
+static lt_ptr lt_erealloc LT_PARAMS((lt_ptr addr, size_t size));
+
+/* static lt_ptr rpl_realloc LT_PARAMS((lt_ptr ptr, size_t size)); */
+#define rpl_realloc realloc
+
+/* These are the pointers that can be changed by the caller: */
+LT_GLOBAL_DATA lt_ptr (*lt_dlmalloc) LT_PARAMS((size_t size))
+ = (lt_ptr (*) LT_PARAMS((size_t))) malloc;
+LT_GLOBAL_DATA lt_ptr (*lt_dlrealloc) LT_PARAMS((lt_ptr ptr, size_t size))
+ = (lt_ptr (*) LT_PARAMS((lt_ptr, size_t))) rpl_realloc;
+LT_GLOBAL_DATA void (*lt_dlfree) LT_PARAMS((lt_ptr ptr))
+ = (void (*) LT_PARAMS((lt_ptr))) free;
+
+/* The following macros reduce the amount of typing needed to cast
+ assigned memory. */
+#if WITH_DMALLOC
+
+#define LT_DLMALLOC(tp, n) ((tp *) xmalloc ((n) * sizeof(tp)))
+#define LT_DLREALLOC(tp, p, n) ((tp *) xrealloc ((p), (n) * sizeof(tp)))
+#define LT_DLFREE(p) \
+ LT_STMT_START { if (p) { xfree (p); (p) = 0; } } LT_STMT_END
+
+#define LT_EMALLOC(tp, n) ((tp *) xmalloc ((n) * sizeof(tp)))
+#define LT_EREALLOC(tp, p, n) ((tp *) xrealloc ((p), (n) * sizeof(tp)))
+
+#else
+
+#define LT_DLMALLOC(tp, n) ((tp *) lt_dlmalloc ((n) * sizeof(tp)))
+#define LT_DLREALLOC(tp, p, n) ((tp *) lt_dlrealloc ((p), (n) * sizeof(tp)))
+#define LT_DLFREE(p) \
+ LT_STMT_START { if (p) { lt_dlfree (p); (p) = 0; } } LT_STMT_END
+
+#define LT_EMALLOC(tp, n) ((tp *) lt_emalloc ((n) * sizeof(tp)))
+#define LT_EREALLOC(tp, p, n) ((tp *) lt_erealloc ((p), (n) * sizeof(tp)))
+
+#endif
+
+#define LT_DLMEM_REASSIGN(p, q) LT_STMT_START { \
+ if ((p) != (q)) { if (p) lt_dlfree (p); (p) = (q); (q) = 0; } \
+ } LT_STMT_END
+
+\f
+/* --- REPLACEMENT FUNCTIONS --- */
+
+
+#undef strdup
+#define strdup rpl_strdup
+
+static char *strdup LT_PARAMS((const char *str));
+
+static char *
+strdup(const char *str)
+{
+ char *tmp = 0;
+
+ if (str)
+ {
+ tmp = LT_DLMALLOC (char, 1+ strlen (str));
+ if (tmp)
+ {
+ strcpy(tmp, str);
+ }
+ }
+
+ return tmp;
+}
+
+
+#if ! HAVE_STRCMP
+
+#undef strcmp
+#define strcmp rpl_strcmp
+
+static int strcmp LT_PARAMS((const char *str1, const char *str2));
+
+static int
+strcmp (const char *str1, const char *str2)
+{
+ if (str1 == str2)
+ return 0;
+ if (str1 == 0)
+ return -1;
+ if (str2 == 0)
+ return 1;
+
+ for (;*str1 && *str2; ++str1, ++str2)
+ {
+ if (*str1 != *str2)
+ break;
+ }
+
+ return (int)(*str1 - *str2);
+}
+#endif
+
+
+#if ! HAVE_STRCHR
+
+# if HAVE_INDEX
+# define strchr index
+# else
+# define strchr rpl_strchr
+
+static const char *strchr LT_PARAMS((const char *str, int ch));
+
+static const char*
+strchr(const char *str, int ch)
+{
+ const char *p;
+
+ for (p = str; *p != (char)ch && *p != LT_EOS_CHAR; ++p)
+ /*NOWORK*/;
+
+ return (*p == (char)ch) ? p : 0;
+}
+
+# endif
+#endif /* !HAVE_STRCHR */
+
+
+#if ! HAVE_STRRCHR
+
+# if HAVE_RINDEX
+# define strrchr rindex
+# else
+# define strrchr rpl_strrchr
+
+static const char *strrchr LT_PARAMS((const char *str, int ch));
+
+static const char*
+strrchr(const char *str, int ch)
+{
+ const char *p, *q = 0;
+
+ for (p = str; *p != LT_EOS_CHAR; ++p)
+ {
+ if (*p == (char) ch)
+ {
+ q = p;
+ }
+ }
+
+ return q;
+}
+
+# endif
+#endif
+
+/* NOTE: Neither bcopy nor the memcpy implementation below can
+ reliably handle copying in overlapping areas of memory. Use
+ memmove (for which there is a fallback implmentation below)
+ if you need that behaviour. */
+#if ! HAVE_MEMCPY
+
+# if HAVE_BCOPY
+# define memcpy(dest, src, size) bcopy (src, dest, size)
+# else
+# define memcpy rpl_memcpy
+
+static lt_ptr memcpy LT_PARAMS((lt_ptr dest, const lt_ptr src, size_t size));
+
+static lt_ptr
+memcpy (lt_ptr dest, const lt_ptr src, size_t size)
+{
+ size_t i = 0;
+
+ for (i = 0; i < size; ++i)
+ {
+ dest[i] = src[i];
+ }
+
+ return dest;
+}
+
+# endif /* !HAVE_BCOPY */
+#endif /* !HAVE_MEMCPY */
+
+#if ! HAVE_MEMMOVE
+# define memmove rpl_memmove
+
+static lt_ptr memmove LT_PARAMS((lt_ptr dest, const lt_ptr src, size_t size));
+
+static lt_ptr
+memmove (lt_ptr dest, const lt_ptr src, size_t size)
+{
+ size_t i;
+
+ if (dest < src)
+ for (i = 0; i < size; ++i)
+ {
+ dest[i] = src[i];
+ }
+ else if (dest > src)
+ for (i = size -1; i >= 0; --i)
+ {
+ dest[i] = src[i];
+ }
+
+ return dest;
+}
+
+#endif /* !HAVE_MEMMOVE */
+
+#ifdef LT_USE_WINDOWS_DIRENT_EMULATION
+
+static void closedir LT_PARAMS((DIR *entry));
+
+static void
+closedir(DIR *entry)
+{
+ assert(entry != (DIR *) NULL);
+ FindClose(entry->hSearch);
+ lt_dlfree((lt_ptr)entry);
+}
+
+
+static DIR * opendir LT_PARAMS((const char *path));
+
+static DIR*
+opendir (const char *path)
+{
+ char file_specification[LT_FILENAME_MAX];
+ DIR *entry;
+
+ assert(path != (char *) NULL);
+ (void) strncpy(file_specification,path,LT_FILENAME_MAX-1);
+ (void) strcat(file_specification,"\\");
+ entry = LT_DLMALLOC (DIR,sizeof(DIR));
+ if (entry != (DIR *) 0)
+ {
+ entry->firsttime = TRUE;
+ entry->hSearch = FindFirstFile(file_specification,&entry->Win32FindData);
+ }
+ if (entry->hSearch == INVALID_HANDLE_VALUE)
+ {
+ (void) strcat(file_specification,"\\*.*");
+ entry->hSearch = FindFirstFile(file_specification,&entry->Win32FindData);
+ if (entry->hSearch == INVALID_HANDLE_VALUE)
+ {
+ LT_DLFREE (entry);
+ return (DIR *) 0;
+ }
+ }
+ return(entry);
+}
+
+
+static struct dirent *readdir LT_PARAMS((DIR *entry));
+
+static struct dirent *readdir(DIR *entry)
+{
+ int
+ status;
+
+ if (entry == (DIR *) 0)
+ return((struct dirent *) 0);
+ if (!entry->firsttime)
+ {
+ status = FindNextFile(entry->hSearch,&entry->Win32FindData);
+ if (status == 0)
+ return((struct dirent *) 0);
+ }
+ entry->firsttime = FALSE;
+ (void) strncpy(entry->file_info.d_name,entry->Win32FindData.cFileName,
+ LT_FILENAME_MAX-1);
+ entry->file_info.d_namlen = strlen(entry->file_info.d_name);
+ return(&entry->file_info);
+}
+
+#endif /* LT_USE_WINDOWS_DIRENT_EMULATION */
+
+/* According to Alexandre Oliva <oliva@lsd.ic.unicamp.br>,
+ ``realloc is not entirely portable''
+ In any case we want to use the allocator supplied by the user without
+ burdening them with an lt_dlrealloc function pointer to maintain.
+ Instead implement our own version (with known boundary conditions)
+ using lt_dlmalloc and lt_dlfree. */
+
+/* #undef realloc
+ #define realloc rpl_realloc
+*/
+#if 0
+ /* You can't (re)define realloc unless you also (re)define malloc.
+ Right now, this code uses the size of the *destination* to decide
+ how much to copy. That's not right, but you can't know the size
+ of the source unless you know enough about, or wrote malloc. So
+ this code is disabled... */
+
+static lt_ptr
+realloc (ptr, size)
+ lt_ptr ptr;
+ size_t size;
+{
+ if (size == 0)
+ {
+ /* For zero or less bytes, free the original memory */
+ if (ptr != 0)
+ {
+ lt_dlfree (ptr);
+ }
+
+ return (lt_ptr) 0;
+ }
+ else if (ptr == 0)
+ {
+ /* Allow reallocation of a NULL pointer. */
+ return lt_dlmalloc (size);
+ }
+ else
+ {
+ /* Allocate a new block, copy and free the old block. */
+ lt_ptr mem = lt_dlmalloc (size);
+
+ if (mem)
+ {
+ memcpy (mem, ptr, size);
+ lt_dlfree (ptr);
+ }
+
+ /* Note that the contents of PTR are not damaged if there is
+ insufficient memory to realloc. */
+ return mem;
+ }
+}
+#endif
+
+
+#if ! HAVE_ARGZ_APPEND
+# define argz_append rpl_argz_append
+
+static error_t argz_append LT_PARAMS((char **pargz, size_t *pargz_len,
+ const char *buf, size_t buf_len));
+
+static error_t
+argz_append (char **pargz, size_t *pargz_len, const char *buf, size_t buf_len)
+{
+ size_t argz_len;
+ char *argz;
+
+ assert (pargz);
+ assert (pargz_len);
+ assert ((*pargz && *pargz_len) || (!*pargz && !*pargz_len));
+
+ /* If nothing needs to be appended, no more work is required. */
+ if (buf_len == 0)
+ return 0;
+
+ /* Ensure there is enough room to append BUF_LEN. */
+ argz_len = *pargz_len + buf_len;
+ argz = LT_DLREALLOC (char, *pargz, argz_len);
+ if (!argz)
+ return ENOMEM;
+
+ /* Copy characters from BUF after terminating '\0' in ARGZ. */
+ memcpy (argz + *pargz_len, buf, buf_len);
+
+ /* Assign new values. */
+ *pargz = argz;
+ *pargz_len = argz_len;
+
+ return 0;
+}
+#endif /* !HAVE_ARGZ_APPEND */
+
+
+#if ! HAVE_ARGZ_CREATE_SEP
+# define argz_create_sep rpl_argz_create_sep
+
+static error_t argz_create_sep LT_PARAMS((const char *str, int delim,
+ char **pargz, size_t *pargz_len));
+
+static error_t
+argz_create_sep (const char *str, int delim, char **pargz, size_t *pargz_len)
+{
+ size_t argz_len;
+ char *argz = 0;
+
+ assert (str);
+ assert (pargz);
+ assert (pargz_len);
+
+ /* Make a copy of STR, but replacing each occurence of
+ DELIM with '\0'. */
+ argz_len = 1+ LT_STRLEN (str);
+ if (argz_len)
+ {
+ const char *p;
+ char *q;
+
+ argz = LT_DLMALLOC (char, argz_len);
+ if (!argz)
+ return ENOMEM;
+
+ for (p = str, q = argz; *p != LT_EOS_CHAR; ++p)
+ {
+ if (*p == delim)
+ {
+ /* Ignore leading delimiters, and fold consecutive
+ delimiters in STR into a single '\0' in ARGZ. */
+ if ((q > argz) && (q[-1] != LT_EOS_CHAR))
+ *q++ = LT_EOS_CHAR;
+ else
+ --argz_len;
+ }
+ else
+ *q++ = *p;
+ }
+ /* Copy terminating LT_EOS_CHAR. */
+ *q = *p;
+ }
+
+ /* If ARGZ_LEN has shrunk to nothing, release ARGZ's memory. */
+ if (!argz_len)
+ LT_DLFREE (argz);
+
+ /* Assign new values. */
+ *pargz = argz;
+ *pargz_len = argz_len;
+
+ return 0;
+}
+#endif /* !HAVE_ARGZ_CREATE_SEP */
+
+
+#if ! HAVE_ARGZ_INSERT
+# define argz_insert rpl_argz_insert
+
+static error_t argz_insert LT_PARAMS((char **pargz, size_t *pargz_len,
+ char *before, const char *entry));
+
+static error_t
+argz_insert (char **pargz, size_t *pargz_len, char *before, const char *entry)
+{
+ assert (pargz);
+ assert (pargz_len);
+ assert (entry && *entry);
+
+ /* No BEFORE address indicates ENTRY should be inserted after the
+ current last element. */
+ if (!before)
+ return argz_append (pargz, pargz_len, entry, 1+ LT_STRLEN (entry));
+
+ /* This probably indicates a programmer error, but to preserve
+ semantics, scan back to the start of an entry if BEFORE points
+ into the middle of it. */
+ while ((before > *pargz) && (before[-1] != LT_EOS_CHAR))
+ --before;
+
+ {
+ size_t entry_len = 1+ LT_STRLEN (entry);
+ size_t argz_len = *pargz_len + entry_len;
+ size_t offset = before - *pargz;
+ char *argz = LT_DLREALLOC (char, *pargz, argz_len);
+
+ if (!argz)
+ return ENOMEM;
+
+ /* Make BEFORE point to the equivalent offset in ARGZ that it
+ used to have in *PARGZ incase realloc() moved the block. */
+ before = argz + offset;
+
+ /* Move the ARGZ entries starting at BEFORE up into the new
+ space at the end -- making room to copy ENTRY into the
+ resulting gap. */
+ memmove (before + entry_len, before, *pargz_len - offset);
+ memcpy (before, entry, entry_len);
+
+ /* Assign new values. */
+ *pargz = argz;
+ *pargz_len = argz_len;
+ }
+
+ return 0;
+}
+#endif /* !HAVE_ARGZ_INSERT */
+
+
+#if ! HAVE_ARGZ_NEXT
+# define argz_next rpl_argz_next
+
+static char *argz_next LT_PARAMS((char *argz, size_t argz_len,
+ const char *entry));
+
+static char *
+argz_next (char *argz, size_t argz_len, const char *entry)
+{
+ assert ((argz && argz_len) || (!argz && !argz_len));
+
+ if (entry)
+ {
+ /* Either ARGZ/ARGZ_LEN is empty, or ENTRY points into an address
+ within the ARGZ vector. */
+ assert ((!argz && !argz_len)
+ || ((argz <= entry) && (entry < (argz + argz_len))));
+
+ /* Move to the char immediately after the terminating
+ '\0' of ENTRY. */
+ entry = 1+ strchr (entry, LT_EOS_CHAR);
+
+ /* Return either the new ENTRY, or else NULL if ARGZ is
+ exhausted. */
+ return (entry >= argz + argz_len) ? 0 : (char *) entry;
+ }
+ else
+ {
+ /* This should probably be flagged as a programmer error,
+ since starting an argz_next loop with the iterator set
+ to ARGZ is safer. To preserve semantics, handle the NULL
+ case by returning the start of ARGZ (if any). */
+ if (argz_len > 0)
+ return argz;
+ else
+ return 0;
+ }
+}
+#endif /* !HAVE_ARGZ_NEXT */
+
+
+
+#if ! HAVE_ARGZ_STRINGIFY
+# define argz_stringify rpl_argz_stringify
+
+static void argz_stringify LT_PARAMS((char *argz, size_t argz_len,
+ int sep));
+
+static void
+argz_stringify (char *argz, size_t argz_len, int sep)
+{
+ assert ((argz && argz_len) || (!argz && !argz_len));
+
+ if (sep)
+ {
+ --argz_len; /* don't stringify the terminating EOS */
+ while (--argz_len > 0)
+ {
+ if (argz[argz_len] == LT_EOS_CHAR)
+ argz[argz_len] = sep;
+ }
+ }
+}
+#endif /* !HAVE_ARGZ_STRINGIFY */
+
+
+
+\f
+/* --- TYPE DEFINITIONS -- */
+
+
+/* This type is used for the array of caller data sets in each handler. */
+typedef struct {
+ lt_dlcaller_id key;
+ lt_ptr data;
+} lt_caller_data;
+
+
+
+\f
+/* --- OPAQUE STRUCTURES DECLARED IN LTDL.H --- */
+
+
+/* Extract the diagnostic strings from the error table macro in the same
+ order as the enumerated indices in ltdl.h. */
+
+static const char *lt_dlerror_strings[] =
+ {
+#define LT_ERROR(name, diagnostic) (diagnostic),
+ lt_dlerror_table
+#undef LT_ERROR
+
+ 0
+ };
+
+/* This structure is used for the list of registered loaders. */
+struct lt_dlloader {
+ struct lt_dlloader *next;
+ const char *loader_name; /* identifying name for each loader */
+ const char *sym_prefix; /* prefix for symbols */
+ lt_module_open *module_open;
+ lt_module_close *module_close;
+ lt_find_sym *find_sym;
+ lt_dlloader_exit *dlloader_exit;
+ lt_user_data dlloader_data;
+};
+
+struct lt_dlhandle_struct {
+ struct lt_dlhandle_struct *next;
+ lt_dlloader *loader; /* dlopening interface */
+ lt_dlinfo info;
+ int depcount; /* number of dependencies */
+ lt_dlhandle *deplibs; /* dependencies */
+ lt_module module; /* system module handle */
+ lt_ptr system; /* system specific data */
+ lt_caller_data *caller_data; /* per caller associated data */
+ int flags; /* various boolean stats */
+};
+
+/* Various boolean flags can be stored in the flags field of an
+ lt_dlhandle_struct... */
+#define LT_DLGET_FLAG(handle, flag) (((handle)->flags & (flag)) == (flag))
+#define LT_DLSET_FLAG(handle, flag) ((handle)->flags |= (flag))
+
+#define LT_DLRESIDENT_FLAG (0x01 << 0)
+/* ...add more flags here... */
+
+#define LT_DLIS_RESIDENT(handle) LT_DLGET_FLAG(handle, LT_DLRESIDENT_FLAG)
+
+
+#define LT_DLSTRERROR(name) lt_dlerror_strings[LT_CONC(LT_ERROR_,name)]
+
+static const char objdir[] = LTDL_OBJDIR;
+static const char archive_ext[] = LTDL_ARCHIVE_EXT;
+#ifdef LTDL_SHLIB_EXT
+static const char shlib_ext[] = LTDL_SHLIB_EXT;
+#endif
+#ifdef LTDL_SYSSEARCHPATH
+static const char sys_search_path[] = LTDL_SYSSEARCHPATH;
+#endif
+
+
+
+\f
+/* --- MUTEX LOCKING --- */
+
+
+/* Macros to make it easier to run the lock functions only if they have
+ been registered. The reason for the complicated lock macro is to
+ ensure that the stored error message from the last error is not
+ accidentally erased if the current function doesn't generate an
+ error of its own. */
+#define LT_DLMUTEX_LOCK() LT_STMT_START { \
+ if (lt_dlmutex_lock_func) (*lt_dlmutex_lock_func)(); \
+ } LT_STMT_END
+#define LT_DLMUTEX_UNLOCK() LT_STMT_START { \
+ if (lt_dlmutex_unlock_func) (*lt_dlmutex_unlock_func)();\
+ } LT_STMT_END
+#define LT_DLMUTEX_SETERROR(errormsg) LT_STMT_START { \
+ if (lt_dlmutex_seterror_func) \
+ (*lt_dlmutex_seterror_func) (errormsg); \
+ else lt_dllast_error = (errormsg); } LT_STMT_END
+#define LT_DLMUTEX_GETERROR(errormsg) LT_STMT_START { \
+ if (lt_dlmutex_seterror_func) \
+ (errormsg) = (*lt_dlmutex_geterror_func) (); \
+ else (errormsg) = lt_dllast_error; } LT_STMT_END
+
+/* The mutex functions stored here are global, and are necessarily the
+ same for all threads that wish to share access to libltdl. */
+static lt_dlmutex_lock *lt_dlmutex_lock_func = 0;
+static lt_dlmutex_unlock *lt_dlmutex_unlock_func = 0;
+static lt_dlmutex_seterror *lt_dlmutex_seterror_func = 0;
+static lt_dlmutex_geterror *lt_dlmutex_geterror_func = 0;
+static const char *lt_dllast_error = 0;
+
+
+/* Either set or reset the mutex functions. Either all the arguments must
+ be valid functions, or else all can be NULL to turn off locking entirely.
+ The registered functions should be manipulating a static global lock
+ from the lock() and unlock() callbacks, which needs to be reentrant. */
+int
+lt_dlmutex_register (
+ lt_dlmutex_lock *lock,
+ lt_dlmutex_unlock *unlock,
+ lt_dlmutex_seterror *seterror,
+ lt_dlmutex_geterror *geterror)
+{
+ lt_dlmutex_unlock *old_unlock = unlock;
+ int errors = 0;
+
+ /* Lock using the old lock() callback, if any. */
+ LT_DLMUTEX_LOCK ();
+
+ if ((lock && unlock && seterror && geterror)
+ || !(lock || unlock || seterror || geterror))
+ {
+ lt_dlmutex_lock_func = lock;
+ lt_dlmutex_unlock_func = unlock;
+ lt_dlmutex_geterror_func = geterror;
+ }
+ else
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_MUTEX_ARGS));
+ ++errors;
+ }
+
+ /* Use the old unlock() callback we saved earlier, if any. Otherwise
+ record any errors using internal storage. */
+ if (old_unlock)
+ (*old_unlock) ();
+
+ /* Return the number of errors encountered during the execution of
+ this function. */
+ return errors;
+}
+
+
+
+\f
+/* --- ERROR HANDLING --- */
+
+
+static const char **user_error_strings = 0;
+static int errorcount = LT_ERROR_MAX;
+
+int
+lt_dladderror (const char *diagnostic)
+{
+ int errindex = 0;
+ int result = -1;
+ const char **temp = (const char **) 0;
+
+ assert (diagnostic);
+
+ LT_DLMUTEX_LOCK ();
+
+ errindex = errorcount - LT_ERROR_MAX;
+ temp = LT_EREALLOC (const char *, user_error_strings, 1 + errindex);
+ if (temp)
+ {
+ user_error_strings = temp;
+ user_error_strings[errindex] = diagnostic;
+ result = errorcount++;
+ }
+
+ LT_DLMUTEX_UNLOCK ();
+
+ return result;
+}
+
+int
+lt_dlseterror (int errindex)
+{
+ int errors = 0;
+
+ LT_DLMUTEX_LOCK ();
+
+ if (errindex >= errorcount || errindex < 0)
+ {
+ /* Ack! Error setting the error message! */
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_ERRORCODE));
+ ++errors;
+ }
+ else if (errindex < LT_ERROR_MAX)
+ {
+ /* No error setting the error message! */
+ LT_DLMUTEX_SETERROR (lt_dlerror_strings[errindex]);
+ }
+ else
+ {
+ /* No error setting the error message! */
+ LT_DLMUTEX_SETERROR (user_error_strings[errindex - LT_ERROR_MAX]);
+ }
+
+ LT_DLMUTEX_UNLOCK ();
+
+ return errors;
+}
+
+static lt_ptr
+lt_emalloc (size_t size)
+{
+ lt_ptr mem = lt_dlmalloc (size);
+ if (size && !mem)
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_MEMORY));
+ return mem;
+}
+
+static lt_ptr
+lt_erealloc (lt_ptr addr, size_t size)
+{
+ lt_ptr mem = lt_dlrealloc (addr, size);
+ if (size && !mem)
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_MEMORY));
+ return mem;
+}
+
+static char *
+lt_estrdup (const char *str)
+{
+ char *copy = strdup (str);
+ if (LT_STRLEN (str) && !copy)
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_MEMORY));
+ return copy;
+}
+
+
+
+\f
+/* --- DLOPEN() INTERFACE LOADER --- */
+
+
+#if HAVE_LIBDL
+
+/* dynamic linking with dlopen/dlsym */
+
+#if HAVE_DLFCN_H
+# include <dlfcn.h>
+#endif
+
+#if HAVE_SYS_DL_H
+# include <sys/dl.h>
+#endif
+
+#ifdef RTLD_GLOBAL
+# define LT_GLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_GLOBAL DL_GLOBAL
+# endif
+#endif /* !RTLD_GLOBAL */
+#ifndef LT_GLOBAL
+# define LT_GLOBAL 0
+#endif /* !LT_GLOBAL */
+
+/* We may have to define LT_LAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_LAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_LAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_LAZY_OR_NOW DL_LAZY
+# endif
+# endif /* !RTLD_LAZY */
+#endif
+#ifndef LT_LAZY_OR_NOW
+# ifdef RTLD_NOW
+# define LT_LAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_LAZY_OR_NOW DL_NOW
+# endif
+# endif /* !RTLD_NOW */
+#endif
+#ifndef LT_LAZY_OR_NOW
+# define LT_LAZY_OR_NOW 0
+#endif /* !LT_LAZY_OR_NOW */
+
+#if HAVE_DLERROR
+# define DLERROR(arg) dlerror ()
+#else
+# define DLERROR(arg) LT_DLSTRERROR (arg)
+#endif
+
+static lt_module
+sys_dl_open (lt_user_data loader_data, const char *filename)
+{
+ lt_module module = dlopen (filename, LT_GLOBAL | LT_LAZY_OR_NOW);
+
+ if (!module)
+ {
+ LT_DLMUTEX_SETERROR (DLERROR (CANNOT_OPEN));
+ }
+
+ return module;
+}
+
+static int
+sys_dl_close (lt_user_data loader_data, lt_module module)
+{
+ int errors = 0;
+
+ if (dlclose (module) != 0)
+ {
+ LT_DLMUTEX_SETERROR (DLERROR (CANNOT_CLOSE));
+ ++errors;
+ }
+
+ return errors;
+}
+
+static lt_ptr
+sys_dl_sym (
+ lt_user_data loader_data,
+ lt_module module,
+ const char *symbol)
+{
+ lt_ptr address = dlsym (module, symbol);
+
+ if (!address)
+ {
+ LT_DLMUTEX_SETERROR (DLERROR (SYMBOL_NOT_FOUND));
+ }
+
+ return address;
+}
+
+static struct lt_user_dlloader sys_dl =
+ {
+# ifdef NEED_USCORE
+ "_",
+# else
+ 0,
+# endif
+ sys_dl_open, sys_dl_close, sys_dl_sym, 0, 0 };
+
+
+#endif /* HAVE_LIBDL */
+
+
+\f
+/* --- SHL_LOAD() INTERFACE LOADER --- */
+
+#if HAVE_SHL_LOAD
+
+/* dynamic linking with shl_load (HP-UX) (comments from gmodule) */
+
+#ifdef HAVE_DL_H
+# include <dl.h>
+#endif
+
+/* some flags are missing on some systems, so we provide
+ * harmless defaults.
+ *
+ * Mandatory:
+ * BIND_IMMEDIATE - Resolve symbol references when the library is loaded.
+ * BIND_DEFERRED - Delay code symbol resolution until actual reference.
+ *
+ * Optionally:
+ * BIND_FIRST - Place the library at the head of the symbol search
+ * order.
+ * BIND_NONFATAL - The default BIND_IMMEDIATE behavior is to treat all
+ * unsatisfied symbols as fatal. This flag allows
+ * binding of unsatisfied code symbols to be deferred
+ * until use.
+ * [Perl: For certain libraries, like DCE, deferred
+ * binding often causes run time problems. Adding
+ * BIND_NONFATAL to BIND_IMMEDIATE still allows
+ * unresolved references in situations like this.]
+ * BIND_NOSTART - Do not call the initializer for the shared library
+ * when the library is loaded, nor on a future call to
+ * shl_unload().
+ * BIND_VERBOSE - Print verbose messages concerning possible
+ * unsatisfied symbols.
+ *
+ * hp9000s700/hp9000s800:
+ * BIND_RESTRICTED - Restrict symbols visible by the library to those
+ * present at library load time.
+ * DYNAMIC_PATH - Allow the loader to dynamically search for the
+ * library specified by the path argument.
+ */
+
+#ifndef DYNAMIC_PATH
+# define DYNAMIC_PATH 0
+#endif
+#ifndef BIND_RESTRICTED
+# define BIND_RESTRICTED 0
+#endif
+
+#define LT_BIND_FLAGS (BIND_IMMEDIATE | BIND_NONFATAL | DYNAMIC_PATH)
+
+static lt_module
+sys_shl_open (lt_user_data loader_data, const char *filename)
+{
+ static shl_t self = (shl_t) 0;
+ lt_module module = shl_load (filename, LT_BIND_FLAGS, 0L);
+
+ /* Since searching for a symbol against a NULL module handle will also
+ look in everything else that was already loaded and exported with
+ the -E compiler flag, we always cache a handle saved before any
+ modules are loaded. */
+ if (!self)
+ {
+ lt_ptr address;
+ shl_findsym (&self, "main", TYPE_UNDEFINED, &address);
+ }
+
+ if (!filename)
+ {
+ module = self;
+ }
+ else
+ {
+ module = shl_load (filename, LT_BIND_FLAGS, 0L);
+
+ if (!module)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN));
+ }
+ }
+
+ return module;
+}
+
+static int
+sys_shl_close (lt_user_data loader_data, lt_module module)
+{
+ int errors = 0;
+
+ if (module && (shl_unload ((shl_t) (module)) != 0))
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_CLOSE));
+ ++errors;
+ }
+
+ return errors;
+}
+
+static lt_ptr
+sys_shl_sym (
+ lt_user_data loader_data,
+ lt_module module,
+ const char *symbol)
+{
+ lt_ptr address = 0;
+
+ /* sys_shl_open should never return a NULL module handle */
+ if (module == (lt_module) 0)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_HANDLE));
+ }
+ else if (!shl_findsym((shl_t*) &module, symbol, TYPE_UNDEFINED, &address))
+ {
+ if (!address)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND));
+ }
+ }
+
+ return address;
+}
+
+static struct lt_user_dlloader sys_shl = {
+ 0, sys_shl_open, sys_shl_close, sys_shl_sym, 0, 0
+};
+
+#endif /* HAVE_SHL_LOAD */
+
+
+
+\f
+/* --- LOADLIBRARY() INTERFACE LOADER --- */
+
+#ifdef __WINDOWS__
+
+/* dynamic linking for Win32 */
+
+#include <windows.h>
+
+/* Forward declaration; required to implement handle search below. */
+static lt_dlhandle handles;
+
+static lt_module
+sys_wll_open (lt_user_data loader_data, const char *filename)
+{
+ lt_dlhandle cur;
+ lt_module module = 0;
+ const char *errormsg = 0;
+ char *searchname = 0;
+ char *ext;
+ char self_name_buf[MAX_PATH];
+
+ if (!filename)
+ {
+ /* Get the name of main module */
+ *self_name_buf = 0;
+ GetModuleFileName (NULL, self_name_buf, sizeof (self_name_buf));
+ filename = ext = self_name_buf;
+ }
+ else
+ {
+ ext = strrchr (filename, '.');
+ }
+
+ if (ext)
+ {
+ /* FILENAME already has an extension. */
+ searchname = lt_estrdup (filename);
+ }
+ else
+ {
+ /* Append a `.' to stop Windows from adding an
+ implicit `.dll' extension. */
+ searchname = LT_EMALLOC (char, 2+ LT_STRLEN (filename));
+ if (searchname)
+ sprintf (searchname, "%s.", filename);
+ }
+ if (!searchname)
+ return 0;
+
+#if __CYGWIN__
+ {
+ char wpath[MAX_PATH];
+ cygwin_conv_to_full_win32_path(searchname, wpath);
+ module = LoadLibrary(wpath);
+ }
+#else
+ module = LoadLibrary (searchname);
+#endif
+ LT_DLFREE (searchname);
+
+ /* libltdl expects this function to fail if it is unable
+ to physically load the library. Sadly, LoadLibrary
+ will search the loaded libraries for a match and return
+ one of them if the path search load fails.
+
+ We check whether LoadLibrary is returning a handle to
+ an already loaded module, and simulate failure if we
+ find one. */
+ LT_DLMUTEX_LOCK ();
+ cur = handles;
+ while (cur)
+ {
+ if (!cur->module)
+ {
+ cur = 0;
+ break;
+ }
+
+ if (cur->module == module)
+ {
+ break;
+ }
+
+ cur = cur->next;
+ }
+ LT_DLMUTEX_UNLOCK ();
+
+ if (cur || !module)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN));
+ module = 0;
+ }
+
+ return module;
+}
+
+static int
+sys_wll_close (lt_user_data loader_data, lt_module module)
+{
+ int errors = 0;
+
+ if (FreeLibrary(module) == 0)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_CLOSE));
+ ++errors;
+ }
+
+ return errors;
+}
+
+static lt_ptr
+sys_wll_sym (
+ lt_user_data loader_data,
+ lt_module module,
+ const char *symbol)
+{
+ lt_ptr address = GetProcAddress (module, symbol);
+
+ if (!address)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND));
+ }
+
+ return address;
+}
+
+static struct lt_user_dlloader sys_wll = {
+ 0, sys_wll_open, sys_wll_close, sys_wll_sym, 0, 0
+};
+
+#endif /* __WINDOWS__ */
+
+
+
+\f
+/* --- LOAD_ADD_ON() INTERFACE LOADER --- */
+
+
+#ifdef __BEOS__
+
+/* dynamic linking for BeOS */
+
+#include <kernel/image.h>
+
+static lt_module
+sys_bedl_open (lt_user_data loader_data, const char *filename)
+{
+ image_id image = 0;
+
+ if (filename)
+ {
+ image = load_add_on (filename);
+ }
+ else
+ {
+ image_info info;
+ int32 cookie = 0;
+ if (get_next_image_info (0, &cookie, &info) == B_OK)
+ image = load_add_on (info.name);
+ }
+
+ if (image <= 0)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN));
+ image = 0;
+ }
+
+ return (lt_module) image;
+}
+
+static int
+sys_bedl_close (lt_user_data loader_data, lt_module module)
+{
+ int errors = 0;
+
+ if (unload_add_on ((image_id) module) != B_OK)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_CLOSE));
+ ++errors;
+ }
+
+ return errors;
+}
+
+static lt_ptr
+sys_bedl_sym (
+ lt_user_data loader_data,
+ lt_module module,
+ const char *symbol)
+{
+ lt_ptr address = 0;
+ image_id image = (image_id) module;
+
+ if (get_image_symbol (image, symbol, B_SYMBOL_TYPE_ANY, address) != B_OK)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND));
+ address = 0;
+ }
+
+ return address;
+}
+
+static struct lt_user_dlloader sys_bedl = {
+ 0, sys_bedl_open, sys_bedl_close, sys_bedl_sym, 0, 0
+};
+
+#endif /* __BEOS__ */
+
+
+
+\f
+/* --- DLD_LINK() INTERFACE LOADER --- */
+
+
+#if HAVE_DLD
+
+/* dynamic linking with dld */
+
+#if HAVE_DLD_H
+#include <dld.h>
+#endif
+
+static lt_module
+sys_dld_open (lt_user_data loader_data, const char *filename)
+{
+ lt_module module = strdup (filename);
+
+ if (dld_link (filename) != 0)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN));
+ LT_DLFREE (module);
+ module = 0;
+ }
+
+ return module;
+}
+
+static int
+sys_dld_close (lt_user_data loader_data, lt_module module)
+{
+ int errors = 0;
+
+ if (dld_unlink_by_file ((char*)(module), 1) != 0)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_CLOSE));
+ ++errors;
+ }
+ else
+ {
+ LT_DLFREE (module);
+ }
+
+ return errors;
+}
+
+static lt_ptr
+sys_dld_sym (
+ lt_user_data loader_data,
+ lt_module module,
+ const char *symbol)
+{
+ lt_ptr address = dld_get_func (symbol);
+
+ if (!address)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND));
+ }
+
+ return address;
+}
+
+static struct lt_user_dlloader sys_dld = {
+ 0, sys_dld_open, sys_dld_close, sys_dld_sym, 0, 0
+};
+
+#endif /* HAVE_DLD */
+
+/* --- DYLD() MACOSX/DARWIN INTERFACE LOADER --- */
+#if HAVE_DYLD
+
+
+#if HAVE_MACH_O_DYLD_H
+#if !defined(__APPLE_CC__) && !defined(__MWERKS__) && !defined(__private_extern__)
+/* Is this correct? Does it still function properly? */
+#define __private_extern__ extern
+#endif
+# include <mach-o/dyld.h>
+#endif
+#include <mach-o/getsect.h>
+
+/* We have to put some stuff here that isn't in older dyld.h files */
+#ifndef ENUM_DYLD_BOOL
+# define ENUM_DYLD_BOOL
+# undef FALSE
+# undef TRUE
+ enum DYLD_BOOL {
+ FALSE,
+ TRUE
+ };
+#endif
+#ifndef LC_REQ_DYLD
+# define LC_REQ_DYLD 0x80000000
+#endif
+#ifndef LC_LOAD_WEAK_DYLIB
+# define LC_LOAD_WEAK_DYLIB (0x18 | LC_REQ_DYLD)
+#endif
+static const struct mach_header * (*ltdl_NSAddImage)(const char *image_name, unsigned long options) = 0;
+static NSSymbol (*ltdl_NSLookupSymbolInImage)(const struct mach_header *image,const char *symbolName, unsigned long options) = 0;
+static enum DYLD_BOOL (*ltdl_NSIsSymbolNameDefinedInImage)(const struct mach_header *image, const char *symbolName) = 0;
+static enum DYLD_BOOL (*ltdl_NSMakePrivateModulePublic)(NSModule module) = 0;
+
+#ifndef NSADDIMAGE_OPTION_NONE
+#define NSADDIMAGE_OPTION_NONE 0x0
+#endif
+#ifndef NSADDIMAGE_OPTION_RETURN_ON_ERROR
+#define NSADDIMAGE_OPTION_RETURN_ON_ERROR 0x1
+#endif
+#ifndef NSADDIMAGE_OPTION_WITH_SEARCHING
+#define NSADDIMAGE_OPTION_WITH_SEARCHING 0x2
+#endif
+#ifndef NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED
+#define NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED 0x4
+#endif
+#ifndef NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME
+#define NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME 0x8
+#endif
+#ifndef NSLOOKUPSYMBOLINIMAGE_OPTION_BIND
+#define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND 0x0
+#endif
+#ifndef NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW
+#define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW 0x1
+#endif
+#ifndef NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_FULLY
+#define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_FULLY 0x2
+#endif
+#ifndef NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR
+#define NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR 0x4
+#endif
+
+
+static const char *
+lt_int_dyld_error(char* othererror)
+{
+/* return the dyld error string, or the passed in error string if none */
+ NSLinkEditErrors ler;
+ int lerno;
+ const char *errstr;
+ const char *file;
+ NSLinkEditError(&ler,&lerno,&file,&errstr);
+ if (!errstr || !strlen(errstr)) errstr = othererror;
+ return errstr;
+}
+
+static const struct mach_header *
+lt_int_dyld_get_mach_header_from_nsmodule(NSModule module)
+{
+/* There should probably be an apple dyld api for this */
+ int i=_dyld_image_count();
+ int j;
+ const char *modname=NSNameOfModule(module);
+ const struct mach_header *mh=NULL;
+ if (!modname) return NULL;
+ for (j = 0; j < i; j++)
+ {
+ if (!strcmp(_dyld_get_image_name(j),modname))
+ {
+ mh=_dyld_get_image_header(j);
+ break;
+ }
+ }
+ return mh;
+}
+
+static const char* lt_int_dyld_lib_install_name(const struct mach_header *mh)
+{
+/* NSAddImage is also used to get the loaded image, but it only works if the lib
+ is installed, for uninstalled libs we need to check the install_names against
+ each other. Note that this is still broken if DYLD_IMAGE_SUFFIX is set and a
+ different lib was loaded as a result
+*/
+ int j;
+ struct load_command *lc;
+ unsigned long offset = sizeof(struct mach_header);
+ const char* retStr=NULL;
+ for (j = 0; j < mh->ncmds; j++)
+ {
+ lc = (struct load_command*)(((unsigned long)mh) + offset);
+ if (LC_ID_DYLIB == lc->cmd)
+ {
+ retStr=(char*)(((struct dylib_command*)lc)->dylib.name.offset +
+ (unsigned long)lc);
+ }
+ offset += lc->cmdsize;
+ }
+ return retStr;
+}
+
+static const struct mach_header *
+lt_int_dyld_match_loaded_lib_by_install_name(const char *name)
+{
+ int i=_dyld_image_count();
+ int j;
+ const struct mach_header *mh=NULL;
+ const char *id=NULL;
+ for (j = 0; j < i; j++)
+ {
+ id=lt_int_dyld_lib_install_name(_dyld_get_image_header(j));
+ if ((id) && (!strcmp(id,name)))
+ {
+ mh=_dyld_get_image_header(j);
+ break;
+ }
+ }
+ return mh;
+}
+
+static NSSymbol
+lt_int_dyld_NSlookupSymbolInLinkedLibs(const char *symbol, const struct mach_header *mh)
+{
+ /* Safe to assume our mh is good */
+ int j;
+ struct load_command *lc;
+ unsigned long offset = sizeof(struct mach_header);
+ NSSymbol retSym = 0;
+ const struct mach_header *mh1;
+ if ((ltdl_NSLookupSymbolInImage) && NSIsSymbolNameDefined(symbol) )
+ {
+ for (j = 0; j < mh->ncmds; j++)
+ {
+ lc = (struct load_command*)(((unsigned long)mh) + offset);
+ if ((LC_LOAD_DYLIB == lc->cmd) || (LC_LOAD_WEAK_DYLIB == lc->cmd))
+ {
+ mh1=lt_int_dyld_match_loaded_lib_by_install_name((char*)(((struct dylib_command*)lc)->dylib.name.offset +
+ (unsigned long)lc));
+ if (!mh1)
+ {
+ /* Maybe NSAddImage can find it */
+ mh1=ltdl_NSAddImage((char*)(((struct dylib_command*)lc)->dylib.name.offset +
+ (unsigned long)lc),
+ NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED +
+ NSADDIMAGE_OPTION_WITH_SEARCHING +
+ NSADDIMAGE_OPTION_RETURN_ON_ERROR );
+ }
+ if (mh1)
+ {
+ retSym = ltdl_NSLookupSymbolInImage(mh1,
+ symbol,
+ NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW
+ | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR
+ );
+ if (retSym) break;
+ }
+ }
+ offset += lc->cmdsize;
+ }
+ }
+ return retSym;
+}
+
+static int
+sys_dyld_init()
+{
+ int retCode = 0;
+ int err = 0;
+ if (!_dyld_present()) {
+ retCode=1;
+ }
+ else {
+ err = _dyld_func_lookup("__dyld_NSAddImage",(unsigned long*)<dl_NSAddImage);
+ err = _dyld_func_lookup("__dyld_NSLookupSymbolInImage",(unsigned long*)<dl_NSLookupSymbolInImage);
+ err = _dyld_func_lookup("__dyld_NSIsSymbolNameDefinedInImage",(unsigned long*)<dl_NSIsSymbolNameDefinedInImage);
+ err = _dyld_func_lookup("__dyld_NSMakePrivateModulePublic",(unsigned long*)<dl_NSMakePrivateModulePublic);
+ }
+ return retCode;
+}
+
+static lt_module
+sys_dyld_open (lt_user_data loader_data, const char *filename)
+{
+ lt_module module = 0;
+ NSObjectFileImage ofi = 0;
+ NSObjectFileImageReturnCode ofirc;
+
+ if (!filename)
+ return (lt_module)-1;
+ ofirc = NSCreateObjectFileImageFromFile(filename, &ofi);
+ switch (ofirc)
+ {
+ case NSObjectFileImageSuccess:
+ module = NSLinkModule(ofi, filename,
+ NSLINKMODULE_OPTION_RETURN_ON_ERROR
+ | NSLINKMODULE_OPTION_PRIVATE
+ | NSLINKMODULE_OPTION_BINDNOW);
+ NSDestroyObjectFileImage(ofi);
+ if (module)
+ ltdl_NSMakePrivateModulePublic(module);
+ break;
+ case NSObjectFileImageInappropriateFile:
+ if (ltdl_NSIsSymbolNameDefinedInImage && ltdl_NSLookupSymbolInImage)
+ {
+ module = (lt_module)ltdl_NSAddImage(filename, NSADDIMAGE_OPTION_RETURN_ON_ERROR);
+ break;
+ }
+ default:
+ LT_DLMUTEX_SETERROR (lt_int_dyld_error(LT_DLSTRERROR(CANNOT_OPEN)));
+ return 0;
+ }
+ if (!module) LT_DLMUTEX_SETERROR (lt_int_dyld_error(LT_DLSTRERROR(CANNOT_OPEN)));
+ return module;
+}
+
+static int
+sys_dyld_close (lt_user_data loader_data, lt_module module)
+{
+ int retCode = 0;
+ int flags = 0;
+ if (module == (lt_module)-1) return 0;
+#ifdef __BIG_ENDIAN__
+ if (((struct mach_header *)module)->magic == MH_MAGIC)
+#else
+ if (((struct mach_header *)module)->magic == MH_CIGAM)
+#endif
+ {
+ LT_DLMUTEX_SETERROR("Can not close a dylib");
+ retCode = 1;
+ }
+ else
+ {
+#if 1
+/* Currently, if a module contains c++ static destructors and it is unloaded, we
+ get a segfault in atexit(), due to compiler and dynamic loader differences of
+ opinion, this works around that.
+*/
+ if ((const struct section *)NULL !=
+ getsectbynamefromheader(lt_int_dyld_get_mach_header_from_nsmodule(module),
+ "__DATA","__mod_term_func"))
+ {
+ flags += NSUNLINKMODULE_OPTION_KEEP_MEMORY_MAPPED;
+ }
+#endif
+#ifdef __ppc__
+ flags += NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES;
+#endif
+ if (!NSUnLinkModule(module,flags))
+ {
+ retCode=1;
+ LT_DLMUTEX_SETERROR (lt_int_dyld_error(LT_DLSTRERROR(CANNOT_CLOSE)));
+ }
+ }
+
+ return retCode;
+}
+
+static lt_ptr
+sys_dyld_sym (
+ lt_user_data loader_data,
+ lt_module module,
+ const char *symbol)
+{
+ lt_ptr address = 0;
+ NSSymbol *nssym = 0;
+ void *unused;
+ const struct mach_header *mh=NULL;
+ char saveError[256] = "Symbol not found";
+ if (module == (lt_module)-1)
+ {
+ _dyld_lookup_and_bind(symbol,(unsigned long*)&address,&unused);
+ return address;
+ }
+#ifdef __BIG_ENDIAN__
+ if (((struct mach_header *)module)->magic == MH_MAGIC)
+#else
+ if (((struct mach_header *)module)->magic == MH_CIGAM)
+#endif
+ {
+ if (ltdl_NSIsSymbolNameDefinedInImage && ltdl_NSLookupSymbolInImage)
+ {
+ mh=module;
+ if (ltdl_NSIsSymbolNameDefinedInImage((struct mach_header*)module,symbol))
+ {
+ nssym = ltdl_NSLookupSymbolInImage((struct mach_header*)module,
+ symbol,
+ NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW
+ | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR
+ );
+ }
+ }
+
+ }
+ else {
+ nssym = NSLookupSymbolInModule(module, symbol);
+ }
+ if (!nssym)
+ {
+ strncpy(saveError, lt_int_dyld_error(LT_DLSTRERROR(SYMBOL_NOT_FOUND)), 255);
+ saveError[255] = 0;
+ if (!mh) mh=lt_int_dyld_get_mach_header_from_nsmodule(module);
+ nssym = lt_int_dyld_NSlookupSymbolInLinkedLibs(symbol,mh);
+ }
+ if (!nssym)
+ {
+ LT_DLMUTEX_SETERROR (saveError);
+ return NULL;
+ }
+ return NSAddressOfSymbol(nssym);
+}
+
+static struct lt_user_dlloader sys_dyld =
+ { "_", sys_dyld_open, sys_dyld_close, sys_dyld_sym, 0, 0 };
+
+
+#endif /* HAVE_DYLD */
+
+\f
+/* --- DLPREOPEN() INTERFACE LOADER --- */
+
+
+/* emulate dynamic linking using preloaded_symbols */
+
+typedef struct lt_dlsymlists_t
+{
+ struct lt_dlsymlists_t *next;
+ const lt_dlsymlist *syms;
+} lt_dlsymlists_t;
+
+static const lt_dlsymlist *default_preloaded_symbols = 0;
+static lt_dlsymlists_t *preloaded_symbols = 0;
+
+static int
+presym_init (lt_user_data loader_data)
+{
+ int errors = 0;
+
+ LT_DLMUTEX_LOCK ();
+
+ preloaded_symbols = 0;
+ if (default_preloaded_symbols)
+ {
+ errors = lt_dlpreload (default_preloaded_symbols);
+ }
+
+ LT_DLMUTEX_UNLOCK ();
+
+ return errors;
+}
+
+static int
+presym_free_symlists ()
+{
+ lt_dlsymlists_t *lists;
+
+ LT_DLMUTEX_LOCK ();
+
+ lists = preloaded_symbols;
+ while (lists)
+ {
+ lt_dlsymlists_t *tmp = lists;
+
+ lists = lists->next;
+ LT_DLFREE (tmp);
+ }
+ preloaded_symbols = 0;
+
+ LT_DLMUTEX_UNLOCK ();
+
+ return 0;
+}
+
+static int
+presym_exit (lt_user_data loader_data)
+{
+ presym_free_symlists ();
+ return 0;
+}
+
+static int
+presym_add_symlist (const lt_dlsymlist *preloaded)
+{
+ lt_dlsymlists_t *tmp;
+ lt_dlsymlists_t *lists;
+ int errors = 0;
+
+ LT_DLMUTEX_LOCK ();
+
+ lists = preloaded_symbols;
+ while (lists)
+ {
+ if (lists->syms == preloaded)
+ {
+ goto done;
+ }
+ lists = lists->next;
+ }
+
+ tmp = LT_EMALLOC (lt_dlsymlists_t, 1);
+ if (tmp)
+ {
+ memset (tmp, 0, sizeof(lt_dlsymlists_t));
+ tmp->syms = preloaded;
+ tmp->next = preloaded_symbols;
+ preloaded_symbols = tmp;
+ }
+ else
+ {
+ ++errors;
+ }
+
+ done:
+ LT_DLMUTEX_UNLOCK ();
+ return errors;
+}
+
+static lt_module
+presym_open (lt_user_data loader_data, const char *filename)
+{
+ lt_dlsymlists_t *lists;
+ lt_module module = (lt_module) 0;
+
+ LT_DLMUTEX_LOCK ();
+ lists = preloaded_symbols;
+
+ if (!lists)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_SYMBOLS));
+ goto done;
+ }
+
+ /* Can't use NULL as the reflective symbol header, as NULL is
+ used to mark the end of the entire symbol list. Self-dlpreopened
+ symbols follow this magic number, chosen to be an unlikely
+ clash with a real module name. */
+ if (!filename)
+ {
+ filename = "@PROGRAM@";
+ }
+
+ while (lists)
+ {
+ const lt_dlsymlist *syms = lists->syms;
+
+ while (syms->name)
+ {
+ if (!syms->address && strcmp(syms->name, filename) == 0)
+ {
+ module = (lt_module) syms;
+ goto done;
+ }
+ ++syms;
+ }
+
+ lists = lists->next;
+ }
+
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (FILE_NOT_FOUND));
+
+ done:
+ LT_DLMUTEX_UNLOCK ();
+ return module;
+}
+
+static int
+presym_close (lt_user_data loader_data, lt_module module)
+{
+ /* Just to silence gcc -Wall */
+ module = 0;
+ return 0;
+}
+
+static lt_ptr
+presym_sym (
+ lt_user_data loader_data,
+ lt_module module,
+ const char *symbol)
+{
+ lt_dlsymlist *syms = (lt_dlsymlist*) module;
+
+ ++syms;
+ while (syms->address)
+ {
+ if (strcmp(syms->name, symbol) == 0)
+ {
+ return syms->address;
+ }
+
+ ++syms;
+ }
+
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND));
+
+ return 0;
+}
+
+static struct lt_user_dlloader presym = {
+ 0, presym_open, presym_close, presym_sym, presym_exit, 0
+};
+
+
+
+
+\f
+/* --- DYNAMIC MODULE LOADING --- */
+
+
+/* The type of a function used at each iteration of foreach_dirinpath(). */
+typedef int foreach_callback_func LT_PARAMS((char *filename, lt_ptr data1,
+ lt_ptr data2));
+
+static int foreach_dirinpath LT_PARAMS((const char *search_path,
+ const char *base_name,
+ foreach_callback_func *func,
+ lt_ptr data1, lt_ptr data2));
+
+static int find_file_callback LT_PARAMS((char *filename, lt_ptr data,
+ lt_ptr ignored));
+static int find_handle_callback LT_PARAMS((char *filename, lt_ptr data,
+ lt_ptr ignored));
+static int foreachfile_callback LT_PARAMS((char *filename, lt_ptr data1,
+ lt_ptr data2));
+
+
+static int canonicalize_path LT_PARAMS((const char *path,
+ char **pcanonical));
+static int argzize_path LT_PARAMS((const char *path,
+ char **pargz,
+ size_t *pargz_len));
+static FILE *find_file LT_PARAMS((const char *search_path,
+ const char *base_name,
+ char **pdir));
+static lt_dlhandle *find_handle LT_PARAMS((const char *search_path,
+ const char *base_name,
+ lt_dlhandle *handle));
+static int find_module LT_PARAMS((lt_dlhandle *handle,
+ const char *dir,
+ const char *libdir,
+ const char *dlname,
+ const char *old_name,
+ int installed));
+static int free_vars LT_PARAMS((char *dlname, char *oldname,
+ char *libdir, char *deplibs));
+static int load_deplibs LT_PARAMS((lt_dlhandle handle,
+ char *deplibs));
+static int trim LT_PARAMS((char **dest,
+ const char *str));
+static int try_dlopen LT_PARAMS((lt_dlhandle *handle,
+ const char *filename));
+static int tryall_dlopen LT_PARAMS((lt_dlhandle *handle,
+ const char *filename));
+static int unload_deplibs LT_PARAMS((lt_dlhandle handle));
+static int lt_argz_insert LT_PARAMS((char **pargz,
+ size_t *pargz_len,
+ char *before,
+ const char *entry));
+static int lt_argz_insertinorder LT_PARAMS((char **pargz,
+ size_t *pargz_len,
+ const char *entry));
+static int lt_argz_insertdir LT_PARAMS((char **pargz,
+ size_t *pargz_len,
+ const char *dirnam,
+ struct dirent *dp));
+static int lt_dlpath_insertdir LT_PARAMS((char **ppath,
+ char *before,
+ const char *dir));
+static int list_files_by_dir LT_PARAMS((const char *dirnam,
+ char **pargz,
+ size_t *pargz_len));
+static int file_not_found LT_PARAMS((void));
+
+static char *user_search_path= 0;
+static lt_dlloader *loaders = 0;
+static lt_dlhandle handles = 0;
+static int initialized = 0;
+
+/* Initialize libltdl. */
+int
+lt_dlinit ()
+{
+ int errors = 0;
+
+ LT_DLMUTEX_LOCK ();
+
+ /* Initialize only at first call. */
+ if (++initialized == 1)
+ {
+ handles = 0;
+ user_search_path = 0; /* empty search path */
+
+#if HAVE_LIBDL
+ errors += lt_dlloader_add (lt_dlloader_next (0), &sys_dl, "dlopen");
+#endif
+#if HAVE_SHL_LOAD
+ errors += lt_dlloader_add (lt_dlloader_next (0), &sys_shl, "dlopen");
+#endif
+#ifdef __WINDOWS__
+ errors += lt_dlloader_add (lt_dlloader_next (0), &sys_wll, "dlopen");
+#endif
+#ifdef __BEOS__
+ errors += lt_dlloader_add (lt_dlloader_next (0), &sys_bedl, "dlopen");
+#endif
+#if HAVE_DLD
+ errors += lt_dlloader_add (lt_dlloader_next (0), &sys_dld, "dld");
+#endif
+#if HAVE_DYLD
+ errors += lt_dlloader_add (lt_dlloader_next (0), &sys_dyld, "dyld");
+ errors += sys_dyld_init();
+#endif
+ errors += lt_dlloader_add (lt_dlloader_next (0), &presym, "dlpreload");
+
+ if (presym_init (presym.dlloader_data))
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INIT_LOADER));
+ ++errors;
+ }
+ else if (errors != 0)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (DLOPEN_NOT_SUPPORTED));
+ ++errors;
+ }
+ }
+
+ LT_DLMUTEX_UNLOCK ();
+
+ return errors;
+}
+
+int
+lt_dlpreload (const lt_dlsymlist *preloaded)
+{
+ int errors = 0;
+
+ if (preloaded)
+ {
+ errors = presym_add_symlist (preloaded);
+ }
+ else
+ {
+ presym_free_symlists();
+
+ LT_DLMUTEX_LOCK ();
+ if (default_preloaded_symbols)
+ {
+ errors = lt_dlpreload (default_preloaded_symbols);
+ }
+ LT_DLMUTEX_UNLOCK ();
+ }
+
+ return errors;
+}
+
+int
+lt_dlpreload_default (const lt_dlsymlist *preloaded)
+{
+ LT_DLMUTEX_LOCK ();
+ default_preloaded_symbols = preloaded;
+ LT_DLMUTEX_UNLOCK ();
+ return 0;
+}
+
+int
+lt_dlexit ()
+{
+ /* shut down libltdl */
+ lt_dlloader *loader;
+ int errors = 0;
+
+ LT_DLMUTEX_LOCK ();
+ loader = loaders;
+
+ if (!initialized)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SHUTDOWN));
+ ++errors;
+ goto done;
+ }
+
+ /* shut down only at last call. */
+ if (--initialized == 0)
+ {
+ int level;
+
+ while (handles && LT_DLIS_RESIDENT (handles))
+ {
+ handles = handles->next;
+ }
+
+ /* close all modules */
+ for (level = 1; handles; ++level)
+ {
+ lt_dlhandle cur = handles;
+ int saw_nonresident = 0;
+
+ while (cur)
+ {
+ lt_dlhandle tmp = cur;
+ cur = cur->next;
+ if (!LT_DLIS_RESIDENT (tmp))
+ saw_nonresident = 1;
+ if (!LT_DLIS_RESIDENT (tmp) && tmp->info.ref_count <= level)
+ {
+ if (lt_dlclose (tmp))
+ {
+ ++errors;
+ }
+ }
+ }
+ /* done if only resident modules are left */
+ if (!saw_nonresident)
+ break;
+ }
+
+ /* close all loaders */
+ while (loader)
+ {
+ lt_dlloader *next = loader->next;
+ lt_user_data data = loader->dlloader_data;
+ if (loader->dlloader_exit && loader->dlloader_exit (data))
+ {
+ ++errors;
+ }
+
+ LT_DLMEM_REASSIGN (loader, next);
+ }
+ loaders = 0;
+ }
+
+ done:
+ LT_DLMUTEX_UNLOCK ();
+ return errors;
+}
+
+static int
+tryall_dlopen (lt_dlhandle *handle, const char *filename)
+{
+ lt_dlhandle cur;
+ lt_dlloader *loader;
+ const char *saved_error;
+ int errors = 0;
+
+ LT_DLMUTEX_GETERROR (saved_error);
+ LT_DLMUTEX_LOCK ();
+
+ cur = handles;
+ loader = loaders;
+
+ /* check whether the module was already opened */
+ while (cur)
+ {
+ /* try to dlopen the program itself? */
+ if (!cur->info.filename && !filename)
+ {
+ break;
+ }
+
+ if (cur->info.filename && filename
+ && strcmp (cur->info.filename, filename) == 0)
+ {
+ break;
+ }
+
+ cur = cur->next;
+ }
+
+ if (cur)
+ {
+ ++cur->info.ref_count;
+ *handle = cur;
+ goto done;
+ }
+
+ cur = *handle;
+ if (filename)
+ {
+ /* Comment out the check of file permissions using access.
+ This call seems to always return -1 with error EACCES.
+ */
+ /* We need to catch missing file errors early so that
+ file_not_found() can detect what happened.
+ if (access (filename, R_OK) != 0)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (FILE_NOT_FOUND));
+ ++errors;
+ goto done;
+ } */
+
+ cur->info.filename = lt_estrdup (filename);
+ if (!cur->info.filename)
+ {
+ ++errors;
+ goto done;
+ }
+ }
+ else
+ {
+ cur->info.filename = 0;
+ }
+
+ while (loader)
+ {
+ lt_user_data data = loader->dlloader_data;
+
+ cur->module = loader->module_open (data, filename);
+
+ if (cur->module != 0)
+ {
+ break;
+ }
+ loader = loader->next;
+ }
+
+ if (!loader)
+ {
+ LT_DLFREE (cur->info.filename);
+ ++errors;
+ goto done;
+ }
+
+ cur->loader = loader;
+ LT_DLMUTEX_SETERROR (saved_error);
+
+ done:
+ LT_DLMUTEX_UNLOCK ();
+
+ return errors;
+}
+
+static int
+tryall_dlopen_module (
+ lt_dlhandle *handle,
+ const char *prefix,
+ const char *dirname,
+ const char *dlname)
+{
+ int error = 0;
+ char *filename = 0;
+ size_t filename_len = 0;
+ size_t dirname_len = LT_STRLEN (dirname);
+
+ assert (handle);
+ assert (dirname);
+ assert (dlname);
+#ifdef LT_DIRSEP_CHAR
+ /* Only canonicalized names (i.e. with DIRSEP chars already converted)
+ should make it into this function: */
+ assert (strchr (dirname, LT_DIRSEP_CHAR) == 0);
+#endif
+
+ if (dirname_len > 0)
+ if (dirname[dirname_len -1] == '/')
+ --dirname_len;
+ filename_len = dirname_len + 1 + LT_STRLEN (dlname);
+
+ /* Allocate memory, and combine DIRNAME and MODULENAME into it.
+ The PREFIX (if any) is handled below. */
+ filename = LT_EMALLOC (char, dirname_len + 1 + filename_len + 1);
+ if (!filename)
+ return 1;
+
+ sprintf (filename, "%.*s/%s", (int) dirname_len, dirname, dlname);
+
+ /* Now that we have combined DIRNAME and MODULENAME, if there is
+ also a PREFIX to contend with, simply recurse with the arguments
+ shuffled. Otherwise, attempt to open FILENAME as a module. */
+ if (prefix)
+ {
+ error += tryall_dlopen_module (handle,
+ (const char *) 0, prefix, filename);
+ }
+ else if (tryall_dlopen (handle, filename) != 0)
+ {
+ ++error;
+ }
+
+ LT_DLFREE (filename);
+ return error;
+}
+
+static int
+find_module (
+ lt_dlhandle *handle,
+ const char *dir,
+ const char *libdir,
+ const char *dlname,
+ const char *old_name,
+ int installed)
+{
+ /* Try to open the old library first; if it was dlpreopened,
+ we want the preopened version of it, even if a dlopenable
+ module is available. */
+ if (old_name && tryall_dlopen (handle, old_name) == 0)
+ {
+ return 0;
+ }
+
+ /* Try to open the dynamic library. */
+ if (dlname)
+ {
+ /* try to open the installed module */
+ if (installed && libdir)
+ {
+ if (tryall_dlopen_module (handle,
+ (const char *) 0, libdir, dlname) == 0)
+ return 0;
+ }
+
+ /* try to open the not-installed module */
+ if (!installed)
+ {
+ if (tryall_dlopen_module (handle, dir, objdir, dlname) == 0)
+ return 0;
+ }
+
+ /* maybe it was moved to another directory */
+ {
+ if (tryall_dlopen_module (handle,
+ (const char *) 0, dir, dlname) == 0)
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+
+static int
+canonicalize_path (
+ const char *path,
+ char **pcanonical)
+{
+ char *canonical = 0;
+
+ assert (path && *path);
+ assert (pcanonical);
+
+ canonical = LT_EMALLOC (char, 1+ LT_STRLEN (path));
+ if (!canonical)
+ return 1;
+
+ {
+ size_t dest = 0;
+ size_t src;
+ for (src = 0; path[src] != LT_EOS_CHAR; ++src)
+ {
+ /* Path separators are not copied to the beginning or end of
+ the destination, or if another separator would follow
+ immediately. */
+ if (path[src] == LT_PATHSEP_CHAR)
+ {
+ if ((dest == 0)
+ || (path[1+ src] == LT_PATHSEP_CHAR)
+ || (path[1+ src] == LT_EOS_CHAR))
+ continue;
+ }
+
+ /* Anything other than a directory separator is copied verbatim. */
+ if ((path[src] != '/')
+#ifdef LT_DIRSEP_CHAR
+ && (path[src] != LT_DIRSEP_CHAR)
+#endif
+ )
+ {
+ canonical[dest++] = path[src];
+ }
+ /* Directory separators are converted and copied only if they are
+ not at the end of a path -- i.e. before a path separator or
+ NULL terminator. */
+ else if ((path[1+ src] != LT_PATHSEP_CHAR)
+ && (path[1+ src] != LT_EOS_CHAR)
+#ifdef LT_DIRSEP_CHAR
+ && (path[1+ src] != LT_DIRSEP_CHAR)
+#endif
+ && (path[1+ src] != '/'))
+ {
+ canonical[dest++] = '/';
+ }
+ }
+
+ /* Add an end-of-string marker at the end. */
+ canonical[dest] = LT_EOS_CHAR;
+ }
+
+ /* Assign new value. */
+ *pcanonical = canonical;
+
+ return 0;
+}
+
+static int
+argzize_path (
+ const char *path,
+ char **pargz,
+ size_t *pargz_len)
+{
+ error_t error;
+
+ assert (path);
+ assert (pargz);
+ assert (pargz_len);
+
+ if ((error = argz_create_sep (path, LT_PATHSEP_CHAR, pargz, pargz_len)))
+ {
+ switch (error)
+ {
+ case ENOMEM:
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_MEMORY));
+ break;
+ default:
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (UNKNOWN));
+ break;
+ }
+
+ return 1;
+ }
+
+ return 0;
+}
+
+/* Repeatedly call FUNC with each LT_PATHSEP_CHAR delimited element
+ of SEARCH_PATH and references to DATA1 and DATA2, until FUNC returns
+ non-zero or all elements are exhausted. If BASE_NAME is non-NULL,
+ it is appended to each SEARCH_PATH element before FUNC is called. */
+static int
+foreach_dirinpath (
+ const char *search_path,
+ const char *base_name,
+ foreach_callback_func *func,
+ lt_ptr data1,
+ lt_ptr data2)
+{
+ int result = 0;
+ int filenamesize = 0;
+ size_t lenbase = LT_STRLEN (base_name);
+ size_t argz_len = 0;
+ char *argz = 0;
+ char *filename = 0;
+ char *canonical = 0;
+
+ LT_DLMUTEX_LOCK ();
+
+ if (!search_path || !*search_path)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (FILE_NOT_FOUND));
+ goto cleanup;
+ }
+
+ if (canonicalize_path (search_path, &canonical) != 0)
+ goto cleanup;
+
+ if (argzize_path (canonical, &argz, &argz_len) != 0)
+ goto cleanup;
+
+ {
+ char *dir_name = 0;
+ while ((dir_name = argz_next (argz, argz_len, dir_name)))
+ {
+ size_t lendir = LT_STRLEN (dir_name);
+
+ if (lendir +1 +lenbase >= filenamesize)
+ {
+ LT_DLFREE (filename);
+ filenamesize = lendir +1 +lenbase +1; /* "/d" + '/' + "f" + '\0' */
+ filename = LT_EMALLOC (char, filenamesize);
+ if (!filename)
+ goto cleanup;
+ }
+
+ assert (filenamesize > lendir);
+ strcpy (filename, dir_name);
+
+ if (base_name && *base_name)
+ {
+ if (filename[lendir -1] != '/')
+ filename[lendir++] = '/';
+ strcpy (filename +lendir, base_name);
+ }
+
+ if ((result = (*func) (filename, data1, data2)))
+ {
+ break;
+ }
+ }
+ }
+
+ cleanup:
+ LT_DLFREE (argz);
+ LT_DLFREE (canonical);
+ LT_DLFREE (filename);
+
+ LT_DLMUTEX_UNLOCK ();
+
+ return result;
+}
+
+/* If FILEPATH can be opened, store the name of the directory component
+ in DATA1, and the opened FILE* structure address in DATA2. Otherwise
+ DATA1 is unchanged, but DATA2 is set to a pointer to NULL. */
+static int
+find_file_callback (
+ char *filename,
+ lt_ptr data1,
+ lt_ptr data2)
+{
+ char **pdir = (char **) data1;
+ FILE **pfile = (FILE **) data2;
+ int is_done = 0;
+
+ assert (filename && *filename);
+ assert (pdir);
+ assert (pfile);
+
+ if ((*pfile = fopen (filename, LT_READTEXT_MODE)))
+ {
+ char *dirend = strrchr (filename, '/');
+
+ if (dirend > filename)
+ *dirend = LT_EOS_CHAR;
+
+ LT_DLFREE (*pdir);
+ *pdir = lt_estrdup (filename);
+ is_done = (*pdir == 0) ? -1 : 1;
+ }
+
+ return is_done;
+}
+
+static FILE *
+find_file (
+ const char *search_path,
+ const char *base_name,
+ char **pdir)
+{
+ FILE *file = 0;
+
+ foreach_dirinpath (search_path, base_name, find_file_callback, pdir, &file);
+
+ return file;
+}
+
+static int
+find_handle_callback (
+ char *filename,
+ lt_ptr data,
+ lt_ptr ignored)
+{
+ lt_dlhandle *handle = (lt_dlhandle *) data;
+ int notfound = access (filename, R_OK);
+
+ /* Bail out if file cannot be read... */
+ if (notfound)
+ return 0;
+
+ /* Try to dlopen the file, but do not continue searching in any
+ case. */
+ if (tryall_dlopen (handle, filename) != 0)
+ *handle = 0;
+
+ return 1;
+}
+
+/* If HANDLE was found return it, otherwise return 0. If HANDLE was
+ found but could not be opened, *HANDLE will be set to 0. */
+static lt_dlhandle *
+find_handle (
+ const char *search_path,
+ const char *base_name,
+ lt_dlhandle *handle)
+{
+ if (!search_path)
+ return 0;
+
+ if (!foreach_dirinpath (search_path, base_name, find_handle_callback,
+ handle, 0))
+ return 0;
+
+ return handle;
+}
+
+static int
+load_deplibs (
+ lt_dlhandle handle,
+ char *deplibs)
+{
+#if LTDL_DLOPEN_DEPLIBS
+ char *p, *save_search_path = 0;
+ int depcount = 0;
+ int i;
+ char **names = 0;
+#endif
+ int errors = 0;
+
+ handle->depcount = 0;
+
+#if LTDL_DLOPEN_DEPLIBS
+ if (!deplibs)
+ {
+ return errors;
+ }
+ ++errors;
+
+ LT_DLMUTEX_LOCK ();
+ if (user_search_path)
+ {
+ save_search_path = lt_estrdup (user_search_path);
+ if (!save_search_path)
+ goto cleanup;
+ }
+
+ /* extract search paths and count deplibs */
+ p = deplibs;
+ while (*p)
+ {
+ if (!isspace ((int) *p))
+ {
+ char *end = p+1;
+ while (*end && !isspace((int) *end))
+ {
+ ++end;
+ }
+
+ if (strncmp(p, "-L", 2) == 0 || strncmp(p, "-R", 2) == 0)
+ {
+ char save = *end;
+ *end = 0; /* set a temporary string terminator */
+ if (lt_dladdsearchdir(p+2))
+ {
+ goto cleanup;
+ }
+ *end = save;
+ }
+ else
+ {
+ ++depcount;
+ }
+
+ p = end;
+ }
+ else
+ {
+ ++p;
+ }
+ }
+
+ /* restore the old search path */
+ LT_DLFREE (user_search_path);
+ user_search_path = save_search_path;
+
+ LT_DLMUTEX_UNLOCK ();
+
+ if (!depcount)
+ {
+ errors = 0;
+ goto cleanup;
+ }
+
+ names = LT_EMALLOC (char *, depcount * sizeof (char*));
+ if (!names)
+ goto cleanup;
+
+ /* now only extract the actual deplibs */
+ depcount = 0;
+ p = deplibs;
+ while (*p)
+ {
+ if (isspace ((int) *p))
+ {
+ ++p;
+ }
+ else
+ {
+ char *end = p+1;
+ while (*end && !isspace ((int) *end))
+ {
+ ++end;
+ }
+
+ if (strncmp(p, "-L", 2) != 0 && strncmp(p, "-R", 2) != 0)
+ {
+ char *name;
+ char save = *end;
+ *end = 0; /* set a temporary string terminator */
+ if (strncmp(p, "-l", 2) == 0)
+ {
+ size_t name_len = 3+ /* "lib" */ LT_STRLEN (p + 2);
+ name = LT_EMALLOC (char, 1+ name_len);
+ if (name)
+ sprintf (name, "lib%s", p+2);
+ }
+ else
+ name = lt_estrdup(p);
+
+ if (!name)
+ goto cleanup_names;
+
+ names[depcount++] = name;
+ *end = save;
+ }
+ p = end;
+ }
+ }
+
+ /* load the deplibs (in reverse order)
+ At this stage, don't worry if the deplibs do not load correctly,
+ they may already be statically linked into the loading application
+ for instance. There will be a more enlightening error message
+ later on if the loaded module cannot resolve all of its symbols. */
+ if (depcount)
+ {
+ int j = 0;
+
+ handle->deplibs = (lt_dlhandle*) LT_EMALLOC (lt_dlhandle *, depcount);
+ if (!handle->deplibs)
+ goto cleanup;
+
+ for (i = 0; i < depcount; ++i)
+ {
+ handle->deplibs[j] = lt_dlopenext(names[depcount-1-i]);
+ if (handle->deplibs[j])
+ {
+ ++j;
+ }
+ }
+
+ handle->depcount = j; /* Number of successfully loaded deplibs */
+ errors = 0;
+ }
+
+ cleanup_names:
+ for (i = 0; i < depcount; ++i)
+ {
+ LT_DLFREE (names[i]);
+ }
+
+ cleanup:
+ LT_DLFREE (names);
+#endif
+
+ return errors;
+}
+
+static int
+unload_deplibs (
+ lt_dlhandle handle)
+{
+ int i;
+ int errors = 0;
+
+ if (handle->depcount)
+ {
+ for (i = 0; i < handle->depcount; ++i)
+ {
+ if (!LT_DLIS_RESIDENT (handle->deplibs[i]))
+ {
+ errors += lt_dlclose (handle->deplibs[i]);
+ }
+ }
+ }
+
+ return errors;
+}
+
+static int
+trim (
+ char **dest,
+ const char *str)
+{
+ /* remove the leading and trailing "'" from str
+ and store the result in dest */
+ const char *end = strrchr (str, '\'');
+ size_t len = LT_STRLEN (str);
+ char *tmp;
+
+ LT_DLFREE (*dest);
+
+ if (len > 3 && str[0] == '\'')
+ {
+ tmp = LT_EMALLOC (char, end - str);
+ if (!tmp)
+ return 1;
+
+ strncpy(tmp, &str[1], (end - str) - 1);
+ tmp[len-3] = LT_EOS_CHAR;
+ *dest = tmp;
+ }
+ else
+ {
+ *dest = 0;
+ }
+
+ return 0;
+}
+
+static int
+free_vars (
+ char *dlname,
+ char *oldname,
+ char *libdir,
+ char *deplibs)
+{
+ LT_DLFREE (dlname);
+ LT_DLFREE (oldname);
+ LT_DLFREE (libdir);
+ LT_DLFREE (deplibs);
+
+ return 0;
+}
+
+static int
+try_dlopen (
+ lt_dlhandle *phandle,
+ const char *filename)
+{
+ const char * ext = 0;
+ const char * saved_error = 0;
+ char * canonical = 0;
+ char * base_name = 0;
+ char * dir = 0;
+ char * name = 0;
+ int errors = 0;
+ lt_dlhandle newhandle;
+
+ assert (phandle);
+ assert (*phandle == 0);
+
+ LT_DLMUTEX_GETERROR (saved_error);
+
+ /* dlopen self? */
+ if (!filename)
+ {
+ *phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1);
+ if (*phandle == 0)
+ return 1;
+
+ memset (*phandle, 0, sizeof(struct lt_dlhandle_struct));
+ newhandle = *phandle;
+
+ /* lt_dlclose()ing yourself is very bad! Disallow it. */
+ LT_DLSET_FLAG (*phandle, LT_DLRESIDENT_FLAG);
+
+ if (tryall_dlopen (&newhandle, 0) != 0)
+ {
+ LT_DLFREE (*phandle);
+ return 1;
+ }
+
+ goto register_handle;
+ }
+
+ assert (filename && *filename);
+
+ /* Doing this immediately allows internal functions to safely
+ assume only canonicalized paths are passed. */
+ if (canonicalize_path (filename, &canonical) != 0)
+ {
+ ++errors;
+ goto cleanup;
+ }
+
+ /* If the canonical module name is a path (relative or absolute)
+ then split it into a directory part and a name part. */
+ base_name = strrchr (canonical, '/');
+ if (base_name)
+ {
+ size_t dirlen = (1+ base_name) - canonical;
+
+ dir = LT_EMALLOC (char, 1+ dirlen);
+ if (!dir)
+ {
+ ++errors;
+ goto cleanup;
+ }
+
+ strncpy (dir, canonical, dirlen);
+ dir[dirlen] = LT_EOS_CHAR;
+
+ ++base_name;
+ }
+ else
+ {
+ LT_DLMEM_REASSIGN (base_name, canonical);
+ canonical = base_name;
+ }
+
+ assert (base_name && *base_name);
+
+ /* Check whether we are opening a libtool module (.la extension). */
+ ext = strrchr (base_name, '.');
+ if (ext && strcmp (ext, archive_ext) == 0)
+ {
+ /* this seems to be a libtool module */
+ FILE * file = 0;
+ char * dlname = 0;
+ char * old_name = 0;
+ char * libdir = 0;
+ char * deplibs = 0;
+ char * line = 0;
+ size_t line_len;
+
+ /* if we can't find the installed flag, it is probably an
+ installed libtool archive, produced with an old version
+ of libtool */
+ int installed = 1;
+
+ /* extract the module name from the file name */
+ name = LT_EMALLOC (char, ext - base_name + 1);
+ if (!name)
+ {
+ ++errors;
+ goto cleanup;
+ }
+
+ /* canonicalize the module name */
+ {
+ size_t i;
+ for (i = 0; i < ext - base_name; ++i)
+ {
+ if (isalnum ((int)(base_name[i])))
+ {
+ name[i] = base_name[i];
+ }
+ else
+ {
+ name[i] = '_';
+ }
+ }
+ name[ext - base_name] = LT_EOS_CHAR;
+ }
+
+ /* Now try to open the .la file. If there is no directory name
+ component, try to find it first in user_search_path and then other
+ prescribed paths. Otherwise (or in any case if the module was not
+ yet found) try opening just the module name as passed. */
+ if (!dir)
+ {
+ const char *search_path;
+
+ LT_DLMUTEX_LOCK ();
+ search_path = user_search_path;
+ if (search_path)
+ file = find_file (user_search_path, base_name, &dir);
+ LT_DLMUTEX_UNLOCK ();
+
+ if (!file)
+ {
+ search_path = getenv (LTDL_SEARCHPATH_VAR);
+ if (search_path)
+ file = find_file (search_path, base_name, &dir);
+ }
+
+#ifdef LTDL_SHLIBPATH_VAR
+ if (!file)
+ {
+ search_path = getenv (LTDL_SHLIBPATH_VAR);
+ if (search_path)
+ file = find_file (search_path, base_name, &dir);
+ }
+#endif
+#ifdef LTDL_SYSSEARCHPATH
+ if (!file && sys_search_path)
+ {
+ file = find_file (sys_search_path, base_name, &dir);
+ }
+#endif
+ }
+ if (!file)
+ {
+ file = fopen (filename, LT_READTEXT_MODE);
+ }
+
+ /* If we didn't find the file by now, it really isn't there. Set
+ the status flag, and bail out. */
+ if (!file)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (FILE_NOT_FOUND));
+ ++errors;
+ goto cleanup;
+ }
+
+ line_len = LT_FILENAME_MAX;
+ line = LT_EMALLOC (char, line_len);
+ if (!line)
+ {
+ fclose (file);
+ ++errors;
+ goto cleanup;
+ }
+
+ /* read the .la file */
+ while (!feof (file))
+ {
+ if (!fgets (line, (int) line_len, file))
+ {
+ break;
+ }
+
+ /* Handle the case where we occasionally need to read a line
+ that is longer than the initial buffer size. */
+ while ((line[LT_STRLEN(line) -1] != '\n') && (!feof (file)))
+ {
+ line = LT_DLREALLOC (char, line, line_len *2);
+ if (!fgets (&line[line_len -1], (int) line_len +1, file))
+ {
+ break;
+ }
+ line_len *= 2;
+ }
+
+ if (line[0] == '\n' || line[0] == '#')
+ {
+ continue;
+ }
+
+#undef STR_DLNAME
+#define STR_DLNAME "dlname="
+ if (strncmp (line, STR_DLNAME, sizeof (STR_DLNAME) - 1) == 0)
+ {
+ errors += trim (&dlname, &line[sizeof (STR_DLNAME) - 1]);
+ }
+
+#undef STR_OLD_LIBRARY
+#define STR_OLD_LIBRARY "old_library="
+ else if (strncmp (line, STR_OLD_LIBRARY,
+ sizeof (STR_OLD_LIBRARY) - 1) == 0)
+ {
+ errors += trim (&old_name, &line[sizeof (STR_OLD_LIBRARY) - 1]);
+ }
+#undef STR_LIBDIR
+#define STR_LIBDIR "libdir="
+ else if (strncmp (line, STR_LIBDIR, sizeof (STR_LIBDIR) - 1) == 0)
+ {
+ errors += trim (&libdir, &line[sizeof(STR_LIBDIR) - 1]);
+ }
+
+#undef STR_DL_DEPLIBS
+#define STR_DL_DEPLIBS "dependency_libs="
+ else if (strncmp (line, STR_DL_DEPLIBS,
+ sizeof (STR_DL_DEPLIBS) - 1) == 0)
+ {
+ errors += trim (&deplibs, &line[sizeof (STR_DL_DEPLIBS) - 1]);
+ }
+ else if (strcmp (line, "installed=yes\n") == 0)
+ {
+ installed = 1;
+ }
+ else if (strcmp (line, "installed=no\n") == 0)
+ {
+ installed = 0;
+ }
+
+#undef STR_LIBRARY_NAMES
+#define STR_LIBRARY_NAMES "library_names="
+ else if (! dlname && strncmp (line, STR_LIBRARY_NAMES,
+ sizeof (STR_LIBRARY_NAMES) - 1) == 0)
+ {
+ char *last_libname;
+ errors += trim (&dlname, &line[sizeof (STR_LIBRARY_NAMES) - 1]);
+ if (!errors
+ && dlname
+ && (last_libname = strrchr (dlname, ' ')) != 0)
+ {
+ last_libname = lt_estrdup (last_libname + 1);
+ if (!last_libname)
+ {
+ ++errors;
+ goto cleanup;
+ }
+ LT_DLMEM_REASSIGN (dlname, last_libname);
+ }
+ }
+
+ if (errors)
+ break;
+ }
+
+ fclose (file);
+ LT_DLFREE (line);
+
+ /* allocate the handle */
+ *phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1);
+ if (*phandle == 0)
+ ++errors;
+
+ if (errors)
+ {
+ free_vars (dlname, old_name, libdir, deplibs);
+ LT_DLFREE (*phandle);
+ goto cleanup;
+ }
+
+ assert (*phandle);
+
+ memset (*phandle, 0, sizeof(struct lt_dlhandle_struct));
+ if (load_deplibs (*phandle, deplibs) == 0)
+ {
+ newhandle = *phandle;
+ /* find_module may replace newhandle */
+ if (find_module (&newhandle, dir, libdir, dlname, old_name, installed))
+ {
+ unload_deplibs (*phandle);
+ ++errors;
+ }
+ }
+ else
+ {
+ ++errors;
+ }
+
+ free_vars (dlname, old_name, libdir, deplibs);
+ if (errors)
+ {
+ LT_DLFREE (*phandle);
+ goto cleanup;
+ }
+
+ if (*phandle != newhandle)
+ {
+ unload_deplibs (*phandle);
+ }
+ }
+ else
+ {
+ /* not a libtool module */
+ *phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1);
+ if (*phandle == 0)
+ {
+ ++errors;
+ goto cleanup;
+ }
+
+ memset (*phandle, 0, sizeof (struct lt_dlhandle_struct));
+ newhandle = *phandle;
+
+ /* If the module has no directory name component, try to find it
+ first in user_search_path and then other prescribed paths.
+ Otherwise (or in any case if the module was not yet found) try
+ opening just the module name as passed. */
+ if ((dir || (!find_handle (user_search_path, base_name, &newhandle)
+ && !find_handle (getenv (LTDL_SEARCHPATH_VAR), base_name,
+ &newhandle)
+#ifdef LTDL_SHLIBPATH_VAR
+ && !find_handle (getenv (LTDL_SHLIBPATH_VAR), base_name,
+ &newhandle)
+#endif
+#ifdef LTDL_SYSSEARCHPATH
+ && !find_handle (sys_search_path, base_name, &newhandle)
+#endif
+ )))
+ {
+ if (tryall_dlopen (&newhandle, filename) != 0)
+ {
+ newhandle = NULL;
+ }
+ }
+
+ if (!newhandle)
+ {
+ LT_DLFREE (*phandle);
+ ++errors;
+ goto cleanup;
+ }
+ }
+
+ register_handle:
+ LT_DLMEM_REASSIGN (*phandle, newhandle);
+
+ if ((*phandle)->info.ref_count == 0)
+ {
+ (*phandle)->info.ref_count = 1;
+ LT_DLMEM_REASSIGN ((*phandle)->info.name, name);
+
+ LT_DLMUTEX_LOCK ();
+ (*phandle)->next = handles;
+ handles = *phandle;
+ LT_DLMUTEX_UNLOCK ();
+ }
+
+ LT_DLMUTEX_SETERROR (saved_error);
+
+ cleanup:
+ LT_DLFREE (dir);
+ LT_DLFREE (name);
+ LT_DLFREE (canonical);
+
+ return errors;
+}
+
+lt_dlhandle
+lt_dlopen (
+ const char *filename)
+{
+ lt_dlhandle handle = 0;
+
+ /* Just incase we missed a code path in try_dlopen() that reports
+ an error, but forgets to reset handle... */
+ if (try_dlopen (&handle, filename) != 0)
+ return 0;
+
+ return handle;
+}
+
+/* If the last error messge store was `FILE_NOT_FOUND', then return
+ non-zero. */
+static int
+file_not_found ()
+{
+ const char *error = 0;
+
+ LT_DLMUTEX_GETERROR (error);
+ if (error == LT_DLSTRERROR (FILE_NOT_FOUND))
+ return 1;
+
+ return 0;
+}
+
+/* If FILENAME has an ARCHIVE_EXT or SHLIB_EXT extension, try to
+ open the FILENAME as passed. Otherwise try appending ARCHIVE_EXT,
+ and if a file is still not found try again with SHLIB_EXT appended
+ instead. */
+lt_dlhandle
+lt_dlopenext (
+ const char *filename)
+{
+ lt_dlhandle handle = 0;
+ char * tmp = 0;
+ char * ext = 0;
+ size_t len;
+ int errors = 0;
+
+ if (!filename)
+ {
+ return lt_dlopen (filename);
+ }
+
+ assert (filename);
+
+ len = LT_STRLEN (filename);
+ ext = strrchr ((char *)filename, '.');
+
+ /* If FILENAME already bears a suitable extension, there is no need
+ to try appending additional extensions. */
+ if (ext && ((strcmp (ext, archive_ext) == 0)
+#ifdef LTDL_SHLIB_EXT
+ || (strcmp (ext, shlib_ext) == 0)
+#endif
+ ))
+ {
+ return lt_dlopen (filename);
+ }
+
+ /* First try appending ARCHIVE_EXT. */
+ tmp = LT_EMALLOC (char, len + LT_STRLEN (archive_ext) + 1);
+ if (!tmp)
+ return 0;
+
+ strcpy (tmp, filename);
+ strcat (tmp, archive_ext);
+ errors = try_dlopen (&handle, tmp);
+
+ /* If we found FILENAME, stop searching -- whether we were able to
+ load the file as a module or not. If the file exists but loading
+ failed, it is better to return an error message here than to
+ report FILE_NOT_FOUND when the alternatives (foo.so etc) are not
+ in the module search path. */
+ if (handle || ((errors > 0) && !file_not_found ()))
+ {
+ LT_DLFREE (tmp);
+ return handle;
+ }
+
+#ifdef LTDL_SHLIB_EXT
+ /* Try appending SHLIB_EXT. */
+ if (LT_STRLEN (shlib_ext) > LT_STRLEN (archive_ext))
+ {
+ LT_DLFREE (tmp);
+ tmp = LT_EMALLOC (char, len + LT_STRLEN (shlib_ext) + 1);
+ if (!tmp)
+ return 0;
+
+ strcpy (tmp, filename);
+ }
+ else
+ {
+ tmp[len] = LT_EOS_CHAR;
+ }
+
+ strcat(tmp, shlib_ext);
+ errors = try_dlopen (&handle, tmp);
+
+ /* As before, if the file was found but loading failed, return now
+ with the current error message. */
+ if (handle || ((errors > 0) && !file_not_found ()))
+ {
+ LT_DLFREE (tmp);
+ return handle;
+ }
+#endif
+
+ /* Still here? Then we really did fail to locate any of the file
+ names we tried. */
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (FILE_NOT_FOUND));
+ LT_DLFREE (tmp);
+ return 0;
+}
+
+
+static int
+lt_argz_insert (
+ char **pargz,
+ size_t *pargz_len,
+ char *before,
+ const char *entry)
+{
+ error_t error;
+
+ if ((error = argz_insert (pargz, pargz_len, before, entry)))
+ {
+ switch (error)
+ {
+ case ENOMEM:
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_MEMORY));
+ break;
+ default:
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (UNKNOWN));
+ break;
+ }
+ return 1;
+ }
+
+ return 0;
+}
+
+static int
+lt_argz_insertinorder (
+ char **pargz,
+ size_t *pargz_len,
+ const char *entry)
+{
+ char *before = 0;
+
+ assert (pargz);
+ assert (pargz_len);
+ assert (entry && *entry);
+
+ if (*pargz)
+ while ((before = argz_next (*pargz, *pargz_len, before)))
+ {
+ int cmp = strcmp (entry, before);
+
+ if (cmp < 0) break;
+ if (cmp == 0) return 0; /* No duplicates! */
+ }
+
+ return lt_argz_insert (pargz, pargz_len, before, entry);
+}
+
+static int
+lt_argz_insertdir (
+ char **pargz,
+ size_t *pargz_len,
+ const char *dirnam,
+ struct dirent *dp)
+{
+ char *buf = 0;
+ size_t buf_len = 0;
+ char *end = 0;
+ size_t end_offset = 0;
+ size_t dir_len = 0;
+ int errors = 0;
+
+ assert (pargz);
+ assert (pargz_len);
+ assert (dp);
+
+ dir_len = LT_STRLEN (dirnam);
+ end = dp->d_name + LT_D_NAMLEN(dp);
+
+ /* Ignore version numbers. */
+ {
+ char *p;
+ for (p = end; p -1 > dp->d_name; --p)
+ if (strchr (".0123456789", p[-1]) == 0)
+ break;
+
+ if (*p == '.')
+ end = p;
+ }
+
+ /* Ignore filename extension. */
+ {
+ char *p;
+ for (p = end -1; p > dp->d_name; --p)
+ if (*p == '.')
+ {
+ end = p;
+ break;
+ }
+ }
+
+ /* Prepend the directory name. */
+ end_offset = end - dp->d_name;
+ buf_len = dir_len + 1+ end_offset;
+ buf = LT_EMALLOC (char, 1+ buf_len);
+ if (!buf)
+ return ++errors;
+
+ assert (buf);
+
+ strcpy (buf, dirnam);
+ strcat (buf, "/");
+ strncat (buf, dp->d_name, end_offset);
+ buf[buf_len] = LT_EOS_CHAR;
+
+ /* Try to insert (in order) into ARGZ/ARGZ_LEN. */
+ if (lt_argz_insertinorder (pargz, pargz_len, buf) != 0)
+ ++errors;
+
+ LT_DLFREE (buf);
+
+ return errors;
+}
+
+static int
+list_files_by_dir (
+ const char *dirnam,
+ char **pargz,
+ size_t *pargz_len)
+{
+ DIR *dirp = 0;
+ int errors = 0;
+
+ assert (dirnam && *dirnam);
+ assert (pargz);
+ assert (pargz_len);
+ assert (dirnam[LT_STRLEN(dirnam) -1] != '/');
+
+ dirp = opendir (dirnam);
+ if (dirp)
+ {
+ struct dirent *dp = 0;
+
+ while ((dp = readdir (dirp)))
+ if (dp->d_name[0] != '.')
+ if (lt_argz_insertdir (pargz, pargz_len, dirnam, dp))
+ {
+ ++errors;
+ break;
+ }
+
+ closedir (dirp);
+ }
+ else
+ ++errors;
+
+ return errors;
+}
+
+
+/* If there are any files in DIRNAME, call the function passed in
+ DATA1 (with the name of each file and DATA2 as arguments). */
+static int
+foreachfile_callback (
+ char *dirname,
+ lt_ptr data1,
+ lt_ptr data2)
+{
+ int (*func) LT_PARAMS((const char *filename, lt_ptr data))
+ = (int (*) LT_PARAMS((const char *filename, lt_ptr data))) data1;
+
+ int is_done = 0;
+ char *argz = 0;
+ size_t argz_len = 0;
+
+ if (list_files_by_dir (dirname, &argz, &argz_len) != 0)
+ goto cleanup;
+ if (!argz)
+ goto cleanup;
+
+ {
+ char *filename = 0;
+ while ((filename = argz_next (argz, argz_len, filename)))
+ if ((is_done = (*func) (filename, data2)))
+ break;
+ }
+
+ cleanup:
+ LT_DLFREE (argz);
+
+ return is_done;
+}
+
+
+/* Call FUNC for each unique extensionless file in SEARCH_PATH, along
+ with DATA. The filenames passed to FUNC would be suitable for
+ passing to lt_dlopenext. The extensions are stripped so that
+ individual modules do not generate several entries (e.g. libfoo.la,
+ libfoo.so, libfoo.so.1, libfoo.so.1.0.0). If SEARCH_PATH is NULL,
+ then the same directories that lt_dlopen would search are examined. */
+int
+lt_dlforeachfile (
+ const char *search_path,
+ int (*func) LT_PARAMS ((const char *filename, lt_ptr data)),
+ lt_ptr data)
+{
+ int is_done = 0;
+
+ if (search_path)
+ {
+ /* If a specific path was passed, search only the directories
+ listed in it. */
+ is_done = foreach_dirinpath (search_path, 0,
+ foreachfile_callback, (void*)func, data);
+ }
+ else
+ {
+ /* Otherwise search the default paths. */
+ is_done = foreach_dirinpath (user_search_path, 0,
+ foreachfile_callback, (void*)func, data);
+ if (!is_done)
+ {
+ is_done = foreach_dirinpath (getenv("LTDL_LIBRARY_PATH"), 0,
+ foreachfile_callback, (void*)func, data);
+ }
+
+#ifdef LTDL_SHLIBPATH_VAR
+ if (!is_done)
+ {
+ is_done = foreach_dirinpath (getenv(LTDL_SHLIBPATH_VAR), 0,
+ foreachfile_callback, (void*)func, data);
+ }
+#endif
+#ifdef LTDL_SYSSEARCHPATH
+ if (!is_done)
+ {
+ is_done = foreach_dirinpath (getenv(LTDL_SYSSEARCHPATH), 0,
+ foreachfile_callback, (void*)func, data);
+ }
+#endif
+ }
+
+ return is_done;
+}
+
+int
+lt_dlclose (
+ lt_dlhandle handle)
+{
+ lt_dlhandle cur, last;
+ int errors = 0;
+
+ LT_DLMUTEX_LOCK ();
+
+ /* check whether the handle is valid */
+ last = cur = handles;
+ while (cur && handle != cur)
+ {
+ last = cur;
+ cur = cur->next;
+ }
+
+ if (!cur)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_HANDLE));
+ ++errors;
+ goto done;
+ }
+
+ handle->info.ref_count--;
+
+ /* Note that even with resident modules, we must track the ref_count
+ correctly incase the user decides to reset the residency flag
+ later (even though the API makes no provision for that at the
+ moment). */
+ if (handle->info.ref_count <= 0 && !LT_DLIS_RESIDENT (handle))
+ {
+ lt_user_data data = handle->loader->dlloader_data;
+
+ if (handle != handles)
+ {
+ last->next = handle->next;
+ }
+ else
+ {
+ handles = handle->next;
+ }
+
+ errors += handle->loader->module_close (data, handle->module);
+ errors += unload_deplibs(handle);
+
+ /* It is up to the callers to free the data itself. */
+ LT_DLFREE (handle->caller_data);
+
+ LT_DLFREE (handle->info.filename);
+ LT_DLFREE (handle->info.name);
+ LT_DLFREE (handle);
+
+ goto done;
+ }
+
+ if (LT_DLIS_RESIDENT (handle))
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CLOSE_RESIDENT_MODULE));
+ ++errors;
+ }
+
+ done:
+ LT_DLMUTEX_UNLOCK ();
+
+ return errors;
+}
+
+lt_ptr
+lt_dlsym (
+ lt_dlhandle handle,
+ const char *symbol)
+{
+ size_t lensym;
+ char lsym[LT_SYMBOL_LENGTH];
+ char *sym;
+ lt_ptr address;
+ lt_user_data data;
+
+ if (!handle)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_HANDLE));
+ return 0;
+ }
+
+ if (!symbol)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND));
+ return 0;
+ }
+
+ lensym = LT_STRLEN (symbol) + LT_STRLEN (handle->loader->sym_prefix)
+ + LT_STRLEN (handle->info.name);
+
+ if (lensym + LT_SYMBOL_OVERHEAD < LT_SYMBOL_LENGTH)
+ {
+ sym = lsym;
+ }
+ else
+ {
+ sym = LT_EMALLOC (char, lensym + LT_SYMBOL_OVERHEAD + 1);
+ if (!sym)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (BUFFER_OVERFLOW));
+ return 0;
+ }
+ }
+
+ data = handle->loader->dlloader_data;
+ if (handle->info.name)
+ {
+ const char *saved_error;
+
+ LT_DLMUTEX_GETERROR (saved_error);
+
+ /* this is a libtool module */
+ if (handle->loader->sym_prefix)
+ {
+ strcpy(sym, handle->loader->sym_prefix);
+ strcat(sym, handle->info.name);
+ }
+ else
+ {
+ strcpy(sym, handle->info.name);
+ }
+
+ strcat(sym, "_LTX_");
+ strcat(sym, symbol);
+
+ /* try "modulename_LTX_symbol" */
+ address = handle->loader->find_sym (data, handle->module, sym);
+ if (address)
+ {
+ if (sym != lsym)
+ {
+ LT_DLFREE (sym);
+ }
+ return address;
+ }
+ LT_DLMUTEX_SETERROR (saved_error);
+ }
+
+ /* otherwise try "symbol" */
+ if (handle->loader->sym_prefix)
+ {
+ strcpy(sym, handle->loader->sym_prefix);
+ strcat(sym, symbol);
+ }
+ else
+ {
+ strcpy(sym, symbol);
+ }
+
+ address = handle->loader->find_sym (data, handle->module, sym);
+ if (sym != lsym)
+ {
+ LT_DLFREE (sym);
+ }
+
+ return address;
+}
+
+const char *
+lt_dlerror ()
+{
+ const char *error;
+
+ LT_DLMUTEX_GETERROR (error);
+ LT_DLMUTEX_SETERROR (0);
+
+ return error ? error : NULL;
+}
+
+static int
+lt_dlpath_insertdir (
+ char **ppath,
+ char *before,
+ const char *dir)
+{
+ int errors = 0;
+ char *canonical = 0;
+ char *argz = 0;
+ size_t argz_len = 0;
+
+ assert (ppath);
+ assert (dir && *dir);
+
+ if (canonicalize_path (dir, &canonical) != 0)
+ {
+ ++errors;
+ goto cleanup;
+ }
+
+ assert (canonical && *canonical);
+
+ /* If *PPATH is empty, set it to DIR. */
+ if (*ppath == 0)
+ {
+ assert (!before); /* BEFORE cannot be set without PPATH. */
+ assert (dir); /* Without DIR, don't call this function! */
+
+ *ppath = lt_estrdup (dir);
+ if (*ppath == 0)
+ ++errors;
+
+ return errors;
+ }
+
+ assert (ppath && *ppath);
+
+ if (argzize_path (*ppath, &argz, &argz_len) != 0)
+ {
+ ++errors;
+ goto cleanup;
+ }
+
+ /* Convert BEFORE into an equivalent offset into ARGZ. This only works
+ if *PPATH is already canonicalized, and hence does not change length
+ with respect to ARGZ. We canonicalize each entry as it is added to
+ the search path, and don't call this function with (uncanonicalized)
+ user paths, so this is a fair assumption. */
+ if (before)
+ {
+ assert (*ppath <= before);
+ assert (before - *ppath <= strlen (*ppath));
+
+ before = before - *ppath + argz;
+ }
+
+ if (lt_argz_insert (&argz, &argz_len, before, dir) != 0)
+ {
+ ++errors;
+ goto cleanup;
+ }
+
+ argz_stringify (argz, argz_len, LT_PATHSEP_CHAR);
+ LT_DLMEM_REASSIGN (*ppath, argz);
+
+ cleanup:
+ LT_DLFREE (canonical);
+ LT_DLFREE (argz);
+
+ return errors;
+}
+
+int
+lt_dladdsearchdir (
+ const char *search_dir)
+{
+ int errors = 0;
+
+ if (search_dir && *search_dir)
+ {
+ LT_DLMUTEX_LOCK ();
+ if (lt_dlpath_insertdir (&user_search_path, 0, search_dir) != 0)
+ ++errors;
+ LT_DLMUTEX_UNLOCK ();
+ }
+
+ return errors;
+}
+
+int
+lt_dlinsertsearchdir (
+ const char *before,
+ const char *search_dir)
+{
+ int errors = 0;
+
+ if (before)
+ {
+ LT_DLMUTEX_LOCK ();
+ if ((before < user_search_path)
+ || (before >= user_search_path + LT_STRLEN (user_search_path)))
+ {
+ LT_DLMUTEX_UNLOCK ();
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_POSITION));
+ return 1;
+ }
+ LT_DLMUTEX_UNLOCK ();
+ }
+
+ if (search_dir && *search_dir)
+ {
+ LT_DLMUTEX_LOCK ();
+ if (lt_dlpath_insertdir (&user_search_path,
+ (char *) before, search_dir) != 0)
+ {
+ ++errors;
+ }
+ LT_DLMUTEX_UNLOCK ();
+ }
+
+ return errors;
+}
+
+int
+lt_dlsetsearchpath (
+ const char *search_path)
+{
+ int errors = 0;
+
+ LT_DLMUTEX_LOCK ();
+ LT_DLFREE (user_search_path);
+ LT_DLMUTEX_UNLOCK ();
+
+ if (!search_path || !LT_STRLEN (search_path))
+ {
+ return errors;
+ }
+
+ LT_DLMUTEX_LOCK ();
+ if (canonicalize_path (search_path, &user_search_path) != 0)
+ ++errors;
+ LT_DLMUTEX_UNLOCK ();
+
+ return errors;
+}
+
+const char *
+lt_dlgetsearchpath ()
+{
+ const char *saved_path;
+
+ LT_DLMUTEX_LOCK ();
+ saved_path = user_search_path;
+ LT_DLMUTEX_UNLOCK ();
+
+ return saved_path;
+}
+
+int
+lt_dlmakeresident (
+ lt_dlhandle handle)
+{
+ int errors = 0;
+
+ if (!handle)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_HANDLE));
+ ++errors;
+ }
+ else
+ {
+ LT_DLSET_FLAG (handle, LT_DLRESIDENT_FLAG);
+ }
+
+ return errors;
+}
+
+int
+lt_dlisresident (
+ lt_dlhandle handle)
+{
+ if (!handle)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_HANDLE));
+ return -1;
+ }
+
+ return LT_DLIS_RESIDENT (handle);
+}
+
+
+
+\f
+/* --- MODULE INFORMATION --- */
+
+const lt_dlinfo *
+lt_dlgetinfo (
+ lt_dlhandle handle)
+{
+ if (!handle)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_HANDLE));
+ return 0;
+ }
+
+ return &(handle->info);
+}
+
+lt_dlhandle
+lt_dlhandle_next (
+ lt_dlhandle place)
+{
+ return place ? place->next : handles;
+}
+
+int
+lt_dlforeach (
+ int (*func) LT_PARAMS((lt_dlhandle handle, lt_ptr data)),
+ lt_ptr data)
+{
+ int errors = 0;
+ lt_dlhandle cur;
+
+ LT_DLMUTEX_LOCK ();
+
+ cur = handles;
+ while (cur)
+ {
+ lt_dlhandle tmp = cur;
+
+ cur = cur->next;
+ if ((*func) (tmp, data))
+ {
+ ++errors;
+ break;
+ }
+ }
+
+ LT_DLMUTEX_UNLOCK ();
+
+ return errors;
+}
+
+lt_dlcaller_id
+lt_dlcaller_register ()
+{
+ static lt_dlcaller_id last_caller_id = 0;
+ int result;
+
+ LT_DLMUTEX_LOCK ();
+ result = ++last_caller_id;
+ LT_DLMUTEX_UNLOCK ();
+
+ return result;
+}
+
+lt_ptr
+lt_dlcaller_set_data (
+ lt_dlcaller_id key,
+ lt_dlhandle handle,
+ lt_ptr data)
+{
+ int n_elements = 0;
+ lt_ptr stale = (lt_ptr) 0;
+ int i;
+
+ /* This needs to be locked so that the caller data can be updated
+ simultaneously by different threads. */
+ LT_DLMUTEX_LOCK ();
+
+ if (handle->caller_data)
+ while (handle->caller_data[n_elements].key)
+ ++n_elements;
+
+ for (i = 0; i < n_elements; ++i)
+ {
+ if (handle->caller_data[i].key == key)
+ {
+ stale = handle->caller_data[i].data;
+ break;
+ }
+ }
+
+ /* Ensure that there is enough room in this handle's caller_data
+ array to accept a new element (and an empty end marker). */
+ if (i == n_elements)
+ {
+ lt_caller_data *temp
+ = LT_DLREALLOC (lt_caller_data, handle->caller_data, 2+ n_elements);
+
+ if (!temp)
+ {
+ stale = 0;
+ goto done;
+ }
+
+ handle->caller_data = temp;
+
+ /* We only need this if we needed to allocate a new caller_data. */
+ handle->caller_data[i].key = key;
+ handle->caller_data[1+ i].key = 0;
+ }
+
+ handle->caller_data[i].data = data;
+
+ done:
+ LT_DLMUTEX_UNLOCK ();
+
+ return stale;
+}
+
+lt_ptr
+lt_dlcaller_get_data (
+ lt_dlcaller_id key,
+ lt_dlhandle handle)
+{
+ lt_ptr result = (lt_ptr) 0;
+
+ /* This needs to be locked so that the caller data isn't updated by
+ another thread part way through this function. */
+ LT_DLMUTEX_LOCK ();
+
+ /* Locate the index of the element with a matching KEY. */
+ {
+ int i;
+ for (i = 0; handle->caller_data[i].key; ++i)
+ {
+ if (handle->caller_data[i].key == key)
+ {
+ result = handle->caller_data[i].data;
+ break;
+ }
+ }
+ }
+
+ LT_DLMUTEX_UNLOCK ();
+
+ return result;
+}
+
+
+\f
+/* --- USER MODULE LOADER API --- */
+
+
+int
+lt_dlloader_add (
+ lt_dlloader *place,
+ const struct lt_user_dlloader *dlloader,
+ const char *loader_name)
+{
+ int errors = 0;
+ lt_dlloader *node = 0, *ptr = 0;
+
+ if ((dlloader == 0) /* diagnose null parameters */
+ || (dlloader->module_open == 0)
+ || (dlloader->module_close == 0)
+ || (dlloader->find_sym == 0))
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_LOADER));
+ return 1;
+ }
+
+ /* Create a new dlloader node with copies of the user callbacks. */
+ node = LT_EMALLOC (lt_dlloader, 1);
+ if (!node)
+ return 1;
+
+ node->next = 0;
+ node->loader_name = loader_name;
+ node->sym_prefix = dlloader->sym_prefix;
+ node->dlloader_exit = dlloader->dlloader_exit;
+ node->module_open = dlloader->module_open;
+ node->module_close = dlloader->module_close;
+ node->find_sym = dlloader->find_sym;
+ node->dlloader_data = dlloader->dlloader_data;
+
+ LT_DLMUTEX_LOCK ();
+ if (!loaders)
+ {
+ /* If there are no loaders, NODE becomes the list! */
+ loaders = node;
+ }
+ else if (!place)
+ {
+ /* If PLACE is not set, add NODE to the end of the
+ LOADERS list. */
+ for (ptr = loaders; ptr->next; ptr = ptr->next)
+ {
+ /*NOWORK*/;
+ }
+
+ ptr->next = node;
+ }
+ else if (loaders == place)
+ {
+ /* If PLACE is the first loader, NODE goes first. */
+ node->next = place;
+ loaders = node;
+ }
+ else
+ {
+ /* Find the node immediately preceding PLACE. */
+ for (ptr = loaders; ptr->next != place; ptr = ptr->next)
+ {
+ /*NOWORK*/;
+ }
+
+ if (ptr->next != place)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_LOADER));
+ ++errors;
+ }
+ else
+ {
+ /* Insert NODE between PTR and PLACE. */
+ node->next = place;
+ ptr->next = node;
+ }
+ }
+
+ LT_DLMUTEX_UNLOCK ();
+
+ return errors;
+}
+
+int
+lt_dlloader_remove (
+ const char *loader_name)
+{
+ lt_dlloader *place = lt_dlloader_find (loader_name);
+ lt_dlhandle handle;
+ int errors = 0;
+
+ if (!place)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_LOADER));
+ return 1;
+ }
+
+ LT_DLMUTEX_LOCK ();
+
+ /* Fail if there are any open modules which use this loader. */
+ for (handle = handles; handle; handle = handle->next)
+ {
+ if (handle->loader == place)
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (REMOVE_LOADER));
+ ++errors;
+ goto done;
+ }
+ }
+
+ if (place == loaders)
+ {
+ /* PLACE is the first loader in the list. */
+ loaders = loaders->next;
+ }
+ else
+ {
+ /* Find the loader before the one being removed. */
+ lt_dlloader *prev;
+ for (prev = loaders; prev->next; prev = prev->next)
+ {
+ if (!strcmp (prev->next->loader_name, loader_name))
+ {
+ break;
+ }
+ }
+
+ place = prev->next;
+ if (prev->next) prev->next = prev->next->next;
+ }
+
+ if (place && place->dlloader_exit)
+ {
+ errors = place->dlloader_exit (place->dlloader_data);
+ }
+
+ LT_DLFREE (place);
+
+ done:
+ LT_DLMUTEX_UNLOCK ();
+
+ return errors;
+}
+
+lt_dlloader *
+lt_dlloader_next (
+ lt_dlloader *place)
+{
+ lt_dlloader *next;
+
+ LT_DLMUTEX_LOCK ();
+ next = place ? place->next : loaders;
+ LT_DLMUTEX_UNLOCK ();
+
+ return next;
+}
+
+const char *
+lt_dlloader_name (
+ lt_dlloader *place)
+{
+ const char *name = 0;
+
+ if (place)
+ {
+ LT_DLMUTEX_LOCK ();
+ name = place ? place->loader_name : 0;
+ LT_DLMUTEX_UNLOCK ();
+ }
+ else
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_LOADER));
+ }
+
+ return name;
+}
+
+lt_user_data *
+lt_dlloader_data (
+ lt_dlloader *place)
+{
+ lt_user_data *data = 0;
+
+ if (place)
+ {
+ LT_DLMUTEX_LOCK ();
+ data = place ? &(place->dlloader_data) : 0;
+ LT_DLMUTEX_UNLOCK ();
+ }
+ else
+ {
+ LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_LOADER));
+ }
+
+ return data;
+}
+
+lt_dlloader *
+lt_dlloader_find (
+ const char *loader_name)
+{
+ lt_dlloader *place = 0;
+
+ LT_DLMUTEX_LOCK ();
+ for (place = loaders; place; place = place->next)
+ {
+ if (strcmp (place->loader_name, loader_name) == 0)
+ {
+ break;
+ }
+ }
+ LT_DLMUTEX_UNLOCK ();
+
+ return place;
+}
+
+} // namespace scim
--- /dev/null
+/* ltdl.h -- generic dlopen functions
+ Copyright (C) 1998-2000 Free Software Foundation, Inc.
+ Originally by Thomas Tanner <tanner@ffii.org>
+ This file is part of GNU Libtool.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+As a special exception to the GNU Lesser General Public License,
+if you distribute this file as part of a program or library that
+is built using GNU libtool, you may include it under the same
+distribution terms that you use for the rest of that program.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free
+Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA
+*/
+
+/* Only include this header file once. */
+#ifndef LTDL_H
+#define LTDL_H 1
+
+#include <sys/types.h> /* for size_t declaration */
+namespace scim {
+
+\f
+/* --- MACROS FOR PORTABILITY --- */
+
+
+/* Saves on those hard to debug '\0' typos.... */
+#define LT_EOS_CHAR '\0'
+
+/* LTDL_BEGIN_C_DECLS should be used at the beginning of your declarations,
+ so that C++ compilers don't mangle their names. Use LTDL_END_C_DECLS at
+ the end of C declarations. */
+#ifdef __cplusplus
+# define LT_BEGIN_C_DECLS extern "C" {
+# define LT_END_C_DECLS }
+#else
+# define LT_BEGIN_C_DECLS /* empty */
+# define LT_END_C_DECLS /* empty */
+#endif
+
+//LT_BEGIN_C_DECLS
+
+
+/* LT_PARAMS is a macro used to wrap function prototypes, so that compilers
+ that don't understand ANSI C prototypes still work, and ANSI C
+ compilers can issue warnings about type mismatches. */
+#if defined (__STDC__) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(WIN32) || defined(__cplusplus)
+# define LT_PARAMS(protos) protos
+# define lt_ptr void*
+#else
+# define LT_PARAMS(protos) ()
+# define lt_ptr char*
+#endif
+
+/* LT_STMT_START/END are used to create macros which expand to a
+ a single compound statement in a portable way. */
+#if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
+# define LT_STMT_START (void)(
+# define LT_STMT_END )
+#else
+# if (defined (sun) || defined (__sun__))
+# define LT_STMT_START if (1)
+# define LT_STMT_END else (void)0
+# else
+# define LT_STMT_START do
+# define LT_STMT_END while (0)
+# endif
+#endif
+
+/* LT_CONC creates a new concatenated symbol for the compiler
+ in a portable way. */
+#if defined(__STDC__) || defined(__cplusplus) || defined(_MSC_VER)
+# define LT_CONC(s,t) s##t
+#else
+# define LT_CONC(s,t) s/**/t
+#endif
+
+/* LT_STRLEN can be used safely on NULL pointers. */
+#define LT_STRLEN(s) (((s) && (s)[0]) ? strlen (s) : 0)
+
+
+\f
+/* --- WINDOWS SUPPORT --- */
+
+
+/* Canonicalise Windows and Cygwin recognition macros. */
+#ifdef __CYGWIN32__
+# ifndef __CYGWIN__
+# define __CYGWIN__ __CYGWIN32__
+# endif
+#endif
+#if defined(_WIN32) || defined(WIN32)
+# ifndef __WINDOWS__
+# ifdef _WIN32
+# define __WINDOWS__ _WIN32
+# else
+# ifdef WIN32
+# define __WINDOWS__ WIN32
+# endif
+# endif
+# endif
+#endif
+
+
+#ifdef __WINDOWS__
+# ifndef __CYGWIN__
+/* LT_DIRSEP_CHAR is accepted *in addition* to '/' as a directory
+ separator when it is set. */
+# define LT_DIRSEP_CHAR '\\'
+# define LT_PATHSEP_CHAR ';'
+# endif
+#endif
+#ifndef LT_PATHSEP_CHAR
+# define LT_PATHSEP_CHAR ':'
+#endif
+
+/* DLL building support on win32 hosts; mostly to workaround their
+ ridiculous implementation of data symbol exporting. */
+#ifndef LT_SCOPE
+# ifdef __WINDOWS__
+# ifdef DLL_EXPORT /* defined by libtool (if required) */
+# define LT_SCOPE __declspec(dllexport)
+# endif
+# ifdef LIBLTDL_DLL_IMPORT /* define if linking with this dll */
+# define LT_SCOPE extern __declspec(dllimport)
+# endif
+# endif
+# ifndef LT_SCOPE /* static linking or !__WINDOWS__ */
+# define LT_SCOPE extern
+# endif
+#endif
+
+
+#if defined(_MSC_VER) /* Visual Studio */
+# define R_OK 4
+#endif
+
+
+\f
+/* --- DYNAMIC MODULE LOADING API --- */
+
+
+typedef struct lt_dlhandle_struct *lt_dlhandle; /* A loaded module. */
+
+/* Initialisation and finalisation functions for libltdl. */
+LT_SCOPE int lt_dlinit LT_PARAMS((void));
+LT_SCOPE int lt_dlexit LT_PARAMS((void));
+
+/* Module search path manipulation. */
+LT_SCOPE int lt_dladdsearchdir LT_PARAMS((const char *search_dir));
+LT_SCOPE int lt_dlinsertsearchdir LT_PARAMS((const char *before,
+ const char *search_dir));
+LT_SCOPE int lt_dlsetsearchpath LT_PARAMS((const char *search_path));
+LT_SCOPE const char *lt_dlgetsearchpath LT_PARAMS((void));
+LT_SCOPE int lt_dlforeachfile LT_PARAMS((
+ const char *search_path,
+ int (*func) (const char *filename, lt_ptr data),
+ lt_ptr data));
+
+/* Portable libltdl versions of the system dlopen() API. */
+LT_SCOPE lt_dlhandle lt_dlopen LT_PARAMS((const char *filename));
+LT_SCOPE lt_dlhandle lt_dlopenext LT_PARAMS((const char *filename));
+LT_SCOPE lt_ptr lt_dlsym LT_PARAMS((lt_dlhandle handle,
+ const char *name));
+LT_SCOPE const char *lt_dlerror LT_PARAMS((void));
+LT_SCOPE int lt_dlclose LT_PARAMS((lt_dlhandle handle));
+
+/* Module residency management. */
+LT_SCOPE int lt_dlmakeresident LT_PARAMS((lt_dlhandle handle));
+LT_SCOPE int lt_dlisresident LT_PARAMS((lt_dlhandle handle));
+
+
+
+\f
+/* --- MUTEX LOCKING --- */
+
+
+typedef void lt_dlmutex_lock LT_PARAMS((void));
+typedef void lt_dlmutex_unlock LT_PARAMS((void));
+typedef void lt_dlmutex_seterror LT_PARAMS((const char *errmsg));
+typedef const char *lt_dlmutex_geterror LT_PARAMS((void));
+
+LT_SCOPE int lt_dlmutex_register LT_PARAMS((lt_dlmutex_lock *lock,
+ lt_dlmutex_unlock *unlock,
+ lt_dlmutex_seterror *seterror,
+ lt_dlmutex_geterror *geterror));
+
+
+
+\f
+/* --- MEMORY HANDLING --- */
+
+
+/* By default, the realloc function pointer is set to our internal
+ realloc implementation which iself uses lt_dlmalloc and lt_dlfree.
+ libltdl relies on a featureful realloc, but if you are sure yours
+ has the right semantics then you can assign it directly. Generally,
+ it is safe to assign just a malloc() and a free() function. */
+LT_SCOPE lt_ptr (*lt_dlmalloc) LT_PARAMS((size_t size));
+LT_SCOPE lt_ptr (*lt_dlrealloc) LT_PARAMS((lt_ptr ptr, size_t size));
+LT_SCOPE void (*lt_dlfree) LT_PARAMS((lt_ptr ptr));
+
+
+
+\f
+/* --- PRELOADED MODULE SUPPORT --- */
+
+
+/* A preopened symbol. Arrays of this type comprise the exported
+ symbols for a dlpreopened module. */
+typedef struct {
+ const char *name;
+ lt_ptr address;
+} lt_dlsymlist;
+
+LT_SCOPE int lt_dlpreload LT_PARAMS((const lt_dlsymlist *preloaded));
+LT_SCOPE int lt_dlpreload_default
+ LT_PARAMS((const lt_dlsymlist *preloaded));
+
+#define LTDL_SET_PRELOADED_SYMBOLS() LT_STMT_START{ \
+ extern const lt_dlsymlist lt_preloaded_symbols[]; \
+ lt_dlpreload_default(lt_preloaded_symbols); \
+ }LT_STMT_END
+
+
+
+\f
+/* --- MODULE INFORMATION --- */
+
+
+/* Read only information pertaining to a loaded module. */
+typedef struct {
+ char *filename; /* file name */
+ char *name; /* module name */
+ int ref_count; /* number of times lt_dlopened minus
+ number of times lt_dlclosed. */
+} lt_dlinfo;
+
+LT_SCOPE const lt_dlinfo *lt_dlgetinfo LT_PARAMS((lt_dlhandle handle));
+LT_SCOPE lt_dlhandle lt_dlhandle_next LT_PARAMS((lt_dlhandle place));
+LT_SCOPE int lt_dlforeach LT_PARAMS((
+ int (*func) (lt_dlhandle handle, lt_ptr data),
+ lt_ptr data));
+
+/* Associating user data with loaded modules. */
+typedef unsigned lt_dlcaller_id;
+
+LT_SCOPE lt_dlcaller_id lt_dlcaller_register LT_PARAMS((void));
+LT_SCOPE lt_ptr lt_dlcaller_set_data LT_PARAMS((lt_dlcaller_id key,
+ lt_dlhandle handle,
+ lt_ptr data));
+LT_SCOPE lt_ptr lt_dlcaller_get_data LT_PARAMS((lt_dlcaller_id key,
+ lt_dlhandle handle));
+
+
+\f
+/* --- USER MODULE LOADER API --- */
+
+
+typedef struct lt_dlloader lt_dlloader;
+typedef lt_ptr lt_user_data;
+typedef lt_ptr lt_module;
+
+/* Function pointer types for creating user defined module loaders. */
+typedef lt_module lt_module_open LT_PARAMS((lt_user_data loader_data,
+ const char *filename));
+typedef int lt_module_close LT_PARAMS((lt_user_data loader_data,
+ lt_module handle));
+typedef lt_ptr lt_find_sym LT_PARAMS((lt_user_data loader_data,
+ lt_module handle,
+ const char *symbol));
+typedef int lt_dlloader_exit LT_PARAMS((lt_user_data loader_data));
+
+struct lt_user_dlloader {
+ const char *sym_prefix;
+ lt_module_open *module_open;
+ lt_module_close *module_close;
+ lt_find_sym *find_sym;
+ lt_dlloader_exit *dlloader_exit;
+ lt_user_data dlloader_data;
+};
+
+LT_SCOPE lt_dlloader *lt_dlloader_next LT_PARAMS((lt_dlloader *place));
+LT_SCOPE lt_dlloader *lt_dlloader_find LT_PARAMS((
+ const char *loader_name));
+LT_SCOPE const char *lt_dlloader_name LT_PARAMS((lt_dlloader *place));
+LT_SCOPE lt_user_data *lt_dlloader_data LT_PARAMS((lt_dlloader *place));
+LT_SCOPE int lt_dlloader_add LT_PARAMS((lt_dlloader *place,
+ const struct lt_user_dlloader *dlloader,
+ const char *loader_name));
+LT_SCOPE int lt_dlloader_remove LT_PARAMS((
+ const char *loader_name));
+
+
+\f
+/* --- ERROR MESSAGE HANDLING --- */
+
+
+/* Defining error strings alongside their symbolic names in a macro in
+ this way allows us to expand the macro in different contexts with
+ confidence that the enumeration of symbolic names will map correctly
+ onto the table of error strings. */
+#define lt_dlerror_table \
+ LT_ERROR(UNKNOWN, "unknown error") \
+ LT_ERROR(DLOPEN_NOT_SUPPORTED, "dlopen support not available") \
+ LT_ERROR(INVALID_LOADER, "invalid loader") \
+ LT_ERROR(INIT_LOADER, "loader initialization failed") \
+ LT_ERROR(REMOVE_LOADER, "loader removal failed") \
+ LT_ERROR(FILE_NOT_FOUND, "file not found") \
+ LT_ERROR(DEPLIB_NOT_FOUND, "dependency library not found") \
+ LT_ERROR(NO_SYMBOLS, "no symbols defined") \
+ LT_ERROR(CANNOT_OPEN, "can't open the module") \
+ LT_ERROR(CANNOT_CLOSE, "can't close the module") \
+ LT_ERROR(SYMBOL_NOT_FOUND, "symbol not found") \
+ LT_ERROR(NO_MEMORY, "not enough memory") \
+ LT_ERROR(INVALID_HANDLE, "invalid module handle") \
+ LT_ERROR(BUFFER_OVERFLOW, "internal buffer overflow") \
+ LT_ERROR(INVALID_ERRORCODE, "invalid errorcode") \
+ LT_ERROR(SHUTDOWN, "library already shutdown") \
+ LT_ERROR(CLOSE_RESIDENT_MODULE, "can't close resident module") \
+ LT_ERROR(INVALID_MUTEX_ARGS, "invalid mutex handler registration") \
+ LT_ERROR(INVALID_POSITION, "invalid search path insert position")
+
+/* Enumerate the symbolic error names. */
+enum {
+#define LT_ERROR(name, diagnostic) LT_CONC(LT_ERROR_, name),
+ lt_dlerror_table
+#undef LT_ERROR
+
+ LT_ERROR_MAX
+};
+
+/* These functions are only useful from inside custom module loaders. */
+LT_SCOPE int lt_dladderror LT_PARAMS((const char *diagnostic));
+LT_SCOPE int lt_dlseterror LT_PARAMS((int errorcode));
+
+
+
+\f
+/* --- SOURCE COMPATIBILITY WITH OLD LIBLTDL --- */
+
+
+#ifdef LT_NON_POSIX_NAMESPACE
+# define lt_ptr_t lt_ptr
+# define lt_module_t lt_module
+# define lt_module_open_t lt_module_open
+# define lt_module_close_t lt_module_close
+# define lt_find_sym_t lt_find_sym
+# define lt_dlloader_exit_t lt_dlloader_exit
+# define lt_dlloader_t lt_dlloader
+# define lt_dlloader_data_t lt_user_data
+#endif
+
+//LT_END_C_DECLS
+
+} // namespace scim
+
+#endif /* !LTDL_H */
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim.cpp,v 1.51 2005/06/15 00:19:08 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_FRONTEND_MODULE
+#define Uses_SCIM_IMENGINE_MODULE
+#define Uses_SCIM_HELPER_MODULE
+#define Uses_SCIM_BACKEND
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_SCIM_TRANSACTION
+#define Uses_C_LOCALE
+#define Uses_SCIM_UTILITY
+#include "scim_private.h"
+#include <scim.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/times.h>
+#include <unistd.h>
+#include <signal.h>
+
+using namespace scim;
+using std::cout;
+using std::cerr;
+using std::endl;
+
+int main (int argc, char *argv [])
+{
+ struct tms tiks_buf;
+ clock_t clock_start = times (&tiks_buf);
+
+ BackEndPointer backend;
+
+ std::vector<String> frontend_list;
+ std::vector<String> config_list;
+ std::vector<String> engine_list;
+ std::vector<String> helper_list;
+ std::vector<String> exclude_engine_list;
+ std::vector<String> load_engine_list;
+ std::vector<String> all_engine_list;
+
+ std::vector<String>::iterator it;
+
+ String def_frontend ("socket");
+ String def_config ("simple");
+
+ int i;
+ bool daemon = false;
+ bool socket = false;
+ bool manual = false;
+
+ int new_argc = 0;
+ char *new_argv [80];
+
+ cout << "Input Service Manager " << ISF_VERSION << "\n\n";
+
+ /* Get modules list */
+ frontend_list.push_back ("socket");
+ config_list.push_back ("simple");
+ config_list.push_back ("socket");
+
+ scim_get_imengine_module_list (engine_list);
+ scim_get_helper_module_list (helper_list);
+
+ for (it = engine_list.begin (); it != engine_list.end (); it++) {
+ all_engine_list.push_back (*it);
+ if (*it != "socket")
+ load_engine_list.push_back (*it);
+ }
+ for (it = helper_list.begin (); it != helper_list.end (); it++) {
+ all_engine_list.push_back (*it);
+ load_engine_list.push_back (*it);
+ }
+
+ /* parse command options */
+ i = 0;
+ while (i < argc) {
+ if (++i >= argc) break;
+
+ if (String ("-l") == argv [i] ||
+ String ("--list") == argv [i]) {
+
+ cout << endl;
+ cout << "Available FrontEnd module:\n";
+ for (it = frontend_list.begin (); it != frontend_list.end (); it++)
+ cout << " " << *it << endl;
+
+ cout << endl;
+ cout << "Available Config module:\n";
+ for (it = config_list.begin (); it != config_list.end (); it++)
+ {
+ if (*it != "dummy")
+ cout << " " << *it << endl;
+ }
+
+ cout << endl;
+ cout << "Available ISEngine module:\n";
+ for (it = all_engine_list.begin (); it != all_engine_list.end (); it++)
+ cout << " " << *it << endl;
+
+ return 0;
+ }
+
+ if (String ("-f") == argv [i] ||
+ String ("--frontend") == argv [i]) {
+ if (++i >= argc) {
+ cerr << "No argument for option " << argv [i-1] << endl;
+ return -1;
+ }
+ def_frontend = argv [i];
+ continue;
+ }
+
+ if (String ("-c") == argv [i] ||
+ String ("--config") == argv [i]) {
+ if (++i >= argc) {
+ cerr << "No argument for option " << argv [i-1] << endl;
+ return -1;
+ }
+ def_config = argv [i];
+ continue;
+ }
+
+ if (String ("-h") == argv [i] ||
+ String ("--help") == argv [i]) {
+ cout << "Usage: " << argv [0] << " [option]...\n\n"
+ << "The options are: \n"
+ << " -l, --list List all of available modules.\n"
+ << " -f, --frontend name Use specified FrontEnd module.\n"
+ << " -c, --config name Use specified Config module.\n"
+ << " -e, --engines name Load specified set of ISEngines.\n"
+ << " -ne,--no-engines name Do not load those set of ISEngines.\n"
+ << " -d, --daemon Run as a daemon.\n"
+ << " --no-socket Do not try to start a SocketFrontEnd daemon.\n"
+ << " -h, --help Show this help message.\n";
+ return 0;
+ }
+
+ if (String ("-d") == argv [i] ||
+ String ("--daemon") == argv [i]) {
+ daemon = true;
+ continue;
+ }
+
+ if (String ("-e") == argv [i] || String ("-s") == argv [i] ||
+ String ("--engines") == argv [i] || String ("--servers") == argv [i]) {
+ if (++i >= argc) {
+ cerr << "No argument for option " << argv [i-1] << endl;
+ return -1;
+ }
+ load_engine_list.clear ();
+ scim_split_string_list (load_engine_list, String (argv [i]), ',');
+ manual = true;
+ continue;
+ }
+
+ if (String ("-ne") == argv [i] || String ("-ns") == argv [i] ||
+ String ("--no-engines") == argv [i] || String ("-no-servers") == argv [i]) {
+ if (++i >= argc) {
+ cerr << "No argument for option " << argv [i-1] << endl;
+ return -1;
+ }
+ scim_split_string_list (exclude_engine_list, String (argv [i]), ',');
+ manual = true;
+ continue;
+ }
+
+ if (String ("--no-socket") == argv [i]) {
+ socket = false;
+ continue;
+ }
+
+ if (String ("--") == argv [i])
+ break;
+
+ cerr << "Invalid command line option: " << argv [i] << "\n";
+ return -1;
+ } /* End of command line parsing. */
+
+ /* Store the rest argvs into new_argv. */
+ for (++i; i < argc; ++i) {
+ new_argv [new_argc ++] = argv [i];
+ }
+
+ new_argv [new_argc] = 0;
+
+ /* Get the imengine module list which should be loaded. */
+ if (exclude_engine_list.size ()) {
+ load_engine_list.clear ();
+ for (i = 0; i < (int)all_engine_list.size (); ++i) {
+ if (std::find (exclude_engine_list.begin (),
+ exclude_engine_list.end (),
+ all_engine_list [i]) == exclude_engine_list.end () &&
+ all_engine_list [i] != "socket")
+ load_engine_list.push_back (all_engine_list [i]);
+ }
+ }
+
+ cerr << "Launching a process with " << def_frontend << " FrontEnd...\n";
+
+ /* Launch the scim process. */
+ if (scim_launch (daemon,
+ def_config,
+ (load_engine_list.size () ? scim_combine_string_list (load_engine_list, ',') : "none"),
+ def_frontend,
+ new_argv) == 0) {
+ if (daemon)
+ cerr << "ISM has been successfully launched.\n";
+ else
+ cerr << "ISM has exited successfully.\n";
+
+ gettime (clock_start, "ISM launch time");
+
+ return 0;
+ }
+
+ if (daemon)
+ cerr << "Failed to launch ISM.\n";
+ else
+ cerr << "ISM has exited abnormally.\n";
+
+ return 1;
+}
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/** @file scim.h
+ *
+ * all of the header files are included within this file.
+ * source files may include this file instead of others headers.
+ *
+ * @defgroup InputServiceFramework Input Service Framework
+ * The Input Service Framework (ISF) is based on the open source project SCIM-1.4.7.<br>
+ * The Input Service Framework is capable of supporting advanced input methods like full touch input, voice input, handwriting etc.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim.h,v 1.38 2005/05/17 06:45:14 suzhe Exp $
+ */
+
+/* Define the macros */
+#define Uses_SCIM_TYPES
+#define Uses_SCIM_UTILITY
+#define Uses_SCIM_GLOBAL_CONFIG
+#define Uses_SCIM_EXCEPTION
+#define Uses_SCIM_DEBUG
+#define Uses_SCIM_OBJECT
+#define Uses_SCIM_SIGNALS
+#define Uses_SCIM_SLOT
+#define Uses_SCIM_CONNECTION
+#define Uses_SCIM_BIND
+#define Uses_SCIM_POINTER
+#define Uses_STL_STRING
+#define Uses_STL_VECTOR
+#define Uses_STL_ALGORITHM
+#define Uses_STL_NEW
+
+#ifdef Uses_SCIM_FILTER_MANAGER
+ #define Uses_SCIM_FILTER
+#endif
+
+#ifdef Uses_SCIM_FILTER_MODULE
+ #define Uses_SCIM_MODULE
+ #define Uses_SCIM_CONFIG_BASE
+ #define Uses_SCIM_BACKEND
+ #define Uses_SCIM_FILTER
+#endif
+
+#ifdef Uses_SCIM_FILTER
+ #define Uses_SCIM_IMENGINE
+#endif
+
+#ifdef Uses_SCIM_PANEL
+ #define Uses_SCIM_PANEL_AGENT
+ #define Uses_SCIM_PANEL_CLIENT
+#endif
+
+#ifdef Uses_SCIM_PANEL_AGENT
+ #define Uses_SCIM_HELPER_MANAGER
+ #define Uses_SCIM_TRANSACTION
+#endif
+
+#ifdef Uses_SCIM_PANEL_CLIENT
+ #define Uses_SCIM_TRANSACTION
+#endif
+
+#ifdef Uses_SCIM_HELPER_MANAGER
+ #define Uses_SCIM_HELPER
+#endif
+
+#ifdef Uses_SCIM_HELPER_MODULE
+ #define Uses_SCIM_HELPER
+ #define Uses_SCIM_MODULE
+ #define Uses_SCIM_CONFIG_BASE
+#endif
+
+#ifdef Uses_SCIM_HELPER
+ #define Uses_SCIM_TRANSACTION
+ #define Uses_SCIM_EVENT
+#endif
+
+#ifdef Uses_SCIM_COMPOSE_KEY
+ #define Uses_SCIM_IMENGINE
+#endif
+
+#ifdef Uses_SCIM_TRANSACTION
+ #define Uses_SCIM_EVENT
+ #define Uses_SCIM_LOOKUP_TABLE
+ #define Uses_SCIM_SOCKET
+ #define Uses_SCIM_ATTRIBUTE
+ #define Uses_SCIM_PROPERTY
+ #define Uses_SCIM_TRANS_COMMANDS
+#endif
+
+#ifdef Uses_SCIM_CONFIG_MODULE
+ #define Uses_SCIM_MODULE
+ #define Uses_SCIM_CONFIG_BASE
+#endif
+
+#ifdef Uses_SCIM_IMENGINE_MODULE
+ #define Uses_SCIM_MODULE
+ #define Uses_SCIM_CONFIG_BASE
+ #define Uses_SCIM_IMENGINE
+#endif
+
+#ifdef Uses_SCIM_FRONTEND_MODULE
+ #define Uses_SCIM_MODULE
+ #define Uses_SCIM_CONFIG_BASE
+ #define Uses_SCIM_FRONTEND
+#endif
+
+#ifdef Uses_SCIM_ICONV
+ #define Uses_C_ICONV
+#endif
+
+#ifdef Uses_SCIM_FRONTEND
+ #define Uses_SCIM_BACKEND
+ #define Uses_SCIM_IMENGINE
+ #define Uses_SCIM_EVENT
+ #define Uses_SCIM_LOOKUP_TABLE
+ #define Uses_STL_MAP
+ #define Uses_C_STDIO
+ #define Uses_SCIM_ATTRIBUTE
+ #define Uses_SCIM_PROPERTY
+ #define Uses_SCIM_TRANSACTION
+ #define Uses_SCIM_SOCKET
+#endif
+
+#ifdef Uses_SCIM_BACKEND
+ #define Uses_SCIM_IMENGINE
+ #define Uses_SCIM_CONFIG_BASE
+ #define Uses_SCIM_COMPOSE_KEY
+#endif
+
+#ifdef Uses_SCIM_IMENGINE
+ #define Uses_SCIM_EVENT
+ #define Uses_SCIM_LOOKUP_TABLE
+ #define Uses_SCIM_ATTRIBUTE
+ #define Uses_SCIM_PROPERTY
+ #define Uses_SCIM_TRANSACTION
+ #define Uses_SCIM_SOCKET
+#endif
+
+#ifdef Uses_SCIM_LOOKUP_TABLE
+ #define Uses_SCIM_EVENT
+ #define Uses_SCIM_ATTRIBUTE
+#endif
+
+#ifdef Uses_SCIM_CONFIG_BASE
+ #define Uses_SCIM_MODULE
+ #define Uses_SCIM_CONFIG_MODULE
+ #define Uses_STL_LIST
+#endif
+
+#ifdef Uses_SCIM_EXCEPTION
+ #define Uses_STL_EXCEPTION
+#endif
+
+#ifdef Uses_SCIM_DEBUG
+ #define Uses_STL_IOSTREAM
+ #define Uses_STL_FSTREAM
+#endif
+
+#ifdef Uses_SCIM_UTILITY
+ #define Uses_STL_IOSTREAM
+#endif
+
+#ifdef Uses_SCIM_HOTKEY
+ #define Uses_SCIM_EVENT
+ #define Uses_SCIM_CONFIG_BASE
+ #define Uses_SCIM_CONFIG_PATH
+#endif
+
+/* Include Standard headers */
+#ifdef Uses_STL_EXCEPTION
+ #include <exception>
+#endif
+
+#ifdef Uses_STL_NEW
+ #include <new>
+#endif
+
+#ifdef Uses_STL_IOSTREAM
+ #include <iostream>
+#endif
+
+#ifdef Uses_STL_FSTREAM
+ #include <fstream>
+#endif
+
+#ifdef Uses_STL_FUNCTIONAL
+ #include <functional>
+#endif
+
+#ifdef Uses_STL_IOMANIP
+ #include <iomanip>
+#endif
+
+#ifdef Uses_STL_MEMORY
+ #include <memory>
+#endif
+
+#ifdef Uses_STL_VECTOR
+ #include <vector>
+#endif
+
+#ifdef Uses_STL_LIST
+ #include <list>
+#endif
+
+#ifdef Uses_STL_MAP
+ #include <map>
+#endif
+
+#ifdef Uses_STL_QUEUE
+ #include <queue>
+#endif
+
+#ifdef Uses_STL_ALGORITHM
+ #include <algorithm>
+#endif
+
+#ifdef Uses_STL_UTILITY
+ #include <utility>
+#endif
+
+#ifdef Uses_STL_STRING
+ #include <string>
+#endif
+
+#ifdef Uses_STL_STRSTREAM
+ #include <strstream>
+#endif
+
+#ifdef Uses_C_STDIO
+ #include <cstdio>
+#endif
+
+#ifdef Uses_C_STDLIB
+ #include <cstdlib>
+#endif
+
+#ifdef Uses_C_LOCALE
+ #include <clocale>
+#endif
+
+#ifdef Uses_C_CTYPE
+ #include <cctype>
+#endif
+
+#ifdef Uses_C_WCTYPE
+ #include <cwctype>
+#endif
+
+#ifdef Uses_C_STRING
+ #include <cstring>
+#endif
+
+#ifdef Uses_C_LIMITS
+ #include <climits>
+#endif
+
+#ifdef Uses_C_ICONV
+ #include <iconv.h>
+#endif
+
+/* Include SCIM Headers */
+#ifdef Uses_SCIM_TYPES
+ #include <scim_types.h>
+#endif
+
+#ifdef Uses_SCIM_DEBUG
+ #include <scim_debug.h>
+#endif
+
+#ifdef Uses_SCIM_EXCEPTION
+ #include <scim_exception.h>
+#endif
+
+#ifdef Uses_SCIM_EVENT
+ #include <scim_event.h>
+#endif
+
+#ifdef Uses_SCIM_UTILITY
+ #include <scim_utility.h>
+#endif
+
+#ifdef Uses_SCIM_GLOBAL_CONFIG
+ #include <scim_global_config.h>
+#endif
+
+#ifdef Uses_SCIM_OBJECT
+ #include <scim_object.h>
+#endif
+
+#ifdef Uses_SCIM_POINTER
+ #include <scim_pointer.h>
+#endif
+
+#ifdef Uses_SCIM_SLOT
+ #include <scim_slot.h>
+#endif
+
+#ifdef Uses_SCIM_CONNECTION
+ #include <scim_connection.h>
+#endif
+
+#ifdef Uses_SCIM_SIGNALS
+ #include <scim_signals.h>
+#endif
+
+#ifdef Uses_SCIM_BIND
+ #include <scim_bind.h>
+#endif
+
+#ifdef Uses_SCIM_CONFIG_BASE
+ #include <scim_config_base.h>
+#endif
+
+#ifdef Uses_SCIM_ATTRIBUTE
+ #include <scim_attribute.h>
+#endif
+
+#ifdef Uses_SCIM_PROPERTY
+ #include <scim_property.h>
+#endif
+
+#ifdef Uses_SCIM_LOOKUP_TABLE
+ #include <scim_lookup_table.h>
+#endif
+
+#ifdef Uses_SCIM_ICONV
+ #include <scim_iconv.h>
+#endif
+
+#ifdef Uses_SCIM_MODULE
+ #include <scim_module.h>
+#endif
+
+#ifdef Uses_SCIM_SOCKET
+ #include <scim_socket.h>
+#endif
+
+#ifdef Uses_SCIM_TRANSACTION
+ #include <scim_transaction.h>
+#endif
+
+#ifdef Uses_SCIM_IMENGINE
+ #include <scim_imengine.h>
+#endif
+
+#ifdef Uses_SCIM_IMENGINE_MODULE
+ #include <scim_imengine_module.h>
+#endif
+
+#ifdef Uses_SCIM_COMPOSE_KEY
+ #include <scim_compose_key.h>
+#endif
+
+#ifdef Uses_SCIM_BACKEND
+ #include <scim_backend.h>
+#endif
+
+#ifdef Uses_SCIM_FRONTEND
+ #include <scim_frontend.h>
+#endif
+
+#ifdef Uses_SCIM_FRONTEND_MODULE
+ #include <scim_frontend_module.h>
+#endif
+
+#ifdef Uses_SCIM_CONFIG_MODULE
+ #include <scim_config_module.h>
+#endif
+
+#ifdef Uses_SCIM_CONFIG_PATH
+ #include <scim_config_path.h>
+#endif
+
+#ifdef Uses_SCIM_TRANS_COMMANDS
+ #include <scim_trans_commands.h>
+#endif
+
+#ifdef Uses_SCIM_HELPER
+ #include <scim_helper.h>
+#endif
+
+#ifdef Uses_SCIM_HELPER_MODULE
+ #include <scim_helper_module.h>
+#endif
+
+#ifdef Uses_SCIM_HELPER_MANAGER
+ #include <scim_helper_manager.h>
+#endif
+
+#ifdef Uses_SCIM_PANEL_AGENT
+ #include <scim_panel_agent.h>
+#endif
+
+#ifdef Uses_SCIM_PANEL_CLIENT
+ #include <scim_panel_client.h>
+#endif
+
+#ifdef Uses_ISF_IMCONTROL_CLIENT
+ #include <isf_imcontrol_client.h>
+#endif
+
+#ifdef Uses_SCIM_HOTKEY
+ #include <scim_hotkey.h>
+#endif
+
+#ifdef Uses_SCIM_FILTER
+ #include <scim_filter.h>
+#endif
+
+#ifdef Uses_SCIM_FILTER_MODULE
+ #include <scim_filter_module.h>
+#endif
+
+#ifdef Uses_SCIM_FILTER_MANAGER
+ #include <scim_filter_manager.h>
+#endif
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_attribute.h
+ * @brief Definition of scim::Attribute and scim::AttributeList
+ *
+ * Provide class scim::Attribute to control the
+ * drawing effect of strings.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_attribute.h,v 1.7 2005/08/05 16:12:31 suzhe Exp $
+ */
+
+
+#ifndef __SCIM_ATTRIBUTE_H
+#define __SCIM_ATTRIBUTE_H
+
+namespace scim {
+
+/**
+ * @addtogroup Accessories
+ * @ingroup InputServiceFramework
+ *
+ * The accessorial classes and functions, including Attribute, IConvert, LookupTable etc.
+ *
+ * @{
+ */
+
+/**
+ * @brief Enum values of the valid attribute type.
+ */
+enum AttributeType
+{
+ SCIM_ATTR_NONE, ///< No attribute.
+ SCIM_ATTR_DECORATE, ///< A decorate attribute, eg. underline etc.
+ SCIM_ATTR_FOREGROUND, ///< A foreground color attribute, in RGB format.
+ SCIM_ATTR_BACKGROUND ///< A background color attribute, in RGB format.
+};
+
+const unsigned int SCIM_ATTR_DECORATE_NONE = 0; ///< No decorate
+const unsigned int SCIM_ATTR_DECORATE_UNDERLINE = 1; ///< Draw a line under the text
+const unsigned int SCIM_ATTR_DECORATE_HIGHLIGHT = 2; ///< Draw the text in highlighted color
+const unsigned int SCIM_ATTR_DECORATE_REVERSE = 4; ///< Draw the text in reverse color mode
+
+#define SCIM_RGB_COLOR(RED,GREEN,BLUE) ((unsigned int)(((RED)<<16) + ((GREEN)<<8) + (BLUE)))
+#define SCIM_RGB_COLOR_RED(COLOR) ((unsigned int)((COLOR>>16) & 0x00ff))
+#define SCIM_RGB_COLOR_GREEN(COLOR) ((unsigned int)((COLOR>>8) & 0x00ff))
+#define SCIM_RGB_COLOR_BLUE(COLOR) ((unsigned int)((COLOR) & 0x00ff))
+
+/**
+ * @brief Class to store the string attributes.
+ *
+ * The string attributes control the effect of the string
+ * drawn by FrontEnds. There are currently four valid types.
+ *
+ * A attribute could be one of the following types:
+ * - SCIM_ATTR_NONE No attribute
+ * - SCIM_ATTR_DECORATE Decorate attribute, eg. underline, highlight etc.
+ * - SCIM_ATTR_FOREGROUND Foreground color attribute, in RGB format.
+ * - SCIM_ATTR_BACKGROUND Background color attribute, in RGB format.
+ *
+ * For a DECORATE attribute, it can be one of the following values:
+ * - SCIM_ATTR_DECORATE_NONE No decorate
+ * - SCIM_ATTR_DECORATE_UNDERLINE Underline
+ * - SCIM_ATTR_DECORATE_HIGHLIGHT Highlight
+ * - SCIM_ATTR_DECORATE_REVERSE Reverse
+ *
+ * For a FOREGROUND or BACKGROUND attribute, it's a RGB color value generated with
+ * SCIM_RGB_COLOR (red,green,blue) macro.
+ * You may use SCIM_RGB_COLOR_RED, SCIM_RGB_COLOR_GREEN and SCIM_RGB_COLOR_BLUE to extract
+ * the RGB color later.
+ */
+class Attribute
+{
+ unsigned int m_start;
+ unsigned int m_length;
+
+ AttributeType m_type;
+ unsigned int m_value;
+
+public:
+ /**
+ * @brief Constructor
+ *
+ * @param start - the start position in the string of this attribute.
+ * @param length - the length of this attribute, the range is [start,start+length).
+ * @param type - the type of this attribute.
+ * @param value - the value of this attribute.
+ */
+ Attribute (unsigned int start = 0,
+ unsigned int length = 0,
+ AttributeType type = SCIM_ATTR_NONE,
+ unsigned int value = 0) :
+ m_start (start), m_length (length), m_type (type), m_value (value)
+ { }
+
+ /**
+ * @brief Get the type of this attribute.
+ *
+ * @return The type of this attribute.
+ */
+ AttributeType get_type () const { return m_type; }
+
+ /**
+ * @brief Get the value of this attribute.
+ *
+ * @return The value of this attribute.
+ */
+ unsigned int get_value () const { return m_value; }
+
+ /**
+ * @brief Get the start position of this attribute.
+ * @return The start position of this attribute in the string.
+ */
+ unsigned int get_start () const { return m_start; }
+
+ /**
+ * @brief Get the length of this attribute.
+ * @return The length of this attribute in the string.
+ */
+ unsigned int get_length () const { return m_length; }
+
+ /**
+ * @brief Get the end position of this attribute.
+ * @return The end position of this attribute.
+ */
+ unsigned int get_end () const { return m_start + m_length; }
+
+ /**
+ * @brief Set the type of this attribute.
+ * @param type - the new attribute type to be set.
+ */
+ void set_type (AttributeType type) { m_type = type; }
+
+ /**
+ * @brief Set the value of this attribute.
+ * @param value - the new attribute value to be set.
+ */
+ void set_value (unsigned int value) { m_value = value; }
+
+ /**
+ * @brief Set the start position of this attribute.
+ * @param start - the new start position in the string.
+ */
+ void set_start (unsigned int start) { m_start = start; }
+
+ /**
+ * @brief Set the length of this attribute.
+ * @param length - the new length of this attribute.
+ */
+ void set_length (unsigned int length) { m_length = length; }
+};
+
+inline bool
+operator < (const Attribute &lhs, const Attribute &rhs)
+{
+ return lhs.get_start () < rhs.get_start () ||
+ (lhs.get_start () == rhs.get_start () &&
+ (lhs.get_length () < rhs.get_length () ||
+ (lhs.get_length () == rhs.get_length () &&
+ (lhs.get_type () < rhs.get_type () ||
+ (lhs.get_type () == rhs.get_type () &&
+ (lhs.get_value () < rhs.get_value ()))))));
+}
+
+/**
+ * @typedef typedef std::vector<Attribute> AttributeList
+ * @brief The container to store a set of Attribute objects.
+ *
+ * You should use the STL container methods to manipulate its objects.
+ */
+typedef std::vector<Attribute> AttributeList;
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_ATTRIBUTE_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_backend.cpp,v 1.38.2.1 2006/09/24 16:00:52 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_FILTER_MANAGER
+#define Uses_SCIM_BACKEND
+#define Uses_SCIM_IMENGINE
+#define Uses_SCIM_IMENGINE_MODULE
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_STL_ALGORITHM
+#define Uses_SCIM_PANEL_AGENT
+
+
+#include <malloc.h>
+#include <string.h>
+#include "scim_private.h"
+#include "scim.h"
+#include "scim_stl_map.h"
+#include "isf_query_utility.h"
+
+
+namespace scim {
+
+#if SCIM_USE_STL_EXT_HASH_MAP
+typedef __gnu_cxx::hash_map <String, IMEngineFactoryPointer, scim_hash_string > IMEngineFactoryRepository;
+#elif SCIM_USE_STL_HASH_MAP
+typedef std::hash_map <String, IMEngineFactoryPointer, scim_hash_string > IMEngineFactoryRepository;
+#else
+typedef std::map <String, IMEngineFactoryPointer> IMEngineFactoryRepository;
+#endif
+
+typedef std::vector <IMEngineFactoryPointer> IMEngineFactoryPointerVector;
+
+
+class LocaleEqual
+{
+ String m_lhs;
+public:
+ LocaleEqual (const String &lhs) : m_lhs (lhs) { }
+
+ bool operator () (const String &rhs) const {
+ if (m_lhs == rhs) return true;
+ if (scim_get_locale_language (m_lhs) == scim_get_locale_language (rhs) &&
+ scim_get_locale_encoding (m_lhs) == scim_get_locale_encoding (rhs) &&
+ m_lhs.find ('.') != String::npos && rhs.find ('.') != String::npos)
+ return true;
+ return false;
+ }
+};
+
+class IMEngineFactoryPointerLess
+{
+public:
+ bool operator () (const IMEngineFactoryPointer &lhs, const IMEngineFactoryPointer &rhs) const {
+ return (lhs->get_language () < rhs->get_language ()) ||
+ (lhs->get_language () == rhs->get_language () && lhs->get_name () < rhs->get_name ());
+ }
+};
+
+class BackEndBase::BackEndBaseImpl
+{
+ IMEngineFactoryRepository m_factory_repository;
+ String m_supported_unicode_locales;
+ ConfigPointer m_config;
+
+public:
+ BackEndBaseImpl (const ConfigPointer &config)
+ : m_config (config)
+ {
+ String locales;
+
+ /* Set the default supported locales. */
+ locales = scim_global_config_read (SCIM_GLOBAL_CONFIG_SUPPORTED_UNICODE_LOCALES, String ("en_US.UTF-8"));
+
+ std::vector <String> locale_list;
+ std::vector <String> real_list;
+
+ scim_split_string_list (locale_list, locales);
+
+ for (std::vector <String>::iterator i = locale_list.begin (); i!= locale_list.end (); ++i) {
+ *i = scim_validate_locale (*i);
+ if (i->length () && scim_get_locale_encoding (*i) == "UTF-8" &&
+ std::find_if (real_list.begin (), real_list.end (), LocaleEqual (*i)) == real_list.end ())
+ real_list.push_back (*i);
+ }
+
+ m_supported_unicode_locales = scim_combine_string_list (real_list);
+ }
+
+ void clear ()
+ {
+ m_factory_repository.clear ();
+ }
+
+ void dump_factories ()
+ {
+ IMEngineFactoryRepository::const_iterator it;
+ std::cout << "Factories in backend:" << std::endl;
+ for (it = m_factory_repository.begin (); it != m_factory_repository.end (); ++it) {
+ if (it->second.null ())
+ std::cout << "\t" << it->first << ": null" << std::endl;
+ else
+ std::cout << "\t" << it->first << ": valid" << std::endl;
+ }
+ }
+
+ String get_all_locales () const
+ {
+ String locale;
+
+ std::vector <String> locale_list;
+ std::vector <String> real_list;
+
+ IMEngineFactoryRepository::const_iterator it;
+
+ for (it = m_factory_repository.begin (); it != m_factory_repository.end (); ++it) {
+ if (locale.length () == 0)
+ locale += it->second->get_locales ();
+ else
+ locale += (String (",") + it->second->get_locales ());
+ }
+
+ if (m_supported_unicode_locales.length ())
+ locale += (String (",") + m_supported_unicode_locales);
+
+ scim_split_string_list (locale_list, locale);
+
+ for (std::vector <String>::iterator i = locale_list.begin (); i!= locale_list.end (); i++) {
+ locale = scim_validate_locale (*i);
+ if (locale.length () &&
+ std::find_if (real_list.begin (), real_list.end (), LocaleEqual (locale)) == real_list.end ())
+ real_list.push_back (locale);
+ }
+
+ return scim_combine_string_list (real_list);
+ }
+
+ IMEngineFactoryPointer get_factory (const String &uuid) const
+ {
+ IMEngineFactoryRepository::const_iterator it = m_factory_repository.find (uuid);
+
+ if (it != m_factory_repository.end ())
+ return it->second;
+
+ return IMEngineFactoryPointer (0);
+ }
+
+ uint32 get_factories_for_encoding (std::vector<IMEngineFactoryPointer> &factories,
+ const String &encoding) const
+ {
+ IMEngineFactoryRepository::const_iterator it;
+
+ factories.clear ();
+
+ for (it = m_factory_repository.begin (); it != m_factory_repository.end (); ++it) {
+ if ((encoding.length () == 0 || it->second->validate_encoding (encoding)))
+ factories.push_back (it->second);
+ }
+
+ sort_factories (factories);
+
+ return factories.size ();
+ }
+
+ uint32 get_factories_for_language (std::vector<IMEngineFactoryPointer> &factories,
+ const String &language) const
+ {
+ IMEngineFactoryRepository::const_iterator it;
+
+ factories.clear ();
+
+ for (it = m_factory_repository.begin (); it != m_factory_repository.end (); ++it) {
+ if ((language.length () == 0 || it->second->get_language () == language))
+ factories.push_back (it->second);
+ }
+
+ sort_factories (factories);
+
+ return factories.size ();
+ }
+
+ uint32 get_factory_list (std::vector<String> &uuids) const
+ {
+ IMEngineFactoryRepository::const_iterator it;
+ for (it = m_factory_repository.begin (); it != m_factory_repository.end (); ++it)
+ uuids.push_back(it->first);
+
+ return m_factory_repository.size ();
+ }
+
+ IMEngineFactoryPointer get_default_factory (const String &language, const String &encoding) const
+ {
+ if (!language.length ()) return IMEngineFactoryPointer ();
+
+ IMEngineFactoryPointerVector factories;
+
+ if (get_factories_for_encoding (factories, encoding) > 0) {
+ IMEngineFactoryPointer lang_first;
+ IMEngineFactoryPointerVector::iterator it;
+
+ String def_uuid;
+
+ def_uuid = m_config->read (String (SCIM_CONFIG_DEFAULT_IMENGINE_FACTORY) +
+ String ("/") + String ("~other"),
+ String (""));
+
+ /* Match by Normalized language exactly. */
+ for (it = factories.begin (); it != factories.end (); ++it) {
+ if (scim_get_normalized_language ((*it)->get_language ()) == language && lang_first.null ())
+ lang_first = *it;
+
+ if ((*it)->get_uuid () == def_uuid)
+ return *it;
+ }
+
+ if (!lang_first.null ())
+ return lang_first;
+
+ /* Match by short language name. */
+ for (it = factories.begin (); it != factories.end (); ++it)
+ if ((*it)->get_language () == language.substr (0,2))
+ return *it;
+
+ return factories [0];
+ }
+
+ return IMEngineFactoryPointer ();
+ }
+
+ void set_default_factory (const String &language, const String &uuid)
+ {
+ if (!language.length () || !uuid.length ()) return;
+
+ IMEngineFactoryPointerVector factories;
+ if (get_factories_for_encoding (factories, "") > 0) {
+ IMEngineFactoryPointerVector::iterator it;
+ for (it = factories.begin (); it != factories.end (); ++it) {
+ if ((*it)->get_uuid () == uuid) {
+ m_config->write (String (SCIM_CONFIG_DEFAULT_IMENGINE_FACTORY) + String ("/") + String ("~other"), uuid);
+ m_config->flush ();
+ return;
+ }
+ }
+ }
+ }
+
+ IMEngineFactoryPointer get_next_factory (const String &language, const String &encoding, const String &cur_uuid) const
+ {
+ IMEngineFactoryPointerVector factories;
+
+ if (get_factories_for_encoding (factories, encoding) > 0) {
+ IMEngineFactoryPointer lang_first;
+ IMEngineFactoryPointerVector::iterator it, itl;
+
+ for (it = factories.begin (); it != factories.end (); ++it) {
+ if ((language.length () == 0 || (*it)->get_language () == language) && lang_first.null ())
+ lang_first = *it;
+
+ if ((*it)->get_uuid () == cur_uuid) {
+ for (itl = it + 1; itl != factories.end (); ++itl) {
+ if (language.length () == 0 || (*itl)->get_language () == language)
+ return *itl;
+ }
+ if (!lang_first.null ()) return lang_first;
+
+ return factories [0];
+ }
+ }
+ }
+
+ return IMEngineFactoryPointer ();
+ }
+
+ IMEngineFactoryPointer get_previous_factory (const String &language, const String &encoding, const String &cur_uuid) const
+ {
+ IMEngineFactoryPointerVector factories;
+
+ if (get_factories_for_encoding (factories, encoding) > 0) {
+ IMEngineFactoryPointer lang_last;
+ IMEngineFactoryPointerVector::iterator it, itl;
+
+ for (it = factories.begin (); it != factories.end (); ++it) {
+ if ((language.length () == 0 || (*it)->get_language () == language))
+ lang_last = *it;
+ }
+
+ for (it = factories.begin (); it != factories.end (); ++it) {
+ if ((*it)->get_uuid () == cur_uuid) {
+ for (itl = it; itl != factories.begin (); --itl) {
+ if (language.length () == 0 || (*(itl-1))->get_language () == language)
+ return *(itl-1);
+ }
+
+ if (!lang_last.null ()) return lang_last;
+
+ return factories [factories.size () - 1];
+ }
+ }
+ }
+
+ return IMEngineFactoryPointer ();
+ }
+
+ bool add_factory (const IMEngineFactoryPointer &factory)
+ {
+ if (!factory.null ()) {
+ String uuid = factory->get_uuid ();
+
+ if (uuid.length ()) {
+ m_factory_repository [uuid] = factory;
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ void add_specific_factory (const String &uuid, const IMEngineFactoryPointer &factory)
+ {
+ m_factory_repository [uuid] = factory;
+ return;
+ }
+
+private:
+ void sort_factories (std::vector<IMEngineFactoryPointer> &factories) const
+ {
+ std::sort (factories.begin (), factories.end (), IMEngineFactoryPointerLess ());
+ }
+};
+
+BackEndBase::BackEndBase (const ConfigPointer &config)
+ : m_impl (new BackEndBase::BackEndBaseImpl (config))
+{
+}
+
+BackEndBase::~BackEndBase ()
+{
+ delete m_impl;
+}
+
+String
+BackEndBase::get_all_locales () const
+{
+ return m_impl->get_all_locales ();
+}
+
+IMEngineFactoryPointer
+BackEndBase::get_factory (const String &uuid) const
+{
+ return m_impl->get_factory (uuid);
+}
+
+uint32
+BackEndBase::get_factories_for_encoding (std::vector<IMEngineFactoryPointer> &factories, const String &encoding) const
+{
+ return m_impl->get_factories_for_encoding (factories, encoding);
+}
+
+uint32
+BackEndBase::get_factories_for_language (std::vector<IMEngineFactoryPointer> &factories, const String &language) const
+{
+ return m_impl->get_factories_for_language (factories, language);
+}
+
+uint32
+BackEndBase::get_factory_list (std::vector<String> &uuids) const
+{
+ return m_impl->get_factory_list (uuids);
+}
+
+IMEngineFactoryPointer
+BackEndBase::get_default_factory (const String &language, const String &encoding) const
+{
+ return m_impl->get_default_factory (language, encoding);
+}
+
+void
+BackEndBase::set_default_factory (const String &language, const String &uuid)
+{
+ m_impl->set_default_factory (language, uuid);
+}
+
+IMEngineFactoryPointer
+BackEndBase::get_next_factory (const String &language, const String &encoding, const String &cur_uuid) const
+{
+ return m_impl->get_next_factory (language, encoding, cur_uuid);
+}
+
+IMEngineFactoryPointer
+BackEndBase::get_previous_factory (const String &language, const String &encoding, const String &cur_uuid) const
+{
+ return m_impl->get_previous_factory (language, encoding, cur_uuid);
+}
+
+bool
+BackEndBase::add_factory (const IMEngineFactoryPointer &factory)
+{
+ return m_impl->add_factory (factory);
+}
+
+void
+BackEndBase::add_specific_factory (const String &uuid,
+ const IMEngineFactoryPointer &factory)
+{
+ m_impl->add_specific_factory (uuid, factory);
+ return;
+}
+
+void
+BackEndBase::clear ()
+{
+ m_impl->clear ();
+}
+
+void
+BackEndBase::dump_factories ()
+{
+ m_impl->dump_factories ();
+}
+
+/* Implementation of CommonBackEnd. */
+struct CommonBackEnd::CommonBackEndImpl {
+ std::vector<IMEngineModule *> m_engine_modules;
+ FilterManager *m_filter_manager;
+ std::vector<String> m_disabled_factories;
+ std::vector<String> m_modules;
+ std::map <String, String> m_factory_module_repository;
+
+ CommonBackEndImpl () : m_filter_manager (0) { }
+};
+
+CommonBackEnd::CommonBackEnd (const ConfigPointer &config,
+ const std::vector<String> &modules)
+ : BackEndBase (config),
+ m_impl (new CommonBackEndImpl)
+{
+}
+
+CommonBackEnd::~CommonBackEnd ()
+{
+ clear ();
+
+ for (unsigned int i = 0; i < m_impl->m_engine_modules.size (); i++) {
+ if (m_impl->m_engine_modules [i]) {
+ m_impl->m_engine_modules [i]->unload ();
+ delete m_impl->m_engine_modules [i];
+ m_impl->m_engine_modules [i] = NULL;
+ }
+ }
+ delete m_impl->m_filter_manager;
+ delete m_impl;
+}
+
+void
+CommonBackEnd::initialize (const ConfigPointer &config,
+ const std::vector<String> &modules,
+ const bool is_load_resource,
+ const bool is_load_info)
+{
+ SCIM_DEBUG_BACKEND (1) << __FUNCTION__ << "...\n";
+
+ IMEngineFactoryPointer factory;
+ std::vector<String> new_modules = modules;
+
+ int all_factories_count = 0;
+ int module_factories_count = 0;
+
+ if (config.null ()) return;
+
+ /* Get disabled factories list. */
+ m_impl->m_disabled_factories = scim_global_config_read (SCIM_GLOBAL_CONFIG_DISABLED_IMENGINE_FACTORIES, m_impl->m_disabled_factories);
+
+ /* Put socket module to the end of list. */
+ if (new_modules.size () > 1) {
+ for (std::vector<String>::iterator it = new_modules.begin (); it != new_modules.end (); ++it) {
+ if (*it == "socket") {
+ new_modules.erase (it);
+ new_modules.push_back ("socket");
+ break;
+ }
+ }
+ }
+
+ /* Try to load all IMEngine modules */
+ try {
+ m_impl->m_filter_manager = new FilterManager (config);
+ } catch (const std::exception & err) {
+ std::cerr << err.what () << "\n";
+ return;
+ }
+
+ if (is_load_info) {
+ /*for (size_t i = 0; i < new_modules.size (); ++i)
+ add_module_info (config, new_modules [i]);*/
+ add_module_info_from_cache_file (config, new_modules);
+ return;
+ }
+
+ /* load IMEngine modules */
+ for (size_t i = 0; i < new_modules.size (); ++i) {
+ module_factories_count = add_module (config, new_modules [i], is_load_resource);
+ all_factories_count += module_factories_count;
+ }
+
+ factory = new ComposeKeyFactory ();
+
+ if (all_factories_count == 0 ||
+ std::find (m_impl->m_disabled_factories.begin (),
+ m_impl->m_disabled_factories.end (),
+ factory->get_uuid ()) == m_impl->m_disabled_factories.end ()) {
+ factory = m_impl->m_filter_manager->attach_filters_to_factory (factory);
+ add_factory (factory);
+ }
+}
+
+int
+CommonBackEnd::add_module (const ConfigPointer &config,
+ const String module,
+ bool is_load_resource)
+{
+ SCIM_DEBUG_BACKEND (1) << __FUNCTION__ << " : " << module << "\n";
+
+ IMEngineFactoryPointer factory;
+ IMEngineModule *engine_module = NULL;
+ int module_factories_count = 0;
+ bool first_load = false;
+
+ if (config.null ()) return 0;
+
+ if (module.length () > 0) {
+ /* Check if the module is already loaded */
+ if (std::find (m_impl->m_modules.begin (), m_impl->m_modules.end (), module) == m_impl->m_modules.end ()) {
+ engine_module = new IMEngineModule;
+ m_impl->m_engine_modules.push_back (engine_module);
+ m_impl->m_modules.push_back (module);
+ engine_module->load (module, config);
+ first_load = true;
+ } else {
+ for (size_t i = 0; i < m_impl->m_modules.size (); i++) {
+ if (m_impl->m_modules [i] == module) {
+ engine_module = m_impl->m_engine_modules [i];
+ break;
+ }
+ }
+ }
+
+ if (engine_module && engine_module->valid ()) {
+ size_t number = engine_module->number_of_factories ();
+ for (size_t j = 0; j < number; ++j) {
+
+ /* Try to load a IMEngine Factory. */
+ try {
+ factory = engine_module->create_factory (j);
+ } catch (const std::exception & err) {
+ std::cerr << err.what () << "\n";
+ factory.reset ();
+ }
+
+ if (!factory.null ()) {
+ /* Check if it's disabled. */
+ if (std::find (m_impl->m_disabled_factories.begin (),
+ m_impl->m_disabled_factories.end (),
+ factory->get_uuid ()) == m_impl->m_disabled_factories.end ()) {
+
+ /* Add it into disabled list to prevent from loading again. */
+ /*m_impl->m_disabled_factories.push_back (factory->get_uuid ());*/
+
+ if (is_load_resource)
+ factory->load_resource ();
+
+ /* Only load filter for none socket IMEngines. */
+ if (module != "socket")
+ factory = m_impl->m_filter_manager->attach_filters_to_factory (factory);
+
+ add_factory (factory);
+
+ module_factories_count ++;
+
+ SCIM_DEBUG_BACKEND (1) << " Loading IMEngine Factory " << j << " : " << "OK\n";
+ } else {
+ SCIM_DEBUG_BACKEND (1) << " Loading IMEngine Factory " << j << " : " << "Disabled\n";
+ factory.reset ();
+ }
+ } else {
+ SCIM_DEBUG_BACKEND (1) << " Loading IMEngine Factory " << j << " : " << "Failed\n";
+ }
+ }
+ if (module_factories_count) {
+ SCIM_DEBUG_BACKEND (1) << module << " IMEngine module is successfully loaded.\n";
+ } else {
+ SCIM_DEBUG_BACKEND (1) << "No Factory loaded from " << module << " IMEngine module!\n";
+ if (first_load)
+ engine_module->unload ();
+ }
+ } else {
+ SCIM_DEBUG_BACKEND (1) << "Failed to load " << module << " IMEngine module.\n";
+ }
+ }
+
+ return module_factories_count;
+}
+
+void
+CommonBackEnd::add_module_info (const ConfigPointer &config, const String module_name)
+{
+ SCIM_DEBUG_BACKEND (1) << __FUNCTION__ << " : " << module_name << "\n";
+
+ if (module_name.length () <= 0 || module_name == "socket")
+ return;
+
+ IMEngineFactoryPointer factory;
+ IMEngineModule ime_module;
+
+ ime_module.load (module_name, config);
+
+ if (ime_module.valid ()) {
+ for (size_t j = 0; j < ime_module.number_of_factories (); ++j) {
+ try {
+ factory = ime_module.create_factory (j);
+ } catch (...) {
+ factory.reset ();
+ }
+
+ if (!factory.null ()) {
+ if (m_impl->m_factory_module_repository.find (factory->get_uuid ())
+ == m_impl->m_factory_module_repository.end ()) {
+ add_specific_factory (factory->get_uuid (), IMEngineFactoryPointer (0));
+ m_impl->m_factory_module_repository[factory->get_uuid ()] = module_name;
+ }
+
+ factory.reset ();
+ }
+ }
+
+ ime_module.unload ();
+ }
+}
+
+void
+CommonBackEnd::add_factory_by_uuid (const ConfigPointer &config, const String uuid)
+{
+ SCIM_DEBUG_BACKEND (1) << __FUNCTION__ << " : " << uuid << "\n";
+
+ if (m_impl->m_factory_module_repository.find (uuid) == m_impl->m_factory_module_repository.end ())
+ return;
+
+ String module = m_impl->m_factory_module_repository[uuid];
+ add_module (config, module, true);
+}
+
+void
+CommonBackEnd::release_module (const std::vector<String> &use_uuids, const String del_uuid)
+{
+ SCIM_DEBUG_BACKEND (1) << __FUNCTION__ << " : " << del_uuid << "\n";
+
+ if (m_impl->m_factory_module_repository.find (del_uuid) == m_impl->m_factory_module_repository.end ())
+ return;
+
+ String module = m_impl->m_factory_module_repository[del_uuid];
+ std::vector<String> uuids;
+ std::map <String, String>::iterator it = m_impl->m_factory_module_repository.begin ();
+
+ uuids.clear ();
+ for (; it != m_impl->m_factory_module_repository.end (); it++) {
+ if (it->second == module)
+ uuids.push_back (it->first);
+ }
+
+ for (unsigned int i = 0; i < uuids.size (); i++) {
+ for (unsigned int j = 0; j < use_uuids.size (); j++) {
+ if (uuids[i] == use_uuids[j])
+ return;
+ }
+ }
+
+ /* unload the module */
+ std::vector<String>::iterator it2 = uuids.begin ();
+ for (; it2 != uuids.end (); it2++)
+ add_specific_factory (*it2, IMEngineFactoryPointer (0));
+
+ std::vector<String>::iterator it3 = m_impl->m_modules.begin ();
+ for (; it3 != m_impl->m_modules.end (); it3++) {
+ if (*it3 == module) {
+ m_impl->m_modules.erase (it3);
+ break;
+ }
+ }
+
+ std::vector<IMEngineModule *>::iterator it4 = m_impl->m_engine_modules.begin ();
+ for (; it4 != m_impl->m_engine_modules.end (); it4++) {
+ if ((*it4)->get_module_name () == module) {
+ (*it4)->unload ();
+ delete (*it4);
+ m_impl->m_engine_modules.erase (it4);
+ break;
+ }
+ }
+ malloc_trim (0);
+}
+
+void
+CommonBackEnd::add_module_info_from_cache_file (const ConfigPointer &config, std::vector<String> &modules)
+{
+ SCIM_DEBUG_BACKEND (1) << __FUNCTION__ << "...\n";
+
+ FILE *engine_list_file = NULL;
+ FILE *user_engine_file = NULL;
+ char buf[MAXLINE];
+ bool isFirst = false;
+ std::vector<String> current_modules;
+
+ current_modules.clear ();
+
+ String user_file_name = String (USER_ENGINE_FILE_NAME);
+ String sys_file_name = String (SYS_ENGINE_FILE_NAME);
+
+ engine_list_file = fopen (user_file_name.c_str (), "r");
+ if (engine_list_file == NULL) {
+ std::cerr << user_file_name << " doesn't exist.\n";
+ isFirst = true;
+
+ engine_list_file = fopen (sys_file_name.c_str (), "r");
+ if (engine_list_file == NULL) {
+ std::cerr << sys_file_name << " doesn't exist.\n";
+ goto failed_open;
+ }
+ }
+
+ /*
+ * If we start the system firstly, the engine list file in user directory
+ * doesn't exit, we should create it.
+ */
+ if (isFirst) {
+ user_engine_file = fopen (user_file_name.c_str (), "a");
+ if (user_engine_file == NULL)
+ std::cerr << "failed to open " << user_file_name << "\n";
+ }
+
+ while (fgets (buf, MAXLINE, engine_list_file) != NULL) {
+ if (isFirst && user_engine_file != NULL) {
+ if (fputs (buf, user_engine_file) == EOF)
+ std::cerr << "failed to write " << user_file_name << "\n";
+ }
+
+ ISEINFO info;
+ isf_get_ise_info_from_string (buf, info);
+ std::vector<String>::iterator iter = std::find (modules.begin (), modules.end (), info.module);
+ if (info.mode == TOOLBAR_KEYBOARD_MODE && iter != modules.end ()) {
+ if (m_impl->m_factory_module_repository.find (info.uuid) == m_impl->m_factory_module_repository.end ()) {
+ add_specific_factory (info.uuid, IMEngineFactoryPointer (0));
+ m_impl->m_factory_module_repository[info.uuid] = info.module;
+ }
+
+ std::vector<String>::iterator iter2 = std::find (current_modules.begin (), current_modules.end (), info.module);
+ if (iter2 == current_modules.end ())
+ current_modules.push_back (info.module);
+ }
+ }
+
+ if (isFirst && user_engine_file != NULL)
+ fclose (user_engine_file);
+ fclose (engine_list_file);
+
+failed_open:
+ update_module_info (config, current_modules, modules);
+}
+
+void
+CommonBackEnd::update_module_info (const ConfigPointer &config,
+ std::vector<String> ¤t_modules,
+ std::vector<String> &modules)
+{
+ SCIM_DEBUG_BACKEND (1) << __FUNCTION__ << "...\n";
+
+ std::vector<String> imengine_list;
+ scim_get_imengine_module_list (imengine_list);
+ for (size_t i = 0; i < imengine_list.size (); ++i) {
+ if (std::find (modules.begin (), modules.end (), imengine_list [i]) != modules.end ()
+ && std::find (current_modules.begin (), current_modules.end (), imengine_list [i]) == current_modules.end ())
+ add_imengine_module_info (imengine_list [i], config);
+ }
+}
+
+void
+CommonBackEnd::add_imengine_module_info (const String module_name, const ConfigPointer &config)
+{
+ SCIM_DEBUG_BACKEND (1) << __FUNCTION__ << " : " << module_name << "\n";
+
+ if (module_name.length () <= 0 || module_name == "socket")
+ return;
+
+ IMEngineFactoryPointer factory;
+ IMEngineModule ime_module;
+
+ String filename = String (USER_ENGINE_FILE_NAME);
+ FILE *engine_list_file = fopen (filename.c_str (), "a");
+ if (engine_list_file == NULL) {
+ std::cerr << "failed to open " << filename << "\n";
+ return;
+ }
+
+ ime_module.load (module_name, config);
+
+ if (ime_module.valid ()) {
+ for (size_t j = 0; j < ime_module.number_of_factories (); ++j) {
+ try {
+ factory = ime_module.create_factory (j);
+ } catch (...) {
+ factory.reset ();
+ }
+
+ if (!factory.null ()) {
+ String uuid = factory->get_uuid ();
+ String name = utf8_wcstombs (factory->get_name ());
+ String language = isf_get_normalized_language (factory->get_language ());
+ String icon = factory->get_icon_file ();
+ char mode[12];
+ char option[12];
+
+ snprintf (mode, sizeof (mode), "%d", (int)TOOLBAR_KEYBOARD_MODE);
+ snprintf (option, sizeof (option), "%d", 0);
+
+ String line = isf_combine_ise_info_string (name, uuid, module_name, language,
+ icon, String (mode), String (option), factory->get_locales ());
+ if (fputs (line.c_str (), engine_list_file) < 0) {
+ std::cerr << "write to ise cache file failed:" << line << "\n";
+ break;
+ }
+
+ add_specific_factory (uuid, IMEngineFactoryPointer (0));
+ m_impl->m_factory_module_repository[uuid] = module_name;
+
+ factory.reset ();
+ }
+ }
+ ime_module.unload ();
+ }
+
+ fclose (engine_list_file);
+}
+
+
+} /* namespace scim */
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_backend.h
+ * @brief definition of scim::BackEnd class.
+ *
+ * Class scim::BackEnd is used to load and manage IMEngine
+ * modules and IMEngineFactories.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_backend.h,v 1.26 2005/10/06 18:02:06 liuspider Exp $
+ */
+
+#ifndef __SCIM_BACKEND_H
+#define __SCIM_BACKEND_H
+
+namespace scim {
+
+/**
+ * @brief An exception class to hold BackEnd related errors.
+ *
+ * scim::BackEndBase and its derived classes must throw
+ * scim::BackEndError object when error.
+ */
+class BackEndError: public Exception
+{
+public:
+ BackEndError (const String& what_arg)
+ : Exception (String("scim::BackEnd: ") + what_arg) { }
+};
+
+/**
+ * @brief The interface class to manage a set of IMEngineFactory
+ * and IMEngineInstance objects.
+ *
+ * This is mainly an accessory interface class used by scim::FrontEndBase.
+ * Its responsibility is to hold a set of IMEngineFactory instances
+ * and manage the locales list supported by them.
+ *
+ * Most developer should just use the default implementation
+ * scim::CommonBackEnd.
+ */
+class BackEndBase : public ReferencedObject
+{
+ class BackEndBaseImpl;
+
+ BackEndBaseImpl *m_impl;
+
+protected:
+ /**
+ * @brief Default constructor.
+ *
+ * @param config Config object to be used.
+ */
+ BackEndBase (const ConfigPointer &config);
+
+ virtual ~BackEndBase ();
+
+public:
+ /**
+ * @brief Get a list of all locales supported by all IMEngineFactories.
+ * @return A comma separated locales list.
+ */
+ String get_all_locales () const;
+
+ /**
+ * @return Return the pointer of a Factory.
+ *
+ * @param uuid The uuid of the IMEngineFactory.
+ */
+ IMEngineFactoryPointer get_factory (const String &uuid) const;
+
+public:
+ virtual void initialize (const ConfigPointer &config,
+ const std::vector<String> &modules,
+ const bool is_load_resource,
+ const bool is_load_info) = 0;
+
+ virtual int add_module (const ConfigPointer &config,
+ const String module,
+ bool is_load_resource) = 0;
+
+ virtual void add_module_info (const ConfigPointer &config,
+ const String module_name) = 0;
+
+ virtual void add_factory_by_uuid (const ConfigPointer &config,
+ const String uuid) = 0;
+
+ virtual void release_module (const std::vector<String> &use_uuids,
+ const String del_uuid) = 0;
+
+public:
+ /**
+ * @name Methods to manipulate IMEngine Factories.
+ *
+ * @{
+ */
+
+ /**
+ * @brief Get the IMEngine factories list for specific encoding
+ *
+ * @param factories the vector to store the factories which
+ * support the encoding.
+ * @param encoding the encoding to be queried. If empty,
+ * all IMEngine factories will be returned.
+ *
+ * @return the number of IMEngine factories found.
+ */
+ uint32 get_factories_for_encoding (std::vector<IMEngineFactoryPointer> &factories, const String &encoding = String ("")) const;
+
+ /**
+ * @brief Get the IMEngine factories list for specific language
+ *
+ * @param factories the vector to store the factories which
+ * support the encoding.
+ * @param language the language to be queried. If empty,
+ * all IMEngine factories will be returned.
+ *
+ * @return the number of IMEngine factories found.
+ */
+ uint32 get_factories_for_language (std::vector<IMEngineFactoryPointer> &factories, const String &language = String ("")) const;
+
+ uint32 get_factory_list (std::vector<String> &uuids) const;
+
+ /**
+ * @brief Get the default IMEngineFactory for a specific language and encoding.
+ *
+ * @param language the language to be queried.
+ * @param encoding the encoding to be queried, if empty then don't match encoding.
+ *
+ * @return the pointer of the default IMEngineFactory for this language.
+ */
+ IMEngineFactoryPointer get_default_factory (const String &language, const String &encoding) const;
+
+ /**
+ * @brief Set the default IMEngineFactory for a specific language.
+ *
+ * @param language the language to be set.
+ * @param uuid the uuid of the default IMEngineFactory for this language.
+ */
+ void set_default_factory (const String &language, const String &uuid);
+
+ /**
+ * @brief Get the next IMEngineFactory for a specific language and encoding.
+ *
+ * @param language the language to be queried, if empty then don't match language.
+ * @param encoding the encoding to be queried, if empty then don't match encoding.
+ * @param cur_uuid the UUID of current IMEngineFactory.
+ *
+ * @return the pointer of the next IMEngineFactory for this language and encoding
+ * corresponding to the current IMEngineFactory.
+ */
+ IMEngineFactoryPointer get_next_factory (const String &language, const String &encoding, const String &cur_uuid) const;
+
+ /**
+ * @brief Get the previous IMEngineFactory for a specific language and encoding.
+ *
+ * @param language the language to be queried, if empty then don't match language.
+ * @param encoding the encoding to be queried, if empty then don't match encoding.
+ * @param cur_uuid the UUID of current IMEngineFactory.
+ *
+ * @return the pointer of the previous IMEngineFactory for this language and encoding
+ * corresponding to the current IMEngineFactory.
+ */
+ IMEngineFactoryPointer get_previous_factory (const String &language, const String &encoding, const String &cur_uuid) const;
+
+ /**
+ * @}
+ */
+
+protected:
+
+ bool add_factory (const IMEngineFactoryPointer &factory);
+
+ void add_specific_factory (const String &uuid, const IMEngineFactoryPointer &factory);
+
+ void clear ();
+
+public:
+ void dump_factories ();
+};
+
+/**
+ * @typedef typedef Pointer <BackEnd> BackEndPointer;
+ *
+ * A smart pointer for scim::BackEndBase and its derived classes.
+ */
+typedef Pointer <BackEndBase> BackEndPointer;
+
+/**
+ * @brief The default implementation of scim::BackEndBase interface.
+ */
+class CommonBackEnd : public BackEndBase
+{
+ class CommonBackEndImpl;
+ CommonBackEndImpl *m_impl;
+
+public:
+ /**
+ * @brief Constructor
+ *
+ * @param config The pointer to the Config object.
+ * @param modules The list of the IMEngine modules to be loaded.
+ */
+ CommonBackEnd (const ConfigPointer &config,
+ const std::vector<String> &modules);
+ virtual ~CommonBackEnd ();
+
+ virtual void initialize (const ConfigPointer &config,
+ const std::vector<String> &modules,
+ const bool is_load_resource,
+ const bool is_load_info);
+
+ virtual int add_module (const ConfigPointer &config,
+ const String module,
+ bool is_load_resource);
+
+ virtual void add_module_info (const ConfigPointer &config,
+ const String module_name);
+
+ virtual void add_factory_by_uuid (const ConfigPointer &config,
+ const String uuid);
+
+ virtual void release_module (const std::vector<String> &use_uuids,
+ const String del_uuid);
+
+ void add_module_info_from_cache_file (const ConfigPointer &config,
+ std::vector<String> &modules);
+
+ void update_module_info (const ConfigPointer &config,
+ std::vector<String> ¤t_modules,
+ std::vector<String> &modules);
+
+ void add_imengine_module_info (const String module_name,
+ const ConfigPointer &config);
+
+};
+
+} /* namespace scim */
+
+#endif /*__SCIM_BACKEND_H */
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/**
+ * @file scim_bind.h
+ * @brief Binding adapters.
+ *
+ * A binding adaptor is an object that allows you to convert between slot types.
+ * Usually you wont use a BoundSlot directly but instead call the bind() factory
+ * function (similiar to the slot() factory function) which will create an
+ * appropriate bound slot for you, depending on the parameters passed.
+ *
+ * Most code of this file are came from Inti project.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ * Copyright (c) 2002 The Inti Development Team.
+ * Copyright (c) 2000 Red Hat, Inc.
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_bind.h,v 1.10 2005/01/10 08:30:52 suzhe Exp $
+ */
+
+
+#ifndef __SCIM_BOUND_SLOT_H
+#define __SCIM_BOUND_SLOT_H
+
+namespace scim {
+/**
+ * @addtogroup SignalSlot
+ * @ingroup InputServiceFramework
+ * The classes for signal/slot mechanism.
+ * @{
+ */
+
+//! @name Bind functions returning a new BoundSlot.
+//! @{
+
+//! @class BoundSlot0_1
+//! @brief Converts a slot taking one argument into a slot taking no arguments.
+
+template<typename R, typename P1>
+class BoundSlot0_1 : public Slot0<R>
+{
+ Pointer < Slot1<R, P1> > original_slot;
+ P1 p;
+
+public:
+ BoundSlot0_1(Slot1<R, P1> *slot, P1 p1) : original_slot(slot), p(p1) {}
+ //!< Constructor.
+ //!< @param slot - a pointer to a slot of type Slot1<R, P1>.
+ //!< @param p1 - a bound argument of type P1
+
+ virtual R call() const { return original_slot->call(p); }
+ //!< Calls the original slot passing it the bound argument p as the last parameter.
+};
+
+//! Overloaded bind() factory function.
+//! @param s - a slot of type Slot1<R, P1>.
+//! @param p1 - a value of type P1.
+//! @return a new slot that stores the value p1.
+//!
+//! <BR>When then returned slot is called it calls the original slot <EM>s</EM>, passing
+//! it the arguments passed to it and the value <EM>p1</EM>, as the last parameter. If
+//! the returned slot is connected to a signal it doesn't have to be unreferenced. The
+//! signal it's connected to will unreference the slot when it is destroyed. Otherwise
+//! the slot must be unreferenced by calling unref().
+
+template<typename R, typename P1>
+inline Slot0<R>*
+bind(Slot1<R, P1> *s, P1 p1)
+{
+ return new BoundSlot0_1<R, P1>(s, p1);
+}
+
+//! @class BoundSlot1_2
+//! @brief Converts a slot taking two arguments into a slot taking one argument.
+
+template<typename R, typename P1, typename P2>
+class BoundSlot1_2 : public Slot1<R, P1>
+{
+ Pointer < Slot2<R, P1, P2> > original_slot;
+ P2 p;
+
+public:
+ BoundSlot1_2(Slot2<R, P1, P2> *slot, P2 p2) : original_slot(slot), p(p2) {}
+ //!< Constructor.
+ //!< @param slot - a pointer to a slot of type Slot1<R, P1, P2>.
+ //!< @param p2 - a bound argument of type P2
+
+ virtual R call(P1 p1) const { return original_slot->call(p1, p); }
+ //!< Calls the original slot passing it argument p1 and the bound argument p as the last parameter.
+};
+
+//! Overloaded bind() factory function.
+//! @param s - a slot of type Slot1<R, P1, P2>.
+//! @param p2 - a value of type P2.
+//! @return a new slot that stores the value p2.
+//!
+//! <BR>When then returned slot is called it calls the original slot <EM>s</EM>, passing
+//! it the arguments passed to it and the value <EM>p2</EM>, as the last parameter. If
+//! the returned slot is connected to a signal it doesn't have to be unreferenced. The
+//! signal it's connected to will unreference the slot when it is destroyed. Otherwise
+//! the slot must be unreferenced by calling unref().
+
+template<typename R, typename P1, typename P2>
+inline Slot1<R, P1>*
+bind(Slot2<R, P1, P2> *s, P2 p2)
+{
+ return new BoundSlot1_2<R, P1, P2>(s, p2);
+}
+
+//! @class BoundSlot2_3
+//! @brief Converts a slot taking three arguments into a slot taking two arguments.
+
+template<typename R, typename P1, typename P2, typename P3>
+class BoundSlot2_3 : public Slot2<R, P1, P2>
+{
+ Pointer < Slot3<R, P1, P2, P3> > original_slot;
+ P3 p;
+
+public:
+ BoundSlot2_3(Slot3<R, P1, P2, P3> *slot, P3 p3) : original_slot(slot), p(p3) {}
+ //!< Constructor.
+ //!< @param slot - a pointer to a slot of type Slot1<R, P1, P2, P3>.
+ //!< @param p3 - a bound argument of type P3
+
+ virtual R call(P1 p1, P2 p2) const { return original_slot->call(p1, p2, p); }
+ //!< Calls the original slot passing it arguments p1 and p2, and the bound argument p as the last parameter.
+};
+
+//! Overloaded bind() factory function.
+//! @param s - a slot of type Slot1<R, P1, P2, P3>.
+//! @param p3 - a value of type P3.
+//! @return a new slot that stores the value p3.
+//!
+//! <BR>When then returned slot is called it calls the original slot <EM>s</EM>, passing
+//! it the arguments passed to it and the value <EM>p3</EM>, as the last parameter. If
+//! the returned slot is connected to a signal it doesn't have to be unreferenced. The
+//! signal it's connected to will unreference the slot when it is destroyed. Otherwise
+//! the slot must be unreferenced by calling unref().
+
+template<typename R, typename P1, typename P2, typename P3>
+inline Slot2<R, P1, P2>*
+bind(Slot3<R, P1, P2, P3> *s, P3 p3)
+{
+ return new BoundSlot2_3<R, P1, P2, P3>(s, p3);
+}
+
+//! @class BoundSlot3_4
+//! @brief Converts a slot taking four arguments into a slot taking three arguments.
+
+template<typename R, typename P1, typename P2, typename P3, typename P4>
+class BoundSlot3_4 : public Slot3<R, P1, P2, P3>
+{
+ Pointer < Slot4<R, P1, P2, P3, P4> > original_slot;
+ P4 p;
+
+public:
+ BoundSlot3_4(Slot4<R, P1, P2, P3, P4> *slot, P4 p4) : original_slot(slot), p(p4) {}
+ //!< Constructor.
+ //!< @param slot - a pointer to a slot of type Slot1<R, P1, P2, P3, P4>.
+ //!< @param p4 - a bound argument of type P4
+
+ virtual R call(P1 p1, P2 p2, P3 p3) const { return original_slot->call(p1, p2, p3, p); }
+ //!< Calls the original slot passing it arguments p1, p2 and p3, and the bound argument p as the last parameter.
+};
+
+//! Overloaded bind() factory function.
+//! @param s - a slot of type Slot1<R, P1, P2, P3, P4>.
+//! @param p4 - a value of type P4.
+//! @return a new slot that stores the value p4.
+//!
+//! <BR>When then returned slot is called it calls the original slot <EM>s</EM>, passing
+//! it the arguments passed to it and the value <EM>p4</EM>, as the last parameter. If
+//! the returned slot is connected to a signal it doesn't have to be unreferenced. The
+//! signal it's connected to will unreference the slot when it is destroyed. Otherwise
+//! the slot must be unreferenced by calling unref().
+
+template<typename R, typename P1, typename P2, typename P3, typename P4>
+inline Slot3<R, P1, P2, P3>*
+bind(Slot4<R, P1, P2, P3, P4> *s, P4 p4)
+{
+ return new BoundSlot3_4<R, P1, P2, P3, P4>(s, p4);
+}
+
+//! @class BoundSlot4_5
+//! @brief Converts a slot taking five arguments into a slot taking four arguments.
+
+template<typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
+class BoundSlot4_5 : public Slot4<R, P1, P2, P3, P4>
+{
+ Pointer < Slot5<R, P1, P2, P3, P4, P5> > original_slot;
+ P5 p;
+
+public:
+ BoundSlot4_5(Slot5<R, P1, P2, P3, P4, P5> *slot, P5 p5) : original_slot(slot), p(p5) {}
+ //!< Constructor.
+ //!< @param slot - a pointer to a slot of type Slot1<R, P1, P2, P3, P4, P5>.
+ //!< @param p5 - a bound argument of type P5
+
+ virtual R call(P1 p1, P2 p2, P3 p3, P4 p4) const { return original_slot->call(p1, p2, p3, p4, p); }
+ //!< Calls the original slot passing it arguments p1, p2, p3 and p4, and the bound argument p as the last parameter.
+};
+
+//! Overloaded bind() factory function.
+//! @param s - a slot of type Slot1<R, P1, P2, P3, P4, P5>.
+//! @param p5 - a value of type P5.
+//! @return a new slot that stores the value p5.
+//!
+//! <BR>When then returned slot is called it calls the original slot <EM>s</EM>, passing
+//! it the arguments passed to it and the value <EM>p5</EM>, as the last parameter. If
+//! the returned slot is connected to a signal it doesn't have to be unreferenced. The
+//! signal it's connected to will unreference the slot when it is destroyed. Otherwise
+//! the slot must be unreferenced by calling unref().
+
+template<typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
+inline Slot4<R, P1, P2, P3, P4>*
+bind(Slot5<R, P1, P2, P3, P4, P5> *s, P5 p5)
+{
+ return new BoundSlot4_5<R, P1, P2, P3, P4, P5>(s, p5);
+}
+
+//! @class BoundSlot5_6
+//! @brief Converts a slot taking six arguments into a slot taking five arguments.
+
+template<typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
+class BoundSlot5_6 : public Slot5<R, P1, P2, P3, P4, P5>
+{
+ Pointer < Slot6<R, P1, P2, P3, P4, P5, P6> > original_slot;
+ P6 p;
+
+public:
+ BoundSlot5_6(Slot6<R, P1, P2, P3, P4, P5, P6> *slot, P6 p6) : original_slot(slot), p(p6) {}
+ //!< Constructor.
+ //!< @param slot - a pointer to a slot of type Slot1<R, P1, P2, P3, P4, P5, P6>.
+ //!< @param p6 - a bound argument of type P6
+
+ virtual R call(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) const { return original_slot->call(p1, p2, p3, p4, p5, p); }
+ //!< Calls the original slot passing it arguments p1, p2, p3, p4 and p5, and the bound argument p as the last parameter.
+};
+
+//! Overloaded bind() factory function.
+//! @param s - a slot of type Slot1<R, P1, P2, P3, P4, P5, P6>.
+//! @param p6 - a value of type P6.
+//! @return a new slot that stores the value p6.
+//!
+//! <BR>When then returned slot is called it calls the original slot <EM>s</EM>, passing
+//! it the arguments passed to it and the value <EM>p6</EM>, as the last parameter. If
+//! the returned slot is connected to a signal it doesn't have to be unreferenced. The
+//! signal it's connected to will unreference the slot when it is destroyed. Otherwise
+//! the slot must be unreferenced by calling unref().
+
+template<typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
+inline Slot5<R, P1, P2, P3, P4, P5>*
+bind(Slot6<R, P1, P2, P3, P4, P5, P6> *s, P6 p6)
+{
+ return new BoundSlot5_6<R, P1, P2, P3, P4, P5, P6>(s, p6);
+}
+
+//! @}
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_BOUND_SLOT_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/** @file scim_chartraits.cpp
+ */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_chartraits.cpp,v 1.12 2005/07/05 16:18:17 suzhe Exp $
+ */
+
+#include <string>
+#include "scim_types.h"
+
+using namespace scim;
+
+#define GCC_VERSION (__GNUC__ * 10000 \
+ + __GNUC_MINOR__ * 100 \
+ + __GNUC_PATCHLEVEL__)
+
+#if !defined(__STDC_ISO_10646__) && GCC_VERSION >= 30200
+
+namespace std
+{
+
+template<>
+void
+char_traits<ucs4_t>::assign(char_type& __c1, const char_type& __c2)
+{
+ __c1 = __c2;
+}
+
+template<>
+bool
+char_traits<ucs4_t>::eq(const char_type& __c1, const char_type& __c2)
+{
+ return __c1 == __c2;
+}
+
+template<>
+bool
+char_traits<ucs4_t>::lt(const char_type& __c1, const char_type& __c2)
+{
+ return __c1 < __c2;
+}
+
+template<>
+char_traits<ucs4_t>::char_type*
+char_traits<ucs4_t>::assign(char_type* __s, size_t __n, char_type __a)
+{
+ char_type* dest = __s;
+ while (__n-- > 0)
+ *(dest++) = __a;
+ return __s;
+}
+
+template<>
+char_traits<ucs4_t>::char_type*
+char_traits<ucs4_t>::copy(char_type* __s1, const char_type* __s2, size_t __n)
+{
+ char_type* dest = __s1;
+ const char_type* from = __s2;
+ while (__n-- > 0)
+ *(dest++) = *(from++);
+ return __s1;
+}
+
+template<>
+char_traits<ucs4_t>::char_type*
+char_traits<ucs4_t>::move(char_type* __s1, const char_type* __s2, size_t __n)
+{
+ if (__s1 + __n > __s2) {
+ char_type* dest = __s1 + __n - 1;
+ const char_type* from = __s2;
+ while (__n-- > 0)
+ *(dest--) = *(from++);
+ return __s1;
+ } else {
+ return copy(__s1, __s2, __n);
+ }
+}
+
+template<>
+size_t
+char_traits<ucs4_t>::length(const char_type* __s)
+{
+ size_t __result = 0;
+ while ( *(__s++) != 0 )
+ __result++;
+ return __result;
+}
+
+template<>
+int
+char_traits<ucs4_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
+{
+ while ( (*__s1 == *__s2++) && __n-- > 0 )
+ if (*__s1++ == 0)
+ return (0);
+ if (__n <= 0) return (0);
+ return ( *__s1 - *(__s2 - 1) );
+}
+
+template<>
+const char_traits<ucs4_t>::char_type*
+char_traits<ucs4_t>::find(const char_type* __s, size_t __n, const char_type& __a)
+{
+ while (__n-- > 0) {
+ if (*__s == __a)
+ return __s;
+ ++__s;
+ }
+ return 0;
+}
+
+template<>
+char_traits<ucs4_t>::char_type
+char_traits<ucs4_t>::to_char_type (const int_type& __c)
+{
+ return static_cast<char_type>(__c);
+}
+
+template<>
+char_traits<ucs4_t>::int_type
+char_traits<ucs4_t>::to_int_type (const char_type& __c)
+{
+ return static_cast<int_type>(__c);
+}
+
+template<>
+bool
+char_traits<ucs4_t>::eq_int_type(const int_type& __c1, const int_type& __c2)
+{
+ return __c1 == __c2;
+}
+
+template<>
+char_traits<ucs4_t>::int_type
+char_traits<ucs4_t>::eof ()
+{
+ return static_cast<int_type>(EOF);
+}
+
+template<>
+char_traits<ucs4_t>::int_type
+char_traits<ucs4_t>::not_eof (const int_type& __c)
+{
+ return (__c == eof()) ? 0 : __c;
+}
+
+}
+#endif
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_compose_key.cpp
+ * @brief Implementation of class ComposeKeyFactory and ComposeKeyInstance.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_compose_key.cpp,v 1.7 2005/08/16 07:26:54 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_COMPOSE_KEY
+#define Uses_C_CTYPE
+
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+#define SCIM_MAX_COMPOSE_LEN 5
+
+struct ComposeSequence
+{
+ uint32 keys [SCIM_MAX_COMPOSE_LEN];
+ ucs4_t unicode;
+};
+
+class ComposeSequenceLessByKeys
+{
+public:
+ bool operator () (const ComposeSequence &lhs, const ComposeSequence &rhs) const {
+ for (size_t i = 0; i < SCIM_MAX_COMPOSE_LEN; ++i) {
+ if (lhs.keys [i] < rhs.keys [i]) return true;
+ else if (lhs.keys [i] > rhs.keys [i]) return false;
+ }
+ return false;
+ }
+
+ bool operator () (const ComposeSequence &lhs, const uint32 *rhs) const {
+ for (size_t i = 0; i < SCIM_MAX_COMPOSE_LEN; ++i) {
+ if (lhs.keys [i] < rhs [i]) return true;
+ else if (lhs.keys [i] > rhs [i]) return false;
+ }
+ return false;
+ }
+
+ bool operator () (const uint32 *lhs, const ComposeSequence &rhs) const {
+ for (size_t i = 0; i < SCIM_MAX_COMPOSE_LEN; ++i) {
+ if (lhs [i] < rhs.keys [i]) return true;
+ else if (lhs [i] > rhs.keys [i]) return false;
+ }
+ return false;
+ }
+
+ bool operator () (const uint32 *lhs, const uint32 *rhs) const {
+ for (size_t i = 0; i < SCIM_MAX_COMPOSE_LEN; ++i) {
+ if (lhs [i] < rhs [i]) return true;
+ else if (lhs [i] > rhs [i]) return false;
+ }
+ return false;
+ }
+
+};
+
+// Generated from /usr/X11R6/lib/X11/locale/en_US.UTF-8/Compose
+// Get rid off all keys with unicode value.
+// Merged with the table in gtk+2.x
+static const ComposeSequence __scim_compose_seqs[] = {
+#include "scim_compose_key_data.h"
+};
+
+#define SCIM_NUM_COMPOSE_SEQS (sizeof (__scim_compose_seqs) / sizeof (__scim_compose_seqs [0]))
+
+static uint16 __scim_compose_ignores [] = {
+ SCIM_KEY_Mode_switch,
+ SCIM_KEY_Shift_L,
+ SCIM_KEY_Shift_R,
+ SCIM_KEY_Control_L,
+ SCIM_KEY_Control_R,
+ SCIM_KEY_Caps_Lock,
+ SCIM_KEY_Shift_Lock,
+ SCIM_KEY_Meta_L,
+ SCIM_KEY_Meta_R,
+ SCIM_KEY_Alt_L,
+ SCIM_KEY_Alt_R,
+ SCIM_KEY_Super_L,
+ SCIM_KEY_Super_R,
+ SCIM_KEY_Hyper_L,
+ SCIM_KEY_Hyper_R
+};
+
+#define SCIM_NUM_COMPOSE_IGNORES (sizeof (__scim_compose_ignores) / sizeof (__scim_compose_ignores [0]))
+
+ComposeKeyFactory::ComposeKeyFactory ()
+{
+ set_locales ("C");
+}
+
+ComposeKeyFactory::~ComposeKeyFactory ()
+{
+}
+
+WideString
+ComposeKeyFactory::get_name () const
+{
+ return utf8_mbstowcs (_("English/Keyboard"));
+}
+
+WideString
+ComposeKeyFactory::get_authors () const
+{
+ return utf8_mbstowcs ("James Su <suzhe@tsinghua.org.cn>");
+}
+
+WideString
+ComposeKeyFactory::get_credits () const
+{
+ return WideString ();
+}
+
+WideString
+ComposeKeyFactory::get_help () const
+{
+ //return WideString ();
+ return utf8_mbstowcs (_("English input service"));
+}
+
+String
+ComposeKeyFactory::get_uuid () const
+{
+ return String (SCIM_COMPOSE_KEY_FACTORY_UUID);
+}
+
+String
+ComposeKeyFactory::get_icon_file () const
+{
+ return String (SCIM_KEYBOARD_ICON_FILE);
+}
+
+bool
+ComposeKeyFactory::validate_encoding (const String& encoding) const
+{
+ return true;
+}
+
+bool
+ComposeKeyFactory::validate_locale (const String& locale) const
+{
+ return true;
+}
+
+IMEngineInstancePointer
+ComposeKeyFactory::create_instance (const String& encoding, int id)
+{
+ return new ComposeKeyInstance (this, encoding, id);
+}
+
+ComposeKeyInstance::ComposeKeyInstance (ComposeKeyFactory *factory,
+ const String& encoding,
+ int id)
+ : IMEngineInstanceBase (factory, encoding, id)
+{
+ m_compose_buffer [0] = m_compose_buffer [1] = m_compose_buffer [2] = m_compose_buffer [3] = 0;
+ m_compose_buffer [4] = m_compose_buffer [5] = m_compose_buffer [6] = m_compose_buffer [7] = 0;
+}
+
+ComposeKeyInstance::~ComposeKeyInstance ()
+{
+}
+
+bool
+ComposeKeyInstance::process_key_event (const KeyEvent& key)
+{
+ if (key.is_key_release ()) return false;
+
+ // Ignore modifier key presses.
+ if (std::binary_search (__scim_compose_ignores, __scim_compose_ignores + SCIM_NUM_COMPOSE_IGNORES, (uint16) key.code))
+ return false;
+
+ // Ignore the key if ctrl or alt is down.
+ if (key.is_control_down () || key.is_alt_down ())
+ return false;
+
+ int n_compose = 0;
+
+ while (m_compose_buffer [n_compose] != 0 && n_compose < SCIM_MAX_COMPOSE_LEN)
+ ++ n_compose;
+
+ // The buffer is full, then reset the buffer first.
+ if (n_compose == SCIM_MAX_COMPOSE_LEN) {
+ reset ();
+ n_compose = 0;
+ }
+
+ m_compose_buffer [n_compose] = (uint32) key.code;
+
+ const ComposeSequence *it = std::lower_bound (__scim_compose_seqs,
+ __scim_compose_seqs + SCIM_NUM_COMPOSE_SEQS,
+ m_compose_buffer,
+ ComposeSequenceLessByKeys ());
+
+ // Not result found, reset the buffer and return false.
+ if (it == __scim_compose_seqs + SCIM_NUM_COMPOSE_SEQS) {
+ reset ();
+ return false;
+ }
+
+ // Check if the compose sequence is match.
+ for (n_compose = 0; n_compose < SCIM_MAX_COMPOSE_LEN; ++ n_compose) {
+ if (m_compose_buffer [n_compose] == 0)
+ break;
+
+ // Not match, reset the buffer and return.
+ // If it's the first key press, then return false to forward it.
+ // Otherwise return true to ignore it.
+ if (m_compose_buffer [n_compose] != it->keys [n_compose]) {
+ reset ();
+ return n_compose != 0;
+ }
+ }
+
+ // Match exactly, commit the result.
+ if (n_compose == SCIM_MAX_COMPOSE_LEN || it->keys [n_compose] == 0) {
+ WideString wstr;
+ wstr.push_back (it->unicode);
+ commit_string (wstr);
+ reset ();
+ }
+
+ return true;
+}
+
+void
+ComposeKeyInstance::move_preedit_caret (unsigned int /*pos*/)
+{
+}
+
+void
+ComposeKeyInstance::select_candidate (unsigned int /*item*/)
+{
+}
+
+void
+ComposeKeyInstance::update_lookup_table_page_size (unsigned int /*page_size*/)
+{
+}
+
+void
+ComposeKeyInstance::lookup_table_page_up ()
+{
+}
+
+void
+ComposeKeyInstance::lookup_table_page_down ()
+{
+}
+
+void
+ComposeKeyInstance::reset ()
+{
+ m_compose_buffer [0] = m_compose_buffer [1] = m_compose_buffer [2] = m_compose_buffer [3] = 0;
+ m_compose_buffer [4] = m_compose_buffer [5] = m_compose_buffer [6] = m_compose_buffer [7] = 0;
+}
+
+void
+ComposeKeyInstance::focus_in ()
+{
+ register_properties (PropertyList ());
+ reset ();
+}
+
+void
+ComposeKeyInstance::focus_out ()
+{
+}
+
+void
+ComposeKeyInstance::trigger_property (const String & /*property*/)
+{
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/**
+ * @file scim_compose_key.h
+ * @brief Defines scim::ComposeKeyFactory and scim::ComposeKeyInstance.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_compose_key.h,v 1.5 2005/08/16 07:26:54 suzhe Exp $
+ */
+
+#ifndef __SCIM_COMPOSE_KEY_H
+#define __SCIM_COMPOSE_KEY_H
+
+namespace scim {
+/**
+ * @addtogroup IMEngine
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+#define SCIM_COMPOSE_KEY_FACTORY_UUID "c6bebc27-6324-4b77-8ad4-6d41dcaf2e08"
+
+/**
+ * @brief A simple IMEngine to deal with the Compose keys.
+ */
+class ComposeKeyFactory : public IMEngineFactoryBase
+{
+public:
+ ComposeKeyFactory ();
+ virtual ~ComposeKeyFactory ();
+
+ virtual WideString get_name () const;
+ virtual String get_uuid () const;
+ virtual String get_icon_file () const;
+ virtual WideString get_authors () const;
+ virtual WideString get_credits () const;
+ virtual WideString get_help () const;
+
+ virtual bool validate_encoding (const String& encoding) const;
+ virtual bool validate_locale (const String& locale) const;
+
+ virtual IMEngineInstancePointer create_instance (const String& encoding, int id = -1);
+};
+
+class ComposeKeyInstance : public IMEngineInstanceBase
+{
+ uint32 m_compose_buffer [8];
+
+public:
+ ComposeKeyInstance (ComposeKeyFactory *factory,
+ const String &encoding,
+ int id = -1);
+
+ virtual ~ComposeKeyInstance ();
+
+ virtual bool process_key_event (const KeyEvent& key);
+ virtual void move_preedit_caret (unsigned int pos);
+ virtual void select_candidate (unsigned int index);
+ virtual void update_lookup_table_page_size (unsigned int page_size);
+ virtual void lookup_table_page_up ();
+ virtual void lookup_table_page_down ();
+ virtual void reset ();
+ virtual void focus_in ();
+ virtual void focus_out ();
+ virtual void trigger_property (const String& property);
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_COMPOSE_KEY_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_A, 0, 0, 0 }, 0x00C3},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_E, 0, 0, 0 }, 0x1EBC},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_I, 0, 0, 0 }, 0x0128},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_N, 0, 0, 0 }, 0x00D1},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_O, 0, 0, 0 }, 0x00D5},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_U, 0, 0, 0 }, 0x0168},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_V, 0, 0, 0 }, 0x1E7C},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Y, 0, 0, 0 }, 0x1EF8},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_a, 0, 0, 0 }, 0x00E3},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_e, 0, 0, 0 }, 0x1EBD},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_i, 0, 0, 0 }, 0x0129},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_n, 0, 0, 0 }, 0x00F1},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_o, 0, 0, 0 }, 0x00F5},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_u, 0, 0, 0 }, 0x0169},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_v, 0, 0, 0 }, 0x1E7D},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_y, 0, 0, 0 }, 0x1EF9},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Acircumflex, 0, 0, 0 }, 0x1EAA},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Ecircumflex, 0, 0, 0 }, 0x1EC4},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Ocircumflex, 0, 0, 0 }, 0x1ED6},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_acircumflex, 0, 0, 0 }, 0x1EAB},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_ecircumflex, 0, 0, 0 }, 0x1EC5},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_ocircumflex, 0, 0, 0 }, 0x1ED7},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Abreve, 0, 0, 0 }, 0x1EB4},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_abreve, 0, 0, 0 }, 0x1EB5},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Ohorn, 0, 0, 0 }, 0x1EE0},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_ohorn, 0, 0, 0 }, 0x1EE1},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Uhorn, 0, 0, 0 }, 0x1EEE},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_uhorn, 0, 0, 0 }, 0x1EEF},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_dead_circumflex, SCIM_KEY_A, 0, 0 }, 0x1EAA},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_dead_circumflex, SCIM_KEY_E, 0, 0 }, 0x1EC4},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_dead_circumflex, SCIM_KEY_O, 0, 0 }, 0x1ED6},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_dead_circumflex, SCIM_KEY_a, 0, 0 }, 0x1EAB},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_dead_circumflex, SCIM_KEY_e, 0, 0 }, 0x1EC5},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_dead_circumflex, SCIM_KEY_o, 0, 0 }, 0x1ED7},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_dead_breve, SCIM_KEY_A, 0, 0 }, 0x1EB4},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_dead_breve, SCIM_KEY_a, 0, 0 }, 0x1EB5},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_dead_horn, SCIM_KEY_O, 0, 0 }, 0x1EE0},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_dead_horn, SCIM_KEY_U, 0, 0 }, 0x1EEE},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_dead_horn, SCIM_KEY_o, 0, 0 }, 0x1EE1},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_dead_horn, SCIM_KEY_u, 0, 0 }, 0x1EEF},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_O, 0 }, 0x1EE0},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_U, 0 }, 0x1EEE},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_o, 0 }, 0x1EE1},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_u, 0 }, 0x1EEF},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_A, 0 }, 0x1EB4},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_a, 0 }, 0x1EB5},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_A, 0 }, 0x1EAA},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_E, 0 }, 0x1EC4},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_O, 0 }, 0x1ED6},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_a, 0 }, 0x1EAB},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_e, 0 }, 0x1EC5},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_o, 0 }, 0x1ED7},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_A, 0 }, 0x1EB4},
+ {{SCIM_KEY_combining_tilde, SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_a, 0 }, 0x1EB5},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_A, 0, 0, 0 }, 0x00C0},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_E, 0, 0, 0 }, 0x00C8},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_I, 0, 0, 0 }, 0x00CC},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_N, 0, 0, 0 }, 0x01F8},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_O, 0, 0, 0 }, 0x00D2},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_U, 0, 0, 0 }, 0x00D9},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_W, 0, 0, 0 }, 0x1E80},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Y, 0, 0, 0 }, 0x1EF2},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_a, 0, 0, 0 }, 0x00E0},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_e, 0, 0, 0 }, 0x00E8},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_i, 0, 0, 0 }, 0x00EC},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_n, 0, 0, 0 }, 0x01F9},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_o, 0, 0, 0 }, 0x00F2},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_u, 0, 0, 0 }, 0x00F9},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_w, 0, 0, 0 }, 0x1E81},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_y, 0, 0, 0 }, 0x1EF3},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Acircumflex, 0, 0, 0 }, 0x1EA6},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Ecircumflex, 0, 0, 0 }, 0x1EC0},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Ocircumflex, 0, 0, 0 }, 0x1ED2},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Udiaeresis, 0, 0, 0 }, 0x01DB},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_acircumflex, 0, 0, 0 }, 0x1EA7},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_ecircumflex, 0, 0, 0 }, 0x1EC1},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_ocircumflex, 0, 0, 0 }, 0x1ED3},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_udiaeresis, 0, 0, 0 }, 0x01DC},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Abreve, 0, 0, 0 }, 0x1EB0},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_abreve, 0, 0, 0 }, 0x1EB1},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Emacron, 0, 0, 0 }, 0x1E14},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_emacron, 0, 0, 0 }, 0x1E15},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Omacron, 0, 0, 0 }, 0x1E50},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_omacron, 0, 0, 0 }, 0x1E51},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Cyrillic_ie, 0, 0, 0 }, 0x0450},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Cyrillic_i, 0, 0, 0 }, 0x045D},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Cyrillic_IE, 0, 0, 0 }, 0x0400},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Cyrillic_I, 0, 0, 0 }, 0x040D},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Greek_iotadieresis, 0, 0, 0 }, 0x1FD2},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Greek_upsilondieresis, 0, 0, 0 }, 0x1FE2},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Greek_ALPHA, 0, 0, 0 }, 0x1FBA},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Greek_EPSILON, 0, 0, 0 }, 0x1FC8},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Greek_ETA, 0, 0, 0 }, 0x1FCA},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Greek_IOTA, 0, 0, 0 }, 0x1FDA},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Greek_OMICRON, 0, 0, 0 }, 0x1FF8},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Greek_UPSILON, 0, 0, 0 }, 0x1FEA},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Greek_OMEGA, 0, 0, 0 }, 0x1FFA},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Greek_alpha, 0, 0, 0 }, 0x1F70},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Greek_epsilon, 0, 0, 0 }, 0x1F72},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Greek_eta, 0, 0, 0 }, 0x1F74},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Greek_iota, 0, 0, 0 }, 0x1F76},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Greek_omicron, 0, 0, 0 }, 0x1F78},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Greek_upsilon, 0, 0, 0 }, 0x1F7A},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Greek_omega, 0, 0, 0 }, 0x1F7C},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Ohorn, 0, 0, 0 }, 0x1EDC},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_ohorn, 0, 0, 0 }, 0x1EDD},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Uhorn, 0, 0, 0 }, 0x1EEA},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_uhorn, 0, 0, 0 }, 0x1EEB},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_A, 0, 0 }, 0x1EA6},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_E, 0, 0 }, 0x1EC0},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_O, 0, 0 }, 0x1ED2},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_a, 0, 0 }, 0x1EA7},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_e, 0, 0 }, 0x1EC1},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_o, 0, 0 }, 0x1ED3},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_macron, SCIM_KEY_E, 0, 0 }, 0x1E14},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_macron, SCIM_KEY_O, 0, 0 }, 0x1E50},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_macron, SCIM_KEY_e, 0, 0 }, 0x1E15},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_macron, SCIM_KEY_o, 0, 0 }, 0x1E51},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_breve, SCIM_KEY_A, 0, 0 }, 0x1EB0},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_breve, SCIM_KEY_a, 0, 0 }, 0x1EB1},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_diaeresis, SCIM_KEY_U, 0, 0 }, 0x01DB},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_diaeresis, SCIM_KEY_u, 0, 0 }, 0x01DC},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_iota, 0, 0 }, 0x1FD2},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1FE2},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_horn, SCIM_KEY_O, 0, 0 }, 0x1EDC},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_horn, SCIM_KEY_U, 0, 0 }, 0x1EEA},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_horn, SCIM_KEY_o, 0, 0 }, 0x1EDD},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_dead_horn, SCIM_KEY_u, 0, 0 }, 0x1EEB},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_U, 0 }, 0x01DB},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_u, 0 }, 0x01DC},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Greek_iota, 0 }, 0x1FD2},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Greek_upsilon, 0 }, 0x1FE2},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0B},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1B},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA, 0 }, 0x1F2B},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3B},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4B},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_UPSILON, 0 }, 0x1F5B},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6B},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha, 0 }, 0x1F03},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_epsilon, 0 }, 0x1F13},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta, 0 }, 0x1F23},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_iota, 0 }, 0x1F33},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omicron, 0 }, 0x1F43},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_upsilon, 0 }, 0x1F53},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega, 0 }, 0x1F63},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0A},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1A},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA, 0 }, 0x1F2A},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3A},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4A},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6A},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha, 0 }, 0x1F02},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_epsilon, 0 }, 0x1F12},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_eta, 0 }, 0x1F22},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_iota, 0 }, 0x1F32},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omicron, 0 }, 0x1F42},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_upsilon, 0 }, 0x1F52},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omega, 0 }, 0x1F62},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_O, 0 }, 0x1EDC},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_U, 0 }, 0x1EEA},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_o, 0 }, 0x1EDD},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_u, 0 }, 0x1EEB},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_A, 0 }, 0x1EB0},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_a, 0 }, 0x1EB1},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_A, 0 }, 0x1EA6},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_E, 0 }, 0x1EC0},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_O, 0 }, 0x1ED2},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_a, 0 }, 0x1EA7},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_e, 0 }, 0x1EC1},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_o, 0 }, 0x1ED3},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_E, 0 }, 0x1E14},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_O, 0 }, 0x1E50},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_e, 0 }, 0x1E15},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_o, 0 }, 0x1E51},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_A, 0 }, 0x1EB0},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_a, 0 }, 0x1EB1},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_E, 0 }, 0x1E14},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_O, 0 }, 0x1E50},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_e, 0 }, 0x1E15},
+ {{SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_o, 0 }, 0x1E51},
+ {{SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1F0A},
+ {{SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_EPSILON, 0, 0 }, 0x1F1A},
+ {{SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1F2A},
+ {{SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1F3A},
+ {{SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_OMICRON, 0, 0 }, 0x1F4A},
+ {{SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1F6A},
+ {{SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1F02},
+ {{SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_epsilon, 0, 0 }, 0x1F12},
+ {{SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_eta, 0, 0 }, 0x1F22},
+ {{SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_iota, 0, 0 }, 0x1F32},
+ {{SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_omicron, 0, 0 }, 0x1F42},
+ {{SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1F52},
+ {{SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_omega, 0, 0 }, 0x1F62},
+ {{SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1F0B},
+ {{SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_EPSILON, 0, 0 }, 0x1F1B},
+ {{SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1F2B},
+ {{SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1F3B},
+ {{SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_OMICRON, 0, 0 }, 0x1F4B},
+ {{SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_UPSILON, 0, 0 }, 0x1F5B},
+ {{SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1F6B},
+ {{SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1F03},
+ {{SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_epsilon, 0, 0 }, 0x1F13},
+ {{SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_eta, 0, 0 }, 0x1F23},
+ {{SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_iota, 0, 0 }, 0x1F33},
+ {{SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_omicron, 0, 0 }, 0x1F43},
+ {{SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1F53},
+ {{SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_omega, 0, 0 }, 0x1F63},
+ {{SCIM_KEY_combining_grave, 0x1001f00, 0, 0, 0 }, 0x1F02},
+ {{SCIM_KEY_combining_grave, 0x1001f01, 0, 0, 0 }, 0x1F03},
+ {{SCIM_KEY_combining_grave, 0x1001f08, 0, 0, 0 }, 0x1F0A},
+ {{SCIM_KEY_combining_grave, 0x1001f09, 0, 0, 0 }, 0x1F0B},
+ {{SCIM_KEY_combining_grave, 0x1001f10, 0, 0, 0 }, 0x1F12},
+ {{SCIM_KEY_combining_grave, 0x1001f11, 0, 0, 0 }, 0x1F13},
+ {{SCIM_KEY_combining_grave, 0x1001f18, 0, 0, 0 }, 0x1F1A},
+ {{SCIM_KEY_combining_grave, 0x1001f19, 0, 0, 0 }, 0x1F1B},
+ {{SCIM_KEY_combining_grave, 0x1001f20, 0, 0, 0 }, 0x1F22},
+ {{SCIM_KEY_combining_grave, 0x1001f21, 0, 0, 0 }, 0x1F23},
+ {{SCIM_KEY_combining_grave, 0x1001f28, 0, 0, 0 }, 0x1F2A},
+ {{SCIM_KEY_combining_grave, 0x1001f29, 0, 0, 0 }, 0x1F2B},
+ {{SCIM_KEY_combining_grave, 0x1001f30, 0, 0, 0 }, 0x1F32},
+ {{SCIM_KEY_combining_grave, 0x1001f31, 0, 0, 0 }, 0x1F33},
+ {{SCIM_KEY_combining_grave, 0x1001f38, 0, 0, 0 }, 0x1F3A},
+ {{SCIM_KEY_combining_grave, 0x1001f39, 0, 0, 0 }, 0x1F3B},
+ {{SCIM_KEY_combining_grave, 0x1001f40, 0, 0, 0 }, 0x1F42},
+ {{SCIM_KEY_combining_grave, 0x1001f41, 0, 0, 0 }, 0x1F43},
+ {{SCIM_KEY_combining_grave, 0x1001f48, 0, 0, 0 }, 0x1F4A},
+ {{SCIM_KEY_combining_grave, 0x1001f49, 0, 0, 0 }, 0x1F4B},
+ {{SCIM_KEY_combining_grave, 0x1001f50, 0, 0, 0 }, 0x1F52},
+ {{SCIM_KEY_combining_grave, 0x1001f51, 0, 0, 0 }, 0x1F53},
+ {{SCIM_KEY_combining_grave, 0x1001f59, 0, 0, 0 }, 0x1F5B},
+ {{SCIM_KEY_combining_grave, 0x1001f60, 0, 0, 0 }, 0x1F62},
+ {{SCIM_KEY_combining_grave, 0x1001f61, 0, 0, 0 }, 0x1F63},
+ {{SCIM_KEY_combining_grave, 0x1001f68, 0, 0, 0 }, 0x1F6A},
+ {{SCIM_KEY_combining_grave, 0x1001f69, 0, 0, 0 }, 0x1F6B},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_A, 0, 0, 0 }, 0x00C1},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_C, 0, 0, 0 }, 0x0106},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_E, 0, 0, 0 }, 0x00C9},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_G, 0, 0, 0 }, 0x01F4},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_I, 0, 0, 0 }, 0x00CD},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_K, 0, 0, 0 }, 0x1E30},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_L, 0, 0, 0 }, 0x0139},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_M, 0, 0, 0 }, 0x1E3E},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_N, 0, 0, 0 }, 0x0143},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_O, 0, 0, 0 }, 0x00D3},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_P, 0, 0, 0 }, 0x1E54},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_R, 0, 0, 0 }, 0x0154},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_S, 0, 0, 0 }, 0x015A},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_U, 0, 0, 0 }, 0x00DA},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_W, 0, 0, 0 }, 0x1E82},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Y, 0, 0, 0 }, 0x00DD},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Z, 0, 0, 0 }, 0x0179},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_a, 0, 0, 0 }, 0x00E1},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_c, 0, 0, 0 }, 0x0107},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_e, 0, 0, 0 }, 0x00E9},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_g, 0, 0, 0 }, 0x01F5},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_i, 0, 0, 0 }, 0x00ED},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_k, 0, 0, 0 }, 0x1E31},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_l, 0, 0, 0 }, 0x013A},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_m, 0, 0, 0 }, 0x1E3F},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_n, 0, 0, 0 }, 0x0144},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_o, 0, 0, 0 }, 0x00F3},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_p, 0, 0, 0 }, 0x1E55},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_r, 0, 0, 0 }, 0x0155},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_s, 0, 0, 0 }, 0x015B},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_u, 0, 0, 0 }, 0x00FA},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_w, 0, 0, 0 }, 0x1E83},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_y, 0, 0, 0 }, 0x00FD},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_z, 0, 0, 0 }, 0x017A},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Acircumflex, 0, 0, 0 }, 0x1EA4},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Aring, 0, 0, 0 }, 0x01FA},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_AE, 0, 0, 0 }, 0x01FC},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Ccedilla, 0, 0, 0 }, 0x1E08},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Ecircumflex, 0, 0, 0 }, 0x1EBE},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Idiaeresis, 0, 0, 0 }, 0x1E2E},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Ocircumflex, 0, 0, 0 }, 0x1ED0},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Otilde, 0, 0, 0 }, 0x1E4C},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Ooblique, 0, 0, 0 }, 0x01FE},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Udiaeresis, 0, 0, 0 }, 0x01D7},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_acircumflex, 0, 0, 0 }, 0x1EA5},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_aring, 0, 0, 0 }, 0x01FB},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_ae, 0, 0, 0 }, 0x01FD},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_ccedilla, 0, 0, 0 }, 0x1E09},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_ecircumflex, 0, 0, 0 }, 0x1EBF},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_idiaeresis, 0, 0, 0 }, 0x1E2F},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_ocircumflex, 0, 0, 0 }, 0x1ED1},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_otilde, 0, 0, 0 }, 0x1E4D},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_oslash, 0, 0, 0 }, 0x01FF},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_udiaeresis, 0, 0, 0 }, 0x01D8},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Abreve, 0, 0, 0 }, 0x1EAE},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_abreve, 0, 0, 0 }, 0x1EAF},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Emacron, 0, 0, 0 }, 0x1E16},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_emacron, 0, 0, 0 }, 0x1E17},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Omacron, 0, 0, 0 }, 0x1E52},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Utilde, 0, 0, 0 }, 0x1E78},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_omacron, 0, 0, 0 }, 0x1E53},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_utilde, 0, 0, 0 }, 0x1E79},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Cyrillic_ghe, 0, 0, 0 }, 0x0453},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Cyrillic_ka, 0, 0, 0 }, 0x045C},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Cyrillic_GHE, 0, 0, 0 }, 0x0403},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Cyrillic_KA, 0, 0, 0 }, 0x040C},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Greek_iotadieresis, 0, 0, 0 }, 0x0390},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Greek_upsilondieresis, 0, 0, 0 }, 0x03B0},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Greek_ALPHA, 0, 0, 0 }, 0x0386},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Greek_EPSILON, 0, 0, 0 }, 0x0388},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Greek_ETA, 0, 0, 0 }, 0x0389},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Greek_IOTA, 0, 0, 0 }, 0x038A},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Greek_OMICRON, 0, 0, 0 }, 0x038C},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Greek_UPSILON, 0, 0, 0 }, 0x038E},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Greek_OMEGA, 0, 0, 0 }, 0x038F},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Greek_alpha, 0, 0, 0 }, 0x03AC},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Greek_epsilon, 0, 0, 0 }, 0x03AD},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Greek_eta, 0, 0, 0 }, 0x03AE},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Greek_iota, 0, 0, 0 }, 0x03AF},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Greek_omicron, 0, 0, 0 }, 0x03CC},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Greek_upsilon, 0, 0, 0 }, 0x03CD},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Greek_omega, 0, 0, 0 }, 0x03CE},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_combining_tilde, SCIM_KEY_O, 0, 0 }, 0x1E4C},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_combining_tilde, SCIM_KEY_U, 0, 0 }, 0x1E78},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_combining_tilde, SCIM_KEY_o, 0, 0 }, 0x1E4D},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_combining_tilde, SCIM_KEY_u, 0, 0 }, 0x1E79},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Ohorn, 0, 0, 0 }, 0x1EDA},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_ohorn, 0, 0, 0 }, 0x1EDB},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Uhorn, 0, 0, 0 }, 0x1EE8},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_uhorn, 0, 0, 0 }, 0x1EE9},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_A, 0, 0 }, 0x1EA4},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_E, 0, 0 }, 0x1EBE},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_O, 0, 0 }, 0x1ED0},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_a, 0, 0 }, 0x1EA5},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_e, 0, 0 }, 0x1EBF},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_o, 0, 0 }, 0x1ED1},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_tilde, SCIM_KEY_O, 0, 0 }, 0x1E4C},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_tilde, SCIM_KEY_U, 0, 0 }, 0x1E78},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_tilde, SCIM_KEY_o, 0, 0 }, 0x1E4D},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_tilde, SCIM_KEY_u, 0, 0 }, 0x1E79},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_macron, SCIM_KEY_E, 0, 0 }, 0x1E16},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_macron, SCIM_KEY_O, 0, 0 }, 0x1E52},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_macron, SCIM_KEY_e, 0, 0 }, 0x1E17},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_macron, SCIM_KEY_o, 0, 0 }, 0x1E53},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_breve, SCIM_KEY_A, 0, 0 }, 0x1EAE},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_breve, SCIM_KEY_a, 0, 0 }, 0x1EAF},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_I, 0, 0 }, 0x1E2E},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_U, 0, 0 }, 0x01D7},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_i, 0, 0 }, 0x1E2F},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_u, 0, 0 }, 0x01D8},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_iota, 0, 0 }, 0x0390},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x03B0},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_abovering, SCIM_KEY_A, 0, 0 }, 0x01FA},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_abovering, SCIM_KEY_a, 0, 0 }, 0x01FB},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_cedilla, SCIM_KEY_C, 0, 0 }, 0x1E08},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_cedilla, SCIM_KEY_c, 0, 0 }, 0x1E09},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_horn, SCIM_KEY_O, 0, 0 }, 0x1EDA},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_horn, SCIM_KEY_U, 0, 0 }, 0x1EE8},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_horn, SCIM_KEY_o, 0, 0 }, 0x1EDB},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_dead_horn, SCIM_KEY_u, 0, 0 }, 0x1EE9},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_I, 0 }, 0x1E2E},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_U, 0 }, 0x01D7},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_i, 0 }, 0x1E2F},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_u, 0 }, 0x01D8},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Greek_iota, 0 }, 0x0390},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Greek_upsilon, 0 }, 0x03B0},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0D},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1D},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA, 0 }, 0x1F2D},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3D},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4D},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_UPSILON, 0 }, 0x1F5D},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6D},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha, 0 }, 0x1F05},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_epsilon, 0 }, 0x1F15},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta, 0 }, 0x1F25},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_iota, 0 }, 0x1F35},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omicron, 0 }, 0x1F45},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_upsilon, 0 }, 0x1F55},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega, 0 }, 0x1F65},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0C},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1C},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA, 0 }, 0x1F2C},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3C},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4C},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6C},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha, 0 }, 0x1F04},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_epsilon, 0 }, 0x1F14},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_eta, 0 }, 0x1F24},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_iota, 0 }, 0x1F34},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omicron, 0 }, 0x1F44},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_upsilon, 0 }, 0x1F54},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omega, 0 }, 0x1F64},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_O, 0 }, 0x1EDA},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_U, 0 }, 0x1EE8},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_o, 0 }, 0x1EDB},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_u, 0 }, 0x1EE9},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_C, 0 }, 0x1E08},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_c, 0 }, 0x1E09},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_O, 0 }, 0x01FE},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_o, 0 }, 0x01FF},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_A, 0 }, 0x1EAE},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_a, 0 }, 0x1EAF},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_A, 0 }, 0x1EA4},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_E, 0 }, 0x1EBE},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_O, 0 }, 0x1ED0},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_a, 0 }, 0x1EA5},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_e, 0 }, 0x1EBF},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_o, 0 }, 0x1ED1},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_E, 0 }, 0x1E16},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_O, 0 }, 0x1E52},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_e, 0 }, 0x1E17},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_o, 0 }, 0x1E53},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_A, 0 }, 0x1EAE},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_a, 0 }, 0x1EAF},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_A, 0 }, 0x01FA},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_a, 0 }, 0x01FB},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_O, 0 }, 0x1E4C},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_U, 0 }, 0x1E78},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_o, 0 }, 0x1E4D},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_u, 0 }, 0x1E79},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_E, 0 }, 0x1E16},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_O, 0 }, 0x1E52},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_e, 0 }, 0x1E17},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_o, 0 }, 0x1E53},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_O, 0 }, 0x01FE},
+ {{SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_o, 0 }, 0x01FF},
+ {{SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1F0C},
+ {{SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_EPSILON, 0, 0 }, 0x1F1C},
+ {{SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1F2C},
+ {{SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1F3C},
+ {{SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_OMICRON, 0, 0 }, 0x1F4C},
+ {{SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1F6C},
+ {{SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1F04},
+ {{SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_epsilon, 0, 0 }, 0x1F14},
+ {{SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_eta, 0, 0 }, 0x1F24},
+ {{SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_iota, 0, 0 }, 0x1F34},
+ {{SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_omicron, 0, 0 }, 0x1F44},
+ {{SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1F54},
+ {{SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_omega, 0, 0 }, 0x1F64},
+ {{SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1F0D},
+ {{SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_EPSILON, 0, 0 }, 0x1F1D},
+ {{SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1F2D},
+ {{SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1F3D},
+ {{SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_OMICRON, 0, 0 }, 0x1F4D},
+ {{SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_UPSILON, 0, 0 }, 0x1F5D},
+ {{SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1F6D},
+ {{SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1F05},
+ {{SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_epsilon, 0, 0 }, 0x1F15},
+ {{SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_eta, 0, 0 }, 0x1F25},
+ {{SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_iota, 0, 0 }, 0x1F35},
+ {{SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_omicron, 0, 0 }, 0x1F45},
+ {{SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1F55},
+ {{SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_omega, 0, 0 }, 0x1F65},
+ {{SCIM_KEY_combining_acute, 0x1001f00, 0, 0, 0 }, 0x1F04},
+ {{SCIM_KEY_combining_acute, 0x1001f01, 0, 0, 0 }, 0x1F05},
+ {{SCIM_KEY_combining_acute, 0x1001f08, 0, 0, 0 }, 0x1F0C},
+ {{SCIM_KEY_combining_acute, 0x1001f09, 0, 0, 0 }, 0x1F0D},
+ {{SCIM_KEY_combining_acute, 0x1001f10, 0, 0, 0 }, 0x1F14},
+ {{SCIM_KEY_combining_acute, 0x1001f11, 0, 0, 0 }, 0x1F15},
+ {{SCIM_KEY_combining_acute, 0x1001f18, 0, 0, 0 }, 0x1F1C},
+ {{SCIM_KEY_combining_acute, 0x1001f19, 0, 0, 0 }, 0x1F1D},
+ {{SCIM_KEY_combining_acute, 0x1001f20, 0, 0, 0 }, 0x1F24},
+ {{SCIM_KEY_combining_acute, 0x1001f21, 0, 0, 0 }, 0x1F25},
+ {{SCIM_KEY_combining_acute, 0x1001f28, 0, 0, 0 }, 0x1F2C},
+ {{SCIM_KEY_combining_acute, 0x1001f29, 0, 0, 0 }, 0x1F2D},
+ {{SCIM_KEY_combining_acute, 0x1001f30, 0, 0, 0 }, 0x1F34},
+ {{SCIM_KEY_combining_acute, 0x1001f31, 0, 0, 0 }, 0x1F35},
+ {{SCIM_KEY_combining_acute, 0x1001f38, 0, 0, 0 }, 0x1F3C},
+ {{SCIM_KEY_combining_acute, 0x1001f39, 0, 0, 0 }, 0x1F3D},
+ {{SCIM_KEY_combining_acute, 0x1001f40, 0, 0, 0 }, 0x1F44},
+ {{SCIM_KEY_combining_acute, 0x1001f41, 0, 0, 0 }, 0x1F45},
+ {{SCIM_KEY_combining_acute, 0x1001f48, 0, 0, 0 }, 0x1F4C},
+ {{SCIM_KEY_combining_acute, 0x1001f49, 0, 0, 0 }, 0x1F4D},
+ {{SCIM_KEY_combining_acute, 0x1001f50, 0, 0, 0 }, 0x1F54},
+ {{SCIM_KEY_combining_acute, 0x1001f51, 0, 0, 0 }, 0x1F55},
+ {{SCIM_KEY_combining_acute, 0x1001f59, 0, 0, 0 }, 0x1F5D},
+ {{SCIM_KEY_combining_acute, 0x1001f60, 0, 0, 0 }, 0x1F64},
+ {{SCIM_KEY_combining_acute, 0x1001f61, 0, 0, 0 }, 0x1F65},
+ {{SCIM_KEY_combining_acute, 0x1001f68, 0, 0, 0 }, 0x1F6C},
+ {{SCIM_KEY_combining_acute, 0x1001f69, 0, 0, 0 }, 0x1F6D},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_A, 0, 0, 0 }, 0x1EA2},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_E, 0, 0, 0 }, 0x1EBA},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_I, 0, 0, 0 }, 0x1EC8},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_O, 0, 0, 0 }, 0x1ECE},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_U, 0, 0, 0 }, 0x1EE6},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Y, 0, 0, 0 }, 0x1EF6},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_a, 0, 0, 0 }, 0x1EA3},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_e, 0, 0, 0 }, 0x1EBB},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_i, 0, 0, 0 }, 0x1EC9},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_o, 0, 0, 0 }, 0x1ECF},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_u, 0, 0, 0 }, 0x1EE7},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_y, 0, 0, 0 }, 0x1EF7},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Acircumflex, 0, 0, 0 }, 0x1EA8},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Ecircumflex, 0, 0, 0 }, 0x1EC2},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Ocircumflex, 0, 0, 0 }, 0x1ED4},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_acircumflex, 0, 0, 0 }, 0x1EA9},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_ecircumflex, 0, 0, 0 }, 0x1EC3},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_ocircumflex, 0, 0, 0 }, 0x1ED5},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Abreve, 0, 0, 0 }, 0x1EB2},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_abreve, 0, 0, 0 }, 0x1EB3},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Ohorn, 0, 0, 0 }, 0x1EDE},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_ohorn, 0, 0, 0 }, 0x1EDF},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Uhorn, 0, 0, 0 }, 0x1EEC},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_uhorn, 0, 0, 0 }, 0x1EED},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_dead_circumflex, SCIM_KEY_A, 0, 0 }, 0x1EA8},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_dead_circumflex, SCIM_KEY_E, 0, 0 }, 0x1EC2},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_dead_circumflex, SCIM_KEY_O, 0, 0 }, 0x1ED4},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_dead_circumflex, SCIM_KEY_a, 0, 0 }, 0x1EA9},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_dead_circumflex, SCIM_KEY_e, 0, 0 }, 0x1EC3},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_dead_circumflex, SCIM_KEY_o, 0, 0 }, 0x1ED5},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_dead_breve, SCIM_KEY_A, 0, 0 }, 0x1EB2},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_dead_breve, SCIM_KEY_a, 0, 0 }, 0x1EB3},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_dead_horn, SCIM_KEY_O, 0, 0 }, 0x1EDE},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_dead_horn, SCIM_KEY_U, 0, 0 }, 0x1EEC},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_dead_horn, SCIM_KEY_o, 0, 0 }, 0x1EDF},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_dead_horn, SCIM_KEY_u, 0, 0 }, 0x1EED},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_O, 0 }, 0x1EDE},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_U, 0 }, 0x1EEC},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_o, 0 }, 0x1EDF},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_u, 0 }, 0x1EED},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_A, 0 }, 0x1EB2},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_a, 0 }, 0x1EB3},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_A, 0 }, 0x1EA8},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_E, 0 }, 0x1EC2},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_O, 0 }, 0x1ED4},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_a, 0 }, 0x1EA9},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_e, 0 }, 0x1EC3},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_o, 0 }, 0x1ED5},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_A, 0 }, 0x1EB2},
+ {{SCIM_KEY_combining_hook, SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_a, 0 }, 0x1EB3},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_A, 0, 0, 0 }, 0x1EA0},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_B, 0, 0, 0 }, 0x1E04},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_D, 0, 0, 0 }, 0x1E0C},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_E, 0, 0, 0 }, 0x1EB8},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_H, 0, 0, 0 }, 0x1E24},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_I, 0, 0, 0 }, 0x1ECA},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_K, 0, 0, 0 }, 0x1E32},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_L, 0, 0, 0 }, 0x1E36},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_M, 0, 0, 0 }, 0x1E42},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_N, 0, 0, 0 }, 0x1E46},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_O, 0, 0, 0 }, 0x1ECC},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_R, 0, 0, 0 }, 0x1E5A},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_S, 0, 0, 0 }, 0x1E62},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_T, 0, 0, 0 }, 0x1E6C},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_U, 0, 0, 0 }, 0x1EE4},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_V, 0, 0, 0 }, 0x1E7E},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_W, 0, 0, 0 }, 0x1E88},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_Y, 0, 0, 0 }, 0x1EF4},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_Z, 0, 0, 0 }, 0x1E92},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_a, 0, 0, 0 }, 0x1EA1},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_b, 0, 0, 0 }, 0x1E05},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_d, 0, 0, 0 }, 0x1E0D},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_e, 0, 0, 0 }, 0x1EB9},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_h, 0, 0, 0 }, 0x1E25},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_i, 0, 0, 0 }, 0x1ECB},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_k, 0, 0, 0 }, 0x1E33},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_l, 0, 0, 0 }, 0x1E37},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_m, 0, 0, 0 }, 0x1E43},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_n, 0, 0, 0 }, 0x1E47},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_o, 0, 0, 0 }, 0x1ECD},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_r, 0, 0, 0 }, 0x1E5B},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_s, 0, 0, 0 }, 0x1E63},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_t, 0, 0, 0 }, 0x1E6D},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_u, 0, 0, 0 }, 0x1EE5},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_v, 0, 0, 0 }, 0x1E7F},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_w, 0, 0, 0 }, 0x1E89},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_y, 0, 0, 0 }, 0x1EF5},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_z, 0, 0, 0 }, 0x1E93},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_Ohorn, 0, 0, 0 }, 0x1EE2},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_ohorn, 0, 0, 0 }, 0x1EE3},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_Uhorn, 0, 0, 0 }, 0x1EF0},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_uhorn, 0, 0, 0 }, 0x1EF1},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_dead_horn, SCIM_KEY_O, 0, 0 }, 0x1EE2},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_dead_horn, SCIM_KEY_U, 0, 0 }, 0x1EF0},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_dead_horn, SCIM_KEY_o, 0, 0 }, 0x1EE3},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_dead_horn, SCIM_KEY_u, 0, 0 }, 0x1EF1},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_O, 0 }, 0x1EE2},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_U, 0 }, 0x1EF0},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_o, 0 }, 0x1EE3},
+ {{SCIM_KEY_combining_belowdot, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_u, 0 }, 0x1EF1},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_space, 0, 0, 0 }, 0x0060},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_A, 0, 0, 0 }, 0x00C0},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_E, 0, 0, 0 }, 0x00C8},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_I, 0, 0, 0 }, 0x00CC},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_N, 0, 0, 0 }, 0x01F8},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_O, 0, 0, 0 }, 0x00D2},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_U, 0, 0, 0 }, 0x00D9},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_W, 0, 0, 0 }, 0x1E80},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Y, 0, 0, 0 }, 0x1EF2},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_grave, 0, 0, 0 }, 0x0060},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_a, 0, 0, 0 }, 0x00E0},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_e, 0, 0, 0 }, 0x00E8},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_i, 0, 0, 0 }, 0x00EC},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_n, 0, 0, 0 }, 0x01F9},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_o, 0, 0, 0 }, 0x00F2},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_u, 0, 0, 0 }, 0x00F9},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_w, 0, 0, 0 }, 0x1E81},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_y, 0, 0, 0 }, 0x1EF3},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Acircumflex, 0, 0, 0 }, 0x1EA6},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Ecircumflex, 0, 0, 0 }, 0x1EC0},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Ocircumflex, 0, 0, 0 }, 0x1ED2},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Udiaeresis, 0, 0, 0 }, 0x01DB},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_acircumflex, 0, 0, 0 }, 0x1EA7},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_ecircumflex, 0, 0, 0 }, 0x1EC1},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_ocircumflex, 0, 0, 0 }, 0x1ED3},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_udiaeresis, 0, 0, 0 }, 0x01DC},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Abreve, 0, 0, 0 }, 0x1EB0},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_abreve, 0, 0, 0 }, 0x1EB1},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Emacron, 0, 0, 0 }, 0x1E14},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_emacron, 0, 0, 0 }, 0x1E15},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Omacron, 0, 0, 0 }, 0x1E50},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_omacron, 0, 0, 0 }, 0x1E51},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Cyrillic_ie, 0, 0, 0 }, 0x0450},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Cyrillic_i, 0, 0, 0 }, 0x045D},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Cyrillic_IE, 0, 0, 0 }, 0x0400},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Cyrillic_I, 0, 0, 0 }, 0x040D},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Greek_iotadieresis, 0, 0, 0 }, 0x1FD2},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Greek_upsilondieresis, 0, 0, 0 }, 0x1FE2},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Greek_ALPHA, 0, 0, 0 }, 0x1FBA},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Greek_EPSILON, 0, 0, 0 }, 0x1FC8},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Greek_ETA, 0, 0, 0 }, 0x1FCA},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Greek_IOTA, 0, 0, 0 }, 0x1FDA},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Greek_OMICRON, 0, 0, 0 }, 0x1FF8},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Greek_UPSILON, 0, 0, 0 }, 0x1FEA},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Greek_OMEGA, 0, 0, 0 }, 0x1FFA},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Greek_alpha, 0, 0, 0 }, 0x1F70},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Greek_epsilon, 0, 0, 0 }, 0x1F72},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Greek_eta, 0, 0, 0 }, 0x1F74},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Greek_iota, 0, 0, 0 }, 0x1F76},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Greek_omicron, 0, 0, 0 }, 0x1F78},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Greek_upsilon, 0, 0, 0 }, 0x1F7A},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Greek_omega, 0, 0, 0 }, 0x1F7C},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Ohorn, 0, 0, 0 }, 0x1EDC},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_ohorn, 0, 0, 0 }, 0x1EDD},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Uhorn, 0, 0, 0 }, 0x1EEA},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_uhorn, 0, 0, 0 }, 0x1EEB},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_grave, 0, 0, 0 }, 0x0060},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_A, 0, 0 }, 0x1EA6},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_E, 0, 0 }, 0x1EC0},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_O, 0, 0 }, 0x1ED2},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_a, 0, 0 }, 0x1EA7},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_e, 0, 0 }, 0x1EC1},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_o, 0, 0 }, 0x1ED3},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_macron, SCIM_KEY_E, 0, 0 }, 0x1E14},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_macron, SCIM_KEY_O, 0, 0 }, 0x1E50},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_macron, SCIM_KEY_e, 0, 0 }, 0x1E15},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_macron, SCIM_KEY_o, 0, 0 }, 0x1E51},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_breve, SCIM_KEY_A, 0, 0 }, 0x1EB0},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_breve, SCIM_KEY_a, 0, 0 }, 0x1EB1},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_diaeresis, SCIM_KEY_U, 0, 0 }, 0x01DB},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_diaeresis, SCIM_KEY_u, 0, 0 }, 0x01DC},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_iota, 0, 0 }, 0x1FD2},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1FE2},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_horn, SCIM_KEY_O, 0, 0 }, 0x1EDC},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_horn, SCIM_KEY_U, 0, 0 }, 0x1EEA},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_horn, SCIM_KEY_o, 0, 0 }, 0x1EDD},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_dead_horn, SCIM_KEY_u, 0, 0 }, 0x1EEB},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_U, 0 }, 0x01DB},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_u, 0 }, 0x01DC},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Greek_iota, 0 }, 0x1FD2},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Greek_upsilon, 0 }, 0x1FE2},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0B},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1B},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA, 0 }, 0x1F2B},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3B},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4B},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_UPSILON, 0 }, 0x1F5B},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6B},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha, 0 }, 0x1F03},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_epsilon, 0 }, 0x1F13},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta, 0 }, 0x1F23},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_iota, 0 }, 0x1F33},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omicron, 0 }, 0x1F43},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_upsilon, 0 }, 0x1F53},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega, 0 }, 0x1F63},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0A},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1A},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA, 0 }, 0x1F2A},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3A},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4A},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6A},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha, 0 }, 0x1F02},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_epsilon, 0 }, 0x1F12},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_eta, 0 }, 0x1F22},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_iota, 0 }, 0x1F32},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omicron, 0 }, 0x1F42},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_upsilon, 0 }, 0x1F52},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omega, 0 }, 0x1F62},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_O, 0 }, 0x1EDC},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_U, 0 }, 0x1EEA},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_o, 0 }, 0x1EDD},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_u, 0 }, 0x1EEB},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_A, 0 }, 0x1EB0},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_a, 0 }, 0x1EB1},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_A, 0 }, 0x1EA6},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_E, 0 }, 0x1EC0},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_O, 0 }, 0x1ED2},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_a, 0 }, 0x1EA7},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_e, 0 }, 0x1EC1},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_o, 0 }, 0x1ED3},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_E, 0 }, 0x1E14},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_O, 0 }, 0x1E50},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_e, 0 }, 0x1E15},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_o, 0 }, 0x1E51},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_A, 0 }, 0x1EB0},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_a, 0 }, 0x1EB1},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_E, 0 }, 0x1E14},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_O, 0 }, 0x1E50},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_e, 0 }, 0x1E15},
+ {{SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_o, 0 }, 0x1E51},
+ {{SCIM_KEY_dead_grave, 0x10001a0, 0, 0, 0 }, 0x1EDC},
+ {{SCIM_KEY_dead_grave, 0x10001a1, 0, 0, 0 }, 0x1EDD},
+ {{SCIM_KEY_dead_grave, 0x10001af, 0, 0, 0 }, 0x1EEA},
+ {{SCIM_KEY_dead_grave, 0x10001b0, 0, 0, 0 }, 0x1EEB},
+ {{SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1F0A},
+ {{SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_EPSILON, 0, 0 }, 0x1F1A},
+ {{SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1F2A},
+ {{SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1F3A},
+ {{SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_OMICRON, 0, 0 }, 0x1F4A},
+ {{SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1F6A},
+ {{SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1F02},
+ {{SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_epsilon, 0, 0 }, 0x1F12},
+ {{SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_eta, 0, 0 }, 0x1F22},
+ {{SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_iota, 0, 0 }, 0x1F32},
+ {{SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_omicron, 0, 0 }, 0x1F42},
+ {{SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1F52},
+ {{SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_omega, 0, 0 }, 0x1F62},
+ {{SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1F0B},
+ {{SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_EPSILON, 0, 0 }, 0x1F1B},
+ {{SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1F2B},
+ {{SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1F3B},
+ {{SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_OMICRON, 0, 0 }, 0x1F4B},
+ {{SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_UPSILON, 0, 0 }, 0x1F5B},
+ {{SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1F6B},
+ {{SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1F03},
+ {{SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_epsilon, 0, 0 }, 0x1F13},
+ {{SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_eta, 0, 0 }, 0x1F23},
+ {{SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_iota, 0, 0 }, 0x1F33},
+ {{SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_omicron, 0, 0 }, 0x1F43},
+ {{SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1F53},
+ {{SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_omega, 0, 0 }, 0x1F63},
+ {{SCIM_KEY_dead_grave, 0x1001f00, 0, 0, 0 }, 0x1F02},
+ {{SCIM_KEY_dead_grave, 0x1001f01, 0, 0, 0 }, 0x1F03},
+ {{SCIM_KEY_dead_grave, 0x1001f08, 0, 0, 0 }, 0x1F0A},
+ {{SCIM_KEY_dead_grave, 0x1001f09, 0, 0, 0 }, 0x1F0B},
+ {{SCIM_KEY_dead_grave, 0x1001f10, 0, 0, 0 }, 0x1F12},
+ {{SCIM_KEY_dead_grave, 0x1001f11, 0, 0, 0 }, 0x1F13},
+ {{SCIM_KEY_dead_grave, 0x1001f18, 0, 0, 0 }, 0x1F1A},
+ {{SCIM_KEY_dead_grave, 0x1001f19, 0, 0, 0 }, 0x1F1B},
+ {{SCIM_KEY_dead_grave, 0x1001f20, 0, 0, 0 }, 0x1F22},
+ {{SCIM_KEY_dead_grave, 0x1001f21, 0, 0, 0 }, 0x1F23},
+ {{SCIM_KEY_dead_grave, 0x1001f28, 0, 0, 0 }, 0x1F2A},
+ {{SCIM_KEY_dead_grave, 0x1001f29, 0, 0, 0 }, 0x1F2B},
+ {{SCIM_KEY_dead_grave, 0x1001f30, 0, 0, 0 }, 0x1F32},
+ {{SCIM_KEY_dead_grave, 0x1001f31, 0, 0, 0 }, 0x1F33},
+ {{SCIM_KEY_dead_grave, 0x1001f38, 0, 0, 0 }, 0x1F3A},
+ {{SCIM_KEY_dead_grave, 0x1001f39, 0, 0, 0 }, 0x1F3B},
+ {{SCIM_KEY_dead_grave, 0x1001f40, 0, 0, 0 }, 0x1F42},
+ {{SCIM_KEY_dead_grave, 0x1001f41, 0, 0, 0 }, 0x1F43},
+ {{SCIM_KEY_dead_grave, 0x1001f48, 0, 0, 0 }, 0x1F4A},
+ {{SCIM_KEY_dead_grave, 0x1001f49, 0, 0, 0 }, 0x1F4B},
+ {{SCIM_KEY_dead_grave, 0x1001f50, 0, 0, 0 }, 0x1F52},
+ {{SCIM_KEY_dead_grave, 0x1001f51, 0, 0, 0 }, 0x1F53},
+ {{SCIM_KEY_dead_grave, 0x1001f59, 0, 0, 0 }, 0x1F5B},
+ {{SCIM_KEY_dead_grave, 0x1001f60, 0, 0, 0 }, 0x1F62},
+ {{SCIM_KEY_dead_grave, 0x1001f61, 0, 0, 0 }, 0x1F63},
+ {{SCIM_KEY_dead_grave, 0x1001f68, 0, 0, 0 }, 0x1F6A},
+ {{SCIM_KEY_dead_grave, 0x1001f69, 0, 0, 0 }, 0x1F6B},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_space, 0, 0, 0 }, 0x0027},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_apostrophe, 0, 0, 0 }, 0x00B4},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_A, 0, 0, 0 }, 0x00C1},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_C, 0, 0, 0 }, 0x0106},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_E, 0, 0, 0 }, 0x00C9},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_G, 0, 0, 0 }, 0x01F4},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_I, 0, 0, 0 }, 0x00CD},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_K, 0, 0, 0 }, 0x1E30},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_L, 0, 0, 0 }, 0x0139},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_M, 0, 0, 0 }, 0x1E3E},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_N, 0, 0, 0 }, 0x0143},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_O, 0, 0, 0 }, 0x00D3},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_P, 0, 0, 0 }, 0x1E54},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_R, 0, 0, 0 }, 0x0154},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_S, 0, 0, 0 }, 0x015A},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_U, 0, 0, 0 }, 0x00DA},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_W, 0, 0, 0 }, 0x1E82},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Y, 0, 0, 0 }, 0x00DD},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Z, 0, 0, 0 }, 0x0179},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_a, 0, 0, 0 }, 0x00E1},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_c, 0, 0, 0 }, 0x0107},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_e, 0, 0, 0 }, 0x00E9},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_g, 0, 0, 0 }, 0x01F5},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_i, 0, 0, 0 }, 0x00ED},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_k, 0, 0, 0 }, 0x1E31},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_l, 0, 0, 0 }, 0x013A},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_m, 0, 0, 0 }, 0x1E3F},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_n, 0, 0, 0 }, 0x0144},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_o, 0, 0, 0 }, 0x00F3},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_p, 0, 0, 0 }, 0x1E55},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_r, 0, 0, 0 }, 0x0155},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_s, 0, 0, 0 }, 0x015B},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_u, 0, 0, 0 }, 0x00FA},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_w, 0, 0, 0 }, 0x1E83},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_y, 0, 0, 0 }, 0x00FD},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_z, 0, 0, 0 }, 0x017A},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_acute, 0, 0, 0 }, 0x00B4},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Acircumflex, 0, 0, 0 }, 0x1EA4},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Aring, 0, 0, 0 }, 0x01FA},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_AE, 0, 0, 0 }, 0x01FC},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Ccedilla, 0, 0, 0 }, 0x1E08},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Ecircumflex, 0, 0, 0 }, 0x1EBE},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Idiaeresis, 0, 0, 0 }, 0x1E2E},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Ocircumflex, 0, 0, 0 }, 0x1ED0},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Otilde, 0, 0, 0 }, 0x1E4C},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Ooblique, 0, 0, 0 }, 0x01FE},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Udiaeresis, 0, 0, 0 }, 0x01D7},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_acircumflex, 0, 0, 0 }, 0x1EA5},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_aring, 0, 0, 0 }, 0x01FB},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_ae, 0, 0, 0 }, 0x01FD},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_ccedilla, 0, 0, 0 }, 0x1E09},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_ecircumflex, 0, 0, 0 }, 0x1EBF},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_idiaeresis, 0, 0, 0 }, 0x1E2F},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_ocircumflex, 0, 0, 0 }, 0x1ED1},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_otilde, 0, 0, 0 }, 0x1E4D},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_oslash, 0, 0, 0 }, 0x01FF},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_udiaeresis, 0, 0, 0 }, 0x01D8},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Abreve, 0, 0, 0 }, 0x1EAE},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_abreve, 0, 0, 0 }, 0x1EAF},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Emacron, 0, 0, 0 }, 0x1E16},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_emacron, 0, 0, 0 }, 0x1E17},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Omacron, 0, 0, 0 }, 0x1E52},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Utilde, 0, 0, 0 }, 0x1E78},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_omacron, 0, 0, 0 }, 0x1E53},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_utilde, 0, 0, 0 }, 0x1E79},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Cyrillic_ghe, 0, 0, 0 }, 0x0453},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Cyrillic_ka, 0, 0, 0 }, 0x045C},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Cyrillic_GHE, 0, 0, 0 }, 0x0403},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Cyrillic_KA, 0, 0, 0 }, 0x040C},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Greek_iotadieresis, 0, 0, 0 }, 0x0390},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Greek_upsilondieresis, 0, 0, 0 }, 0x03B0},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Greek_ALPHA, 0, 0, 0 }, 0x0386},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Greek_EPSILON, 0, 0, 0 }, 0x0388},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Greek_ETA, 0, 0, 0 }, 0x0389},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Greek_IOTA, 0, 0, 0 }, 0x038A},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Greek_OMICRON, 0, 0, 0 }, 0x038C},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Greek_UPSILON, 0, 0, 0 }, 0x038E},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Greek_OMEGA, 0, 0, 0 }, 0x038F},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Greek_alpha, 0, 0, 0 }, 0x03AC},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Greek_epsilon, 0, 0, 0 }, 0x03AD},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Greek_eta, 0, 0, 0 }, 0x03AE},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Greek_iota, 0, 0, 0 }, 0x03AF},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Greek_omicron, 0, 0, 0 }, 0x03CC},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Greek_upsilon, 0, 0, 0 }, 0x03CD},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Greek_omega, 0, 0, 0 }, 0x03CE},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_combining_tilde, SCIM_KEY_O, 0, 0 }, 0x1E4C},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_combining_tilde, SCIM_KEY_U, 0, 0 }, 0x1E78},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_combining_tilde, SCIM_KEY_o, 0, 0 }, 0x1E4D},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_combining_tilde, SCIM_KEY_u, 0, 0 }, 0x1E79},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Ohorn, 0, 0, 0 }, 0x1EDA},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_ohorn, 0, 0, 0 }, 0x1EDB},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Uhorn, 0, 0, 0 }, 0x1EE8},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_uhorn, 0, 0, 0 }, 0x1EE9},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_acute, 0, 0, 0 }, 0x00B4},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_A, 0, 0 }, 0x1EA4},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_E, 0, 0 }, 0x1EBE},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_O, 0, 0 }, 0x1ED0},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_a, 0, 0 }, 0x1EA5},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_e, 0, 0 }, 0x1EBF},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_o, 0, 0 }, 0x1ED1},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_tilde, SCIM_KEY_O, 0, 0 }, 0x1E4C},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_tilde, SCIM_KEY_U, 0, 0 }, 0x1E78},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_tilde, SCIM_KEY_o, 0, 0 }, 0x1E4D},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_tilde, SCIM_KEY_u, 0, 0 }, 0x1E79},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_macron, SCIM_KEY_E, 0, 0 }, 0x1E16},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_macron, SCIM_KEY_O, 0, 0 }, 0x1E52},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_macron, SCIM_KEY_e, 0, 0 }, 0x1E17},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_macron, SCIM_KEY_o, 0, 0 }, 0x1E53},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_breve, SCIM_KEY_A, 0, 0 }, 0x1EAE},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_breve, SCIM_KEY_a, 0, 0 }, 0x1EAF},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_space, 0, 0 }, 0x0385},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_I, 0, 0 }, 0x1E2E},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_U, 0, 0 }, 0x01D7},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_i, 0, 0 }, 0x1E2F},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_u, 0, 0 }, 0x01D8},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_iota, 0, 0 }, 0x0390},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x03B0},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_abovering, SCIM_KEY_A, 0, 0 }, 0x01FA},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_abovering, SCIM_KEY_a, 0, 0 }, 0x01FB},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_cedilla, SCIM_KEY_C, 0, 0 }, 0x1E08},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_cedilla, SCIM_KEY_c, 0, 0 }, 0x1E09},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_horn, SCIM_KEY_O, 0, 0 }, 0x1EDA},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_horn, SCIM_KEY_U, 0, 0 }, 0x1EE8},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_horn, SCIM_KEY_o, 0, 0 }, 0x1EDB},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_dead_horn, SCIM_KEY_u, 0, 0 }, 0x1EE9},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_I, 0 }, 0x1E2E},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_U, 0 }, 0x01D7},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_i, 0 }, 0x1E2F},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_u, 0 }, 0x01D8},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Greek_iota, 0 }, 0x0390},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Greek_upsilon, 0 }, 0x03B0},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0D},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1D},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA, 0 }, 0x1F2D},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3D},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4D},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_UPSILON, 0 }, 0x1F5D},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6D},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha, 0 }, 0x1F05},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_epsilon, 0 }, 0x1F15},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta, 0 }, 0x1F25},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_iota, 0 }, 0x1F35},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omicron, 0 }, 0x1F45},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_upsilon, 0 }, 0x1F55},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega, 0 }, 0x1F65},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0C},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1C},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA, 0 }, 0x1F2C},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3C},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4C},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6C},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha, 0 }, 0x1F04},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_epsilon, 0 }, 0x1F14},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_eta, 0 }, 0x1F24},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_iota, 0 }, 0x1F34},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omicron, 0 }, 0x1F44},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_upsilon, 0 }, 0x1F54},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omega, 0 }, 0x1F64},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_O, 0 }, 0x1EDA},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_U, 0 }, 0x1EE8},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_o, 0 }, 0x1EDB},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_u, 0 }, 0x1EE9},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_C, 0 }, 0x1E08},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_c, 0 }, 0x1E09},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_O, 0 }, 0x01FE},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_o, 0 }, 0x01FF},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_A, 0 }, 0x1EAE},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_a, 0 }, 0x1EAF},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_A, 0 }, 0x1EA4},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_E, 0 }, 0x1EBE},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_O, 0 }, 0x1ED0},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_a, 0 }, 0x1EA5},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_e, 0 }, 0x1EBF},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_o, 0 }, 0x1ED1},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_E, 0 }, 0x1E16},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_O, 0 }, 0x1E52},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_e, 0 }, 0x1E17},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_o, 0 }, 0x1E53},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_A, 0 }, 0x1EAE},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_a, 0 }, 0x1EAF},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_A, 0 }, 0x01FA},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_a, 0 }, 0x01FB},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_O, 0 }, 0x1E4C},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_U, 0 }, 0x1E78},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_o, 0 }, 0x1E4D},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_u, 0 }, 0x1E79},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_E, 0 }, 0x1E16},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_O, 0 }, 0x1E52},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_e, 0 }, 0x1E17},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_o, 0 }, 0x1E53},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_O, 0 }, 0x01FE},
+ {{SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_o, 0 }, 0x01FF},
+ {{SCIM_KEY_dead_acute, 0x10001a0, 0, 0, 0 }, 0x1EDA},
+ {{SCIM_KEY_dead_acute, 0x10001a1, 0, 0, 0 }, 0x1EDB},
+ {{SCIM_KEY_dead_acute, 0x10001af, 0, 0, 0 }, 0x1EE8},
+ {{SCIM_KEY_dead_acute, 0x10001b0, 0, 0, 0 }, 0x1EE9},
+ {{SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1F0C},
+ {{SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_EPSILON, 0, 0 }, 0x1F1C},
+ {{SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1F2C},
+ {{SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1F3C},
+ {{SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_OMICRON, 0, 0 }, 0x1F4C},
+ {{SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1F6C},
+ {{SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1F04},
+ {{SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_epsilon, 0, 0 }, 0x1F14},
+ {{SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_eta, 0, 0 }, 0x1F24},
+ {{SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_iota, 0, 0 }, 0x1F34},
+ {{SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_omicron, 0, 0 }, 0x1F44},
+ {{SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1F54},
+ {{SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_omega, 0, 0 }, 0x1F64},
+ {{SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1F0D},
+ {{SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_EPSILON, 0, 0 }, 0x1F1D},
+ {{SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1F2D},
+ {{SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1F3D},
+ {{SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_OMICRON, 0, 0 }, 0x1F4D},
+ {{SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_UPSILON, 0, 0 }, 0x1F5D},
+ {{SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1F6D},
+ {{SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1F05},
+ {{SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_epsilon, 0, 0 }, 0x1F15},
+ {{SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_eta, 0, 0 }, 0x1F25},
+ {{SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_iota, 0, 0 }, 0x1F35},
+ {{SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_omicron, 0, 0 }, 0x1F45},
+ {{SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1F55},
+ {{SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_omega, 0, 0 }, 0x1F65},
+ {{SCIM_KEY_dead_acute, 0x1001f00, 0, 0, 0 }, 0x1F04},
+ {{SCIM_KEY_dead_acute, 0x1001f01, 0, 0, 0 }, 0x1F05},
+ {{SCIM_KEY_dead_acute, 0x1001f08, 0, 0, 0 }, 0x1F0C},
+ {{SCIM_KEY_dead_acute, 0x1001f09, 0, 0, 0 }, 0x1F0D},
+ {{SCIM_KEY_dead_acute, 0x1001f10, 0, 0, 0 }, 0x1F14},
+ {{SCIM_KEY_dead_acute, 0x1001f11, 0, 0, 0 }, 0x1F15},
+ {{SCIM_KEY_dead_acute, 0x1001f18, 0, 0, 0 }, 0x1F1C},
+ {{SCIM_KEY_dead_acute, 0x1001f19, 0, 0, 0 }, 0x1F1D},
+ {{SCIM_KEY_dead_acute, 0x1001f20, 0, 0, 0 }, 0x1F24},
+ {{SCIM_KEY_dead_acute, 0x1001f21, 0, 0, 0 }, 0x1F25},
+ {{SCIM_KEY_dead_acute, 0x1001f28, 0, 0, 0 }, 0x1F2C},
+ {{SCIM_KEY_dead_acute, 0x1001f29, 0, 0, 0 }, 0x1F2D},
+ {{SCIM_KEY_dead_acute, 0x1001f30, 0, 0, 0 }, 0x1F34},
+ {{SCIM_KEY_dead_acute, 0x1001f31, 0, 0, 0 }, 0x1F35},
+ {{SCIM_KEY_dead_acute, 0x1001f38, 0, 0, 0 }, 0x1F3C},
+ {{SCIM_KEY_dead_acute, 0x1001f39, 0, 0, 0 }, 0x1F3D},
+ {{SCIM_KEY_dead_acute, 0x1001f40, 0, 0, 0 }, 0x1F44},
+ {{SCIM_KEY_dead_acute, 0x1001f41, 0, 0, 0 }, 0x1F45},
+ {{SCIM_KEY_dead_acute, 0x1001f48, 0, 0, 0 }, 0x1F4C},
+ {{SCIM_KEY_dead_acute, 0x1001f49, 0, 0, 0 }, 0x1F4D},
+ {{SCIM_KEY_dead_acute, 0x1001f50, 0, 0, 0 }, 0x1F54},
+ {{SCIM_KEY_dead_acute, 0x1001f51, 0, 0, 0 }, 0x1F55},
+ {{SCIM_KEY_dead_acute, 0x1001f59, 0, 0, 0 }, 0x1F5D},
+ {{SCIM_KEY_dead_acute, 0x1001f60, 0, 0, 0 }, 0x1F64},
+ {{SCIM_KEY_dead_acute, 0x1001f61, 0, 0, 0 }, 0x1F65},
+ {{SCIM_KEY_dead_acute, 0x1001f68, 0, 0, 0 }, 0x1F6C},
+ {{SCIM_KEY_dead_acute, 0x1001f69, 0, 0, 0 }, 0x1F6D},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_space, 0, 0, 0 }, 0x005E},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_parenleft, 0, 0, 0 }, 0x207D},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_parenright, 0, 0, 0 }, 0x207E},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_plus, 0, 0, 0 }, 0x207A},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_minus, 0, 0, 0 }, 0x00AF},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_period, 0, 0, 0 }, 0x00B7},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_slash, 0, 0, 0 }, 0x007C},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_0, 0, 0, 0 }, 0x2070},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_1, 0, 0, 0 }, 0x00B9},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_2, 0, 0, 0 }, 0x00B2},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_3, 0, 0, 0 }, 0x00B3},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_4, 0, 0, 0 }, 0x2074},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_5, 0, 0, 0 }, 0x2075},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_6, 0, 0, 0 }, 0x2076},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_7, 0, 0, 0 }, 0x2077},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_8, 0, 0, 0 }, 0x2078},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_9, 0, 0, 0 }, 0x2079},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_equal, 0, 0, 0 }, 0x207C},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_A, 0, 0, 0 }, 0x00C2},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_C, 0, 0, 0 }, 0x0108},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_E, 0, 0, 0 }, 0x00CA},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_G, 0, 0, 0 }, 0x011C},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_H, 0, 0, 0 }, 0x0124},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_I, 0, 0, 0 }, 0x00CE},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_J, 0, 0, 0 }, 0x0134},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_O, 0, 0, 0 }, 0x00D4},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_S, 0, 0, 0 }, 0x015C},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_U, 0, 0, 0 }, 0x00DB},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_W, 0, 0, 0 }, 0x0174},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Y, 0, 0, 0 }, 0x0176},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Z, 0, 0, 0 }, 0x1E90},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_asciicircum, 0, 0, 0 }, 0x005E},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_underscore, 0, 0, 0 }, 0x00AF},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_a, 0, 0, 0 }, 0x00E2},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_c, 0, 0, 0 }, 0x0109},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_e, 0, 0, 0 }, 0x00EA},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_g, 0, 0, 0 }, 0x011D},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_h, 0, 0, 0 }, 0x0125},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_i, 0, 0, 0 }, 0x00EE},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_j, 0, 0, 0 }, 0x0135},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_o, 0, 0, 0 }, 0x00F4},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_s, 0, 0, 0 }, 0x015D},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_u, 0, 0, 0 }, 0x00FB},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_w, 0, 0, 0 }, 0x0175},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_y, 0, 0, 0 }, 0x0177},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_z, 0, 0, 0 }, 0x1E91},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_combining_belowdot, SCIM_KEY_A, 0, 0 }, 0x1EAC},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_combining_belowdot, SCIM_KEY_E, 0, 0 }, 0x1EC6},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_combining_belowdot, SCIM_KEY_O, 0, 0 }, 0x1ED8},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_combining_belowdot, SCIM_KEY_a, 0, 0 }, 0x1EAD},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_combining_belowdot, SCIM_KEY_e, 0, 0 }, 0x1EC7},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_combining_belowdot, SCIM_KEY_o, 0, 0 }, 0x1ED9},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_dead_circumflex, 0, 0, 0 }, 0x005E},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_dead_belowdot, SCIM_KEY_A, 0, 0 }, 0x1EAC},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_dead_belowdot, SCIM_KEY_E, 0, 0 }, 0x1EC6},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_dead_belowdot, SCIM_KEY_O, 0, 0 }, 0x1ED8},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_dead_belowdot, SCIM_KEY_a, 0, 0 }, 0x1EAD},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_dead_belowdot, SCIM_KEY_e, 0, 0 }, 0x1EC7},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_dead_belowdot, SCIM_KEY_o, 0, 0 }, 0x1ED9},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_A, 0 }, 0x1EAC},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_E, 0 }, 0x1EC6},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_O, 0 }, 0x1ED8},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_a, 0 }, 0x1EAD},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_e, 0 }, 0x1EC7},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_o, 0 }, 0x1ED9},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_S, SCIM_KEY_M, 0 }, 0x2120},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_T, SCIM_KEY_M, 0 }, 0x2122},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_a, 0 }, 0x00AA},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_h, 0 }, 0x02B0},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_i, 0 }, 0x2071},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_j, 0 }, 0x02B2},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_l, 0 }, 0x02E1},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_n, 0 }, 0x207F},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_o, 0 }, 0x00BA},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_r, 0 }, 0x02B3},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_s, 0 }, 0x02E2},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_w, 0 }, 0x02B7},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_x, 0 }, 0x02E3},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_y, 0 }, 0x02B8},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, 0x1000263, 0 }, 0x02E0},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, 0x1000266, 0 }, 0x02B1},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, 0x1000279, 0 }, 0x02B4},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, 0x100027b, 0 }, 0x02B5},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, 0x1000281, 0 }, 0x02B6},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underscore, 0x1000295, 0 }, 0x02E4},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_a, 0 }, 0x00AA},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_h, 0 }, 0x02B0},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_i, 0 }, 0x2071},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_j, 0 }, 0x02B2},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_l, 0 }, 0x02E1},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_n, 0 }, 0x207F},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_o, 0 }, 0x00BA},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_r, 0 }, 0x02B3},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_s, 0 }, 0x02E2},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_w, 0 }, 0x02B7},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_x, 0 }, 0x02E3},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_y, 0 }, 0x02B8},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, 0x1000263, 0 }, 0x02E0},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, 0x1000266, 0 }, 0x02B1},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, 0x1000279, 0 }, 0x02B4},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, 0x100027b, 0 }, 0x02B5},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, 0x1000281, 0 }, 0x02B6},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_Multi_key, SCIM_KEY_underbar, 0x1000295, 0 }, 0x02E4},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_KP_Space, 0, 0, 0 }, 0x00B2},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_KP_Add, 0, 0, 0 }, 0x207A},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_KP_0, 0, 0, 0 }, 0x2070},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_KP_1, 0, 0, 0 }, 0x00B9},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_KP_2, 0, 0, 0 }, 0x00B2},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_KP_3, 0, 0, 0 }, 0x00B3},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_KP_4, 0, 0, 0 }, 0x2074},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_KP_5, 0, 0, 0 }, 0x2075},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_KP_6, 0, 0, 0 }, 0x2076},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_KP_7, 0, 0, 0 }, 0x2077},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_KP_8, 0, 0, 0 }, 0x2078},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_KP_9, 0, 0, 0 }, 0x2079},
+ {{SCIM_KEY_dead_circumflex, SCIM_KEY_KP_Equal, 0, 0, 0 }, 0x207C},
+ {{SCIM_KEY_dead_circumflex, 0x1001ea0, 0, 0, 0 }, 0x1EAC},
+ {{SCIM_KEY_dead_circumflex, 0x1001ea1, 0, 0, 0 }, 0x1EAD},
+ {{SCIM_KEY_dead_circumflex, 0x1001eb8, 0, 0, 0 }, 0x1EC6},
+ {{SCIM_KEY_dead_circumflex, 0x1001eb9, 0, 0, 0 }, 0x1EC7},
+ {{SCIM_KEY_dead_circumflex, 0x1001ecc, 0, 0, 0 }, 0x1ED8},
+ {{SCIM_KEY_dead_circumflex, 0x1001ecd, 0, 0, 0 }, 0x1ED9},
+ {{SCIM_KEY_dead_circumflex, 0x1002212, 0, 0, 0 }, 0x207B},
+ {{SCIM_KEY_dead_circumflex, 0x1004e00, 0, 0, 0 }, 0x3192},
+ {{SCIM_KEY_dead_circumflex, 0x1004e01, 0, 0, 0 }, 0x319C},
+ {{SCIM_KEY_dead_circumflex, 0x1004e09, 0, 0, 0 }, 0x3194},
+ {{SCIM_KEY_dead_circumflex, 0x1004e0a, 0, 0, 0 }, 0x3196},
+ {{SCIM_KEY_dead_circumflex, 0x1004e0b, 0, 0, 0 }, 0x3198},
+ {{SCIM_KEY_dead_circumflex, 0x1004e19, 0, 0, 0 }, 0x319B},
+ {{SCIM_KEY_dead_circumflex, 0x1004e2d, 0, 0, 0 }, 0x3197},
+ {{SCIM_KEY_dead_circumflex, 0x1004e59, 0, 0, 0 }, 0x319A},
+ {{SCIM_KEY_dead_circumflex, 0x1004e8c, 0, 0, 0 }, 0x3193},
+ {{SCIM_KEY_dead_circumflex, 0x1004eba, 0, 0, 0 }, 0x319F},
+ {{SCIM_KEY_dead_circumflex, 0x10056db, 0, 0, 0 }, 0x3195},
+ {{SCIM_KEY_dead_circumflex, 0x1005730, 0, 0, 0 }, 0x319E},
+ {{SCIM_KEY_dead_circumflex, 0x1005929, 0, 0, 0 }, 0x319D},
+ {{SCIM_KEY_dead_circumflex, 0x1007532, 0, 0, 0 }, 0x3199},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_space, 0, 0, 0 }, 0x007E},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_A, 0, 0, 0 }, 0x00C3},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_E, 0, 0, 0 }, 0x1EBC},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_I, 0, 0, 0 }, 0x0128},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_N, 0, 0, 0 }, 0x00D1},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_O, 0, 0, 0 }, 0x00D5},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_U, 0, 0, 0 }, 0x0168},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_V, 0, 0, 0 }, 0x1E7C},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Y, 0, 0, 0 }, 0x1EF8},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_a, 0, 0, 0 }, 0x00E3},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_e, 0, 0, 0 }, 0x1EBD},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_i, 0, 0, 0 }, 0x0129},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_n, 0, 0, 0 }, 0x00F1},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_o, 0, 0, 0 }, 0x00F5},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_u, 0, 0, 0 }, 0x0169},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_v, 0, 0, 0 }, 0x1E7D},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_y, 0, 0, 0 }, 0x1EF9},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_asciitilde, 0, 0, 0 }, 0x007E},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Acircumflex, 0, 0, 0 }, 0x1EAA},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Ecircumflex, 0, 0, 0 }, 0x1EC4},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Ocircumflex, 0, 0, 0 }, 0x1ED6},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_acircumflex, 0, 0, 0 }, 0x1EAB},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_ecircumflex, 0, 0, 0 }, 0x1EC5},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_ocircumflex, 0, 0, 0 }, 0x1ED7},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Abreve, 0, 0, 0 }, 0x1EB4},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_abreve, 0, 0, 0 }, 0x1EB5},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Greek_iotadieresis, 0, 0, 0 }, 0x1FD7},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Greek_upsilondieresis, 0, 0, 0 }, 0x1FE7},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Greek_alpha, 0, 0, 0 }, 0x1FB6},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Greek_eta, 0, 0, 0 }, 0x1FC6},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Greek_iota, 0, 0, 0 }, 0x1FD6},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Greek_upsilon, 0, 0, 0 }, 0x1FE6},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Greek_omega, 0, 0, 0 }, 0x1FF6},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Ohorn, 0, 0, 0 }, 0x1EE0},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_ohorn, 0, 0, 0 }, 0x1EE1},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Uhorn, 0, 0, 0 }, 0x1EEE},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_uhorn, 0, 0, 0 }, 0x1EEF},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_dead_circumflex, SCIM_KEY_A, 0, 0 }, 0x1EAA},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_dead_circumflex, SCIM_KEY_E, 0, 0 }, 0x1EC4},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_dead_circumflex, SCIM_KEY_O, 0, 0 }, 0x1ED6},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_dead_circumflex, SCIM_KEY_a, 0, 0 }, 0x1EAB},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_dead_circumflex, SCIM_KEY_e, 0, 0 }, 0x1EC5},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_dead_circumflex, SCIM_KEY_o, 0, 0 }, 0x1ED7},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_dead_tilde, 0, 0, 0 }, 0x007E},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_dead_breve, SCIM_KEY_A, 0, 0 }, 0x1EB4},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_dead_breve, SCIM_KEY_a, 0, 0 }, 0x1EB5},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_iota, 0, 0 }, 0x1FD7},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1FE7},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_dead_horn, SCIM_KEY_O, 0, 0 }, 0x1EE0},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_dead_horn, SCIM_KEY_U, 0, 0 }, 0x1EEE},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_dead_horn, SCIM_KEY_o, 0, 0 }, 0x1EE1},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_dead_horn, SCIM_KEY_u, 0, 0 }, 0x1EEF},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Greek_iota, 0 }, 0x1FD7},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Greek_upsilon, 0 }, 0x1FE7},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0F},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA, 0 }, 0x1F2F},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3F},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_UPSILON, 0 }, 0x1F5F},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6F},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha, 0 }, 0x1F07},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta, 0 }, 0x1F27},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_iota, 0 }, 0x1F37},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_upsilon, 0 }, 0x1F57},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega, 0 }, 0x1F67},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0E},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA, 0 }, 0x1F2E},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3E},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6E},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha, 0 }, 0x1F06},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_eta, 0 }, 0x1F26},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_iota, 0 }, 0x1F36},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_upsilon, 0 }, 0x1F56},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omega, 0 }, 0x1F66},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_O, 0 }, 0x1EE0},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_U, 0 }, 0x1EEE},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_o, 0 }, 0x1EE1},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_u, 0 }, 0x1EEF},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_A, 0 }, 0x1EB4},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_a, 0 }, 0x1EB5},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_A, 0 }, 0x1EAA},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_E, 0 }, 0x1EC4},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_O, 0 }, 0x1ED6},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_a, 0 }, 0x1EAB},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_e, 0 }, 0x1EC5},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_o, 0 }, 0x1ED7},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_A, 0 }, 0x1EB4},
+ {{SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_a, 0 }, 0x1EB5},
+ {{SCIM_KEY_dead_tilde, 0x10001a0, 0, 0, 0 }, 0x1EE0},
+ {{SCIM_KEY_dead_tilde, 0x10001a1, 0, 0, 0 }, 0x1EE1},
+ {{SCIM_KEY_dead_tilde, 0x10001af, 0, 0, 0 }, 0x1EEE},
+ {{SCIM_KEY_dead_tilde, 0x10001b0, 0, 0, 0 }, 0x1EEF},
+ {{SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1F0E},
+ {{SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1F2E},
+ {{SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1F3E},
+ {{SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1F6E},
+ {{SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1F06},
+ {{SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_eta, 0, 0 }, 0x1F26},
+ {{SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_iota, 0, 0 }, 0x1F36},
+ {{SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1F56},
+ {{SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_omega, 0, 0 }, 0x1F66},
+ {{SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1F0F},
+ {{SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1F2F},
+ {{SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1F3F},
+ {{SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_UPSILON, 0, 0 }, 0x1F5F},
+ {{SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1F6F},
+ {{SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1F07},
+ {{SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_eta, 0, 0 }, 0x1F27},
+ {{SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_iota, 0, 0 }, 0x1F37},
+ {{SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1F57},
+ {{SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_omega, 0, 0 }, 0x1F67},
+ {{SCIM_KEY_dead_tilde, 0x1001f00, 0, 0, 0 }, 0x1F06},
+ {{SCIM_KEY_dead_tilde, 0x1001f01, 0, 0, 0 }, 0x1F07},
+ {{SCIM_KEY_dead_tilde, 0x1001f08, 0, 0, 0 }, 0x1F0E},
+ {{SCIM_KEY_dead_tilde, 0x1001f09, 0, 0, 0 }, 0x1F0F},
+ {{SCIM_KEY_dead_tilde, 0x1001f20, 0, 0, 0 }, 0x1F26},
+ {{SCIM_KEY_dead_tilde, 0x1001f21, 0, 0, 0 }, 0x1F27},
+ {{SCIM_KEY_dead_tilde, 0x1001f28, 0, 0, 0 }, 0x1F2E},
+ {{SCIM_KEY_dead_tilde, 0x1001f29, 0, 0, 0 }, 0x1F2F},
+ {{SCIM_KEY_dead_tilde, 0x1001f30, 0, 0, 0 }, 0x1F36},
+ {{SCIM_KEY_dead_tilde, 0x1001f31, 0, 0, 0 }, 0x1F37},
+ {{SCIM_KEY_dead_tilde, 0x1001f38, 0, 0, 0 }, 0x1F3E},
+ {{SCIM_KEY_dead_tilde, 0x1001f39, 0, 0, 0 }, 0x1F3F},
+ {{SCIM_KEY_dead_tilde, 0x1001f50, 0, 0, 0 }, 0x1F56},
+ {{SCIM_KEY_dead_tilde, 0x1001f51, 0, 0, 0 }, 0x1F57},
+ {{SCIM_KEY_dead_tilde, 0x1001f59, 0, 0, 0 }, 0x1F5F},
+ {{SCIM_KEY_dead_tilde, 0x1001f60, 0, 0, 0 }, 0x1F66},
+ {{SCIM_KEY_dead_tilde, 0x1001f61, 0, 0, 0 }, 0x1F67},
+ {{SCIM_KEY_dead_tilde, 0x1001f68, 0, 0, 0 }, 0x1F6E},
+ {{SCIM_KEY_dead_tilde, 0x1001f69, 0, 0, 0 }, 0x1F6F},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_space, 0, 0, 0 }, 0x00AF},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_A, 0, 0, 0 }, 0x0100},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_E, 0, 0, 0 }, 0x0112},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_G, 0, 0, 0 }, 0x1E20},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_I, 0, 0, 0 }, 0x012A},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_O, 0, 0, 0 }, 0x014C},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_U, 0, 0, 0 }, 0x016A},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Y, 0, 0, 0 }, 0x0232},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_a, 0, 0, 0 }, 0x0101},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_e, 0, 0, 0 }, 0x0113},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_g, 0, 0, 0 }, 0x1E21},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_i, 0, 0, 0 }, 0x012B},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_o, 0, 0, 0 }, 0x014D},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_u, 0, 0, 0 }, 0x016B},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_y, 0, 0, 0 }, 0x0233},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_macron, 0, 0, 0 }, 0x00AF},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Adiaeresis, 0, 0, 0 }, 0x01DE},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_AE, 0, 0, 0 }, 0x01E2},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Otilde, 0, 0, 0 }, 0x022C},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Odiaeresis, 0, 0, 0 }, 0x022A},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Udiaeresis, 0, 0, 0 }, 0x01D5},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_adiaeresis, 0, 0, 0 }, 0x01DF},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_ae, 0, 0, 0 }, 0x01E3},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_otilde, 0, 0, 0 }, 0x022D},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_odiaeresis, 0, 0, 0 }, 0x022B},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_udiaeresis, 0, 0, 0 }, 0x01D6},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Cyrillic_i, 0, 0, 0 }, 0x04E3},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Cyrillic_u, 0, 0, 0 }, 0x04EF},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Cyrillic_I, 0, 0, 0 }, 0x04E2},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Cyrillic_U, 0, 0, 0 }, 0x04EE},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Greek_ALPHA, 0, 0, 0 }, 0x1FB9},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Greek_IOTA, 0, 0, 0 }, 0x1FD9},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Greek_UPSILON, 0, 0, 0 }, 0x1FE9},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Greek_alpha, 0, 0, 0 }, 0x1FB1},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Greek_iota, 0, 0, 0 }, 0x1FD1},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Greek_upsilon, 0, 0, 0 }, 0x1FE1},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_combining_tilde, SCIM_KEY_O, 0, 0 }, 0x022C},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_combining_tilde, SCIM_KEY_o, 0, 0 }, 0x022D},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_combining_belowdot, SCIM_KEY_L, 0, 0 }, 0x1E38},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_combining_belowdot, SCIM_KEY_R, 0, 0 }, 0x1E5C},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_combining_belowdot, SCIM_KEY_l, 0, 0 }, 0x1E39},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_combining_belowdot, SCIM_KEY_r, 0, 0 }, 0x1E5D},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_tilde, SCIM_KEY_O, 0, 0 }, 0x022C},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_tilde, SCIM_KEY_o, 0, 0 }, 0x022D},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_macron, 0, 0, 0 }, 0x00AF},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_abovedot, SCIM_KEY_A, 0, 0 }, 0x01E0},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_abovedot, SCIM_KEY_O, 0, 0 }, 0x0230},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_abovedot, SCIM_KEY_a, 0, 0 }, 0x01E1},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_abovedot, SCIM_KEY_o, 0, 0 }, 0x0231},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_diaeresis, SCIM_KEY_A, 0, 0 }, 0x01DE},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_diaeresis, SCIM_KEY_O, 0, 0 }, 0x022A},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_diaeresis, SCIM_KEY_U, 0, 0 }, 0x01D5},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_diaeresis, SCIM_KEY_a, 0, 0 }, 0x01DF},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_diaeresis, SCIM_KEY_o, 0, 0 }, 0x022B},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_diaeresis, SCIM_KEY_u, 0, 0 }, 0x01D6},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_ogonek, SCIM_KEY_O, 0, 0 }, 0x01EC},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_ogonek, SCIM_KEY_o, 0, 0 }, 0x01ED},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_belowdot, SCIM_KEY_L, 0, 0 }, 0x1E38},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_belowdot, SCIM_KEY_R, 0, 0 }, 0x1E5C},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_belowdot, SCIM_KEY_l, 0, 0 }, 0x1E39},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_dead_belowdot, SCIM_KEY_r, 0, 0 }, 0x1E5D},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_L, 0 }, 0x1E38},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_R, 0 }, 0x1E5C},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_l, 0 }, 0x1E39},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_r, 0 }, 0x1E5D},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_A, 0 }, 0x01DE},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_O, 0 }, 0x022A},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_U, 0 }, 0x01D5},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_a, 0 }, 0x01DF},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_o, 0 }, 0x022B},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_u, 0 }, 0x01D6},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_A, 0 }, 0x01E0},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_O, 0 }, 0x0230},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_a, 0 }, 0x01E1},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_o, 0 }, 0x0231},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_semicolon, SCIM_KEY_O, 0 }, 0x01EC},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_semicolon, SCIM_KEY_o, 0 }, 0x01ED},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_O, 0 }, 0x022C},
+ {{SCIM_KEY_dead_macron, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_o, 0 }, 0x022D},
+ {{SCIM_KEY_dead_macron, 0x10001ea, 0, 0, 0 }, 0x01EC},
+ {{SCIM_KEY_dead_macron, 0x10001eb, 0, 0, 0 }, 0x01ED},
+ {{SCIM_KEY_dead_macron, 0x1000226, 0, 0, 0 }, 0x01E0},
+ {{SCIM_KEY_dead_macron, 0x1000227, 0, 0, 0 }, 0x01E1},
+ {{SCIM_KEY_dead_macron, 0x100022e, 0, 0, 0 }, 0x0230},
+ {{SCIM_KEY_dead_macron, 0x100022f, 0, 0, 0 }, 0x0231},
+ {{SCIM_KEY_dead_macron, 0x1001e36, 0, 0, 0 }, 0x1E38},
+ {{SCIM_KEY_dead_macron, 0x1001e37, 0, 0, 0 }, 0x1E39},
+ {{SCIM_KEY_dead_macron, 0x1001e5a, 0, 0, 0 }, 0x1E5C},
+ {{SCIM_KEY_dead_macron, 0x1001e5b, 0, 0, 0 }, 0x1E5D},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_space, 0, 0, 0 }, 0x02D8},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_A, 0, 0, 0 }, 0x0102},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_E, 0, 0, 0 }, 0x0114},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_G, 0, 0, 0 }, 0x011E},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_I, 0, 0, 0 }, 0x012C},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_O, 0, 0, 0 }, 0x014E},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_U, 0, 0, 0 }, 0x016C},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_a, 0, 0, 0 }, 0x0103},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_e, 0, 0, 0 }, 0x0115},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_g, 0, 0, 0 }, 0x011F},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_i, 0, 0, 0 }, 0x012D},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_o, 0, 0, 0 }, 0x014F},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_u, 0, 0, 0 }, 0x016D},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Cyrillic_a, 0, 0, 0 }, 0x04D1},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Cyrillic_ie, 0, 0, 0 }, 0x04D7},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Cyrillic_i, 0, 0, 0 }, 0x0439},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Cyrillic_u, 0, 0, 0 }, 0x045E},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Cyrillic_zhe, 0, 0, 0 }, 0x04C2},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Cyrillic_A, 0, 0, 0 }, 0x04D0},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Cyrillic_IE, 0, 0, 0 }, 0x04D6},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Cyrillic_I, 0, 0, 0 }, 0x0419},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Cyrillic_U, 0, 0, 0 }, 0x040E},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Cyrillic_ZHE, 0, 0, 0 }, 0x04C1},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Greek_ALPHA, 0, 0, 0 }, 0x1FB8},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Greek_IOTA, 0, 0, 0 }, 0x1FD8},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Greek_UPSILON, 0, 0, 0 }, 0x1FE8},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Greek_alpha, 0, 0, 0 }, 0x1FB0},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Greek_iota, 0, 0, 0 }, 0x1FD0},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Greek_upsilon, 0, 0, 0 }, 0x1FE0},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_combining_belowdot, SCIM_KEY_A, 0, 0 }, 0x1EB6},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_combining_belowdot, SCIM_KEY_a, 0, 0 }, 0x1EB7},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_dead_breve, 0, 0, 0 }, 0x02D8},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_dead_cedilla, SCIM_KEY_E, 0, 0 }, 0x1E1C},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_dead_cedilla, SCIM_KEY_e, 0, 0 }, 0x1E1D},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_dead_belowdot, SCIM_KEY_A, 0, 0 }, 0x1EB6},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_dead_belowdot, SCIM_KEY_a, 0, 0 }, 0x1EB7},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_A, 0 }, 0x1EB6},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_a, 0 }, 0x1EB7},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_E, 0 }, 0x1E1C},
+ {{SCIM_KEY_dead_breve, SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_e, 0 }, 0x1E1D},
+ {{SCIM_KEY_dead_breve, 0x1000228, 0, 0, 0 }, 0x1E1C},
+ {{SCIM_KEY_dead_breve, 0x1000229, 0, 0, 0 }, 0x1E1D},
+ {{SCIM_KEY_dead_breve, 0x1001ea0, 0, 0, 0 }, 0x1EB6},
+ {{SCIM_KEY_dead_breve, 0x1001ea1, 0, 0, 0 }, 0x1EB7},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_space, 0, 0, 0 }, 0x02D9},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_A, 0, 0, 0 }, 0x0226},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_B, 0, 0, 0 }, 0x1E02},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_C, 0, 0, 0 }, 0x010A},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_D, 0, 0, 0 }, 0x1E0A},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_E, 0, 0, 0 }, 0x0116},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_F, 0, 0, 0 }, 0x1E1E},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_G, 0, 0, 0 }, 0x0120},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_H, 0, 0, 0 }, 0x1E22},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_I, 0, 0, 0 }, 0x0130},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_M, 0, 0, 0 }, 0x1E40},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_N, 0, 0, 0 }, 0x1E44},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_O, 0, 0, 0 }, 0x022E},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_P, 0, 0, 0 }, 0x1E56},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_R, 0, 0, 0 }, 0x1E58},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_S, 0, 0, 0 }, 0x1E60},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_T, 0, 0, 0 }, 0x1E6A},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_W, 0, 0, 0 }, 0x1E86},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_X, 0, 0, 0 }, 0x1E8A},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_Y, 0, 0, 0 }, 0x1E8E},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_Z, 0, 0, 0 }, 0x017B},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_a, 0, 0, 0 }, 0x0227},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_b, 0, 0, 0 }, 0x1E03},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_c, 0, 0, 0 }, 0x010B},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_d, 0, 0, 0 }, 0x1E0B},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_e, 0, 0, 0 }, 0x0117},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_f, 0, 0, 0 }, 0x1E1F},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_g, 0, 0, 0 }, 0x0121},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_h, 0, 0, 0 }, 0x1E23},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_i, 0, 0, 0 }, 0x0131},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_m, 0, 0, 0 }, 0x1E41},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_n, 0, 0, 0 }, 0x1E45},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_o, 0, 0, 0 }, 0x022F},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_p, 0, 0, 0 }, 0x1E57},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_r, 0, 0, 0 }, 0x1E59},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_s, 0, 0, 0 }, 0x1E61},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_t, 0, 0, 0 }, 0x1E6B},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_w, 0, 0, 0 }, 0x1E87},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_x, 0, 0, 0 }, 0x1E8B},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_y, 0, 0, 0 }, 0x1E8F},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_z, 0, 0, 0 }, 0x017C},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_Sacute, 0, 0, 0 }, 0x1E64},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_Scaron, 0, 0, 0 }, 0x1E66},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_sacute, 0, 0, 0 }, 0x1E65},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_scaron, 0, 0, 0 }, 0x1E67},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_abovedot, 0, 0, 0 }, 0x02D9},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_combining_acute, SCIM_KEY_S, 0, 0 }, 0x1E64},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_combining_acute, SCIM_KEY_s, 0, 0 }, 0x1E65},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_combining_belowdot, SCIM_KEY_S, 0, 0 }, 0x1E68},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_combining_belowdot, SCIM_KEY_s, 0, 0 }, 0x1E69},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_dead_acute, SCIM_KEY_S, 0, 0 }, 0x1E64},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_dead_acute, SCIM_KEY_s, 0, 0 }, 0x1E65},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_dead_abovedot, 0, 0, 0 }, 0x02D9},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_dead_caron, SCIM_KEY_S, 0, 0 }, 0x1E66},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_dead_caron, SCIM_KEY_s, 0, 0 }, 0x1E67},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_dead_belowdot, SCIM_KEY_S, 0, 0 }, 0x1E68},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_dead_belowdot, SCIM_KEY_s, 0, 0 }, 0x1E69},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_S, 0 }, 0x1E68},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_s, 0 }, 0x1E69},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_S, 0 }, 0x1E64},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_s, 0 }, 0x1E65},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_S, 0 }, 0x1E66},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_s, 0 }, 0x1E67},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_S, 0 }, 0x1E64},
+ {{SCIM_KEY_dead_abovedot, SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_s, 0 }, 0x1E65},
+ {{SCIM_KEY_dead_abovedot, 0x100017f, 0, 0, 0 }, 0x1E9B},
+ {{SCIM_KEY_dead_abovedot, 0x1001e62, 0, 0, 0 }, 0x1E68},
+ {{SCIM_KEY_dead_abovedot, 0x1001e63, 0, 0, 0 }, 0x1E69},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_space, 0, 0, 0 }, 0x0022},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_quotedbl, 0, 0, 0 }, 0x00A8},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_apostrophe, 0, 0, 0 }, 0x0344},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_A, 0, 0, 0 }, 0x00C4},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_E, 0, 0, 0 }, 0x00CB},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_H, 0, 0, 0 }, 0x1E26},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_I, 0, 0, 0 }, 0x00CF},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_O, 0, 0, 0 }, 0x00D6},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_U, 0, 0, 0 }, 0x00DC},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_W, 0, 0, 0 }, 0x1E84},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_X, 0, 0, 0 }, 0x1E8C},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Y, 0, 0, 0 }, 0x0178},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_a, 0, 0, 0 }, 0x00E4},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_e, 0, 0, 0 }, 0x00EB},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_h, 0, 0, 0 }, 0x1E27},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_i, 0, 0, 0 }, 0x00EF},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_o, 0, 0, 0 }, 0x00F6},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_t, 0, 0, 0 }, 0x1E97},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_u, 0, 0, 0 }, 0x00FC},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_w, 0, 0, 0 }, 0x1E85},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_x, 0, 0, 0 }, 0x1E8D},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_y, 0, 0, 0 }, 0x00FF},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_diaeresis, 0, 0, 0 }, 0x00A8},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_acute, 0, 0, 0 }, 0x0344},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Otilde, 0, 0, 0 }, 0x1E4E},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_otilde, 0, 0, 0 }, 0x1E4F},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Umacron, 0, 0, 0 }, 0x1E7A},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_umacron, 0, 0, 0 }, 0x1E7B},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Ukrainian_i, 0, 0, 0 }, 0x0457},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Ukrainian_I, 0, 0, 0 }, 0x0407},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_a, 0, 0, 0 }, 0x04D3},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_ie, 0, 0, 0 }, 0x0451},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_i, 0, 0, 0 }, 0x04E5},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_o, 0, 0, 0 }, 0x04E7},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_u, 0, 0, 0 }, 0x04F1},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_zhe, 0, 0, 0 }, 0x04DD},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_yeru, 0, 0, 0 }, 0x04F9},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_ze, 0, 0, 0 }, 0x04DF},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_e, 0, 0, 0 }, 0x04ED},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_che, 0, 0, 0 }, 0x04F5},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_A, 0, 0, 0 }, 0x04D2},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_IE, 0, 0, 0 }, 0x0401},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_I, 0, 0, 0 }, 0x04E4},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_O, 0, 0, 0 }, 0x04E6},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_U, 0, 0, 0 }, 0x04F0},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_ZHE, 0, 0, 0 }, 0x04DC},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_YERU, 0, 0, 0 }, 0x04F8},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_ZE, 0, 0, 0 }, 0x04DE},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_E, 0, 0, 0 }, 0x04EC},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Cyrillic_CHE, 0, 0, 0 }, 0x04F4},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_IOTA, 0, 0, 0 }, 0x03AA},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_UPSILON, 0, 0, 0 }, 0x03AB},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_iota, 0, 0, 0 }, 0x03CA},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_upsilon, 0, 0, 0 }, 0x03CB},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_combining_tilde, SCIM_KEY_O, 0, 0 }, 0x1E4E},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_combining_tilde, SCIM_KEY_o, 0, 0 }, 0x1E4F},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_dead_acute, SCIM_KEY_space, 0, 0 }, 0x0385},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_dead_acute, SCIM_KEY_Greek_iota, 0, 0 }, 0x0390},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_dead_acute, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x03B0},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_dead_tilde, SCIM_KEY_O, 0, 0 }, 0x1E4E},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_dead_tilde, SCIM_KEY_o, 0, 0 }, 0x1E4F},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_dead_macron, SCIM_KEY_U, 0, 0 }, 0x1E7A},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_dead_macron, SCIM_KEY_u, 0, 0 }, 0x1E7B},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_dead_diaeresis, 0, 0, 0 }, 0x00A8},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_U, 0 }, 0x1E7A},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_u, 0 }, 0x1E7B},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_O, 0 }, 0x1E4E},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_o, 0 }, 0x1E4F},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_U, 0 }, 0x1E7A},
+ {{SCIM_KEY_dead_diaeresis, SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_u, 0 }, 0x1E7B},
+ {{SCIM_KEY_dead_diaeresis, 0x10004d8, 0, 0, 0 }, 0x04DA},
+ {{SCIM_KEY_dead_diaeresis, 0x10004d9, 0, 0, 0 }, 0x04DB},
+ {{SCIM_KEY_dead_diaeresis, 0x10004e8, 0, 0, 0 }, 0x04EA},
+ {{SCIM_KEY_dead_diaeresis, 0x10004e9, 0, 0, 0 }, 0x04EB},
+ {{SCIM_KEY_dead_abovering, SCIM_KEY_space, 0, 0, 0 }, 0x02DA},
+ {{SCIM_KEY_dead_abovering, SCIM_KEY_A, 0, 0, 0 }, 0x00C5},
+ {{SCIM_KEY_dead_abovering, SCIM_KEY_U, 0, 0, 0 }, 0x016E},
+ {{SCIM_KEY_dead_abovering, SCIM_KEY_a, 0, 0, 0 }, 0x00E5},
+ {{SCIM_KEY_dead_abovering, SCIM_KEY_u, 0, 0, 0 }, 0x016F},
+ {{SCIM_KEY_dead_abovering, SCIM_KEY_w, 0, 0, 0 }, 0x1E98},
+ {{SCIM_KEY_dead_abovering, SCIM_KEY_y, 0, 0, 0 }, 0x1E99},
+ {{SCIM_KEY_dead_abovering, SCIM_KEY_dead_abovering, 0, 0, 0 }, 0x00B0},
+ {{SCIM_KEY_dead_doubleacute, SCIM_KEY_space, 0, 0, 0 }, 0x02DD},
+ {{SCIM_KEY_dead_doubleacute, SCIM_KEY_O, 0, 0, 0 }, 0x0150},
+ {{SCIM_KEY_dead_doubleacute, SCIM_KEY_U, 0, 0, 0 }, 0x0170},
+ {{SCIM_KEY_dead_doubleacute, SCIM_KEY_o, 0, 0, 0 }, 0x0151},
+ {{SCIM_KEY_dead_doubleacute, SCIM_KEY_u, 0, 0, 0 }, 0x0171},
+ {{SCIM_KEY_dead_doubleacute, SCIM_KEY_Cyrillic_u, 0, 0, 0 }, 0x04F3},
+ {{SCIM_KEY_dead_doubleacute, SCIM_KEY_Cyrillic_U, 0, 0, 0 }, 0x04F2},
+ {{SCIM_KEY_dead_doubleacute, SCIM_KEY_dead_doubleacute, 0, 0, 0 }, 0x02DD},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_space, 0, 0, 0 }, 0x02C7},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_A, 0, 0, 0 }, 0x01CD},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_C, 0, 0, 0 }, 0x010C},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_D, 0, 0, 0 }, 0x010E},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_E, 0, 0, 0 }, 0x011A},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_G, 0, 0, 0 }, 0x01E6},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_H, 0, 0, 0 }, 0x021E},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_I, 0, 0, 0 }, 0x01CF},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_K, 0, 0, 0 }, 0x01E8},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_L, 0, 0, 0 }, 0x013D},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_N, 0, 0, 0 }, 0x0147},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_O, 0, 0, 0 }, 0x01D1},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_R, 0, 0, 0 }, 0x0158},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_S, 0, 0, 0 }, 0x0160},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_T, 0, 0, 0 }, 0x0164},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_U, 0, 0, 0 }, 0x01D3},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_Z, 0, 0, 0 }, 0x017D},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_a, 0, 0, 0 }, 0x01CE},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_c, 0, 0, 0 }, 0x010D},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_d, 0, 0, 0 }, 0x010F},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_e, 0, 0, 0 }, 0x011B},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_g, 0, 0, 0 }, 0x01E7},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_h, 0, 0, 0 }, 0x021F},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_i, 0, 0, 0 }, 0x01D0},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_j, 0, 0, 0 }, 0x01F0},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_k, 0, 0, 0 }, 0x01E9},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_l, 0, 0, 0 }, 0x013E},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_n, 0, 0, 0 }, 0x0148},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_o, 0, 0, 0 }, 0x01D2},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_r, 0, 0, 0 }, 0x0159},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_s, 0, 0, 0 }, 0x0161},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_t, 0, 0, 0 }, 0x0165},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_u, 0, 0, 0 }, 0x01D4},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_z, 0, 0, 0 }, 0x017E},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_Udiaeresis, 0, 0, 0 }, 0x01D9},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_udiaeresis, 0, 0, 0 }, 0x01DA},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_caron, 0, 0, 0 }, 0x02C7},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_dead_diaeresis, SCIM_KEY_U, 0, 0 }, 0x01D9},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_dead_diaeresis, SCIM_KEY_u, 0, 0 }, 0x01DA},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_dead_caron, 0, 0, 0 }, 0x02C7},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_U, 0 }, 0x01D9},
+ {{SCIM_KEY_dead_caron, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_u, 0 }, 0x01DA},
+ {{SCIM_KEY_dead_caron, 0x10001b7, 0, 0, 0 }, 0x01EE},
+ {{SCIM_KEY_dead_caron, 0x1000292, 0, 0, 0 }, 0x01EF},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_space, 0, 0, 0 }, 0x00B8},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_comma, 0, 0, 0 }, 0x00B8},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_minus, 0, 0, 0 }, 0x00AC},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_C, 0, 0, 0 }, 0x00C7},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_D, 0, 0, 0 }, 0x1E10},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_E, 0, 0, 0 }, 0x0228},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_G, 0, 0, 0 }, 0x0122},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_H, 0, 0, 0 }, 0x1E28},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_K, 0, 0, 0 }, 0x0136},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_L, 0, 0, 0 }, 0x013B},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_N, 0, 0, 0 }, 0x0145},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_R, 0, 0, 0 }, 0x0156},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_S, 0, 0, 0 }, 0x015E},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_T, 0, 0, 0 }, 0x0162},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_c, 0, 0, 0 }, 0x00E7},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_d, 0, 0, 0 }, 0x1E11},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_e, 0, 0, 0 }, 0x0229},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_g, 0, 0, 0 }, 0x0123},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_h, 0, 0, 0 }, 0x1E29},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_k, 0, 0, 0 }, 0x0137},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_l, 0, 0, 0 }, 0x013C},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_n, 0, 0, 0 }, 0x0146},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_r, 0, 0, 0 }, 0x0157},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_s, 0, 0, 0 }, 0x015F},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_t, 0, 0, 0 }, 0x0163},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_cedilla, 0, 0, 0 }, 0x00B8},
+ {{SCIM_KEY_dead_cedilla, SCIM_KEY_dead_cedilla, 0, 0, 0 }, 0x00B8},
+ {{SCIM_KEY_dead_ogonek, SCIM_KEY_space, 0, 0, 0 }, 0x02DB},
+ {{SCIM_KEY_dead_ogonek, SCIM_KEY_A, 0, 0, 0 }, 0x0104},
+ {{SCIM_KEY_dead_ogonek, SCIM_KEY_E, 0, 0, 0 }, 0x0118},
+ {{SCIM_KEY_dead_ogonek, SCIM_KEY_I, 0, 0, 0 }, 0x012E},
+ {{SCIM_KEY_dead_ogonek, SCIM_KEY_O, 0, 0, 0 }, 0x01EA},
+ {{SCIM_KEY_dead_ogonek, SCIM_KEY_U, 0, 0, 0 }, 0x0172},
+ {{SCIM_KEY_dead_ogonek, SCIM_KEY_a, 0, 0, 0 }, 0x0105},
+ {{SCIM_KEY_dead_ogonek, SCIM_KEY_e, 0, 0, 0 }, 0x0119},
+ {{SCIM_KEY_dead_ogonek, SCIM_KEY_i, 0, 0, 0 }, 0x012F},
+ {{SCIM_KEY_dead_ogonek, SCIM_KEY_o, 0, 0, 0 }, 0x01EB},
+ {{SCIM_KEY_dead_ogonek, SCIM_KEY_u, 0, 0, 0 }, 0x0173},
+ {{SCIM_KEY_dead_ogonek, SCIM_KEY_ogonek, 0, 0, 0 }, 0x02DB},
+ {{SCIM_KEY_dead_ogonek, SCIM_KEY_dead_ogonek, 0, 0, 0 }, 0x02DB},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Greek_alphaaccent, 0, 0, 0 }, 0x1FB4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Greek_etaaccent, 0, 0, 0 }, 0x1FC4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Greek_omegaaccent, 0, 0, 0 }, 0x1FF4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Greek_ALPHA, 0, 0, 0 }, 0x1FBC},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Greek_ETA, 0, 0, 0 }, 0x1FCC},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Greek_OMEGA, 0, 0, 0 }, 0x1FFC},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Greek_alpha, 0, 0, 0 }, 0x1FB3},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Greek_eta, 0, 0, 0 }, 0x1FC3},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Greek_omega, 0, 0, 0 }, 0x1FF3},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1FB2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, SCIM_KEY_Greek_eta, 0, 0 }, 0x1FC2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, SCIM_KEY_Greek_omega, 0, 0 }, 0x1FF2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAB},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F83},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F93},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA3},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAA},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F82},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F92},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F8A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_ETA, 0 }, 0x1F9A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FAA},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_alpha, 0 }, 0x1F82},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_eta, 0 }, 0x1F92},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_omega, 0 }, 0x1FA2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F8B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_ETA, 0 }, 0x1F9B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FAB},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_alpha, 0 }, 0x1F83},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_eta, 0 }, 0x1F93},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_omega, 0 }, 0x1FA3},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1001f00, 0, 0 }, 0x1F82},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1001f01, 0, 0 }, 0x1F83},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1001f08, 0, 0 }, 0x1F8A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1001f09, 0, 0 }, 0x1F8B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1001f20, 0, 0 }, 0x1F92},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1001f21, 0, 0 }, 0x1F93},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1001f28, 0, 0 }, 0x1F9A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1001f29, 0, 0 }, 0x1F9B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1001f60, 0, 0 }, 0x1FA2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1001f61, 0, 0 }, 0x1FA3},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1001f68, 0, 0 }, 0x1FAA},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_grave, 0x1001f69, 0, 0 }, 0x1FAB},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1FB4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, SCIM_KEY_Greek_eta, 0, 0 }, 0x1FC4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, SCIM_KEY_Greek_omega, 0, 0 }, 0x1FF4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAD},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F85},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F95},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA5},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAC},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F84},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F94},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F8C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_ETA, 0 }, 0x1F9C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FAC},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_alpha, 0 }, 0x1F84},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_eta, 0 }, 0x1F94},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_omega, 0 }, 0x1FA4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F8D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_ETA, 0 }, 0x1F9D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FAD},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_alpha, 0 }, 0x1F85},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_eta, 0 }, 0x1F95},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_omega, 0 }, 0x1FA5},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1001f00, 0, 0 }, 0x1F84},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1001f01, 0, 0 }, 0x1F85},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1001f08, 0, 0 }, 0x1F8C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1001f09, 0, 0 }, 0x1F8D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1001f20, 0, 0 }, 0x1F94},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1001f21, 0, 0 }, 0x1F95},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1001f28, 0, 0 }, 0x1F9C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1001f29, 0, 0 }, 0x1F9D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1001f60, 0, 0 }, 0x1FA4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1001f61, 0, 0 }, 0x1FA5},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1001f68, 0, 0 }, 0x1FAC},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_combining_acute, 0x1001f69, 0, 0 }, 0x1FAD},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1FB2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, SCIM_KEY_Greek_eta, 0, 0 }, 0x1FC2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, SCIM_KEY_Greek_omega, 0, 0 }, 0x1FF2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAB},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F83},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F93},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA3},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAA},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F82},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F92},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F8A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_ETA, 0 }, 0x1F9A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FAA},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_alpha, 0 }, 0x1F82},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_eta, 0 }, 0x1F92},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_omega, 0 }, 0x1FA2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F8B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_ETA, 0 }, 0x1F9B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FAB},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_alpha, 0 }, 0x1F83},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_eta, 0 }, 0x1F93},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_omega, 0 }, 0x1FA3},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1001f00, 0, 0 }, 0x1F82},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1001f01, 0, 0 }, 0x1F83},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1001f08, 0, 0 }, 0x1F8A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1001f09, 0, 0 }, 0x1F8B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1001f20, 0, 0 }, 0x1F92},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1001f21, 0, 0 }, 0x1F93},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1001f28, 0, 0 }, 0x1F9A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1001f29, 0, 0 }, 0x1F9B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1001f60, 0, 0 }, 0x1FA2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1001f61, 0, 0 }, 0x1FA3},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1001f68, 0, 0 }, 0x1FAA},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_grave, 0x1001f69, 0, 0 }, 0x1FAB},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1FB4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, SCIM_KEY_Greek_eta, 0, 0 }, 0x1FC4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, SCIM_KEY_Greek_omega, 0, 0 }, 0x1FF4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAD},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F85},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F95},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA5},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAC},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F84},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F94},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F8C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_ETA, 0 }, 0x1F9C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FAC},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_alpha, 0 }, 0x1F84},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_eta, 0 }, 0x1F94},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_omega, 0 }, 0x1FA4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F8D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_ETA, 0 }, 0x1F9D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FAD},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_alpha, 0 }, 0x1F85},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_eta, 0 }, 0x1F95},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_omega, 0 }, 0x1FA5},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1001f00, 0, 0 }, 0x1F84},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1001f01, 0, 0 }, 0x1F85},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1001f08, 0, 0 }, 0x1F8C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1001f09, 0, 0 }, 0x1F8D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1001f20, 0, 0 }, 0x1F94},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1001f21, 0, 0 }, 0x1F95},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1001f28, 0, 0 }, 0x1F9C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1001f29, 0, 0 }, 0x1F9D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1001f60, 0, 0 }, 0x1FA4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1001f61, 0, 0 }, 0x1FA5},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1001f68, 0, 0 }, 0x1FAC},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_acute, 0x1001f69, 0, 0 }, 0x1FAD},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1FB7},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Greek_eta, 0, 0 }, 0x1FC7},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Greek_omega, 0, 0 }, 0x1FF7},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8F},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9F},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAF},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F87},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F97},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA7},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8E},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9E},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAE},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F86},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F96},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA6},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F8E},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_ETA, 0 }, 0x1F9E},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FAE},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_alpha, 0 }, 0x1F86},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_eta, 0 }, 0x1F96},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_omega, 0 }, 0x1FA6},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F8F},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_ETA, 0 }, 0x1F9F},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FAF},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_alpha, 0 }, 0x1F87},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_eta, 0 }, 0x1F97},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_omega, 0 }, 0x1FA7},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1001f00, 0, 0 }, 0x1F86},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1001f01, 0, 0 }, 0x1F87},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1001f08, 0, 0 }, 0x1F8E},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1001f09, 0, 0 }, 0x1F8F},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1001f20, 0, 0 }, 0x1F96},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1001f21, 0, 0 }, 0x1F97},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1001f28, 0, 0 }, 0x1F9E},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1001f29, 0, 0 }, 0x1F9F},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1001f60, 0, 0 }, 0x1FA6},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1001f61, 0, 0 }, 0x1FA7},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1001f68, 0, 0 }, 0x1FAE},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_tilde, 0x1001f69, 0, 0 }, 0x1FAF},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_dead_iota, 0, 0, 0 }, 0x037A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAD},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F85},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F95},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA5},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAC},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F84},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F94},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_alpha, 0 }, 0x1FB4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_eta, 0 }, 0x1FC4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_omega, 0 }, 0x1FF4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_ALPHA }, 0x1F8C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_ETA }, 0x1F9C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_OMEGA }, 0x1FAC},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_alpha }, 0x1F84},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_eta }, 0x1F94},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_omega }, 0x1FA4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_ALPHA }, 0x1F8D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_ETA }, 0x1F9D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_OMEGA }, 0x1FAD},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_alpha }, 0x1F85},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_eta }, 0x1F95},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_omega }, 0x1FA5},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f00, 0 }, 0x1F84},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f01, 0 }, 0x1F85},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f08, 0 }, 0x1F8C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f09, 0 }, 0x1F8D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f20, 0 }, 0x1F94},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f21, 0 }, 0x1F95},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f28, 0 }, 0x1F9C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f29, 0 }, 0x1F9D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f60, 0 }, 0x1FA4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f61, 0 }, 0x1FA5},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f68, 0 }, 0x1FAC},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f69, 0 }, 0x1FAD},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F89},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA, 0 }, 0x1F99},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FA9},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha, 0 }, 0x1F81},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta, 0 }, 0x1F91},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega, 0 }, 0x1FA1},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F88},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA, 0 }, 0x1F98},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FA8},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha, 0 }, 0x1F80},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_eta, 0 }, 0x1F90},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omega, 0 }, 0x1FA0},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAB},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F83},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F93},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA3},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAA},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F82},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F92},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_alpha, 0 }, 0x1FB2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_eta, 0 }, 0x1FC2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_omega, 0 }, 0x1FF2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_ALPHA }, 0x1F8A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_ETA }, 0x1F9A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_OMEGA }, 0x1FAA},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_alpha }, 0x1F82},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_eta }, 0x1F92},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_omega }, 0x1FA2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_ALPHA }, 0x1F8B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_ETA }, 0x1F9B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_OMEGA }, 0x1FAB},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_alpha }, 0x1F83},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_eta }, 0x1F93},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_omega }, 0x1FA3},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f00, 0 }, 0x1F82},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f01, 0 }, 0x1F83},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f08, 0 }, 0x1F8A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f09, 0 }, 0x1F8B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f20, 0 }, 0x1F92},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f21, 0 }, 0x1F93},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f28, 0 }, 0x1F9A},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f29, 0 }, 0x1F9B},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f60, 0 }, 0x1FA2},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f61, 0 }, 0x1FA3},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f68, 0 }, 0x1FAA},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f69, 0 }, 0x1FAB},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8F},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9F},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAF},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F87},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F97},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA7},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8E},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9E},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAE},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F86},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F96},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA6},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_Greek_alpha, 0 }, 0x1FB7},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_Greek_eta, 0 }, 0x1FC7},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_Greek_omega, 0 }, 0x1FF7},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_ALPHA }, 0x1F8E},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_ETA }, 0x1F9E},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_OMEGA }, 0x1FAE},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_alpha }, 0x1F86},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_eta }, 0x1F96},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_omega }, 0x1FA6},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_ALPHA }, 0x1F8F},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_ETA }, 0x1F9F},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_OMEGA }, 0x1FAF},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_alpha }, 0x1F87},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_eta }, 0x1F97},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_omega }, 0x1FA7},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f00, 0 }, 0x1F86},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f01, 0 }, 0x1F87},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f08, 0 }, 0x1F8E},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f09, 0 }, 0x1F8F},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f20, 0 }, 0x1F96},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f21, 0 }, 0x1F97},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f28, 0 }, 0x1F9E},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f29, 0 }, 0x1F9F},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f60, 0 }, 0x1FA6},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f61, 0 }, 0x1FA7},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f68, 0 }, 0x1FAE},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f69, 0 }, 0x1FAF},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAD},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F85},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F95},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA5},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAC},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F84},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F94},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_alpha, 0 }, 0x1FB4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_eta, 0 }, 0x1FC4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_omega, 0 }, 0x1FF4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_ALPHA }, 0x1F8C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_ETA }, 0x1F9C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_OMEGA }, 0x1FAC},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_alpha }, 0x1F84},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_eta }, 0x1F94},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_omega }, 0x1FA4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_ALPHA }, 0x1F8D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_ETA }, 0x1F9D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_OMEGA }, 0x1FAD},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_alpha }, 0x1F85},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_eta }, 0x1F95},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_omega }, 0x1FA5},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f00, 0 }, 0x1F84},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f01, 0 }, 0x1F85},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f08, 0 }, 0x1F8C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f09, 0 }, 0x1F8D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f20, 0 }, 0x1F94},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f21, 0 }, 0x1F95},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f28, 0 }, 0x1F9C},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f29, 0 }, 0x1F9D},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f60, 0 }, 0x1FA4},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f61, 0 }, 0x1FA5},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f68, 0 }, 0x1FAC},
+ {{SCIM_KEY_dead_iota, SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f69, 0 }, 0x1FAD},
+ {{SCIM_KEY_dead_iota, 0x1000313, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1F88},
+ {{SCIM_KEY_dead_iota, 0x1000313, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1F98},
+ {{SCIM_KEY_dead_iota, 0x1000313, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1FA8},
+ {{SCIM_KEY_dead_iota, 0x1000313, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1F80},
+ {{SCIM_KEY_dead_iota, 0x1000313, SCIM_KEY_Greek_eta, 0, 0 }, 0x1F90},
+ {{SCIM_KEY_dead_iota, 0x1000313, SCIM_KEY_Greek_omega, 0, 0 }, 0x1FA0},
+ {{SCIM_KEY_dead_iota, 0x1000314, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1F89},
+ {{SCIM_KEY_dead_iota, 0x1000314, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1F99},
+ {{SCIM_KEY_dead_iota, 0x1000314, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1FA9},
+ {{SCIM_KEY_dead_iota, 0x1000314, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1F81},
+ {{SCIM_KEY_dead_iota, 0x1000314, SCIM_KEY_Greek_eta, 0, 0 }, 0x1F91},
+ {{SCIM_KEY_dead_iota, 0x1000314, SCIM_KEY_Greek_omega, 0, 0 }, 0x1FA1},
+ {{SCIM_KEY_dead_iota, 0x1000342, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1FB7},
+ {{SCIM_KEY_dead_iota, 0x1000342, SCIM_KEY_Greek_eta, 0, 0 }, 0x1FC7},
+ {{SCIM_KEY_dead_iota, 0x1000342, SCIM_KEY_Greek_omega, 0, 0 }, 0x1FF7},
+ {{SCIM_KEY_dead_iota, 0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8F},
+ {{SCIM_KEY_dead_iota, 0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9F},
+ {{SCIM_KEY_dead_iota, 0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAF},
+ {{SCIM_KEY_dead_iota, 0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F87},
+ {{SCIM_KEY_dead_iota, 0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F97},
+ {{SCIM_KEY_dead_iota, 0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA7},
+ {{SCIM_KEY_dead_iota, 0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8E},
+ {{SCIM_KEY_dead_iota, 0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9E},
+ {{SCIM_KEY_dead_iota, 0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAE},
+ {{SCIM_KEY_dead_iota, 0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F86},
+ {{SCIM_KEY_dead_iota, 0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F96},
+ {{SCIM_KEY_dead_iota, 0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA6},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1000313, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F8E},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1000313, SCIM_KEY_Greek_ETA, 0 }, 0x1F9E},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1000313, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FAE},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1000313, SCIM_KEY_Greek_alpha, 0 }, 0x1F86},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1000313, SCIM_KEY_Greek_eta, 0 }, 0x1F96},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1000313, SCIM_KEY_Greek_omega, 0 }, 0x1FA6},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1000314, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F8F},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1000314, SCIM_KEY_Greek_ETA, 0 }, 0x1F9F},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1000314, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FAF},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1000314, SCIM_KEY_Greek_alpha, 0 }, 0x1F87},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1000314, SCIM_KEY_Greek_eta, 0 }, 0x1F97},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1000314, SCIM_KEY_Greek_omega, 0 }, 0x1FA7},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1001f00, 0, 0 }, 0x1F86},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1001f01, 0, 0 }, 0x1F87},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1001f08, 0, 0 }, 0x1F8E},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1001f09, 0, 0 }, 0x1F8F},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1001f20, 0, 0 }, 0x1F96},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1001f21, 0, 0 }, 0x1F97},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1001f28, 0, 0 }, 0x1F9E},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1001f29, 0, 0 }, 0x1F9F},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1001f60, 0, 0 }, 0x1FA6},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1001f61, 0, 0 }, 0x1FA7},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1001f68, 0, 0 }, 0x1FAE},
+ {{SCIM_KEY_dead_iota, 0x1000342, 0x1001f69, 0, 0 }, 0x1FAF},
+ {{SCIM_KEY_dead_iota, 0x1001f00, 0, 0, 0 }, 0x1F80},
+ {{SCIM_KEY_dead_iota, 0x1001f01, 0, 0, 0 }, 0x1F81},
+ {{SCIM_KEY_dead_iota, 0x1001f02, 0, 0, 0 }, 0x1F82},
+ {{SCIM_KEY_dead_iota, 0x1001f03, 0, 0, 0 }, 0x1F83},
+ {{SCIM_KEY_dead_iota, 0x1001f04, 0, 0, 0 }, 0x1F84},
+ {{SCIM_KEY_dead_iota, 0x1001f05, 0, 0, 0 }, 0x1F85},
+ {{SCIM_KEY_dead_iota, 0x1001f06, 0, 0, 0 }, 0x1F86},
+ {{SCIM_KEY_dead_iota, 0x1001f07, 0, 0, 0 }, 0x1F87},
+ {{SCIM_KEY_dead_iota, 0x1001f08, 0, 0, 0 }, 0x1F88},
+ {{SCIM_KEY_dead_iota, 0x1001f09, 0, 0, 0 }, 0x1F89},
+ {{SCIM_KEY_dead_iota, 0x1001f0a, 0, 0, 0 }, 0x1F8A},
+ {{SCIM_KEY_dead_iota, 0x1001f0b, 0, 0, 0 }, 0x1F8B},
+ {{SCIM_KEY_dead_iota, 0x1001f0c, 0, 0, 0 }, 0x1F8C},
+ {{SCIM_KEY_dead_iota, 0x1001f0d, 0, 0, 0 }, 0x1F8D},
+ {{SCIM_KEY_dead_iota, 0x1001f0e, 0, 0, 0 }, 0x1F8E},
+ {{SCIM_KEY_dead_iota, 0x1001f0f, 0, 0, 0 }, 0x1F8F},
+ {{SCIM_KEY_dead_iota, 0x1001f20, 0, 0, 0 }, 0x1F90},
+ {{SCIM_KEY_dead_iota, 0x1001f21, 0, 0, 0 }, 0x1F91},
+ {{SCIM_KEY_dead_iota, 0x1001f22, 0, 0, 0 }, 0x1F92},
+ {{SCIM_KEY_dead_iota, 0x1001f23, 0, 0, 0 }, 0x1F93},
+ {{SCIM_KEY_dead_iota, 0x1001f24, 0, 0, 0 }, 0x1F94},
+ {{SCIM_KEY_dead_iota, 0x1001f25, 0, 0, 0 }, 0x1F95},
+ {{SCIM_KEY_dead_iota, 0x1001f26, 0, 0, 0 }, 0x1F96},
+ {{SCIM_KEY_dead_iota, 0x1001f27, 0, 0, 0 }, 0x1F97},
+ {{SCIM_KEY_dead_iota, 0x1001f28, 0, 0, 0 }, 0x1F98},
+ {{SCIM_KEY_dead_iota, 0x1001f29, 0, 0, 0 }, 0x1F99},
+ {{SCIM_KEY_dead_iota, 0x1001f2a, 0, 0, 0 }, 0x1F9A},
+ {{SCIM_KEY_dead_iota, 0x1001f2b, 0, 0, 0 }, 0x1F9B},
+ {{SCIM_KEY_dead_iota, 0x1001f2c, 0, 0, 0 }, 0x1F9C},
+ {{SCIM_KEY_dead_iota, 0x1001f2d, 0, 0, 0 }, 0x1F9D},
+ {{SCIM_KEY_dead_iota, 0x1001f2e, 0, 0, 0 }, 0x1F9E},
+ {{SCIM_KEY_dead_iota, 0x1001f2f, 0, 0, 0 }, 0x1F9F},
+ {{SCIM_KEY_dead_iota, 0x1001f60, 0, 0, 0 }, 0x1FA0},
+ {{SCIM_KEY_dead_iota, 0x1001f61, 0, 0, 0 }, 0x1FA1},
+ {{SCIM_KEY_dead_iota, 0x1001f62, 0, 0, 0 }, 0x1FA2},
+ {{SCIM_KEY_dead_iota, 0x1001f63, 0, 0, 0 }, 0x1FA3},
+ {{SCIM_KEY_dead_iota, 0x1001f64, 0, 0, 0 }, 0x1FA4},
+ {{SCIM_KEY_dead_iota, 0x1001f65, 0, 0, 0 }, 0x1FA5},
+ {{SCIM_KEY_dead_iota, 0x1001f66, 0, 0, 0 }, 0x1FA6},
+ {{SCIM_KEY_dead_iota, 0x1001f67, 0, 0, 0 }, 0x1FA7},
+ {{SCIM_KEY_dead_iota, 0x1001f68, 0, 0, 0 }, 0x1FA8},
+ {{SCIM_KEY_dead_iota, 0x1001f69, 0, 0, 0 }, 0x1FA9},
+ {{SCIM_KEY_dead_iota, 0x1001f6a, 0, 0, 0 }, 0x1FAA},
+ {{SCIM_KEY_dead_iota, 0x1001f6b, 0, 0, 0 }, 0x1FAB},
+ {{SCIM_KEY_dead_iota, 0x1001f6c, 0, 0, 0 }, 0x1FAC},
+ {{SCIM_KEY_dead_iota, 0x1001f6d, 0, 0, 0 }, 0x1FAD},
+ {{SCIM_KEY_dead_iota, 0x1001f6e, 0, 0, 0 }, 0x1FAE},
+ {{SCIM_KEY_dead_iota, 0x1001f6f, 0, 0, 0 }, 0x1FAF},
+ {{SCIM_KEY_dead_iota, 0x1001f70, 0, 0, 0 }, 0x1FB2},
+ {{SCIM_KEY_dead_iota, 0x1001f74, 0, 0, 0 }, 0x1FC2},
+ {{SCIM_KEY_dead_iota, 0x1001f7c, 0, 0, 0 }, 0x1FF2},
+ {{SCIM_KEY_dead_iota, 0x1001fb6, 0, 0, 0 }, 0x1FB7},
+ {{SCIM_KEY_dead_iota, 0x1001fc6, 0, 0, 0 }, 0x1FC7},
+ {{SCIM_KEY_dead_iota, 0x1001ff6, 0, 0, 0 }, 0x1FF7},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_WO, 0, 0, 0 }, 0x30FA},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_U, 0, 0, 0 }, 0x30F4},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_KA, 0, 0, 0 }, 0x30AC},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_KI, 0, 0, 0 }, 0x30AE},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_KU, 0, 0, 0 }, 0x30B0},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_KE, 0, 0, 0 }, 0x30B2},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_KO, 0, 0, 0 }, 0x30B4},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_SA, 0, 0, 0 }, 0x30B6},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_SHI, 0, 0, 0 }, 0x30B8},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_SU, 0, 0, 0 }, 0x30BA},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_SE, 0, 0, 0 }, 0x30BC},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_SO, 0, 0, 0 }, 0x30BE},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_TA, 0, 0, 0 }, 0x30C0},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_CHI, 0, 0, 0 }, 0x30C2},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_TSU, 0, 0, 0 }, 0x30C5},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_TE, 0, 0, 0 }, 0x30C7},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_TO, 0, 0, 0 }, 0x30C9},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_HA, 0, 0, 0 }, 0x30D0},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_HI, 0, 0, 0 }, 0x30D3},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_FU, 0, 0, 0 }, 0x30D6},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_HE, 0, 0, 0 }, 0x30D9},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_HO, 0, 0, 0 }, 0x30DC},
+ {{SCIM_KEY_dead_voiced_sound, SCIM_KEY_kana_WA, 0, 0, 0 }, 0x30F7},
+ {{SCIM_KEY_dead_voiced_sound, 0x1003046, 0, 0, 0 }, 0x3094},
+ {{SCIM_KEY_dead_voiced_sound, 0x100304b, 0, 0, 0 }, 0x304C},
+ {{SCIM_KEY_dead_voiced_sound, 0x100304d, 0, 0, 0 }, 0x304E},
+ {{SCIM_KEY_dead_voiced_sound, 0x100304f, 0, 0, 0 }, 0x3050},
+ {{SCIM_KEY_dead_voiced_sound, 0x1003051, 0, 0, 0 }, 0x3052},
+ {{SCIM_KEY_dead_voiced_sound, 0x1003053, 0, 0, 0 }, 0x3054},
+ {{SCIM_KEY_dead_voiced_sound, 0x1003055, 0, 0, 0 }, 0x3056},
+ {{SCIM_KEY_dead_voiced_sound, 0x1003057, 0, 0, 0 }, 0x3058},
+ {{SCIM_KEY_dead_voiced_sound, 0x1003059, 0, 0, 0 }, 0x305A},
+ {{SCIM_KEY_dead_voiced_sound, 0x100305b, 0, 0, 0 }, 0x305C},
+ {{SCIM_KEY_dead_voiced_sound, 0x100305d, 0, 0, 0 }, 0x305E},
+ {{SCIM_KEY_dead_voiced_sound, 0x100305f, 0, 0, 0 }, 0x3060},
+ {{SCIM_KEY_dead_voiced_sound, 0x1003061, 0, 0, 0 }, 0x3062},
+ {{SCIM_KEY_dead_voiced_sound, 0x1003064, 0, 0, 0 }, 0x3065},
+ {{SCIM_KEY_dead_voiced_sound, 0x1003066, 0, 0, 0 }, 0x3067},
+ {{SCIM_KEY_dead_voiced_sound, 0x1003068, 0, 0, 0 }, 0x3069},
+ {{SCIM_KEY_dead_voiced_sound, 0x100306f, 0, 0, 0 }, 0x3070},
+ {{SCIM_KEY_dead_voiced_sound, 0x1003072, 0, 0, 0 }, 0x3073},
+ {{SCIM_KEY_dead_voiced_sound, 0x1003075, 0, 0, 0 }, 0x3076},
+ {{SCIM_KEY_dead_voiced_sound, 0x1003078, 0, 0, 0 }, 0x3079},
+ {{SCIM_KEY_dead_voiced_sound, 0x100307b, 0, 0, 0 }, 0x307C},
+ {{SCIM_KEY_dead_voiced_sound, 0x100309d, 0, 0, 0 }, 0x309E},
+ {{SCIM_KEY_dead_voiced_sound, 0x10030f0, 0, 0, 0 }, 0x30F8},
+ {{SCIM_KEY_dead_voiced_sound, 0x10030f1, 0, 0, 0 }, 0x30F9},
+ {{SCIM_KEY_dead_voiced_sound, 0x10030fd, 0, 0, 0 }, 0x30FE},
+ {{SCIM_KEY_dead_semivoiced_sound, SCIM_KEY_kana_HA, 0, 0, 0 }, 0x30D1},
+ {{SCIM_KEY_dead_semivoiced_sound, SCIM_KEY_kana_HI, 0, 0, 0 }, 0x30D4},
+ {{SCIM_KEY_dead_semivoiced_sound, SCIM_KEY_kana_FU, 0, 0, 0 }, 0x30D7},
+ {{SCIM_KEY_dead_semivoiced_sound, SCIM_KEY_kana_HE, 0, 0, 0 }, 0x30DA},
+ {{SCIM_KEY_dead_semivoiced_sound, SCIM_KEY_kana_HO, 0, 0, 0 }, 0x30DD},
+ {{SCIM_KEY_dead_semivoiced_sound, 0x100306f, 0, 0, 0 }, 0x3071},
+ {{SCIM_KEY_dead_semivoiced_sound, 0x1003072, 0, 0, 0 }, 0x3074},
+ {{SCIM_KEY_dead_semivoiced_sound, 0x1003075, 0, 0, 0 }, 0x3077},
+ {{SCIM_KEY_dead_semivoiced_sound, 0x1003078, 0, 0, 0 }, 0x307A},
+ {{SCIM_KEY_dead_semivoiced_sound, 0x100307b, 0, 0, 0 }, 0x307D},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_A, 0, 0, 0 }, 0x1EA0},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_B, 0, 0, 0 }, 0x1E04},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_D, 0, 0, 0 }, 0x1E0C},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_E, 0, 0, 0 }, 0x1EB8},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_H, 0, 0, 0 }, 0x1E24},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_I, 0, 0, 0 }, 0x1ECA},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_K, 0, 0, 0 }, 0x1E32},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_L, 0, 0, 0 }, 0x1E36},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_M, 0, 0, 0 }, 0x1E42},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_N, 0, 0, 0 }, 0x1E46},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_O, 0, 0, 0 }, 0x1ECC},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_R, 0, 0, 0 }, 0x1E5A},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_S, 0, 0, 0 }, 0x1E62},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_T, 0, 0, 0 }, 0x1E6C},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_U, 0, 0, 0 }, 0x1EE4},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_V, 0, 0, 0 }, 0x1E7E},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_W, 0, 0, 0 }, 0x1E88},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_Y, 0, 0, 0 }, 0x1EF4},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_Z, 0, 0, 0 }, 0x1E92},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_a, 0, 0, 0 }, 0x1EA1},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_b, 0, 0, 0 }, 0x1E05},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_d, 0, 0, 0 }, 0x1E0D},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_e, 0, 0, 0 }, 0x1EB9},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_h, 0, 0, 0 }, 0x1E25},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_i, 0, 0, 0 }, 0x1ECB},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_k, 0, 0, 0 }, 0x1E33},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_l, 0, 0, 0 }, 0x1E37},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_m, 0, 0, 0 }, 0x1E43},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_n, 0, 0, 0 }, 0x1E47},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_o, 0, 0, 0 }, 0x1ECD},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_r, 0, 0, 0 }, 0x1E5B},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_s, 0, 0, 0 }, 0x1E63},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_t, 0, 0, 0 }, 0x1E6D},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_u, 0, 0, 0 }, 0x1EE5},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_v, 0, 0, 0 }, 0x1E7F},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_w, 0, 0, 0 }, 0x1E89},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_y, 0, 0, 0 }, 0x1EF5},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_z, 0, 0, 0 }, 0x1E93},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_Acircumflex, 0, 0, 0 }, 0x1EAC},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_Ecircumflex, 0, 0, 0 }, 0x1EC6},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_Ocircumflex, 0, 0, 0 }, 0x1ED8},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_acircumflex, 0, 0, 0 }, 0x1EAD},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_ecircumflex, 0, 0, 0 }, 0x1EC7},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_ocircumflex, 0, 0, 0 }, 0x1ED9},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_Abreve, 0, 0, 0 }, 0x1EB6},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_abreve, 0, 0, 0 }, 0x1EB7},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_Ohorn, 0, 0, 0 }, 0x1EE2},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_ohorn, 0, 0, 0 }, 0x1EE3},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_Uhorn, 0, 0, 0 }, 0x1EF0},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_uhorn, 0, 0, 0 }, 0x1EF1},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_dead_horn, SCIM_KEY_O, 0, 0 }, 0x1EE2},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_dead_horn, SCIM_KEY_U, 0, 0 }, 0x1EF0},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_dead_horn, SCIM_KEY_o, 0, 0 }, 0x1EE3},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_dead_horn, SCIM_KEY_u, 0, 0 }, 0x1EF1},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_O, 0 }, 0x1EE2},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_U, 0 }, 0x1EF0},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_o, 0 }, 0x1EE3},
+ {{SCIM_KEY_dead_belowdot, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_u, 0 }, 0x1EF1},
+ {{SCIM_KEY_dead_belowdot, 0x10001a0, 0, 0, 0 }, 0x1EE2},
+ {{SCIM_KEY_dead_belowdot, 0x10001a1, 0, 0, 0 }, 0x1EE3},
+ {{SCIM_KEY_dead_belowdot, 0x10001af, 0, 0, 0 }, 0x1EF0},
+ {{SCIM_KEY_dead_belowdot, 0x10001b0, 0, 0, 0 }, 0x1EF1},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_A, 0, 0, 0 }, 0x1EA2},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_E, 0, 0, 0 }, 0x1EBA},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_I, 0, 0, 0 }, 0x1EC8},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_O, 0, 0, 0 }, 0x1ECE},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_U, 0, 0, 0 }, 0x1EE6},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Y, 0, 0, 0 }, 0x1EF6},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_a, 0, 0, 0 }, 0x1EA3},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_e, 0, 0, 0 }, 0x1EBB},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_i, 0, 0, 0 }, 0x1EC9},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_o, 0, 0, 0 }, 0x1ECF},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_u, 0, 0, 0 }, 0x1EE7},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_y, 0, 0, 0 }, 0x1EF7},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Acircumflex, 0, 0, 0 }, 0x1EA8},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Ecircumflex, 0, 0, 0 }, 0x1EC2},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Ocircumflex, 0, 0, 0 }, 0x1ED4},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_acircumflex, 0, 0, 0 }, 0x1EA9},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_ecircumflex, 0, 0, 0 }, 0x1EC3},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_ocircumflex, 0, 0, 0 }, 0x1ED5},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Abreve, 0, 0, 0 }, 0x1EB2},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_abreve, 0, 0, 0 }, 0x1EB3},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Ohorn, 0, 0, 0 }, 0x1EDE},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_ohorn, 0, 0, 0 }, 0x1EDF},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Uhorn, 0, 0, 0 }, 0x1EEC},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_uhorn, 0, 0, 0 }, 0x1EED},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_dead_circumflex, SCIM_KEY_A, 0, 0 }, 0x1EA8},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_dead_circumflex, SCIM_KEY_E, 0, 0 }, 0x1EC2},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_dead_circumflex, SCIM_KEY_O, 0, 0 }, 0x1ED4},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_dead_circumflex, SCIM_KEY_a, 0, 0 }, 0x1EA9},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_dead_circumflex, SCIM_KEY_e, 0, 0 }, 0x1EC3},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_dead_circumflex, SCIM_KEY_o, 0, 0 }, 0x1ED5},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_dead_breve, SCIM_KEY_A, 0, 0 }, 0x1EB2},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_dead_breve, SCIM_KEY_a, 0, 0 }, 0x1EB3},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_dead_horn, SCIM_KEY_O, 0, 0 }, 0x1EDE},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_dead_horn, SCIM_KEY_U, 0, 0 }, 0x1EEC},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_dead_horn, SCIM_KEY_o, 0, 0 }, 0x1EDF},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_dead_horn, SCIM_KEY_u, 0, 0 }, 0x1EED},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_O, 0 }, 0x1EDE},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_U, 0 }, 0x1EEC},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_o, 0 }, 0x1EDF},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_u, 0 }, 0x1EED},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_A, 0 }, 0x1EB2},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_a, 0 }, 0x1EB3},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_A, 0 }, 0x1EA8},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_E, 0 }, 0x1EC2},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_O, 0 }, 0x1ED4},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_a, 0 }, 0x1EA9},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_e, 0 }, 0x1EC3},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_o, 0 }, 0x1ED5},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_A, 0 }, 0x1EB2},
+ {{SCIM_KEY_dead_hook, SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_a, 0 }, 0x1EB3},
+ {{SCIM_KEY_dead_hook, 0x10001a0, 0, 0, 0 }, 0x1EDE},
+ {{SCIM_KEY_dead_hook, 0x10001a1, 0, 0, 0 }, 0x1EDF},
+ {{SCIM_KEY_dead_hook, 0x10001af, 0, 0, 0 }, 0x1EEC},
+ {{SCIM_KEY_dead_hook, 0x10001b0, 0, 0, 0 }, 0x1EED},
+ {{SCIM_KEY_dead_horn, SCIM_KEY_O, 0, 0, 0 }, 0x01A0},
+ {{SCIM_KEY_dead_horn, SCIM_KEY_U, 0, 0, 0 }, 0x01AF},
+ {{SCIM_KEY_dead_horn, SCIM_KEY_o, 0, 0, 0 }, 0x01A1},
+ {{SCIM_KEY_dead_horn, SCIM_KEY_u, 0, 0, 0 }, 0x01B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_space, SCIM_KEY_space, 0, 0 }, 0x00A0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_space, SCIM_KEY_apostrophe, 0, 0 }, 0x0027},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_space, SCIM_KEY_parenleft, 0, 0 }, 0x02D8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_space, SCIM_KEY_comma, 0, 0 }, 0x00B8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_space, SCIM_KEY_minus, 0, 0 }, 0x007E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_space, SCIM_KEY_period, 0, 0 }, 0x2008},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_space, SCIM_KEY_less, 0, 0 }, 0x02C7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_space, SCIM_KEY_greater, 0, 0 }, 0x005E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_space, SCIM_KEY_asciicircum, 0, 0 }, 0x005E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_space, SCIM_KEY_grave, 0, 0 }, 0x0060},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_space, SCIM_KEY_asciitilde, 0, 0 }, 0x007E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_exclam, 0, 0 }, 0x00A1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_plus, SCIM_KEY_O, 0 }, 0x1EE2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_plus, SCIM_KEY_U, 0 }, 0x1EF0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_plus, SCIM_KEY_o, 0 }, 0x1EE3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_plus, SCIM_KEY_u, 0 }, 0x1EF1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_A, 0, 0 }, 0x1EA0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_B, 0, 0 }, 0x1E04},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_D, 0, 0 }, 0x1E0C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_E, 0, 0 }, 0x1EB8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_H, 0, 0 }, 0x1E24},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_I, 0, 0 }, 0x1ECA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_K, 0, 0 }, 0x1E32},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_L, 0, 0 }, 0x1E36},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_M, 0, 0 }, 0x1E42},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_N, 0, 0 }, 0x1E46},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_O, 0, 0 }, 0x1ECC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_P, 0, 0 }, 0x00B6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_R, 0, 0 }, 0x1E5A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_S, 0, 0 }, 0x1E62},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_T, 0, 0 }, 0x1E6C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_U, 0, 0 }, 0x1EE4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_V, 0, 0 }, 0x1E7E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_W, 0, 0 }, 0x1E88},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_Y, 0, 0 }, 0x1EF4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_Z, 0, 0 }, 0x1E92},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_asciicircum, 0, 0 }, 0x00A6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_a, 0, 0 }, 0x1EA1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_b, 0, 0 }, 0x1E05},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_d, 0, 0 }, 0x1E0D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_e, 0, 0 }, 0x1EB9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_h, 0, 0 }, 0x1E25},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_i, 0, 0 }, 0x1ECB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_k, 0, 0 }, 0x1E33},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_l, 0, 0 }, 0x1E37},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_m, 0, 0 }, 0x1E43},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_n, 0, 0 }, 0x1E47},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_o, 0, 0 }, 0x1ECD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_p, 0, 0 }, 0x00B6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_r, 0, 0 }, 0x1E5B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_s, 0, 0 }, 0x1E63},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_t, 0, 0 }, 0x1E6D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_u, 0, 0 }, 0x1EE5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_v, 0, 0 }, 0x1E7F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_w, 0, 0 }, 0x1E89},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_y, 0, 0 }, 0x1EF5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_z, 0, 0 }, 0x1E93},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_Ohorn, 0, 0 }, 0x1EE2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_ohorn, 0, 0 }, 0x1EE3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_Uhorn, 0, 0 }, 0x1EF0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_uhorn, 0, 0 }, 0x1EF1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_dead_horn, SCIM_KEY_O, 0 }, 0x1EE2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_dead_horn, SCIM_KEY_U, 0 }, 0x1EF0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_dead_horn, SCIM_KEY_o, 0 }, 0x1EE3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_exclam, SCIM_KEY_dead_horn, SCIM_KEY_u, 0 }, 0x1EF1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_quotedbl, 0, 0 }, 0x00A8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_apostrophe, 0, 0 }, 0x0344},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_apostrophe, SCIM_KEY_space, 0 }, 0x0385},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_apostrophe, SCIM_KEY_Greek_iota, 0 }, 0x0390},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_apostrophe, SCIM_KEY_Greek_upsilon, 0 }, 0x03B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_comma, 0, 0 }, 0x201E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_slash, 0, 0 }, 0x301E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_less, 0, 0 }, 0x201C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_greater, 0, 0 }, 0x201D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_A, 0, 0 }, 0x00C4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_E, 0, 0 }, 0x00CB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_H, 0, 0 }, 0x1E26},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_I, 0, 0 }, 0x00CF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_O, 0, 0 }, 0x00D6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_U, 0, 0 }, 0x00DC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_W, 0, 0 }, 0x1E84},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_X, 0, 0 }, 0x1E8C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Y, 0, 0 }, 0x0178},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_backslash, 0, 0 }, 0x301D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_underscore, SCIM_KEY_U, 0 }, 0x1E7A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_underscore, SCIM_KEY_u, 0 }, 0x1E7B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_a, 0, 0 }, 0x00E4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_e, 0, 0 }, 0x00EB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_h, 0, 0 }, 0x1E27},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_i, 0, 0 }, 0x00EF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_o, 0, 0 }, 0x00F6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_t, 0, 0 }, 0x1E97},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_u, 0, 0 }, 0x00FC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_w, 0, 0 }, 0x1E85},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_x, 0, 0 }, 0x1E8D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_y, 0, 0 }, 0x00FF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_asciitilde, SCIM_KEY_O, 0 }, 0x1E4E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_asciitilde, SCIM_KEY_o, 0 }, 0x1E4F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_macron, SCIM_KEY_U, 0 }, 0x1E7A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_macron, SCIM_KEY_u, 0 }, 0x1E7B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_acute, 0, 0 }, 0x0344},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Otilde, 0, 0 }, 0x1E4E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_otilde, 0, 0 }, 0x1E4F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Umacron, 0, 0 }, 0x1E7A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_umacron, 0, 0 }, 0x1E7B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Ukrainian_i, 0, 0 }, 0x0457},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Ukrainian_I, 0, 0 }, 0x0407},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_a, 0, 0 }, 0x04D3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_ie, 0, 0 }, 0x0451},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_i, 0, 0 }, 0x04E5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_o, 0, 0 }, 0x04E7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_u, 0, 0 }, 0x04F1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_zhe, 0, 0 }, 0x04DD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_yeru, 0, 0 }, 0x04F9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_ze, 0, 0 }, 0x04DF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_e, 0, 0 }, 0x04ED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_che, 0, 0 }, 0x04F5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_A, 0, 0 }, 0x04D2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_IE, 0, 0 }, 0x0401},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_I, 0, 0 }, 0x04E4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_O, 0, 0 }, 0x04E6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_U, 0, 0 }, 0x04F0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_ZHE, 0, 0 }, 0x04DC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_YERU, 0, 0 }, 0x04F8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_ZE, 0, 0 }, 0x04DE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_E, 0, 0 }, 0x04EC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Cyrillic_CHE, 0, 0 }, 0x04F4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x03AA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Greek_UPSILON, 0, 0 }, 0x03AB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Greek_iota, 0, 0 }, 0x03CA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x03CB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_combining_tilde, SCIM_KEY_O, 0 }, 0x1E4E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_combining_tilde, SCIM_KEY_o, 0 }, 0x1E4F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_combining_acute, 0, 0 }, 0x0344},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_dead_acute, 0, 0 }, 0x0344},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_dead_tilde, SCIM_KEY_O, 0 }, 0x1E4E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_dead_tilde, SCIM_KEY_o, 0 }, 0x1E4F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_dead_macron, SCIM_KEY_U, 0 }, 0x1E7A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_dead_macron, SCIM_KEY_u, 0 }, 0x1E7B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, 0x10003d2, 0, 0 }, 0x03D4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, 0x10004d8, 0, 0 }, 0x04DA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, 0x10004d9, 0, 0 }, 0x04DB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, 0x10004e8, 0, 0 }, 0x04EA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, 0x10004e9, 0, 0 }, 0x04EB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_numbersign, SCIM_KEY_numbersign, 0, 0 }, 0x266F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_numbersign, SCIM_KEY_b, 0, 0 }, 0x266D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_numbersign, SCIM_KEY_f, 0, 0 }, 0x266E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_percent, SCIM_KEY_o, 0, 0 }, 0x2030},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_space, 0, 0 }, 0x0027},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_quotedbl, SCIM_KEY_space, 0 }, 0x0385},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_quotedbl, SCIM_KEY_I, 0 }, 0x1E2E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_quotedbl, SCIM_KEY_U, 0 }, 0x01D7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_quotedbl, SCIM_KEY_i, 0 }, 0x1E2F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_quotedbl, SCIM_KEY_u, 0 }, 0x01D8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_quotedbl, SCIM_KEY_Greek_iota, 0 }, 0x0390},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_quotedbl, SCIM_KEY_Greek_upsilon, 0 }, 0x03B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_apostrophe, 0, 0 }, 0x00B4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA, 0 }, 0x1F2D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_UPSILON, 0 }, 0x1F5D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha, 0 }, 0x1F05},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_epsilon, 0 }, 0x1F15},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta, 0 }, 0x1F25},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_iota, 0 }, 0x1F35},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_omicron, 0 }, 0x1F45},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_upsilon, 0 }, 0x1F55},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega, 0 }, 0x1F65},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA, 0 }, 0x1F2C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha, 0 }, 0x1F04},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_epsilon, 0 }, 0x1F14},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_eta, 0 }, 0x1F24},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_iota, 0 }, 0x1F34},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_omicron, 0 }, 0x1F44},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_upsilon, 0 }, 0x1F54},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_omega, 0 }, 0x1F64},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_plus, SCIM_KEY_O, 0 }, 0x1EDA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_plus, SCIM_KEY_U, 0 }, 0x1EE8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_plus, SCIM_KEY_o, 0 }, 0x1EDB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_plus, SCIM_KEY_u, 0 }, 0x1EE9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_comma, 0, 0 }, 0x201A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_comma, SCIM_KEY_C, 0 }, 0x1E08},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_comma, SCIM_KEY_c, 0 }, 0x1E09},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_slash, SCIM_KEY_O, 0 }, 0x01FE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_slash, SCIM_KEY_o, 0 }, 0x01FF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_less, 0, 0 }, 0x2018},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_greater, 0, 0 }, 0x2019},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_A, 0, 0 }, 0x00C1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_C, 0, 0 }, 0x0106},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_E, 0, 0 }, 0x00C9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_G, 0, 0 }, 0x01F4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_I, 0, 0 }, 0x00CD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_K, 0, 0 }, 0x1E30},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_L, 0, 0 }, 0x0139},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_M, 0, 0 }, 0x1E3E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_N, 0, 0 }, 0x0143},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_O, 0, 0 }, 0x00D3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_P, 0, 0 }, 0x1E54},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_R, 0, 0 }, 0x0154},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_S, 0, 0 }, 0x015A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_U, 0, 0 }, 0x00DA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_U, SCIM_KEY_A, 0 }, 0x1EAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_U, SCIM_KEY_a, 0 }, 0x1EAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_W, 0, 0 }, 0x1E82},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Y, 0, 0 }, 0x00DD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Z, 0, 0 }, 0x0179},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_asciicircum, SCIM_KEY_A, 0 }, 0x1EA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_asciicircum, SCIM_KEY_E, 0 }, 0x1EBE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_asciicircum, SCIM_KEY_O, 0 }, 0x1ED0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_asciicircum, SCIM_KEY_a, 0 }, 0x1EA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_asciicircum, SCIM_KEY_e, 0 }, 0x1EBF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_asciicircum, SCIM_KEY_o, 0 }, 0x1ED1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_underscore, SCIM_KEY_E, 0 }, 0x1E16},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_underscore, SCIM_KEY_O, 0 }, 0x1E52},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_underscore, SCIM_KEY_e, 0 }, 0x1E17},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_underscore, SCIM_KEY_o, 0 }, 0x1E53},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_a, 0, 0 }, 0x00E1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_b, SCIM_KEY_A, 0 }, 0x1EAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_b, SCIM_KEY_a, 0 }, 0x1EAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_c, 0, 0 }, 0x0107},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_e, 0, 0 }, 0x00E9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_g, 0, 0 }, 0x01F5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_i, 0, 0 }, 0x00ED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_k, 0, 0 }, 0x1E31},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_l, 0, 0 }, 0x013A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_m, 0, 0 }, 0x1E3F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_n, 0, 0 }, 0x0144},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_o, 0, 0 }, 0x00F3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_p, 0, 0 }, 0x1E55},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_r, 0, 0 }, 0x0155},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_s, 0, 0 }, 0x015B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_u, 0, 0 }, 0x00FA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_w, 0, 0 }, 0x1E83},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_y, 0, 0 }, 0x00FD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_z, 0, 0 }, 0x017A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_asciitilde, SCIM_KEY_O, 0 }, 0x1E4C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_asciitilde, SCIM_KEY_U, 0 }, 0x1E78},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_asciitilde, SCIM_KEY_o, 0 }, 0x1E4D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_asciitilde, SCIM_KEY_u, 0 }, 0x1E79},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_macron, SCIM_KEY_E, 0 }, 0x1E16},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_macron, SCIM_KEY_O, 0 }, 0x1E52},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_macron, SCIM_KEY_e, 0 }, 0x1E17},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_macron, SCIM_KEY_o, 0 }, 0x1E53},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Acircumflex, 0, 0 }, 0x1EA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Aring, 0, 0 }, 0x01FA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_AE, 0, 0 }, 0x01FC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Ccedilla, 0, 0 }, 0x1E08},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Ecircumflex, 0, 0 }, 0x1EBE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Idiaeresis, 0, 0 }, 0x1E2E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Ocircumflex, 0, 0 }, 0x1ED0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Otilde, 0, 0 }, 0x1E4C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Ooblique, 0, 0 }, 0x01FE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Udiaeresis, 0, 0 }, 0x01D7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_acircumflex, 0, 0 }, 0x1EA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_aring, 0, 0 }, 0x01FB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_ae, 0, 0 }, 0x01FD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_ccedilla, 0, 0 }, 0x1E09},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_ecircumflex, 0, 0 }, 0x1EBF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_idiaeresis, 0, 0 }, 0x1E2F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_ocircumflex, 0, 0 }, 0x1ED1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_otilde, 0, 0 }, 0x1E4D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_oslash, 0, 0 }, 0x01FF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_udiaeresis, 0, 0 }, 0x01D8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Abreve, 0, 0 }, 0x1EAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_abreve, 0, 0 }, 0x1EAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Emacron, 0, 0 }, 0x1E16},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_emacron, 0, 0 }, 0x1E17},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Omacron, 0, 0 }, 0x1E52},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Utilde, 0, 0 }, 0x1E78},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_omacron, 0, 0 }, 0x1E53},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_utilde, 0, 0 }, 0x1E79},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Cyrillic_ghe, 0, 0 }, 0x0453},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Cyrillic_ka, 0, 0 }, 0x045C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Cyrillic_GHE, 0, 0 }, 0x0403},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Cyrillic_KA, 0, 0 }, 0x040C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_iotadieresis, 0, 0 }, 0x0390},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_upsilondieresis, 0, 0 }, 0x03B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x0386},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_EPSILON, 0, 0 }, 0x0388},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_ETA, 0, 0 }, 0x0389},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x038A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_OMICRON, 0, 0 }, 0x038C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_UPSILON, 0, 0 }, 0x038E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x038F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_alpha, 0, 0 }, 0x03AC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_epsilon, 0, 0 }, 0x03AD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_eta, 0, 0 }, 0x03AE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_iota, 0, 0 }, 0x03AF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_omicron, 0, 0 }, 0x03CC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x03CD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Greek_omega, 0, 0 }, 0x03CE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_combining_tilde, SCIM_KEY_O, 0 }, 0x1E4C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_combining_tilde, SCIM_KEY_U, 0 }, 0x1E78},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_combining_tilde, SCIM_KEY_o, 0 }, 0x1E4D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_combining_tilde, SCIM_KEY_u, 0 }, 0x1E79},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Ohorn, 0, 0 }, 0x1EDA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_ohorn, 0, 0 }, 0x1EDB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_Uhorn, 0, 0 }, 0x1EE8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_uhorn, 0, 0 }, 0x1EE9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_circumflex, SCIM_KEY_A, 0 }, 0x1EA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_circumflex, SCIM_KEY_E, 0 }, 0x1EBE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_circumflex, SCIM_KEY_O, 0 }, 0x1ED0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_circumflex, SCIM_KEY_a, 0 }, 0x1EA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_circumflex, SCIM_KEY_e, 0 }, 0x1EBF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_circumflex, SCIM_KEY_o, 0 }, 0x1ED1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_tilde, SCIM_KEY_O, 0 }, 0x1E4C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_tilde, SCIM_KEY_U, 0 }, 0x1E78},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_tilde, SCIM_KEY_o, 0 }, 0x1E4D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_tilde, SCIM_KEY_u, 0 }, 0x1E79},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_macron, SCIM_KEY_E, 0 }, 0x1E16},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_macron, SCIM_KEY_O, 0 }, 0x1E52},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_macron, SCIM_KEY_e, 0 }, 0x1E17},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_macron, SCIM_KEY_o, 0 }, 0x1E53},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_breve, SCIM_KEY_A, 0 }, 0x1EAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_breve, SCIM_KEY_a, 0 }, 0x1EAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_diaeresis, SCIM_KEY_I, 0 }, 0x1E2E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_diaeresis, SCIM_KEY_U, 0 }, 0x01D7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_diaeresis, SCIM_KEY_i, 0 }, 0x1E2F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_diaeresis, SCIM_KEY_u, 0 }, 0x01D8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_iota, 0 }, 0x0390},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_upsilon, 0 }, 0x03B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_abovering, SCIM_KEY_A, 0 }, 0x01FA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_abovering, SCIM_KEY_a, 0 }, 0x01FB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_cedilla, SCIM_KEY_C, 0 }, 0x1E08},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_cedilla, SCIM_KEY_c, 0 }, 0x1E09},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_horn, SCIM_KEY_O, 0 }, 0x1EDA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_horn, SCIM_KEY_U, 0 }, 0x1EE8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_horn, SCIM_KEY_o, 0 }, 0x1EDB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_dead_horn, SCIM_KEY_u, 0 }, 0x1EE9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_KP_Divide, SCIM_KEY_O, 0 }, 0x01FE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, SCIM_KEY_KP_Divide, SCIM_KEY_o, 0 }, 0x01FF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_ETA, 0 }, 0x1F2C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_alpha, 0 }, 0x1F04},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_epsilon, 0 }, 0x1F14},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_eta, 0 }, 0x1F24},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_iota, 0 }, 0x1F34},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_omicron, 0 }, 0x1F44},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_upsilon, 0 }, 0x1F54},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_omega, 0 }, 0x1F64},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_ETA, 0 }, 0x1F2D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_UPSILON, 0 }, 0x1F5D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_alpha, 0 }, 0x1F05},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_epsilon, 0 }, 0x1F15},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_eta, 0 }, 0x1F25},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_iota, 0 }, 0x1F35},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_omicron, 0 }, 0x1F45},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_upsilon, 0 }, 0x1F55},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_omega, 0 }, 0x1F65},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x10003d2, 0, 0 }, 0x03D3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f00, 0, 0 }, 0x1F04},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f01, 0, 0 }, 0x1F05},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f08, 0, 0 }, 0x1F0C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f09, 0, 0 }, 0x1F0D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f10, 0, 0 }, 0x1F14},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f11, 0, 0 }, 0x1F15},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f18, 0, 0 }, 0x1F1C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f19, 0, 0 }, 0x1F1D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f20, 0, 0 }, 0x1F24},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f21, 0, 0 }, 0x1F25},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f28, 0, 0 }, 0x1F2C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f29, 0, 0 }, 0x1F2D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f30, 0, 0 }, 0x1F34},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f31, 0, 0 }, 0x1F35},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f38, 0, 0 }, 0x1F3C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f39, 0, 0 }, 0x1F3D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f40, 0, 0 }, 0x1F44},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f41, 0, 0 }, 0x1F45},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f48, 0, 0 }, 0x1F4C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f49, 0, 0 }, 0x1F4D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f50, 0, 0 }, 0x1F54},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f51, 0, 0 }, 0x1F55},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f59, 0, 0 }, 0x1F5D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f60, 0, 0 }, 0x1F64},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f61, 0, 0 }, 0x1F65},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f68, 0, 0 }, 0x1F6C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_apostrophe, 0x1001f69, 0, 0 }, 0x1F6D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_space, 0, 0 }, 0x02D8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_parenleft, 0, 0 }, 0x005B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_minus, 0, 0 }, 0x007B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_0, SCIM_KEY_parenright, 0 }, 0x24EA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_parenright, 0 }, 0x2460},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_0, SCIM_KEY_parenright }, 0x2469},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_1, SCIM_KEY_parenright }, 0x246A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_2, SCIM_KEY_parenright }, 0x246B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_3, SCIM_KEY_parenright }, 0x246C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_4, SCIM_KEY_parenright }, 0x246D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_5, SCIM_KEY_parenright }, 0x246E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_6, SCIM_KEY_parenright }, 0x246F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_7, SCIM_KEY_parenright }, 0x2470},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_8, SCIM_KEY_parenright }, 0x2471},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_9, SCIM_KEY_parenright }, 0x2472},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_KP_Space, SCIM_KEY_parenright }, 0x246B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_KP_0, SCIM_KEY_parenright }, 0x2469},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_KP_1, SCIM_KEY_parenright }, 0x246A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_KP_2, SCIM_KEY_parenright }, 0x246B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_KP_3, SCIM_KEY_parenright }, 0x246C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_KP_4, SCIM_KEY_parenright }, 0x246D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_KP_5, SCIM_KEY_parenright }, 0x246E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_KP_6, SCIM_KEY_parenright }, 0x246F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_KP_7, SCIM_KEY_parenright }, 0x2470},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_KP_8, SCIM_KEY_parenright }, 0x2471},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_1, SCIM_KEY_KP_9, SCIM_KEY_parenright }, 0x2472},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_parenright, 0 }, 0x2461},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_0, SCIM_KEY_parenright }, 0x2473},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_1, SCIM_KEY_parenright }, 0x3251},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_2, SCIM_KEY_parenright }, 0x3252},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_3, SCIM_KEY_parenright }, 0x3253},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_4, SCIM_KEY_parenright }, 0x3254},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_5, SCIM_KEY_parenright }, 0x3255},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_6, SCIM_KEY_parenright }, 0x3256},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_7, SCIM_KEY_parenright }, 0x3257},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_8, SCIM_KEY_parenright }, 0x3258},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_9, SCIM_KEY_parenright }, 0x3259},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_KP_Space, SCIM_KEY_parenright }, 0x3252},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_KP_0, SCIM_KEY_parenright }, 0x2473},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_KP_1, SCIM_KEY_parenright }, 0x3251},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_KP_2, SCIM_KEY_parenright }, 0x3252},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_KP_3, SCIM_KEY_parenright }, 0x3253},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_KP_4, SCIM_KEY_parenright }, 0x3254},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_KP_5, SCIM_KEY_parenright }, 0x3255},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_KP_6, SCIM_KEY_parenright }, 0x3256},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_KP_7, SCIM_KEY_parenright }, 0x3257},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_KP_8, SCIM_KEY_parenright }, 0x3258},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_2, SCIM_KEY_KP_9, SCIM_KEY_parenright }, 0x3259},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_parenright, 0 }, 0x2462},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_0, SCIM_KEY_parenright }, 0x325A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_1, SCIM_KEY_parenright }, 0x325B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_2, SCIM_KEY_parenright }, 0x325C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_3, SCIM_KEY_parenright }, 0x325D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_4, SCIM_KEY_parenright }, 0x325E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_5, SCIM_KEY_parenright }, 0x325F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_6, SCIM_KEY_parenright }, 0x32B1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_7, SCIM_KEY_parenright }, 0x32B2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_8, SCIM_KEY_parenright }, 0x32B3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_9, SCIM_KEY_parenright }, 0x32B4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_KP_Space, SCIM_KEY_parenright }, 0x325C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_KP_0, SCIM_KEY_parenright }, 0x325A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_KP_1, SCIM_KEY_parenright }, 0x325B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_KP_2, SCIM_KEY_parenright }, 0x325C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_KP_3, SCIM_KEY_parenright }, 0x325D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_KP_4, SCIM_KEY_parenright }, 0x325E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_KP_5, SCIM_KEY_parenright }, 0x325F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_KP_6, SCIM_KEY_parenright }, 0x32B1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_KP_7, SCIM_KEY_parenright }, 0x32B2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_KP_8, SCIM_KEY_parenright }, 0x32B3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_3, SCIM_KEY_KP_9, SCIM_KEY_parenright }, 0x32B4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_parenright, 0 }, 0x2463},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_0, SCIM_KEY_parenright }, 0x32B5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_1, SCIM_KEY_parenright }, 0x32B6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_2, SCIM_KEY_parenright }, 0x32B7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_3, SCIM_KEY_parenright }, 0x32B8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_4, SCIM_KEY_parenright }, 0x32B9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_5, SCIM_KEY_parenright }, 0x32BA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_6, SCIM_KEY_parenright }, 0x32BB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_7, SCIM_KEY_parenright }, 0x32BC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_8, SCIM_KEY_parenright }, 0x32BD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_9, SCIM_KEY_parenright }, 0x32BE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_KP_Space, SCIM_KEY_parenright }, 0x32B7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_KP_0, SCIM_KEY_parenright }, 0x32B5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_KP_1, SCIM_KEY_parenright }, 0x32B6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_KP_2, SCIM_KEY_parenright }, 0x32B7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_KP_3, SCIM_KEY_parenright }, 0x32B8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_KP_4, SCIM_KEY_parenright }, 0x32B9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_KP_5, SCIM_KEY_parenright }, 0x32BA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_KP_6, SCIM_KEY_parenright }, 0x32BB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_KP_7, SCIM_KEY_parenright }, 0x32BC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_KP_8, SCIM_KEY_parenright }, 0x32BD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_4, SCIM_KEY_KP_9, SCIM_KEY_parenright }, 0x32BE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_5, SCIM_KEY_parenright, 0 }, 0x2464},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_5, SCIM_KEY_0, SCIM_KEY_parenright }, 0x32BF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_5, SCIM_KEY_KP_0, SCIM_KEY_parenright }, 0x32BF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_6, SCIM_KEY_parenright, 0 }, 0x2465},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_7, SCIM_KEY_parenright, 0 }, 0x2466},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_8, SCIM_KEY_parenright, 0 }, 0x2467},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_9, SCIM_KEY_parenright, 0 }, 0x2468},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_A, 0, 0 }, 0x0102},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_A, SCIM_KEY_parenright, 0 }, 0x24B6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_B, SCIM_KEY_parenright, 0 }, 0x24B7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_C, SCIM_KEY_parenright, 0 }, 0x24B8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_D, SCIM_KEY_parenright, 0 }, 0x24B9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_E, SCIM_KEY_parenright, 0 }, 0x24BA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_F, SCIM_KEY_parenright, 0 }, 0x24BB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_G, 0, 0 }, 0x011E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_G, SCIM_KEY_parenright, 0 }, 0x24BC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_H, SCIM_KEY_parenright, 0 }, 0x24BD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_I, SCIM_KEY_parenright, 0 }, 0x24BE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_J, SCIM_KEY_parenright, 0 }, 0x24BF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_K, SCIM_KEY_parenright, 0 }, 0x24C0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_L, SCIM_KEY_parenright, 0 }, 0x24C1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_M, SCIM_KEY_parenright, 0 }, 0x24C2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_N, SCIM_KEY_parenright, 0 }, 0x24C3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_O, SCIM_KEY_parenright, 0 }, 0x24C4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_P, SCIM_KEY_parenright, 0 }, 0x24C5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Q, SCIM_KEY_parenright, 0 }, 0x24C6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_R, SCIM_KEY_parenright, 0 }, 0x24C7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_S, SCIM_KEY_parenright, 0 }, 0x24C8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_T, SCIM_KEY_parenright, 0 }, 0x24C9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_U, SCIM_KEY_parenright, 0 }, 0x24CA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_V, SCIM_KEY_parenright, 0 }, 0x24CB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_W, SCIM_KEY_parenright, 0 }, 0x24CC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_X, SCIM_KEY_parenright, 0 }, 0x24CD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Y, SCIM_KEY_parenright, 0 }, 0x24CE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Z, SCIM_KEY_parenright, 0 }, 0x24CF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_a, 0, 0 }, 0x0103},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_a, SCIM_KEY_parenright, 0 }, 0x24D0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_b, SCIM_KEY_parenright, 0 }, 0x24D1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_c, 0, 0 }, 0x00A9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_c, SCIM_KEY_parenright, 0 }, 0x24D2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_d, SCIM_KEY_parenright, 0 }, 0x24D3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_e, SCIM_KEY_parenright, 0 }, 0x24D4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_f, SCIM_KEY_parenright, 0 }, 0x24D5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_g, 0, 0 }, 0x011F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_g, SCIM_KEY_parenright, 0 }, 0x24D6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_h, SCIM_KEY_parenright, 0 }, 0x24D7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_i, SCIM_KEY_parenright, 0 }, 0x24D8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_j, SCIM_KEY_parenright, 0 }, 0x24D9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_k, SCIM_KEY_parenright, 0 }, 0x24DA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_l, SCIM_KEY_parenright, 0 }, 0x24DB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_m, SCIM_KEY_parenright, 0 }, 0x24DC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_n, SCIM_KEY_parenright, 0 }, 0x24DD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_o, SCIM_KEY_parenright, 0 }, 0x24DE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_p, SCIM_KEY_parenright, 0 }, 0x24DF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_q, SCIM_KEY_parenright, 0 }, 0x24E0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_r, 0, 0 }, 0x00AE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_r, SCIM_KEY_parenright, 0 }, 0x24E1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_s, SCIM_KEY_parenright, 0 }, 0x24E2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_t, SCIM_KEY_parenright, 0 }, 0x24E3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_u, SCIM_KEY_parenright, 0 }, 0x24E4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_v, SCIM_KEY_parenright, 0 }, 0x24E5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_w, SCIM_KEY_parenright, 0 }, 0x24E6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_x, SCIM_KEY_parenright, 0 }, 0x24E7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_y, SCIM_KEY_parenright, 0 }, 0x24E8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_z, SCIM_KEY_parenright, 0 }, 0x24E9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_WO, SCIM_KEY_parenright, 0 }, 0x32FE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_A, SCIM_KEY_parenright, 0 }, 0x32D0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_I, SCIM_KEY_parenright, 0 }, 0x32D1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_U, SCIM_KEY_parenright, 0 }, 0x32D2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_E, SCIM_KEY_parenright, 0 }, 0x32D3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_O, SCIM_KEY_parenright, 0 }, 0x32D4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_KA, SCIM_KEY_parenright, 0 }, 0x32D5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_KI, SCIM_KEY_parenright, 0 }, 0x32D6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_KU, SCIM_KEY_parenright, 0 }, 0x32D7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_KE, SCIM_KEY_parenright, 0 }, 0x32D8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_KO, SCIM_KEY_parenright, 0 }, 0x32D9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_SA, SCIM_KEY_parenright, 0 }, 0x32DA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_SHI, SCIM_KEY_parenright, 0 }, 0x32DB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_SU, SCIM_KEY_parenright, 0 }, 0x32DC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_SE, SCIM_KEY_parenright, 0 }, 0x32DD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_SO, SCIM_KEY_parenright, 0 }, 0x32DE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_TA, SCIM_KEY_parenright, 0 }, 0x32DF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_CHI, SCIM_KEY_parenright, 0 }, 0x32E0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_TSU, SCIM_KEY_parenright, 0 }, 0x32E1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_TE, SCIM_KEY_parenright, 0 }, 0x32E2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_TO, SCIM_KEY_parenright, 0 }, 0x32E3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_NA, SCIM_KEY_parenright, 0 }, 0x32E4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_NI, SCIM_KEY_parenright, 0 }, 0x32E5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_NU, SCIM_KEY_parenright, 0 }, 0x32E6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_NE, SCIM_KEY_parenright, 0 }, 0x32E7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_NO, SCIM_KEY_parenright, 0 }, 0x32E8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_HA, SCIM_KEY_parenright, 0 }, 0x32E9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_HI, SCIM_KEY_parenright, 0 }, 0x32EA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_FU, SCIM_KEY_parenright, 0 }, 0x32EB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_HE, SCIM_KEY_parenright, 0 }, 0x32EC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_HO, SCIM_KEY_parenright, 0 }, 0x32ED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_MA, SCIM_KEY_parenright, 0 }, 0x32EE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_MI, SCIM_KEY_parenright, 0 }, 0x32EF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_MU, SCIM_KEY_parenright, 0 }, 0x32F0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_ME, SCIM_KEY_parenright, 0 }, 0x32F1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_MO, SCIM_KEY_parenright, 0 }, 0x32F2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_YA, SCIM_KEY_parenright, 0 }, 0x32F3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_YU, SCIM_KEY_parenright, 0 }, 0x32F4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_YO, SCIM_KEY_parenright, 0 }, 0x32F5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_RA, SCIM_KEY_parenright, 0 }, 0x32F6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_RI, SCIM_KEY_parenright, 0 }, 0x32F7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_RU, SCIM_KEY_parenright, 0 }, 0x32F8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_RE, SCIM_KEY_parenright, 0 }, 0x32F9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_RO, SCIM_KEY_parenright, 0 }, 0x32FA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_kana_WA, SCIM_KEY_parenright, 0 }, 0x32FB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1F09},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_EPSILON, 0, 0 }, 0x1F19},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1F29},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1F39},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMICRON, 0, 0 }, 0x1F49},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_RHO, 0, 0 }, 0x1FEC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_UPSILON, 0, 0 }, 0x1F59},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1F69},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1F01},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_epsilon, 0, 0 }, 0x1F11},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta, 0, 0 }, 0x1F21},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_iota, 0, 0 }, 0x1F31},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omicron, 0, 0 }, 0x1F41},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_rho, 0, 0 }, 0x1FE5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1F51},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega, 0, 0 }, 0x1F61},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_parenright, 0 }, 0x2461},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_0, SCIM_KEY_parenright }, 0x2473},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_1, SCIM_KEY_parenright }, 0x3251},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_2, SCIM_KEY_parenright }, 0x3252},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_3, SCIM_KEY_parenright }, 0x3253},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_4, SCIM_KEY_parenright }, 0x3254},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_5, SCIM_KEY_parenright }, 0x3255},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_6, SCIM_KEY_parenright }, 0x3256},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_7, SCIM_KEY_parenright }, 0x3257},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_8, SCIM_KEY_parenright }, 0x3258},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_9, SCIM_KEY_parenright }, 0x3259},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_KP_Space, SCIM_KEY_parenright }, 0x3252},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_KP_0, SCIM_KEY_parenright }, 0x2473},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_KP_1, SCIM_KEY_parenright }, 0x3251},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_KP_2, SCIM_KEY_parenright }, 0x3252},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_KP_3, SCIM_KEY_parenright }, 0x3253},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_KP_4, SCIM_KEY_parenright }, 0x3254},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_KP_5, SCIM_KEY_parenright }, 0x3255},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_KP_6, SCIM_KEY_parenright }, 0x3256},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_KP_7, SCIM_KEY_parenright }, 0x3257},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_KP_8, SCIM_KEY_parenright }, 0x3258},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_Space, SCIM_KEY_KP_9, SCIM_KEY_parenright }, 0x3259},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_0, SCIM_KEY_parenright, 0 }, 0x24EA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_parenright, 0 }, 0x2460},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_0, SCIM_KEY_parenright }, 0x2469},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_1, SCIM_KEY_parenright }, 0x246A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_2, SCIM_KEY_parenright }, 0x246B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_3, SCIM_KEY_parenright }, 0x246C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_4, SCIM_KEY_parenright }, 0x246D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_5, SCIM_KEY_parenright }, 0x246E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_6, SCIM_KEY_parenright }, 0x246F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_7, SCIM_KEY_parenright }, 0x2470},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_8, SCIM_KEY_parenright }, 0x2471},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_9, SCIM_KEY_parenright }, 0x2472},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_KP_Space, SCIM_KEY_parenright }, 0x246B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_KP_0, SCIM_KEY_parenright }, 0x2469},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_KP_1, SCIM_KEY_parenright }, 0x246A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_KP_2, SCIM_KEY_parenright }, 0x246B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_KP_3, SCIM_KEY_parenright }, 0x246C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_KP_4, SCIM_KEY_parenright }, 0x246D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_KP_5, SCIM_KEY_parenright }, 0x246E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_KP_6, SCIM_KEY_parenright }, 0x246F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_KP_7, SCIM_KEY_parenright }, 0x2470},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_KP_8, SCIM_KEY_parenright }, 0x2471},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_1, SCIM_KEY_KP_9, SCIM_KEY_parenright }, 0x2472},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_parenright, 0 }, 0x2461},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_0, SCIM_KEY_parenright }, 0x2473},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_1, SCIM_KEY_parenright }, 0x3251},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_2, SCIM_KEY_parenright }, 0x3252},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_3, SCIM_KEY_parenright }, 0x3253},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_4, SCIM_KEY_parenright }, 0x3254},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_5, SCIM_KEY_parenright }, 0x3255},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_6, SCIM_KEY_parenright }, 0x3256},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_7, SCIM_KEY_parenright }, 0x3257},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_8, SCIM_KEY_parenright }, 0x3258},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_9, SCIM_KEY_parenright }, 0x3259},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_KP_Space, SCIM_KEY_parenright }, 0x3252},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_KP_0, SCIM_KEY_parenright }, 0x2473},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_KP_1, SCIM_KEY_parenright }, 0x3251},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_KP_2, SCIM_KEY_parenright }, 0x3252},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_KP_3, SCIM_KEY_parenright }, 0x3253},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_KP_4, SCIM_KEY_parenright }, 0x3254},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_KP_5, SCIM_KEY_parenright }, 0x3255},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_KP_6, SCIM_KEY_parenright }, 0x3256},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_KP_7, SCIM_KEY_parenright }, 0x3257},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_KP_8, SCIM_KEY_parenright }, 0x3258},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_2, SCIM_KEY_KP_9, SCIM_KEY_parenright }, 0x3259},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_parenright, 0 }, 0x2462},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_0, SCIM_KEY_parenright }, 0x325A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_1, SCIM_KEY_parenright }, 0x325B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_2, SCIM_KEY_parenright }, 0x325C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_3, SCIM_KEY_parenright }, 0x325D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_4, SCIM_KEY_parenright }, 0x325E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_5, SCIM_KEY_parenright }, 0x325F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_6, SCIM_KEY_parenright }, 0x32B1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_7, SCIM_KEY_parenright }, 0x32B2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_8, SCIM_KEY_parenright }, 0x32B3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_9, SCIM_KEY_parenright }, 0x32B4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_KP_Space, SCIM_KEY_parenright }, 0x325C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_KP_0, SCIM_KEY_parenright }, 0x325A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_KP_1, SCIM_KEY_parenright }, 0x325B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_KP_2, SCIM_KEY_parenright }, 0x325C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_KP_3, SCIM_KEY_parenright }, 0x325D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_KP_4, SCIM_KEY_parenright }, 0x325E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_KP_5, SCIM_KEY_parenright }, 0x325F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_KP_6, SCIM_KEY_parenright }, 0x32B1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_KP_7, SCIM_KEY_parenright }, 0x32B2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_KP_8, SCIM_KEY_parenright }, 0x32B3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_3, SCIM_KEY_KP_9, SCIM_KEY_parenright }, 0x32B4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_parenright, 0 }, 0x2463},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_0, SCIM_KEY_parenright }, 0x32B5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_1, SCIM_KEY_parenright }, 0x32B6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_2, SCIM_KEY_parenright }, 0x32B7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_3, SCIM_KEY_parenright }, 0x32B8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_4, SCIM_KEY_parenright }, 0x32B9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_5, SCIM_KEY_parenright }, 0x32BA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_6, SCIM_KEY_parenright }, 0x32BB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_7, SCIM_KEY_parenright }, 0x32BC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_8, SCIM_KEY_parenright }, 0x32BD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_9, SCIM_KEY_parenright }, 0x32BE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_KP_Space, SCIM_KEY_parenright }, 0x32B7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_KP_0, SCIM_KEY_parenright }, 0x32B5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_KP_1, SCIM_KEY_parenright }, 0x32B6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_KP_2, SCIM_KEY_parenright }, 0x32B7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_KP_3, SCIM_KEY_parenright }, 0x32B8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_KP_4, SCIM_KEY_parenright }, 0x32B9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_KP_5, SCIM_KEY_parenright }, 0x32BA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_KP_6, SCIM_KEY_parenright }, 0x32BB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_KP_7, SCIM_KEY_parenright }, 0x32BC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_KP_8, SCIM_KEY_parenright }, 0x32BD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_4, SCIM_KEY_KP_9, SCIM_KEY_parenright }, 0x32BE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_5, SCIM_KEY_parenright, 0 }, 0x2464},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_5, SCIM_KEY_0, SCIM_KEY_parenright }, 0x32BF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_5, SCIM_KEY_KP_0, SCIM_KEY_parenright }, 0x32BF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_6, SCIM_KEY_parenright, 0 }, 0x2465},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_7, SCIM_KEY_parenright, 0 }, 0x2466},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_8, SCIM_KEY_parenright, 0 }, 0x2467},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_KP_9, SCIM_KEY_parenright, 0 }, 0x2468},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001100, SCIM_KEY_parenright, 0 }, 0x3260},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001100, 0x1001161, SCIM_KEY_parenright }, 0x326E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001102, SCIM_KEY_parenright, 0 }, 0x3261},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001102, 0x1001161, SCIM_KEY_parenright }, 0x326F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001103, SCIM_KEY_parenright, 0 }, 0x3262},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001103, 0x1001161, SCIM_KEY_parenright }, 0x3270},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001105, SCIM_KEY_parenright, 0 }, 0x3263},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001105, 0x1001161, SCIM_KEY_parenright }, 0x3271},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001106, SCIM_KEY_parenright, 0 }, 0x3264},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001106, 0x1001161, SCIM_KEY_parenright }, 0x3272},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001107, SCIM_KEY_parenright, 0 }, 0x3265},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001107, 0x1001161, SCIM_KEY_parenright }, 0x3273},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001109, SCIM_KEY_parenright, 0 }, 0x3266},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001109, 0x1001161, SCIM_KEY_parenright }, 0x3274},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100110b, SCIM_KEY_parenright, 0 }, 0x3267},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100110b, 0x1001161, SCIM_KEY_parenright }, 0x3275},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100110c, SCIM_KEY_parenright, 0 }, 0x3268},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100110c, 0x1001161, SCIM_KEY_parenright }, 0x3276},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100110e, SCIM_KEY_parenright, 0 }, 0x3269},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100110e, 0x1001161, SCIM_KEY_parenright }, 0x3277},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100110f, SCIM_KEY_parenright, 0 }, 0x326A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100110f, 0x1001161, SCIM_KEY_parenright }, 0x3278},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001110, SCIM_KEY_parenright, 0 }, 0x326B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001110, 0x1001161, SCIM_KEY_parenright }, 0x3279},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001111, SCIM_KEY_parenright, 0 }, 0x326C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001111, 0x1001161, SCIM_KEY_parenright }, 0x327A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001112, SCIM_KEY_parenright, 0 }, 0x326D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1001112, 0x1001161, SCIM_KEY_parenright }, 0x327B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x10030f0, SCIM_KEY_parenright, 0 }, 0x32FC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x10030f1, SCIM_KEY_parenright, 0 }, 0x32FD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1004e00, SCIM_KEY_parenright, 0 }, 0x3280},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1004e03, SCIM_KEY_parenright, 0 }, 0x3286},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1004e09, SCIM_KEY_parenright, 0 }, 0x3282},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1004e0a, SCIM_KEY_parenright, 0 }, 0x32A4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1004e0b, SCIM_KEY_parenright, 0 }, 0x32A6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1004e2d, SCIM_KEY_parenright, 0 }, 0x32A5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1004e5d, SCIM_KEY_parenright, 0 }, 0x3288},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1004e8c, SCIM_KEY_parenright, 0 }, 0x3281},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1004e94, SCIM_KEY_parenright, 0 }, 0x3284},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1004f01, SCIM_KEY_parenright, 0 }, 0x32AD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1004f11, SCIM_KEY_parenright, 0 }, 0x32A1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100512a, SCIM_KEY_parenright, 0 }, 0x329D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100516b, SCIM_KEY_parenright, 0 }, 0x3287},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100516d, SCIM_KEY_parenright, 0 }, 0x3285},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1005199, SCIM_KEY_parenright, 0 }, 0x32A2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x10052b4, SCIM_KEY_parenright, 0 }, 0x3298},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100533b, SCIM_KEY_parenright, 0 }, 0x32A9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1005341, SCIM_KEY_parenright, 0 }, 0x3289},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1005354, SCIM_KEY_parenright, 0 }, 0x32AF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1005370, SCIM_KEY_parenright, 0 }, 0x329E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x10053f3, SCIM_KEY_parenright, 0 }, 0x32A8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100540d, SCIM_KEY_parenright, 0 }, 0x3294},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x10056db, SCIM_KEY_parenright, 0 }, 0x3283},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100571f, SCIM_KEY_parenright, 0 }, 0x328F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100591c, SCIM_KEY_parenright, 0 }, 0x32B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1005973, SCIM_KEY_parenright, 0 }, 0x329B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1005b66, SCIM_KEY_parenright, 0 }, 0x32AB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1005b97, SCIM_KEY_parenright, 0 }, 0x32AA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1005de6, SCIM_KEY_parenright, 0 }, 0x32A7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x10065e5, SCIM_KEY_parenright, 0 }, 0x3290},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1006708, SCIM_KEY_parenright, 0 }, 0x328A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1006709, SCIM_KEY_parenright, 0 }, 0x3292},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1006728, SCIM_KEY_parenright, 0 }, 0x328D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100682a, SCIM_KEY_parenright, 0 }, 0x3291},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1006b63, SCIM_KEY_parenright, 0 }, 0x32A3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1006c34, SCIM_KEY_parenright, 0 }, 0x328C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1006ce8, SCIM_KEY_parenright, 0 }, 0x329F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100706b, SCIM_KEY_parenright, 0 }, 0x328B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1007279, SCIM_KEY_parenright, 0 }, 0x3295},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1007537, SCIM_KEY_parenright, 0 }, 0x329A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x10076e3, SCIM_KEY_parenright, 0 }, 0x32AC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100793e, SCIM_KEY_parenright, 0 }, 0x3293},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x100795d, SCIM_KEY_parenright, 0 }, 0x3297},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x10079d8, SCIM_KEY_parenright, 0 }, 0x3299},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1008ca1, SCIM_KEY_parenright, 0 }, 0x3296},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1008cc7, SCIM_KEY_parenright, 0 }, 0x32AE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1009069, SCIM_KEY_parenright, 0 }, 0x329C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x10091d1, SCIM_KEY_parenright, 0 }, 0x328E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenleft, 0x1009805, SCIM_KEY_parenright, 0 }, 0x32A0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_parenright, 0, 0 }, 0x005D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_minus, 0, 0 }, 0x007D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1F08},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_EPSILON, 0, 0 }, 0x1F18},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1F28},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1F38},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMICRON, 0, 0 }, 0x1F48},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1F68},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1F00},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_epsilon, 0, 0 }, 0x1F10},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_eta, 0, 0 }, 0x1F20},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_iota, 0, 0 }, 0x1F30},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omicron, 0, 0 }, 0x1F40},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_rho, 0, 0 }, 0x1FE4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1F50},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omega, 0, 0 }, 0x1F60},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asterisk, SCIM_KEY_0, 0, 0 }, 0x00B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asterisk, SCIM_KEY_A, 0, 0 }, 0x00C5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asterisk, SCIM_KEY_U, 0, 0 }, 0x016E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asterisk, SCIM_KEY_a, 0, 0 }, 0x00E5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asterisk, SCIM_KEY_u, 0, 0 }, 0x016F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_plus, 0, 0 }, 0x0023},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_minus, 0, 0 }, 0x00B1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_O, 0, 0 }, 0x01A0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_U, 0, 0 }, 0x01AF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_o, 0, 0 }, 0x01A1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_plus, SCIM_KEY_u, 0, 0 }, 0x01B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_space, 0, 0 }, 0x00B8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_quotedbl, 0, 0 }, 0x201E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_apostrophe, 0, 0 }, 0x201A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_comma, 0, 0 }, 0x00B8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_minus, 0, 0 }, 0x00AC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_A, 0, 0 }, 0x0104},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_C, 0, 0 }, 0x00C7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_D, 0, 0 }, 0x1E10},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_E, 0, 0 }, 0x0228},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_G, 0, 0 }, 0x0122},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_H, 0, 0 }, 0x1E28},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_I, 0, 0 }, 0x012E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_K, 0, 0 }, 0x0136},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_L, 0, 0 }, 0x013B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_N, 0, 0 }, 0x0145},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_R, 0, 0 }, 0x0156},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_S, 0, 0 }, 0x015E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_T, 0, 0 }, 0x0162},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_U, 0, 0 }, 0x0172},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_a, 0, 0 }, 0x0105},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_c, 0, 0 }, 0x00E7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_d, 0, 0 }, 0x1E11},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_e, 0, 0 }, 0x0229},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_g, 0, 0 }, 0x0123},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_h, 0, 0 }, 0x1E29},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_i, 0, 0 }, 0x012F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_k, 0, 0 }, 0x0137},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_l, 0, 0 }, 0x013C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_n, 0, 0 }, 0x0146},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_r, 0, 0 }, 0x0157},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_s, 0, 0 }, 0x015F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_t, 0, 0 }, 0x0163},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_comma, SCIM_KEY_u, 0, 0 }, 0x0173},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_space, 0, 0 }, 0x007E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_parenleft, 0, 0 }, 0x007B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_parenright, 0, 0 }, 0x007D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_plus, 0, 0 }, 0x00B1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_comma, 0, 0 }, 0x00AC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_minus, SCIM_KEY_space, 0 }, 0x00AD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_minus, SCIM_KEY_minus, 0 }, 0x2014},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_minus, SCIM_KEY_period, 0 }, 0x2013},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_colon, 0, 0 }, 0x00F7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_A, 0, 0 }, 0x0100},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_D, 0, 0 }, 0x0110},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_E, 0, 0 }, 0x0112},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_I, 0, 0 }, 0x012A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_L, 0, 0 }, 0x00A3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_N, 0, 0 }, 0x00D1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_O, 0, 0 }, 0x014C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_U, 0, 0 }, 0x016A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_Y, 0, 0 }, 0x00A5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_asciicircum, 0, 0 }, 0x00AF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_a, 0, 0 }, 0x0101},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_d, 0, 0 }, 0x0111},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_e, 0, 0 }, 0x0113},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_i, 0, 0 }, 0x012B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_l, 0, 0 }, 0x00A3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_n, 0, 0 }, 0x00F1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_o, 0, 0 }, 0x014D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_u, 0, 0 }, 0x016B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_minus, SCIM_KEY_y, 0, 0 }, 0x00A5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_exclam, SCIM_KEY_S, 0 }, 0x1E68},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_exclam, SCIM_KEY_s, 0 }, 0x1E69},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_apostrophe, SCIM_KEY_S, 0 }, 0x1E64},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_apostrophe, SCIM_KEY_s, 0 }, 0x1E65},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_period, 0, 0 }, 0x00B7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_less, 0, 0 }, 0x2039},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_greater, 0, 0 }, 0x203A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_A, 0, 0 }, 0x0226},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_B, 0, 0 }, 0x1E02},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_C, 0, 0 }, 0x010A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_D, 0, 0 }, 0x1E0A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_E, 0, 0 }, 0x0116},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_F, 0, 0 }, 0x1E1E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_G, 0, 0 }, 0x0120},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_H, 0, 0 }, 0x1E22},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_I, 0, 0 }, 0x0130},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_M, 0, 0 }, 0x1E40},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_N, 0, 0 }, 0x1E44},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_O, 0, 0 }, 0x022E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_P, 0, 0 }, 0x1E56},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_R, 0, 0 }, 0x1E58},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_S, 0, 0 }, 0x1E60},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_T, 0, 0 }, 0x1E6A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_W, 0, 0 }, 0x1E86},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_X, 0, 0 }, 0x1E8A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_Y, 0, 0 }, 0x1E8E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_Z, 0, 0 }, 0x017B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_asciicircum, 0, 0 }, 0x00B7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_a, 0, 0 }, 0x0227},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_b, 0, 0 }, 0x1E03},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_c, 0, 0 }, 0x010B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_c, SCIM_KEY_S, 0 }, 0x1E66},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_c, SCIM_KEY_s, 0 }, 0x1E67},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_d, 0, 0 }, 0x1E0B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_e, 0, 0 }, 0x0117},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_f, 0, 0 }, 0x1E1F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_g, 0, 0 }, 0x0121},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_h, 0, 0 }, 0x1E23},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_i, 0, 0 }, 0x0131},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_m, 0, 0 }, 0x1E41},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_n, 0, 0 }, 0x1E45},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_o, 0, 0 }, 0x022F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_p, 0, 0 }, 0x1E57},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_r, 0, 0 }, 0x1E59},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_s, 0, 0 }, 0x1E61},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_t, 0, 0 }, 0x1E6B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_w, 0, 0 }, 0x1E87},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_x, 0, 0 }, 0x1E8B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_y, 0, 0 }, 0x1E8F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_z, 0, 0 }, 0x017C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_acute, SCIM_KEY_S, 0 }, 0x1E64},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_acute, SCIM_KEY_s, 0 }, 0x1E65},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_Sacute, 0, 0 }, 0x1E64},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_Scaron, 0, 0 }, 0x1E66},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_sacute, 0, 0 }, 0x1E65},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_scaron, 0, 0 }, 0x1E67},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_combining_acute, SCIM_KEY_S, 0 }, 0x1E64},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_combining_acute, SCIM_KEY_s, 0 }, 0x1E65},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_combining_belowdot, SCIM_KEY_S, 0 }, 0x1E68},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_combining_belowdot, SCIM_KEY_s, 0 }, 0x1E69},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_dead_acute, SCIM_KEY_S, 0 }, 0x1E64},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_dead_acute, SCIM_KEY_s, 0 }, 0x1E65},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_dead_caron, SCIM_KEY_S, 0 }, 0x1E66},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_dead_caron, SCIM_KEY_s, 0 }, 0x1E67},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_dead_belowdot, SCIM_KEY_S, 0 }, 0x1E68},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, SCIM_KEY_dead_belowdot, SCIM_KEY_s, 0 }, 0x1E69},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, 0x100017f, 0, 0 }, 0x1E9B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, 0x1001e62, 0, 0 }, 0x1E68},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_period, 0x1001e63, 0, 0 }, 0x1E69},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_slash, 0, 0 }, 0x005C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_less, 0, 0 }, 0x005C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_C, 0, 0 }, 0x20A1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_D, 0, 0 }, 0x0110},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_G, 0, 0 }, 0x01E4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_H, 0, 0 }, 0x0126},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_I, 0, 0 }, 0x0197},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_L, 0, 0 }, 0x0141},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_O, 0, 0 }, 0x00D8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_T, 0, 0 }, 0x0166},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_U, 0, 0 }, 0x00B5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_Z, 0, 0 }, 0x01B5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_asciicircum, 0, 0 }, 0x007C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_b, 0, 0 }, 0x0180},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_c, 0, 0 }, 0x00A2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_d, 0, 0 }, 0x0111},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_g, 0, 0 }, 0x01E5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_h, 0, 0 }, 0x0127},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_i, 0, 0 }, 0x0268},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_l, 0, 0 }, 0x0142},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_m, 0, 0 }, 0x20A5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_o, 0, 0 }, 0x00F8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_t, 0, 0 }, 0x0167},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_u, 0, 0 }, 0x00B5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_z, 0, 0 }, 0x01B6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_Cyrillic_ghe, 0, 0 }, 0x0493},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_Cyrillic_ka, 0, 0 }, 0x049F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_Cyrillic_GHE, 0, 0 }, 0x0492},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_Cyrillic_KA, 0, 0 }, 0x049E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_leftarrow, 0, 0 }, 0x219A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, SCIM_KEY_rightarrow, 0, 0 }, 0x219B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, 0x1000294, 0, 0 }, 0x02A1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, 0x10004ae, 0, 0 }, 0x04B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, 0x10004af, 0, 0 }, 0x04B1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_slash, 0x1002194, 0, 0 }, 0x21AE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_0, SCIM_KEY_asterisk, 0, 0 }, 0x00B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_0, SCIM_KEY_C, 0, 0 }, 0x00A9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_0, SCIM_KEY_S, 0, 0 }, 0x00A7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_0, SCIM_KEY_X, 0, 0 }, 0x00A4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_0, SCIM_KEY_asciicircum, 0, 0 }, 0x00B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_0, SCIM_KEY_c, 0, 0 }, 0x00A9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_0, SCIM_KEY_s, 0, 0 }, 0x00A7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_0, SCIM_KEY_x, 0, 0 }, 0x00A4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_1, SCIM_KEY_2, 0, 0 }, 0x00BD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_1, SCIM_KEY_4, 0, 0 }, 0x00BC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_1, SCIM_KEY_S, 0, 0 }, 0x00B9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_1, SCIM_KEY_asciicircum, 0, 0 }, 0x00B9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_1, SCIM_KEY_s, 0, 0 }, 0x00B9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_2, SCIM_KEY_S, 0, 0 }, 0x00B2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_2, SCIM_KEY_asciicircum, 0, 0 }, 0x00B2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_2, SCIM_KEY_s, 0, 0 }, 0x00B2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_3, SCIM_KEY_4, 0, 0 }, 0x00BE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_3, SCIM_KEY_S, 0, 0 }, 0x00B3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_3, SCIM_KEY_asciicircum, 0, 0 }, 0x00B3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_3, SCIM_KEY_s, 0, 0 }, 0x00B3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_colon, SCIM_KEY_minus, 0, 0 }, 0x00F7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_semicolon, SCIM_KEY_A, 0, 0 }, 0x0104},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_semicolon, SCIM_KEY_E, 0, 0 }, 0x0118},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_semicolon, SCIM_KEY_I, 0, 0 }, 0x012E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_semicolon, SCIM_KEY_O, 0, 0 }, 0x01EA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_semicolon, SCIM_KEY_U, 0, 0 }, 0x0172},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_semicolon, SCIM_KEY_a, 0, 0 }, 0x0105},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_semicolon, SCIM_KEY_e, 0, 0 }, 0x0119},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_semicolon, SCIM_KEY_i, 0, 0 }, 0x012F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_semicolon, SCIM_KEY_o, 0, 0 }, 0x01EB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_semicolon, SCIM_KEY_u, 0, 0 }, 0x0173},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_space, 0, 0 }, 0x02C7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_quotedbl, 0, 0 }, 0x201C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_apostrophe, 0, 0 }, 0x2018},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_slash, 0, 0 }, 0x005C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_less, 0, 0 }, 0x00AB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_C, 0, 0 }, 0x010C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_D, 0, 0 }, 0x010E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_E, 0, 0 }, 0x011A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_L, 0, 0 }, 0x013D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_N, 0, 0 }, 0x0147},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_R, 0, 0 }, 0x0158},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_S, 0, 0 }, 0x0160},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_T, 0, 0 }, 0x0164},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_Z, 0, 0 }, 0x017D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_c, 0, 0 }, 0x010D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_d, 0, 0 }, 0x010F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_e, 0, 0 }, 0x011B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_l, 0, 0 }, 0x013E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_n, 0, 0 }, 0x0148},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_r, 0, 0 }, 0x0159},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_s, 0, 0 }, 0x0161},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_t, 0, 0 }, 0x0165},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, SCIM_KEY_z, 0, 0 }, 0x017E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_less, 0x1000338, 0, 0 }, 0x226E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_equal, SCIM_KEY_C, 0, 0 }, 0x20AC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_equal, SCIM_KEY_E, 0, 0 }, 0x20AC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_equal, SCIM_KEY_L, 0, 0 }, 0x20A4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_equal, SCIM_KEY_N, 0, 0 }, 0x20A6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_equal, SCIM_KEY_O, 0, 0 }, 0x0150},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_equal, SCIM_KEY_U, 0, 0 }, 0x0170},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_equal, SCIM_KEY_W, 0, 0 }, 0x20A9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_equal, SCIM_KEY_Y, 0, 0 }, 0x00A5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_equal, SCIM_KEY_c, 0, 0 }, 0x20AC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_equal, SCIM_KEY_e, 0, 0 }, 0x20AC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_equal, SCIM_KEY_l, 0, 0 }, 0x00A3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_equal, SCIM_KEY_o, 0, 0 }, 0x0151},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_equal, SCIM_KEY_u, 0, 0 }, 0x0171},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_equal, SCIM_KEY_y, 0, 0 }, 0x00A5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_equal, SCIM_KEY_Cyrillic_u, 0, 0 }, 0x04F3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_equal, SCIM_KEY_Cyrillic_U, 0, 0 }, 0x04F2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_equal, 0x1000338, 0, 0 }, 0x2260},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_greater, SCIM_KEY_space, 0, 0 }, 0x005E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_greater, SCIM_KEY_quotedbl, 0, 0 }, 0x201D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_greater, SCIM_KEY_apostrophe, 0, 0 }, 0x2019},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_greater, SCIM_KEY_greater, 0, 0 }, 0x00BB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_greater, SCIM_KEY_A, 0, 0 }, 0x00C2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_greater, SCIM_KEY_E, 0, 0 }, 0x00CA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_greater, SCIM_KEY_I, 0, 0 }, 0x00CE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_greater, SCIM_KEY_O, 0, 0 }, 0x00D4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_greater, SCIM_KEY_U, 0, 0 }, 0x00DB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_greater, SCIM_KEY_a, 0, 0 }, 0x00E2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_greater, SCIM_KEY_e, 0, 0 }, 0x00EA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_greater, SCIM_KEY_i, 0, 0 }, 0x00EE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_greater, SCIM_KEY_o, 0, 0 }, 0x00F4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_greater, SCIM_KEY_u, 0, 0 }, 0x00FB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_greater, 0x1000338, 0, 0 }, 0x226F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_plus, SCIM_KEY_O, 0 }, 0x1EDE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_plus, SCIM_KEY_U, 0 }, 0x1EEC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_plus, SCIM_KEY_o, 0 }, 0x1EDF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_plus, SCIM_KEY_u, 0 }, 0x1EED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_question, 0, 0 }, 0x00BF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_A, 0, 0 }, 0x1EA2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_E, 0, 0 }, 0x1EBA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_I, 0, 0 }, 0x1EC8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_O, 0, 0 }, 0x1ECE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_U, 0, 0 }, 0x1EE6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_U, SCIM_KEY_A, 0 }, 0x1EB2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_U, SCIM_KEY_a, 0 }, 0x1EB3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_Y, 0, 0 }, 0x1EF6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_asciicircum, SCIM_KEY_A, 0 }, 0x1EA8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_asciicircum, SCIM_KEY_E, 0 }, 0x1EC2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_asciicircum, SCIM_KEY_O, 0 }, 0x1ED4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_asciicircum, SCIM_KEY_a, 0 }, 0x1EA9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_asciicircum, SCIM_KEY_e, 0 }, 0x1EC3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_asciicircum, SCIM_KEY_o, 0 }, 0x1ED5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_a, 0, 0 }, 0x1EA3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_b, SCIM_KEY_A, 0 }, 0x1EB2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_b, SCIM_KEY_a, 0 }, 0x1EB3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_e, 0, 0 }, 0x1EBB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_i, 0, 0 }, 0x1EC9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_o, 0, 0 }, 0x1ECF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_u, 0, 0 }, 0x1EE7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_y, 0, 0 }, 0x1EF7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_Acircumflex, 0, 0 }, 0x1EA8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_Ecircumflex, 0, 0 }, 0x1EC2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_Ocircumflex, 0, 0 }, 0x1ED4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_acircumflex, 0, 0 }, 0x1EA9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_ecircumflex, 0, 0 }, 0x1EC3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_ocircumflex, 0, 0 }, 0x1ED5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_Abreve, 0, 0 }, 0x1EB2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_abreve, 0, 0 }, 0x1EB3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_Ohorn, 0, 0 }, 0x1EDE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_ohorn, 0, 0 }, 0x1EDF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_Uhorn, 0, 0 }, 0x1EEC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_uhorn, 0, 0 }, 0x1EED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_dead_circumflex, SCIM_KEY_A, 0 }, 0x1EA8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_dead_circumflex, SCIM_KEY_E, 0 }, 0x1EC2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_dead_circumflex, SCIM_KEY_O, 0 }, 0x1ED4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_dead_circumflex, SCIM_KEY_a, 0 }, 0x1EA9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_dead_circumflex, SCIM_KEY_e, 0 }, 0x1EC3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_dead_circumflex, SCIM_KEY_o, 0 }, 0x1ED5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_dead_breve, SCIM_KEY_A, 0 }, 0x1EB2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_dead_breve, SCIM_KEY_a, 0 }, 0x1EB3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_dead_horn, SCIM_KEY_O, 0 }, 0x1EDE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_dead_horn, SCIM_KEY_U, 0 }, 0x1EEC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_dead_horn, SCIM_KEY_o, 0 }, 0x1EDF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_question, SCIM_KEY_dead_horn, SCIM_KEY_u, 0 }, 0x1EED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_A, SCIM_KEY_quotedbl, 0, 0 }, 0x00C4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_A, SCIM_KEY_apostrophe, 0, 0 }, 0x00C1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_A, SCIM_KEY_parenleft, 0, 0 }, 0x0102},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_A, SCIM_KEY_asterisk, 0, 0 }, 0x00C5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_A, SCIM_KEY_comma, 0, 0 }, 0x0104},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_A, SCIM_KEY_minus, 0, 0 }, 0x0100},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_A, SCIM_KEY_greater, 0, 0 }, 0x00C2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_A, SCIM_KEY_A, 0, 0 }, 0x00C5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_A, SCIM_KEY_E, 0, 0 }, 0x00C6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_A, SCIM_KEY_T, 0, 0 }, 0x0040},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_A, SCIM_KEY_asciicircum, 0, 0 }, 0x00C2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_A, SCIM_KEY_underscore, 0, 0 }, 0x00AA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_A, SCIM_KEY_grave, 0, 0 }, 0x00C0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_A, SCIM_KEY_asciitilde, 0, 0 }, 0x00C3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_A, SCIM_KEY_diaeresis, 0, 0 }, 0x00C4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_A, SCIM_KEY_acute, 0, 0 }, 0x00C1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_B, SCIM_KEY_period, 0, 0 }, 0x1E02},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_C, SCIM_KEY_apostrophe, 0, 0 }, 0x0106},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_C, SCIM_KEY_comma, 0, 0 }, 0x00C7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_C, SCIM_KEY_period, 0, 0 }, 0x010A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_C, SCIM_KEY_slash, 0, 0 }, 0x00A2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_C, SCIM_KEY_0, 0, 0 }, 0x00A9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_C, SCIM_KEY_less, 0, 0 }, 0x010C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_C, SCIM_KEY_equal, 0, 0 }, 0x20AC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_C, SCIM_KEY_E, 0, 0 }, 0x20A0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_C, SCIM_KEY_O, 0, 0 }, 0x00A9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_C, SCIM_KEY_o, 0, 0 }, 0x00A9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_C, SCIM_KEY_r, 0, 0 }, 0x20A2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_C, SCIM_KEY_bar, 0, 0 }, 0x00A2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_D, SCIM_KEY_minus, 0, 0 }, 0x0110},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_D, SCIM_KEY_period, 0, 0 }, 0x1E0A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_D, SCIM_KEY_less, 0, 0 }, 0x010E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_D, SCIM_KEY_H, 0, 0 }, 0x00D0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_E, SCIM_KEY_quotedbl, 0, 0 }, 0x00CB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_E, SCIM_KEY_apostrophe, 0, 0 }, 0x00C9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_E, SCIM_KEY_comma, 0, 0 }, 0x0118},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_E, SCIM_KEY_minus, 0, 0 }, 0x0112},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_E, SCIM_KEY_period, 0, 0 }, 0x0116},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_E, SCIM_KEY_less, 0, 0 }, 0x011A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_E, SCIM_KEY_equal, 0, 0 }, 0x20AC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_E, SCIM_KEY_greater, 0, 0 }, 0x00CA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_E, SCIM_KEY_asciicircum, 0, 0 }, 0x00CA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_E, SCIM_KEY_underscore, 0, 0 }, 0x0112},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_E, SCIM_KEY_grave, 0, 0 }, 0x00C8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_E, SCIM_KEY_diaeresis, 0, 0 }, 0x00CB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_E, SCIM_KEY_acute, 0, 0 }, 0x00C9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_F, SCIM_KEY_period, 0, 0 }, 0x1E1E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_F, SCIM_KEY_r, 0, 0 }, 0x20A3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_G, SCIM_KEY_parenleft, 0, 0 }, 0x011E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_G, SCIM_KEY_comma, 0, 0 }, 0x0122},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_G, SCIM_KEY_period, 0, 0 }, 0x0120},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_G, SCIM_KEY_U, 0, 0 }, 0x011E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_G, SCIM_KEY_breve, 0, 0 }, 0x011E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_I, SCIM_KEY_quotedbl, 0, 0 }, 0x00CF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_I, SCIM_KEY_apostrophe, 0, 0 }, 0x00CD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_I, SCIM_KEY_comma, 0, 0 }, 0x012E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_I, SCIM_KEY_minus, 0, 0 }, 0x012A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_I, SCIM_KEY_period, 0, 0 }, 0x0130},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_I, SCIM_KEY_greater, 0, 0 }, 0x00CE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_I, SCIM_KEY_asciicircum, 0, 0 }, 0x00CE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_I, SCIM_KEY_underscore, 0, 0 }, 0x012A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_I, SCIM_KEY_grave, 0, 0 }, 0x00CC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_I, SCIM_KEY_asciitilde, 0, 0 }, 0x0128},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_I, SCIM_KEY_diaeresis, 0, 0 }, 0x00CF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_I, SCIM_KEY_acute, 0, 0 }, 0x00CD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_K, SCIM_KEY_comma, 0, 0 }, 0x0136},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_L, SCIM_KEY_apostrophe, 0, 0 }, 0x0139},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_L, SCIM_KEY_comma, 0, 0 }, 0x013B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_L, SCIM_KEY_minus, 0, 0 }, 0x00A3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_L, SCIM_KEY_less, 0, 0 }, 0x013D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_L, SCIM_KEY_equal, 0, 0 }, 0x20A4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_L, SCIM_KEY_V, 0, 0 }, 0x007C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_M, SCIM_KEY_period, 0, 0 }, 0x1E40},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_N, SCIM_KEY_apostrophe, 0, 0 }, 0x0143},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_N, SCIM_KEY_comma, 0, 0 }, 0x0145},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_N, SCIM_KEY_minus, 0, 0 }, 0x00D1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_N, SCIM_KEY_less, 0, 0 }, 0x0147},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_N, SCIM_KEY_equal, 0, 0 }, 0x20A6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_N, SCIM_KEY_G, 0, 0 }, 0x014A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_N, SCIM_KEY_asciitilde, 0, 0 }, 0x00D1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_quotedbl, 0, 0 }, 0x00D6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_apostrophe, 0, 0 }, 0x00D3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_minus, 0, 0 }, 0x014C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_slash, 0, 0 }, 0x00D8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_greater, 0, 0 }, 0x00D4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_C, 0, 0 }, 0x00A9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_E, 0, 0 }, 0x0152},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_R, 0, 0 }, 0x00AE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_S, 0, 0 }, 0x00A7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_X, 0, 0 }, 0x00A4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_asciicircum, 0, 0 }, 0x00D4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_underscore, 0, 0 }, 0x00BA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_grave, 0, 0 }, 0x00D2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_c, 0, 0 }, 0x00A9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_r, 0, 0 }, 0x00AE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_x, 0, 0 }, 0x00A4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_asciitilde, 0, 0 }, 0x00D5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_diaeresis, 0, 0 }, 0x00D6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_O, SCIM_KEY_acute, 0, 0 }, 0x00D3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_P, SCIM_KEY_exclam, 0, 0 }, 0x00B6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_P, SCIM_KEY_period, 0, 0 }, 0x1E56},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_P, SCIM_KEY_P, 0, 0 }, 0x00B6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_P, SCIM_KEY_t, 0, 0 }, 0x20A7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_R, SCIM_KEY_apostrophe, 0, 0 }, 0x0154},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_R, SCIM_KEY_comma, 0, 0 }, 0x0156},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_R, SCIM_KEY_less, 0, 0 }, 0x0158},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_R, SCIM_KEY_O, 0, 0 }, 0x00AE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_R, SCIM_KEY_s, 0, 0 }, 0x20A8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_S, SCIM_KEY_exclam, 0, 0 }, 0x00A7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_S, SCIM_KEY_apostrophe, 0, 0 }, 0x015A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_S, SCIM_KEY_comma, 0, 0 }, 0x015E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_S, SCIM_KEY_period, 0, 0 }, 0x1E60},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_S, SCIM_KEY_0, 0, 0 }, 0x00A7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_S, SCIM_KEY_1, 0, 0 }, 0x00B9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_S, SCIM_KEY_2, 0, 0 }, 0x00B2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_S, SCIM_KEY_3, 0, 0 }, 0x00B3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_S, SCIM_KEY_less, 0, 0 }, 0x0160},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_S, SCIM_KEY_O, 0, 0 }, 0x00A7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_S, SCIM_KEY_cedilla, 0, 0 }, 0x015E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_T, SCIM_KEY_minus, 0, 0 }, 0x0166},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_T, SCIM_KEY_period, 0, 0 }, 0x1E6A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_T, SCIM_KEY_slash, 0, 0 }, 0x0166},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_T, SCIM_KEY_less, 0, 0 }, 0x0164},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_T, SCIM_KEY_H, 0, 0 }, 0x00DE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_exclam, SCIM_KEY_A, 0 }, 0x1EB6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_exclam, SCIM_KEY_a, 0 }, 0x1EB7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_quotedbl, 0, 0 }, 0x00DC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_apostrophe, 0, 0 }, 0x00DA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_asterisk, 0, 0 }, 0x016E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_comma, 0, 0 }, 0x0172},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_comma, SCIM_KEY_E, 0 }, 0x1E1C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_comma, SCIM_KEY_e, 0 }, 0x1E1D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_minus, 0, 0 }, 0x016B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_slash, 0, 0 }, 0x00B5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_greater, 0, 0 }, 0x00DB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_A, 0, 0 }, 0x0102},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_E, 0, 0 }, 0x0114},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_G, 0, 0 }, 0x011E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_I, 0, 0 }, 0x012C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_O, 0, 0 }, 0x014E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_U, 0, 0 }, 0x016C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_asciicircum, 0, 0 }, 0x00DB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_underscore, 0, 0 }, 0x016B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_grave, 0, 0 }, 0x00D9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_a, 0, 0 }, 0x0103},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_e, 0, 0 }, 0x0115},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_g, 0, 0 }, 0x011F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_i, 0, 0 }, 0x012D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_o, 0, 0 }, 0x014F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_u, 0, 0 }, 0x016D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_asciitilde, 0, 0 }, 0x0168},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_diaeresis, 0, 0 }, 0x00DC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_acute, 0, 0 }, 0x00DA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_Cyrillic_a, 0, 0 }, 0x04D1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_Cyrillic_ie, 0, 0 }, 0x04D7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_Cyrillic_i, 0, 0 }, 0x0439},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_Cyrillic_u, 0, 0 }, 0x045E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_Cyrillic_zhe, 0, 0 }, 0x04C2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_Cyrillic_A, 0, 0 }, 0x04D0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_Cyrillic_IE, 0, 0 }, 0x04D6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_Cyrillic_I, 0, 0 }, 0x0419},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_Cyrillic_U, 0, 0 }, 0x040E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_Cyrillic_ZHE, 0, 0 }, 0x04C1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1FB8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1FD8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_Greek_UPSILON, 0, 0 }, 0x1FE8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1FB0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_Greek_iota, 0, 0 }, 0x1FD0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1FE0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_combining_belowdot, SCIM_KEY_A, 0 }, 0x1EB6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_combining_belowdot, SCIM_KEY_a, 0 }, 0x1EB7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_dead_cedilla, SCIM_KEY_E, 0 }, 0x1E1C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_dead_cedilla, SCIM_KEY_e, 0 }, 0x1E1D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_dead_belowdot, SCIM_KEY_A, 0 }, 0x1EB6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, SCIM_KEY_dead_belowdot, SCIM_KEY_a, 0 }, 0x1EB7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, 0x1000228, 0, 0 }, 0x1E1C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, 0x1000229, 0, 0 }, 0x1E1D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, 0x1001ea0, 0, 0 }, 0x1EB6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_U, 0x1001ea1, 0, 0 }, 0x1EB7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_V, SCIM_KEY_L, 0, 0 }, 0x007C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_W, SCIM_KEY_equal, 0, 0 }, 0x20A9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_W, SCIM_KEY_asciicircum, 0, 0 }, 0x0174},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_X, SCIM_KEY_0, 0, 0 }, 0x00A4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_X, SCIM_KEY_O, 0, 0 }, 0x00A4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_X, SCIM_KEY_o, 0, 0 }, 0x00A4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Y, SCIM_KEY_quotedbl, 0, 0 }, 0x0178},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Y, SCIM_KEY_apostrophe, 0, 0 }, 0x00DD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Y, SCIM_KEY_minus, 0, 0 }, 0x00A5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Y, SCIM_KEY_equal, 0, 0 }, 0x00A5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Y, SCIM_KEY_asciicircum, 0, 0 }, 0x0176},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Y, SCIM_KEY_diaeresis, 0, 0 }, 0x0178},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Y, SCIM_KEY_acute, 0, 0 }, 0x00DD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Z, SCIM_KEY_apostrophe, 0, 0 }, 0x0179},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Z, SCIM_KEY_period, 0, 0 }, 0x017B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Z, SCIM_KEY_less, 0, 0 }, 0x017D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_space, 0, 0 }, 0x005E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_exclam, SCIM_KEY_A, 0 }, 0x1EAC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_exclam, SCIM_KEY_E, 0 }, 0x1EC6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_exclam, SCIM_KEY_O, 0 }, 0x1ED8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_exclam, SCIM_KEY_a, 0 }, 0x1EAD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_exclam, SCIM_KEY_e, 0 }, 0x1EC7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_exclam, SCIM_KEY_o, 0 }, 0x1ED9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_parenleft, 0, 0 }, 0x207D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_parenright, 0, 0 }, 0x207E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_plus, 0, 0 }, 0x207A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_minus, 0, 0 }, 0x00AF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_period, 0, 0 }, 0x00B7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_slash, 0, 0 }, 0x007C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_0, 0, 0 }, 0x2070},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_1, 0, 0 }, 0x00B9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_2, 0, 0 }, 0x00B2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_3, 0, 0 }, 0x00B3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_4, 0, 0 }, 0x2074},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_5, 0, 0 }, 0x2075},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_6, 0, 0 }, 0x2076},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_7, 0, 0 }, 0x2077},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_8, 0, 0 }, 0x2078},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_9, 0, 0 }, 0x2079},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_equal, 0, 0 }, 0x207C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_A, 0, 0 }, 0x00C2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_C, 0, 0 }, 0x0108},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_E, 0, 0 }, 0x00CA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_G, 0, 0 }, 0x011C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_H, 0, 0 }, 0x0124},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_I, 0, 0 }, 0x00CE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_J, 0, 0 }, 0x0134},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_O, 0, 0 }, 0x00D4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_S, 0, 0 }, 0x015C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_S, SCIM_KEY_M, 0 }, 0x2120},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_T, SCIM_KEY_M, 0 }, 0x2122},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_U, 0, 0 }, 0x00DB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_W, 0, 0 }, 0x0174},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_Y, 0, 0 }, 0x0176},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_Z, 0, 0 }, 0x1E90},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, 0, 0 }, 0x00AF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, SCIM_KEY_a, 0 }, 0x00AA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, SCIM_KEY_h, 0 }, 0x02B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, SCIM_KEY_i, 0 }, 0x2071},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, SCIM_KEY_j, 0 }, 0x02B2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, SCIM_KEY_l, 0 }, 0x02E1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, SCIM_KEY_n, 0 }, 0x207F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, SCIM_KEY_o, 0 }, 0x00BA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, SCIM_KEY_r, 0 }, 0x02B3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, SCIM_KEY_s, 0 }, 0x02E2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, SCIM_KEY_w, 0 }, 0x02B7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, SCIM_KEY_x, 0 }, 0x02E3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, SCIM_KEY_y, 0 }, 0x02B8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, 0x1000263, 0 }, 0x02E0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, 0x1000266, 0 }, 0x02B1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, 0x1000279, 0 }, 0x02B4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, 0x100027b, 0 }, 0x02B5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, 0x1000281, 0 }, 0x02B6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underscore, 0x1000295, 0 }, 0x02E4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_a, 0, 0 }, 0x00E2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_c, 0, 0 }, 0x0109},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_e, 0, 0 }, 0x00EA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_g, 0, 0 }, 0x011D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_h, 0, 0 }, 0x0125},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_i, 0, 0 }, 0x00EE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_j, 0, 0 }, 0x0135},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_o, 0, 0 }, 0x00F4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_s, 0, 0 }, 0x015D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_u, 0, 0 }, 0x00FB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_w, 0, 0 }, 0x0175},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_y, 0, 0 }, 0x0177},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_z, 0, 0 }, 0x1E91},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, SCIM_KEY_a, 0 }, 0x00AA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, SCIM_KEY_h, 0 }, 0x02B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, SCIM_KEY_i, 0 }, 0x2071},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, SCIM_KEY_j, 0 }, 0x02B2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, SCIM_KEY_l, 0 }, 0x02E1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, SCIM_KEY_n, 0 }, 0x207F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, SCIM_KEY_o, 0 }, 0x00BA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, SCIM_KEY_r, 0 }, 0x02B3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, SCIM_KEY_s, 0 }, 0x02E2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, SCIM_KEY_w, 0 }, 0x02B7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, SCIM_KEY_x, 0 }, 0x02E3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, SCIM_KEY_y, 0 }, 0x02B8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, 0x1000263, 0 }, 0x02E0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, 0x1000266, 0 }, 0x02B1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, 0x1000279, 0 }, 0x02B4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, 0x100027b, 0 }, 0x02B5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, 0x1000281, 0 }, 0x02B6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_underbar, 0x1000295, 0 }, 0x02E4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_combining_belowdot, SCIM_KEY_A, 0 }, 0x1EAC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_combining_belowdot, SCIM_KEY_E, 0 }, 0x1EC6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_combining_belowdot, SCIM_KEY_O, 0 }, 0x1ED8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_combining_belowdot, SCIM_KEY_a, 0 }, 0x1EAD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_combining_belowdot, SCIM_KEY_e, 0 }, 0x1EC7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_combining_belowdot, SCIM_KEY_o, 0 }, 0x1ED9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_dead_belowdot, SCIM_KEY_A, 0 }, 0x1EAC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_dead_belowdot, SCIM_KEY_E, 0 }, 0x1EC6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_dead_belowdot, SCIM_KEY_O, 0 }, 0x1ED8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_dead_belowdot, SCIM_KEY_a, 0 }, 0x1EAD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_dead_belowdot, SCIM_KEY_e, 0 }, 0x1EC7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_dead_belowdot, SCIM_KEY_o, 0 }, 0x1ED9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_KP_Space, 0, 0 }, 0x00B2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_KP_Add, 0, 0 }, 0x207A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_KP_0, 0, 0 }, 0x2070},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_KP_1, 0, 0 }, 0x00B9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_KP_2, 0, 0 }, 0x00B2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_KP_3, 0, 0 }, 0x00B3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_KP_4, 0, 0 }, 0x2074},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_KP_5, 0, 0 }, 0x2075},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_KP_6, 0, 0 }, 0x2076},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_KP_7, 0, 0 }, 0x2077},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_KP_8, 0, 0 }, 0x2078},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_KP_9, 0, 0 }, 0x2079},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, SCIM_KEY_KP_Equal, 0, 0 }, 0x207C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1001ea0, 0, 0 }, 0x1EAC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1001ea1, 0, 0 }, 0x1EAD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1001eb8, 0, 0 }, 0x1EC6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1001eb9, 0, 0 }, 0x1EC7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1001ecc, 0, 0 }, 0x1ED8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1001ecd, 0, 0 }, 0x1ED9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1002212, 0, 0 }, 0x207B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1004e00, 0, 0 }, 0x3192},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1004e01, 0, 0 }, 0x319C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1004e09, 0, 0 }, 0x3194},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1004e0a, 0, 0 }, 0x3196},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1004e0b, 0, 0 }, 0x3198},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1004e19, 0, 0 }, 0x319B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1004e2d, 0, 0 }, 0x3197},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1004e59, 0, 0 }, 0x319A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1004e8c, 0, 0 }, 0x3193},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1004eba, 0, 0 }, 0x319F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x10056db, 0, 0 }, 0x3195},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1005730, 0, 0 }, 0x319E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1005929, 0, 0 }, 0x319D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciicircum, 0x1007532, 0, 0 }, 0x3199},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_exclam, SCIM_KEY_L, 0 }, 0x1E38},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_exclam, SCIM_KEY_R, 0 }, 0x1E5C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_exclam, SCIM_KEY_l, 0 }, 0x1E39},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_exclam, SCIM_KEY_r, 0 }, 0x1E5D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_quotedbl, SCIM_KEY_A, 0 }, 0x01DE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_quotedbl, SCIM_KEY_O, 0 }, 0x022A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_quotedbl, SCIM_KEY_U, 0 }, 0x01D5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_quotedbl, SCIM_KEY_a, 0 }, 0x01DF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_quotedbl, SCIM_KEY_o, 0 }, 0x022B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_quotedbl, SCIM_KEY_u, 0 }, 0x01D6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_parenleft, 0, 0 }, 0x208D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_parenright, 0, 0 }, 0x208E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_plus, 0, 0 }, 0x208A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_period, SCIM_KEY_A, 0 }, 0x01E0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_period, SCIM_KEY_O, 0 }, 0x0230},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_period, SCIM_KEY_a, 0 }, 0x01E1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_period, SCIM_KEY_o, 0 }, 0x0231},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_0, 0, 0 }, 0x2080},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_1, 0, 0 }, 0x2081},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_2, 0, 0 }, 0x2082},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_3, 0, 0 }, 0x2083},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_4, 0, 0 }, 0x2084},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_5, 0, 0 }, 0x2085},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_6, 0, 0 }, 0x2086},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_7, 0, 0 }, 0x2087},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_8, 0, 0 }, 0x2088},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_9, 0, 0 }, 0x2089},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_semicolon, SCIM_KEY_O, 0 }, 0x01EC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_semicolon, SCIM_KEY_o, 0 }, 0x01ED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_equal, 0, 0 }, 0x208C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_A, 0, 0 }, 0x00AA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_E, 0, 0 }, 0x0112},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_G, 0, 0 }, 0x1E20},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_I, 0, 0 }, 0x012A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_O, 0, 0 }, 0x00BA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_U, 0, 0 }, 0x016A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_Y, 0, 0 }, 0x0232},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_asciicircum, 0, 0 }, 0x00AF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_underscore, 0, 0 }, 0x00AF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_a, 0, 0 }, 0x0101},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_e, 0, 0 }, 0x0113},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_g, 0, 0 }, 0x1E21},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_i, 0, 0 }, 0x012B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_o, 0, 0 }, 0x014D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_u, 0, 0 }, 0x016B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_y, 0, 0 }, 0x0233},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_asciitilde, SCIM_KEY_O, 0 }, 0x022C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_asciitilde, SCIM_KEY_o, 0 }, 0x022D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_Adiaeresis, 0, 0 }, 0x01DE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_AE, 0, 0 }, 0x01E2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_Otilde, 0, 0 }, 0x022C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_Odiaeresis, 0, 0 }, 0x022A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_Udiaeresis, 0, 0 }, 0x01D5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_adiaeresis, 0, 0 }, 0x01DF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_ae, 0, 0 }, 0x01E3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_otilde, 0, 0 }, 0x022D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_odiaeresis, 0, 0 }, 0x022B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_udiaeresis, 0, 0 }, 0x01D6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_Cyrillic_i, 0, 0 }, 0x04E3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_Cyrillic_u, 0, 0 }, 0x04EF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_Cyrillic_I, 0, 0 }, 0x04E2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_Cyrillic_U, 0, 0 }, 0x04EE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1FB9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1FD9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_Greek_UPSILON, 0, 0 }, 0x1FE9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1FB1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_Greek_iota, 0, 0 }, 0x1FD1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1FE1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_combining_tilde, SCIM_KEY_O, 0 }, 0x022C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_combining_tilde, SCIM_KEY_o, 0 }, 0x022D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_combining_belowdot, SCIM_KEY_L, 0 }, 0x1E38},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_combining_belowdot, SCIM_KEY_R, 0 }, 0x1E5C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_combining_belowdot, SCIM_KEY_l, 0 }, 0x1E39},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_combining_belowdot, SCIM_KEY_r, 0 }, 0x1E5D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_tilde, SCIM_KEY_O, 0 }, 0x022C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_tilde, SCIM_KEY_o, 0 }, 0x022D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_abovedot, SCIM_KEY_A, 0 }, 0x01E0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_abovedot, SCIM_KEY_O, 0 }, 0x0230},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_abovedot, SCIM_KEY_a, 0 }, 0x01E1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_abovedot, SCIM_KEY_o, 0 }, 0x0231},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_diaeresis, SCIM_KEY_A, 0 }, 0x01DE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_diaeresis, SCIM_KEY_O, 0 }, 0x022A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_diaeresis, SCIM_KEY_U, 0 }, 0x01D5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_diaeresis, SCIM_KEY_a, 0 }, 0x01DF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_diaeresis, SCIM_KEY_o, 0 }, 0x022B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_diaeresis, SCIM_KEY_u, 0 }, 0x01D6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_ogonek, SCIM_KEY_O, 0 }, 0x01EC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_ogonek, SCIM_KEY_o, 0 }, 0x01ED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_belowdot, SCIM_KEY_L, 0 }, 0x1E38},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_belowdot, SCIM_KEY_R, 0 }, 0x1E5C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_belowdot, SCIM_KEY_l, 0 }, 0x1E39},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_dead_belowdot, SCIM_KEY_r, 0 }, 0x1E5D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_KP_Space, 0, 0 }, 0x2082},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_KP_Add, 0, 0 }, 0x208A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_KP_0, 0, 0 }, 0x2080},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_KP_1, 0, 0 }, 0x2081},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_KP_2, 0, 0 }, 0x2082},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_KP_3, 0, 0 }, 0x2083},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_KP_4, 0, 0 }, 0x2084},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_KP_5, 0, 0 }, 0x2085},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_KP_6, 0, 0 }, 0x2086},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_KP_7, 0, 0 }, 0x2087},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_KP_8, 0, 0 }, 0x2088},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_KP_9, 0, 0 }, 0x2089},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, SCIM_KEY_KP_Equal, 0, 0 }, 0x208C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, 0x10001ea, 0, 0 }, 0x01EC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, 0x10001eb, 0, 0 }, 0x01ED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, 0x1000226, 0, 0 }, 0x01E0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, 0x1000227, 0, 0 }, 0x01E1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, 0x100022e, 0, 0 }, 0x0230},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, 0x100022f, 0, 0 }, 0x0231},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, 0x1001e36, 0, 0 }, 0x1E38},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, 0x1001e37, 0, 0 }, 0x1E39},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, 0x1001e5a, 0, 0 }, 0x1E5C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, 0x1001e5b, 0, 0 }, 0x1E5D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underscore, 0x1002212, 0, 0 }, 0x208B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_space, 0, 0 }, 0x0060},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_quotedbl, SCIM_KEY_U, 0 }, 0x01DB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_quotedbl, SCIM_KEY_u, 0 }, 0x01DC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_quotedbl, SCIM_KEY_Greek_iota, 0 }, 0x1FD2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_quotedbl, SCIM_KEY_Greek_upsilon, 0 }, 0x1FE2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA, 0 }, 0x1F2B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_UPSILON, 0 }, 0x1F5B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha, 0 }, 0x1F03},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_epsilon, 0 }, 0x1F13},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta, 0 }, 0x1F23},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_iota, 0 }, 0x1F33},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_omicron, 0 }, 0x1F43},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_upsilon, 0 }, 0x1F53},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega, 0 }, 0x1F63},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA, 0 }, 0x1F2A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha, 0 }, 0x1F02},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_epsilon, 0 }, 0x1F12},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_eta, 0 }, 0x1F22},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_iota, 0 }, 0x1F32},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_omicron, 0 }, 0x1F42},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_upsilon, 0 }, 0x1F52},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_omega, 0 }, 0x1F62},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_plus, SCIM_KEY_O, 0 }, 0x1EDC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_plus, SCIM_KEY_U, 0 }, 0x1EEA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_plus, SCIM_KEY_o, 0 }, 0x1EDD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_plus, SCIM_KEY_u, 0 }, 0x1EEB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_A, 0, 0 }, 0x00C0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_E, 0, 0 }, 0x00C8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_I, 0, 0 }, 0x00CC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_N, 0, 0 }, 0x01F8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_O, 0, 0 }, 0x00D2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_U, 0, 0 }, 0x00D9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_U, SCIM_KEY_A, 0 }, 0x1EB0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_U, SCIM_KEY_a, 0 }, 0x1EB1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_W, 0, 0 }, 0x1E80},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Y, 0, 0 }, 0x1EF2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_asciicircum, SCIM_KEY_A, 0 }, 0x1EA6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_asciicircum, SCIM_KEY_E, 0 }, 0x1EC0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_asciicircum, SCIM_KEY_O, 0 }, 0x1ED2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_asciicircum, SCIM_KEY_a, 0 }, 0x1EA7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_asciicircum, SCIM_KEY_e, 0 }, 0x1EC1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_asciicircum, SCIM_KEY_o, 0 }, 0x1ED3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_underscore, SCIM_KEY_E, 0 }, 0x1E14},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_underscore, SCIM_KEY_O, 0 }, 0x1E50},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_underscore, SCIM_KEY_e, 0 }, 0x1E15},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_underscore, SCIM_KEY_o, 0 }, 0x1E51},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_a, 0, 0 }, 0x00E0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_b, SCIM_KEY_A, 0 }, 0x1EB0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_b, SCIM_KEY_a, 0 }, 0x1EB1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_e, 0, 0 }, 0x00E8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_i, 0, 0 }, 0x00EC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_n, 0, 0 }, 0x01F9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_o, 0, 0 }, 0x00F2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_u, 0, 0 }, 0x00F9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_w, 0, 0 }, 0x1E81},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_y, 0, 0 }, 0x1EF3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_macron, SCIM_KEY_E, 0 }, 0x1E14},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_macron, SCIM_KEY_O, 0 }, 0x1E50},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_macron, SCIM_KEY_e, 0 }, 0x1E15},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_macron, SCIM_KEY_o, 0 }, 0x1E51},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Acircumflex, 0, 0 }, 0x1EA6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Ecircumflex, 0, 0 }, 0x1EC0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Ocircumflex, 0, 0 }, 0x1ED2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Udiaeresis, 0, 0 }, 0x01DB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_acircumflex, 0, 0 }, 0x1EA7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_ecircumflex, 0, 0 }, 0x1EC1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_ocircumflex, 0, 0 }, 0x1ED3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_udiaeresis, 0, 0 }, 0x01DC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Abreve, 0, 0 }, 0x1EB0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_abreve, 0, 0 }, 0x1EB1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Emacron, 0, 0 }, 0x1E14},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_emacron, 0, 0 }, 0x1E15},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Omacron, 0, 0 }, 0x1E50},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_omacron, 0, 0 }, 0x1E51},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Cyrillic_ie, 0, 0 }, 0x0450},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Cyrillic_i, 0, 0 }, 0x045D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Cyrillic_IE, 0, 0 }, 0x0400},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Cyrillic_I, 0, 0 }, 0x040D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_iotadieresis, 0, 0 }, 0x1FD2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_upsilondieresis, 0, 0 }, 0x1FE2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1FBA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_EPSILON, 0, 0 }, 0x1FC8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1FCA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1FDA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_OMICRON, 0, 0 }, 0x1FF8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_UPSILON, 0, 0 }, 0x1FEA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1FFA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1F70},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_epsilon, 0, 0 }, 0x1F72},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_eta, 0, 0 }, 0x1F74},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_iota, 0, 0 }, 0x1F76},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_omicron, 0, 0 }, 0x1F78},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1F7A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Greek_omega, 0, 0 }, 0x1F7C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Ohorn, 0, 0 }, 0x1EDC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_ohorn, 0, 0 }, 0x1EDD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_Uhorn, 0, 0 }, 0x1EEA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_uhorn, 0, 0 }, 0x1EEB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_A, 0 }, 0x1EA6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_E, 0 }, 0x1EC0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_O, 0 }, 0x1ED2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_a, 0 }, 0x1EA7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_e, 0 }, 0x1EC1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_circumflex, SCIM_KEY_o, 0 }, 0x1ED3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_macron, SCIM_KEY_E, 0 }, 0x1E14},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_macron, SCIM_KEY_O, 0 }, 0x1E50},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_macron, SCIM_KEY_e, 0 }, 0x1E15},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_macron, SCIM_KEY_o, 0 }, 0x1E51},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_breve, SCIM_KEY_A, 0 }, 0x1EB0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_breve, SCIM_KEY_a, 0 }, 0x1EB1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_diaeresis, SCIM_KEY_U, 0 }, 0x01DB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_diaeresis, SCIM_KEY_u, 0 }, 0x01DC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_iota, 0 }, 0x1FD2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_upsilon, 0 }, 0x1FE2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_horn, SCIM_KEY_O, 0 }, 0x1EDC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_horn, SCIM_KEY_U, 0 }, 0x1EEA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_horn, SCIM_KEY_o, 0 }, 0x1EDD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, SCIM_KEY_dead_horn, SCIM_KEY_u, 0 }, 0x1EEB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_ETA, 0 }, 0x1F2A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_alpha, 0 }, 0x1F02},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_epsilon, 0 }, 0x1F12},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_eta, 0 }, 0x1F22},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_iota, 0 }, 0x1F32},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_omicron, 0 }, 0x1F42},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_upsilon, 0 }, 0x1F52},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_omega, 0 }, 0x1F62},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_ETA, 0 }, 0x1F2B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_UPSILON, 0 }, 0x1F5B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_alpha, 0 }, 0x1F03},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_epsilon, 0 }, 0x1F13},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_eta, 0 }, 0x1F23},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_iota, 0 }, 0x1F33},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_omicron, 0 }, 0x1F43},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_upsilon, 0 }, 0x1F53},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_omega, 0 }, 0x1F63},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f00, 0, 0 }, 0x1F02},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f01, 0, 0 }, 0x1F03},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f08, 0, 0 }, 0x1F0A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f09, 0, 0 }, 0x1F0B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f10, 0, 0 }, 0x1F12},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f11, 0, 0 }, 0x1F13},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f18, 0, 0 }, 0x1F1A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f19, 0, 0 }, 0x1F1B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f20, 0, 0 }, 0x1F22},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f21, 0, 0 }, 0x1F23},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f28, 0, 0 }, 0x1F2A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f29, 0, 0 }, 0x1F2B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f30, 0, 0 }, 0x1F32},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f31, 0, 0 }, 0x1F33},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f38, 0, 0 }, 0x1F3A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f39, 0, 0 }, 0x1F3B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f40, 0, 0 }, 0x1F42},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f41, 0, 0 }, 0x1F43},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f48, 0, 0 }, 0x1F4A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f49, 0, 0 }, 0x1F4B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f50, 0, 0 }, 0x1F52},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f51, 0, 0 }, 0x1F53},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f59, 0, 0 }, 0x1F5B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f60, 0, 0 }, 0x1F62},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f61, 0, 0 }, 0x1F63},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f68, 0, 0 }, 0x1F6A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_grave, 0x1001f69, 0, 0 }, 0x1F6B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_a, SCIM_KEY_quotedbl, 0, 0 }, 0x00E4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_a, SCIM_KEY_apostrophe, 0, 0 }, 0x00E1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_a, SCIM_KEY_parenleft, 0, 0 }, 0x0103},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_a, SCIM_KEY_asterisk, 0, 0 }, 0x00E5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_a, SCIM_KEY_comma, 0, 0 }, 0x0105},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_a, SCIM_KEY_minus, 0, 0 }, 0x0101},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_a, SCIM_KEY_greater, 0, 0 }, 0x00E2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_a, SCIM_KEY_asciicircum, 0, 0 }, 0x00E2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_a, SCIM_KEY_underscore, 0, 0 }, 0x00AA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_a, SCIM_KEY_grave, 0, 0 }, 0x00E0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_a, SCIM_KEY_a, 0, 0 }, 0x00E5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_a, SCIM_KEY_e, 0, 0 }, 0x00E6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_a, SCIM_KEY_asciitilde, 0, 0 }, 0x00E3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_a, SCIM_KEY_diaeresis, 0, 0 }, 0x00E4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_a, SCIM_KEY_acute, 0, 0 }, 0x00E1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_exclam, SCIM_KEY_A, 0 }, 0x1EB6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_exclam, SCIM_KEY_a, 0 }, 0x1EB7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_comma, SCIM_KEY_E, 0 }, 0x1E1C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_comma, SCIM_KEY_e, 0 }, 0x1E1D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_period, 0, 0 }, 0x1E03},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_A, 0, 0 }, 0x0102},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_E, 0, 0 }, 0x0114},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_G, 0, 0 }, 0x011E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_I, 0, 0 }, 0x012C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_O, 0, 0 }, 0x014E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_U, 0, 0 }, 0x016C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_a, 0, 0 }, 0x0103},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_e, 0, 0 }, 0x0115},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_g, 0, 0 }, 0x011F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_i, 0, 0 }, 0x012D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_o, 0, 0 }, 0x014F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_u, 0, 0 }, 0x016D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_Cyrillic_a, 0, 0 }, 0x04D1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_Cyrillic_ie, 0, 0 }, 0x04D7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_Cyrillic_i, 0, 0 }, 0x0439},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_Cyrillic_u, 0, 0 }, 0x045E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_Cyrillic_zhe, 0, 0 }, 0x04C2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_Cyrillic_A, 0, 0 }, 0x04D0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_Cyrillic_IE, 0, 0 }, 0x04D6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_Cyrillic_I, 0, 0 }, 0x0419},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_Cyrillic_U, 0, 0 }, 0x040E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_Cyrillic_ZHE, 0, 0 }, 0x04C1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1FB8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1FD8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_Greek_UPSILON, 0, 0 }, 0x1FE8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1FB0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_Greek_iota, 0, 0 }, 0x1FD0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1FE0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_combining_belowdot, SCIM_KEY_A, 0 }, 0x1EB6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_combining_belowdot, SCIM_KEY_a, 0 }, 0x1EB7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_dead_cedilla, SCIM_KEY_E, 0 }, 0x1E1C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_dead_cedilla, SCIM_KEY_e, 0 }, 0x1E1D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_dead_belowdot, SCIM_KEY_A, 0 }, 0x1EB6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, SCIM_KEY_dead_belowdot, SCIM_KEY_a, 0 }, 0x1EB7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, 0x1000228, 0, 0 }, 0x1E1C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, 0x1000229, 0, 0 }, 0x1E1D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, 0x1001ea0, 0, 0 }, 0x1EB6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_b, 0x1001ea1, 0, 0 }, 0x1EB7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_quotedbl, SCIM_KEY_U, 0 }, 0x01D9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_quotedbl, SCIM_KEY_u, 0 }, 0x01DA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_apostrophe, 0, 0 }, 0x0107},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_comma, 0, 0 }, 0x00E7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_period, 0, 0 }, 0x010B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_slash, 0, 0 }, 0x00A2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_0, 0, 0 }, 0x00A9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_less, 0, 0 }, 0x010D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_equal, 0, 0 }, 0x20AC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_A, 0, 0 }, 0x01CD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_C, 0, 0 }, 0x010C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_D, 0, 0 }, 0x010E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_E, 0, 0 }, 0x011A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_G, 0, 0 }, 0x01E6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_H, 0, 0 }, 0x021E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_I, 0, 0 }, 0x01CF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_K, 0, 0 }, 0x01E8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_L, 0, 0 }, 0x013D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_N, 0, 0 }, 0x0147},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_O, 0, 0 }, 0x01D1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_R, 0, 0 }, 0x0158},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_S, 0, 0 }, 0x0160},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_T, 0, 0 }, 0x0164},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_U, 0, 0 }, 0x01D3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_Z, 0, 0 }, 0x017D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_a, 0, 0 }, 0x01CE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_c, 0, 0 }, 0x010D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_d, 0, 0 }, 0x010F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_e, 0, 0 }, 0x011B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_g, 0, 0 }, 0x01E7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_h, 0, 0 }, 0x021F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_i, 0, 0 }, 0x01D0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_j, 0, 0 }, 0x01F0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_k, 0, 0 }, 0x01E9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_l, 0, 0 }, 0x013E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_n, 0, 0 }, 0x0148},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_o, 0, 0 }, 0x01D2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_r, 0, 0 }, 0x0159},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_s, 0, 0 }, 0x0161},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_t, 0, 0 }, 0x0165},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_u, 0, 0 }, 0x01D4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_z, 0, 0 }, 0x017E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_bar, 0, 0 }, 0x00A2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_Udiaeresis, 0, 0 }, 0x01D9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_udiaeresis, 0, 0 }, 0x01DA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_dead_diaeresis, SCIM_KEY_U, 0 }, 0x01D9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, SCIM_KEY_dead_diaeresis, SCIM_KEY_u, 0 }, 0x01DA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, 0x10001b7, 0, 0 }, 0x01EE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_c, 0x1000292, 0, 0 }, 0x01EF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_d, SCIM_KEY_minus, 0, 0 }, 0x20AB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_d, SCIM_KEY_period, 0, 0 }, 0x1E0B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_d, SCIM_KEY_less, 0, 0 }, 0x010F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_d, SCIM_KEY_h, 0, 0 }, 0x00F0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_e, SCIM_KEY_quotedbl, 0, 0 }, 0x00EB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_e, SCIM_KEY_apostrophe, 0, 0 }, 0x00E9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_e, SCIM_KEY_comma, 0, 0 }, 0x0119},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_e, SCIM_KEY_minus, 0, 0 }, 0x0113},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_e, SCIM_KEY_period, 0, 0 }, 0x0117},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_e, SCIM_KEY_less, 0, 0 }, 0x011B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_e, SCIM_KEY_equal, 0, 0 }, 0x20AC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_e, SCIM_KEY_greater, 0, 0 }, 0x00EA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_e, SCIM_KEY_asciicircum, 0, 0 }, 0x00EA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_e, SCIM_KEY_underscore, 0, 0 }, 0x0113},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_e, SCIM_KEY_grave, 0, 0 }, 0x00E8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_e, SCIM_KEY_e, 0, 0 }, 0x0259},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_e, SCIM_KEY_diaeresis, 0, 0 }, 0x00EB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_e, SCIM_KEY_acute, 0, 0 }, 0x00E9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_f, SCIM_KEY_period, 0, 0 }, 0x1E1F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_f, SCIM_KEY_S, 0, 0 }, 0x017F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_f, SCIM_KEY_s, 0, 0 }, 0x017F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_g, SCIM_KEY_parenleft, 0, 0 }, 0x011F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_g, SCIM_KEY_comma, 0, 0 }, 0x0123},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_g, SCIM_KEY_period, 0, 0 }, 0x0121},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_g, SCIM_KEY_U, 0, 0 }, 0x011F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_g, SCIM_KEY_breve, 0, 0 }, 0x011F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_i, SCIM_KEY_quotedbl, 0, 0 }, 0x00EF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_i, SCIM_KEY_apostrophe, 0, 0 }, 0x00ED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_i, SCIM_KEY_comma, 0, 0 }, 0x012F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_i, SCIM_KEY_minus, 0, 0 }, 0x012B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_i, SCIM_KEY_period, 0, 0 }, 0x0131},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_i, SCIM_KEY_greater, 0, 0 }, 0x00EE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_i, SCIM_KEY_asciicircum, 0, 0 }, 0x00EE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_i, SCIM_KEY_underscore, 0, 0 }, 0x012B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_i, SCIM_KEY_grave, 0, 0 }, 0x00EC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_i, SCIM_KEY_asciitilde, 0, 0 }, 0x0129},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_i, SCIM_KEY_diaeresis, 0, 0 }, 0x00EF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_i, SCIM_KEY_acute, 0, 0 }, 0x00ED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_k, SCIM_KEY_comma, 0, 0 }, 0x0137},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_k, SCIM_KEY_k, 0, 0 }, 0x0138},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_l, SCIM_KEY_apostrophe, 0, 0 }, 0x013A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_l, SCIM_KEY_comma, 0, 0 }, 0x013C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_l, SCIM_KEY_minus, 0, 0 }, 0x00A3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_l, SCIM_KEY_less, 0, 0 }, 0x013E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_l, SCIM_KEY_equal, 0, 0 }, 0x00A3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_l, SCIM_KEY_v, 0, 0 }, 0x007C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_m, SCIM_KEY_period, 0, 0 }, 0x1E41},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_m, SCIM_KEY_slash, 0, 0 }, 0x20A5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_m, SCIM_KEY_u, 0, 0 }, 0x00B5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_n, SCIM_KEY_apostrophe, 0, 0 }, 0x0144},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_n, SCIM_KEY_comma, 0, 0 }, 0x0146},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_n, SCIM_KEY_minus, 0, 0 }, 0x00F1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_n, SCIM_KEY_less, 0, 0 }, 0x0148},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_n, SCIM_KEY_g, 0, 0 }, 0x014B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_n, SCIM_KEY_asciitilde, 0, 0 }, 0x00F1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_quotedbl, 0, 0 }, 0x00F6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_apostrophe, 0, 0 }, 0x00F3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_apostrophe, SCIM_KEY_A, 0 }, 0x01FA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_apostrophe, SCIM_KEY_a, 0 }, 0x01FB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_minus, 0, 0 }, 0x014D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_slash, 0, 0 }, 0x00F8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_greater, 0, 0 }, 0x00F4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_A, 0, 0 }, 0x00C5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_C, 0, 0 }, 0x00A9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_R, 0, 0 }, 0x00AE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_U, 0, 0 }, 0x016E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_X, 0, 0 }, 0x00A4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_asciicircum, 0, 0 }, 0x00F4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_underscore, 0, 0 }, 0x00BA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_grave, 0, 0 }, 0x00F2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_a, 0, 0 }, 0x00E5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_c, 0, 0 }, 0x00A9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_e, 0, 0 }, 0x0153},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_o, 0, 0 }, 0x00B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_r, 0, 0 }, 0x00AE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_s, 0, 0 }, 0x00A7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_u, 0, 0 }, 0x016F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_w, 0, 0 }, 0x1E98},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_x, 0, 0 }, 0x00A4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_y, 0, 0 }, 0x1E99},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_asciitilde, 0, 0 }, 0x00F5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_diaeresis, 0, 0 }, 0x00F6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_o, SCIM_KEY_acute, 0, 0 }, 0x00F3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_p, SCIM_KEY_exclam, 0, 0 }, 0x00B6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_p, SCIM_KEY_period, 0, 0 }, 0x1E57},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_r, SCIM_KEY_apostrophe, 0, 0 }, 0x0155},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_r, SCIM_KEY_comma, 0, 0 }, 0x0157},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_r, SCIM_KEY_less, 0, 0 }, 0x0159},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_s, SCIM_KEY_exclam, 0, 0 }, 0x00A7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_s, SCIM_KEY_apostrophe, 0, 0 }, 0x015B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_s, SCIM_KEY_comma, 0, 0 }, 0x015F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_s, SCIM_KEY_period, 0, 0 }, 0x1E61},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_s, SCIM_KEY_0, 0, 0 }, 0x00A7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_s, SCIM_KEY_1, 0, 0 }, 0x00B9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_s, SCIM_KEY_2, 0, 0 }, 0x00B2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_s, SCIM_KEY_3, 0, 0 }, 0x00B3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_s, SCIM_KEY_less, 0, 0 }, 0x0161},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_s, SCIM_KEY_o, 0, 0 }, 0x00A7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_s, SCIM_KEY_s, 0, 0 }, 0x00DF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_s, SCIM_KEY_cedilla, 0, 0 }, 0x015F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_t, SCIM_KEY_minus, 0, 0 }, 0x0167},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_t, SCIM_KEY_period, 0, 0 }, 0x1E6B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_t, SCIM_KEY_slash, 0, 0 }, 0x0167},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_t, SCIM_KEY_less, 0, 0 }, 0x0165},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_t, SCIM_KEY_h, 0, 0 }, 0x00FE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_u, SCIM_KEY_quotedbl, 0, 0 }, 0x00FC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_u, SCIM_KEY_apostrophe, 0, 0 }, 0x00FA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_u, SCIM_KEY_asterisk, 0, 0 }, 0x016F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_u, SCIM_KEY_comma, 0, 0 }, 0x0173},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_u, SCIM_KEY_minus, 0, 0 }, 0x016B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_u, SCIM_KEY_slash, 0, 0 }, 0x00B5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_u, SCIM_KEY_greater, 0, 0 }, 0x00FB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_u, SCIM_KEY_asciicircum, 0, 0 }, 0x00FB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_u, SCIM_KEY_underscore, 0, 0 }, 0x016B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_u, SCIM_KEY_grave, 0, 0 }, 0x00F9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_u, SCIM_KEY_asciitilde, 0, 0 }, 0x0169},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_u, SCIM_KEY_diaeresis, 0, 0 }, 0x00FC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_u, SCIM_KEY_acute, 0, 0 }, 0x00FA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_v, SCIM_KEY_Z, 0, 0 }, 0x017D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_v, SCIM_KEY_l, 0, 0 }, 0x007C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_v, SCIM_KEY_z, 0, 0 }, 0x017E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_w, SCIM_KEY_asciicircum, 0, 0 }, 0x0175},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_x, SCIM_KEY_0, 0, 0 }, 0x00A4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_x, SCIM_KEY_O, 0, 0 }, 0x00A4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_x, SCIM_KEY_o, 0, 0 }, 0x00A4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_x, SCIM_KEY_x, 0, 0 }, 0x00D7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_y, SCIM_KEY_quotedbl, 0, 0 }, 0x00FF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_y, SCIM_KEY_apostrophe, 0, 0 }, 0x00FD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_y, SCIM_KEY_minus, 0, 0 }, 0x00A5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_y, SCIM_KEY_equal, 0, 0 }, 0x00A5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_y, SCIM_KEY_asciicircum, 0, 0 }, 0x0177},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_y, SCIM_KEY_diaeresis, 0, 0 }, 0x00FF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_y, SCIM_KEY_acute, 0, 0 }, 0x00FD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_z, SCIM_KEY_apostrophe, 0, 0 }, 0x017A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_z, SCIM_KEY_period, 0, 0 }, 0x017C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_z, SCIM_KEY_less, 0, 0 }, 0x017E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_bar, SCIM_KEY_C, 0, 0 }, 0x00A2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_bar, SCIM_KEY_c, 0, 0 }, 0x00A2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_space, 0, 0 }, 0x007E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_quotedbl, SCIM_KEY_Greek_iota, 0 }, 0x1FD7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_quotedbl, SCIM_KEY_Greek_upsilon, 0 }, 0x1FE7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA, 0 }, 0x1F2F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_UPSILON, 0 }, 0x1F5F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha, 0 }, 0x1F07},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta, 0 }, 0x1F27},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_iota, 0 }, 0x1F37},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_upsilon, 0 }, 0x1F57},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega, 0 }, 0x1F67},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA, 0 }, 0x1F2E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha, 0 }, 0x1F06},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_eta, 0 }, 0x1F26},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_iota, 0 }, 0x1F36},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_upsilon, 0 }, 0x1F56},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_omega, 0 }, 0x1F66},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_plus, SCIM_KEY_O, 0 }, 0x1EE0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_plus, SCIM_KEY_U, 0 }, 0x1EEE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_plus, SCIM_KEY_o, 0 }, 0x1EE1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_plus, SCIM_KEY_u, 0 }, 0x1EEF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_A, 0, 0 }, 0x00C3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_E, 0, 0 }, 0x1EBC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_I, 0, 0 }, 0x0128},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_N, 0, 0 }, 0x00D1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_O, 0, 0 }, 0x00D5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_U, 0, 0 }, 0x0168},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_U, SCIM_KEY_A, 0 }, 0x1EB4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_U, SCIM_KEY_a, 0 }, 0x1EB5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_V, 0, 0 }, 0x1E7C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_Y, 0, 0 }, 0x1EF8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_asciicircum, SCIM_KEY_A, 0 }, 0x1EAA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_asciicircum, SCIM_KEY_E, 0 }, 0x1EC4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_asciicircum, SCIM_KEY_O, 0 }, 0x1ED6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_asciicircum, SCIM_KEY_a, 0 }, 0x1EAB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_asciicircum, SCIM_KEY_e, 0 }, 0x1EC5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_asciicircum, SCIM_KEY_o, 0 }, 0x1ED7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_a, 0, 0 }, 0x00E3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_b, SCIM_KEY_A, 0 }, 0x1EB4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_b, SCIM_KEY_a, 0 }, 0x1EB5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_e, 0, 0 }, 0x1EBD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_i, 0, 0 }, 0x0129},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_n, 0, 0 }, 0x00F1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_o, 0, 0 }, 0x00F5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_u, 0, 0 }, 0x0169},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_v, 0, 0 }, 0x1E7D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_y, 0, 0 }, 0x1EF9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_Acircumflex, 0, 0 }, 0x1EAA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_Ecircumflex, 0, 0 }, 0x1EC4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_Ocircumflex, 0, 0 }, 0x1ED6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_acircumflex, 0, 0 }, 0x1EAB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_ecircumflex, 0, 0 }, 0x1EC5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_ocircumflex, 0, 0 }, 0x1ED7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_Abreve, 0, 0 }, 0x1EB4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_abreve, 0, 0 }, 0x1EB5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_Greek_iotadieresis, 0, 0 }, 0x1FD7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_Greek_upsilondieresis, 0, 0 }, 0x1FE7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1FB6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_Greek_eta, 0, 0 }, 0x1FC6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_Greek_iota, 0, 0 }, 0x1FD6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1FE6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_Greek_omega, 0, 0 }, 0x1FF6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_Ohorn, 0, 0 }, 0x1EE0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_ohorn, 0, 0 }, 0x1EE1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_Uhorn, 0, 0 }, 0x1EEE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_uhorn, 0, 0 }, 0x1EEF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_dead_circumflex, SCIM_KEY_A, 0 }, 0x1EAA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_dead_circumflex, SCIM_KEY_E, 0 }, 0x1EC4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_dead_circumflex, SCIM_KEY_O, 0 }, 0x1ED6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_dead_circumflex, SCIM_KEY_a, 0 }, 0x1EAB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_dead_circumflex, SCIM_KEY_e, 0 }, 0x1EC5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_dead_circumflex, SCIM_KEY_o, 0 }, 0x1ED7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_dead_breve, SCIM_KEY_A, 0 }, 0x1EB4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_dead_breve, SCIM_KEY_a, 0 }, 0x1EB5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_iota, 0 }, 0x1FD7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_upsilon, 0 }, 0x1FE7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_dead_horn, SCIM_KEY_O, 0 }, 0x1EE0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_dead_horn, SCIM_KEY_U, 0 }, 0x1EEE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_dead_horn, SCIM_KEY_o, 0 }, 0x1EE1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, SCIM_KEY_dead_horn, SCIM_KEY_u, 0 }, 0x1EEF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_ETA, 0 }, 0x1F2E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_alpha, 0 }, 0x1F06},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_eta, 0 }, 0x1F26},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_iota, 0 }, 0x1F36},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_upsilon, 0 }, 0x1F56},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_omega, 0 }, 0x1F66},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_ETA, 0 }, 0x1F2F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_UPSILON, 0 }, 0x1F5F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_alpha, 0 }, 0x1F07},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_eta, 0 }, 0x1F27},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_iota, 0 }, 0x1F37},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_upsilon, 0 }, 0x1F57},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_omega, 0 }, 0x1F67},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f00, 0, 0 }, 0x1F06},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f01, 0, 0 }, 0x1F07},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f08, 0, 0 }, 0x1F0E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f09, 0, 0 }, 0x1F0F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f20, 0, 0 }, 0x1F26},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f21, 0, 0 }, 0x1F27},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f28, 0, 0 }, 0x1F2E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f29, 0, 0 }, 0x1F2F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f30, 0, 0 }, 0x1F36},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f31, 0, 0 }, 0x1F37},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f38, 0, 0 }, 0x1F3E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f39, 0, 0 }, 0x1F3F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f50, 0, 0 }, 0x1F56},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f51, 0, 0 }, 0x1F57},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f59, 0, 0 }, 0x1F5F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f60, 0, 0 }, 0x1F66},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f61, 0, 0 }, 0x1F67},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f68, 0, 0 }, 0x1F6E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_asciitilde, 0x1001f69, 0, 0 }, 0x1F6F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_apostrophe, 0, 0 }, 0x0385},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_A, 0, 0 }, 0x00C4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_E, 0, 0 }, 0x00CB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_I, 0, 0 }, 0x00CF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_O, 0, 0 }, 0x00D6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_U, 0, 0 }, 0x00DC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_Y, 0, 0 }, 0x0178},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_grave, 0, 0 }, 0x1FED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_a, 0, 0 }, 0x00E4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_e, 0, 0 }, 0x00EB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_i, 0, 0 }, 0x00EF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_o, 0, 0 }, 0x00F6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_u, 0, 0 }, 0x00FC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_y, 0, 0 }, 0x00FF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_asciitilde, 0, 0 }, 0x1FC1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_acute, 0, 0 }, 0x0385},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_combining_grave, 0, 0 }, 0x1FED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_combining_acute, 0, 0 }, 0x0385},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_dead_grave, 0, 0 }, 0x1FED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_dead_acute, 0, 0 }, 0x0385},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, SCIM_KEY_dead_tilde, 0, 0 }, 0x1FC1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_diaeresis, 0x1000342, 0, 0 }, 0x1FC1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_exclam, SCIM_KEY_L, 0 }, 0x1E38},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_exclam, SCIM_KEY_R, 0 }, 0x1E5C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_exclam, SCIM_KEY_l, 0 }, 0x1E39},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_exclam, SCIM_KEY_r, 0 }, 0x1E5D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_quotedbl, SCIM_KEY_A, 0 }, 0x01DE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_quotedbl, SCIM_KEY_O, 0 }, 0x022A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_quotedbl, SCIM_KEY_U, 0 }, 0x01D5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_quotedbl, SCIM_KEY_a, 0 }, 0x01DF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_quotedbl, SCIM_KEY_o, 0 }, 0x022B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_quotedbl, SCIM_KEY_u, 0 }, 0x01D6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_period, SCIM_KEY_A, 0 }, 0x01E0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_period, SCIM_KEY_O, 0 }, 0x0230},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_period, SCIM_KEY_a, 0 }, 0x01E1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_period, SCIM_KEY_o, 0 }, 0x0231},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_semicolon, SCIM_KEY_O, 0 }, 0x01EC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_semicolon, SCIM_KEY_o, 0 }, 0x01ED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_A, 0, 0 }, 0x0100},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_E, 0, 0 }, 0x0112},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_G, 0, 0 }, 0x1E20},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_I, 0, 0 }, 0x012A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_O, 0, 0 }, 0x014C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_U, 0, 0 }, 0x016A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_Y, 0, 0 }, 0x0232},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_a, 0, 0 }, 0x0101},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_e, 0, 0 }, 0x0113},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_g, 0, 0 }, 0x1E21},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_i, 0, 0 }, 0x012B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_o, 0, 0 }, 0x014D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_u, 0, 0 }, 0x016B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_y, 0, 0 }, 0x0233},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_asciitilde, SCIM_KEY_O, 0 }, 0x022C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_asciitilde, SCIM_KEY_o, 0 }, 0x022D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_Adiaeresis, 0, 0 }, 0x01DE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_AE, 0, 0 }, 0x01E2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_Otilde, 0, 0 }, 0x022C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_Odiaeresis, 0, 0 }, 0x022A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_Udiaeresis, 0, 0 }, 0x01D5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_adiaeresis, 0, 0 }, 0x01DF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_ae, 0, 0 }, 0x01E3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_otilde, 0, 0 }, 0x022D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_odiaeresis, 0, 0 }, 0x022B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_udiaeresis, 0, 0 }, 0x01D6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_Cyrillic_i, 0, 0 }, 0x04E3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_Cyrillic_u, 0, 0 }, 0x04EF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_Cyrillic_I, 0, 0 }, 0x04E2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_Cyrillic_U, 0, 0 }, 0x04EE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1FB9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1FD9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_Greek_UPSILON, 0, 0 }, 0x1FE9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1FB1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_Greek_iota, 0, 0 }, 0x1FD1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1FE1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_combining_tilde, SCIM_KEY_O, 0 }, 0x022C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_combining_tilde, SCIM_KEY_o, 0 }, 0x022D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_combining_belowdot, SCIM_KEY_L, 0 }, 0x1E38},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_combining_belowdot, SCIM_KEY_R, 0 }, 0x1E5C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_combining_belowdot, SCIM_KEY_l, 0 }, 0x1E39},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_combining_belowdot, SCIM_KEY_r, 0 }, 0x1E5D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_tilde, SCIM_KEY_O, 0 }, 0x022C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_tilde, SCIM_KEY_o, 0 }, 0x022D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_abovedot, SCIM_KEY_A, 0 }, 0x01E0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_abovedot, SCIM_KEY_O, 0 }, 0x0230},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_abovedot, SCIM_KEY_a, 0 }, 0x01E1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_abovedot, SCIM_KEY_o, 0 }, 0x0231},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_diaeresis, SCIM_KEY_A, 0 }, 0x01DE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_diaeresis, SCIM_KEY_O, 0 }, 0x022A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_diaeresis, SCIM_KEY_U, 0 }, 0x01D5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_diaeresis, SCIM_KEY_a, 0 }, 0x01DF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_diaeresis, SCIM_KEY_o, 0 }, 0x022B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_diaeresis, SCIM_KEY_u, 0 }, 0x01D6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_ogonek, SCIM_KEY_O, 0 }, 0x01EC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_ogonek, SCIM_KEY_o, 0 }, 0x01ED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_belowdot, SCIM_KEY_L, 0 }, 0x1E38},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_belowdot, SCIM_KEY_R, 0 }, 0x1E5C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_belowdot, SCIM_KEY_l, 0 }, 0x1E39},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, SCIM_KEY_dead_belowdot, SCIM_KEY_r, 0 }, 0x1E5D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, 0x10001ea, 0, 0 }, 0x01EC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, 0x10001eb, 0, 0 }, 0x01ED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, 0x1000226, 0, 0 }, 0x01E0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, 0x1000227, 0, 0 }, 0x01E1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, 0x100022e, 0, 0 }, 0x0230},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, 0x100022f, 0, 0 }, 0x0231},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, 0x1001e36, 0, 0 }, 0x1E38},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, 0x1001e37, 0, 0 }, 0x1E39},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, 0x1001e5a, 0, 0 }, 0x1E5C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_macron, 0x1001e5b, 0, 0 }, 0x1E5D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_quotedbl, SCIM_KEY_I, 0 }, 0x1E2E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_quotedbl, SCIM_KEY_U, 0 }, 0x01D7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_quotedbl, SCIM_KEY_i, 0 }, 0x1E2F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_quotedbl, SCIM_KEY_u, 0 }, 0x01D8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_quotedbl, SCIM_KEY_Greek_iota, 0 }, 0x0390},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_quotedbl, SCIM_KEY_Greek_upsilon, 0 }, 0x03B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA, 0 }, 0x1F2D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_UPSILON, 0 }, 0x1F5D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha, 0 }, 0x1F05},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_epsilon, 0 }, 0x1F15},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta, 0 }, 0x1F25},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_iota, 0 }, 0x1F35},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_omicron, 0 }, 0x1F45},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_upsilon, 0 }, 0x1F55},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega, 0 }, 0x1F65},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA, 0 }, 0x1F2C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha, 0 }, 0x1F04},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_epsilon, 0 }, 0x1F14},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_eta, 0 }, 0x1F24},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_iota, 0 }, 0x1F34},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_omicron, 0 }, 0x1F44},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_upsilon, 0 }, 0x1F54},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_omega, 0 }, 0x1F64},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_plus, SCIM_KEY_O, 0 }, 0x1EDA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_plus, SCIM_KEY_U, 0 }, 0x1EE8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_plus, SCIM_KEY_o, 0 }, 0x1EDB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_plus, SCIM_KEY_u, 0 }, 0x1EE9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_comma, SCIM_KEY_C, 0 }, 0x1E08},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_comma, SCIM_KEY_c, 0 }, 0x1E09},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_slash, SCIM_KEY_O, 0 }, 0x01FE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_slash, SCIM_KEY_o, 0 }, 0x01FF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_A, 0, 0 }, 0x00C1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_C, 0, 0 }, 0x0106},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_E, 0, 0 }, 0x00C9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_G, 0, 0 }, 0x01F4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_I, 0, 0 }, 0x00CD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_K, 0, 0 }, 0x1E30},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_L, 0, 0 }, 0x0139},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_M, 0, 0 }, 0x1E3E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_N, 0, 0 }, 0x0143},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_O, 0, 0 }, 0x00D3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_P, 0, 0 }, 0x1E54},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_R, 0, 0 }, 0x0154},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_S, 0, 0 }, 0x015A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_U, 0, 0 }, 0x00DA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_U, SCIM_KEY_A, 0 }, 0x1EAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_U, SCIM_KEY_a, 0 }, 0x1EAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_W, 0, 0 }, 0x1E82},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Y, 0, 0 }, 0x00DD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Z, 0, 0 }, 0x0179},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_asciicircum, SCIM_KEY_A, 0 }, 0x1EA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_asciicircum, SCIM_KEY_E, 0 }, 0x1EBE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_asciicircum, SCIM_KEY_O, 0 }, 0x1ED0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_asciicircum, SCIM_KEY_a, 0 }, 0x1EA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_asciicircum, SCIM_KEY_e, 0 }, 0x1EBF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_asciicircum, SCIM_KEY_o, 0 }, 0x1ED1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_underscore, SCIM_KEY_E, 0 }, 0x1E16},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_underscore, SCIM_KEY_O, 0 }, 0x1E52},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_underscore, SCIM_KEY_e, 0 }, 0x1E17},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_underscore, SCIM_KEY_o, 0 }, 0x1E53},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_a, 0, 0 }, 0x00E1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_b, SCIM_KEY_A, 0 }, 0x1EAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_b, SCIM_KEY_a, 0 }, 0x1EAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_c, 0, 0 }, 0x0107},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_e, 0, 0 }, 0x00E9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_g, 0, 0 }, 0x01F5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_i, 0, 0 }, 0x00ED},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_k, 0, 0 }, 0x1E31},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_l, 0, 0 }, 0x013A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_m, 0, 0 }, 0x1E3F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_n, 0, 0 }, 0x0144},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_o, 0, 0 }, 0x00F3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_o, SCIM_KEY_A, 0 }, 0x01FA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_o, SCIM_KEY_a, 0 }, 0x01FB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_p, 0, 0 }, 0x1E55},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_r, 0, 0 }, 0x0155},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_s, 0, 0 }, 0x015B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_u, 0, 0 }, 0x00FA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_w, 0, 0 }, 0x1E83},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_y, 0, 0 }, 0x00FD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_z, 0, 0 }, 0x017A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_asciitilde, SCIM_KEY_O, 0 }, 0x1E4C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_asciitilde, SCIM_KEY_U, 0 }, 0x1E78},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_asciitilde, SCIM_KEY_o, 0 }, 0x1E4D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_asciitilde, SCIM_KEY_u, 0 }, 0x1E79},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_macron, SCIM_KEY_E, 0 }, 0x1E16},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_macron, SCIM_KEY_O, 0 }, 0x1E52},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_macron, SCIM_KEY_e, 0 }, 0x1E17},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_macron, SCIM_KEY_o, 0 }, 0x1E53},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Acircumflex, 0, 0 }, 0x1EA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Aring, 0, 0 }, 0x01FA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_AE, 0, 0 }, 0x01FC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Ccedilla, 0, 0 }, 0x1E08},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Ecircumflex, 0, 0 }, 0x1EBE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Idiaeresis, 0, 0 }, 0x1E2E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Ocircumflex, 0, 0 }, 0x1ED0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Otilde, 0, 0 }, 0x1E4C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Ooblique, 0, 0 }, 0x01FE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Udiaeresis, 0, 0 }, 0x01D7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_acircumflex, 0, 0 }, 0x1EA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_aring, 0, 0 }, 0x01FB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_ae, 0, 0 }, 0x01FD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_ccedilla, 0, 0 }, 0x1E09},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_ecircumflex, 0, 0 }, 0x1EBF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_idiaeresis, 0, 0 }, 0x1E2F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_ocircumflex, 0, 0 }, 0x1ED1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_otilde, 0, 0 }, 0x1E4D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_oslash, 0, 0 }, 0x01FF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_udiaeresis, 0, 0 }, 0x01D8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Abreve, 0, 0 }, 0x1EAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_abreve, 0, 0 }, 0x1EAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Emacron, 0, 0 }, 0x1E16},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_emacron, 0, 0 }, 0x1E17},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Omacron, 0, 0 }, 0x1E52},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Utilde, 0, 0 }, 0x1E78},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_omacron, 0, 0 }, 0x1E53},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_utilde, 0, 0 }, 0x1E79},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Cyrillic_ghe, 0, 0 }, 0x0453},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Cyrillic_ka, 0, 0 }, 0x045C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Cyrillic_GHE, 0, 0 }, 0x0403},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Cyrillic_KA, 0, 0 }, 0x040C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_iotadieresis, 0, 0 }, 0x0390},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_upsilondieresis, 0, 0 }, 0x03B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x0386},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_EPSILON, 0, 0 }, 0x0388},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_ETA, 0, 0 }, 0x0389},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x038A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_OMICRON, 0, 0 }, 0x038C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_UPSILON, 0, 0 }, 0x038E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x038F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_alpha, 0, 0 }, 0x03AC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_epsilon, 0, 0 }, 0x03AD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_eta, 0, 0 }, 0x03AE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_iota, 0, 0 }, 0x03AF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_omicron, 0, 0 }, 0x03CC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x03CD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Greek_omega, 0, 0 }, 0x03CE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_combining_tilde, SCIM_KEY_O, 0 }, 0x1E4C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_combining_tilde, SCIM_KEY_U, 0 }, 0x1E78},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_combining_tilde, SCIM_KEY_o, 0 }, 0x1E4D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_combining_tilde, SCIM_KEY_u, 0 }, 0x1E79},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Ohorn, 0, 0 }, 0x1EDA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_ohorn, 0, 0 }, 0x1EDB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_Uhorn, 0, 0 }, 0x1EE8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_uhorn, 0, 0 }, 0x1EE9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_A, 0 }, 0x1EA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_E, 0 }, 0x1EBE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_O, 0 }, 0x1ED0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_a, 0 }, 0x1EA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_e, 0 }, 0x1EBF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_circumflex, SCIM_KEY_o, 0 }, 0x1ED1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_tilde, SCIM_KEY_O, 0 }, 0x1E4C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_tilde, SCIM_KEY_U, 0 }, 0x1E78},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_tilde, SCIM_KEY_o, 0 }, 0x1E4D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_tilde, SCIM_KEY_u, 0 }, 0x1E79},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_macron, SCIM_KEY_E, 0 }, 0x1E16},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_macron, SCIM_KEY_O, 0 }, 0x1E52},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_macron, SCIM_KEY_e, 0 }, 0x1E17},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_macron, SCIM_KEY_o, 0 }, 0x1E53},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_breve, SCIM_KEY_A, 0 }, 0x1EAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_breve, SCIM_KEY_a, 0 }, 0x1EAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_I, 0 }, 0x1E2E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_U, 0 }, 0x01D7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_i, 0 }, 0x1E2F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_u, 0 }, 0x01D8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_iota, 0 }, 0x0390},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_upsilon, 0 }, 0x03B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_abovering, SCIM_KEY_A, 0 }, 0x01FA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_abovering, SCIM_KEY_a, 0 }, 0x01FB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_cedilla, SCIM_KEY_C, 0 }, 0x1E08},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_cedilla, SCIM_KEY_c, 0 }, 0x1E09},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_horn, SCIM_KEY_O, 0 }, 0x1EDA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_horn, SCIM_KEY_U, 0 }, 0x1EE8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_horn, SCIM_KEY_o, 0 }, 0x1EDB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_dead_horn, SCIM_KEY_u, 0 }, 0x1EE9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_KP_Divide, SCIM_KEY_O, 0 }, 0x01FE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, SCIM_KEY_KP_Divide, SCIM_KEY_o, 0 }, 0x01FF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_ETA, 0 }, 0x1F2C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_alpha, 0 }, 0x1F04},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_epsilon, 0 }, 0x1F14},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_eta, 0 }, 0x1F24},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_iota, 0 }, 0x1F34},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_omicron, 0 }, 0x1F44},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_upsilon, 0 }, 0x1F54},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_omega, 0 }, 0x1F64},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_EPSILON, 0 }, 0x1F1D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_ETA, 0 }, 0x1F2D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_OMICRON, 0 }, 0x1F4D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_UPSILON, 0 }, 0x1F5D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_alpha, 0 }, 0x1F05},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_epsilon, 0 }, 0x1F15},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_eta, 0 }, 0x1F25},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_iota, 0 }, 0x1F35},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_omicron, 0 }, 0x1F45},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_upsilon, 0 }, 0x1F55},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_omega, 0 }, 0x1F65},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x10003d2, 0, 0 }, 0x03D3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f00, 0, 0 }, 0x1F04},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f01, 0, 0 }, 0x1F05},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f08, 0, 0 }, 0x1F0C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f09, 0, 0 }, 0x1F0D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f10, 0, 0 }, 0x1F14},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f11, 0, 0 }, 0x1F15},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f18, 0, 0 }, 0x1F1C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f19, 0, 0 }, 0x1F1D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f20, 0, 0 }, 0x1F24},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f21, 0, 0 }, 0x1F25},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f28, 0, 0 }, 0x1F2C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f29, 0, 0 }, 0x1F2D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f30, 0, 0 }, 0x1F34},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f31, 0, 0 }, 0x1F35},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f38, 0, 0 }, 0x1F3C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f39, 0, 0 }, 0x1F3D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f40, 0, 0 }, 0x1F44},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f41, 0, 0 }, 0x1F45},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f48, 0, 0 }, 0x1F4C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f49, 0, 0 }, 0x1F4D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f50, 0, 0 }, 0x1F54},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f51, 0, 0 }, 0x1F55},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f59, 0, 0 }, 0x1F5D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f60, 0, 0 }, 0x1F64},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f61, 0, 0 }, 0x1F65},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f68, 0, 0 }, 0x1F6C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_acute, 0x1001f69, 0, 0 }, 0x1F6D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_cedilla, SCIM_KEY_S, 0, 0 }, 0x015E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_cedilla, SCIM_KEY_s, 0, 0 }, 0x015F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_breve, SCIM_KEY_G, 0, 0 }, 0x011E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_breve, SCIM_KEY_g, 0, 0 }, 0x011F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_ALPHA, SCIM_KEY_apostrophe, 0, 0 }, 0x0386},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_EPSILON, SCIM_KEY_apostrophe, 0, 0 }, 0x0388},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_ETA, SCIM_KEY_apostrophe, 0, 0 }, 0x0389},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_IOTA, SCIM_KEY_quotedbl, 0, 0 }, 0x03AA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_IOTA, SCIM_KEY_apostrophe, 0, 0 }, 0x038A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_OMICRON, SCIM_KEY_apostrophe, 0, 0 }, 0x038C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_UPSILON, SCIM_KEY_quotedbl, 0, 0 }, 0x03AB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_UPSILON, SCIM_KEY_apostrophe, 0, 0 }, 0x038E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_OMEGA, SCIM_KEY_apostrophe, 0, 0 }, 0x038F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_alpha, SCIM_KEY_apostrophe, 0, 0 }, 0x03AC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_epsilon, SCIM_KEY_apostrophe, 0, 0 }, 0x03AD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_eta, SCIM_KEY_apostrophe, 0, 0 }, 0x03AE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_quotedbl, 0, 0 }, 0x03CA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0, 0 }, 0x03AF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F85},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F95},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F84},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F94},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, SCIM_KEY_Greek_alpha, 0 }, 0x1FB4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, SCIM_KEY_Greek_eta, 0 }, 0x1FC4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, SCIM_KEY_Greek_omega, 0 }, 0x1FF4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_ALPHA }, 0x1F8C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_ETA }, 0x1F9C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_OMEGA }, 0x1FAC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_alpha }, 0x1F84},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_eta }, 0x1F94},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1000313, SCIM_KEY_Greek_omega }, 0x1FA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_ALPHA }, 0x1F8D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_ETA }, 0x1F9D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_OMEGA }, 0x1FAD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_alpha }, 0x1F85},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_eta }, 0x1F95},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1000314, SCIM_KEY_Greek_omega }, 0x1FA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1001f00, 0 }, 0x1F84},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1001f01, 0 }, 0x1F85},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1001f08, 0 }, 0x1F8C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1001f09, 0 }, 0x1F8D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1001f20, 0 }, 0x1F94},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1001f21, 0 }, 0x1F95},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1001f28, 0 }, 0x1F9C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1001f29, 0 }, 0x1F9D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1001f60, 0 }, 0x1FA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1001f61, 0 }, 0x1FA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1001f68, 0 }, 0x1FAC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_apostrophe, 0x1001f69, 0 }, 0x1FAD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F89},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA, 0 }, 0x1F99},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FA9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha, 0 }, 0x1F81},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta, 0 }, 0x1F91},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega, 0 }, 0x1FA1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F88},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA, 0 }, 0x1F98},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FA8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha, 0 }, 0x1F80},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_parenright, SCIM_KEY_Greek_eta, 0 }, 0x1F90},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_parenright, SCIM_KEY_Greek_omega, 0 }, 0x1FA0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F83},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F93},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F82},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F92},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, SCIM_KEY_Greek_alpha, 0 }, 0x1FB2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, SCIM_KEY_Greek_eta, 0 }, 0x1FC2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, SCIM_KEY_Greek_omega, 0 }, 0x1FF2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_ALPHA }, 0x1F8A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_ETA }, 0x1F9A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_OMEGA }, 0x1FAA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_alpha }, 0x1F82},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_eta }, 0x1F92},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1000313, SCIM_KEY_Greek_omega }, 0x1FA2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_ALPHA }, 0x1F8B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_ETA }, 0x1F9B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_OMEGA }, 0x1FAB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_alpha }, 0x1F83},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_eta }, 0x1F93},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1000314, SCIM_KEY_Greek_omega }, 0x1FA3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1001f00, 0 }, 0x1F82},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1001f01, 0 }, 0x1F83},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1001f08, 0 }, 0x1F8A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1001f09, 0 }, 0x1F8B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1001f20, 0 }, 0x1F92},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1001f21, 0 }, 0x1F93},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1001f28, 0 }, 0x1F9A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1001f29, 0 }, 0x1F9B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1001f60, 0 }, 0x1FA2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1001f61, 0 }, 0x1FA3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1001f68, 0 }, 0x1FAA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_grave, 0x1001f69, 0 }, 0x1FAB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F87},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F97},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F86},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F96},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, SCIM_KEY_Greek_alpha, 0 }, 0x1FB7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, SCIM_KEY_Greek_eta, 0 }, 0x1FC7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, SCIM_KEY_Greek_omega, 0 }, 0x1FF7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_ALPHA }, 0x1F8E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_ETA }, 0x1F9E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_OMEGA }, 0x1FAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_alpha }, 0x1F86},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_eta }, 0x1F96},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1000313, SCIM_KEY_Greek_omega }, 0x1FA6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_ALPHA }, 0x1F8F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_ETA }, 0x1F9F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_OMEGA }, 0x1FAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_alpha }, 0x1F87},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_eta }, 0x1F97},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1000314, SCIM_KEY_Greek_omega }, 0x1FA7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1001f00, 0 }, 0x1F86},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1001f01, 0 }, 0x1F87},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1001f08, 0 }, 0x1F8E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1001f09, 0 }, 0x1F8F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1001f20, 0 }, 0x1F96},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1001f21, 0 }, 0x1F97},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1001f28, 0 }, 0x1F9E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1001f29, 0 }, 0x1F9F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1001f60, 0 }, 0x1FA6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1001f61, 0 }, 0x1FA7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1001f68, 0 }, 0x1FAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_asciitilde, 0x1001f69, 0 }, 0x1FAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F85},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F95},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F84},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F94},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, SCIM_KEY_Greek_alpha, 0 }, 0x1FB4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, SCIM_KEY_Greek_eta, 0 }, 0x1FC4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, SCIM_KEY_Greek_omega, 0 }, 0x1FF4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_ALPHA }, 0x1F8C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_ETA }, 0x1F9C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_OMEGA }, 0x1FAC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_alpha }, 0x1F84},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_eta }, 0x1F94},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1000313, SCIM_KEY_Greek_omega }, 0x1FA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_ALPHA }, 0x1F8D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_ETA }, 0x1F9D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_OMEGA }, 0x1FAD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_alpha }, 0x1F85},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_eta }, 0x1F95},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1000314, SCIM_KEY_Greek_omega }, 0x1FA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1001f00, 0 }, 0x1F84},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1001f01, 0 }, 0x1F85},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1001f08, 0 }, 0x1F8C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1001f09, 0 }, 0x1F8D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1001f20, 0 }, 0x1F94},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1001f21, 0 }, 0x1F95},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1001f28, 0 }, 0x1F9C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1001f29, 0 }, 0x1F9D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1001f60, 0 }, 0x1FA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1001f61, 0 }, 0x1FA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1001f68, 0 }, 0x1FAC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_acute, 0x1001f69, 0 }, 0x1FAD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_Greek_alphaaccent, 0, 0 }, 0x1FB4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_Greek_etaaccent, 0, 0 }, 0x1FC4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_Greek_omegaaccent, 0, 0 }, 0x1FF4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1FBC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1FCC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1FFC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1FB3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_Greek_eta, 0, 0 }, 0x1FC3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_Greek_omega, 0, 0 }, 0x1FF3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F83},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F93},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F82},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F92},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, SCIM_KEY_Greek_alpha, 0 }, 0x1FB2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, SCIM_KEY_Greek_eta, 0 }, 0x1FC2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, SCIM_KEY_Greek_omega, 0 }, 0x1FF2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_ALPHA }, 0x1F8A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_ETA }, 0x1F9A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_OMEGA }, 0x1FAA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_alpha }, 0x1F82},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_eta }, 0x1F92},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1000313, SCIM_KEY_Greek_omega }, 0x1FA2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_ALPHA }, 0x1F8B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_ETA }, 0x1F9B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_OMEGA }, 0x1FAB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_alpha }, 0x1F83},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_eta }, 0x1F93},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1000314, SCIM_KEY_Greek_omega }, 0x1FA3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1001f00, 0 }, 0x1F82},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1001f01, 0 }, 0x1F83},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1001f08, 0 }, 0x1F8A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1001f09, 0 }, 0x1F8B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1001f20, 0 }, 0x1F92},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1001f21, 0 }, 0x1F93},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1001f28, 0 }, 0x1F9A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1001f29, 0 }, 0x1F9B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1001f60, 0 }, 0x1FA2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1001f61, 0 }, 0x1FA3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1001f68, 0 }, 0x1FAA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_grave, 0x1001f69, 0 }, 0x1FAB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F85},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F95},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F84},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F94},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, SCIM_KEY_Greek_alpha, 0 }, 0x1FB4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, SCIM_KEY_Greek_eta, 0 }, 0x1FC4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, SCIM_KEY_Greek_omega, 0 }, 0x1FF4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_ALPHA }, 0x1F8C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_ETA }, 0x1F9C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_OMEGA }, 0x1FAC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_alpha }, 0x1F84},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_eta }, 0x1F94},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1000313, SCIM_KEY_Greek_omega }, 0x1FA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_ALPHA }, 0x1F8D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_ETA }, 0x1F9D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_OMEGA }, 0x1FAD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_alpha }, 0x1F85},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_eta }, 0x1F95},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1000314, SCIM_KEY_Greek_omega }, 0x1FA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1001f00, 0 }, 0x1F84},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1001f01, 0 }, 0x1F85},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1001f08, 0 }, 0x1F8C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1001f09, 0 }, 0x1F8D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1001f20, 0 }, 0x1F94},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1001f21, 0 }, 0x1F95},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1001f28, 0 }, 0x1F9C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1001f29, 0 }, 0x1F9D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1001f60, 0 }, 0x1FA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1001f61, 0 }, 0x1FA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1001f68, 0 }, 0x1FAC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_combining_acute, 0x1001f69, 0 }, 0x1FAD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F83},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F93},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F82},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F92},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, SCIM_KEY_Greek_alpha, 0 }, 0x1FB2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, SCIM_KEY_Greek_eta, 0 }, 0x1FC2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, SCIM_KEY_Greek_omega, 0 }, 0x1FF2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_ALPHA }, 0x1F8A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_ETA }, 0x1F9A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_OMEGA }, 0x1FAA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_alpha }, 0x1F82},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_eta }, 0x1F92},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1000313, SCIM_KEY_Greek_omega }, 0x1FA2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_ALPHA }, 0x1F8B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_ETA }, 0x1F9B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_OMEGA }, 0x1FAB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_alpha }, 0x1F83},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_eta }, 0x1F93},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1000314, SCIM_KEY_Greek_omega }, 0x1FA3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1001f00, 0 }, 0x1F82},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1001f01, 0 }, 0x1F83},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1001f08, 0 }, 0x1F8A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1001f09, 0 }, 0x1F8B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1001f20, 0 }, 0x1F92},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1001f21, 0 }, 0x1F93},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1001f28, 0 }, 0x1F9A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1001f29, 0 }, 0x1F9B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1001f60, 0 }, 0x1FA2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1001f61, 0 }, 0x1FA3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1001f68, 0 }, 0x1FAA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_grave, 0x1001f69, 0 }, 0x1FAB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F85},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F95},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F84},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F94},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, SCIM_KEY_Greek_alpha, 0 }, 0x1FB4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, SCIM_KEY_Greek_eta, 0 }, 0x1FC4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, SCIM_KEY_Greek_omega, 0 }, 0x1FF4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_ALPHA }, 0x1F8C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_ETA }, 0x1F9C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_OMEGA }, 0x1FAC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_alpha }, 0x1F84},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_eta }, 0x1F94},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1000313, SCIM_KEY_Greek_omega }, 0x1FA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_ALPHA }, 0x1F8D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_ETA }, 0x1F9D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_OMEGA }, 0x1FAD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_alpha }, 0x1F85},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_eta }, 0x1F95},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1000314, SCIM_KEY_Greek_omega }, 0x1FA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1001f00, 0 }, 0x1F84},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1001f01, 0 }, 0x1F85},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1001f08, 0 }, 0x1F8C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1001f09, 0 }, 0x1F8D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1001f20, 0 }, 0x1F94},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1001f21, 0 }, 0x1F95},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1001f28, 0 }, 0x1F9C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1001f29, 0 }, 0x1F9D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1001f60, 0 }, 0x1FA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1001f61, 0 }, 0x1FA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1001f68, 0 }, 0x1FAC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_acute, 0x1001f69, 0 }, 0x1FAD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F87},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F97},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F86},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F96},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Greek_alpha, 0 }, 0x1FB7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Greek_eta, 0 }, 0x1FC7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, SCIM_KEY_Greek_omega, 0 }, 0x1FF7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_ALPHA }, 0x1F8E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_ETA }, 0x1F9E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_OMEGA }, 0x1FAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_alpha }, 0x1F86},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_eta }, 0x1F96},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1000313, SCIM_KEY_Greek_omega }, 0x1FA6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_ALPHA }, 0x1F8F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_ETA }, 0x1F9F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_OMEGA }, 0x1FAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_alpha }, 0x1F87},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_eta }, 0x1F97},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1000314, SCIM_KEY_Greek_omega }, 0x1FA7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1001f00, 0 }, 0x1F86},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1001f01, 0 }, 0x1F87},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1001f08, 0 }, 0x1F8E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1001f09, 0 }, 0x1F8F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1001f20, 0 }, 0x1F96},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1001f21, 0 }, 0x1F97},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1001f28, 0 }, 0x1F9E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1001f29, 0 }, 0x1F9F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1001f60, 0 }, 0x1FA6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1001f61, 0 }, 0x1FA7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1001f68, 0 }, 0x1FAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, SCIM_KEY_dead_tilde, 0x1001f69, 0 }, 0x1FAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000313, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F88},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000313, SCIM_KEY_Greek_ETA, 0 }, 0x1F98},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000313, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FA8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000313, SCIM_KEY_Greek_alpha, 0 }, 0x1F80},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000313, SCIM_KEY_Greek_eta, 0 }, 0x1F90},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000313, SCIM_KEY_Greek_omega, 0 }, 0x1FA0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000314, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F89},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000314, SCIM_KEY_Greek_ETA, 0 }, 0x1F99},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000314, SCIM_KEY_Greek_OMEGA, 0 }, 0x1FA9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000314, SCIM_KEY_Greek_alpha, 0 }, 0x1F81},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000314, SCIM_KEY_Greek_eta, 0 }, 0x1F91},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000314, SCIM_KEY_Greek_omega, 0 }, 0x1FA1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA }, 0x1F8F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA }, 0x1F9F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA }, 0x1FAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha }, 0x1F87},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta }, 0x1F97},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega }, 0x1FA7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA }, 0x1F8E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA }, 0x1F9E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA }, 0x1FAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha }, 0x1F86},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, SCIM_KEY_parenright, SCIM_KEY_Greek_eta }, 0x1F96},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, SCIM_KEY_parenright, SCIM_KEY_Greek_omega }, 0x1FA6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, SCIM_KEY_Greek_alpha, 0 }, 0x1FB7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, SCIM_KEY_Greek_eta, 0 }, 0x1FC7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, SCIM_KEY_Greek_omega, 0 }, 0x1FF7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1000313, SCIM_KEY_Greek_ALPHA }, 0x1F8E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1000313, SCIM_KEY_Greek_ETA }, 0x1F9E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1000313, SCIM_KEY_Greek_OMEGA }, 0x1FAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1000313, SCIM_KEY_Greek_alpha }, 0x1F86},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1000313, SCIM_KEY_Greek_eta }, 0x1F96},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1000313, SCIM_KEY_Greek_omega }, 0x1FA6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1000314, SCIM_KEY_Greek_ALPHA }, 0x1F8F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1000314, SCIM_KEY_Greek_ETA }, 0x1F9F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1000314, SCIM_KEY_Greek_OMEGA }, 0x1FAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1000314, SCIM_KEY_Greek_alpha }, 0x1F87},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1000314, SCIM_KEY_Greek_eta }, 0x1F97},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1000314, SCIM_KEY_Greek_omega }, 0x1FA7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1001f00, 0 }, 0x1F86},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1001f01, 0 }, 0x1F87},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1001f08, 0 }, 0x1F8E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1001f09, 0 }, 0x1F8F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1001f20, 0 }, 0x1F96},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1001f21, 0 }, 0x1F97},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1001f28, 0 }, 0x1F9E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1001f29, 0 }, 0x1F9F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1001f60, 0 }, 0x1FA6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1001f61, 0 }, 0x1FA7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1001f68, 0 }, 0x1FAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1000342, 0x1001f69, 0 }, 0x1FAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f00, 0, 0 }, 0x1F80},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f01, 0, 0 }, 0x1F81},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f02, 0, 0 }, 0x1F82},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f03, 0, 0 }, 0x1F83},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f04, 0, 0 }, 0x1F84},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f05, 0, 0 }, 0x1F85},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f06, 0, 0 }, 0x1F86},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f07, 0, 0 }, 0x1F87},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f08, 0, 0 }, 0x1F88},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f09, 0, 0 }, 0x1F89},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f0a, 0, 0 }, 0x1F8A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f0b, 0, 0 }, 0x1F8B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f0c, 0, 0 }, 0x1F8C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f0d, 0, 0 }, 0x1F8D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f0e, 0, 0 }, 0x1F8E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f0f, 0, 0 }, 0x1F8F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f20, 0, 0 }, 0x1F90},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f21, 0, 0 }, 0x1F91},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f22, 0, 0 }, 0x1F92},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f23, 0, 0 }, 0x1F93},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f24, 0, 0 }, 0x1F94},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f25, 0, 0 }, 0x1F95},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f26, 0, 0 }, 0x1F96},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f27, 0, 0 }, 0x1F97},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f28, 0, 0 }, 0x1F98},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f29, 0, 0 }, 0x1F99},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f2a, 0, 0 }, 0x1F9A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f2b, 0, 0 }, 0x1F9B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f2c, 0, 0 }, 0x1F9C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f2d, 0, 0 }, 0x1F9D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f2e, 0, 0 }, 0x1F9E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f2f, 0, 0 }, 0x1F9F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f60, 0, 0 }, 0x1FA0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f61, 0, 0 }, 0x1FA1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f62, 0, 0 }, 0x1FA2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f63, 0, 0 }, 0x1FA3},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f64, 0, 0 }, 0x1FA4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f65, 0, 0 }, 0x1FA5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f66, 0, 0 }, 0x1FA6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f67, 0, 0 }, 0x1FA7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f68, 0, 0 }, 0x1FA8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f69, 0, 0 }, 0x1FA9},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f6a, 0, 0 }, 0x1FAA},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f6b, 0, 0 }, 0x1FAB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f6c, 0, 0 }, 0x1FAC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f6d, 0, 0 }, 0x1FAD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f6e, 0, 0 }, 0x1FAE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f6f, 0, 0 }, 0x1FAF},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f70, 0, 0 }, 0x1FB2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f74, 0, 0 }, 0x1FC2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001f7c, 0, 0 }, 0x1FF2},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001fb6, 0, 0 }, 0x1FB7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001fc6, 0, 0 }, 0x1FC7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_iota, 0x1001ff6, 0, 0 }, 0x1FF7},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_omicron, SCIM_KEY_apostrophe, 0, 0 }, 0x03CC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_upsilon, SCIM_KEY_quotedbl, 0, 0 }, 0x03CB},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_upsilon, SCIM_KEY_apostrophe, 0, 0 }, 0x03CD},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_Greek_omega, SCIM_KEY_apostrophe, 0, 0 }, 0x03CE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_lessthanequal, 0x1000338, 0, 0 }, 0x2270},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_greaterthanequal, 0x1000338, 0, 0 }, 0x2271},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_approximate, 0x1000338, 0, 0 }, 0x2247},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_identical, 0x1000338, 0, 0 }, 0x2262},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_includedin, 0x1000338, 0, 0 }, 0x2284},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_includes, 0x1000338, 0, 0 }, 0x2285},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_leftcaret, 0x1000338, 0, 0 }, 0x226E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_rightcaret, 0x1000338, 0, 0 }, 0x226F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_parenleft, 0, 0 }, 0x208D},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_parenright, 0, 0 }, 0x208E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_plus, 0, 0 }, 0x208A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_0, 0, 0 }, 0x2080},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_1, 0, 0 }, 0x2081},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_2, 0, 0 }, 0x2082},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_3, 0, 0 }, 0x2083},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_4, 0, 0 }, 0x2084},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_5, 0, 0 }, 0x2085},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_6, 0, 0 }, 0x2086},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_7, 0, 0 }, 0x2087},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_8, 0, 0 }, 0x2088},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_9, 0, 0 }, 0x2089},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_equal, 0, 0 }, 0x208C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_KP_Space, 0, 0 }, 0x2082},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_KP_Add, 0, 0 }, 0x208A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_KP_0, 0, 0 }, 0x2080},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_KP_1, 0, 0 }, 0x2081},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_KP_2, 0, 0 }, 0x2082},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_KP_3, 0, 0 }, 0x2083},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_KP_4, 0, 0 }, 0x2084},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_KP_5, 0, 0 }, 0x2085},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_KP_6, 0, 0 }, 0x2086},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_KP_7, 0, 0 }, 0x2087},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_KP_8, 0, 0 }, 0x2088},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_KP_9, 0, 0 }, 0x2089},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, SCIM_KEY_KP_Equal, 0, 0 }, 0x208C},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_underbar, 0x1002212, 0, 0 }, 0x208B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_rightshoe, 0x1000338, 0, 0 }, 0x2285},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_leftshoe, 0x1000338, 0, 0 }, 0x2284},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_righttack, 0x1000338, 0, 0 }, 0x22AC},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_D, 0, 0 }, 0x0110},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_G, 0, 0 }, 0x01E4},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_H, 0, 0 }, 0x0126},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_I, 0, 0 }, 0x0197},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_L, 0, 0 }, 0x0141},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_O, 0, 0 }, 0x00D8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_T, 0, 0 }, 0x0166},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_Z, 0, 0 }, 0x01B5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_b, 0, 0 }, 0x0180},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_d, 0, 0 }, 0x0111},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_g, 0, 0 }, 0x01E5},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_h, 0, 0 }, 0x0127},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_i, 0, 0 }, 0x0268},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_l, 0, 0 }, 0x0142},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_o, 0, 0 }, 0x00F8},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_t, 0, 0 }, 0x0167},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_z, 0, 0 }, 0x01B6},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_Cyrillic_ghe, 0, 0 }, 0x0493},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_Cyrillic_ka, 0, 0 }, 0x049F},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_Cyrillic_GHE, 0, 0 }, 0x0492},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_Cyrillic_KA, 0, 0 }, 0x049E},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_leftarrow, 0, 0 }, 0x219A},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, SCIM_KEY_rightarrow, 0, 0 }, 0x219B},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, 0x1000294, 0, 0 }, 0x02A1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, 0x10004ae, 0, 0 }, 0x04B0},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, 0x10004af, 0, 0 }, 0x04B1},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Divide, 0x1002194, 0, 0 }, 0x21AE},
+ {{SCIM_KEY_Multi_key, SCIM_KEY_KP_Equal, 0x1000338, 0, 0 }, 0x2260},
+ {{SCIM_KEY_Multi_key, 0x10005b4, SCIM_KEY_hebrew_yod, 0, 0 }, 0xFB1D},
+ {{SCIM_KEY_Multi_key, 0x10005b7, SCIM_KEY_hebrew_aleph, 0, 0 }, 0xFB2E},
+ {{SCIM_KEY_Multi_key, 0x10005b7, 0x10005f2, 0, 0 }, 0xFB1F},
+ {{SCIM_KEY_Multi_key, 0x10005b8, SCIM_KEY_hebrew_aleph, 0, 0 }, 0xFB2F},
+ {{SCIM_KEY_Multi_key, 0x10005b9, SCIM_KEY_hebrew_waw, 0, 0 }, 0xFB4B},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_aleph, 0, 0 }, 0xFB30},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_bet, 0, 0 }, 0xFB31},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_gimel, 0, 0 }, 0xFB32},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_dalet, 0, 0 }, 0xFB33},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_he, 0, 0 }, 0xFB34},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_waw, 0, 0 }, 0xFB35},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_zain, 0, 0 }, 0xFB36},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_tet, 0, 0 }, 0xFB38},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_yod, 0, 0 }, 0xFB39},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_finalkaph, 0, 0 }, 0xFB3A},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_kaph, 0, 0 }, 0xFB3B},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_lamed, 0, 0 }, 0xFB3C},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_mem, 0, 0 }, 0xFB3E},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_nun, 0, 0 }, 0xFB40},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_samech, 0, 0 }, 0xFB41},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_finalpe, 0, 0 }, 0xFB43},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_pe, 0, 0 }, 0xFB44},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_zade, 0, 0 }, 0xFB46},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_kuf, 0, 0 }, 0xFB47},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_resh, 0, 0 }, 0xFB48},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_shin, 0, 0 }, 0xFB49},
+ {{SCIM_KEY_Multi_key, 0x10005bc, SCIM_KEY_hebrew_taf, 0, 0 }, 0xFB4A},
+ {{SCIM_KEY_Multi_key, 0x10005bf, SCIM_KEY_hebrew_bet, 0, 0 }, 0xFB4C},
+ {{SCIM_KEY_Multi_key, 0x10005bf, SCIM_KEY_hebrew_kaph, 0, 0 }, 0xFB4D},
+ {{SCIM_KEY_Multi_key, 0x10005bf, SCIM_KEY_hebrew_pe, 0, 0 }, 0xFB4E},
+ {{SCIM_KEY_Multi_key, 0x10005c1, SCIM_KEY_hebrew_shin, 0, 0 }, 0xFB2A},
+ {{SCIM_KEY_Multi_key, 0x10005c1, 0x10005bc, SCIM_KEY_hebrew_shin, 0 }, 0xFB2C},
+ {{SCIM_KEY_Multi_key, 0x10005c1, 0x100fb49, 0, 0 }, 0xFB2C},
+ {{SCIM_KEY_Multi_key, 0x10005c2, SCIM_KEY_hebrew_shin, 0, 0 }, 0xFB2B},
+ {{SCIM_KEY_Multi_key, 0x10005c2, 0x10005bc, SCIM_KEY_hebrew_shin, 0 }, 0xFB2D},
+ {{SCIM_KEY_Multi_key, 0x10005c2, 0x100fb49, 0, 0 }, 0xFB2D},
+ {{SCIM_KEY_Multi_key, 0x1000653, SCIM_KEY_Arabic_alef, 0, 0 }, 0x0622},
+ {{SCIM_KEY_Multi_key, 0x1000654, SCIM_KEY_Arabic_alef, 0, 0 }, 0x0623},
+ {{SCIM_KEY_Multi_key, 0x1000654, SCIM_KEY_Arabic_waw, 0, 0 }, 0x0624},
+ {{SCIM_KEY_Multi_key, 0x1000654, SCIM_KEY_Arabic_yeh, 0, 0 }, 0x0626},
+ {{SCIM_KEY_Multi_key, 0x1000654, 0x10006c1, 0, 0 }, 0x06C2},
+ {{SCIM_KEY_Multi_key, 0x1000654, 0x10006d2, 0, 0 }, 0x06D3},
+ {{SCIM_KEY_Multi_key, 0x1000654, 0x10006d5, 0, 0 }, 0x06C0},
+ {{SCIM_KEY_Multi_key, 0x1000655, SCIM_KEY_Arabic_alef, 0, 0 }, 0x0625},
+ {{SCIM_KEY_Multi_key, 0x100093c, 0x1000915, 0, 0 }, 0x0958},
+ {{SCIM_KEY_Multi_key, 0x100093c, 0x1000916, 0, 0 }, 0x0959},
+ {{SCIM_KEY_Multi_key, 0x100093c, 0x1000917, 0, 0 }, 0x095A},
+ {{SCIM_KEY_Multi_key, 0x100093c, 0x100091c, 0, 0 }, 0x095B},
+ {{SCIM_KEY_Multi_key, 0x100093c, 0x1000921, 0, 0 }, 0x095C},
+ {{SCIM_KEY_Multi_key, 0x100093c, 0x1000922, 0, 0 }, 0x095D},
+ {{SCIM_KEY_Multi_key, 0x100093c, 0x1000928, 0, 0 }, 0x0929},
+ {{SCIM_KEY_Multi_key, 0x100093c, 0x100092b, 0, 0 }, 0x095E},
+ {{SCIM_KEY_Multi_key, 0x100093c, 0x100092f, 0, 0 }, 0x095F},
+ {{SCIM_KEY_Multi_key, 0x100093c, 0x1000930, 0, 0 }, 0x0931},
+ {{SCIM_KEY_Multi_key, 0x100093c, 0x1000933, 0, 0 }, 0x0934},
+ {{SCIM_KEY_Multi_key, 0x10009bc, 0x10009a1, 0, 0 }, 0x09DC},
+ {{SCIM_KEY_Multi_key, 0x10009bc, 0x10009a2, 0, 0 }, 0x09DD},
+ {{SCIM_KEY_Multi_key, 0x10009bc, 0x10009af, 0, 0 }, 0x09DF},
+ {{SCIM_KEY_Multi_key, 0x10009c7, 0x10009be, 0, 0 }, 0x09CB},
+ {{SCIM_KEY_Multi_key, 0x10009c7, 0x10009d7, 0, 0 }, 0x09CC},
+ {{SCIM_KEY_Multi_key, 0x1000a3c, 0x1000a16, 0, 0 }, 0x0A59},
+ {{SCIM_KEY_Multi_key, 0x1000a3c, 0x1000a17, 0, 0 }, 0x0A5A},
+ {{SCIM_KEY_Multi_key, 0x1000a3c, 0x1000a1c, 0, 0 }, 0x0A5B},
+ {{SCIM_KEY_Multi_key, 0x1000a3c, 0x1000a2b, 0, 0 }, 0x0A5E},
+ {{SCIM_KEY_Multi_key, 0x1000a3c, 0x1000a32, 0, 0 }, 0x0A33},
+ {{SCIM_KEY_Multi_key, 0x1000a3c, 0x1000a38, 0, 0 }, 0x0A36},
+ {{SCIM_KEY_Multi_key, 0x1000b3c, 0x1000b21, 0, 0 }, 0x0B5C},
+ {{SCIM_KEY_Multi_key, 0x1000b3c, 0x1000b22, 0, 0 }, 0x0B5D},
+ {{SCIM_KEY_Multi_key, 0x1000b47, 0x1000b3e, 0, 0 }, 0x0B4B},
+ {{SCIM_KEY_Multi_key, 0x1000b47, 0x1000b56, 0, 0 }, 0x0B48},
+ {{SCIM_KEY_Multi_key, 0x1000b47, 0x1000b57, 0, 0 }, 0x0B4C},
+ {{SCIM_KEY_Multi_key, 0x1000bc6, 0x1000bbe, 0, 0 }, 0x0BCA},
+ {{SCIM_KEY_Multi_key, 0x1000bc6, 0x1000bd7, 0, 0 }, 0x0BCC},
+ {{SCIM_KEY_Multi_key, 0x1000bc7, 0x1000bbe, 0, 0 }, 0x0BCB},
+ {{SCIM_KEY_Multi_key, 0x1000bd7, 0x1000b92, 0, 0 }, 0x0B94},
+ {{SCIM_KEY_Multi_key, 0x1000c46, 0x1000c56, 0, 0 }, 0x0C48},
+ {{SCIM_KEY_Multi_key, 0x1000cbf, 0x1000cd5, 0, 0 }, 0x0CC0},
+ {{SCIM_KEY_Multi_key, 0x1000cc6, 0x1000cc2, 0, 0 }, 0x0CCA},
+ {{SCIM_KEY_Multi_key, 0x1000cc6, 0x1000cc2, 0x1000cd5, 0 }, 0x0CCB},
+ {{SCIM_KEY_Multi_key, 0x1000cc6, 0x1000cd5, 0, 0 }, 0x0CC7},
+ {{SCIM_KEY_Multi_key, 0x1000cc6, 0x1000cd6, 0, 0 }, 0x0CC8},
+ {{SCIM_KEY_Multi_key, 0x1000cca, 0x1000cd5, 0, 0 }, 0x0CCB},
+ {{SCIM_KEY_Multi_key, 0x1000d46, 0x1000d3e, 0, 0 }, 0x0D4A},
+ {{SCIM_KEY_Multi_key, 0x1000d46, 0x1000d57, 0, 0 }, 0x0D4C},
+ {{SCIM_KEY_Multi_key, 0x1000d47, 0x1000d3e, 0, 0 }, 0x0D4B},
+ {{SCIM_KEY_Multi_key, 0x1000dd9, 0x1000dca, 0, 0 }, 0x0DDA},
+ {{SCIM_KEY_Multi_key, 0x1000dd9, 0x1000dcf, 0, 0 }, 0x0DDC},
+ {{SCIM_KEY_Multi_key, 0x1000dd9, 0x1000dcf, 0x1000dca, 0 }, 0x0DDD},
+ {{SCIM_KEY_Multi_key, 0x1000dd9, 0x1000ddf, 0, 0 }, 0x0DDE},
+ {{SCIM_KEY_Multi_key, 0x1000ddc, 0x1000dca, 0, 0 }, 0x0DDD},
+ {{SCIM_KEY_Multi_key, 0x1000f71, 0x1000f72, 0, 0 }, 0x0F73},
+ {{SCIM_KEY_Multi_key, 0x1000f71, 0x1000f74, 0, 0 }, 0x0F75},
+ {{SCIM_KEY_Multi_key, 0x1000f71, 0x1000f80, 0, 0 }, 0x0F81},
+ {{SCIM_KEY_Multi_key, 0x1000f90, 0x1000fb5, 0, 0 }, 0x0FB9},
+ {{SCIM_KEY_Multi_key, 0x1000f92, 0x1000fb7, 0, 0 }, 0x0F93},
+ {{SCIM_KEY_Multi_key, 0x1000f9c, 0x1000fb7, 0, 0 }, 0x0F9D},
+ {{SCIM_KEY_Multi_key, 0x1000fa1, 0x1000fb7, 0, 0 }, 0x0FA2},
+ {{SCIM_KEY_Multi_key, 0x1000fa6, 0x1000fb7, 0, 0 }, 0x0FA7},
+ {{SCIM_KEY_Multi_key, 0x1000fab, 0x1000fb7, 0, 0 }, 0x0FAC},
+ {{SCIM_KEY_Multi_key, 0x1000fb2, 0x1000f80, 0, 0 }, 0x0F76},
+ {{SCIM_KEY_Multi_key, 0x1000fb3, 0x1000f80, 0, 0 }, 0x0F78},
+ {{SCIM_KEY_Multi_key, 0x1000fb5, 0x1000f40, 0, 0 }, 0x0F69},
+ {{SCIM_KEY_Multi_key, 0x1000fb7, 0x1000f42, 0, 0 }, 0x0F43},
+ {{SCIM_KEY_Multi_key, 0x1000fb7, 0x1000f4c, 0, 0 }, 0x0F4D},
+ {{SCIM_KEY_Multi_key, 0x1000fb7, 0x1000f51, 0, 0 }, 0x0F52},
+ {{SCIM_KEY_Multi_key, 0x1000fb7, 0x1000f56, 0, 0 }, 0x0F57},
+ {{SCIM_KEY_Multi_key, 0x1000fb7, 0x1000f5b, 0, 0 }, 0x0F5C},
+ {{SCIM_KEY_Multi_key, 0x100102e, 0x1001025, 0, 0 }, 0x1026},
+ {{SCIM_KEY_Multi_key, 0x1001100, 0x1001100, 0, 0 }, 0x1101},
+ {{SCIM_KEY_Multi_key, 0x1001102, 0x1001100, 0, 0 }, 0x1113},
+ {{SCIM_KEY_Multi_key, 0x1001102, 0x1001102, 0, 0 }, 0x1114},
+ {{SCIM_KEY_Multi_key, 0x1001102, 0x1001103, 0, 0 }, 0x1115},
+ {{SCIM_KEY_Multi_key, 0x1001102, 0x1001107, 0, 0 }, 0x1116},
+ {{SCIM_KEY_Multi_key, 0x1001103, 0x1001100, 0, 0 }, 0x1117},
+ {{SCIM_KEY_Multi_key, 0x1001103, 0x1001103, 0, 0 }, 0x1104},
+ {{SCIM_KEY_Multi_key, 0x1001105, 0x1001102, 0, 0 }, 0x1118},
+ {{SCIM_KEY_Multi_key, 0x1001105, 0x1001105, 0, 0 }, 0x1119},
+ {{SCIM_KEY_Multi_key, 0x1001105, 0x100110b, 0, 0 }, 0x111B},
+ {{SCIM_KEY_Multi_key, 0x1001105, 0x1001112, 0, 0 }, 0x111A},
+ {{SCIM_KEY_Multi_key, 0x1001106, 0x1001107, 0, 0 }, 0x111C},
+ {{SCIM_KEY_Multi_key, 0x1001106, 0x100110b, 0, 0 }, 0x111D},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x1001100, 0, 0 }, 0x111E},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x1001102, 0, 0 }, 0x111F},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x1001103, 0, 0 }, 0x1120},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x1001107, 0, 0 }, 0x1108},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x1001107, 0x100110b, 0 }, 0x112C},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x1001109, 0, 0 }, 0x1121},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x1001109, 0x1001100, 0 }, 0x1122},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x1001109, 0x1001103, 0 }, 0x1123},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x1001109, 0x1001107, 0 }, 0x1124},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x1001109, 0x1001109, 0 }, 0x1125},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x1001109, 0x100110c, 0 }, 0x1126},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x100110a, 0, 0 }, 0x1125},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x100110b, 0, 0 }, 0x112B},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x100110c, 0, 0 }, 0x1127},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x100110e, 0, 0 }, 0x1128},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x1001110, 0, 0 }, 0x1129},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x1001111, 0, 0 }, 0x112A},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x100112b, 0, 0 }, 0x112C},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x100112d, 0, 0 }, 0x1122},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x100112f, 0, 0 }, 0x1123},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x1001132, 0, 0 }, 0x1124},
+ {{SCIM_KEY_Multi_key, 0x1001107, 0x1001136, 0, 0 }, 0x1126},
+ {{SCIM_KEY_Multi_key, 0x1001108, 0x100110b, 0, 0 }, 0x112C},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x1001100, 0, 0 }, 0x112D},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x1001102, 0, 0 }, 0x112E},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x1001103, 0, 0 }, 0x112F},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x1001105, 0, 0 }, 0x1130},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x1001106, 0, 0 }, 0x1131},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x1001107, 0, 0 }, 0x1132},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x1001107, 0x1001100, 0 }, 0x1133},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x1001109, 0, 0 }, 0x110A},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x1001109, 0x1001109, 0 }, 0x1134},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x100110a, 0, 0 }, 0x1134},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x100110b, 0, 0 }, 0x1135},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x100110c, 0, 0 }, 0x1136},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x100110e, 0, 0 }, 0x1137},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x100110f, 0, 0 }, 0x1138},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x1001110, 0, 0 }, 0x1139},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x1001111, 0, 0 }, 0x113A},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x1001112, 0, 0 }, 0x113B},
+ {{SCIM_KEY_Multi_key, 0x1001109, 0x100111e, 0, 0 }, 0x1133},
+ {{SCIM_KEY_Multi_key, 0x100110a, 0x1001109, 0, 0 }, 0x1134},
+ {{SCIM_KEY_Multi_key, 0x100110b, 0x1001100, 0, 0 }, 0x1141},
+ {{SCIM_KEY_Multi_key, 0x100110b, 0x1001103, 0, 0 }, 0x1142},
+ {{SCIM_KEY_Multi_key, 0x100110b, 0x1001106, 0, 0 }, 0x1143},
+ {{SCIM_KEY_Multi_key, 0x100110b, 0x1001107, 0, 0 }, 0x1144},
+ {{SCIM_KEY_Multi_key, 0x100110b, 0x1001109, 0, 0 }, 0x1145},
+ {{SCIM_KEY_Multi_key, 0x100110b, 0x100110b, 0, 0 }, 0x1147},
+ {{SCIM_KEY_Multi_key, 0x100110b, 0x100110c, 0, 0 }, 0x1148},
+ {{SCIM_KEY_Multi_key, 0x100110b, 0x100110e, 0, 0 }, 0x1149},
+ {{SCIM_KEY_Multi_key, 0x100110b, 0x1001110, 0, 0 }, 0x114A},
+ {{SCIM_KEY_Multi_key, 0x100110b, 0x1001111, 0, 0 }, 0x114B},
+ {{SCIM_KEY_Multi_key, 0x100110b, 0x1001140, 0, 0 }, 0x1146},
+ {{SCIM_KEY_Multi_key, 0x100110c, 0x100110b, 0, 0 }, 0x114D},
+ {{SCIM_KEY_Multi_key, 0x100110c, 0x100110c, 0, 0 }, 0x110D},
+ {{SCIM_KEY_Multi_key, 0x100110e, 0x100110f, 0, 0 }, 0x1152},
+ {{SCIM_KEY_Multi_key, 0x100110e, 0x1001112, 0, 0 }, 0x1153},
+ {{SCIM_KEY_Multi_key, 0x1001111, 0x1001107, 0, 0 }, 0x1156},
+ {{SCIM_KEY_Multi_key, 0x1001111, 0x100110b, 0, 0 }, 0x1157},
+ {{SCIM_KEY_Multi_key, 0x1001112, 0x1001112, 0, 0 }, 0x1158},
+ {{SCIM_KEY_Multi_key, 0x1001121, 0x1001100, 0, 0 }, 0x1122},
+ {{SCIM_KEY_Multi_key, 0x1001121, 0x1001103, 0, 0 }, 0x1123},
+ {{SCIM_KEY_Multi_key, 0x1001121, 0x1001107, 0, 0 }, 0x1124},
+ {{SCIM_KEY_Multi_key, 0x1001121, 0x1001109, 0, 0 }, 0x1125},
+ {{SCIM_KEY_Multi_key, 0x1001121, 0x100110c, 0, 0 }, 0x1126},
+ {{SCIM_KEY_Multi_key, 0x1001132, 0x1001100, 0, 0 }, 0x1133},
+ {{SCIM_KEY_Multi_key, 0x100113c, 0x100113c, 0, 0 }, 0x113D},
+ {{SCIM_KEY_Multi_key, 0x100113e, 0x100113e, 0, 0 }, 0x113F},
+ {{SCIM_KEY_Multi_key, 0x100114e, 0x100114e, 0, 0 }, 0x114F},
+ {{SCIM_KEY_Multi_key, 0x1001150, 0x1001150, 0, 0 }, 0x1151},
+ {{SCIM_KEY_Multi_key, 0x1001161, 0x1001169, 0, 0 }, 0x1176},
+ {{SCIM_KEY_Multi_key, 0x1001161, 0x100116e, 0, 0 }, 0x1177},
+ {{SCIM_KEY_Multi_key, 0x1001161, 0x1001175, 0, 0 }, 0x1162},
+ {{SCIM_KEY_Multi_key, 0x1001163, 0x1001169, 0, 0 }, 0x1178},
+ {{SCIM_KEY_Multi_key, 0x1001163, 0x100116d, 0, 0 }, 0x1179},
+ {{SCIM_KEY_Multi_key, 0x1001163, 0x1001175, 0, 0 }, 0x1164},
+ {{SCIM_KEY_Multi_key, 0x1001165, 0x1001169, 0, 0 }, 0x117A},
+ {{SCIM_KEY_Multi_key, 0x1001165, 0x100116e, 0, 0 }, 0x117B},
+ {{SCIM_KEY_Multi_key, 0x1001165, 0x1001173, 0, 0 }, 0x117C},
+ {{SCIM_KEY_Multi_key, 0x1001165, 0x1001175, 0, 0 }, 0x1166},
+ {{SCIM_KEY_Multi_key, 0x1001167, 0x1001169, 0, 0 }, 0x117D},
+ {{SCIM_KEY_Multi_key, 0x1001167, 0x100116e, 0, 0 }, 0x117E},
+ {{SCIM_KEY_Multi_key, 0x1001167, 0x1001175, 0, 0 }, 0x1168},
+ {{SCIM_KEY_Multi_key, 0x1001169, 0x1001161, 0, 0 }, 0x116A},
+ {{SCIM_KEY_Multi_key, 0x1001169, 0x1001161, 0x1001175, 0 }, 0x116B},
+ {{SCIM_KEY_Multi_key, 0x1001169, 0x1001162, 0, 0 }, 0x116B},
+ {{SCIM_KEY_Multi_key, 0x1001169, 0x1001165, 0, 0 }, 0x117F},
+ {{SCIM_KEY_Multi_key, 0x1001169, 0x1001166, 0, 0 }, 0x1180},
+ {{SCIM_KEY_Multi_key, 0x1001169, 0x1001168, 0, 0 }, 0x1181},
+ {{SCIM_KEY_Multi_key, 0x1001169, 0x1001169, 0, 0 }, 0x1182},
+ {{SCIM_KEY_Multi_key, 0x1001169, 0x100116e, 0, 0 }, 0x1183},
+ {{SCIM_KEY_Multi_key, 0x1001169, 0x1001175, 0, 0 }, 0x116C},
+ {{SCIM_KEY_Multi_key, 0x100116a, 0x1001175, 0, 0 }, 0x116B},
+ {{SCIM_KEY_Multi_key, 0x100116d, 0x1001163, 0, 0 }, 0x1184},
+ {{SCIM_KEY_Multi_key, 0x100116d, 0x1001164, 0, 0 }, 0x1185},
+ {{SCIM_KEY_Multi_key, 0x100116d, 0x1001167, 0, 0 }, 0x1186},
+ {{SCIM_KEY_Multi_key, 0x100116d, 0x1001169, 0, 0 }, 0x1187},
+ {{SCIM_KEY_Multi_key, 0x100116d, 0x1001175, 0, 0 }, 0x1188},
+ {{SCIM_KEY_Multi_key, 0x100116e, 0x1001161, 0, 0 }, 0x1189},
+ {{SCIM_KEY_Multi_key, 0x100116e, 0x1001162, 0, 0 }, 0x118A},
+ {{SCIM_KEY_Multi_key, 0x100116e, 0x1001165, 0, 0 }, 0x116F},
+ {{SCIM_KEY_Multi_key, 0x100116e, 0x1001165, 0x1001173, 0 }, 0x118B},
+ {{SCIM_KEY_Multi_key, 0x100116e, 0x1001165, 0x1001175, 0 }, 0x1170},
+ {{SCIM_KEY_Multi_key, 0x100116e, 0x1001166, 0, 0 }, 0x1170},
+ {{SCIM_KEY_Multi_key, 0x100116e, 0x1001168, 0, 0 }, 0x118C},
+ {{SCIM_KEY_Multi_key, 0x100116e, 0x100116e, 0, 0 }, 0x118D},
+ {{SCIM_KEY_Multi_key, 0x100116e, 0x1001175, 0, 0 }, 0x1171},
+ {{SCIM_KEY_Multi_key, 0x100116e, 0x100117c, 0, 0 }, 0x118B},
+ {{SCIM_KEY_Multi_key, 0x100116f, 0x1001173, 0, 0 }, 0x118B},
+ {{SCIM_KEY_Multi_key, 0x100116f, 0x1001175, 0, 0 }, 0x1170},
+ {{SCIM_KEY_Multi_key, 0x1001172, 0x1001161, 0, 0 }, 0x118E},
+ {{SCIM_KEY_Multi_key, 0x1001172, 0x1001165, 0, 0 }, 0x118F},
+ {{SCIM_KEY_Multi_key, 0x1001172, 0x1001166, 0, 0 }, 0x1190},
+ {{SCIM_KEY_Multi_key, 0x1001172, 0x1001167, 0, 0 }, 0x1191},
+ {{SCIM_KEY_Multi_key, 0x1001172, 0x1001168, 0, 0 }, 0x1192},
+ {{SCIM_KEY_Multi_key, 0x1001172, 0x100116e, 0, 0 }, 0x1193},
+ {{SCIM_KEY_Multi_key, 0x1001172, 0x1001175, 0, 0 }, 0x1194},
+ {{SCIM_KEY_Multi_key, 0x1001173, 0x100116e, 0, 0 }, 0x1195},
+ {{SCIM_KEY_Multi_key, 0x1001173, 0x1001173, 0, 0 }, 0x1196},
+ {{SCIM_KEY_Multi_key, 0x1001173, 0x1001175, 0, 0 }, 0x1174},
+ {{SCIM_KEY_Multi_key, 0x1001174, 0x100116e, 0, 0 }, 0x1197},
+ {{SCIM_KEY_Multi_key, 0x1001175, 0x1001161, 0, 0 }, 0x1198},
+ {{SCIM_KEY_Multi_key, 0x1001175, 0x1001163, 0, 0 }, 0x1199},
+ {{SCIM_KEY_Multi_key, 0x1001175, 0x1001169, 0, 0 }, 0x119A},
+ {{SCIM_KEY_Multi_key, 0x1001175, 0x100116e, 0, 0 }, 0x119B},
+ {{SCIM_KEY_Multi_key, 0x1001175, 0x1001173, 0, 0 }, 0x119C},
+ {{SCIM_KEY_Multi_key, 0x1001175, 0x100119e, 0, 0 }, 0x119D},
+ {{SCIM_KEY_Multi_key, 0x100119e, 0x1001165, 0, 0 }, 0x119F},
+ {{SCIM_KEY_Multi_key, 0x100119e, 0x100116e, 0, 0 }, 0x11A0},
+ {{SCIM_KEY_Multi_key, 0x100119e, 0x1001175, 0, 0 }, 0x11A1},
+ {{SCIM_KEY_Multi_key, 0x100119e, 0x100119e, 0, 0 }, 0x11A2},
+ {{SCIM_KEY_Multi_key, 0x10011a8, 0x10011a8, 0, 0 }, 0x11A9},
+ {{SCIM_KEY_Multi_key, 0x10011a8, 0x10011af, 0, 0 }, 0x11C3},
+ {{SCIM_KEY_Multi_key, 0x10011a8, 0x10011ba, 0, 0 }, 0x11AA},
+ {{SCIM_KEY_Multi_key, 0x10011a8, 0x10011ba, 0x10011a8, 0 }, 0x11C4},
+ {{SCIM_KEY_Multi_key, 0x10011a8, 0x10011e7, 0, 0 }, 0x11C4},
+ {{SCIM_KEY_Multi_key, 0x10011aa, 0x10011a8, 0, 0 }, 0x11C4},
+ {{SCIM_KEY_Multi_key, 0x10011ab, 0x10011a8, 0, 0 }, 0x11C5},
+ {{SCIM_KEY_Multi_key, 0x10011ab, 0x10011ae, 0, 0 }, 0x11C6},
+ {{SCIM_KEY_Multi_key, 0x10011ab, 0x10011ba, 0, 0 }, 0x11C7},
+ {{SCIM_KEY_Multi_key, 0x10011ab, 0x10011bd, 0, 0 }, 0x11AC},
+ {{SCIM_KEY_Multi_key, 0x10011ab, 0x10011c0, 0, 0 }, 0x11C9},
+ {{SCIM_KEY_Multi_key, 0x10011ab, 0x10011c2, 0, 0 }, 0x11AD},
+ {{SCIM_KEY_Multi_key, 0x10011ab, 0x10011eb, 0, 0 }, 0x11C8},
+ {{SCIM_KEY_Multi_key, 0x10011ae, 0x10011a8, 0, 0 }, 0x11CA},
+ {{SCIM_KEY_Multi_key, 0x10011ae, 0x10011af, 0, 0 }, 0x11CB},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011a8, 0, 0 }, 0x11B0},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011a8, 0x10011ba, 0 }, 0x11CC},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011aa, 0, 0 }, 0x11CC},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011ab, 0, 0 }, 0x11CD},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011ae, 0, 0 }, 0x11CE},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011ae, 0x10011c2, 0 }, 0x11CF},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011af, 0, 0 }, 0x11D0},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011b7, 0, 0 }, 0x11B1},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011b7, 0x10011a8, 0 }, 0x11D1},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011b7, 0x10011ba, 0 }, 0x11D2},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011b8, 0, 0 }, 0x11B2},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011b8, 0x10011ba, 0 }, 0x11D3},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011b8, 0x10011bc, 0 }, 0x11D5},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011b8, 0x10011c2, 0 }, 0x11D4},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011b9, 0, 0 }, 0x11D3},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011ba, 0, 0 }, 0x11B3},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011ba, 0x10011ba, 0 }, 0x11D6},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011bb, 0, 0 }, 0x11D6},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011bf, 0, 0 }, 0x11D8},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011c0, 0, 0 }, 0x11B4},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011c1, 0, 0 }, 0x11B5},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011c2, 0, 0 }, 0x11B6},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011da, 0, 0 }, 0x11D1},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011dd, 0, 0 }, 0x11D2},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011e5, 0, 0 }, 0x11D4},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011e6, 0, 0 }, 0x11D5},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011eb, 0, 0 }, 0x11D7},
+ {{SCIM_KEY_Multi_key, 0x10011af, 0x10011f9, 0, 0 }, 0x11D9},
+ {{SCIM_KEY_Multi_key, 0x10011b0, 0x10011ba, 0, 0 }, 0x11CC},
+ {{SCIM_KEY_Multi_key, 0x10011b1, 0x10011a8, 0, 0 }, 0x11D1},
+ {{SCIM_KEY_Multi_key, 0x10011b1, 0x10011ba, 0, 0 }, 0x11D2},
+ {{SCIM_KEY_Multi_key, 0x10011b2, 0x10011ba, 0, 0 }, 0x11D3},
+ {{SCIM_KEY_Multi_key, 0x10011b2, 0x10011bc, 0, 0 }, 0x11D5},
+ {{SCIM_KEY_Multi_key, 0x10011b2, 0x10011c2, 0, 0 }, 0x11D4},
+ {{SCIM_KEY_Multi_key, 0x10011b3, 0x10011ba, 0, 0 }, 0x11D6},
+ {{SCIM_KEY_Multi_key, 0x10011b7, 0x10011a8, 0, 0 }, 0x11DA},
+ {{SCIM_KEY_Multi_key, 0x10011b7, 0x10011af, 0, 0 }, 0x11DB},
+ {{SCIM_KEY_Multi_key, 0x10011b7, 0x10011b8, 0, 0 }, 0x11DC},
+ {{SCIM_KEY_Multi_key, 0x10011b7, 0x10011ba, 0, 0 }, 0x11DD},
+ {{SCIM_KEY_Multi_key, 0x10011b7, 0x10011ba, 0x10011ba, 0 }, 0x11DE},
+ {{SCIM_KEY_Multi_key, 0x10011b7, 0x10011bb, 0, 0 }, 0x11DE},
+ {{SCIM_KEY_Multi_key, 0x10011b7, 0x10011bc, 0, 0 }, 0x11E2},
+ {{SCIM_KEY_Multi_key, 0x10011b7, 0x10011be, 0, 0 }, 0x11E0},
+ {{SCIM_KEY_Multi_key, 0x10011b7, 0x10011c2, 0, 0 }, 0x11E1},
+ {{SCIM_KEY_Multi_key, 0x10011b7, 0x10011eb, 0, 0 }, 0x11DF},
+ {{SCIM_KEY_Multi_key, 0x10011b8, 0x10011af, 0, 0 }, 0x11E3},
+ {{SCIM_KEY_Multi_key, 0x10011b8, 0x10011ba, 0, 0 }, 0x11B9},
+ {{SCIM_KEY_Multi_key, 0x10011b8, 0x10011bc, 0, 0 }, 0x11E6},
+ {{SCIM_KEY_Multi_key, 0x10011b8, 0x10011c1, 0, 0 }, 0x11E4},
+ {{SCIM_KEY_Multi_key, 0x10011b8, 0x10011c2, 0, 0 }, 0x11E5},
+ {{SCIM_KEY_Multi_key, 0x10011ba, 0x10011a8, 0, 0 }, 0x11E7},
+ {{SCIM_KEY_Multi_key, 0x10011ba, 0x10011ae, 0, 0 }, 0x11E8},
+ {{SCIM_KEY_Multi_key, 0x10011ba, 0x10011af, 0, 0 }, 0x11E9},
+ {{SCIM_KEY_Multi_key, 0x10011ba, 0x10011b8, 0, 0 }, 0x11EA},
+ {{SCIM_KEY_Multi_key, 0x10011ba, 0x10011ba, 0, 0 }, 0x11BB},
+ {{SCIM_KEY_Multi_key, 0x10011bc, 0x10011a8, 0, 0 }, 0x11EC},
+ {{SCIM_KEY_Multi_key, 0x10011bc, 0x10011a8, 0x10011a8, 0 }, 0x11ED},
+ {{SCIM_KEY_Multi_key, 0x10011bc, 0x10011a9, 0, 0 }, 0x11ED},
+ {{SCIM_KEY_Multi_key, 0x10011bc, 0x10011bc, 0, 0 }, 0x11EE},
+ {{SCIM_KEY_Multi_key, 0x10011bc, 0x10011bf, 0, 0 }, 0x11EF},
+ {{SCIM_KEY_Multi_key, 0x10011c1, 0x10011b8, 0, 0 }, 0x11F3},
+ {{SCIM_KEY_Multi_key, 0x10011c1, 0x10011bc, 0, 0 }, 0x11F4},
+ {{SCIM_KEY_Multi_key, 0x10011c2, 0x10011ab, 0, 0 }, 0x11F5},
+ {{SCIM_KEY_Multi_key, 0x10011c2, 0x10011af, 0, 0 }, 0x11F6},
+ {{SCIM_KEY_Multi_key, 0x10011c2, 0x10011b7, 0, 0 }, 0x11F7},
+ {{SCIM_KEY_Multi_key, 0x10011c2, 0x10011b8, 0, 0 }, 0x11F8},
+ {{SCIM_KEY_Multi_key, 0x10011ce, 0x10011c2, 0, 0 }, 0x11CF},
+ {{SCIM_KEY_Multi_key, 0x10011dd, 0x10011ba, 0, 0 }, 0x11DE},
+ {{SCIM_KEY_Multi_key, 0x10011ec, 0x10011a8, 0, 0 }, 0x11ED},
+ {{SCIM_KEY_Multi_key, 0x10011f0, 0x10011ba, 0, 0 }, 0x11F1},
+ {{SCIM_KEY_Multi_key, 0x10011f0, 0x10011eb, 0, 0 }, 0x11F2},
+ {{SCIM_KEY_Multi_key, 0x1001fbf, SCIM_KEY_apostrophe, 0, 0 }, 0x1FCE},
+ {{SCIM_KEY_Multi_key, 0x1001fbf, SCIM_KEY_grave, 0, 0 }, 0x1FCD},
+ {{SCIM_KEY_Multi_key, 0x1001fbf, SCIM_KEY_asciitilde, 0, 0 }, 0x1FCF},
+ {{SCIM_KEY_Multi_key, 0x1001fbf, SCIM_KEY_acute, 0, 0 }, 0x1FCE},
+ {{SCIM_KEY_Multi_key, 0x1001fbf, SCIM_KEY_combining_grave, 0, 0 }, 0x1FCD},
+ {{SCIM_KEY_Multi_key, 0x1001fbf, SCIM_KEY_combining_acute, 0, 0 }, 0x1FCE},
+ {{SCIM_KEY_Multi_key, 0x1001fbf, SCIM_KEY_dead_grave, 0, 0 }, 0x1FCD},
+ {{SCIM_KEY_Multi_key, 0x1001fbf, SCIM_KEY_dead_acute, 0, 0 }, 0x1FCE},
+ {{SCIM_KEY_Multi_key, 0x1001fbf, SCIM_KEY_dead_tilde, 0, 0 }, 0x1FCF},
+ {{SCIM_KEY_Multi_key, 0x1001fbf, 0x1000342, 0, 0 }, 0x1FCF},
+ {{SCIM_KEY_Multi_key, 0x1001ffe, SCIM_KEY_apostrophe, 0, 0 }, 0x1FDE},
+ {{SCIM_KEY_Multi_key, 0x1001ffe, SCIM_KEY_grave, 0, 0 }, 0x1FDD},
+ {{SCIM_KEY_Multi_key, 0x1001ffe, SCIM_KEY_asciitilde, 0, 0 }, 0x1FDF},
+ {{SCIM_KEY_Multi_key, 0x1001ffe, SCIM_KEY_acute, 0, 0 }, 0x1FDE},
+ {{SCIM_KEY_Multi_key, 0x1001ffe, SCIM_KEY_combining_grave, 0, 0 }, 0x1FDD},
+ {{SCIM_KEY_Multi_key, 0x1001ffe, SCIM_KEY_combining_acute, 0, 0 }, 0x1FDE},
+ {{SCIM_KEY_Multi_key, 0x1001ffe, SCIM_KEY_dead_grave, 0, 0 }, 0x1FDD},
+ {{SCIM_KEY_Multi_key, 0x1001ffe, SCIM_KEY_dead_acute, 0, 0 }, 0x1FDE},
+ {{SCIM_KEY_Multi_key, 0x1001ffe, SCIM_KEY_dead_tilde, 0, 0 }, 0x1FDF},
+ {{SCIM_KEY_Multi_key, 0x1001ffe, 0x1000342, 0, 0 }, 0x1FDF},
+ {{SCIM_KEY_Multi_key, 0x1002203, 0x1000338, 0, 0 }, 0x2204},
+ {{SCIM_KEY_Multi_key, 0x1002208, 0x1000338, 0, 0 }, 0x2209},
+ {{SCIM_KEY_Multi_key, 0x100220b, 0x1000338, 0, 0 }, 0x220C},
+ {{SCIM_KEY_Multi_key, 0x1002223, 0x1000338, 0, 0 }, 0x2224},
+ {{SCIM_KEY_Multi_key, 0x1002225, 0x1000338, 0, 0 }, 0x2226},
+ {{SCIM_KEY_Multi_key, 0x100223c, 0x1000338, 0, 0 }, 0x2241},
+ {{SCIM_KEY_Multi_key, 0x1002243, 0x1000338, 0, 0 }, 0x2244},
+ {{SCIM_KEY_Multi_key, 0x1002248, 0x1000338, 0, 0 }, 0x2249},
+ {{SCIM_KEY_Multi_key, 0x100224d, 0x1000338, 0, 0 }, 0x226D},
+ {{SCIM_KEY_Multi_key, 0x1002272, 0x1000338, 0, 0 }, 0x2274},
+ {{SCIM_KEY_Multi_key, 0x1002273, 0x1000338, 0, 0 }, 0x2275},
+ {{SCIM_KEY_Multi_key, 0x1002276, 0x1000338, 0, 0 }, 0x2278},
+ {{SCIM_KEY_Multi_key, 0x1002277, 0x1000338, 0, 0 }, 0x2279},
+ {{SCIM_KEY_Multi_key, 0x100227a, 0x1000338, 0, 0 }, 0x2280},
+ {{SCIM_KEY_Multi_key, 0x100227b, 0x1000338, 0, 0 }, 0x2281},
+ {{SCIM_KEY_Multi_key, 0x100227c, 0x1000338, 0, 0 }, 0x22E0},
+ {{SCIM_KEY_Multi_key, 0x100227d, 0x1000338, 0, 0 }, 0x22E1},
+ {{SCIM_KEY_Multi_key, 0x1002286, 0x1000338, 0, 0 }, 0x2288},
+ {{SCIM_KEY_Multi_key, 0x1002287, 0x1000338, 0, 0 }, 0x2289},
+ {{SCIM_KEY_Multi_key, 0x1002291, 0x1000338, 0, 0 }, 0x22E2},
+ {{SCIM_KEY_Multi_key, 0x1002292, 0x1000338, 0, 0 }, 0x22E3},
+ {{SCIM_KEY_Multi_key, 0x10022a8, 0x1000338, 0, 0 }, 0x22AD},
+ {{SCIM_KEY_Multi_key, 0x10022a9, 0x1000338, 0, 0 }, 0x22AE},
+ {{SCIM_KEY_Multi_key, 0x10022ab, 0x1000338, 0, 0 }, 0x22AF},
+ {{SCIM_KEY_Multi_key, 0x10022b2, 0x1000338, 0, 0 }, 0x22EA},
+ {{SCIM_KEY_Multi_key, 0x10022b3, 0x1000338, 0, 0 }, 0x22EB},
+ {{SCIM_KEY_Multi_key, 0x10022b4, 0x1000338, 0, 0 }, 0x22EC},
+ {{SCIM_KEY_Multi_key, 0x10022b5, 0x1000338, 0, 0 }, 0x22ED},
+ {{SCIM_KEY_Multi_key, 0x1002add, 0x1000338, 0, 0 }, 0x2ADC},
+ {{0x100030f, SCIM_KEY_A, 0, 0, 0 }, 0x0200},
+ {{0x100030f, SCIM_KEY_E, 0, 0, 0 }, 0x0204},
+ {{0x100030f, SCIM_KEY_I, 0, 0, 0 }, 0x0208},
+ {{0x100030f, SCIM_KEY_O, 0, 0, 0 }, 0x020C},
+ {{0x100030f, SCIM_KEY_R, 0, 0, 0 }, 0x0210},
+ {{0x100030f, SCIM_KEY_U, 0, 0, 0 }, 0x0214},
+ {{0x100030f, SCIM_KEY_a, 0, 0, 0 }, 0x0201},
+ {{0x100030f, SCIM_KEY_e, 0, 0, 0 }, 0x0205},
+ {{0x100030f, SCIM_KEY_i, 0, 0, 0 }, 0x0209},
+ {{0x100030f, SCIM_KEY_o, 0, 0, 0 }, 0x020D},
+ {{0x100030f, SCIM_KEY_r, 0, 0, 0 }, 0x0211},
+ {{0x100030f, SCIM_KEY_u, 0, 0, 0 }, 0x0215},
+ {{0x100030f, 0x1000474, 0, 0, 0 }, 0x0476},
+ {{0x100030f, 0x1000475, 0, 0, 0 }, 0x0477},
+ {{0x1000311, SCIM_KEY_A, 0, 0, 0 }, 0x0202},
+ {{0x1000311, SCIM_KEY_E, 0, 0, 0 }, 0x0206},
+ {{0x1000311, SCIM_KEY_I, 0, 0, 0 }, 0x020A},
+ {{0x1000311, SCIM_KEY_O, 0, 0, 0 }, 0x020E},
+ {{0x1000311, SCIM_KEY_R, 0, 0, 0 }, 0x0212},
+ {{0x1000311, SCIM_KEY_U, 0, 0, 0 }, 0x0216},
+ {{0x1000311, SCIM_KEY_a, 0, 0, 0 }, 0x0203},
+ {{0x1000311, SCIM_KEY_e, 0, 0, 0 }, 0x0207},
+ {{0x1000311, SCIM_KEY_i, 0, 0, 0 }, 0x020B},
+ {{0x1000311, SCIM_KEY_o, 0, 0, 0 }, 0x020F},
+ {{0x1000311, SCIM_KEY_r, 0, 0, 0 }, 0x0213},
+ {{0x1000311, SCIM_KEY_u, 0, 0, 0 }, 0x0217},
+ {{0x1000313, SCIM_KEY_Greek_ALPHA, 0, 0, 0 }, 0x1F08},
+ {{0x1000313, SCIM_KEY_Greek_EPSILON, 0, 0, 0 }, 0x1F18},
+ {{0x1000313, SCIM_KEY_Greek_ETA, 0, 0, 0 }, 0x1F28},
+ {{0x1000313, SCIM_KEY_Greek_IOTA, 0, 0, 0 }, 0x1F38},
+ {{0x1000313, SCIM_KEY_Greek_OMICRON, 0, 0, 0 }, 0x1F48},
+ {{0x1000313, SCIM_KEY_Greek_OMEGA, 0, 0, 0 }, 0x1F68},
+ {{0x1000313, SCIM_KEY_Greek_alpha, 0, 0, 0 }, 0x1F00},
+ {{0x1000313, SCIM_KEY_Greek_epsilon, 0, 0, 0 }, 0x1F10},
+ {{0x1000313, SCIM_KEY_Greek_eta, 0, 0, 0 }, 0x1F20},
+ {{0x1000313, SCIM_KEY_Greek_iota, 0, 0, 0 }, 0x1F30},
+ {{0x1000313, SCIM_KEY_Greek_omicron, 0, 0, 0 }, 0x1F40},
+ {{0x1000313, SCIM_KEY_Greek_rho, 0, 0, 0 }, 0x1FE4},
+ {{0x1000313, SCIM_KEY_Greek_upsilon, 0, 0, 0 }, 0x1F50},
+ {{0x1000313, SCIM_KEY_Greek_omega, 0, 0, 0 }, 0x1F60},
+ {{0x1000314, SCIM_KEY_Greek_ALPHA, 0, 0, 0 }, 0x1F09},
+ {{0x1000314, SCIM_KEY_Greek_EPSILON, 0, 0, 0 }, 0x1F19},
+ {{0x1000314, SCIM_KEY_Greek_ETA, 0, 0, 0 }, 0x1F29},
+ {{0x1000314, SCIM_KEY_Greek_IOTA, 0, 0, 0 }, 0x1F39},
+ {{0x1000314, SCIM_KEY_Greek_OMICRON, 0, 0, 0 }, 0x1F49},
+ {{0x1000314, SCIM_KEY_Greek_RHO, 0, 0, 0 }, 0x1FEC},
+ {{0x1000314, SCIM_KEY_Greek_UPSILON, 0, 0, 0 }, 0x1F59},
+ {{0x1000314, SCIM_KEY_Greek_OMEGA, 0, 0, 0 }, 0x1F69},
+ {{0x1000314, SCIM_KEY_Greek_alpha, 0, 0, 0 }, 0x1F01},
+ {{0x1000314, SCIM_KEY_Greek_epsilon, 0, 0, 0 }, 0x1F11},
+ {{0x1000314, SCIM_KEY_Greek_eta, 0, 0, 0 }, 0x1F21},
+ {{0x1000314, SCIM_KEY_Greek_iota, 0, 0, 0 }, 0x1F31},
+ {{0x1000314, SCIM_KEY_Greek_omicron, 0, 0, 0 }, 0x1F41},
+ {{0x1000314, SCIM_KEY_Greek_rho, 0, 0, 0 }, 0x1FE5},
+ {{0x1000314, SCIM_KEY_Greek_upsilon, 0, 0, 0 }, 0x1F51},
+ {{0x1000314, SCIM_KEY_Greek_omega, 0, 0, 0 }, 0x1F61},
+ {{0x1000324, SCIM_KEY_U, 0, 0, 0 }, 0x1E72},
+ {{0x1000324, SCIM_KEY_u, 0, 0, 0 }, 0x1E73},
+ {{0x1000325, SCIM_KEY_A, 0, 0, 0 }, 0x1E00},
+ {{0x1000325, SCIM_KEY_a, 0, 0, 0 }, 0x1E01},
+ {{0x1000326, SCIM_KEY_S, 0, 0, 0 }, 0x0218},
+ {{0x1000326, SCIM_KEY_T, 0, 0, 0 }, 0x021A},
+ {{0x1000326, SCIM_KEY_s, 0, 0, 0 }, 0x0219},
+ {{0x1000326, SCIM_KEY_t, 0, 0, 0 }, 0x021B},
+ {{0x100032d, SCIM_KEY_D, 0, 0, 0 }, 0x1E12},
+ {{0x100032d, SCIM_KEY_E, 0, 0, 0 }, 0x1E18},
+ {{0x100032d, SCIM_KEY_L, 0, 0, 0 }, 0x1E3C},
+ {{0x100032d, SCIM_KEY_N, 0, 0, 0 }, 0x1E4A},
+ {{0x100032d, SCIM_KEY_T, 0, 0, 0 }, 0x1E70},
+ {{0x100032d, SCIM_KEY_U, 0, 0, 0 }, 0x1E76},
+ {{0x100032d, SCIM_KEY_d, 0, 0, 0 }, 0x1E13},
+ {{0x100032d, SCIM_KEY_e, 0, 0, 0 }, 0x1E19},
+ {{0x100032d, SCIM_KEY_l, 0, 0, 0 }, 0x1E3D},
+ {{0x100032d, SCIM_KEY_n, 0, 0, 0 }, 0x1E4B},
+ {{0x100032d, SCIM_KEY_t, 0, 0, 0 }, 0x1E71},
+ {{0x100032d, SCIM_KEY_u, 0, 0, 0 }, 0x1E77},
+ {{0x100032e, SCIM_KEY_H, 0, 0, 0 }, 0x1E2A},
+ {{0x100032e, SCIM_KEY_h, 0, 0, 0 }, 0x1E2B},
+ {{0x1000330, SCIM_KEY_E, 0, 0, 0 }, 0x1E1A},
+ {{0x1000330, SCIM_KEY_I, 0, 0, 0 }, 0x1E2C},
+ {{0x1000330, SCIM_KEY_U, 0, 0, 0 }, 0x1E74},
+ {{0x1000330, SCIM_KEY_e, 0, 0, 0 }, 0x1E1B},
+ {{0x1000330, SCIM_KEY_i, 0, 0, 0 }, 0x1E2D},
+ {{0x1000330, SCIM_KEY_u, 0, 0, 0 }, 0x1E75},
+ {{0x1000331, SCIM_KEY_B, 0, 0, 0 }, 0x1E06},
+ {{0x1000331, SCIM_KEY_D, 0, 0, 0 }, 0x1E0E},
+ {{0x1000331, SCIM_KEY_K, 0, 0, 0 }, 0x1E34},
+ {{0x1000331, SCIM_KEY_L, 0, 0, 0 }, 0x1E3A},
+ {{0x1000331, SCIM_KEY_N, 0, 0, 0 }, 0x1E48},
+ {{0x1000331, SCIM_KEY_R, 0, 0, 0 }, 0x1E5E},
+ {{0x1000331, SCIM_KEY_T, 0, 0, 0 }, 0x1E6E},
+ {{0x1000331, SCIM_KEY_Z, 0, 0, 0 }, 0x1E94},
+ {{0x1000331, SCIM_KEY_b, 0, 0, 0 }, 0x1E07},
+ {{0x1000331, SCIM_KEY_d, 0, 0, 0 }, 0x1E0F},
+ {{0x1000331, SCIM_KEY_h, 0, 0, 0 }, 0x1E96},
+ {{0x1000331, SCIM_KEY_k, 0, 0, 0 }, 0x1E35},
+ {{0x1000331, SCIM_KEY_l, 0, 0, 0 }, 0x1E3B},
+ {{0x1000331, SCIM_KEY_n, 0, 0, 0 }, 0x1E49},
+ {{0x1000331, SCIM_KEY_r, 0, 0, 0 }, 0x1E5F},
+ {{0x1000331, SCIM_KEY_t, 0, 0, 0 }, 0x1E6F},
+ {{0x1000331, SCIM_KEY_z, 0, 0, 0 }, 0x1E95},
+ {{0x1000342, SCIM_KEY_Greek_iotadieresis, 0, 0, 0 }, 0x1FD7},
+ {{0x1000342, SCIM_KEY_Greek_upsilondieresis, 0, 0, 0 }, 0x1FE7},
+ {{0x1000342, SCIM_KEY_Greek_alpha, 0, 0, 0 }, 0x1FB6},
+ {{0x1000342, SCIM_KEY_Greek_eta, 0, 0, 0 }, 0x1FC6},
+ {{0x1000342, SCIM_KEY_Greek_iota, 0, 0, 0 }, 0x1FD6},
+ {{0x1000342, SCIM_KEY_Greek_upsilon, 0, 0, 0 }, 0x1FE6},
+ {{0x1000342, SCIM_KEY_Greek_omega, 0, 0, 0 }, 0x1FF6},
+ {{0x1000342, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_iota, 0, 0 }, 0x1FD7},
+ {{0x1000342, SCIM_KEY_dead_diaeresis, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1FE7},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Greek_iota, 0 }, 0x1FD7},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_quotedbl, SCIM_KEY_Greek_upsilon, 0 }, 0x1FE7},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0F},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_ETA, 0 }, 0x1F2F},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3F},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_UPSILON, 0 }, 0x1F5F},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6F},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_alpha, 0 }, 0x1F07},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_eta, 0 }, 0x1F27},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_iota, 0 }, 0x1F37},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_upsilon, 0 }, 0x1F57},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenleft, SCIM_KEY_Greek_omega, 0 }, 0x1F67},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ALPHA, 0 }, 0x1F0E},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_ETA, 0 }, 0x1F2E},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_IOTA, 0 }, 0x1F3E},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_OMEGA, 0 }, 0x1F6E},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_alpha, 0 }, 0x1F06},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_eta, 0 }, 0x1F26},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_iota, 0 }, 0x1F36},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_upsilon, 0 }, 0x1F56},
+ {{0x1000342, SCIM_KEY_Multi_key, SCIM_KEY_parenright, SCIM_KEY_Greek_omega, 0 }, 0x1F66},
+ {{0x1000342, 0x1000313, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1F0E},
+ {{0x1000342, 0x1000313, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1F2E},
+ {{0x1000342, 0x1000313, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1F3E},
+ {{0x1000342, 0x1000313, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1F6E},
+ {{0x1000342, 0x1000313, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1F06},
+ {{0x1000342, 0x1000313, SCIM_KEY_Greek_eta, 0, 0 }, 0x1F26},
+ {{0x1000342, 0x1000313, SCIM_KEY_Greek_iota, 0, 0 }, 0x1F36},
+ {{0x1000342, 0x1000313, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1F56},
+ {{0x1000342, 0x1000313, SCIM_KEY_Greek_omega, 0, 0 }, 0x1F66},
+ {{0x1000342, 0x1000314, SCIM_KEY_Greek_ALPHA, 0, 0 }, 0x1F0F},
+ {{0x1000342, 0x1000314, SCIM_KEY_Greek_ETA, 0, 0 }, 0x1F2F},
+ {{0x1000342, 0x1000314, SCIM_KEY_Greek_IOTA, 0, 0 }, 0x1F3F},
+ {{0x1000342, 0x1000314, SCIM_KEY_Greek_UPSILON, 0, 0 }, 0x1F5F},
+ {{0x1000342, 0x1000314, SCIM_KEY_Greek_OMEGA, 0, 0 }, 0x1F6F},
+ {{0x1000342, 0x1000314, SCIM_KEY_Greek_alpha, 0, 0 }, 0x1F07},
+ {{0x1000342, 0x1000314, SCIM_KEY_Greek_eta, 0, 0 }, 0x1F27},
+ {{0x1000342, 0x1000314, SCIM_KEY_Greek_iota, 0, 0 }, 0x1F37},
+ {{0x1000342, 0x1000314, SCIM_KEY_Greek_upsilon, 0, 0 }, 0x1F57},
+ {{0x1000342, 0x1000314, SCIM_KEY_Greek_omega, 0, 0 }, 0x1F67},
+ {{0x1000342, 0x1001f00, 0, 0, 0 }, 0x1F06},
+ {{0x1000342, 0x1001f01, 0, 0, 0 }, 0x1F07},
+ {{0x1000342, 0x1001f08, 0, 0, 0 }, 0x1F0E},
+ {{0x1000342, 0x1001f09, 0, 0, 0 }, 0x1F0F},
+ {{0x1000342, 0x1001f20, 0, 0, 0 }, 0x1F26},
+ {{0x1000342, 0x1001f21, 0, 0, 0 }, 0x1F27},
+ {{0x1000342, 0x1001f28, 0, 0, 0 }, 0x1F2E},
+ {{0x1000342, 0x1001f29, 0, 0, 0 }, 0x1F2F},
+ {{0x1000342, 0x1001f30, 0, 0, 0 }, 0x1F36},
+ {{0x1000342, 0x1001f31, 0, 0, 0 }, 0x1F37},
+ {{0x1000342, 0x1001f38, 0, 0, 0 }, 0x1F3E},
+ {{0x1000342, 0x1001f39, 0, 0, 0 }, 0x1F3F},
+ {{0x1000342, 0x1001f50, 0, 0, 0 }, 0x1F56},
+ {{0x1000342, 0x1001f51, 0, 0, 0 }, 0x1F57},
+ {{0x1000342, 0x1001f59, 0, 0, 0 }, 0x1F5F},
+ {{0x1000342, 0x1001f60, 0, 0, 0 }, 0x1F66},
+ {{0x1000342, 0x1001f61, 0, 0, 0 }, 0x1F67},
+ {{0x1000342, 0x1001f68, 0, 0, 0 }, 0x1F6E},
+ {{0x1000342, 0x1001f69, 0, 0, 0 }, 0x1F6F},
--- /dev/null
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_config_agent.cpp,v 1.10 2005/07/03 08:36:42 suzhe Exp $
+ *
+ */
+
+#define Uses_STL_IOSTREAM
+#define Uses_C_LOCALE
+#define Uses_SCIM_CONFIG_MODULE
+#define Uses_SCIM_HELPER
+#define Uses_SCIM_CONFIG_PATH
+
+#include "scim_private.h"
+#include <scim.h>
+#include <stdlib.h>
+
+using namespace scim;
+using std::cout;
+using std::cerr;
+using std::endl;
+
+enum DataType
+{
+ DATA_TYPE_STRING,
+ DATA_TYPE_INT,
+ DATA_TYPE_DOUBLE,
+ DATA_TYPE_BOOL,
+ DATA_TYPE_STRING_LIST,
+ DATA_TYPE_INT_LIST
+};
+
+enum Command
+{
+ DO_NOTHING,
+ GET_DATA,
+ SET_DATA,
+ DEL_KEY
+};
+
+static String trim_blank (const String &str)
+{
+ String::size_type begin, len;
+
+ begin = str.find_first_not_of (" \t\n\v");
+
+ if (begin == String::npos)
+ return String ();
+
+ len = str.find_last_not_of (" \t\n\v") - begin + 1;
+
+ return str.substr (begin, len);
+}
+
+static String get_param_portion (const String &str)
+{
+ String::size_type begin = str.find_first_of (" \t\n\v=");
+
+ if (begin == String::npos) return str;
+
+ return str.substr (0, begin);
+}
+
+static String get_value_portion (const String &str)
+{
+ String::size_type begin = str.find_first_of ("=");
+
+ if (begin == String::npos || (begin + 1) == str.length ()) return String ("");
+
+ return trim_blank (str.substr (begin + 1, String::npos));
+}
+
+int main (int argc, char *argv [])
+{
+ static ConfigModule config_module;
+
+ ConfigPointer config;
+ std::vector<String> config_list;
+ String def_config;
+ String key;
+ String value;
+ String display;
+
+ DataType type = DATA_TYPE_STRING;
+ Command cmd = DO_NOTHING;
+ bool reload = false;
+ bool global = false;
+
+ int i;
+
+ char *p = getenv ("DISPLAY");
+ if (p) display = String (p);
+
+ //get modules list
+ scim_get_config_module_list (config_list);
+
+ //Use simple Config module as default if available.
+ if (config_list.size ()) {
+ def_config = scim_global_config_read (SCIM_GLOBAL_CONFIG_DEFAULT_CONFIG_MODULE, String ("simple"));
+ if (std::find (config_list.begin (),
+ config_list.end (),
+ def_config) == config_list.end ())
+ def_config = config_list [0];
+ } else {
+ cerr << "No config module found.\n";
+ return -1;
+ }
+
+ // parse command options
+ i = 0;
+ while (i<argc) {
+ if (++i >= argc) break;
+
+ if (String ("-h") == argv [i] ||
+ String ("--help") == argv [i]) {
+ cout << "Usage: " << argv [0] << " <option>...\n\n"
+ << "The options are:\n"
+ << " -g, --get key Get the value of this key.\n"
+ << " -s, --set key=value Set the value of this key.\n"
+ << " -d, --del key Delete the key and its data\n"
+ << " from user config file.\n"
+ << " -t, --type type The key value type, valid types are:\n"
+ << " string, int, double, bool, string-list,\n"
+ << " int-list. The default type is string.\n"
+ << " -c, --config name Use specified Config module,\n"
+ << " use simple module by default.\n"
+ << " Use \"global\" instead of a real config module name,\n"
+ << " if you want to access the global configuration file.\n"
+ << " (Normally they are /etc/scim/global and ~/.scim/global).\n"
+ << " --reload Force the running scim to reload configuration.\n"
+ << " --display display The display which scim Panel is running on,\n"
+ << " it's only useful when --reload is used.\n"
+ << " -h, --help Show this help.\n";
+ return 0;
+ }
+
+ if (String ("-g") == argv [i] ||
+ String ("--get") == argv [i]) {
+ if (++i >= argc) {
+ cerr << "No argument for option " << argv [i-1] << endl;
+ return -1;
+ }
+ if (cmd != DO_NOTHING) {
+ cerr << "You can only do one thing at the same time!\n";
+ return -1;
+ }
+ key = String (argv [i]);
+ cmd = GET_DATA;
+ continue;
+ }
+
+ if (String ("-s") == argv [i] ||
+ String ("--set") == argv [i]) {
+ if (++i >= argc) {
+ cerr << "No argument for option " << argv [i-1] << endl;
+ return -1;
+ }
+ if (cmd != DO_NOTHING) {
+ cerr << "You can only do one thing at the same time!\n";
+ return -1;
+ }
+
+ String str (argv [i]);
+ str = trim_blank (str);
+
+ key = get_param_portion (str);
+ value = get_value_portion (str);
+
+ if (!key.length ()) {
+ cerr << "Bad argument for option " << argv [i-1] << endl;
+ return -1;
+ }
+
+ cmd = SET_DATA;
+ continue;
+ }
+
+ if (String ("-d") == argv [i] ||
+ String ("--del") == argv [i]) {
+ if (++i >= argc) {
+ cerr << "No argument for option " << argv [i-1] << endl;
+ return -1;
+ }
+ if (cmd != DO_NOTHING) {
+ cerr << "You can only do one thing at the same time!\n";
+ return -1;
+ }
+
+ key = String (argv [i]);
+ cmd = DEL_KEY;
+ continue;
+ }
+
+ if (String ("-t") == argv [i] ||
+ String ("--type") == argv [i]) {
+ if (++i >= argc) {
+ cerr << "No argument for option " << argv [i-1] << endl;
+ return -1;
+ }
+ if (String (argv [i]) == "string")
+ type = DATA_TYPE_STRING;
+ else if (String (argv [i]) == "int")
+ type = DATA_TYPE_INT;
+ else if (String (argv [i]) == "double")
+ type = DATA_TYPE_DOUBLE;
+ else if (String (argv [i]) == "bool")
+ type = DATA_TYPE_BOOL;
+ else if (String (argv [i]) == "string-list")
+ type = DATA_TYPE_STRING_LIST;
+ else if (String (argv [i]) == "int-list")
+ type = DATA_TYPE_STRING_LIST;
+ else {
+ cerr << "Bad argument for option " << argv [i-1] << endl;
+ return -1;
+ }
+ continue;
+ }
+
+ if (String ("-c") == argv [i] ||
+ String ("--config") == argv [i]) {
+ if (++i >= argc) {
+ cerr << "No argument for option " << argv [i-1] << endl;
+ return -1;
+ }
+ def_config = String (argv [i]);
+ continue;
+ }
+
+ if (String ("--display") == argv [i]) {
+ if (++i >= argc) {
+ cerr << "No argument for option " << argv [i-1] << endl;
+ return -1;
+ }
+ display = String (argv [i]);
+ continue;
+ }
+
+ if (String ("--reload") == argv [i]) {
+ reload = true;
+ continue;
+ }
+
+ cerr << "Unknown option " << argv [i] << endl;
+ return -1;
+ }
+
+ if ((cmd == DO_NOTHING || !key.length ()) && reload == false) {
+ cerr << "What do you want to do?\n";
+ return -1;
+ }
+
+ if (cmd != DO_NOTHING) {
+ if (def_config == "global") {
+ global = true;
+ } else {
+ if (!config_module.load (def_config)) {
+ cerr << "Failed to load config module " << def_config << endl;
+ return -1;
+ }
+
+ config = config_module.create_config ();
+
+ if (config.null ()) {
+ cerr << "Failed to create config object.\n";
+ return -1;
+ }
+ }
+ }
+
+ // Get data
+ if (cmd == GET_DATA) {
+ bool ok = false;
+ if (type == DATA_TYPE_STRING) {
+ if (global) {
+ value = scim_global_config_read (key, String (""));
+ ok = (scim_global_config_read (key, String ("Invalid")) == value);
+ } else {
+ ok = config->read (key, &value);
+ }
+ if (ok) cout << value << endl;
+ } else if (type == DATA_TYPE_INT) {
+ int intval;
+ if (global) {
+ intval = scim_global_config_read (key, (int) 0);
+ ok = (scim_global_config_read (key, (int) 0) == intval);
+ } else {
+ ok = config->read (key, &intval);
+ }
+ if (ok) cout << intval << endl;
+ } else if (type == DATA_TYPE_DOUBLE) {
+ double doubleval;
+ if (global) {
+ doubleval = scim_global_config_read (key, (double) 0);
+ ok = (scim_global_config_read (key, (double) 1) == doubleval);
+ } else {
+ ok = config->read (key, &doubleval);
+ }
+ if (ok) cout << doubleval << endl;
+ } else if (type == DATA_TYPE_BOOL) {
+ bool boolval;
+ if (global) {
+ boolval = scim_global_config_read (key, (bool) false);
+ ok = (scim_global_config_read (key, (bool) true) == boolval);
+ } else {
+ ok = config->read (key, &boolval);
+ }
+ if (ok) cout << (boolval ? "true" : "false") << endl;
+ } else if (type == DATA_TYPE_STRING_LIST) {
+ std::vector <String> strlistval;
+ if (global) {
+ strlistval = scim_global_config_read (key, strlistval);
+ ok = (strlistval.size () > 0);
+ } else {
+ ok = config->read (key, &strlistval);
+ }
+ if (ok) cout << scim_combine_string_list (strlistval, ',') << endl;
+ } else if (type == DATA_TYPE_INT_LIST) {
+ std::vector <int> intlistval;
+ if (global) {
+ intlistval = scim_global_config_read (key, intlistval);
+ ok = (intlistval.size () > 0);
+ } else {
+ ok = config->read (key, &intlistval);
+ }
+
+ if (ok) {
+ for (size_t i = 0; i<intlistval.size (); ++i) {
+ cout << intlistval [i];
+ if (i < intlistval.size () - 1)
+ cout << ",";
+ }
+ cout << endl;
+ }
+ }
+
+ if (!ok) {
+ cerr << "Failed to get key value.\n";
+ return -1;
+ }
+ }
+
+ // Set data
+ else if (cmd == SET_DATA) {
+ bool ok = true;
+ if (type != DATA_TYPE_STRING && !value.length ()) {
+ ok = false;
+ } else if (type == DATA_TYPE_STRING) {
+ if (global) {
+ scim_global_config_write (key, value);
+ } else {
+ ok = config->write (key, value);
+ }
+ } else if (type == DATA_TYPE_INT) {
+ int intval = strtol (value.c_str (), 0, 10);
+ if (global) {
+ scim_global_config_write (key, intval);
+ } else {
+ ok = config->write (key, intval);
+ }
+ } else if (type == DATA_TYPE_DOUBLE) {
+ double doubleval = strtod (value.c_str (), 0);
+ if (global) {
+ scim_global_config_write (key, doubleval);
+ } else {
+ ok = config->write (key, doubleval);
+ }
+ } else if (type == DATA_TYPE_BOOL) {
+ bool boolval = false;
+ if (value == "true" || value == "True" || value == "TRUE" || value == "1")
+ boolval = true;
+
+ if (global) {
+ scim_global_config_write (key, boolval);
+ } else {
+ ok = config->write (key, boolval);
+ }
+ } else if (type == DATA_TYPE_STRING_LIST) {
+ std::vector <String> strlistval;
+ scim_split_string_list (strlistval, value, ',');
+
+ if (global) {
+ scim_global_config_write (key, strlistval);
+ } else {
+ ok = config->write (key, strlistval);
+ }
+ } else if (type == DATA_TYPE_INT_LIST) {
+ std::vector <int> intlistval;
+ std::vector <String> strlist;
+ scim_split_string_list (strlist, value, ',');
+ for (size_t i = 0; i<strlist.size (); ++i)
+ intlistval.push_back (strtol (strlist[i].c_str (), 0, 10));
+
+ if (global) {
+ scim_global_config_write (key, intlistval);
+ } else {
+ ok = config->write (key, intlistval);
+ }
+ }
+
+ if (global)
+ ok = scim_global_config_flush ();
+
+ if (!ok) {
+ cerr << "Failed to set key value.\n";
+ return -1;
+ } else {
+ cout << "Set data success.\n";
+ if (!global) config->flush ();
+ }
+ }
+
+ // Delete key
+ else if (cmd == DEL_KEY) {
+ bool ok = false;
+
+ if (global) {
+ scim_global_config_reset (key);
+ ok = scim_global_config_flush ();
+ } else {
+ ok = config->erase (key);
+ }
+
+ if (ok) {
+ cout << "Delete key success.\n";
+ if (!global) config->flush ();
+ } else {
+ cerr << "Failed to delete the key.\n";
+ return -1;
+ }
+ }
+
+ if (reload) {
+ HelperInfo helper_info ("41b79480-c5d2-4929-9456-11d519c26b87", "scim-config-agent", "", "", SCIM_HELPER_STAND_ALONE);
+ HelperAgent helper_agent;
+
+ int id;
+
+ id = helper_agent.open_connection (helper_info, display);
+
+ if (id < 0) {
+ cerr << "Unable to open the connection to scim Panel.\n";
+ return -1;
+ }
+
+ helper_agent.reload_config ();
+
+ cout << "Configuration reload request has been sent to the running scim.\n";
+
+ helper_agent.close_connection ();
+ }
+
+ return 0;
+}
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_config_base.cpp,v 1.19 2005/04/09 15:38:39 suzhe Exp $
+ */
+
+#define Uses_SCIM_CONFIG_BASE
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_SCIM_CONFIG_MODULE
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+static ConfigPointer _scim_default_config (0);
+static ConfigModule _scim_default_config_module;
+
+static ConfigPointer
+_create_config (const String &default_module)
+{
+ if (!_scim_default_config_module.valid ()) {
+
+ String module;
+
+ if (!default_module.length ())
+ module = scim_global_config_read (SCIM_GLOBAL_CONFIG_DEFAULT_CONFIG_MODULE, String ("simple"));
+ else
+ module = default_module;
+
+ _scim_default_config_module.load (module);
+ }
+
+ if (_scim_default_config_module.valid ()) {
+ _scim_default_config = _scim_default_config_module.create_config ();
+ return _scim_default_config;
+ }
+
+ return ConfigPointer (0);
+}
+
+ConfigBase::ConfigBase ()
+{
+}
+
+ConfigBase::~ConfigBase ()
+{
+}
+
+bool
+ConfigBase::valid () const
+{
+ return true;
+}
+
+String
+ConfigBase::read (const String& key, const String& defVal) const
+{
+ String tmp;
+ if (!read (key, &tmp)) {
+ SCIM_DEBUG_CONFIG(1) << "Warning : No default scim::String value for key \"" << key << "\", "
+ << "using default value.\n";
+ return defVal;
+ }
+ return tmp;
+}
+
+int
+ConfigBase::read (const String& key, int defVal) const
+{
+ int tmp = 0;
+ if (!read (key, &tmp)) {
+ SCIM_DEBUG_CONFIG(1) << "Warning : No default int value for key \"" << key << "\", "
+ << "using default value.\n";
+ return defVal;
+ }
+ return tmp;
+}
+
+double
+ConfigBase::read (const String& key, double defVal) const
+{
+ double tmp = 0;
+ if (!read (key, &tmp)) {
+ SCIM_DEBUG_CONFIG(1) << "Warning : No default float value for key \"" << key << "\", "
+ << "using default value.\n";
+ return defVal;
+ }
+ return tmp;
+}
+
+bool
+ConfigBase::read (const String& key, bool defVal) const
+{
+ bool tmp = false;
+ if (!read (key, &tmp)) {
+ SCIM_DEBUG_CONFIG(1) << "Warning : No default bool value for key \"" << key << "\", "
+ << "using default value.\n";
+ return defVal;
+ }
+ return tmp;
+}
+
+std::vector <String>
+ConfigBase::read (const String& key, const std::vector <String>& defVal) const
+{
+ std::vector <String> tmp;
+ if (!read (key, &tmp)) {
+ SCIM_DEBUG_CONFIG(1) << "Warning : No default scim::String list value for key \"" << key << "\", "
+ << "using default value.\n";
+ return defVal;
+ }
+ return tmp;
+}
+
+std::vector <int>
+ConfigBase::read (const String& key, const std::vector <int>& defVal) const
+{
+ std::vector <int> tmp;
+ if (!read (key, &tmp)) {
+ SCIM_DEBUG_CONFIG(1) << "Warning : No default int list value for key \"" << key << "\", "
+ << "using default value.\n";
+ return defVal;
+ }
+ return tmp;
+}
+
+bool
+ConfigBase::reload ()
+{
+ if (!ConfigBase::valid ()) return false;
+
+ m_signal_reload.emit (this);
+
+ return true;
+}
+
+Connection
+ConfigBase::signal_connect_reload (ConfigSlotVoid *slot)
+{
+ return m_signal_reload.connect (slot);
+}
+
+ConfigPointer
+ConfigBase::set (const ConfigPointer &p_config)
+{
+ ConfigPointer old = _scim_default_config;
+
+ _scim_default_config = p_config;
+
+ return old;
+}
+
+ConfigPointer
+ConfigBase::get (bool create_on_demand, const String &default_module)
+{
+ if (create_on_demand && _scim_default_config.null ())
+ _create_config (default_module);
+ return _scim_default_config;
+}
+
+/*
+ * Implementation of DummyConfig
+ */
+
+DummyConfig::DummyConfig ()
+{
+}
+
+DummyConfig::~DummyConfig ()
+{
+}
+
+bool
+DummyConfig::valid () const
+{
+ return ConfigBase::valid();
+}
+
+String
+DummyConfig::get_name () const
+{
+ return "dummy";
+}
+
+// String
+bool
+DummyConfig::read (const String& key, String *pStr) const
+{
+ return false;
+}
+
+// int
+bool
+DummyConfig::read (const String& key, int *pl) const
+{
+ return false;
+}
+
+// double
+bool
+DummyConfig::read (const String& key, double* val) const
+{
+ return false;
+}
+
+// bool
+bool
+DummyConfig::read (const String& key, bool* val) const
+{
+ return false;
+}
+
+//String list
+bool
+DummyConfig::read (const String& key, std::vector <String>* val) const
+{
+ return false;
+}
+
+//int list
+bool
+DummyConfig::read (const String& key, std::vector <int>* val) const
+{
+ return false;
+}
+
+// write the value (return true on success)
+bool
+DummyConfig::write (const String& key, const String& value)
+{
+ return true;
+}
+
+bool
+DummyConfig::write (const String& key, int value)
+{
+ return true;
+}
+
+bool
+DummyConfig::write (const String& key, double value)
+{
+ return true;
+}
+
+bool
+DummyConfig::write (const String& key, bool value)
+{
+ return true;
+}
+
+bool
+DummyConfig::write (const String& key, const std::vector <String>& value)
+{
+ return true;
+}
+
+bool
+DummyConfig::write (const String& key, const std::vector <int>& value)
+{
+ return true;
+}
+
+
+// permanently writes all changes
+bool
+DummyConfig::flush()
+{
+ return true;
+}
+
+// delete entries
+bool
+DummyConfig::erase (const String& key)
+{
+ return true;
+}
+
+// reload the configurations.
+bool
+DummyConfig::reload ()
+{
+ return ConfigBase::reload ();
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_config_base.h
+ * @brief scim::ConfigBase Interface.
+ *
+ * Provide a unified interface to access the configuration data.
+ * All of SCIM objects should use this interface if they have any
+ * configuration data.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_config_base.h,v 1.22 2005/04/09 15:38:39 suzhe Exp $
+ */
+
+#ifndef __SCIM_CONFIG_BASE_H
+#define __SCIM_CONFIG_BASE_H
+
+namespace scim {
+/**
+ * @addtogroup Config
+ * @ingroup InputServiceFramework
+ * The base classes for config modules
+ * @{
+ */
+
+/**
+ * @brief An exception class to hold Config related errors.
+ *
+ * scim::ConfigBase and its derived classes must throw
+ * scim::ConfigError object when error.
+ */
+class ConfigError: public Exception
+{
+public:
+ ConfigError (const String& what_arg)
+ : Exception (String("scim::Config: ") + what_arg) { }
+};
+
+class ConfigBase;
+/**
+ * @typedef typedef Pointer <ConfigBase> ConfigPointer;
+ *
+ * A smart pointer for scim::ConfigBase and its derived classes.
+ */
+typedef Pointer <ConfigBase> ConfigPointer;
+
+/**
+ * @typedef typedef Slot1<void, const ConfigPointer &> ConfigSlotVoid;
+ *
+ * The slot type to connect to the coresponding signal.
+ */
+typedef Slot1<void, const ConfigPointer &> ConfigSlotVoid;
+
+/**
+ * @typedef typedef Signal1<void, const ConfigPointer &> ConfigSignalVoid;
+ *
+ * The signal type to connect with the ConfigSlotVoid slot type.
+ */
+typedef Signal1<void, const ConfigPointer &> ConfigSignalVoid;
+
+/**
+ * @brief The interface class to access the configuration data.
+ *
+ * This is an interface class to access the configuration data.
+ * All of the SCIM objects which have configuration data should
+ * use this interface to store and load them.
+ */
+class ConfigBase : public ReferencedObject
+{
+ ConfigSignalVoid m_signal_reload;
+
+public:
+ /**
+ * @name Constructor and Destructor.
+ * @{
+ */
+
+ /**
+ * @brief Contrustor
+ */
+ ConfigBase ();
+
+ /**
+ * @brief Virtual destructor
+ * empty but ensures that dtor of all derived classes is virtual
+ */
+ virtual ~ConfigBase ();
+
+ /**
+ * @}
+ */
+
+ /**
+ * @name Pure virtual methods which should be implemented in derived classes.
+ * @{
+ */
+
+ /**
+ * @brief Check if this Config object is valid.
+ * @return true if its valid and ready to work.
+ */
+ virtual bool valid () const = 0;
+
+ /**
+ * @brief Return the name of this configuration module.
+ *
+ * This name must be same as the config module's name.
+ */
+ virtual String get_name () const = 0;
+
+ /**
+ * @brief Read a string from the given key.
+ * @param key - the key to be read.
+ * @param ret - the result will be stored into *ret.
+ * @return true if the string is read successfully, otherwise return false.
+ */
+ virtual bool read (const String& key, String *ret) const = 0;
+
+ /**
+ * @brief Read an int value from the given key.
+ * @param key - the key to be read.
+ * @param ret - the result will be stored into *ret.
+ * @return true if the value is read successfully, otherwise return false.
+ */
+ virtual bool read (const String& key, int *ret) const = 0;
+
+ /**
+ * @brief Read a double value from the given key.
+ * @param key - the key to be read.
+ * @param ret - the result will be stored into *ret.
+ * @return true if the value is read successfully, otherwise return false.
+ */
+ virtual bool read (const String& key, double *ret) const = 0;
+
+ /**
+ * @brief Read a bool value from the given key.
+ * @param key - the key to be read.
+ * @param ret - the result will be stored into *ret.
+ * @return true if the value is read successfully, otherwise return false.
+ */
+ virtual bool read (const String& key, bool *ret) const = 0;
+
+ /**
+ * @brief Read a string list from the given key.
+ * @param key - the key to be read.
+ * @param ret - the result will be stored into *ret.
+ * @return true if the string list is read successfully, otherwise return false.
+ */
+ virtual bool read (const String& key, std::vector <String> *ret) const = 0;
+
+ /**
+ * @brief Read an int list from the given key.
+ * @param key - the key to be read.
+ * @param ret - the result will be stored into *ret.
+ * @return true if the int list is read successfully, otherwise return false.
+ */
+ virtual bool read (const String& key, std::vector <int> *ret) const = 0;
+
+ /**
+ * @brief Write a string to the given key.
+ * @param key - the key to be written.
+ * @param value - the string to be written to the key.
+ * @return true if success, otherwise false.
+ */
+ virtual bool write (const String& key, const String& value) = 0;
+
+ /**
+ * @brief Write an int value to the given key.
+ * @param key - the key to be written.
+ * @param value - the int value to be written to the key.
+ * @return true if success, otherwise false.
+ */
+ virtual bool write (const String& key, int value) = 0;
+
+ /**
+ * @brief Write a double value to the given key.
+ * @param key - the key to be written.
+ * @param value - the double value to be written to the key.
+ * @return true if success, otherwise false.
+ */
+ virtual bool write (const String& key, double value) = 0;
+
+ /**
+ * @brief Write a bool value to the given key.
+ * @param key - the key to be written.
+ * @param value - the bool value to be written to the key.
+ * @return true if success, otherwise false.
+ */
+ virtual bool write (const String& key, bool value) = 0;
+
+ /**
+ * @brief Write a string list to the given key.
+ * @param key - the key to be written.
+ * @param value - the string list to be written to the key.
+ * @return true if success, otherwise false.
+ */
+ virtual bool write (const String& key, const std::vector <String>& value) = 0;
+
+ /**
+ * @brief Write an int list to the given key.
+ * @param key - the key to be written.
+ * @param value - the int list to be written to the key.
+ * @return true if success, otherwise false.
+ */
+ virtual bool write (const String& key, const std::vector <int>& value) = 0;
+
+ /**
+ * @brief Permanently writes all changes.
+ * @return true if success.
+ */
+ virtual bool flush() = 0;
+
+ /**
+ * @brief Erase a key and its value
+ * @param key - the key to be erased.
+ * @return true if success.
+ */
+ virtual bool erase (const String& key) = 0;
+
+ /**
+ * @brief Reload the configurations from storage.
+ *
+ * All modified keys after the last flush maybe lost.
+ *
+ * The derived method should call this base method
+ * after reload the configurations successfully,
+ * in order to emit the reload signal.
+ *
+ * The derived method should have some machanism to avoid
+ * reload again if there is no update after
+ * the previous reload.
+ *
+ * @return true if success.
+ */
+ virtual bool reload () = 0;
+
+ /**
+ * @}
+ */
+
+ /**
+ * @name Other helper methods.
+ * @{
+ */
+
+ /**
+ * @brief Read a string from the given key with a default fallback value.
+ *
+ * If failed to read from the given key, then return the given default value.
+ *
+ * @param key - the key to be read.
+ * @param defVal - the default value to be return if failed to read.
+ * @return The result string.
+ */
+ String read (const String& key, const String& defVal = String ()) const;
+
+ /**
+ * @brief Read an int value from the given key with a default fallback value.
+ *
+ * If failed to read from the given key, then return the given default value.
+ *
+ * @param key - the key to be read.
+ * @param defVal - the default value to be return if failed to read.
+ * @return The result int value.
+ */
+ int read (const String& key, int defVal) const;
+
+ /**
+ * @brief Read a double value from the given key with a default fallback value.
+ *
+ * If failed to read from the given key, then return the given default value.
+ *
+ * @param key - the key to be read.
+ * @param defVal - the default value to be return if failed to read.
+ * @return The result double value.
+ */
+ double read (const String& key, double defVal) const;
+
+ /**
+ * @brief Read a bool value from the given key with a default fallback value.
+ *
+ * If failed to read from the given key, then return the given default value.
+ *
+ * @param key - the key to be read.
+ * @param defVal - the default value to be return if failed to read.
+ * @return The result bool value.
+ */
+ bool read (const String& key, bool defVal) const;
+
+ /**
+ * @brief Read a string list from the given key with a default fallback value.
+ *
+ * If failed to read from the given key, then return the given default value.
+ *
+ * @param key - the key to be read.
+ * @param defVal - the default value to be return if failed to read.
+ * @return The result string list.
+ */
+ std::vector <String> read (const String& key, const std::vector <String>& defVal) const;
+
+ /**
+ * @brief Read an int list from the given key with a default fallback value.
+ *
+ * If failed to read from the given key, then return the given default value.
+ *
+ * @param key - the key to be read.
+ * @param defVal - the default value to be return if failed to read.
+ * @return The result int list.
+ */
+ std::vector <int> read (const String& key, const std::vector <int>& defVal) const;
+
+ /**
+ * @brief connect the given slot to the reload signal.
+ * @param slot - the given slot to be connected.
+ * @return the Connection object, can be used to disconnect this slot.
+ */
+ Connection signal_connect_reload (ConfigSlotVoid *slot);
+
+ /** @} */
+
+public:
+ /**
+ * @brief Set the default global Config object.
+ *
+ * There is only one global Config object in an application.
+ * All other objects should use it by default.
+ *
+ * @param p_config - a smart pointer to the Config object.
+ * @return a smart pointer to the old default Config object.
+ */
+ static ConfigPointer set (const ConfigPointer &p_config);
+
+ /**
+ * @brief Get the default global Config object.
+ *
+ * The default global Config object can be set with function ConfigBase::set.
+ * If there is no default object set, a new object can be created if needed.
+ *
+ * @param create_on_demand - if it's true then a new object will be created,
+ * if there is no one available.
+ * @param default_module - the Config module should be used to create the
+ * default Config object. If omitted, then use the
+ * default module defined in global config file.
+ * @return a smart pointer to the default global Config object.
+ */
+ static ConfigPointer get (bool create_on_demand = true,
+ const String &default_module = String (""));
+};
+
+/**
+ * @brief A dummy implementation of interface class scim::ConfigBase.
+ *
+ * The read methods will just return false and the default value (if available).
+ * The write methods will do nothing.
+ */
+class DummyConfig : public ConfigBase
+{
+
+public:
+ DummyConfig ();
+
+ virtual ~DummyConfig ();
+
+ virtual bool valid () const;
+ virtual String get_name () const;
+
+ virtual bool read (const String& key, String *ret) const;
+ virtual bool read (const String& key, int *ret) const;
+ virtual bool read (const String& key, double *ret) const;
+ virtual bool read (const String& key, bool *ret) const;
+ virtual bool read (const String& key, std::vector <String> *ret) const;
+ virtual bool read (const String& key, std::vector <int> *ret) const;
+
+ virtual bool write (const String& key, const String& value);
+ virtual bool write (const String& key, int value);
+ virtual bool write (const String& key, double value);
+ virtual bool write (const String& key, bool value);
+ virtual bool write (const String& key, const std::vector <String>& value);
+ virtual bool write (const String& key, const std::vector <int>& value);
+
+ virtual bool flush();
+
+ virtual bool erase (const String& key );
+
+ virtual bool reload ();
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_CONFIG_BASE_H
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_config_module.cpp,v 1.15 2005/04/09 15:38:39 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_CONFIG_MODULE
+#define Uses_SCIM_MODULE
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+ConfigModule::ConfigModule ()
+ : m_config_init (0),
+ m_config_create_config (0)
+{
+}
+
+ConfigModule::ConfigModule (const String &name)
+ : m_config_init (0),
+ m_config_create_config (0)
+{
+ load (name);
+}
+
+bool
+ConfigModule::load (const String &name)
+{
+ try {
+ if (!m_module.load (name, "Config"))
+ return false;
+
+ m_config_init = (ConfigModuleInitFunc) m_module.symbol ("scim_config_module_init");
+ m_config_create_config = (ConfigModuleCreateConfigFunc) m_module.symbol ("scim_config_module_create_config");
+
+ if (!m_config_init || !m_config_create_config) {
+ m_module.unload ();
+ m_config_init = 0;
+ m_config_create_config = 0;
+ return false;
+ }
+
+ m_config_init ();
+ } catch (...) {
+ m_module.unload ();
+ m_config_init = 0;
+ m_config_create_config = 0;
+ return false;
+ }
+
+ return true;
+}
+
+bool
+ConfigModule::valid () const
+{
+ return (m_module.valid () && m_config_init && m_config_create_config);
+}
+
+ConfigPointer
+ConfigModule::create_config () const
+{
+ if (valid ())
+ return m_config_create_config ();
+
+ return ConfigPointer ();
+}
+
+int scim_get_config_module_list (std::vector <String>& mod_list)
+{
+ return scim_get_module_list (mod_list, "Config");
+}
+
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_config_module.h
+ * @brief Define scim::ConfigModule class for manipulating the config modules.
+ *
+ * Class scim::ConfigModule is a wrapper of class scim::Module,
+ * which is for manipulating the configuration modules.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_config_module.h,v 1.15 2005/04/09 15:38:39 suzhe Exp $
+ */
+
+#ifndef __SCIM_CONFIG_MODULE_H
+#define __SCIM_CONFIG_MODULE_H
+
+namespace scim {
+/**
+ * @addtogroup Config
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+/**
+ * @brief The prototype of initialization function in config modules.
+ *
+ * There must be a function called "scim_config_module_init"
+ * which complies with this prototype.
+ * This function name can have a prefix like simple_LTX_,
+ * in which "simple" is the module's name.
+ */
+typedef void (*ConfigModuleInitFunc) (void);
+
+/**
+ * @brief The prototype of configure object creation function in config modules.
+ *
+ * There must be a function called "scim_config_module_create_config"
+ * which complies with this prototype.
+ * This function name can have a prefix like simple_LTX_,
+ * in which "simple" is the module's name.
+ */
+typedef ConfigPointer (*ConfigModuleCreateConfigFunc) ();
+
+/**
+ * @brief The class to manipulate the config modules.
+ *
+ * This is a wrapper of scim::Module class, which is specially
+ * for manipulating the config modules.
+ */
+class ConfigModule
+{
+ Module m_module;
+
+ ConfigModuleInitFunc m_config_init;
+ ConfigModuleCreateConfigFunc m_config_create_config;
+
+ ConfigModule (const ConfigModule &);
+ ConfigModule & operator= (const ConfigModule &);
+
+public:
+ /**
+ * @brief Default constructor.
+ */
+ ConfigModule ();
+
+ /**
+ * @brief Constructor.
+ * @param name - the module's name, eg. "simple".
+ */
+ ConfigModule (const String &name);
+
+ /**
+ * @brief Load a module by its name.
+ *
+ * Load a module into memory.
+ * If another module has been loaded into this object,
+ * then the old module will be unloaded first.
+ * If the old module is resident, false will be returned,
+ * and the old module will be untouched.
+ *
+ * @param name - the module's name, eg. "simple".
+ * @return true if success.
+ */
+ bool load (const String &name);
+
+ /**
+ * @brief Check if a module is loaded and initialized successfully.
+ * @return true if a module is already loaded and initialized successfully.
+ */
+ bool valid () const;
+
+ /**
+ * @brief Create a configuration object from this module.
+ *
+ * The type of newly created configuration object
+ * must be a derived class of scim::ConfigBase.
+ *
+ * @return a smart pointer points to the configuration object.
+ */
+ ConfigPointer create_config () const;
+};
+
+/**
+ * @brief Get a name list of currently available configuration modules.
+ * @param mod_list - the result list will be stored here.
+ * @return the number of the modules, equal to mod_list.size ().
+ */
+int scim_get_config_module_list (std::vector <String>& mod_list);
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_CONFIG_MODULE_H
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/**
+ * @file scim_config_path.h
+ * @brief This file defines some common used configuration keys.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_config_path.h,v 1.35 2005/06/26 16:35:33 suzhe Exp $
+ */
+
+#ifndef __SCIM_CONFIG_PATH_H
+#define __SCIM_CONFIG_PATH_H
+
+namespace scim {
+/**
+ * @addtogroup Config
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+#define SCIM_CONFIG_UPDATE_TIMESTAMP "/UpdateTimeStamp"
+#define SCIM_CONFIG_DEFAULT_IMENGINE_FACTORY "/DefaultIMEngineFactory"
+#define SCIM_CONFIG_DEFAULT_HELPER_ISE "/DefaultHelperISE"
+
+#define SCIM_CONFIG_FRONTEND_ON_THE_SPOT "/FrontEnd/OnTheSpot"
+#define SCIM_CONFIG_FRONTEND_SHARED_INPUT_METHOD "/FrontEnd/SharedInputMethod"
+#define SCIM_CONFIG_FRONTEND_IM_OPENED_BY_DEFAULT "/FrontEnd/IMOpenedByDefault"
+
+#define SCIM_CONFIG_HOTKEYS_FRONTEND "/Hotkeys/FrontEnd"
+#define SCIM_CONFIG_HOTKEYS_FRONTEND_TRIGGER "/Hotkeys/FrontEnd/Trigger"
+#define SCIM_CONFIG_HOTKEYS_FRONTEND_ON "/Hotkeys/FrontEnd/On"
+#define SCIM_CONFIG_HOTKEYS_FRONTEND_OFF "/Hotkeys/FrontEnd/Off"
+#define SCIM_CONFIG_HOTKEYS_FRONTEND_NEXT_FACTORY "/Hotkeys/FrontEnd/NextFactory"
+#define SCIM_CONFIG_HOTKEYS_FRONTEND_PREVIOUS_FACTORY "/Hotkeys/FrontEnd/PreviousFactory"
+#define SCIM_CONFIG_HOTKEYS_FRONTEND_SHOW_FACTORY_MENU "/Hotkeys/FrontEnd/ShowFactoryMenu"
+#define SCIM_CONFIG_HOTKEYS_FRONTEND_VALID_KEY_MASK "/Hotkeys/FrontEnd/ValidKeyMask"
+
+#define SCIM_CONFIG_HOTKEYS_IMENGINE "/Hotkeys/IMEngine"
+#define SCIM_CONFIG_HOTKEYS_IMENGINE_LIST "/Hotkeys/IMEngine/List"
+#define SCIM_CONFIG_HOTKEYS_HELPER "/Hotkeys/Helper"
+#define SCIM_CONFIG_HOTKEYS_HELPER_LIST "/Hotkeys/Helper/List"
+#define SCIM_CONFIG_HOTKEYS_NEWISE "/Hotkeys/NewISE"
+#define SCIM_CONFIG_HOTKEYS_NEWISE_LIST "/Hotkeys/NewISE/List"
+
+#define SCIM_CONFIG_FILTER_FILTERED_IMENGINES "/Filter/FilteredIMEngines"
+#define SCIM_CONFIG_FILTER_FILTERED_IMENGINES_LIST "/Filter/FilteredIMEngines/List"
+
+#define SCIM_CONFIG_SYSTEM_INPUT_LANGUAGE "/Language/SystemInput"
+
+#define SCIM_CONFIG_ENABLED_ISE_UUID_LIST "/EnabledISEUUIDList"
+#define SCIM_GLOBAL_CONFIG_ISF_DEFAULT_LANGUAGES "/ISFDefaultLanguages"
+#define SCIM_GLOBAL_CONFIG_DISABLED_LANGS "/DisabledLangs"
+#define SCIM_GLOBAL_CONFIG_DISABLED_IMENGINE_FACTORIES "/DisabledIMEngineFactories"
+#define SCIM_GLOBAL_CONFIG_SUPPORTED_UNICODE_LOCALES "/SupportedUnicodeLocales"
+#define SCIM_GLOBAL_CONFIG_DEFAULT_KEYBOARD_LAYOUT "/DefaultKeyboardLayout"
+#define SCIM_GLOBAL_CONFIG_DEFAULT_PANEL_PROGRAM "/DefaultPanelProgram"
+#define SCIM_GLOBAL_CONFIG_DEFAULT_CONFIG_MODULE "/DefaultConfigModule"
+#define SCIM_GLOBAL_CONFIG_DEFAULT_SOCKET_FRONTEND_ADDRESS "/DefaultSocketFrontEndAddress"
+#define SCIM_GLOBAL_CONFIG_DEFAULT_SOCKET_IMENGINE_ADDRESS "/DefaultSocketIMEngineAddress"
+#define SCIM_GLOBAL_CONFIG_DEFAULT_SOCKET_CONFIG_ADDRESS "/DefaultSocketConfigAddress"
+#define SCIM_GLOBAL_CONFIG_DEFAULT_PANEL_SOCKET_ADDRESS "/DefaultPanelSocketAddress"
+#define SCIM_GLOBAL_CONFIG_DEFAULT_HELPER_MANAGER_SOCKET_ADDRESS "/DefaultHelperManagerSocketAddress"
+#define SCIM_GLOBAL_CONFIG_DEFAULT_SOCKET_TIMEOUT "/DefaultSocketTimeout"
+#define SCIM_GLOBAL_CONFIG_GTKSOCKET_WINDOW_ID "/IMWindowSocketID"
+#define SCIM_GLOBAL_CONFIG_GTKSOCKET_WINDOW_STYLE "/IMWindowStyle"
+
+#define SCIM_GLOBAL_CONFIG_INITIAL_ISE_TYPE "/InitialIseType"
+#define SCIM_GLOBAL_CONFIG_INITIAL_ISE_UUID "/InitialIseUuid"
+#define SCIM_GLOBAL_CONFIG_INITIAL_ISE_NAME "/InitialIseName"
+#define SCIM_GLOBAL_CONFIG_DEFAULT_ISE_TYPE "/DefaultIseType"
+#define SCIM_GLOBAL_CONFIG_DEFAULT_ISE_UUID "/DefaultIseUuid"
+#define SCIM_GLOBAL_CONFIG_DEFAULT_ISE_NAME "/DefaultIseName"
+
+/*keyboard engine options*/
+#define SCIM_PREDICTION_ENGINE_CONFIG_3x4_WORD_COMPLETION_POINT "/3x4/word_completion_point"
+#define SCIM_PREDICTION_ENGINE_CONFIG_3x4_SPELL_CORRECTION "/3x4/spell_correction"
+#define SCIM_PREDICTION_ENGINE_CONFIG_3x4_NEXT_WORD_PREDIECTION "/3x4/next_word_prediction"
+#define SCIM_PREDICTION_ENGINE_CONFIG_3x4_AUTO_SUBSTITUTION "/3x4/auto_substitution"
+#define SCIM_PREDICTION_ENGINE_CONFIG_3x4_MULTITAP_WORD_COMPLETION "/3x4/multitap_word_completion"
+
+#define SCIM_PREDICTION_ENGINE_CONFIG_QWERTY_WORD_COMPLETION_POINT "/QWERTY/word_completion_point"
+#define SCIM_PREDICTION_ENGINE_CONFIG_QWERTY_SPELL_CORRECTION "/QWERTY/spell_correction"
+#define SCIM_PREDICTION_ENGINE_CONFIG_QWERTY_NEXT_WORD_PREDIECTION "/QWERTY/next_word_prediction"
+#define SCIM_PREDICTION_ENGINE_CONFIG_QWERTY_AUTO_SUBSTITUTION "/QWERTY/auto_substitution"
+#define SCIM_PREDICTION_ENGINE_CONFIG_QWERTY_REGIONAL_INPUT "/QWERTY/regional_input"
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_CONFIG_PATH_H
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/*
+ * Most code of this file are came from Inti project.
+ */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ * Copyright (c) 2002 The Inti Development Team.
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_connection.cpp,v 1.7 2005/01/10 08:30:53 suzhe Exp $
+ */
+
+#define Uses_SCIM_OBJECT
+#define Uses_SCIM_CONNECTION
+#define Uses_SCIM_SLOT
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+/* Node
+ */
+
+Node::Node(Slot *slot)
+ : slot_(slot)
+{
+}
+
+Node::~Node()
+{
+}
+
+void
+Node::disconnect()
+{
+ if (!slot_.null ()) slot_.reset ();
+}
+
+/* Connection
+ */
+
+Connection::Connection()
+ : node_(0)
+{
+}
+
+Connection::Connection(Node *node)
+ : node_(node)
+{
+}
+
+Connection::Connection(const Connection& src)
+ : node_(src.node_)
+{
+}
+
+Connection::~Connection()
+{
+}
+
+Connection&
+Connection::operator=(const Connection& src)
+{
+ if (src.node_ == node_)
+ return *this;
+
+ node_ = src.node_;
+ src.node_.reset ();
+ return *this;
+}
+
+void
+Connection::block()
+{
+ if (!node_.null ())
+ node_->block();
+}
+
+void
+Connection::unblock()
+{
+ if (!node_.null ())
+ node_->unblock();
+}
+
+void
+Connection::disconnect()
+{
+ if (!node_.null ()) {
+ node_->disconnect();
+ node_.reset ();
+ }
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_connection.h
+ * @brief C++ signal-slot connection interface.
+ *
+ * Most code of this file are came from Inti project.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ * Copyright (c) 2002 The Inti Development Team.
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_connection.h,v 1.10 2005/01/10 08:30:53 suzhe Exp $
+ */
+
+#ifndef __SCIM_CONNECTION_H
+#define __SCIM_CONNECTION_H
+
+namespace scim {
+
+/**
+ * @addtogroup SignalSlot
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+class Slot;
+
+/**
+ * @class Node
+ * @brief Base class for classes managing slots.
+ *
+ * A node connects a slot to its Connection class, the class returned
+ * from a signal's connect() method.
+ */
+
+class Node : public ReferencedObject
+{
+ Pointer <Slot> slot_;
+
+protected:
+ Node(Slot *slot);
+ //!< Constructor.
+
+ virtual ~Node();
+ //!< Destructor.
+
+public:
+ Slot* slot() { return slot_.get (); }
+ //!< Returns a pointer to the slot held by this node.
+
+ virtual void block() = 0;
+ //!< Block signal emission to the slot until unblock is called.
+
+ virtual void unblock() = 0;
+ //!< Unblock the slot so signal emmissions can be received.
+
+ virtual void disconnect() = 0;
+ //!< Disconnect the slot. The slot will no longer recieve signal emissions.
+};
+
+/**
+ * @class Connection
+ * @brief A signal connection class.
+ *
+ * A Connection class is returned by value from a signal's connect()
+ * method. Using this class you can block, unblock and disconnect
+ * a signal connection.
+ */
+
+class Connection
+{
+ mutable Pointer<Node> node_;
+
+public:
+//! @name Constructors
+//! @{
+
+ Connection();
+ //!< Default constructor.
+
+ Connection(Node *node);
+ //!< Construct a connection object for node.
+ //!< @param node - a pointer to the Node class for this connection.
+
+ Connection(const Connection& src);
+ //!< Copy constructor.
+
+ ~Connection();
+ //!< Destructor.
+
+ Connection& operator=(const Connection& src);
+ //!< Assignment operator.
+
+//! @}
+//! @name Methods
+//! @{
+
+ void block();
+ //!< Block signal transmission to a slot.
+ //!< The slot will not be called during any signal emissions unless it is unblocked again.
+
+ void unblock();
+ //!< Unblock a previously blocked slot.
+ //!< A blocked slot is skipped during signal emissions and will not be invoked, unblocking
+ //!< it (for exactly the number of times it has been blocked before) reverts its "blocked"
+ //!< state, so the slot will be recognized by the signal system and is called upon future
+ //!< or currently ongoing signal emissions.
+
+ void disconnect();
+ //!< Disconnect a slot.
+ //!< The slot will not be called during any future or currently ongoing
+ //!< emissions of the signal it has been connected to.
+
+//! @}
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_CONNECTION_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_debug.cpp,v 1.10 2005/08/05 01:54:24 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_DEBUG
+#include "scim_private.h"
+#include "scim.h"
+#include <cstdio>
+
+namespace scim {
+
+struct _DebugMaskName
+{
+ uint32 mask;
+ const char *name;
+};
+
+static _DebugMaskName _debug_mask_names [] =
+{
+ {SCIM_DEBUG_AllMask, "all"},
+ {SCIM_DEBUG_MainMask, "main"},
+ {SCIM_DEBUG_ConfigMask, "config"},
+ {SCIM_DEBUG_IMEngineMask, "imengine"},
+ {SCIM_DEBUG_BackEndMask, "backend"},
+ {SCIM_DEBUG_FrontEndMask, "frontend"},
+ {SCIM_DEBUG_ModuleMask, "module"},
+ {SCIM_DEBUG_UtilityMask, "utility"},
+ {SCIM_DEBUG_IConvMask, "iconv"},
+ {SCIM_DEBUG_LookupTableMask,"lookuptable"},
+ {SCIM_DEBUG_SocketMask, "socket"},
+ {0, 0}
+};
+
+uint32 DebugOutput::current_verbose = 0;
+uint32 DebugOutput::current_mask = 0;
+uint32 DebugOutput::verbose_level = 0;
+uint32 DebugOutput::output_mask = ~0;
+std::ostream * DebugOutput::output_stream = &std::cerr;
+
+static std::ofstream __debug_output_file;
+
+#if ENABLE_DEBUG
+DebugOutput::DebugOutput (uint32 mask, uint32 verbose)
+{
+ current_mask = mask;
+ current_verbose = verbose;
+}
+#else
+DebugOutput::DebugOutput (uint32 mask, uint32 verbose)
+{
+}
+#endif
+
+void
+DebugOutput::set_verbose_level (uint32 verbose)
+{
+ verbose_level =
+ (verbose > SCIM_DEBUG_MAX_VERBOSE) ? SCIM_DEBUG_MAX_VERBOSE : verbose;
+}
+
+void
+DebugOutput::enable_debug (uint32 debug)
+{
+ output_mask |= debug;
+}
+
+void
+DebugOutput::enable_debug_by_name (const String &debug)
+{
+ _DebugMaskName *p = _debug_mask_names;
+ while (p->mask && p->name) {
+ if (String (p->name) == debug) {
+ output_mask |= p->mask;
+ return;
+ }
+ ++ p;
+ }
+}
+
+void
+DebugOutput::disable_debug (uint32 debug)
+{
+ output_mask &= (~debug);
+}
+
+void
+DebugOutput::disable_debug_by_name (const String &debug)
+{
+ _DebugMaskName *p = _debug_mask_names;
+ while (p->mask && p->name) {
+ if (String (p->name) == debug) {
+ output_mask &= (~(p->mask));
+ return;
+ }
+ ++ p;
+ }
+}
+
+void
+DebugOutput::set_output (const String &file)
+{
+ DebugOutput::output_stream = &std::cerr;
+
+ if (file.length ()) {
+ if (file == String ("stderr") || file == String ("cerr"))
+ DebugOutput::output_stream = &std::cerr;
+ else if (file == String ("stdout") || file == String ("cout"))
+ DebugOutput::output_stream = &std::cout;
+ else if (file == String ("none") || file == String ("off"))
+ DebugOutput::output_stream = 0;
+ else {
+ __debug_output_file.open (file.c_str ());
+ if (__debug_output_file.is_open ())
+ DebugOutput::output_stream = &__debug_output_file;
+ }
+ }
+}
+
+String
+DebugOutput::serial_number ()
+{
+ static unsigned int serial = 0;
+ char buf [40];
+ snprintf (buf, 40, "<%08u>:", serial ++);
+ return String (buf);
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/**
+ * @file scim_debug.h
+ * @brief Defines class scim::DebugOutput and related MACROS.
+ *
+ * All of the debug information should be output via scim::DebugOutput class.
+ * This class provides message filter and redirection ability.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_debug.h,v 1.18 2005/08/05 01:54:24 suzhe Exp $
+ */
+
+#ifndef __SCIM_DEBUG_H
+#define __SCIM_DEBUG_H
+
+#define SCIM_DEBUG_MAX_VERBOSE 7
+
+namespace scim {
+
+#define ENABLE_DEBUG 1
+
+/**
+ * @name The mask for debug messages filtering.
+ * @{
+ */
+#define SCIM_DEBUG_AllMask (~0) /**< Show all messages. */
+#define SCIM_DEBUG_MainMask 1 /**< Show messages of main application. */
+#define SCIM_DEBUG_ConfigMask 2 /**< Show messages of Config objects */
+#define SCIM_DEBUG_IMEngineMask 4 /**< Show messages of IMEngine objects */
+#define SCIM_DEBUG_BackEndMask 8 /**< Show messages of BackEnd objects */
+#define SCIM_DEBUG_FrontEndMask 16 /**< Show messages of FrontEnd objects */
+#define SCIM_DEBUG_ModuleMask 32 /**< Show messages of Module objects */
+#define SCIM_DEBUG_UtilityMask 64 /**< Show messages of utility functions */
+#define SCIM_DEBUG_IConvMask 128 /**< Show messages of IConvert objects */
+#define SCIM_DEBUG_LookupTableMask 256 /**< Show messages of LookupTable objects */
+#define SCIM_DEBUG_SocketMask 512 /**< Show messages of Socket objects */
+/**
+ * @}
+ */
+
+/**
+ * @name The macros to simplify the debug message print method.
+ *
+ * You can output debug messages by this way:
+ * SCIM_DEBUG_IMENGINE(1) << "Hello World!\n";
+ *
+ * @{
+ */
+#define SCIM_DEBUG(mask,level) (scim::DebugOutput(mask,level) << scim::DebugOutput::serial_number () << __FILE__ << ":" << __LINE__ << " > ")
+#define SCIM_DEBUG_MAIN(level) SCIM_DEBUG(SCIM_DEBUG_MainMask,level)
+#define SCIM_DEBUG_CONFIG(level) SCIM_DEBUG(SCIM_DEBUG_ConfigMask,level)
+#define SCIM_DEBUG_IMENGINE(level) SCIM_DEBUG(SCIM_DEBUG_IMEngineMask,level)
+#define SCIM_DEBUG_BACKEND(level) SCIM_DEBUG(SCIM_DEBUG_BackEndMask,level)
+#define SCIM_DEBUG_FRONTEND(level) SCIM_DEBUG(SCIM_DEBUG_FrontEndMask,level)
+#define SCIM_DEBUG_MODULE(level) SCIM_DEBUG(SCIM_DEBUG_ModuleMask,level)
+#define SCIM_DEBUG_UTILITY(level) SCIM_DEBUG(SCIM_DEBUG_UtilityMask,level)
+#define SCIM_DEBUG_ICONV(level) SCIM_DEBUG(SCIM_DEBUG_IConvMask,level)
+#define SCIM_DEBUG_LOOKUPTABLE(level) SCIM_DEBUG(SCIM_DEBUG_LookupTableMask,level)
+#define SCIM_DEBUG_SOCKET(level) SCIM_DEBUG(SCIM_DEBUG_SocketMask,level)
+/**
+ * @}
+ */
+
+/**
+ * @brief The class to filter and redirect the debug messages.
+ */
+class DebugOutput
+{
+private:
+ static uint32 current_verbose;
+ static uint32 current_mask;
+
+ static uint32 verbose_level;
+ static uint32 output_mask;
+ static std::ostream *output_stream;
+
+public:
+ /**
+ * @brief Constructor.
+ * @param mask - the debug filter mask.
+ * @param verbose - the verbose level of the debug message.
+ */
+ DebugOutput (uint32 mask = SCIM_DEBUG_AllMask, uint32 verbose = 1);
+
+ /**
+ * @brief A template stream output operator.
+ *
+ * All kinds of data and variables can be output via DebugOutput by
+ * this operator.
+ */
+#if ENABLE_DEBUG
+ template <typename T>
+ const DebugOutput& operator << (const T& t) const {
+ if (output_stream && (current_mask & output_mask) && (current_verbose <= verbose_level))
+ (*output_stream) << t;
+ return *this;
+ }
+#else
+ template <typename T>
+ const DebugOutput& operator << (const T&) const {
+ return *this;
+ }
+#endif
+
+public:
+ /**
+ * @brief The global method to enable the debug output.
+ * @param debug - the mask to indicate which kind of
+ * debug should be enabled.
+ */
+ static void enable_debug (uint32 debug);
+
+ /**
+ * @brief The global method to enable the debug output by their names.
+ * @param debug - the name of the debug type to be enabled. The valid
+ * names are: all, main, config, imengine, backend, frontend,
+ * module, utility, iconv, lookuptable, socket.
+ */
+ static void enable_debug_by_name (const String &debug);
+
+ /**
+ * @brief Disable the debug type indicated by the given mask.
+ * @param debug - the mask of the debug type to be disabled.
+ */
+ static void disable_debug (uint32 debug);
+
+ /**
+ * @brief Disable the debug type indicated by the given name.
+ * @param debug - the name of the debug type to be disabled.
+ */
+ static void disable_debug_by_name (const String &debug);
+
+ /**
+ * @brief Set the debug verbose level.
+ * @param verbose - the debug verbose level, 0 means no debug output.
+ */
+ static void set_verbose_level (uint32 verbose);
+
+ /**
+ * @brief Set the debug output file.
+ *
+ * @param file - the file to store the debug output.
+ * If equal to "stderr" or "cerr" then the debug
+ * output will be set to std:cerr.
+ * If equal to "stdout" or "cout" then the debug
+ * output will be set to std::cout.
+ */
+ static void set_output (const String &file);
+
+ static String serial_number ();
+};
+
+} // namespace scim
+
+#endif //__SCIM_DEBUG_H
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_event.cpp,v 1.29 2005/07/13 08:54:55 suzhe Exp $
+ */
+
+#define Uses_SCIM_EVENT
+#define Uses_SCIM_GLOBAL_CONFIG
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_C_STDIO
+#define Uses_C_STRING
+#include "scim_private.h"
+#include "scim.h"
+#include "scim_stl_map.h"
+
+namespace scim {
+
+struct __Uint16Pair
+{
+ uint16 first;
+ uint16 second;
+};
+
+struct __KeyCodeMap
+{
+ size_t size;
+ __Uint16Pair *map;
+};
+
+struct __KeyName
+{
+ uint16 value;
+ const char *name;
+};
+
+class __Uint16PairLessByFirst
+{
+public:
+ bool operator ()(const __Uint16Pair &lhs, const __Uint16Pair &rhs) const {
+ return lhs.first < rhs.first;
+ }
+
+ bool operator ()(const __Uint16Pair &lhs, const uint16 &rhs) const {
+ return lhs.first < rhs;
+ }
+
+ bool operator ()(const uint16 &lhs, const __Uint16Pair &rhs) const {
+ return lhs < rhs.first;
+ }
+};
+
+class __KeyNameLessByCode
+{
+public:
+ bool operator ()(const __KeyName &lhs, const __KeyName &rhs) const {
+ return lhs.value < rhs.value;
+ }
+
+ bool operator ()(const __KeyName &lhs, const uint16 &rhs) const {
+ return lhs.value < rhs;
+ }
+
+ bool operator ()(const uint16 &lhs, const __KeyName &rhs) const {
+ return lhs < rhs.value;
+ }
+};
+
+class __KeyNameLessByName
+{
+public:
+ bool operator ()(const __KeyName &lhs, const __KeyName &rhs) const {
+ return strcmp (lhs.name, rhs.name) < 0;
+ }
+
+ bool operator ()(const __KeyName &lhs, const char *rhs) const {
+ return strcmp (lhs.name, rhs) < 0;
+ }
+
+ bool operator ()(const char *lhs, const __KeyName &rhs) const {
+ return strcmp (lhs, rhs.name) < 0;
+ }
+};
+
+// Keyboard Layout data
+#include "scim_keyboard_layout_data.h"
+
+// KeyEvent data
+#include "scim_keyevent_data.h"
+
+char
+KeyEvent::get_ascii_code () const
+{
+ if (code >= SCIM_KEY_space && code <= SCIM_KEY_asciitilde)
+ return (char) code;
+
+ if (code >= SCIM_KEY_KP_0 && code <= SCIM_KEY_KP_9)
+ return (char) (code - SCIM_KEY_KP_0 + SCIM_KEY_0);
+
+ if (code == SCIM_KEY_Return)
+ return 0x0d;
+ if (code == SCIM_KEY_Linefeed)
+ return 0x0a;
+ if (code == SCIM_KEY_Tab)
+ return 0x09;
+ if (code == SCIM_KEY_BackSpace)
+ return 0x08;
+ if (code == SCIM_KEY_Escape)
+ return 0x1b;
+
+ return 0;
+}
+
+ucs4_t
+KeyEvent::get_unicode_code () const
+{
+ /* First check for Latin-1 characters (1:1 mapping) */
+ if ((code >= 0x0020 && code <= 0x007e) ||
+ (code >= 0x00a0 && code <= 0x00ff))
+ return code;
+
+ /* Also check for directly encoded 24-bit UCS characters:
+ */
+ if ((code & 0xff000000) == 0x01000000)
+ return code & 0x00ffffff;
+
+ /* Translation of KP_Decimal depends on locale.
+ if (code == SCIM_KP_Decimal)
+ return get_decimal_char ();
+ */
+
+ /* Invalid keyevent code. */
+ if (code > 0xFFFF)
+ return 0;
+
+ /* binary search in table */
+ __Uint16Pair * it = std::lower_bound (__scim_key_to_unicode_tab,
+ __scim_key_to_unicode_tab + SCIM_NUM_KEY_UNICODES,
+ (uint16) code,
+ __Uint16PairLessByFirst ());
+
+ if (it != __scim_key_to_unicode_tab + SCIM_NUM_KEY_UNICODES && it->first == (uint16) code)
+ return it->second;
+
+ /* No matching Unicode value found */
+ return 0;
+}
+
+String
+KeyEvent::get_key_string () const
+{
+ size_t i;
+ String maskstr;
+ String codestr;
+ uint16 mask_skip = 0;
+
+ for (i=0; i < SCIM_NUM_KEY_MASKS; ++i) {
+ if ((__scim_key_mask_names [i].value & mask) && !(__scim_key_mask_names [i].value & mask_skip)) {
+ if (maskstr.length ())
+ maskstr += (String ("+") + String (__scim_key_mask_names [i].name));
+ else
+ maskstr += String (__scim_key_mask_names [i].name);
+ }
+ mask_skip |= __scim_key_mask_names [i].value;
+ }
+
+ if (code == 0xFFFFFF) {
+ codestr = String ("VoidSymbol");
+ } else if (code <= 0xFFFF){
+ __KeyName *it = std::lower_bound (__scim_keys_by_code,
+ __scim_keys_by_code + SCIM_NUM_KEY_NAMES,
+ (uint16) code,
+ __KeyNameLessByCode ());
+
+ if (it != __scim_keys_by_code + SCIM_NUM_KEY_NAMES && it->value == code)
+ codestr = String (it->name);
+ }
+
+ if (!codestr.length () && code) {
+ char buf [20];
+ snprintf (buf, 20, ((code <= 0xFFFF) ? "0x%04x" : "0x%06x"), code);
+ codestr = String (buf);
+ }
+
+ if (maskstr.length () && codestr.length ())
+ return maskstr + String ("+") + codestr;
+ if (maskstr.length())
+ return maskstr;
+ if (codestr.length ())
+ return codestr;
+
+ return String ();
+}
+
+static uint16
+inline __remap_keycode (uint16 from, const __KeyCodeMap &map)
+{
+ if (map.size == 0) return from;
+
+ __Uint16Pair *it = std::lower_bound (map.map, map.map + map.size, from, __Uint16PairLessByFirst ());
+
+ if (it != map.map + map.size && it->first == from)
+ return it->second;
+
+ return from;
+}
+
+KeyEvent
+KeyEvent::map_to_layout (KeyboardLayout new_layout) const
+{
+ if (layout == SCIM_KEYBOARD_Unknown || new_layout == SCIM_KEYBOARD_Unknown || layout == new_layout ||
+ layout >= SCIM_KEYBOARD_NUM_LAYOUTS || new_layout >= SCIM_KEYBOARD_NUM_LAYOUTS || new_layout < 0 ||
+ code > 0xFFFF)
+ return *this;
+
+ KeyEvent evt (code, mask, new_layout);
+
+ uint16 new_code = (uint16) code;
+
+ switch (mask & (SCIM_KEY_CapsLockMask | SCIM_KEY_ShiftMask)) {
+ case 0:
+ new_code = __remap_keycode (new_code, __normal_map [layout]);
+ new_code = __remap_keycode (new_code, __normal_invert_map [new_layout]);
+ break;
+ case SCIM_KEY_CapsLockMask:
+ new_code = __remap_keycode (new_code, __caps_map [layout]);
+ new_code = __remap_keycode (new_code, __caps_invert_map [new_layout]);
+ break;
+ case SCIM_KEY_ShiftMask:
+ new_code = __remap_keycode (new_code, __shift_map [layout]);
+ new_code = __remap_keycode (new_code, __shift_invert_map [new_layout]);
+ break;
+ case (SCIM_KEY_ShiftMask | SCIM_KEY_CapsLockMask):
+ new_code = __remap_keycode (new_code, __caps_shift_map [layout]);
+ new_code = __remap_keycode (new_code, __caps_shift_invert_map [new_layout]);
+ break;
+ }
+
+ evt.code = (uint32) new_code;
+
+ return evt;
+}
+
+bool
+scim_key_to_string (String &str, const KeyEvent & key)
+{
+ str = key.get_key_string ();
+ return str.length () != 0;
+}
+
+bool
+scim_string_to_key (KeyEvent &key, const String & str)
+{
+ std::vector <String> list;
+ bool skip;
+ size_t i;
+
+ key.code = 0;
+ key.mask = 0;
+
+ scim_split_string_list (list, str, '+');
+
+ for (std::vector <String>::iterator it=list.begin (); it!=list.end (); ++it) {
+ skip = false;
+ for (i = 0; i < SCIM_NUM_KEY_MASKS; ++i) {
+ if (*it == String (__scim_key_mask_names [i].name)) {
+ key.mask |= __scim_key_mask_names [i].value;
+ skip = true;
+ break;
+ }
+ }
+
+ if (skip) continue;
+
+ __KeyName *p = std::lower_bound (__scim_keys_by_name,
+ __scim_keys_by_name + SCIM_NUM_KEY_NAMES,
+ it->c_str (),
+ __KeyNameLessByName ());
+
+ if (p != __scim_keys_by_name + SCIM_NUM_KEY_NAMES && strcmp (p->name, it->c_str ()) == 0) {
+ key.code = p->value;
+ } else if (it->length () >= 6 && (*it)[0] == '0' && ((*it)[1] == 'x' || (*it)[1] == 'X')){
+ key.code = strtol (it->c_str () + 2, NULL, 16);
+ } else if (strcmp (p->name, "VoidSymbol") == 0) {
+ key.code = SCIM_KEY_VoidSymbol;
+ }
+ }
+
+ return key.code != 0;
+}
+
+bool
+scim_key_list_to_string (String &str, const std::vector<KeyEvent> & keylist)
+{
+ std::vector<String> strlist;
+
+ for (std::vector<KeyEvent>::const_iterator it = keylist.begin (); it != keylist.end (); ++it) {
+ if (scim_key_to_string (str, *it))
+ strlist.push_back (str);
+ }
+
+ str = scim_combine_string_list (strlist, ',');
+
+ return str.length () != 0;
+}
+
+bool
+scim_string_to_key_list (std::vector<KeyEvent> &keylist, const String &str)
+{
+ std::vector <String> strlist;
+ scim_split_string_list (strlist, str, ',');
+
+ keylist.clear ();
+
+ for (std::vector <String>::iterator it = strlist.begin (); it != strlist.end (); ++it) {
+ KeyEvent key;
+ if (scim_string_to_key (key, *it))
+ keylist.push_back (key);
+ }
+ return keylist.size () > 0;
+}
+
+
+String
+scim_keyboard_layout_to_string (KeyboardLayout layout)
+{
+ if (layout >= 0 && layout < SCIM_KEYBOARD_NUM_LAYOUTS)
+ return String (__scim_keyboard_layout_ids_by_code [layout].name);
+
+ return String (__scim_keyboard_layout_ids_by_code [0].name);
+}
+
+KeyboardLayout
+scim_string_to_keyboard_layout (const String &str)
+{
+ if (str == __scim_keyboard_layout_ids_by_code [0].name) return SCIM_KEYBOARD_Unknown;
+ if (str == __scim_keyboard_layout_ids_by_code [1].name || str == String ("US") || str == String ("Default")) return SCIM_KEYBOARD_Default;
+
+ __KeyName *it =
+ std::lower_bound (__scim_keyboard_layout_ids_by_name + 2,
+ __scim_keyboard_layout_ids_by_name + SCIM_KEYBOARD_NUM_LAYOUTS,
+ str.c_str (),
+ __KeyNameLessByName());
+
+ if (it != __scim_keyboard_layout_ids_by_name + SCIM_KEYBOARD_NUM_LAYOUTS && strcmp (it->name, str.c_str ()) == 0)
+ return static_cast <KeyboardLayout> (it->value);
+
+ return SCIM_KEYBOARD_Unknown;
+}
+
+String
+scim_keyboard_layout_get_display_name (KeyboardLayout layout)
+{
+ if (layout >= 0 && layout < SCIM_KEYBOARD_NUM_LAYOUTS)
+ return String (_(__scim_keyboard_layout_names [layout]));
+
+ return String (_(__scim_keyboard_layout_names [0]));
+}
+
+KeyboardLayout
+scim_get_default_keyboard_layout ()
+{
+ String layout_name (__scim_keyboard_layout_ids_by_code [0].name);
+ layout_name = scim_global_config_read (SCIM_GLOBAL_CONFIG_DEFAULT_KEYBOARD_LAYOUT, layout_name);
+
+ return scim_string_to_keyboard_layout (layout_name);
+}
+
+void
+scim_set_default_keyboard_layout (KeyboardLayout layout)
+{
+ String layout_name = scim_keyboard_layout_to_string (layout);
+ scim_global_config_write (SCIM_GLOBAL_CONFIG_DEFAULT_KEYBOARD_LAYOUT, layout_name);
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/**
+ * @file scim_event.h
+ * @brief Defines the scim::KeyEvent class and related enums, functions.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_event.h,v 1.26.2.1 2007/04/11 15:24:10 suzhe Exp $
+ */
+
+#ifndef __SCIM_EVENT_H
+#define __SCIM_EVENT_H
+
+namespace scim {
+
+/**
+ * @addtogroup Accessories
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+/**
+ * @brief Enum values of all valid key masks.
+ *
+ * The key masks indicate which modifier keys
+ * is pressed down during the keyboard hit.
+ *
+ * The special SCIM_KEY_ReleaseMask indicates
+ * the key release event.
+ *
+ */
+enum KeyMask
+{
+ SCIM_KEY_NullMask = 0, /**< Key press event without modifier key. */
+ SCIM_KEY_ShiftMask = (1<<0), /**< The Shift key is pressed down */
+ SCIM_KEY_CapsLockMask = (1<<1), /**< The CapsLock key is pressed down */
+ SCIM_KEY_ControlMask = (1<<2), /**< The Control key is pressed down */
+ SCIM_KEY_AltMask = (1<<3), /**< The Alt key is pressed down */
+ SCIM_KEY_MetaMask = (1<<4), /**< The Meta key is pressed down */
+ SCIM_KEY_SuperMask = (1<<5), /**< The Super key is pressed down */
+ SCIM_KEY_HyperMask = (1<<6), /**< The Hyper key is pressed down */
+ SCIM_KEY_NumLockMask = (1<<7), /**< The NumLock key is pressed down */
+
+ SCIM_KEY_LockMask = SCIM_KEY_CapsLockMask, /**< For backward API compatibility, do not use it in new code */
+ SCIM_KEY_Mod1Mask = SCIM_KEY_AltMask, /**< For backward API compatibility, do not use it in new code */
+ SCIM_KEY_Mod2Mask = SCIM_KEY_MetaMask, /**< For backward API compatibility, do not use it in new code */
+ SCIM_KEY_Mod3Mask = SCIM_KEY_SuperMask, /**< For backward API compatibility, do not use it in new code */
+ SCIM_KEY_Mod4Mask = SCIM_KEY_HyperMask, /**< For backward API compatibility, do not use it in new code */
+ SCIM_KEY_Mod5Mask = SCIM_KEY_NumLockMask, /**< For backward API compatibility, do not use it in new code */
+ SCIM_KEY_ScrollLockMask = 0, /**< For backward API compatibility, do not use it in new code */
+
+ SCIM_KEY_QuirkKanaRoMask= (1<<14), /**< Special mask to distinguish two backslash keys on jp106 keyboard */
+
+ SCIM_KEY_ReleaseMask = (1<<15), /**< It's a key release event */
+ SCIM_KEY_AllMasks = 0xC0FF /**< All valid Masks */
+};
+
+/**
+ * @brief Enum values of all valid key codes.
+ *
+ * If keycode & 0xff000000 == 0x01000000 then this key code is directly encoded 24-bit UCS character.
+ * The UCS value is keycode & 0x00ffffff.
+ */
+enum KeyCode
+{
+ SCIM_KEY_NullKey = 0,
+ SCIM_KEY_VoidSymbol = 0xFFFFFF,
+
+ /* function keys */
+ SCIM_KEY_BackSpace = 0xFF08, /* back space, back char */
+ SCIM_KEY_Tab = 0xFF09,
+ SCIM_KEY_Linefeed = 0xFF0A, /* Linefeed, LF */
+ SCIM_KEY_Clear = 0xFF0B,
+ SCIM_KEY_Return = 0xFF0D, /* Return, enter */
+ SCIM_KEY_Pause = 0xFF13, /* Pause, hold */
+ SCIM_KEY_Scroll_Lock = 0xFF14,
+ SCIM_KEY_Sys_Req = 0xFF15,
+ SCIM_KEY_Escape = 0xFF1B,
+ SCIM_KEY_Delete = 0xFFFF, /* Delete, rubout */
+
+ /* International & multi-key character composition */
+ SCIM_KEY_Multi_key = 0xFF20, /* Multi-key character compose */
+ SCIM_KEY_Codeinput = 0xFF37,
+ SCIM_KEY_SingleCandidate = 0xFF3C,
+ SCIM_KEY_MultipleCandidate = 0xFF3D,
+ SCIM_KEY_PreviousCandidate = 0xFF3E,
+
+ /* Japanese keyboard support */
+ SCIM_KEY_Kanji = 0xFF21, /* Kanji, Kanji convert */
+ SCIM_KEY_Muhenkan = 0xFF22, /* Cancel Conversion */
+ SCIM_KEY_Henkan_Mode = 0xFF23, /* Start/Stop Conversion */
+ SCIM_KEY_Henkan = 0xFF23, /* Alias for Henkan_Mode */
+ SCIM_KEY_Romaji = 0xFF24, /* to Romaji */
+ SCIM_KEY_Hiragana = 0xFF25, /* to Hiragana */
+ SCIM_KEY_Katakana = 0xFF26, /* to Katakana */
+ SCIM_KEY_Hiragana_Katakana = 0xFF27, /* Hiragana/Katakana toggle */
+ SCIM_KEY_Zenkaku = 0xFF28, /* to Zenkaku */
+ SCIM_KEY_Hankaku = 0xFF29, /* to Hankaku */
+ SCIM_KEY_Zenkaku_Hankaku = 0xFF2A, /* Zenkaku/Hankaku toggle */
+ SCIM_KEY_Touroku = 0xFF2B, /* Add to Dictionary */
+ SCIM_KEY_Massyo = 0xFF2C, /* Delete from Dictionary */
+ SCIM_KEY_Kana_Lock = 0xFF2D, /* Kana Lock */
+ SCIM_KEY_Kana_Shift = 0xFF2E, /* Kana Shift */
+ SCIM_KEY_Eisu_Shift = 0xFF2F, /* Alphanumeric Shift */
+ SCIM_KEY_Eisu_toggle = 0xFF30, /* Alphanumeric toggle */
+ SCIM_KEY_Kanji_Bangou = 0xFF37, /* Codeinput */
+ SCIM_KEY_Zen_Koho = 0xFF3D, /* Multiple/All Candidate(s) */
+ SCIM_KEY_Mae_Koho = 0xFF3E, /* Previous Candidate */
+
+ /* Cursor control & motion */
+ SCIM_KEY_Home = 0xFF50,
+ SCIM_KEY_Left = 0xFF51, /* Move left, left arrow */
+ SCIM_KEY_Up = 0xFF52, /* Move up, up arrow */
+ SCIM_KEY_Right = 0xFF53, /* Move right, right arrow */
+ SCIM_KEY_Down = 0xFF54, /* Move down, down arrow */
+ SCIM_KEY_Prior = 0xFF55, /* Prior, previous */
+ SCIM_KEY_Page_Up = 0xFF55,
+ SCIM_KEY_Next = 0xFF56, /* Next */
+ SCIM_KEY_Page_Down = 0xFF56,
+ SCIM_KEY_End = 0xFF57, /* EOL */
+ SCIM_KEY_Begin = 0xFF58, /* BOL */
+
+ /* Misc Functions */
+ SCIM_KEY_Select = 0xFF60, /* Select, mark */
+ SCIM_KEY_Print = 0xFF61,
+ SCIM_KEY_Execute = 0xFF62, /* Execute, run, do */
+ SCIM_KEY_Insert = 0xFF63, /* Insert, insert here */
+ SCIM_KEY_Undo = 0xFF65, /* Undo, oops */
+ SCIM_KEY_Redo = 0xFF66, /* redo, again */
+ SCIM_KEY_Menu = 0xFF67,
+ SCIM_KEY_Find = 0xFF68, /* Find, search */
+ SCIM_KEY_Cancel = 0xFF69, /* Cancel, stop, abort, exit */
+ SCIM_KEY_Help = 0xFF6A, /* Help */
+ SCIM_KEY_Break = 0xFF6B,
+ SCIM_KEY_Mode_switch = 0xFF7E, /* Character set switch */
+ SCIM_KEY_Num_Lock = 0xFF7F,
+
+ /* keypad */
+ SCIM_KEY_KP_Space = 0xFF80, /* space */
+ SCIM_KEY_KP_Tab = 0xFF89,
+ SCIM_KEY_KP_Enter = 0xFF8D, /* enter */
+ SCIM_KEY_KP_F1 = 0xFF91, /* PF1, KP_A, ... */
+ SCIM_KEY_KP_F2 = 0xFF92,
+ SCIM_KEY_KP_F3 = 0xFF93,
+ SCIM_KEY_KP_F4 = 0xFF94,
+ SCIM_KEY_KP_Home = 0xFF95,
+ SCIM_KEY_KP_Left = 0xFF96,
+ SCIM_KEY_KP_Up = 0xFF97,
+ SCIM_KEY_KP_Right = 0xFF98,
+ SCIM_KEY_KP_Down = 0xFF99,
+ SCIM_KEY_KP_Prior = 0xFF9A,
+ SCIM_KEY_KP_Page_Up = 0xFF9A,
+ SCIM_KEY_KP_Next = 0xFF9B,
+ SCIM_KEY_KP_Page_Down = 0xFF9B,
+ SCIM_KEY_KP_End = 0xFF9C,
+ SCIM_KEY_KP_Begin = 0xFF9D,
+ SCIM_KEY_KP_Insert = 0xFF9E,
+ SCIM_KEY_KP_Delete = 0xFF9F,
+ SCIM_KEY_KP_Equal = 0xFFBD, /* equals */
+ SCIM_KEY_KP_Multiply = 0xFFAA,
+ SCIM_KEY_KP_Add = 0xFFAB,
+ SCIM_KEY_KP_Separator = 0xFFAC, /* separator, often comma */
+ SCIM_KEY_KP_Subtract = 0xFFAD,
+ SCIM_KEY_KP_Decimal = 0xFFAE,
+ SCIM_KEY_KP_Divide = 0xFFAF,
+
+ SCIM_KEY_KP_0 = 0xFFB0,
+ SCIM_KEY_KP_1 = 0xFFB1,
+ SCIM_KEY_KP_2 = 0xFFB2,
+ SCIM_KEY_KP_3 = 0xFFB3,
+ SCIM_KEY_KP_4 = 0xFFB4,
+ SCIM_KEY_KP_5 = 0xFFB5,
+ SCIM_KEY_KP_6 = 0xFFB6,
+ SCIM_KEY_KP_7 = 0xFFB7,
+ SCIM_KEY_KP_8 = 0xFFB8,
+ SCIM_KEY_KP_9 = 0xFFB9,
+
+ /* Auxilliary Functions */
+ SCIM_KEY_F1 = 0xFFBE,
+ SCIM_KEY_F2 = 0xFFBF,
+ SCIM_KEY_F3 = 0xFFC0,
+ SCIM_KEY_F4 = 0xFFC1,
+ SCIM_KEY_F5 = 0xFFC2,
+ SCIM_KEY_F6 = 0xFFC3,
+ SCIM_KEY_F7 = 0xFFC4,
+ SCIM_KEY_F8 = 0xFFC5,
+ SCIM_KEY_F9 = 0xFFC6,
+ SCIM_KEY_F10 = 0xFFC7,
+ SCIM_KEY_F11 = 0xFFC8,
+ SCIM_KEY_F12 = 0xFFC9,
+ SCIM_KEY_F13 = 0xFFCA,
+ SCIM_KEY_F14 = 0xFFCB,
+ SCIM_KEY_F15 = 0xFFCC,
+ SCIM_KEY_F16 = 0xFFCD,
+ SCIM_KEY_F17 = 0xFFCE,
+ SCIM_KEY_F18 = 0xFFCF,
+ SCIM_KEY_F19 = 0xFFD0,
+ SCIM_KEY_F20 = 0xFFD1,
+ SCIM_KEY_F21 = 0xFFD2,
+ SCIM_KEY_F22 = 0xFFD3,
+ SCIM_KEY_F23 = 0xFFD4,
+ SCIM_KEY_F24 = 0xFFD5,
+ SCIM_KEY_F25 = 0xFFD6,
+ SCIM_KEY_F26 = 0xFFD7,
+ SCIM_KEY_F27 = 0xFFD8,
+ SCIM_KEY_F28 = 0xFFD9,
+ SCIM_KEY_F29 = 0xFFDA,
+ SCIM_KEY_F30 = 0xFFDB,
+ SCIM_KEY_F31 = 0xFFDC,
+ SCIM_KEY_F32 = 0xFFDD,
+ SCIM_KEY_F33 = 0xFFDE,
+ SCIM_KEY_F34 = 0xFFDF,
+ SCIM_KEY_F35 = 0xFFE0,
+
+ /* modifier keys */
+ SCIM_KEY_Shift_L = 0xFFE1, /* Left shift */
+ SCIM_KEY_Shift_R = 0xFFE2, /* Right shift */
+ SCIM_KEY_Control_L = 0xFFE3, /* Left control */
+ SCIM_KEY_Control_R = 0xFFE4, /* Right control */
+ SCIM_KEY_Caps_Lock = 0xFFE5, /* Caps lock */
+ SCIM_KEY_Shift_Lock = 0xFFE6, /* Shift lock */
+
+ SCIM_KEY_Meta_L = 0xFFE7, /* Left meta */
+ SCIM_KEY_Meta_R = 0xFFE8, /* Right meta */
+ SCIM_KEY_Alt_L = 0xFFE9, /* Left alt */
+ SCIM_KEY_Alt_R = 0xFFEA, /* Right alt */
+ SCIM_KEY_Super_L = 0xFFEB, /* Left super */
+ SCIM_KEY_Super_R = 0xFFEC, /* Right super */
+ SCIM_KEY_Hyper_L = 0xFFED, /* Left hyper */
+ SCIM_KEY_Hyper_R = 0xFFEE, /* Right hyper */
+
+ /*
+ * ISO 9995 Function and Modifier Keys
+ * Byte 3 = 0xFE
+ */
+
+ SCIM_KEY_ISO_Lock = 0xFE01,
+ SCIM_KEY_ISO_Level2_Latch = 0xFE02,
+ SCIM_KEY_ISO_Level3_Shift = 0xFE03,
+ SCIM_KEY_ISO_Level3_Latch = 0xFE04,
+ SCIM_KEY_ISO_Level3_Lock = 0xFE05,
+ SCIM_KEY_ISO_Group_Shift = 0xFF7E, /* Alias for mode_switch */
+ SCIM_KEY_ISO_Group_Latch = 0xFE06,
+ SCIM_KEY_ISO_Group_Lock = 0xFE07,
+ SCIM_KEY_ISO_Next_Group = 0xFE08,
+ SCIM_KEY_ISO_Next_Group_Lock = 0xFE09,
+ SCIM_KEY_ISO_Prev_Group = 0xFE0A,
+ SCIM_KEY_ISO_Prev_Group_Lock = 0xFE0B,
+ SCIM_KEY_ISO_First_Group = 0xFE0C,
+ SCIM_KEY_ISO_First_Group_Lock = 0xFE0D,
+ SCIM_KEY_ISO_Last_Group = 0xFE0E,
+ SCIM_KEY_ISO_Last_Group_Lock = 0xFE0F,
+
+ SCIM_KEY_ISO_Left_Tab = 0xFE20,
+ SCIM_KEY_ISO_Move_Line_Up = 0xFE21,
+ SCIM_KEY_ISO_Move_Line_Down = 0xFE22,
+ SCIM_KEY_ISO_Partial_Line_Up = 0xFE23,
+ SCIM_KEY_ISO_Partial_Line_Down = 0xFE24,
+ SCIM_KEY_ISO_Partial_Space_Left = 0xFE25,
+ SCIM_KEY_ISO_Partial_Space_Right = 0xFE26,
+ SCIM_KEY_ISO_Set_Margin_Left = 0xFE27,
+ SCIM_KEY_ISO_Set_Margin_Right = 0xFE28,
+ SCIM_KEY_ISO_Release_Margin_Left = 0xFE29,
+ SCIM_KEY_ISO_Release_Margin_Right = 0xFE2A,
+ SCIM_KEY_ISO_Release_Both_Margins = 0xFE2B,
+ SCIM_KEY_ISO_Fast_Cursor_Left = 0xFE2C,
+ SCIM_KEY_ISO_Fast_Cursor_Right = 0xFE2D,
+ SCIM_KEY_ISO_Fast_Cursor_Up = 0xFE2E,
+ SCIM_KEY_ISO_Fast_Cursor_Down = 0xFE2F,
+ SCIM_KEY_ISO_Continuous_Underline = 0xFE30,
+ SCIM_KEY_ISO_Discontinuous_Underline = 0xFE31,
+ SCIM_KEY_ISO_Emphasize = 0xFE32,
+ SCIM_KEY_ISO_Center_Object = 0xFE33,
+ SCIM_KEY_ISO_Enter = 0xFE34,
+
+ SCIM_KEY_dead_grave = 0xFE50,
+ SCIM_KEY_dead_acute = 0xFE51,
+ SCIM_KEY_dead_circumflex = 0xFE52,
+ SCIM_KEY_dead_tilde = 0xFE53,
+ SCIM_KEY_dead_macron = 0xFE54,
+ SCIM_KEY_dead_breve = 0xFE55,
+ SCIM_KEY_dead_abovedot = 0xFE56,
+ SCIM_KEY_dead_diaeresis = 0xFE57,
+ SCIM_KEY_dead_abovering = 0xFE58,
+ SCIM_KEY_dead_doubleacute = 0xFE59,
+ SCIM_KEY_dead_caron = 0xFE5A,
+ SCIM_KEY_dead_cedilla = 0xFE5B,
+ SCIM_KEY_dead_ogonek = 0xFE5C,
+ SCIM_KEY_dead_iota = 0xFE5D,
+ SCIM_KEY_dead_voiced_sound = 0xFE5E,
+ SCIM_KEY_dead_semivoiced_sound = 0xFE5F,
+ SCIM_KEY_dead_belowdot = 0xFE60,
+ SCIM_KEY_dead_hook = 0xFE61,
+ SCIM_KEY_dead_horn = 0xFE62,
+
+ SCIM_KEY_First_Virtual_Screen = 0xFED0,
+ SCIM_KEY_Prev_Virtual_Screen = 0xFED1,
+ SCIM_KEY_Next_Virtual_Screen = 0xFED2,
+ SCIM_KEY_Last_Virtual_Screen = 0xFED4,
+ SCIM_KEY_Terminate_Server = 0xFED5,
+
+ SCIM_KEY_AccessX_Enable = 0xFE70,
+ SCIM_KEY_AccessX_Feedback_Enable = 0xFE71,
+ SCIM_KEY_RepeatKeys_Enable = 0xFE72,
+ SCIM_KEY_SlowKeys_Enable = 0xFE73,
+ SCIM_KEY_BounceKeys_Enable = 0xFE74,
+ SCIM_KEY_StickyKeys_Enable = 0xFE75,
+ SCIM_KEY_MouseKeys_Enable = 0xFE76,
+ SCIM_KEY_MouseKeys_Accel_Enable = 0xFE77,
+ SCIM_KEY_Overlay1_Enable = 0xFE78,
+ SCIM_KEY_Overlay2_Enable = 0xFE79,
+ SCIM_KEY_AudibleBell_Enable = 0xFE7A,
+
+ SCIM_KEY_Pointer_Left = 0xFEE0,
+ SCIM_KEY_Pointer_Right = 0xFEE1,
+ SCIM_KEY_Pointer_Up = 0xFEE2,
+ SCIM_KEY_Pointer_Down = 0xFEE3,
+ SCIM_KEY_Pointer_UpLeft = 0xFEE4,
+ SCIM_KEY_Pointer_UpRight = 0xFEE5,
+ SCIM_KEY_Pointer_DownLeft = 0xFEE6,
+ SCIM_KEY_Pointer_DownRight = 0xFEE7,
+ SCIM_KEY_Pointer_Button_Dflt = 0xFEE8,
+ SCIM_KEY_Pointer_Button1 = 0xFEE9,
+ SCIM_KEY_Pointer_Button2 = 0xFEEA,
+ SCIM_KEY_Pointer_Button3 = 0xFEEB,
+ SCIM_KEY_Pointer_Button4 = 0xFEEC,
+ SCIM_KEY_Pointer_Button5 = 0xFEED,
+ SCIM_KEY_Pointer_DblClick_Dflt = 0xFEEE,
+ SCIM_KEY_Pointer_DblClick1 = 0xFEEF,
+ SCIM_KEY_Pointer_DblClick2 = 0xFEF0,
+ SCIM_KEY_Pointer_DblClick3 = 0xFEF1,
+ SCIM_KEY_Pointer_DblClick4 = 0xFEF2,
+ SCIM_KEY_Pointer_DblClick5 = 0xFEF3,
+ SCIM_KEY_Pointer_Drag_Dflt = 0xFEF4,
+ SCIM_KEY_Pointer_Drag1 = 0xFEF5,
+ SCIM_KEY_Pointer_Drag2 = 0xFEF6,
+ SCIM_KEY_Pointer_Drag3 = 0xFEF7,
+ SCIM_KEY_Pointer_Drag4 = 0xFEF8,
+ SCIM_KEY_Pointer_Drag5 = 0xFEFD,
+
+ SCIM_KEY_Pointer_EnableKeys = 0xFEF9,
+ SCIM_KEY_Pointer_Accelerate = 0xFEFA,
+ SCIM_KEY_Pointer_DfltBtnNext = 0xFEFB,
+ SCIM_KEY_Pointer_DfltBtnPrev = 0xFEFC,
+
+ /*
+ * 3270 Terminal Keys
+ * Byte 3 = 0xFD
+ */
+ SCIM_KEY_3270_Duplicate = 0xFD01,
+ SCIM_KEY_3270_FieldMark = 0xFD02,
+ SCIM_KEY_3270_Right2 = 0xFD03,
+ SCIM_KEY_3270_Left2 = 0xFD04,
+ SCIM_KEY_3270_BackTab = 0xFD05,
+ SCIM_KEY_3270_EraseEOF = 0xFD06,
+ SCIM_KEY_3270_EraseInput = 0xFD07,
+ SCIM_KEY_3270_Reset = 0xFD08,
+ SCIM_KEY_3270_Quit = 0xFD09,
+ SCIM_KEY_3270_PA1 = 0xFD0A,
+ SCIM_KEY_3270_PA2 = 0xFD0B,
+ SCIM_KEY_3270_PA3 = 0xFD0C,
+ SCIM_KEY_3270_Test = 0xFD0D,
+ SCIM_KEY_3270_Attn = 0xFD0E,
+ SCIM_KEY_3270_CursorBlink = 0xFD0F,
+ SCIM_KEY_3270_AltCursor = 0xFD10,
+ SCIM_KEY_3270_KeyClick = 0xFD11,
+ SCIM_KEY_3270_Jump = 0xFD12,
+ SCIM_KEY_3270_Ident = 0xFD13,
+ SCIM_KEY_3270_Rule = 0xFD14,
+ SCIM_KEY_3270_Copy = 0xFD15,
+ SCIM_KEY_3270_Play = 0xFD16,
+ SCIM_KEY_3270_Setup = 0xFD17,
+ SCIM_KEY_3270_Record = 0xFD18,
+ SCIM_KEY_3270_ChangeScreen = 0xFD19,
+ SCIM_KEY_3270_DeleteWord = 0xFD1A,
+ SCIM_KEY_3270_ExSelect = 0xFD1B,
+ SCIM_KEY_3270_CursorSelect = 0xFD1C,
+ SCIM_KEY_3270_PrintScreen = 0xFD1D,
+ SCIM_KEY_3270_Enter = 0xFD1E,
+
+ /* Latin 1 */
+ SCIM_KEY_space = 0x020,
+ SCIM_KEY_exclam = 0x021,
+ SCIM_KEY_quotedbl = 0x022,
+ SCIM_KEY_numbersign = 0x023,
+ SCIM_KEY_dollar = 0x024,
+ SCIM_KEY_percent = 0x025,
+ SCIM_KEY_ampersand = 0x026,
+ SCIM_KEY_apostrophe = 0x027,
+ SCIM_KEY_quoteright = 0x027, /* deprecated */
+ SCIM_KEY_parenleft = 0x028,
+ SCIM_KEY_parenright = 0x029,
+ SCIM_KEY_asterisk = 0x02a,
+ SCIM_KEY_plus = 0x02b,
+ SCIM_KEY_comma = 0x02c,
+ SCIM_KEY_minus = 0x02d,
+ SCIM_KEY_period = 0x02e,
+ SCIM_KEY_slash = 0x02f,
+ SCIM_KEY_0 = 0x030,
+ SCIM_KEY_1 = 0x031,
+ SCIM_KEY_2 = 0x032,
+ SCIM_KEY_3 = 0x033,
+ SCIM_KEY_4 = 0x034,
+ SCIM_KEY_5 = 0x035,
+ SCIM_KEY_6 = 0x036,
+ SCIM_KEY_7 = 0x037,
+ SCIM_KEY_8 = 0x038,
+ SCIM_KEY_9 = 0x039,
+ SCIM_KEY_colon = 0x03a,
+ SCIM_KEY_semicolon = 0x03b,
+ SCIM_KEY_less = 0x03c,
+ SCIM_KEY_equal = 0x03d,
+ SCIM_KEY_greater = 0x03e,
+ SCIM_KEY_question = 0x03f,
+ SCIM_KEY_at = 0x040,
+ SCIM_KEY_A = 0x041,
+ SCIM_KEY_B = 0x042,
+ SCIM_KEY_C = 0x043,
+ SCIM_KEY_D = 0x044,
+ SCIM_KEY_E = 0x045,
+ SCIM_KEY_F = 0x046,
+ SCIM_KEY_G = 0x047,
+ SCIM_KEY_H = 0x048,
+ SCIM_KEY_I = 0x049,
+ SCIM_KEY_J = 0x04a,
+ SCIM_KEY_K = 0x04b,
+ SCIM_KEY_L = 0x04c,
+ SCIM_KEY_M = 0x04d,
+ SCIM_KEY_N = 0x04e,
+ SCIM_KEY_O = 0x04f,
+ SCIM_KEY_P = 0x050,
+ SCIM_KEY_Q = 0x051,
+ SCIM_KEY_R = 0x052,
+ SCIM_KEY_S = 0x053,
+ SCIM_KEY_T = 0x054,
+ SCIM_KEY_U = 0x055,
+ SCIM_KEY_V = 0x056,
+ SCIM_KEY_W = 0x057,
+ SCIM_KEY_X = 0x058,
+ SCIM_KEY_Y = 0x059,
+ SCIM_KEY_Z = 0x05a,
+ SCIM_KEY_bracketleft = 0x05b,
+ SCIM_KEY_backslash = 0x05c,
+ SCIM_KEY_bracketright = 0x05d,
+ SCIM_KEY_asciicircum = 0x05e,
+ SCIM_KEY_underscore = 0x05f,
+ SCIM_KEY_grave = 0x060,
+ SCIM_KEY_a = 0x061,
+ SCIM_KEY_b = 0x062,
+ SCIM_KEY_c = 0x063,
+ SCIM_KEY_d = 0x064,
+ SCIM_KEY_e = 0x065,
+ SCIM_KEY_f = 0x066,
+ SCIM_KEY_g = 0x067,
+ SCIM_KEY_h = 0x068,
+ SCIM_KEY_i = 0x069,
+ SCIM_KEY_j = 0x06a,
+ SCIM_KEY_k = 0x06b,
+ SCIM_KEY_l = 0x06c,
+ SCIM_KEY_m = 0x06d,
+ SCIM_KEY_n = 0x06e,
+ SCIM_KEY_o = 0x06f,
+ SCIM_KEY_p = 0x070,
+ SCIM_KEY_q = 0x071,
+ SCIM_KEY_r = 0x072,
+ SCIM_KEY_s = 0x073,
+ SCIM_KEY_t = 0x074,
+ SCIM_KEY_u = 0x075,
+ SCIM_KEY_v = 0x076,
+ SCIM_KEY_w = 0x077,
+ SCIM_KEY_x = 0x078,
+ SCIM_KEY_y = 0x079,
+ SCIM_KEY_z = 0x07a,
+ SCIM_KEY_braceleft = 0x07b,
+ SCIM_KEY_bar = 0x07c,
+ SCIM_KEY_braceright = 0x07d,
+ SCIM_KEY_asciitilde = 0x07e,
+
+ SCIM_KEY_nobreakspace = 0x0a0,
+ SCIM_KEY_exclamdown = 0x0a1,
+ SCIM_KEY_cent = 0x0a2,
+ SCIM_KEY_sterling = 0x0a3,
+ SCIM_KEY_currency = 0x0a4,
+ SCIM_KEY_yen = 0x0a5,
+ SCIM_KEY_brokenbar = 0x0a6,
+ SCIM_KEY_section = 0x0a7,
+ SCIM_KEY_diaeresis = 0x0a8,
+ SCIM_KEY_copyright = 0x0a9,
+ SCIM_KEY_ordfeminine = 0x0aa,
+ SCIM_KEY_guillemotleft = 0x0ab, /* left angle quotation mark */
+ SCIM_KEY_notsign = 0x0ac,
+ SCIM_KEY_hyphen = 0x0ad,
+ SCIM_KEY_registered = 0x0ae,
+ SCIM_KEY_macron = 0x0af,
+ SCIM_KEY_degree = 0x0b0,
+ SCIM_KEY_plusminus = 0x0b1,
+ SCIM_KEY_twosuperior = 0x0b2,
+ SCIM_KEY_threesuperior = 0x0b3,
+ SCIM_KEY_acute = 0x0b4,
+ SCIM_KEY_mu = 0x0b5,
+ SCIM_KEY_paragraph = 0x0b6,
+ SCIM_KEY_periodcentered = 0x0b7,
+ SCIM_KEY_cedilla = 0x0b8,
+ SCIM_KEY_onesuperior = 0x0b9,
+ SCIM_KEY_masculine = 0x0ba,
+ SCIM_KEY_guillemotright = 0x0bb, /* right angle quotation mark */
+ SCIM_KEY_onequarter = 0x0bc,
+ SCIM_KEY_onehalf = 0x0bd,
+ SCIM_KEY_threequarters = 0x0be,
+ SCIM_KEY_questiondown = 0x0bf,
+ SCIM_KEY_Agrave = 0x0c0,
+ SCIM_KEY_Aacute = 0x0c1,
+ SCIM_KEY_Acircumflex = 0x0c2,
+ SCIM_KEY_Atilde = 0x0c3,
+ SCIM_KEY_Adiaeresis = 0x0c4,
+ SCIM_KEY_Aring = 0x0c5,
+ SCIM_KEY_AE = 0x0c6,
+ SCIM_KEY_Ccedilla = 0x0c7,
+ SCIM_KEY_Egrave = 0x0c8,
+ SCIM_KEY_Eacute = 0x0c9,
+ SCIM_KEY_Ecircumflex = 0x0ca,
+ SCIM_KEY_Ediaeresis = 0x0cb,
+ SCIM_KEY_Igrave = 0x0cc,
+ SCIM_KEY_Iacute = 0x0cd,
+ SCIM_KEY_Icircumflex = 0x0ce,
+ SCIM_KEY_Idiaeresis = 0x0cf,
+ SCIM_KEY_ETH = 0x0d0,
+ SCIM_KEY_Eth = 0x0d0, /* deprecated */
+ SCIM_KEY_Ntilde = 0x0d1,
+ SCIM_KEY_Ograve = 0x0d2,
+ SCIM_KEY_Oacute = 0x0d3,
+ SCIM_KEY_Ocircumflex = 0x0d4,
+ SCIM_KEY_Otilde = 0x0d5,
+ SCIM_KEY_Odiaeresis = 0x0d6,
+ SCIM_KEY_multiply = 0x0d7,
+ SCIM_KEY_Ooblique = 0x0d8,
+ SCIM_KEY_Oslash = SCIM_KEY_Ooblique,
+ SCIM_KEY_Ugrave = 0x0d9,
+ SCIM_KEY_Uacute = 0x0da,
+ SCIM_KEY_Ucircumflex = 0x0db,
+ SCIM_KEY_Udiaeresis = 0x0dc,
+ SCIM_KEY_Yacute = 0x0dd,
+ SCIM_KEY_THORN = 0x0de,
+ SCIM_KEY_Thorn = 0x0de, /* deprecated */
+ SCIM_KEY_ssharp = 0x0df,
+ SCIM_KEY_agrave = 0x0e0,
+ SCIM_KEY_aacute = 0x0e1,
+ SCIM_KEY_acircumflex = 0x0e2,
+ SCIM_KEY_atilde = 0x0e3,
+ SCIM_KEY_adiaeresis = 0x0e4,
+ SCIM_KEY_aring = 0x0e5,
+ SCIM_KEY_ae = 0x0e6,
+ SCIM_KEY_ccedilla = 0x0e7,
+ SCIM_KEY_egrave = 0x0e8,
+ SCIM_KEY_eacute = 0x0e9,
+ SCIM_KEY_ecircumflex = 0x0ea,
+ SCIM_KEY_ediaeresis = 0x0eb,
+ SCIM_KEY_igrave = 0x0ec,
+ SCIM_KEY_iacute = 0x0ed,
+ SCIM_KEY_icircumflex = 0x0ee,
+ SCIM_KEY_idiaeresis = 0x0ef,
+ SCIM_KEY_eth = 0x0f0,
+ SCIM_KEY_ntilde = 0x0f1,
+ SCIM_KEY_ograve = 0x0f2,
+ SCIM_KEY_oacute = 0x0f3,
+ SCIM_KEY_ocircumflex = 0x0f4,
+ SCIM_KEY_otilde = 0x0f5,
+ SCIM_KEY_odiaeresis = 0x0f6,
+ SCIM_KEY_division = 0x0f7,
+ SCIM_KEY_oslash = 0x0f8,
+ SCIM_KEY_ooblique = SCIM_KEY_oslash,
+ SCIM_KEY_ugrave = 0x0f9,
+ SCIM_KEY_uacute = 0x0fa,
+ SCIM_KEY_ucircumflex = 0x0fb,
+ SCIM_KEY_udiaeresis = 0x0fc,
+ SCIM_KEY_yacute = 0x0fd,
+ SCIM_KEY_thorn = 0x0fe,
+ SCIM_KEY_ydiaeresis = 0x0ff,
+
+ /*
+ * Latin 2
+ * Byte 3 = 1
+ */
+ SCIM_KEY_Aogonek = 0x1a1,
+ SCIM_KEY_breve = 0x1a2,
+ SCIM_KEY_Lstroke = 0x1a3,
+ SCIM_KEY_Lcaron = 0x1a5,
+ SCIM_KEY_Sacute = 0x1a6,
+ SCIM_KEY_Scaron = 0x1a9,
+ SCIM_KEY_Scedilla = 0x1aa,
+ SCIM_KEY_Tcaron = 0x1ab,
+ SCIM_KEY_Zacute = 0x1ac,
+ SCIM_KEY_Zcaron = 0x1ae,
+ SCIM_KEY_Zabovedot = 0x1af,
+ SCIM_KEY_aogonek = 0x1b1,
+ SCIM_KEY_ogonek = 0x1b2,
+ SCIM_KEY_lstroke = 0x1b3,
+ SCIM_KEY_lcaron = 0x1b5,
+ SCIM_KEY_sacute = 0x1b6,
+ SCIM_KEY_caron = 0x1b7,
+ SCIM_KEY_scaron = 0x1b9,
+ SCIM_KEY_scedilla = 0x1ba,
+ SCIM_KEY_tcaron = 0x1bb,
+ SCIM_KEY_zacute = 0x1bc,
+ SCIM_KEY_doubleacute = 0x1bd,
+ SCIM_KEY_zcaron = 0x1be,
+ SCIM_KEY_zabovedot = 0x1bf,
+ SCIM_KEY_Racute = 0x1c0,
+ SCIM_KEY_Abreve = 0x1c3,
+ SCIM_KEY_Lacute = 0x1c5,
+ SCIM_KEY_Cacute = 0x1c6,
+ SCIM_KEY_Ccaron = 0x1c8,
+ SCIM_KEY_Eogonek = 0x1ca,
+ SCIM_KEY_Ecaron = 0x1cc,
+ SCIM_KEY_Dcaron = 0x1cf,
+ SCIM_KEY_Dstroke = 0x1d0,
+ SCIM_KEY_Nacute = 0x1d1,
+ SCIM_KEY_Ncaron = 0x1d2,
+ SCIM_KEY_Odoubleacute = 0x1d5,
+ SCIM_KEY_Rcaron = 0x1d8,
+ SCIM_KEY_Uring = 0x1d9,
+ SCIM_KEY_Udoubleacute = 0x1db,
+ SCIM_KEY_Tcedilla = 0x1de,
+ SCIM_KEY_racute = 0x1e0,
+ SCIM_KEY_abreve = 0x1e3,
+ SCIM_KEY_lacute = 0x1e5,
+ SCIM_KEY_cacute = 0x1e6,
+ SCIM_KEY_ccaron = 0x1e8,
+ SCIM_KEY_eogonek = 0x1ea,
+ SCIM_KEY_ecaron = 0x1ec,
+ SCIM_KEY_dcaron = 0x1ef,
+ SCIM_KEY_dstroke = 0x1f0,
+ SCIM_KEY_nacute = 0x1f1,
+ SCIM_KEY_ncaron = 0x1f2,
+ SCIM_KEY_odoubleacute = 0x1f5,
+ SCIM_KEY_udoubleacute = 0x1fb,
+ SCIM_KEY_rcaron = 0x1f8,
+ SCIM_KEY_uring = 0x1f9,
+ SCIM_KEY_tcedilla = 0x1fe,
+ SCIM_KEY_abovedot = 0x1ff,
+
+ /*
+ * Latin 3
+ * Byte 3 = 2
+ */
+ SCIM_KEY_Hstroke = 0x2a1,
+ SCIM_KEY_Hcircumflex = 0x2a6,
+ SCIM_KEY_Iabovedot = 0x2a9,
+ SCIM_KEY_Gbreve = 0x2ab,
+ SCIM_KEY_Jcircumflex = 0x2ac,
+ SCIM_KEY_hstroke = 0x2b1,
+ SCIM_KEY_hcircumflex = 0x2b6,
+ SCIM_KEY_idotless = 0x2b9,
+ SCIM_KEY_gbreve = 0x2bb,
+ SCIM_KEY_jcircumflex = 0x2bc,
+ SCIM_KEY_Cabovedot = 0x2c5,
+ SCIM_KEY_Ccircumflex = 0x2c6,
+ SCIM_KEY_Gabovedot = 0x2d5,
+ SCIM_KEY_Gcircumflex = 0x2d8,
+ SCIM_KEY_Ubreve = 0x2dd,
+ SCIM_KEY_Scircumflex = 0x2de,
+ SCIM_KEY_cabovedot = 0x2e5,
+ SCIM_KEY_ccircumflex = 0x2e6,
+ SCIM_KEY_gabovedot = 0x2f5,
+ SCIM_KEY_gcircumflex = 0x2f8,
+ SCIM_KEY_ubreve = 0x2fd,
+ SCIM_KEY_scircumflex = 0x2fe,
+
+
+ /*
+ * Latin 4
+ * Byte 3 = 3
+ */
+ SCIM_KEY_kra = 0x3a2,
+ SCIM_KEY_kappa = 0x3a2, /* deprecated */
+ SCIM_KEY_Rcedilla = 0x3a3,
+ SCIM_KEY_Itilde = 0x3a5,
+ SCIM_KEY_Lcedilla = 0x3a6,
+ SCIM_KEY_Emacron = 0x3aa,
+ SCIM_KEY_Gcedilla = 0x3ab,
+ SCIM_KEY_Tslash = 0x3ac,
+ SCIM_KEY_rcedilla = 0x3b3,
+ SCIM_KEY_itilde = 0x3b5,
+ SCIM_KEY_lcedilla = 0x3b6,
+ SCIM_KEY_emacron = 0x3ba,
+ SCIM_KEY_gcedilla = 0x3bb,
+ SCIM_KEY_tslash = 0x3bc,
+ SCIM_KEY_ENG = 0x3bd,
+ SCIM_KEY_eng = 0x3bf,
+ SCIM_KEY_Amacron = 0x3c0,
+ SCIM_KEY_Iogonek = 0x3c7,
+ SCIM_KEY_Eabovedot = 0x3cc,
+ SCIM_KEY_Imacron = 0x3cf,
+ SCIM_KEY_Ncedilla = 0x3d1,
+ SCIM_KEY_Omacron = 0x3d2,
+ SCIM_KEY_Kcedilla = 0x3d3,
+ SCIM_KEY_Uogonek = 0x3d9,
+ SCIM_KEY_Utilde = 0x3dd,
+ SCIM_KEY_Umacron = 0x3de,
+ SCIM_KEY_amacron = 0x3e0,
+ SCIM_KEY_iogonek = 0x3e7,
+ SCIM_KEY_eabovedot = 0x3ec,
+ SCIM_KEY_imacron = 0x3ef,
+ SCIM_KEY_ncedilla = 0x3f1,
+ SCIM_KEY_omacron = 0x3f2,
+ SCIM_KEY_kcedilla = 0x3f3,
+ SCIM_KEY_uogonek = 0x3f9,
+ SCIM_KEY_utilde = 0x3fd,
+ SCIM_KEY_umacron = 0x3fe,
+
+/*
+ * Latin-8
+ * Byte 3 = 18
+ */
+ SCIM_KEY_Babovedot = 0x12a1,
+ SCIM_KEY_babovedot = 0x12a2,
+ SCIM_KEY_Dabovedot = 0x12a6,
+ SCIM_KEY_Wgrave = 0x12a8,
+ SCIM_KEY_Wacute = 0x12aa,
+ SCIM_KEY_dabovedot = 0x12ab,
+ SCIM_KEY_Ygrave = 0x12ac,
+ SCIM_KEY_Fabovedot = 0x12b0,
+ SCIM_KEY_fabovedot = 0x12b1,
+ SCIM_KEY_Mabovedot = 0x12b4,
+ SCIM_KEY_mabovedot = 0x12b5,
+ SCIM_KEY_Pabovedot = 0x12b7,
+ SCIM_KEY_wgrave = 0x12b8,
+ SCIM_KEY_pabovedot = 0x12b9,
+ SCIM_KEY_wacute = 0x12ba,
+ SCIM_KEY_Sabovedot = 0x12bb,
+ SCIM_KEY_ygrave = 0x12bc,
+ SCIM_KEY_Wdiaeresis = 0x12bd,
+ SCIM_KEY_wdiaeresis = 0x12be,
+ SCIM_KEY_sabovedot = 0x12bf,
+ SCIM_KEY_Wcircumflex = 0x12d0,
+ SCIM_KEY_Tabovedot = 0x12d7,
+ SCIM_KEY_Ycircumflex = 0x12de,
+ SCIM_KEY_wcircumflex = 0x12f0,
+ SCIM_KEY_tabovedot = 0x12f7,
+ SCIM_KEY_ycircumflex = 0x12fe,
+
+ /*
+ * Latin-9 (a.k.a. Latin-0)
+ * Byte 3 = 19
+ */
+
+ SCIM_KEY_OE = 0x13bc,
+ SCIM_KEY_oe = 0x13bd,
+ SCIM_KEY_Ydiaeresis = 0x13be,
+
+ /*
+ * Katakana
+ * Byte 3 = 4
+ */
+
+ SCIM_KEY_overline = 0x47e,
+ SCIM_KEY_kana_fullstop = 0x4a1,
+ SCIM_KEY_kana_openingbracket = 0x4a2,
+ SCIM_KEY_kana_closingbracket = 0x4a3,
+ SCIM_KEY_kana_comma = 0x4a4,
+ SCIM_KEY_kana_conjunctive = 0x4a5,
+ SCIM_KEY_kana_middledot = 0x4a5, /* deprecated */
+ SCIM_KEY_kana_WO = 0x4a6,
+ SCIM_KEY_kana_a = 0x4a7,
+ SCIM_KEY_kana_i = 0x4a8,
+ SCIM_KEY_kana_u = 0x4a9,
+ SCIM_KEY_kana_e = 0x4aa,
+ SCIM_KEY_kana_o = 0x4ab,
+ SCIM_KEY_kana_ya = 0x4ac,
+ SCIM_KEY_kana_yu = 0x4ad,
+ SCIM_KEY_kana_yo = 0x4ae,
+ SCIM_KEY_kana_tsu = 0x4af,
+ SCIM_KEY_kana_tu = 0x4af, /* deprecated */
+ SCIM_KEY_prolongedsound = 0x4b0,
+ SCIM_KEY_kana_A = 0x4b1,
+ SCIM_KEY_kana_I = 0x4b2,
+ SCIM_KEY_kana_U = 0x4b3,
+ SCIM_KEY_kana_E = 0x4b4,
+ SCIM_KEY_kana_O = 0x4b5,
+ SCIM_KEY_kana_KA = 0x4b6,
+ SCIM_KEY_kana_KI = 0x4b7,
+ SCIM_KEY_kana_KU = 0x4b8,
+ SCIM_KEY_kana_KE = 0x4b9,
+ SCIM_KEY_kana_KO = 0x4ba,
+ SCIM_KEY_kana_SA = 0x4bb,
+ SCIM_KEY_kana_SHI = 0x4bc,
+ SCIM_KEY_kana_SU = 0x4bd,
+ SCIM_KEY_kana_SE = 0x4be,
+ SCIM_KEY_kana_SO = 0x4bf,
+ SCIM_KEY_kana_TA = 0x4c0,
+ SCIM_KEY_kana_CHI = 0x4c1,
+ SCIM_KEY_kana_TI = 0x4c1, /* deprecated */
+ SCIM_KEY_kana_TSU = 0x4c2,
+ SCIM_KEY_kana_TU = 0x4c2, /* deprecated */
+ SCIM_KEY_kana_TE = 0x4c3,
+ SCIM_KEY_kana_TO = 0x4c4,
+ SCIM_KEY_kana_NA = 0x4c5,
+ SCIM_KEY_kana_NI = 0x4c6,
+ SCIM_KEY_kana_NU = 0x4c7,
+ SCIM_KEY_kana_NE = 0x4c8,
+ SCIM_KEY_kana_NO = 0x4c9,
+ SCIM_KEY_kana_HA = 0x4ca,
+ SCIM_KEY_kana_HI = 0x4cb,
+ SCIM_KEY_kana_FU = 0x4cc,
+ SCIM_KEY_kana_HU = 0x4cc, /* deprecated */
+ SCIM_KEY_kana_HE = 0x4cd,
+ SCIM_KEY_kana_HO = 0x4ce,
+ SCIM_KEY_kana_MA = 0x4cf,
+ SCIM_KEY_kana_MI = 0x4d0,
+ SCIM_KEY_kana_MU = 0x4d1,
+ SCIM_KEY_kana_ME = 0x4d2,
+ SCIM_KEY_kana_MO = 0x4d3,
+ SCIM_KEY_kana_YA = 0x4d4,
+ SCIM_KEY_kana_YU = 0x4d5,
+ SCIM_KEY_kana_YO = 0x4d6,
+ SCIM_KEY_kana_RA = 0x4d7,
+ SCIM_KEY_kana_RI = 0x4d8,
+ SCIM_KEY_kana_RU = 0x4d9,
+ SCIM_KEY_kana_RE = 0x4da,
+ SCIM_KEY_kana_RO = 0x4db,
+ SCIM_KEY_kana_WA = 0x4dc,
+ SCIM_KEY_kana_N = 0x4dd,
+ SCIM_KEY_voicedsound = 0x4de,
+ SCIM_KEY_semivoicedsound = 0x4df,
+ SCIM_KEY_kana_switch = 0xFF7E, /* Alias for mode_switch */
+
+ /*
+ * Arabic
+ * Byte 3 = 5
+ */
+ SCIM_KEY_Farsi_0 = 0x590,
+ SCIM_KEY_Farsi_1 = 0x591,
+ SCIM_KEY_Farsi_2 = 0x592,
+ SCIM_KEY_Farsi_3 = 0x593,
+ SCIM_KEY_Farsi_4 = 0x594,
+ SCIM_KEY_Farsi_5 = 0x595,
+ SCIM_KEY_Farsi_6 = 0x596,
+ SCIM_KEY_Farsi_7 = 0x597,
+ SCIM_KEY_Farsi_8 = 0x598,
+ SCIM_KEY_Farsi_9 = 0x599,
+ SCIM_KEY_Arabic_percent = 0x5a5,
+ SCIM_KEY_Arabic_superscript_alef = 0x5a6,
+ SCIM_KEY_Arabic_tteh = 0x5a7,
+ SCIM_KEY_Arabic_peh = 0x5a8,
+ SCIM_KEY_Arabic_tcheh = 0x5a9,
+ SCIM_KEY_Arabic_ddal = 0x5aa,
+ SCIM_KEY_Arabic_rreh = 0x5ab,
+ SCIM_KEY_Arabic_comma = 0x5ac,
+ SCIM_KEY_Arabic_fullstop = 0x5ae,
+ SCIM_KEY_Arabic_0 = 0x5b0,
+ SCIM_KEY_Arabic_1 = 0x5b1,
+ SCIM_KEY_Arabic_2 = 0x5b2,
+ SCIM_KEY_Arabic_3 = 0x5b3,
+ SCIM_KEY_Arabic_4 = 0x5b4,
+ SCIM_KEY_Arabic_5 = 0x5b5,
+ SCIM_KEY_Arabic_6 = 0x5b6,
+ SCIM_KEY_Arabic_7 = 0x5b7,
+ SCIM_KEY_Arabic_8 = 0x5b8,
+ SCIM_KEY_Arabic_9 = 0x5b9,
+ SCIM_KEY_Arabic_semicolon = 0x5bb,
+ SCIM_KEY_Arabic_question_mark = 0x5bf,
+ SCIM_KEY_Arabic_hamza = 0x5c1,
+ SCIM_KEY_Arabic_maddaonalef = 0x5c2,
+ SCIM_KEY_Arabic_hamzaonalef = 0x5c3,
+ SCIM_KEY_Arabic_hamzaonwaw = 0x5c4,
+ SCIM_KEY_Arabic_hamzaunderalef = 0x5c5,
+ SCIM_KEY_Arabic_hamzaonyeh = 0x5c6,
+ SCIM_KEY_Arabic_alef = 0x5c7,
+ SCIM_KEY_Arabic_beh = 0x5c8,
+ SCIM_KEY_Arabic_tehmarbuta = 0x5c9,
+ SCIM_KEY_Arabic_teh = 0x5ca,
+ SCIM_KEY_Arabic_theh = 0x5cb,
+ SCIM_KEY_Arabic_jeem = 0x5cc,
+ SCIM_KEY_Arabic_hah = 0x5cd,
+ SCIM_KEY_Arabic_khah = 0x5ce,
+ SCIM_KEY_Arabic_dal = 0x5cf,
+ SCIM_KEY_Arabic_thal = 0x5d0,
+ SCIM_KEY_Arabic_ra = 0x5d1,
+ SCIM_KEY_Arabic_zain = 0x5d2,
+ SCIM_KEY_Arabic_seen = 0x5d3,
+ SCIM_KEY_Arabic_sheen = 0x5d4,
+ SCIM_KEY_Arabic_sad = 0x5d5,
+ SCIM_KEY_Arabic_dad = 0x5d6,
+ SCIM_KEY_Arabic_tah = 0x5d7,
+ SCIM_KEY_Arabic_zah = 0x5d8,
+ SCIM_KEY_Arabic_ain = 0x5d9,
+ SCIM_KEY_Arabic_ghain = 0x5da,
+ SCIM_KEY_Arabic_tatweel = 0x5e0,
+ SCIM_KEY_Arabic_feh = 0x5e1,
+ SCIM_KEY_Arabic_qaf = 0x5e2,
+ SCIM_KEY_Arabic_kaf = 0x5e3,
+ SCIM_KEY_Arabic_lam = 0x5e4,
+ SCIM_KEY_Arabic_meem = 0x5e5,
+ SCIM_KEY_Arabic_noon = 0x5e6,
+ SCIM_KEY_Arabic_ha = 0x5e7,
+ SCIM_KEY_Arabic_heh = 0x5e7, /* deprecated */
+ SCIM_KEY_Arabic_waw = 0x5e8,
+ SCIM_KEY_Arabic_alefmaksura = 0x5e9,
+ SCIM_KEY_Arabic_yeh = 0x5ea,
+ SCIM_KEY_Arabic_fathatan = 0x5eb,
+ SCIM_KEY_Arabic_dammatan = 0x5ec,
+ SCIM_KEY_Arabic_kasratan = 0x5ed,
+ SCIM_KEY_Arabic_fatha = 0x5ee,
+ SCIM_KEY_Arabic_damma = 0x5ef,
+ SCIM_KEY_Arabic_kasra = 0x5f0,
+ SCIM_KEY_Arabic_shadda = 0x5f1,
+ SCIM_KEY_Arabic_sukun = 0x5f2,
+ SCIM_KEY_Arabic_madda_above = 0x5f3,
+ SCIM_KEY_Arabic_hamza_above = 0x5f4,
+ SCIM_KEY_Arabic_hamza_below = 0x5f5,
+ SCIM_KEY_Arabic_jeh = 0x5f6,
+ SCIM_KEY_Arabic_veh = 0x5f7,
+ SCIM_KEY_Arabic_keheh = 0x5f8,
+ SCIM_KEY_Arabic_gaf = 0x5f9,
+ SCIM_KEY_Arabic_noon_ghunna = 0x5fa,
+ SCIM_KEY_Arabic_heh_doachashmee = 0x5fb,
+ SCIM_KEY_Farsi_yeh = 0x5fc,
+ SCIM_KEY_Arabic_farsi_yeh = SCIM_KEY_Farsi_yeh,
+ SCIM_KEY_Arabic_yeh_baree = 0x5fd,
+ SCIM_KEY_Arabic_heh_goal = 0x5fe,
+ SCIM_KEY_Arabic_switch = 0xFF7E, /* Alias for mode_switch */
+
+ /*
+ * Cyrillic
+ * Byte 3 = 6
+ */
+ SCIM_KEY_Cyrillic_GHE_bar = 0x680,
+ SCIM_KEY_Cyrillic_ghe_bar = 0x690,
+ SCIM_KEY_Cyrillic_ZHE_descender = 0x681,
+ SCIM_KEY_Cyrillic_zhe_descender = 0x691,
+ SCIM_KEY_Cyrillic_KA_descender = 0x682,
+ SCIM_KEY_Cyrillic_ka_descender = 0x692,
+ SCIM_KEY_Cyrillic_KA_vertstroke = 0x683,
+ SCIM_KEY_Cyrillic_ka_vertstroke = 0x693,
+ SCIM_KEY_Cyrillic_EN_descender = 0x684,
+ SCIM_KEY_Cyrillic_en_descender = 0x694,
+ SCIM_KEY_Cyrillic_U_straight = 0x685,
+ SCIM_KEY_Cyrillic_u_straight = 0x695,
+ SCIM_KEY_Cyrillic_U_straight_bar = 0x686,
+ SCIM_KEY_Cyrillic_u_straight_bar = 0x696,
+ SCIM_KEY_Cyrillic_HA_descender = 0x687,
+ SCIM_KEY_Cyrillic_ha_descender = 0x697,
+ SCIM_KEY_Cyrillic_CHE_descender = 0x688,
+ SCIM_KEY_Cyrillic_che_descender = 0x698,
+ SCIM_KEY_Cyrillic_CHE_vertstroke = 0x689,
+ SCIM_KEY_Cyrillic_che_vertstroke = 0x699,
+ SCIM_KEY_Cyrillic_SHHA = 0x68a,
+ SCIM_KEY_Cyrillic_shha = 0x69a,
+
+ SCIM_KEY_Cyrillic_SCHWA = 0x68c,
+ SCIM_KEY_Cyrillic_schwa = 0x69c,
+ SCIM_KEY_Cyrillic_I_macron = 0x68d,
+ SCIM_KEY_Cyrillic_i_macron = 0x69d,
+ SCIM_KEY_Cyrillic_O_bar = 0x68e,
+ SCIM_KEY_Cyrillic_o_bar = 0x69e,
+ SCIM_KEY_Cyrillic_U_macron = 0x68f,
+ SCIM_KEY_Cyrillic_u_macron = 0x69f,
+
+ SCIM_KEY_Serbian_dje = 0x6a1,
+ SCIM_KEY_Macedonia_gje = 0x6a2,
+ SCIM_KEY_Cyrillic_io = 0x6a3,
+ SCIM_KEY_Ukrainian_ie = 0x6a4,
+ SCIM_KEY_Ukranian_je = 0x6a4, /* deprecated */
+ SCIM_KEY_Macedonia_dse = 0x6a5,
+ SCIM_KEY_Ukrainian_i = 0x6a6,
+ SCIM_KEY_Ukranian_i = 0x6a6, /* deprecated */
+ SCIM_KEY_Ukrainian_yi = 0x6a7,
+ SCIM_KEY_Ukranian_yi = 0x6a7, /* deprecated */
+ SCIM_KEY_Cyrillic_je = 0x6a8,
+ SCIM_KEY_Serbian_je = 0x6a8, /* deprecated */
+ SCIM_KEY_Cyrillic_lje = 0x6a9,
+ SCIM_KEY_Serbian_lje = 0x6a9, /* deprecated */
+ SCIM_KEY_Cyrillic_nje = 0x6aa,
+ SCIM_KEY_Serbian_nje = 0x6aa, /* deprecated */
+ SCIM_KEY_Serbian_tshe = 0x6ab,
+ SCIM_KEY_Macedonia_kje = 0x6ac,
+ SCIM_KEY_Ukrainian_ghe_with_upturn = 0x6ad,
+ SCIM_KEY_Byelorussian_shortu = 0x6ae,
+ SCIM_KEY_Cyrillic_dzhe = 0x6af,
+ SCIM_KEY_Serbian_dze = 0x6af, /* deprecated */
+ SCIM_KEY_numerosign = 0x6b0,
+ SCIM_KEY_Serbian_DJE = 0x6b1,
+ SCIM_KEY_Macedonia_GJE = 0x6b2,
+ SCIM_KEY_Cyrillic_IO = 0x6b3,
+ SCIM_KEY_Ukrainian_IE = 0x6b4,
+ SCIM_KEY_Ukranian_JE = 0x6b4, /* deprecated */
+ SCIM_KEY_Macedonia_DSE = 0x6b5,
+ SCIM_KEY_Ukrainian_I = 0x6b6,
+ SCIM_KEY_Ukranian_I = 0x6b6, /* deprecated */
+ SCIM_KEY_Ukrainian_YI = 0x6b7,
+ SCIM_KEY_Ukranian_YI = 0x6b7, /* deprecated */
+ SCIM_KEY_Cyrillic_JE = 0x6b8,
+ SCIM_KEY_Serbian_JE = 0x6b8, /* deprecated */
+ SCIM_KEY_Cyrillic_LJE = 0x6b9,
+ SCIM_KEY_Serbian_LJE = 0x6b9, /* deprecated */
+ SCIM_KEY_Cyrillic_NJE = 0x6ba,
+ SCIM_KEY_Serbian_NJE = 0x6ba, /* deprecated */
+ SCIM_KEY_Serbian_TSHE = 0x6bb,
+ SCIM_KEY_Macedonia_KJE = 0x6bc,
+ SCIM_KEY_Ukrainian_GHE_WITH_UPTURN = 0x6bd,
+ SCIM_KEY_Byelorussian_SHORTU = 0x6be,
+ SCIM_KEY_Cyrillic_DZHE = 0x6bf,
+ SCIM_KEY_Serbian_DZE = 0x6bf, /* deprecated */
+ SCIM_KEY_Cyrillic_yu = 0x6c0,
+ SCIM_KEY_Cyrillic_a = 0x6c1,
+ SCIM_KEY_Cyrillic_be = 0x6c2,
+ SCIM_KEY_Cyrillic_tse = 0x6c3,
+ SCIM_KEY_Cyrillic_de = 0x6c4,
+ SCIM_KEY_Cyrillic_ie = 0x6c5,
+ SCIM_KEY_Cyrillic_ef = 0x6c6,
+ SCIM_KEY_Cyrillic_ghe = 0x6c7,
+ SCIM_KEY_Cyrillic_ha = 0x6c8,
+ SCIM_KEY_Cyrillic_i = 0x6c9,
+ SCIM_KEY_Cyrillic_shorti = 0x6ca,
+ SCIM_KEY_Cyrillic_ka = 0x6cb,
+ SCIM_KEY_Cyrillic_el = 0x6cc,
+ SCIM_KEY_Cyrillic_em = 0x6cd,
+ SCIM_KEY_Cyrillic_en = 0x6ce,
+ SCIM_KEY_Cyrillic_o = 0x6cf,
+ SCIM_KEY_Cyrillic_pe = 0x6d0,
+ SCIM_KEY_Cyrillic_ya = 0x6d1,
+ SCIM_KEY_Cyrillic_er = 0x6d2,
+ SCIM_KEY_Cyrillic_es = 0x6d3,
+ SCIM_KEY_Cyrillic_te = 0x6d4,
+ SCIM_KEY_Cyrillic_u = 0x6d5,
+ SCIM_KEY_Cyrillic_zhe = 0x6d6,
+ SCIM_KEY_Cyrillic_ve = 0x6d7,
+ SCIM_KEY_Cyrillic_softsign = 0x6d8,
+ SCIM_KEY_Cyrillic_yeru = 0x6d9,
+ SCIM_KEY_Cyrillic_ze = 0x6da,
+ SCIM_KEY_Cyrillic_sha = 0x6db,
+ SCIM_KEY_Cyrillic_e = 0x6dc,
+ SCIM_KEY_Cyrillic_shcha = 0x6dd,
+ SCIM_KEY_Cyrillic_che = 0x6de,
+ SCIM_KEY_Cyrillic_hardsign = 0x6df,
+ SCIM_KEY_Cyrillic_YU = 0x6e0,
+ SCIM_KEY_Cyrillic_A = 0x6e1,
+ SCIM_KEY_Cyrillic_BE = 0x6e2,
+ SCIM_KEY_Cyrillic_TSE = 0x6e3,
+ SCIM_KEY_Cyrillic_DE = 0x6e4,
+ SCIM_KEY_Cyrillic_IE = 0x6e5,
+ SCIM_KEY_Cyrillic_EF = 0x6e6,
+ SCIM_KEY_Cyrillic_GHE = 0x6e7,
+ SCIM_KEY_Cyrillic_HA = 0x6e8,
+ SCIM_KEY_Cyrillic_I = 0x6e9,
+ SCIM_KEY_Cyrillic_SHORTI = 0x6ea,
+ SCIM_KEY_Cyrillic_KA = 0x6eb,
+ SCIM_KEY_Cyrillic_EL = 0x6ec,
+ SCIM_KEY_Cyrillic_EM = 0x6ed,
+ SCIM_KEY_Cyrillic_EN = 0x6ee,
+ SCIM_KEY_Cyrillic_O = 0x6ef,
+ SCIM_KEY_Cyrillic_PE = 0x6f0,
+ SCIM_KEY_Cyrillic_YA = 0x6f1,
+ SCIM_KEY_Cyrillic_ER = 0x6f2,
+ SCIM_KEY_Cyrillic_ES = 0x6f3,
+ SCIM_KEY_Cyrillic_TE = 0x6f4,
+ SCIM_KEY_Cyrillic_U = 0x6f5,
+ SCIM_KEY_Cyrillic_ZHE = 0x6f6,
+ SCIM_KEY_Cyrillic_VE = 0x6f7,
+ SCIM_KEY_Cyrillic_SOFTSIGN = 0x6f8,
+ SCIM_KEY_Cyrillic_YERU = 0x6f9,
+ SCIM_KEY_Cyrillic_ZE = 0x6fa,
+ SCIM_KEY_Cyrillic_SHA = 0x6fb,
+ SCIM_KEY_Cyrillic_E = 0x6fc,
+ SCIM_KEY_Cyrillic_SHCHA = 0x6fd,
+ SCIM_KEY_Cyrillic_CHE = 0x6fe,
+ SCIM_KEY_Cyrillic_HARDSIGN = 0x6ff,
+
+ /*
+ * Greek
+ * Byte 3 = 7
+ */
+ SCIM_KEY_Greek_ALPHAaccent = 0x7a1,
+ SCIM_KEY_Greek_EPSILONaccent = 0x7a2,
+ SCIM_KEY_Greek_ETAaccent = 0x7a3,
+ SCIM_KEY_Greek_IOTAaccent = 0x7a4,
+ SCIM_KEY_Greek_IOTAdieresis = 0x7a5,
+ SCIM_KEY_Greek_IOTAdiaeresis = SCIM_KEY_Greek_IOTAdieresis, /* old typo */
+ SCIM_KEY_Greek_OMICRONaccent = 0x7a7,
+ SCIM_KEY_Greek_UPSILONaccent = 0x7a8,
+ SCIM_KEY_Greek_UPSILONdieresis = 0x7a9,
+ SCIM_KEY_Greek_OMEGAaccent = 0x7ab,
+ SCIM_KEY_Greek_accentdieresis = 0x7ae,
+ SCIM_KEY_Greek_horizbar = 0x7af,
+ SCIM_KEY_Greek_alphaaccent = 0x7b1,
+ SCIM_KEY_Greek_epsilonaccent = 0x7b2,
+ SCIM_KEY_Greek_etaaccent = 0x7b3,
+ SCIM_KEY_Greek_iotaaccent = 0x7b4,
+ SCIM_KEY_Greek_iotadieresis = 0x7b5,
+ SCIM_KEY_Greek_iotaaccentdieresis = 0x7b6,
+ SCIM_KEY_Greek_omicronaccent = 0x7b7,
+ SCIM_KEY_Greek_upsilonaccent = 0x7b8,
+ SCIM_KEY_Greek_upsilondieresis = 0x7b9,
+ SCIM_KEY_Greek_upsilonaccentdieresis = 0x7ba,
+ SCIM_KEY_Greek_omegaaccent = 0x7bb,
+ SCIM_KEY_Greek_ALPHA = 0x7c1,
+ SCIM_KEY_Greek_BETA = 0x7c2,
+ SCIM_KEY_Greek_GAMMA = 0x7c3,
+ SCIM_KEY_Greek_DELTA = 0x7c4,
+ SCIM_KEY_Greek_EPSILON = 0x7c5,
+ SCIM_KEY_Greek_ZETA = 0x7c6,
+ SCIM_KEY_Greek_ETA = 0x7c7,
+ SCIM_KEY_Greek_THETA = 0x7c8,
+ SCIM_KEY_Greek_IOTA = 0x7c9,
+ SCIM_KEY_Greek_KAPPA = 0x7ca,
+ SCIM_KEY_Greek_LAMDA = 0x7cb,
+ SCIM_KEY_Greek_LAMBDA = 0x7cb,
+ SCIM_KEY_Greek_MU = 0x7cc,
+ SCIM_KEY_Greek_NU = 0x7cd,
+ SCIM_KEY_Greek_XI = 0x7ce,
+ SCIM_KEY_Greek_OMICRON = 0x7cf,
+ SCIM_KEY_Greek_PI = 0x7d0,
+ SCIM_KEY_Greek_RHO = 0x7d1,
+ SCIM_KEY_Greek_SIGMA = 0x7d2,
+ SCIM_KEY_Greek_TAU = 0x7d4,
+ SCIM_KEY_Greek_UPSILON = 0x7d5,
+ SCIM_KEY_Greek_PHI = 0x7d6,
+ SCIM_KEY_Greek_CHI = 0x7d7,
+ SCIM_KEY_Greek_PSI = 0x7d8,
+ SCIM_KEY_Greek_OMEGA = 0x7d9,
+ SCIM_KEY_Greek_alpha = 0x7e1,
+ SCIM_KEY_Greek_beta = 0x7e2,
+ SCIM_KEY_Greek_gamma = 0x7e3,
+ SCIM_KEY_Greek_delta = 0x7e4,
+ SCIM_KEY_Greek_epsilon = 0x7e5,
+ SCIM_KEY_Greek_zeta = 0x7e6,
+ SCIM_KEY_Greek_eta = 0x7e7,
+ SCIM_KEY_Greek_theta = 0x7e8,
+ SCIM_KEY_Greek_iota = 0x7e9,
+ SCIM_KEY_Greek_kappa = 0x7ea,
+ SCIM_KEY_Greek_lamda = 0x7eb,
+ SCIM_KEY_Greek_lambda = 0x7eb,
+ SCIM_KEY_Greek_mu = 0x7ec,
+ SCIM_KEY_Greek_nu = 0x7ed,
+ SCIM_KEY_Greek_xi = 0x7ee,
+ SCIM_KEY_Greek_omicron = 0x7ef,
+ SCIM_KEY_Greek_pi = 0x7f0,
+ SCIM_KEY_Greek_rho = 0x7f1,
+ SCIM_KEY_Greek_sigma = 0x7f2,
+ SCIM_KEY_Greek_finalsmallsigma = 0x7f3,
+ SCIM_KEY_Greek_tau = 0x7f4,
+ SCIM_KEY_Greek_upsilon = 0x7f5,
+ SCIM_KEY_Greek_phi = 0x7f6,
+ SCIM_KEY_Greek_chi = 0x7f7,
+ SCIM_KEY_Greek_psi = 0x7f8,
+ SCIM_KEY_Greek_omega = 0x7f9,
+ SCIM_KEY_Greek_switch = 0xFF7E, /* Alias for mode_switch */
+
+ /*
+ * Technical
+ * Byte 3 = 8
+ */
+ SCIM_KEY_leftradical = 0x8a1,
+ SCIM_KEY_topleftradical = 0x8a2,
+ SCIM_KEY_horizconnector = 0x8a3,
+ SCIM_KEY_topintegral = 0x8a4,
+ SCIM_KEY_botintegral = 0x8a5,
+ SCIM_KEY_vertconnector = 0x8a6,
+ SCIM_KEY_topleftsqbracket = 0x8a7,
+ SCIM_KEY_botleftsqbracket = 0x8a8,
+ SCIM_KEY_toprightsqbracket = 0x8a9,
+ SCIM_KEY_botrightsqbracket = 0x8aa,
+ SCIM_KEY_topleftparens = 0x8ab,
+ SCIM_KEY_botleftparens = 0x8ac,
+ SCIM_KEY_toprightparens = 0x8ad,
+ SCIM_KEY_botrightparens = 0x8ae,
+ SCIM_KEY_leftmiddlecurlybrace = 0x8af,
+ SCIM_KEY_rightmiddlecurlybrace = 0x8b0,
+ SCIM_KEY_topleftsummation = 0x8b1,
+ SCIM_KEY_botleftsummation = 0x8b2,
+ SCIM_KEY_topvertsummationconnector = 0x8b3,
+ SCIM_KEY_botvertsummationconnector = 0x8b4,
+ SCIM_KEY_toprightsummation = 0x8b5,
+ SCIM_KEY_botrightsummation = 0x8b6,
+ SCIM_KEY_rightmiddlesummation = 0x8b7,
+ SCIM_KEY_lessthanequal = 0x8bc,
+ SCIM_KEY_notequal = 0x8bd,
+ SCIM_KEY_greaterthanequal = 0x8be,
+ SCIM_KEY_integral = 0x8bf,
+ SCIM_KEY_therefore = 0x8c0,
+ SCIM_KEY_variation = 0x8c1,
+ SCIM_KEY_infinity = 0x8c2,
+ SCIM_KEY_nabla = 0x8c5,
+ SCIM_KEY_approximate = 0x8c8,
+ SCIM_KEY_similarequal = 0x8c9,
+ SCIM_KEY_ifonlyif = 0x8cd,
+ SCIM_KEY_implies = 0x8ce,
+ SCIM_KEY_identical = 0x8cf,
+ SCIM_KEY_radical = 0x8d6,
+ SCIM_KEY_includedin = 0x8da,
+ SCIM_KEY_includes = 0x8db,
+ SCIM_KEY_intersection = 0x8dc,
+ SCIM_KEY_union = 0x8dd,
+ SCIM_KEY_logicaland = 0x8de,
+ SCIM_KEY_logicalor = 0x8df,
+ SCIM_KEY_partialderivative = 0x8ef,
+ SCIM_KEY_function = 0x8f6,
+ SCIM_KEY_leftarrow = 0x8fb,
+ SCIM_KEY_uparrow = 0x8fc,
+ SCIM_KEY_rightarrow = 0x8fd,
+ SCIM_KEY_downarrow = 0x8fe,
+
+ /*
+ * Special
+ * Byte 3 = 9
+ */
+ SCIM_KEY_blank = 0x9df,
+ SCIM_KEY_soliddiamond = 0x9e0,
+ SCIM_KEY_checkerboard = 0x9e1,
+ SCIM_KEY_ht = 0x9e2,
+ SCIM_KEY_ff = 0x9e3,
+ SCIM_KEY_cr = 0x9e4,
+ SCIM_KEY_lf = 0x9e5,
+ SCIM_KEY_nl = 0x9e8,
+ SCIM_KEY_vt = 0x9e9,
+ SCIM_KEY_lowrightcorner = 0x9ea,
+ SCIM_KEY_uprightcorner = 0x9eb,
+ SCIM_KEY_upleftcorner = 0x9ec,
+ SCIM_KEY_lowleftcorner = 0x9ed,
+ SCIM_KEY_crossinglines = 0x9ee,
+ SCIM_KEY_horizlinescan1 = 0x9ef,
+ SCIM_KEY_horizlinescan3 = 0x9f0,
+ SCIM_KEY_horizlinescan5 = 0x9f1,
+ SCIM_KEY_horizlinescan7 = 0x9f2,
+ SCIM_KEY_horizlinescan9 = 0x9f3,
+ SCIM_KEY_leftt = 0x9f4,
+ SCIM_KEY_rightt = 0x9f5,
+ SCIM_KEY_bott = 0x9f6,
+ SCIM_KEY_topt = 0x9f7,
+ SCIM_KEY_vertbar = 0x9f8,
+
+ /*
+ * Publishing
+ * Byte 3 = a
+ */
+ SCIM_KEY_emspace = 0xaa1,
+ SCIM_KEY_enspace = 0xaa2,
+ SCIM_KEY_em3space = 0xaa3,
+ SCIM_KEY_em4space = 0xaa4,
+ SCIM_KEY_digitspace = 0xaa5,
+ SCIM_KEY_punctspace = 0xaa6,
+ SCIM_KEY_thinspace = 0xaa7,
+ SCIM_KEY_hairspace = 0xaa8,
+ SCIM_KEY_emdash = 0xaa9,
+ SCIM_KEY_endash = 0xaaa,
+ SCIM_KEY_signifblank = 0xaac,
+ SCIM_KEY_ellipsis = 0xaae,
+ SCIM_KEY_doubbaselinedot = 0xaaf,
+ SCIM_KEY_onethird = 0xab0,
+ SCIM_KEY_twothirds = 0xab1,
+ SCIM_KEY_onefifth = 0xab2,
+ SCIM_KEY_twofifths = 0xab3,
+ SCIM_KEY_threefifths = 0xab4,
+ SCIM_KEY_fourfifths = 0xab5,
+ SCIM_KEY_onesixth = 0xab6,
+ SCIM_KEY_fivesixths = 0xab7,
+ SCIM_KEY_careof = 0xab8,
+ SCIM_KEY_figdash = 0xabb,
+ SCIM_KEY_leftanglebracket = 0xabc,
+ SCIM_KEY_decimalpoint = 0xabd,
+ SCIM_KEY_rightanglebracket = 0xabe,
+ SCIM_KEY_marker = 0xabf,
+ SCIM_KEY_oneeighth = 0xac3,
+ SCIM_KEY_threeeighths = 0xac4,
+ SCIM_KEY_fiveeighths = 0xac5,
+ SCIM_KEY_seveneighths = 0xac6,
+ SCIM_KEY_trademark = 0xac9,
+ SCIM_KEY_signaturemark = 0xaca,
+ SCIM_KEY_trademarkincircle = 0xacb,
+ SCIM_KEY_leftopentriangle = 0xacc,
+ SCIM_KEY_rightopentriangle = 0xacd,
+ SCIM_KEY_emopencircle = 0xace,
+ SCIM_KEY_emopenrectangle = 0xacf,
+ SCIM_KEY_leftsinglequotemark = 0xad0,
+ SCIM_KEY_rightsinglequotemark = 0xad1,
+ SCIM_KEY_leftdoublequotemark = 0xad2,
+ SCIM_KEY_rightdoublequotemark = 0xad3,
+ SCIM_KEY_prescription = 0xad4,
+ SCIM_KEY_minutes = 0xad6,
+ SCIM_KEY_seconds = 0xad7,
+ SCIM_KEY_latincross = 0xad9,
+ SCIM_KEY_hexagram = 0xada,
+ SCIM_KEY_filledrectbullet = 0xadb,
+ SCIM_KEY_filledlefttribullet = 0xadc,
+ SCIM_KEY_filledrighttribullet = 0xadd,
+ SCIM_KEY_emfilledcircle = 0xade,
+ SCIM_KEY_emfilledrect = 0xadf,
+ SCIM_KEY_enopencircbullet = 0xae0,
+ SCIM_KEY_enopensquarebullet = 0xae1,
+ SCIM_KEY_openrectbullet = 0xae2,
+ SCIM_KEY_opentribulletup = 0xae3,
+ SCIM_KEY_opentribulletdown = 0xae4,
+ SCIM_KEY_openstar = 0xae5,
+ SCIM_KEY_enfilledcircbullet = 0xae6,
+ SCIM_KEY_enfilledsqbullet = 0xae7,
+ SCIM_KEY_filledtribulletup = 0xae8,
+ SCIM_KEY_filledtribulletdown = 0xae9,
+ SCIM_KEY_leftpointer = 0xaea,
+ SCIM_KEY_rightpointer = 0xaeb,
+ SCIM_KEY_club = 0xaec,
+ SCIM_KEY_diamond = 0xaed,
+ SCIM_KEY_heart = 0xaee,
+ SCIM_KEY_maltesecross = 0xaf0,
+ SCIM_KEY_dagger = 0xaf1,
+ SCIM_KEY_doubledagger = 0xaf2,
+ SCIM_KEY_checkmark = 0xaf3,
+ SCIM_KEY_ballotcross = 0xaf4,
+ SCIM_KEY_musicalsharp = 0xaf5,
+ SCIM_KEY_musicalflat = 0xaf6,
+ SCIM_KEY_malesymbol = 0xaf7,
+ SCIM_KEY_femalesymbol = 0xaf8,
+ SCIM_KEY_telephone = 0xaf9,
+ SCIM_KEY_telephonerecorder = 0xafa,
+ SCIM_KEY_phonographcopyright = 0xafb,
+ SCIM_KEY_caret = 0xafc,
+ SCIM_KEY_singlelowquotemark = 0xafd,
+ SCIM_KEY_doublelowquotemark = 0xafe,
+ SCIM_KEY_cursor = 0xaff,
+
+ /*
+ * APL
+ * Byte 3 = b
+ */
+ SCIM_KEY_leftcaret = 0xba3,
+ SCIM_KEY_rightcaret = 0xba6,
+ SCIM_KEY_downcaret = 0xba8,
+ SCIM_KEY_upcaret = 0xba9,
+ SCIM_KEY_overbar = 0xbc0,
+ SCIM_KEY_downtack = 0xbc2,
+ SCIM_KEY_upshoe = 0xbc3,
+ SCIM_KEY_downstile = 0xbc4,
+ SCIM_KEY_underbar = 0xbc6,
+ SCIM_KEY_jot = 0xbca,
+ SCIM_KEY_quad = 0xbcc,
+ SCIM_KEY_uptack = 0xbce,
+ SCIM_KEY_circle = 0xbcf,
+ SCIM_KEY_upstile = 0xbd3,
+ SCIM_KEY_downshoe = 0xbd6,
+ SCIM_KEY_rightshoe = 0xbd8,
+ SCIM_KEY_leftshoe = 0xbda,
+ SCIM_KEY_lefttack = 0xbdc,
+ SCIM_KEY_righttack = 0xbfc,
+
+ /*
+ * Hebrew
+ * Byte 3 = c
+ */
+ SCIM_KEY_hebrew_doublelowline = 0xcdf,
+ SCIM_KEY_hebrew_aleph = 0xce0,
+ SCIM_KEY_hebrew_bet = 0xce1,
+ SCIM_KEY_hebrew_beth = 0xce1, /* deprecated */
+ SCIM_KEY_hebrew_gimel = 0xce2,
+ SCIM_KEY_hebrew_gimmel = 0xce2, /* deprecated */
+ SCIM_KEY_hebrew_dalet = 0xce3,
+ SCIM_KEY_hebrew_daleth = 0xce3, /* deprecated */
+ SCIM_KEY_hebrew_he = 0xce4,
+ SCIM_KEY_hebrew_waw = 0xce5,
+ SCIM_KEY_hebrew_zain = 0xce6,
+ SCIM_KEY_hebrew_zayin = 0xce6, /* deprecated */
+ SCIM_KEY_hebrew_chet = 0xce7,
+ SCIM_KEY_hebrew_het = 0xce7, /* deprecated */
+ SCIM_KEY_hebrew_tet = 0xce8,
+ SCIM_KEY_hebrew_teth = 0xce8, /* deprecated */
+ SCIM_KEY_hebrew_yod = 0xce9,
+ SCIM_KEY_hebrew_finalkaph = 0xcea,
+ SCIM_KEY_hebrew_kaph = 0xceb,
+ SCIM_KEY_hebrew_lamed = 0xcec,
+ SCIM_KEY_hebrew_finalmem = 0xced,
+ SCIM_KEY_hebrew_mem = 0xcee,
+ SCIM_KEY_hebrew_finalnun = 0xcef,
+ SCIM_KEY_hebrew_nun = 0xcf0,
+ SCIM_KEY_hebrew_samech = 0xcf1,
+ SCIM_KEY_hebrew_samekh = 0xcf1, /* deprecated */
+ SCIM_KEY_hebrew_ayin = 0xcf2,
+ SCIM_KEY_hebrew_finalpe = 0xcf3,
+ SCIM_KEY_hebrew_pe = 0xcf4,
+ SCIM_KEY_hebrew_finalzade = 0xcf5,
+ SCIM_KEY_hebrew_finalzadi = 0xcf5, /* deprecated */
+ SCIM_KEY_hebrew_zade = 0xcf6,
+ SCIM_KEY_hebrew_zadi = 0xcf6, /* deprecated */
+ SCIM_KEY_hebrew_qoph = 0xcf7,
+ SCIM_KEY_hebrew_kuf = 0xcf7, /* deprecated */
+ SCIM_KEY_hebrew_resh = 0xcf8,
+ SCIM_KEY_hebrew_shin = 0xcf9,
+ SCIM_KEY_hebrew_taw = 0xcfa,
+ SCIM_KEY_hebrew_taf = 0xcfa, /* deprecated */
+ SCIM_KEY_Hebrew_switch = 0xFF7E, /* Alias for mode_switch */
+
+ /*
+ * Thai
+ * Byte 3 = d
+ */
+ SCIM_KEY_Thai_kokai = 0xda1,
+ SCIM_KEY_Thai_khokhai = 0xda2,
+ SCIM_KEY_Thai_khokhuat = 0xda3,
+ SCIM_KEY_Thai_khokhwai = 0xda4,
+ SCIM_KEY_Thai_khokhon = 0xda5,
+ SCIM_KEY_Thai_khorakhang = 0xda6,
+ SCIM_KEY_Thai_ngongu = 0xda7,
+ SCIM_KEY_Thai_chochan = 0xda8,
+ SCIM_KEY_Thai_choching = 0xda9,
+ SCIM_KEY_Thai_chochang = 0xdaa,
+ SCIM_KEY_Thai_soso = 0xdab,
+ SCIM_KEY_Thai_chochoe = 0xdac,
+ SCIM_KEY_Thai_yoying = 0xdad,
+ SCIM_KEY_Thai_dochada = 0xdae,
+ SCIM_KEY_Thai_topatak = 0xdaf,
+ SCIM_KEY_Thai_thothan = 0xdb0,
+ SCIM_KEY_Thai_thonangmontho = 0xdb1,
+ SCIM_KEY_Thai_thophuthao = 0xdb2,
+ SCIM_KEY_Thai_nonen = 0xdb3,
+ SCIM_KEY_Thai_dodek = 0xdb4,
+ SCIM_KEY_Thai_totao = 0xdb5,
+ SCIM_KEY_Thai_thothung = 0xdb6,
+ SCIM_KEY_Thai_thothahan = 0xdb7,
+ SCIM_KEY_Thai_thothong = 0xdb8,
+ SCIM_KEY_Thai_nonu = 0xdb9,
+ SCIM_KEY_Thai_bobaimai = 0xdba,
+ SCIM_KEY_Thai_popla = 0xdbb,
+ SCIM_KEY_Thai_phophung = 0xdbc,
+ SCIM_KEY_Thai_fofa = 0xdbd,
+ SCIM_KEY_Thai_phophan = 0xdbe,
+ SCIM_KEY_Thai_fofan = 0xdbf,
+ SCIM_KEY_Thai_phosamphao = 0xdc0,
+ SCIM_KEY_Thai_moma = 0xdc1,
+ SCIM_KEY_Thai_yoyak = 0xdc2,
+ SCIM_KEY_Thai_rorua = 0xdc3,
+ SCIM_KEY_Thai_ru = 0xdc4,
+ SCIM_KEY_Thai_loling = 0xdc5,
+ SCIM_KEY_Thai_lu = 0xdc6,
+ SCIM_KEY_Thai_wowaen = 0xdc7,
+ SCIM_KEY_Thai_sosala = 0xdc8,
+ SCIM_KEY_Thai_sorusi = 0xdc9,
+ SCIM_KEY_Thai_sosua = 0xdca,
+ SCIM_KEY_Thai_hohip = 0xdcb,
+ SCIM_KEY_Thai_lochula = 0xdcc,
+ SCIM_KEY_Thai_oang = 0xdcd,
+ SCIM_KEY_Thai_honokhuk = 0xdce,
+ SCIM_KEY_Thai_paiyannoi = 0xdcf,
+ SCIM_KEY_Thai_saraa = 0xdd0,
+ SCIM_KEY_Thai_maihanakat = 0xdd1,
+ SCIM_KEY_Thai_saraaa = 0xdd2,
+ SCIM_KEY_Thai_saraam = 0xdd3,
+ SCIM_KEY_Thai_sarai = 0xdd4,
+ SCIM_KEY_Thai_saraii = 0xdd5,
+ SCIM_KEY_Thai_saraue = 0xdd6,
+ SCIM_KEY_Thai_sarauee = 0xdd7,
+ SCIM_KEY_Thai_sarau = 0xdd8,
+ SCIM_KEY_Thai_sarauu = 0xdd9,
+ SCIM_KEY_Thai_phinthu = 0xdda,
+ SCIM_KEY_Thai_maihanakat_maitho = 0xdde,
+ SCIM_KEY_Thai_baht = 0xddf,
+ SCIM_KEY_Thai_sarae = 0xde0,
+ SCIM_KEY_Thai_saraae = 0xde1,
+ SCIM_KEY_Thai_sarao = 0xde2,
+ SCIM_KEY_Thai_saraaimaimuan = 0xde3,
+ SCIM_KEY_Thai_saraaimaimalai = 0xde4,
+ SCIM_KEY_Thai_lakkhangyao = 0xde5,
+ SCIM_KEY_Thai_maiyamok = 0xde6,
+ SCIM_KEY_Thai_maitaikhu = 0xde7,
+ SCIM_KEY_Thai_maiek = 0xde8,
+ SCIM_KEY_Thai_maitho = 0xde9,
+ SCIM_KEY_Thai_maitri = 0xdea,
+ SCIM_KEY_Thai_maichattawa = 0xdeb,
+ SCIM_KEY_Thai_thanthakhat = 0xdec,
+ SCIM_KEY_Thai_nikhahit = 0xded,
+ SCIM_KEY_Thai_leksun = 0xdf0,
+ SCIM_KEY_Thai_leknung = 0xdf1,
+ SCIM_KEY_Thai_leksong = 0xdf2,
+ SCIM_KEY_Thai_leksam = 0xdf3,
+ SCIM_KEY_Thai_leksi = 0xdf4,
+ SCIM_KEY_Thai_lekha = 0xdf5,
+ SCIM_KEY_Thai_lekhok = 0xdf6,
+ SCIM_KEY_Thai_lekchet = 0xdf7,
+ SCIM_KEY_Thai_lekpaet = 0xdf8,
+ SCIM_KEY_Thai_lekkao = 0xdf9,
+
+ /*
+ * Korean
+ * Byte 3 = e
+ */
+ SCIM_KEY_Hangul = 0xff31, /* Hangul start/stop(toggle) */
+ SCIM_KEY_Hangul_Start = 0xff32, /* Hangul start */
+ SCIM_KEY_Hangul_End = 0xff33, /* Hangul end, English start */
+ SCIM_KEY_Hangul_Hanja = 0xff34, /* Start Hangul->Hanja Conversion */
+ SCIM_KEY_Hangul_Jamo = 0xff35, /* Hangul Jamo mode */
+ SCIM_KEY_Hangul_Romaja = 0xff36, /* Hangul Romaja mode */
+ SCIM_KEY_Hangul_Codeinput = 0xff37, /* Hangul code input mode */
+ SCIM_KEY_Hangul_Jeonja = 0xff38, /* Jeonja mode */
+ SCIM_KEY_Hangul_Banja = 0xff39, /* Banja mode */
+ SCIM_KEY_Hangul_PreHanja = 0xff3a, /* Pre Hanja conversion */
+ SCIM_KEY_Hangul_PostHanja = 0xff3b, /* Post Hanja conversion */
+ SCIM_KEY_Hangul_SingleCandidate = 0xff3c, /* Single candidate */
+ SCIM_KEY_Hangul_MultipleCandidate = 0xff3d, /* Multiple candidate */
+ SCIM_KEY_Hangul_PreviousCandidate = 0xff3e, /* Previous candidate */
+ SCIM_KEY_Hangul_Special = 0xff3f, /* Special symbols */
+ SCIM_KEY_Hangul_switch = 0xFF7E, /* Alias for mode_switch */
+
+ /* Hangul Consonant Characters */
+ SCIM_KEY_Hangul_Kiyeog = 0xea1,
+ SCIM_KEY_Hangul_SsangKiyeog = 0xea2,
+ SCIM_KEY_Hangul_KiyeogSios = 0xea3,
+ SCIM_KEY_Hangul_Nieun = 0xea4,
+ SCIM_KEY_Hangul_NieunJieuj = 0xea5,
+ SCIM_KEY_Hangul_NieunHieuh = 0xea6,
+ SCIM_KEY_Hangul_Dikeud = 0xea7,
+ SCIM_KEY_Hangul_SsangDikeud = 0xea8,
+ SCIM_KEY_Hangul_Rieul = 0xea9,
+ SCIM_KEY_Hangul_RieulKiyeog = 0xeaa,
+ SCIM_KEY_Hangul_RieulMieum = 0xeab,
+ SCIM_KEY_Hangul_RieulPieub = 0xeac,
+ SCIM_KEY_Hangul_RieulSios = 0xead,
+ SCIM_KEY_Hangul_RieulTieut = 0xeae,
+ SCIM_KEY_Hangul_RieulPhieuf = 0xeaf,
+ SCIM_KEY_Hangul_RieulHieuh = 0xeb0,
+ SCIM_KEY_Hangul_Mieum = 0xeb1,
+ SCIM_KEY_Hangul_Pieub = 0xeb2,
+ SCIM_KEY_Hangul_SsangPieub = 0xeb3,
+ SCIM_KEY_Hangul_PieubSios = 0xeb4,
+ SCIM_KEY_Hangul_Sios = 0xeb5,
+ SCIM_KEY_Hangul_SsangSios = 0xeb6,
+ SCIM_KEY_Hangul_Ieung = 0xeb7,
+ SCIM_KEY_Hangul_Jieuj = 0xeb8,
+ SCIM_KEY_Hangul_SsangJieuj = 0xeb9,
+ SCIM_KEY_Hangul_Cieuc = 0xeba,
+ SCIM_KEY_Hangul_Khieuq = 0xebb,
+ SCIM_KEY_Hangul_Tieut = 0xebc,
+ SCIM_KEY_Hangul_Phieuf = 0xebd,
+ SCIM_KEY_Hangul_Hieuh = 0xebe,
+
+ /* Hangul Vowel Characters */
+ SCIM_KEY_Hangul_A = 0xebf,
+ SCIM_KEY_Hangul_AE = 0xec0,
+ SCIM_KEY_Hangul_YA = 0xec1,
+ SCIM_KEY_Hangul_YAE = 0xec2,
+ SCIM_KEY_Hangul_EO = 0xec3,
+ SCIM_KEY_Hangul_E = 0xec4,
+ SCIM_KEY_Hangul_YEO = 0xec5,
+ SCIM_KEY_Hangul_YE = 0xec6,
+ SCIM_KEY_Hangul_O = 0xec7,
+ SCIM_KEY_Hangul_WA = 0xec8,
+ SCIM_KEY_Hangul_WAE = 0xec9,
+ SCIM_KEY_Hangul_OE = 0xeca,
+ SCIM_KEY_Hangul_YO = 0xecb,
+ SCIM_KEY_Hangul_U = 0xecc,
+ SCIM_KEY_Hangul_WEO = 0xecd,
+ SCIM_KEY_Hangul_WE = 0xece,
+ SCIM_KEY_Hangul_WI = 0xecf,
+ SCIM_KEY_Hangul_YU = 0xed0,
+ SCIM_KEY_Hangul_EU = 0xed1,
+ SCIM_KEY_Hangul_YI = 0xed2,
+ SCIM_KEY_Hangul_I = 0xed3,
+
+ /* Hangul syllable-final (JongSeong) Characters */
+ SCIM_KEY_Hangul_J_Kiyeog = 0xed4,
+ SCIM_KEY_Hangul_J_SsangKiyeog = 0xed5,
+ SCIM_KEY_Hangul_J_KiyeogSios = 0xed6,
+ SCIM_KEY_Hangul_J_Nieun = 0xed7,
+ SCIM_KEY_Hangul_J_NieunJieuj = 0xed8,
+ SCIM_KEY_Hangul_J_NieunHieuh = 0xed9,
+ SCIM_KEY_Hangul_J_Dikeud = 0xeda,
+ SCIM_KEY_Hangul_J_Rieul = 0xedb,
+ SCIM_KEY_Hangul_J_RieulKiyeog = 0xedc,
+ SCIM_KEY_Hangul_J_RieulMieum = 0xedd,
+ SCIM_KEY_Hangul_J_RieulPieub = 0xede,
+ SCIM_KEY_Hangul_J_RieulSios = 0xedf,
+ SCIM_KEY_Hangul_J_RieulTieut = 0xee0,
+ SCIM_KEY_Hangul_J_RieulPhieuf = 0xee1,
+ SCIM_KEY_Hangul_J_RieulHieuh = 0xee2,
+ SCIM_KEY_Hangul_J_Mieum = 0xee3,
+ SCIM_KEY_Hangul_J_Pieub = 0xee4,
+ SCIM_KEY_Hangul_J_PieubSios = 0xee5,
+ SCIM_KEY_Hangul_J_Sios = 0xee6,
+ SCIM_KEY_Hangul_J_SsangSios = 0xee7,
+ SCIM_KEY_Hangul_J_Ieung = 0xee8,
+ SCIM_KEY_Hangul_J_Jieuj = 0xee9,
+ SCIM_KEY_Hangul_J_Cieuc = 0xeea,
+ SCIM_KEY_Hangul_J_Khieuq = 0xeeb,
+ SCIM_KEY_Hangul_J_Tieut = 0xeec,
+ SCIM_KEY_Hangul_J_Phieuf = 0xeed,
+ SCIM_KEY_Hangul_J_Hieuh = 0xeee,
+
+ /* Ancient Hangul Consonant Characters */
+ SCIM_KEY_Hangul_RieulYeorinHieuh = 0xeef,
+ SCIM_KEY_Hangul_SunkyeongeumMieum = 0xef0,
+ SCIM_KEY_Hangul_SunkyeongeumPieub = 0xef1,
+ SCIM_KEY_Hangul_PanSios = 0xef2,
+ SCIM_KEY_Hangul_KkogjiDalrinIeung = 0xef3,
+ SCIM_KEY_Hangul_SunkyeongeumPhieuf = 0xef4,
+ SCIM_KEY_Hangul_YeorinHieuh = 0xef5,
+
+ /* Ancient Hangul Vowel Characters */
+ SCIM_KEY_Hangul_AraeA = 0xef6,
+ SCIM_KEY_Hangul_AraeAE = 0xef7,
+
+ /* Ancient Hangul syllable-final (JongSeong) Characters */
+ SCIM_KEY_Hangul_J_PanSios = 0xef8,
+ SCIM_KEY_Hangul_J_KkogjiDalrinIeung = 0xef9,
+ SCIM_KEY_Hangul_J_YeorinHieuh = 0xefa,
+
+ /* Korean currency symbol */
+ SCIM_KEY_Korean_Won = 0xeff,
+
+
+ /*
+ * Armenian
+ * Byte 3 = 0x14
+ */
+ SCIM_KEY_Armenian_eternity = 0x14a1,
+ SCIM_KEY_Armenian_ligature_ew = 0x14a2,
+ SCIM_KEY_Armenian_full_stop = 0x14a3,
+ SCIM_KEY_Armenian_verjaket = 0x14a3,
+ SCIM_KEY_Armenian_parenright = 0x14a4,
+ SCIM_KEY_Armenian_parenleft = 0x14a5,
+ SCIM_KEY_Armenian_guillemotright = 0x14a6,
+ SCIM_KEY_Armenian_guillemotleft = 0x14a7,
+ SCIM_KEY_Armenian_em_dash = 0x14a8,
+ SCIM_KEY_Armenian_dot = 0x14a9,
+ SCIM_KEY_Armenian_mijaket = 0x14a9,
+ SCIM_KEY_Armenian_separation_mark = 0x14aa,
+ SCIM_KEY_Armenian_but = 0x14aa,
+ SCIM_KEY_Armenian_comma = 0x14ab,
+ SCIM_KEY_Armenian_en_dash = 0x14ac,
+ SCIM_KEY_Armenian_hyphen = 0x14ad,
+ SCIM_KEY_Armenian_yentamna = 0x14ad,
+ SCIM_KEY_Armenian_ellipsis = 0x14ae,
+ SCIM_KEY_Armenian_exclam = 0x14af,
+ SCIM_KEY_Armenian_amanak = 0x14af,
+ SCIM_KEY_Armenian_accent = 0x14b0,
+ SCIM_KEY_Armenian_shesht = 0x14b0,
+ SCIM_KEY_Armenian_question = 0x14b1,
+ SCIM_KEY_Armenian_paruyk = 0x14b1,
+ SCIM_KEY_Armenian_AYB = 0x14b2,
+ SCIM_KEY_Armenian_ayb = 0x14b3,
+ SCIM_KEY_Armenian_BEN = 0x14b4,
+ SCIM_KEY_Armenian_ben = 0x14b5,
+ SCIM_KEY_Armenian_GIM = 0x14b6,
+ SCIM_KEY_Armenian_gim = 0x14b7,
+ SCIM_KEY_Armenian_DA = 0x14b8,
+ SCIM_KEY_Armenian_da = 0x14b9,
+ SCIM_KEY_Armenian_YECH = 0x14ba,
+ SCIM_KEY_Armenian_yech = 0x14bb,
+ SCIM_KEY_Armenian_ZA = 0x14bc,
+ SCIM_KEY_Armenian_za = 0x14bd,
+ SCIM_KEY_Armenian_E = 0x14be,
+ SCIM_KEY_Armenian_e = 0x14bf,
+ SCIM_KEY_Armenian_AT = 0x14c0,
+ SCIM_KEY_Armenian_at = 0x14c1,
+ SCIM_KEY_Armenian_TO = 0x14c2,
+ SCIM_KEY_Armenian_to = 0x14c3,
+ SCIM_KEY_Armenian_ZHE = 0x14c4,
+ SCIM_KEY_Armenian_zhe = 0x14c5,
+ SCIM_KEY_Armenian_INI = 0x14c6,
+ SCIM_KEY_Armenian_ini = 0x14c7,
+ SCIM_KEY_Armenian_LYUN = 0x14c8,
+ SCIM_KEY_Armenian_lyun = 0x14c9,
+ SCIM_KEY_Armenian_KHE = 0x14ca,
+ SCIM_KEY_Armenian_khe = 0x14cb,
+ SCIM_KEY_Armenian_TSA = 0x14cc,
+ SCIM_KEY_Armenian_tsa = 0x14cd,
+ SCIM_KEY_Armenian_KEN = 0x14ce,
+ SCIM_KEY_Armenian_ken = 0x14cf,
+ SCIM_KEY_Armenian_HO = 0x14d0,
+ SCIM_KEY_Armenian_ho = 0x14d1,
+ SCIM_KEY_Armenian_DZA = 0x14d2,
+ SCIM_KEY_Armenian_dza = 0x14d3,
+ SCIM_KEY_Armenian_GHAT = 0x14d4,
+ SCIM_KEY_Armenian_ghat = 0x14d5,
+ SCIM_KEY_Armenian_TCHE = 0x14d6,
+ SCIM_KEY_Armenian_tche = 0x14d7,
+ SCIM_KEY_Armenian_MEN = 0x14d8,
+ SCIM_KEY_Armenian_men = 0x14d9,
+ SCIM_KEY_Armenian_HI = 0x14da,
+ SCIM_KEY_Armenian_hi = 0x14db,
+ SCIM_KEY_Armenian_NU = 0x14dc,
+ SCIM_KEY_Armenian_nu = 0x14dd,
+ SCIM_KEY_Armenian_SHA = 0x14de,
+ SCIM_KEY_Armenian_sha = 0x14df,
+ SCIM_KEY_Armenian_VO = 0x14e0,
+ SCIM_KEY_Armenian_vo = 0x14e1,
+ SCIM_KEY_Armenian_CHA = 0x14e2,
+ SCIM_KEY_Armenian_cha = 0x14e3,
+ SCIM_KEY_Armenian_PE = 0x14e4,
+ SCIM_KEY_Armenian_pe = 0x14e5,
+ SCIM_KEY_Armenian_JE = 0x14e6,
+ SCIM_KEY_Armenian_je = 0x14e7,
+ SCIM_KEY_Armenian_RA = 0x14e8,
+ SCIM_KEY_Armenian_ra = 0x14e9,
+ SCIM_KEY_Armenian_SE = 0x14ea,
+ SCIM_KEY_Armenian_se = 0x14eb,
+ SCIM_KEY_Armenian_VEV = 0x14ec,
+ SCIM_KEY_Armenian_vev = 0x14ed,
+ SCIM_KEY_Armenian_TYUN = 0x14ee,
+ SCIM_KEY_Armenian_tyun = 0x14ef,
+ SCIM_KEY_Armenian_RE = 0x14f0,
+ SCIM_KEY_Armenian_re = 0x14f1,
+ SCIM_KEY_Armenian_TSO = 0x14f2,
+ SCIM_KEY_Armenian_tso = 0x14f3,
+ SCIM_KEY_Armenian_VYUN = 0x14f4,
+ SCIM_KEY_Armenian_vyun = 0x14f5,
+ SCIM_KEY_Armenian_PYUR = 0x14f6,
+ SCIM_KEY_Armenian_pyur = 0x14f7,
+ SCIM_KEY_Armenian_KE = 0x14f8,
+ SCIM_KEY_Armenian_ke = 0x14f9,
+ SCIM_KEY_Armenian_O = 0x14fa,
+ SCIM_KEY_Armenian_o = 0x14fb,
+ SCIM_KEY_Armenian_FE = 0x14fc,
+ SCIM_KEY_Armenian_fe = 0x14fd,
+ SCIM_KEY_Armenian_apostrophe = 0x14fe,
+ SCIM_KEY_Armenian_section_sign = 0x14ff,
+
+ /*
+ * Georgian
+ * Byte 3 = 0x15
+ */
+
+ SCIM_KEY_Georgian_an = 0x15d0,
+ SCIM_KEY_Georgian_ban = 0x15d1,
+ SCIM_KEY_Georgian_gan = 0x15d2,
+ SCIM_KEY_Georgian_don = 0x15d3,
+ SCIM_KEY_Georgian_en = 0x15d4,
+ SCIM_KEY_Georgian_vin = 0x15d5,
+ SCIM_KEY_Georgian_zen = 0x15d6,
+ SCIM_KEY_Georgian_tan = 0x15d7,
+ SCIM_KEY_Georgian_in = 0x15d8,
+ SCIM_KEY_Georgian_kan = 0x15d9,
+ SCIM_KEY_Georgian_las = 0x15da,
+ SCIM_KEY_Georgian_man = 0x15db,
+ SCIM_KEY_Georgian_nar = 0x15dc,
+ SCIM_KEY_Georgian_on = 0x15dd,
+ SCIM_KEY_Georgian_par = 0x15de,
+ SCIM_KEY_Georgian_zhar = 0x15df,
+ SCIM_KEY_Georgian_rae = 0x15e0,
+ SCIM_KEY_Georgian_san = 0x15e1,
+ SCIM_KEY_Georgian_tar = 0x15e2,
+ SCIM_KEY_Georgian_un = 0x15e3,
+ SCIM_KEY_Georgian_phar = 0x15e4,
+ SCIM_KEY_Georgian_khar = 0x15e5,
+ SCIM_KEY_Georgian_ghan = 0x15e6,
+ SCIM_KEY_Georgian_qar = 0x15e7,
+ SCIM_KEY_Georgian_shin = 0x15e8,
+ SCIM_KEY_Georgian_chin = 0x15e9,
+ SCIM_KEY_Georgian_can = 0x15ea,
+ SCIM_KEY_Georgian_jil = 0x15eb,
+ SCIM_KEY_Georgian_cil = 0x15ec,
+ SCIM_KEY_Georgian_char = 0x15ed,
+ SCIM_KEY_Georgian_xan = 0x15ee,
+ SCIM_KEY_Georgian_jhan = 0x15ef,
+ SCIM_KEY_Georgian_hae = 0x15f0,
+ SCIM_KEY_Georgian_he = 0x15f1,
+ SCIM_KEY_Georgian_hie = 0x15f2,
+ SCIM_KEY_Georgian_we = 0x15f3,
+ SCIM_KEY_Georgian_har = 0x15f4,
+ SCIM_KEY_Georgian_hoe = 0x15f5,
+ SCIM_KEY_Georgian_fi = 0x15f6,
+
+ /*
+ * Azeri (and other Turkic or Caucasian languages of ex-USSR)
+ * Byte 3 = 0x16
+ */
+
+ /* latin */
+ SCIM_KEY_Ccedillaabovedot = 0x16a2,
+ SCIM_KEY_Xabovedot = 0x16a3,
+ SCIM_KEY_Qabovedot = 0x16a5,
+ SCIM_KEY_Ibreve = 0x16a6,
+ SCIM_KEY_IE = 0x16a7,
+ SCIM_KEY_UO = 0x16a8,
+ SCIM_KEY_Zstroke = 0x16a9,
+ SCIM_KEY_Gcaron = 0x16aa,
+ SCIM_KEY_Obarred = 0x16af,
+ SCIM_KEY_ccedillaabovedot = 0x16b2,
+ SCIM_KEY_xabovedot = 0x16b3,
+ SCIM_KEY_Ocaron = 0x16b4,
+ SCIM_KEY_qabovedot = 0x16b5,
+ SCIM_KEY_ibreve = 0x16b6,
+ SCIM_KEY_ie = 0x16b7,
+ SCIM_KEY_uo = 0x16b8,
+ SCIM_KEY_zstroke = 0x16b9,
+ SCIM_KEY_gcaron = 0x16ba,
+ SCIM_KEY_ocaron = 0x16bd,
+ SCIM_KEY_obarred = 0x16bf,
+ SCIM_KEY_SCHWA = 0x16c6,
+ SCIM_KEY_schwa = 0x16f6,
+ /* those are not really Caucasus, but I put them here for now */
+ /* For Inupiak */
+ SCIM_KEY_Lbelowdot = 0x16d1,
+ SCIM_KEY_Lstrokebelowdot = 0x16d2,
+ SCIM_KEY_lbelowdot = 0x16e1,
+ SCIM_KEY_lstrokebelowdot = 0x16e2,
+ /* For Guarani */
+ SCIM_KEY_Gtilde = 0x16d3,
+ SCIM_KEY_gtilde = 0x16e3,
+
+ /*
+ * Vietnamese
+ * Byte 3 = 0x1e
+ */
+
+ SCIM_KEY_Abelowdot = 0x1ea0,
+ SCIM_KEY_abelowdot = 0x1ea1,
+ SCIM_KEY_Ahook = 0x1ea2,
+ SCIM_KEY_ahook = 0x1ea3,
+ SCIM_KEY_Acircumflexacute = 0x1ea4,
+ SCIM_KEY_acircumflexacute = 0x1ea5,
+ SCIM_KEY_Acircumflexgrave = 0x1ea6,
+ SCIM_KEY_acircumflexgrave = 0x1ea7,
+ SCIM_KEY_Acircumflexhook = 0x1ea8,
+ SCIM_KEY_acircumflexhook = 0x1ea9,
+ SCIM_KEY_Acircumflextilde = 0x1eaa,
+ SCIM_KEY_acircumflextilde = 0x1eab,
+ SCIM_KEY_Acircumflexbelowdot = 0x1eac,
+ SCIM_KEY_acircumflexbelowdot = 0x1ead,
+ SCIM_KEY_Abreveacute = 0x1eae,
+ SCIM_KEY_abreveacute = 0x1eaf,
+ SCIM_KEY_Abrevegrave = 0x1eb0,
+ SCIM_KEY_abrevegrave = 0x1eb1,
+ SCIM_KEY_Abrevehook = 0x1eb2,
+ SCIM_KEY_abrevehook = 0x1eb3,
+ SCIM_KEY_Abrevetilde = 0x1eb4,
+ SCIM_KEY_abrevetilde = 0x1eb5,
+ SCIM_KEY_Abrevebelowdot = 0x1eb6,
+ SCIM_KEY_abrevebelowdot = 0x1eb7,
+ SCIM_KEY_Ebelowdot = 0x1eb8,
+ SCIM_KEY_ebelowdot = 0x1eb9,
+ SCIM_KEY_Ehook = 0x1eba,
+ SCIM_KEY_ehook = 0x1ebb,
+ SCIM_KEY_Etilde = 0x1ebc,
+ SCIM_KEY_etilde = 0x1ebd,
+ SCIM_KEY_Ecircumflexacute = 0x1ebe,
+ SCIM_KEY_ecircumflexacute = 0x1ebf,
+ SCIM_KEY_Ecircumflexgrave = 0x1ec0,
+ SCIM_KEY_ecircumflexgrave = 0x1ec1,
+ SCIM_KEY_Ecircumflexhook = 0x1ec2,
+ SCIM_KEY_ecircumflexhook = 0x1ec3,
+ SCIM_KEY_Ecircumflextilde = 0x1ec4,
+ SCIM_KEY_ecircumflextilde = 0x1ec5,
+ SCIM_KEY_Ecircumflexbelowdot = 0x1ec6,
+ SCIM_KEY_ecircumflexbelowdot = 0x1ec7,
+ SCIM_KEY_Ihook = 0x1ec8,
+ SCIM_KEY_ihook = 0x1ec9,
+ SCIM_KEY_Ibelowdot = 0x1eca,
+ SCIM_KEY_ibelowdot = 0x1ecb,
+ SCIM_KEY_Obelowdot = 0x1ecc,
+ SCIM_KEY_obelowdot = 0x1ecd,
+ SCIM_KEY_Ohook = 0x1ece,
+ SCIM_KEY_ohook = 0x1ecf,
+ SCIM_KEY_Ocircumflexacute = 0x1ed0,
+ SCIM_KEY_ocircumflexacute = 0x1ed1,
+ SCIM_KEY_Ocircumflexgrave = 0x1ed2,
+ SCIM_KEY_ocircumflexgrave = 0x1ed3,
+ SCIM_KEY_Ocircumflexhook = 0x1ed4,
+ SCIM_KEY_ocircumflexhook = 0x1ed5,
+ SCIM_KEY_Ocircumflextilde = 0x1ed6,
+ SCIM_KEY_ocircumflextilde = 0x1ed7,
+ SCIM_KEY_Ocircumflexbelowdot = 0x1ed8,
+ SCIM_KEY_ocircumflexbelowdot = 0x1ed9,
+ SCIM_KEY_Ohornacute = 0x1eda,
+ SCIM_KEY_ohornacute = 0x1edb,
+ SCIM_KEY_Ohorngrave = 0x1edc,
+ SCIM_KEY_ohorngrave = 0x1edd,
+ SCIM_KEY_Ohornhook = 0x1ede,
+ SCIM_KEY_ohornhook = 0x1edf,
+ SCIM_KEY_Ohorntilde = 0x1ee0,
+ SCIM_KEY_ohorntilde = 0x1ee1,
+ SCIM_KEY_Ohornbelowdot = 0x1ee2,
+ SCIM_KEY_ohornbelowdot = 0x1ee3,
+ SCIM_KEY_Ubelowdot = 0x1ee4,
+ SCIM_KEY_ubelowdot = 0x1ee5,
+ SCIM_KEY_Uhook = 0x1ee6,
+ SCIM_KEY_uhook = 0x1ee7,
+ SCIM_KEY_Uhornacute = 0x1ee8,
+ SCIM_KEY_uhornacute = 0x1ee9,
+ SCIM_KEY_Uhorngrave = 0x1eea,
+ SCIM_KEY_uhorngrave = 0x1eeb,
+ SCIM_KEY_Uhornhook = 0x1eec,
+ SCIM_KEY_uhornhook = 0x1eed,
+ SCIM_KEY_Uhorntilde = 0x1eee,
+ SCIM_KEY_uhorntilde = 0x1eef,
+ SCIM_KEY_Uhornbelowdot = 0x1ef0,
+ SCIM_KEY_uhornbelowdot = 0x1ef1,
+ SCIM_KEY_Ybelowdot = 0x1ef4,
+ SCIM_KEY_ybelowdot = 0x1ef5,
+ SCIM_KEY_Yhook = 0x1ef6,
+ SCIM_KEY_yhook = 0x1ef7,
+ SCIM_KEY_Ytilde = 0x1ef8,
+ SCIM_KEY_ytilde = 0x1ef9,
+ SCIM_KEY_Ohorn = 0x1efa, /* U+01a0 */
+ SCIM_KEY_ohorn = 0x1efb, /* U+01a1 */
+ SCIM_KEY_Uhorn = 0x1efc, /* U+01af */
+ SCIM_KEY_uhorn = 0x1efd, /* U+01b0 */
+
+ SCIM_KEY_combining_tilde = 0x1e9f, /* U+0303 */
+ SCIM_KEY_combining_grave = 0x1ef2, /* U+0300 */
+ SCIM_KEY_combining_acute = 0x1ef3, /* U+0301 */
+ SCIM_KEY_combining_hook = 0x1efe, /* U+0309 */
+ SCIM_KEY_combining_belowdot = 0x1eff, /* U+0323 */
+
+ SCIM_KEY_EcuSign = 0x20a0,
+ SCIM_KEY_ColonSign = 0x20a1,
+ SCIM_KEY_CruzeiroSign = 0x20a2,
+ SCIM_KEY_FFrancSign = 0x20a3,
+ SCIM_KEY_LiraSign = 0x20a4,
+ SCIM_KEY_MillSign = 0x20a5,
+ SCIM_KEY_NairaSign = 0x20a6,
+ SCIM_KEY_PesetaSign = 0x20a7,
+ SCIM_KEY_RupeeSign = 0x20a8,
+ SCIM_KEY_WonSign = 0x20a9,
+ SCIM_KEY_NewSheqelSign = 0x20aa,
+ SCIM_KEY_DongSign = 0x20ab,
+ SCIM_KEY_EuroSign = 0x20ac
+};
+
+/**
+ * @brief Enum values of all valid Keyboard Layout type.
+ *
+ * This types are used by the Keyboard Layout mapping
+ * function of KeyEvent class to map a KeyEvent of a
+ * certain Keyboard Layout to another.
+ *
+ * But this function only covers the key range of
+ * default US PC keyboard. All additional keys
+ * in other layouts will never be mapped.
+ *
+ * The default layout is standard US PC keyboard.
+ *
+ * If the layout of a KeyEvent is Unknown, then it'll never
+ * be mapped.
+ */
+enum KeyboardLayout
+{
+ SCIM_KEYBOARD_Unknown = 0,
+ SCIM_KEYBOARD_Default = 1,
+ SCIM_KEYBOARD_US = 1,
+ SCIM_KEYBOARD_Belgian = 2,
+ SCIM_KEYBOARD_Croatian = 3,
+ SCIM_KEYBOARD_Czech = 4,
+ SCIM_KEYBOARD_Czech_Qwerty = 5,
+ SCIM_KEYBOARD_Danish = 6,
+ SCIM_KEYBOARD_Dutch = 7,
+ SCIM_KEYBOARD_Dvorak = 8,
+ SCIM_KEYBOARD_Estonian = 9,
+ SCIM_KEYBOARD_Finnish = 10,
+ SCIM_KEYBOARD_French = 11,
+ SCIM_KEYBOARD_French_Canadian = 12,
+ SCIM_KEYBOARD_French_Switzerland = 13,
+ SCIM_KEYBOARD_German = 14,
+ SCIM_KEYBOARD_German_Deadkeys = 15,
+ SCIM_KEYBOARD_German_Swiss = 16,
+ SCIM_KEYBOARD_Greek = 17,
+ SCIM_KEYBOARD_Hungarian = 18,
+ SCIM_KEYBOARD_Italian = 19,
+ SCIM_KEYBOARD_Japanese = 20,
+ SCIM_KEYBOARD_Norwegian = 21,
+ SCIM_KEYBOARD_Polish = 22,
+ SCIM_KEYBOARD_Portuguese = 23,
+ SCIM_KEYBOARD_Portuguese_Brazil = 24,
+ SCIM_KEYBOARD_Portuguese_Brazil_US_Accents = 25,
+ SCIM_KEYBOARD_Russian = 26,
+ SCIM_KEYBOARD_Slovak = 27,
+ SCIM_KEYBOARD_Slovak_Qwerty = 28,
+ SCIM_KEYBOARD_Slovene = 29,
+ SCIM_KEYBOARD_Spanish = 30,
+ SCIM_KEYBOARD_Spanish_CP850 = 31,
+ SCIM_KEYBOARD_Spanish_Latin_America = 32,
+ SCIM_KEYBOARD_Swedish = 33,
+ SCIM_KEYBOARD_Turkish = 34,
+ SCIM_KEYBOARD_UK = 35,
+ SCIM_KEYBOARD_Icelandic = 36,
+ SCIM_KEYBOARD_Lithuanian = 37,
+ SCIM_KEYBOARD_Ukrainian = 38,
+ SCIM_KEYBOARD_NUM_LAYOUTS = 39
+};
+
+struct KeyEvent;
+
+/**
+ * @typedef typedef std::vector<KeyEvent> KeyEventList
+ * @brief The container to store a set of KeyEvent objects.
+ *
+ * You should use the STL container methods to manipulate its objects.
+ */
+typedef std::vector<KeyEvent> KeyEventList;
+
+/**
+ * @brief Convert a key event to a string.
+ * @param str - the result string will be stored here.
+ * @param key - the KeyEvent to be converted.
+ * @return true if success.
+ */
+bool scim_key_to_string (String &str, const KeyEvent & key);
+
+/**
+ * @brief Convert a string to a KeyEvent.
+ * @param key - the result KeyEvent will be stored here.
+ * @param str - the string to be converted.
+ * @return true if success.
+ */
+bool scim_string_to_key (KeyEvent &key, const String & str);
+
+/**
+ * @brief Convert a set of KeyEvents to a string.
+ * @param str - the result string will be stored here.
+ * @param keylist - the keys to be converted.
+ * @return true if success.
+ */
+bool scim_key_list_to_string (String &str, const KeyEventList & keylist);
+
+/**
+ * @brief Covnert a string to a set of KeyEvents.
+ * @param keylist - the result KeyEvents will be stored here.
+ * @param str - the string to be converted.
+ * @return true if success.
+ */
+bool scim_string_to_key_list (KeyEventList &keylist, const String &str);
+
+/**
+ * @brief Convert a Keyboard Layout enum value to its String name.
+ * @param layout The Keyboard Layout type.
+ * @return The name of this layout.
+ */
+String scim_keyboard_layout_to_string (KeyboardLayout layout);
+
+/**
+ * @brief Convert a String name to the corresponding Keyboard Layout value.
+ * @param str The Keyboard Layout name.
+ * @return The Keyboard Layout type corresponding to this name, or SCIM_KEYBOARD_Unknown.
+ */
+KeyboardLayout scim_string_to_keyboard_layout (const String &str);
+
+/**
+ * @brief Get the display name of a Keyboard Layout enum value.
+ * @param layout The Keyboard Layout type.
+ * @return The localized display name of this layout.
+ */
+String scim_keyboard_layout_get_display_name (KeyboardLayout layout);
+
+/**
+ * @brief Get default Keyboard Layout setting.
+ *
+ * This function return the Keyboard Layout setting stored
+ * in global config repository as /DefaultKeyboardLayout key.
+ *
+ * This function is mainly used by FrontEnds and Setup tools.
+ * IMEngines should not use it.
+ */
+KeyboardLayout scim_get_default_keyboard_layout ();
+
+/**
+ * @brief Change the default Keyboard Layout setting.
+ *
+ * The default layout setting will be stored in global config
+ * repository as /DefaultKeyboardLayout key.
+ *
+ * This function is mainly used by FrontEnds and Setup tools.
+ * IMEngines should not use it.
+ */
+void scim_set_default_keyboard_layout (KeyboardLayout layout);
+
+/**
+ * @brief The class to store a keyboard event.
+ *
+ * A keyboard event contains a key code and a set of key masks.
+ * The key masks indicate which modifier keys are pressed down and
+ * if it's a key release event.
+ *
+ * It also contains the Keyboard Layout information. IMEngines can
+ * map a KeyEvent to another layout by calling method #map_to_layout().
+ */
+struct KeyEvent
+{
+ uint32 code; /**< key code */
+ uint16 mask; /**< modifier keys' mask */
+ uint16 layout; /**< keyboard layout identifier */
+
+ /**
+ * @brief Default constructor.
+ * @param c - the key code.
+ * @param m - the key masks.
+ * @param l - the keyboard layout
+ */
+ KeyEvent (uint32 c = 0, uint16 m = 0, uint16 l = 0)
+ : code (c), mask (m), layout (l) { }
+
+ /**
+ * @brief Constructor, construct a key event from a string.
+ *
+ * @param str the key string, eg. "Control+space"
+ */
+ KeyEvent (const String &str)
+ : code (0), mask (0), layout (0) { scim_string_to_key (*this, str); }
+
+ /**
+ * @brief Check if this KeyEvent is empty.
+ * @return true if this is a empty event.
+ */
+ bool empty () const { return mask == 0 && code == 0; }
+
+ /**
+ * @brief Get the ascii code of this key event.
+ *
+ * Not all key events have ascii codes.
+ *
+ * @return the ascii code of this key event.
+ * Zero means no ascii code.
+ */
+ char get_ascii_code () const;
+
+ /**
+ * @brief Get the Unicode code of this key event.
+ *
+ * Not all key events have unicode codes.
+ *
+ * @return The Unicode code of this key event.
+ * Zero means no unicode code.
+ */
+ ucs4_t get_unicode_code () const;
+
+ /**
+ * @brief Get the string of this key event.
+ *
+ * Not all key events can be converted to string.
+ *
+ * @return The string of this key event.
+ */
+ String get_key_string () const;
+
+ /**
+ * @brief Map this KeyEvent to another Keyboard Layout.
+ *
+ * This function only covers the key range of
+ * default US PC keyboard. All additional keys
+ * in other layouts will never be mapped.
+ *
+ * If the current layout is Unknown or the new_layout is
+ * invalid or it's an Unicode embedded KeyEvent,
+ * then it'll not be mapped and the identical KeyEvent
+ * will be returned.
+ *
+ * If you want to check if the mapping is successful,
+ * just compare the layout of returned KeyEvent and new_layout
+ * to see if they are equal.
+ *
+ * @param new_layout The Keyboard Layout to be mapped to.
+ *
+ * @return The new KeyEvent according to the given layout.
+ */
+ KeyEvent map_to_layout (KeyboardLayout new_layout) const;
+
+ /**
+ * @brief Check if the Shift key is pressed down.
+ */
+ bool is_shift_down () const { return (mask & SCIM_KEY_ShiftMask) != 0; }
+
+ /**
+ * @brief Check if the CapsLock key is pressed down.
+ */
+ bool is_caps_lock_down () const { return (mask & SCIM_KEY_CapsLockMask) != 0; }
+
+ /**
+ * @brief Check if the Ctrl key is pressed down.
+ */
+ bool is_control_down () const { return (mask & SCIM_KEY_ControlMask) != 0; }
+
+ /**
+ * @brief Check if the Alt key is pressed down.
+ */
+ bool is_alt_down () const { return (mask & SCIM_KEY_AltMask) != 0; }
+
+ /**
+ * @brief Check if the Meta key is pressed down.
+ */
+ bool is_meta_down () const { return (mask & SCIM_KEY_MetaMask) != 0; }
+
+ /**
+ * @brief Check if the Super key is pressed down.
+ */
+ bool is_super_down () const { return (mask & SCIM_KEY_SuperMask) != 0; }
+
+ /**
+ * @brief Check if the Hyper key is pressed down.
+ */
+ bool is_hyper_down () const { return (mask & SCIM_KEY_HyperMask) != 0; }
+
+ /**
+ * @brief Check if the num lock key is pressed down.
+ */
+ bool is_num_lock_down () const { return (mask & SCIM_KEY_NumLockMask) != 0; }
+
+ /**
+ * @brief Check if it's a key press event.
+ */
+ bool is_key_press () const { return (mask & SCIM_KEY_ReleaseMask) == 0; }
+
+ /**
+ * @brief Check if it's a key release event.
+ */
+ bool is_key_release () const { return (mask & SCIM_KEY_ReleaseMask) != 0; }
+
+ /**
+ * @brief Compare two key events.
+ * @return true if they are equal.
+ */
+ bool operator == (const KeyEvent & key) const {
+ return code == key.code && mask == key.mask;
+ }
+
+ /**
+ * @brief Compare two key events.
+ * @return true if they are not equal.
+ */
+ bool operator != (const KeyEvent & key) const {
+ return code != key.code || mask != key.mask;
+ }
+
+ /**
+ * @brief Compare two key events.
+ *
+ * This operator is mainly for sorting.
+ *
+ * @return true if the first is smaller.
+ */
+ bool operator < (const KeyEvent & key) const {
+ return code < key.code || (code == key.code && mask < key.mask);
+ }
+
+
+ /**
+ * @brief Check if the lock key is pressed down.
+ *
+ * For backward API compatibility, do not use it in new code.
+ */
+ bool is_lock_down () const { return (mask & SCIM_KEY_LockMask) != 0; }
+
+ /**
+ * @brief Check if the mod1 key is pressed down.
+ *
+ * For backward API compatibility, do not use it in new code.
+ */
+ bool is_mod1_down () const { return (mask & SCIM_KEY_Mod1Mask) != 0; }
+
+ /**
+ * @brief Check if the mod2 key is pressed down.
+ *
+ * For backward API compatibility, do not use it in new code.
+ */
+ bool is_mod2_down () const { return (mask & SCIM_KEY_Mod2Mask) != 0; }
+
+ /**
+ * @brief Check if the mod3 key is pressed down.
+ *
+ * For backward API compatibility, do not use it in new code.
+ */
+ bool is_mod3_down () const { return (mask & SCIM_KEY_Mod3Mask) != 0; }
+
+ /**
+ * @brief Check if the mod4 key is pressed down.
+ *
+ * For backward API compatibility, do not use it in new code.
+ */
+ bool is_mod4_down () const { return (mask & SCIM_KEY_Mod4Mask) != 0; }
+
+ /**
+ * @brief Check if the mod5 key is pressed down.
+ *
+ * For backward API compatibility, do not use it in new code.
+ */
+ bool is_mod5_down () const { return (mask & SCIM_KEY_Mod5Mask) != 0; }
+
+ /**
+ * @brief Check if the scroll lock key is pressed down.
+ *
+ * For backward API compatibility, do not use it in new code.
+ */
+ bool is_scroll_lock_down () const { return (mask & SCIM_KEY_ScrollLockMask) != 0; }
+
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_EVENT_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/**
+ * @file scim_exception.h
+ * @brief Defines the scim::Exception class.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_exception.h,v 1.10 2005/01/10 08:30:53 suzhe Exp $
+ */
+
+#ifndef __SCIM_EXCEPTION_H
+#define __SCIM_EXCEPTION_H
+
+namespace scim {
+/**
+ * @addtogroup Accessories
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+/**
+ * @brief A base class of all other exception classes.
+ *
+ * All other exception classes in namespace scim
+ * should be derived from this class.
+ */
+class Exception: public std::exception
+{
+ String m_what;
+public:
+ Exception (const String& what_arg) : m_what (what_arg) { }
+ ~Exception () throw () {}
+ virtual const char* what () const throw () { return m_what.c_str (); }
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_EXCEPTION_H
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_filter.cpp
+ * @brief Implementation of class FilterFactoryBase and FilterInstanceBase.
+ */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_filter.cpp,v 1.4 2005/05/16 01:25:46 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_FILTER
+
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+FilterFactoryBase::FilterFactoryBase ()
+{
+}
+
+FilterFactoryBase::~FilterFactoryBase ()
+{
+}
+
+void
+FilterFactoryBase::attach_imengine_factory (const IMEngineFactoryPointer &orig)
+{
+ m_orig = orig;
+
+ if (!m_orig.null ())
+ set_locales (m_orig->get_locales ());
+ else
+ set_locales ("");
+}
+
+WideString
+FilterFactoryBase::get_name () const
+{
+ return m_orig.null () ? WideString () : m_orig->get_name ();
+}
+
+String
+FilterFactoryBase::get_uuid () const
+{
+ return m_orig.null () ? String () : m_orig->get_uuid ();
+}
+
+String
+FilterFactoryBase::get_icon_file () const
+{
+ return m_orig.null () ? String () : m_orig->get_icon_file ();
+}
+
+WideString
+FilterFactoryBase::get_authors () const
+{
+ return m_orig.null () ? WideString () : m_orig->get_authors ();
+}
+
+WideString
+FilterFactoryBase::get_credits () const
+{
+ return m_orig.null () ? WideString () : m_orig->get_credits ();
+}
+
+WideString
+FilterFactoryBase::get_help () const
+{
+ return m_orig.null () ? WideString () : m_orig->get_help ();
+}
+
+String
+FilterFactoryBase::get_language () const
+{
+ return m_orig.null () ? IMEngineFactoryBase::get_language () : m_orig->get_language ();
+}
+
+bool
+FilterFactoryBase::validate_encoding (const String &encoding) const
+{
+ return m_orig.null () ? IMEngineFactoryBase::validate_encoding (encoding) : m_orig->validate_encoding (encoding);
+}
+
+bool
+FilterFactoryBase::validate_locale (const String &locale) const
+{
+ return m_orig.null () ? IMEngineFactoryBase::validate_locale (locale) : m_orig->validate_locale (locale);
+}
+
+WideString
+FilterFactoryBase::inverse_query (const WideString &str)
+{
+ return m_orig.null () ? WideString () : m_orig->inverse_query (str);
+}
+
+IMEngineInstancePointer
+FilterFactoryBase::create_instance (const String& encoding, int id)
+{
+ return m_orig.null () ? IMEngineInstancePointer (0) : m_orig->create_instance (encoding, id);
+}
+
+class FilterInstanceBase::FilterInstanceBaseImpl
+{
+ FilterInstanceBase *m_parent;
+ IMEngineInstancePointer m_orig;
+
+public:
+ FilterInstanceBaseImpl (FilterInstanceBase *parent, const IMEngineInstancePointer &orig)
+ : m_parent (parent),
+ m_orig (orig)
+ {
+ if (!m_orig.null ()) {
+ m_orig->signal_connect_show_preedit_string (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_show_preedit_string));
+ m_orig->signal_connect_show_aux_string (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_show_aux_string));
+ m_orig->signal_connect_show_lookup_table (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_show_lookup_table));
+
+ m_orig->signal_connect_hide_preedit_string (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_hide_preedit_string));
+ m_orig->signal_connect_hide_aux_string (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_hide_aux_string));
+ m_orig->signal_connect_hide_lookup_table (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_hide_lookup_table));
+
+ m_orig->signal_connect_update_preedit_caret (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_update_preedit_caret));
+ m_orig->signal_connect_update_preedit_string (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_update_preedit_string));
+ m_orig->signal_connect_update_aux_string (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_update_aux_string));
+ m_orig->signal_connect_update_lookup_table (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_update_lookup_table));
+
+ m_orig->signal_connect_commit_string (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_commit_string));
+
+ m_orig->signal_connect_forward_key_event (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_forward_key_event));
+
+ m_orig->signal_connect_register_properties (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_register_properties));
+
+ m_orig->signal_connect_update_property (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_update_property));
+
+ m_orig->signal_connect_beep (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_beep));
+
+ m_orig->signal_connect_start_helper (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_start_helper));
+
+ m_orig->signal_connect_stop_helper (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_stop_helper));
+
+ m_orig->signal_connect_send_helper_event (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_send_helper_event));
+
+ m_orig->signal_connect_get_surrounding_text (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_get_surrounding_text));
+
+ m_orig->signal_connect_delete_surrounding_text (
+ slot (this, &FilterInstanceBase::FilterInstanceBaseImpl::slot_delete_surrounding_text));
+ }
+ }
+
+ bool set_encoding (const String &encoding) {
+ return m_orig.null () ? false : m_orig->set_encoding (encoding);
+ }
+
+ bool process_key_event (const KeyEvent &key) {
+ return m_orig.null () ? false : m_orig->process_key_event (key);
+ }
+
+ void move_preedit_caret (unsigned int pos) {
+ if (!m_orig.null ()) m_orig->move_preedit_caret (pos);
+ }
+
+ void select_candidate (unsigned int index) {
+ if (!m_orig.null ()) m_orig->select_candidate (index);
+ }
+
+ void update_lookup_table_page_size (unsigned int page_size) {
+ if (!m_orig.null ()) m_orig->update_lookup_table_page_size (page_size);
+ }
+
+ void lookup_table_page_up () {
+ if (!m_orig.null ()) m_orig->lookup_table_page_up ();
+ }
+
+ void lookup_table_page_down () {
+ if (!m_orig.null ()) m_orig->lookup_table_page_down ();
+ }
+
+ void reset () {
+ if (!m_orig.null ()) m_orig->reset ();
+ }
+
+ void focus_in () {
+ if (!m_orig.null ()) m_orig->focus_in ();
+ }
+
+ void focus_out () {
+ if (!m_orig.null ()) m_orig->focus_out ();
+ }
+
+ void trigger_property (const String &property) {
+ if (!m_orig.null ()) m_orig->trigger_property (property);
+ }
+
+ void process_helper_event (const String &helper_uuid, const Transaction &trans) {
+ if (!m_orig.null ()) m_orig->process_helper_event (helper_uuid, trans);
+ }
+
+ void update_client_capabilities (unsigned int cap) {
+ if (!m_orig.null ()) m_orig->update_client_capabilities (cap);
+ }
+
+private:
+ void slot_show_preedit_string (IMEngineInstanceBase * si) {
+ m_parent->filter_show_preedit_string ();
+ }
+
+ void slot_show_aux_string (IMEngineInstanceBase * si) {
+ m_parent->filter_show_aux_string ();
+ }
+
+ void slot_show_lookup_table (IMEngineInstanceBase * si) {
+ m_parent->filter_show_lookup_table ();
+ }
+
+ void slot_hide_preedit_string (IMEngineInstanceBase * si) {
+ m_parent->filter_hide_preedit_string ();
+ }
+
+ void slot_hide_aux_string (IMEngineInstanceBase * si) {
+ m_parent->filter_hide_aux_string ();
+ }
+
+ void slot_hide_lookup_table (IMEngineInstanceBase * si) {
+ m_parent->filter_hide_lookup_table ();
+ }
+
+ void slot_update_preedit_caret (IMEngineInstanceBase * si, int caret) {
+ m_parent->filter_update_preedit_caret (caret);
+ }
+
+ void slot_update_preedit_string (IMEngineInstanceBase * si, const WideString & str, const AttributeList & attrs) {
+ m_parent->filter_update_preedit_string (str, attrs);
+ }
+
+ void slot_update_aux_string (IMEngineInstanceBase * si, const WideString & str, const AttributeList & attrs) {
+ m_parent->filter_update_aux_string (str, attrs);
+ }
+
+ void slot_update_lookup_table (IMEngineInstanceBase * si, const LookupTable & table) {
+ m_parent->filter_update_lookup_table (table);
+ }
+
+ void slot_commit_string (IMEngineInstanceBase * si, const WideString & str) {
+ m_parent->filter_commit_string (str);
+ }
+
+ void slot_forward_key_event (IMEngineInstanceBase * si, const KeyEvent & key) {
+ m_parent->filter_forward_key_event (key);
+ }
+
+ void slot_register_properties (IMEngineInstanceBase * si, const PropertyList & properties) {
+ m_parent->filter_register_properties (properties);
+ }
+
+ void slot_update_property (IMEngineInstanceBase * si, const Property & property) {
+ m_parent->filter_update_property (property);
+ }
+
+ void slot_beep (IMEngineInstanceBase * si) {
+ m_parent->filter_beep ();
+ }
+
+ void slot_start_helper (IMEngineInstanceBase * si, const String & helper_uuid) {
+ m_parent->filter_start_helper (helper_uuid);
+ }
+
+ void slot_stop_helper (IMEngineInstanceBase * si, const String & helper_uuid) {
+ m_parent->filter_stop_helper (helper_uuid);
+ }
+
+ void slot_send_helper_event (IMEngineInstanceBase * si, const String & helper_uuid, const Transaction & trans) {
+ m_parent->filter_send_helper_event (helper_uuid, trans);
+ }
+
+ bool slot_get_surrounding_text (IMEngineInstanceBase * si, WideString &text, int &cursor, int maxlen_before, int maxlen_after) {
+ return m_parent->filter_get_surrounding_text (text, cursor, maxlen_before, maxlen_after);
+ }
+
+ bool slot_delete_surrounding_text(IMEngineInstanceBase * si, int offset, int len) {
+ return m_parent->filter_delete_surrounding_text (offset, len);
+ }
+};
+
+FilterInstanceBase::FilterInstanceBase (FilterFactoryBase *factory,
+ const IMEngineInstancePointer &orig_inst)
+ : IMEngineInstanceBase (factory, (orig_inst.null () ? "UTF-8" : orig_inst->get_encoding ()), (orig_inst.null () ? -1 : orig_inst->get_id ())),
+ m_impl (new FilterInstanceBaseImpl (this, orig_inst))
+{
+}
+
+FilterInstanceBase::~FilterInstanceBase ()
+{
+ delete m_impl;
+}
+
+bool
+FilterInstanceBase::set_encoding (const String &encoding)
+{
+ return IMEngineInstanceBase::set_encoding (encoding) && m_impl->set_encoding (encoding);
+}
+
+bool
+FilterInstanceBase::process_key_event (const KeyEvent &key)
+{
+ return m_impl->process_key_event (key);
+}
+
+void
+FilterInstanceBase::move_preedit_caret (unsigned int pos)
+{
+ m_impl->move_preedit_caret (pos);
+}
+
+void
+FilterInstanceBase::select_candidate (unsigned int index)
+{
+ m_impl->select_candidate (index);
+}
+
+void
+FilterInstanceBase::update_lookup_table_page_size (unsigned int page_size)
+{
+ m_impl->update_lookup_table_page_size (page_size);
+}
+
+void
+FilterInstanceBase::lookup_table_page_up ()
+{
+ m_impl->lookup_table_page_up ();
+}
+
+void
+FilterInstanceBase::lookup_table_page_down ()
+{
+ m_impl->lookup_table_page_down ();
+}
+
+void
+FilterInstanceBase::reset ()
+{
+ m_impl->reset ();
+}
+
+void
+FilterInstanceBase::focus_in ()
+{
+ m_impl->focus_in ();
+}
+
+void
+FilterInstanceBase::focus_out ()
+{
+ m_impl->focus_out ();
+}
+
+void
+FilterInstanceBase::trigger_property (const String &property)
+{
+ m_impl->trigger_property (property);
+}
+
+void
+FilterInstanceBase::process_helper_event (const String &helper_uuid, const Transaction &trans)
+{
+ m_impl->process_helper_event (helper_uuid, trans);
+}
+
+void
+FilterInstanceBase::update_client_capabilities (unsigned int cap)
+{
+ m_impl->update_client_capabilities (cap);
+}
+
+void
+FilterInstanceBase::filter_show_preedit_string ()
+{
+ show_preedit_string ();
+}
+
+void
+FilterInstanceBase::filter_show_aux_string ()
+{
+ show_aux_string ();
+}
+
+void
+FilterInstanceBase::filter_show_lookup_table ()
+{
+ show_lookup_table ();
+}
+
+void
+FilterInstanceBase::filter_hide_preedit_string ()
+{
+ hide_preedit_string ();
+}
+
+void
+FilterInstanceBase::filter_hide_aux_string ()
+{
+ hide_aux_string ();
+}
+
+void
+FilterInstanceBase::filter_hide_lookup_table ()
+{
+ hide_lookup_table ();
+}
+
+void
+FilterInstanceBase::filter_update_preedit_caret (int caret)
+{
+ update_preedit_caret (caret);
+}
+
+void
+FilterInstanceBase::filter_update_preedit_string (const WideString &str,
+ const AttributeList &attrs)
+{
+ update_preedit_string (str, attrs);
+}
+
+void
+FilterInstanceBase::filter_update_aux_string (const WideString &str,
+ const AttributeList &attrs)
+{
+ update_aux_string (str, attrs);
+}
+
+void
+FilterInstanceBase::filter_update_lookup_table (const LookupTable &table)
+{
+ update_lookup_table (table);
+}
+
+void
+FilterInstanceBase::filter_commit_string (const WideString &str)
+{
+ commit_string (str);
+}
+
+void
+FilterInstanceBase::filter_forward_key_event (const KeyEvent &key)
+{
+ forward_key_event (key);
+}
+
+void
+FilterInstanceBase::filter_register_properties (const PropertyList &properties)
+{
+ register_properties (properties);
+}
+
+void
+FilterInstanceBase::filter_update_property (const Property &property)
+{
+ update_property (property);
+}
+
+void
+FilterInstanceBase::filter_beep ()
+{
+ beep ();
+}
+
+void
+FilterInstanceBase::filter_start_helper (const String &helper_uuid)
+{
+ start_helper (helper_uuid);
+}
+
+void
+FilterInstanceBase::filter_stop_helper (const String &helper_uuid)
+{
+ stop_helper (helper_uuid);
+}
+
+void
+FilterInstanceBase::filter_send_helper_event (const String &helper_uuid, const Transaction &trans)
+{
+ send_helper_event (helper_uuid, trans);
+}
+
+bool
+FilterInstanceBase::filter_get_surrounding_text (WideString &text, int &cursor, int maxlen_before, int maxlen_after)
+{
+ return get_surrounding_text (text, cursor, maxlen_before, maxlen_after);
+}
+
+bool
+FilterInstanceBase::filter_delete_surrounding_text (int offset, int len)
+{
+ return delete_surrounding_text (offset, len);
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/**
+ * @file scim_filter.h
+ * @brief Defines scim::FilterFactoryBase and scim::FilterInstanceBase interfaces.
+ *
+ * scim::FilterFactoryBase and scim::FilterInstanceBase are used to implement
+ * filter IMEngines, such as Simplified Chinese <-> Traditional Chinese converter etc.
+ *
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_filter.h,v 1.5 2005/05/28 13:54:59 suzhe Exp $
+ */
+
+#ifndef __SCIM_FILTER_H
+#define __SCIM_FILTER_H
+
+namespace scim {
+/**
+ * @addtogroup IMEngine
+ * @ingroup InputServiceFramework
+ * The base classes for filter input method engine modules.
+ * @{
+ */
+
+/**
+ * @brief An exception class to hold Filter related errors.
+ *
+ * scim::FilterFactoryBase, scim::FilterInstanceBase
+ * and their derived classes must throw scim::FilterError object when error.
+ */
+class FilterError: public Exception
+{
+public:
+ FilterError (const String& what_arg)
+ : Exception (String("scim::Filter: ") + what_arg) { }
+};
+
+/**
+ * @brief Structure to hold information for a Filter.
+ */
+struct FilterInfo
+{
+ String uuid; ///< The UUID.
+ String name; ///< The localized name, in UTF-8 encoding.
+ String langs; ///< The supported languages, separated by comma.
+ String icon; ///< The icon file path.
+ String desc; ///< The description.
+
+ FilterInfo () { }
+ FilterInfo (const String &u, const String &n = String (""), const String &l = String (""), const String &i = String (""), const String &d = String (""))
+ : uuid (u), name (n), langs (l), icon (i), desc (d) { }
+};
+
+/**
+ * @brief The base class to implement FilterFactory classes.
+ *
+ * All FilterFactory classes should derive from this class and some base methods
+ * should be overrided in the derived classes.
+ *
+ * If a FilterFactory object need large amount of data (eg. mapping table etc.),
+ * it'd better to share these data among all other objects of the same class.
+ * Because multiple objects of one FilterFactory class maybe used at the same time
+ * to filter several real IMEngineFactory objects.
+ */
+class FilterFactoryBase : public IMEngineFactoryBase
+{
+ IMEngineFactoryPointer m_orig;
+
+public:
+ /**
+ * @brief Default Constructor.
+ */
+ FilterFactoryBase ();
+
+ virtual ~FilterFactoryBase ();
+
+ /**
+ * @brief Attach an IMEngineFactory object to this filter.
+ *
+ * The attached object could also be a filter.
+ *
+ * This method will set the supported locales of this filter factory
+ * to the locales supported by the original IMEngineFactory object.
+ *
+ * This method could be overrided in derived class, in which some special
+ * tasks could be done, for example, set additional supported locales.
+ * But this method of base class must be invoked to attach the factory correctly.
+ *
+ * The IMEngineFactoryPointer orig may not be kept and used by derived class directly.
+ * All tasks related to the original IMEngineFactory object should be done by
+ * calling the corresponding methods of FilterFactoryBase class.
+ *
+ * @param orig The original IMEngineFactory object to be filtered.
+ */
+ virtual void attach_imengine_factory (const IMEngineFactoryPointer &orig);
+
+ /**
+ * @brief Return the name of the original IMEngineFactory object
+ * specified in contructor or by attach_imengine_factory() method.
+ *
+ * If there is no IMEngineFactory attached yet,
+ * then an empty string would be returned.
+ *
+ * The derived class should override this method to return
+ * the name of the filter itself when it returns an empty string.
+ *
+ * The derived method should look like:
+ *
+ * <PRE>
+ * WideString
+ * XXXFilterFactory::get_name ()
+ * {
+ * WideString name = FilterFactoryBase::get_name ();
+ * return name.length () ? name : _("XXX");
+ * }
+ * </PRE>
+ */
+ virtual WideString get_name () const;
+
+ /**
+ * @brief Return the uuid of the original IMEngineFactory object
+ * specified in contructor or by attach_imengine_factory() method.
+ *
+ * If there is no IMEngineFactory attached yet,
+ * then an empty string would be returned.
+ *
+ * The derived class should override this method to return
+ * the uuid of the filter itself when it returns an empty string.
+ */
+ virtual String get_uuid () const;
+
+ /**
+ * @brief Return the icon file path of the original IMEngineFactory object
+ * specified in contructor or by attach_imengine_factory() method.
+ *
+ * If there is no IMEngineFactory attached yet,
+ * then an empty string would be returned.
+ *
+ * The derived class should override this method to return
+ * the icon file path of the filter itself when it returns an empty string.
+ */
+ virtual String get_icon_file () const;
+
+ /**
+ * @brief Return the authors information of the original IMEngineFactory object
+ * specified in contructor or by attach_imengine_factory() method.
+ *
+ * If there is no IMEngineFactory attached yet,
+ * then an empty string would be returned.
+ *
+ * The derived class should override this method to return
+ * the authors information of the filter itself when it returns an empty string.
+ */
+ virtual WideString get_authors () const;
+
+ /**
+ * @brief Return the credits information of the original IMEngineFactory object
+ * specified in contructor or by attach_imengine_factory() method.
+ *
+ * If there is no IMEngineFactory attached yet,
+ * then an empty string would be returned.
+ *
+ * The derived class should override this method to return
+ * the credits information of the filter itself when it returns an empty string.
+ */
+ virtual WideString get_credits () const;
+
+ /**
+ * @brief Return the help information of the original IMEngineFactory object
+ * specified in contructor or by attach_imengine_factory() method.
+ *
+ * If there is no IMEngineFactory attached yet,
+ * then an empty string would be returned.
+ *
+ * The derived class should override this method to return the combined
+ * help information of the filter itself and the original IMEngineFactory to be filtered.
+ */
+ virtual WideString get_help () const;
+
+ /**
+ * @brief Return the supported language of the original IMEngineFactory object
+ * specified in contructor or by attach_imengine_factory() method.
+ *
+ * If there is no IMEngineFactory attached yet,
+ * then an empty string would be returned.
+ *
+ * The derived class may override this method to return
+ * a different language which is supported by the filter itself.
+ */
+ virtual String get_language () const;
+
+ /**
+ * @brief Check if an encoding is supported by the original IMEngineFactory object
+ * specified in constructor or by attach_imengine_factory() method.
+ *
+ * If there is no IMEngineFactory attached yet, then false would be returned.
+ *
+ * The derived class may override this method to provide its own validate routing.
+ */
+ virtual bool validate_encoding (const String& encoding) const;
+
+ /**
+ * @brief Check if an locale is supported by the original IMEngineFactory object
+ * specified in constructor or by attach_imengine_factory() method.
+ *
+ * If there is no IMEngineFactory attached yet, then false would be returned.
+ *
+ * The derived class may override this method to provide its own validate routing.
+ */
+ virtual bool validate_locale (const String& locale) const;
+
+ /**
+ * @brief Get the original key string of a composed string by calling the same method of
+ * the original IMEngineFactory object specified in constructor or by attach_imengine_factory() method.
+ *
+ * If there is no IMEngineFactory attached yet, then an empty string would be returned.
+ */
+ virtual WideString inverse_query (const WideString &str);
+
+ /**
+ * @brief Create an IMEngineInstance object of the original IMEngineFactory object
+ * specified in constructor or by attach_imengine_factory() method.
+ *
+ * The derived class should override this method and create its own instance object
+ * from the result of this base method.
+ *
+ * The code may look like:
+ *
+ * <PRE>
+ * IMEngineInstancePointer
+ * XXXFilterFactory::create_instance (const String& encoding, int id)
+ * {
+ * return new XXXFilterInstance (this, FilterFactoryBase::create_instance (encoding, id));
+ * }
+ * </PRE>
+ */
+ virtual IMEngineInstancePointer create_instance (const String& encoding, int id = -1);
+};
+
+/**
+ * @typedef typedef Pointer <FilterFactoryBase> FilterFactoryPointer;
+ *
+ * A smart pointer for scim::FilterFactoryBase and its derived classes.
+ */
+typedef Pointer <FilterFactoryBase> FilterFactoryPointer;
+
+/**
+ * @brief The base class to implement FilterInstance classes.
+ *
+ * All FilterInstance classes should derive from this base class,
+ * and some base methods should be override in the derived classes.
+ */
+class FilterInstanceBase : public IMEngineInstanceBase
+{
+ class FilterInstanceBaseImpl;
+
+ FilterInstanceBaseImpl *m_impl;
+
+ friend class FilterInstanceBaseImpl;
+public:
+ /**
+ * @brief Constructor.
+ *
+ * The Constructor of derived class should call this Contructor with the following
+ * two parameters.
+ *
+ * The orig_inst should be created by invoking FilterFactoryBase::create_instance()
+ * within the same method of derived FilterFactory classes.
+ *
+ * @param factory the FilterFactory which creates this instance.
+ * @param orig_inst the original IMEngineInstance to be filtered.
+ */
+ FilterInstanceBase (FilterFactoryBase *factory,
+ const IMEngineInstancePointer &orig_inst);
+
+ virtual ~FilterInstanceBase ();
+
+ /**
+ * @brief Set the working encoding for this filter instance
+ * as well as the original instance which is currently filtered.
+ *
+ * This method could be overrided in derived class to do some extra job. But
+ * the method of this base class must be invoked within the new method.
+ *
+ * After invoking this method, reset() should be invoked to
+ * let the new encoding take effect.
+ *
+ * If you want to use different encodings in this filter instance and
+ * the original instance which is currently filtered, this method should
+ * be overrided in the derived class and two different encodings should be
+ * set respectively by calling FilterInstanceBase::set_encoding() and
+ * IMEngineInstanceBase::set_encoding (); The code may look like:
+ *
+ * bool
+ * XXXFilterInstance::set_encoding (const String &encoding)
+ * {
+ * FilterInstanceBase::set_encoding ("Other Encoding"); // Set the encoding of the original instance to another one.
+ * return IMEngineInstanceBase::set_encoding (encoding); // Set the encoding of this filter instance to the desired one.
+ * }
+ *
+ * @return true if the encoding is supported, otherwise false.
+ */
+ virtual bool set_encoding (const String &encoding);
+public:
+ /**
+ * @name Action functions.
+ *
+ * These functions will be called by FrontEnds to send events to
+ * this FilterInstance.
+ *
+ * These methods can be overrided, if the derived class wants to filter these events.
+ *
+ * The default implementation of these methods are just to call the corresponding methods
+ * of the original IMEngineInstance object which is filtered by this filter.
+ *
+ * @{
+ */
+ virtual bool process_key_event (const KeyEvent &key);
+ virtual void move_preedit_caret (unsigned int pos);
+ virtual void select_candidate (unsigned int index);
+ virtual void update_lookup_table_page_size (unsigned int page_size);
+ virtual void lookup_table_page_up ();
+ virtual void lookup_table_page_down ();
+ virtual void reset ();
+ virtual void focus_in ();
+ virtual void focus_out ();
+ virtual void trigger_property (const String &property);
+ virtual void process_helper_event (const String &helper_uuid, const Transaction &trans);
+ virtual void update_client_capabilities (unsigned int cap);
+ /** @ */
+
+protected:
+ /**
+ * @name Signal activation functions.
+ *
+ * These methods will be called by FilterInstanceBase class when the corresponding signals are
+ * emitted by the original IMEngineInstance object which is filtered by this filter.
+ *
+ * These methods can be overrided, if the derived class wants to filter these signals.
+ * The default implementation of these methods are just to deliver the signals to FrontEnd directly.
+ *
+ * @{
+ */
+ virtual void filter_show_preedit_string ();
+ virtual void filter_show_aux_string ();
+ virtual void filter_show_lookup_table ();
+ virtual void filter_hide_preedit_string ();
+ virtual void filter_hide_aux_string ();
+ virtual void filter_hide_lookup_table ();
+ virtual void filter_update_preedit_caret (int caret);
+ virtual void filter_update_preedit_string (const WideString &str,
+ const AttributeList &attrs = AttributeList ());
+ virtual void filter_update_aux_string (const WideString &str,
+ const AttributeList &attrs = AttributeList ());
+ virtual void filter_update_lookup_table (const LookupTable &table);
+ virtual void filter_commit_string (const WideString &str);
+ virtual void filter_forward_key_event (const KeyEvent &key);
+ virtual void filter_register_properties (const PropertyList &properties);
+ virtual void filter_update_property (const Property &property);
+ virtual void filter_beep ();
+ virtual void filter_start_helper (const String &helper_uuid);
+ virtual void filter_stop_helper (const String &helper_uuid);
+ virtual void filter_send_helper_event (const String &helper_uuid, const Transaction &trans);
+ virtual bool filter_get_surrounding_text (WideString &text, int &cursor, int maxlen_before = -1, int maxlen_after = -1);
+ virtual bool filter_delete_surrounding_text (int offset, int len);
+ /** @} */
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_FILTER_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_filter_manager.cpp
+ * @brief Implementation of class FilterManager.
+ */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_filter_manager.cpp,v 1.4 2005/12/16 11:12:27 suzhe Exp $
+ */
+
+#define Uses_SCIM_FILTER_MODULE
+#define Uses_SCIM_FILTER_MANAGER
+#define Uses_SCIM_CONFIG_PATH
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+struct FilterModuleIndex
+{
+ FilterModule *module;
+ unsigned int index;
+
+ FilterModuleIndex () : module (0), index (0) { }
+};
+
+static bool __filter_initialized = false;
+static unsigned int __number_of_modules = 0;
+static FilterModule *__filter_modules = 0;
+
+static std::vector <std::pair <FilterModuleIndex, FilterInfo> > __filter_infos;
+
+static void
+__initialize_modules (const ConfigPointer &config)
+{
+ if (__filter_initialized) return;
+
+ __filter_initialized = true;
+
+ std::vector <String> mod_list;
+
+ __number_of_modules = scim_get_filter_module_list (mod_list);
+
+ if (!__number_of_modules) return;
+
+ __filter_modules = new FilterModule [__number_of_modules];
+
+ unsigned int i, j;
+
+ for (i = 0; i < __number_of_modules; ++i) {
+ if (__filter_modules [i].load (mod_list [i], config)) {
+ for (j = 0; j < __filter_modules [i].number_of_filters (); ++j) {
+ FilterModuleIndex index;
+ FilterInfo info;
+ if (__filter_modules [i].get_filter_info (j, info)) {
+ index.module = & __filter_modules [i];
+ index.index = j;
+ __filter_infos.push_back (std::make_pair (index, info));
+ }
+ }
+ }
+ }
+}
+
+class FilterManager::FilterManagerImpl
+{
+public:
+ ConfigPointer m_config;
+
+ FilterManagerImpl (const ConfigPointer &config) : m_config (config) { }
+};
+
+FilterManager::FilterManager (const ConfigPointer &config)
+ : m_impl (new FilterManagerImpl (config))
+{
+}
+
+FilterManager::~FilterManager ()
+{
+ delete m_impl;
+}
+
+unsigned int
+FilterManager::number_of_filters () const
+{
+ if (!__filter_initialized) __initialize_modules (m_impl->m_config);
+
+ return __filter_infos.size ();
+}
+
+bool
+FilterManager::get_filter_info (unsigned int idx, FilterInfo &info) const
+{
+ if (!__filter_initialized) __initialize_modules (m_impl->m_config);
+
+ if (idx < number_of_filters ()) {
+ info = __filter_infos [idx].second;
+ return true;
+ }
+ return false;
+}
+
+bool
+FilterManager::get_filter_info (const String &uuid, FilterInfo &info) const
+{
+ if (!__filter_initialized) __initialize_modules (m_impl->m_config);
+
+ for (size_t i = 0; i < __filter_infos.size (); ++i) {
+ if (__filter_infos [i].second.uuid == uuid) {
+ info = __filter_infos [i].second;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+FilterFactoryPointer
+FilterManager::create_filter (unsigned int idx) const
+{
+ if (!__filter_initialized) __initialize_modules (m_impl->m_config);
+
+ if (idx < __filter_infos.size () && __filter_infos [idx].first.module && __filter_infos [idx].first.module->valid ()) {
+ return __filter_infos [idx].first.module->create_filter (__filter_infos [idx].first.index);
+ }
+
+ return FilterFactoryPointer (0);
+}
+
+FilterFactoryPointer
+FilterManager::create_filter (const String &uuid) const
+{
+ if (!__filter_initialized) __initialize_modules (m_impl->m_config);
+
+ for (size_t i = 0; i < __filter_infos.size (); ++i) {
+ if (__filter_infos [i].second.uuid == uuid && __filter_infos [i].first.module && __filter_infos [i].first.module->valid ())
+ return __filter_infos [i].first.module->create_filter (__filter_infos [i].first.index);
+ }
+
+ return FilterFactoryPointer (0);
+}
+
+void
+FilterManager::clear_all_filter_settings () const
+{
+ if (!m_impl->m_config.null () && m_impl->m_config->valid ()) {
+ std::vector <String> tmp;
+ scim_split_string_list (tmp, m_impl->m_config->read (String (SCIM_CONFIG_FILTER_FILTERED_IMENGINES_LIST), String ("")));
+
+ for (size_t i = 0; i < tmp.size (); ++i)
+ m_impl->m_config->erase (String (SCIM_CONFIG_FILTER_FILTERED_IMENGINES) + String ("/") + tmp [i]);
+
+ m_impl->m_config->erase (String (SCIM_CONFIG_FILTER_FILTERED_IMENGINES_LIST));
+ }
+}
+
+size_t
+FilterManager::get_filters_for_imengine (const String &uuid, std::vector <String> &filters) const
+{
+ filters.clear ();
+
+ if (!m_impl->m_config.null () && m_impl->m_config->valid ()) {
+ std::vector <String> tmp;
+ scim_split_string_list (tmp, m_impl->m_config->read (String (SCIM_CONFIG_FILTER_FILTERED_IMENGINES_LIST), String ("")));
+
+ if (std::find (tmp.begin (), tmp.end (), uuid) != tmp.end ()) {
+ FilterInfo info;
+
+ scim_split_string_list (tmp, m_impl->m_config->read (String (SCIM_CONFIG_FILTER_FILTERED_IMENGINES) + String ("/") + uuid, String ("")));
+
+ for (size_t i = 0; i < tmp.size (); ++i) {
+ if (std::find (filters.begin (), filters.end (), tmp [i]) == filters.end () && get_filter_info (tmp [i], info))
+ filters.push_back (tmp [i]);
+ }
+ }
+ }
+
+ return filters.size ();
+}
+
+void
+FilterManager::set_filters_for_imengine (const String &uuid, const std::vector <String> &filters) const
+{
+ if (!m_impl->m_config.null () && m_impl->m_config->valid ()) {
+ std::vector <String> valid_filters;
+
+ FilterInfo info;
+
+ for (size_t i = 0; i < filters.size (); ++i) {
+ if (std::find (valid_filters.begin (), valid_filters.end (), filters [i]) == valid_filters.end () && get_filter_info (filters [i], info))
+ valid_filters.push_back (filters [i]);
+ }
+
+ std::vector <String> filtered_ims;
+ scim_split_string_list (filtered_ims, m_impl->m_config->read (String (SCIM_CONFIG_FILTER_FILTERED_IMENGINES_LIST), String ("")));
+
+ if (valid_filters.size ()) {
+ if (std::find (filtered_ims.begin (), filtered_ims.end (), uuid) == filtered_ims.end ())
+ filtered_ims.push_back (uuid);
+ m_impl->m_config->write (String (SCIM_CONFIG_FILTER_FILTERED_IMENGINES) + String ("/") + uuid, scim_combine_string_list (valid_filters));
+ } else {
+ std::vector <String>::iterator it = std::find (filtered_ims.begin (), filtered_ims.end (), uuid);
+ if (it != filtered_ims.end ())
+ filtered_ims.erase (it);
+ m_impl->m_config->erase (String (SCIM_CONFIG_FILTER_FILTERED_IMENGINES) + String ("/") + uuid);
+ }
+
+ m_impl->m_config->write (String (SCIM_CONFIG_FILTER_FILTERED_IMENGINES_LIST), scim_combine_string_list (filtered_ims));
+ }
+}
+
+size_t
+FilterManager::get_filtered_imengines (std::vector <String> &imengines) const
+{
+ scim_split_string_list (imengines, m_impl->m_config->read (String (SCIM_CONFIG_FILTER_FILTERED_IMENGINES_LIST), String ("")));
+ return imengines.size ();
+}
+
+IMEngineFactoryPointer
+FilterManager::attach_filters_to_factory (const IMEngineFactoryPointer &factory) const
+{
+ IMEngineFactoryPointer root = factory;
+
+ std::vector <String> filters;
+
+ if (!factory.null () && get_filters_for_imengine (factory->get_uuid (), filters)) {
+ for (size_t i = 0; i < filters.size (); ++i) {
+ FilterFactoryPointer filter = create_filter (filters [i]);
+ if (!filter.null ()) {
+ filter->attach_imengine_factory (root);
+ root = filter;
+ }
+ }
+ }
+
+ return root;
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/**
+ * @file scim_filter_manager.h
+ * @brief Defines scim::FilterManager.
+ *
+ * scim::FilterManager is a class used to manage all Filter modules.
+ *
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_filter_manager.h,v 1.3 2005/05/28 13:54:59 suzhe Exp $
+ */
+
+#ifndef __SCIM_FILTER_MANAGER_H
+#define __SCIM_FILTER_MANAGER_H
+
+namespace scim {
+
+/**
+ * @addtogroup IMEngine
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+class FilterManager
+{
+ class FilterManagerImpl;
+ FilterManagerImpl *m_impl;
+
+ FilterManager (const FilterManager &);
+ const FilterManager & operator = (const FilterManager &);
+
+public:
+ FilterManager (const ConfigPointer &config);
+
+ ~FilterManager ();
+
+ /**
+ * @brief Get the total number of Filters supported by all filter modules.
+ */
+ unsigned int number_of_filters () const;
+
+ /**
+ * @brief Get the information of a specific filter by its index.
+ *
+ * @param idx The index of the filter, must between 0 to number_of_filters () - 1.
+ * @param info The FilterInfo object to store the information.
+ * @return true if this filter is ok and the information is stored correctly.
+ */
+ bool get_filter_info (unsigned int idx, FilterInfo &info) const;
+
+ /**
+ * @brief Get the information of a specific filter by its uuid.
+ *
+ * @param uuid The uuid of the filter.
+ * @param info The FilterInfo object to store the information.
+ * @return true if this filter is ok and the information is stored correctly.
+ */
+ bool get_filter_info (const String &uuid, FilterInfo &info) const;
+
+ /**
+ * @brief Clear all Filter settings for IMEngines.
+ */
+ void clear_all_filter_settings () const;
+
+ /**
+ * @brief Get a list of Filters binded to an IMEngine.
+ *
+ * @param uuid The uuid of the IMEngine to be queried.
+ * @param filters The list of Filters' UUIDs binded to the IMEngine will be stored here.
+ *
+ * @return How many filters binded to this IMEngine.
+ */
+ size_t get_filters_for_imengine (const String &uuid, std::vector <String> &filters) const;
+
+ /**
+ * @brief Bind one or more Filters to an IMEngine.
+ *
+ * @param uuid The uuid of the IMEngine to be binded.
+ * @param filters The list of Filters' UUIDs to be binded to the IMEngine.
+ */
+ void set_filters_for_imengine (const String &uuid, const std::vector <String> &filters) const;
+
+ /**
+ * @brief Get a list of imengines which have one or more filters attached.
+ *
+ * @param imengines The UUIDs of filtered imengines will be stored here.
+ * @return How many imengines are being filtered.
+ */
+ size_t get_filtered_imengines (std::vector <String> &imengines) const;
+
+ /**
+ * @brief Create a FilterFactory according to its index.
+ *
+ * @param idx The index of the filter to be created, must be less than number_of_filters() - 1.
+ * @return The pointer of the FilterFactory object.
+ */
+ FilterFactoryPointer create_filter (unsigned int idx) const;
+
+ /**
+ * @brief Create a FilterFactory according to its UUID.
+ *
+ * @param uuid The UUID of the filter to be created.
+ * @return The pointer of the FilterFactory object.
+ */
+ FilterFactoryPointer create_filter (const String &uuid) const;
+
+ /**
+ * @brief Attach all binded Filters to an IMEngineFactory object.
+ *
+ * @param factory The pointer to an IMEngineFactory object which would be filtered.
+ *
+ * @return New pointer of IMEngineFactory object which has Filters binded.
+ */
+ IMEngineFactoryPointer attach_filters_to_factory (const IMEngineFactoryPointer &factory) const;
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_FILTER_MANAGER_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_filter_module.cpp,v 1.5 2005/05/24 12:22:51 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_FILTER_MODULE
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+FilterModule::FilterModule ()
+ : m_filter_init (0),
+ m_filter_create_filter (0),
+ m_filter_get_filter_info (0),
+ m_number_of_filters (0)
+{
+}
+
+FilterModule::FilterModule (const String &name, const ConfigPointer &config)
+ : m_filter_init (0),
+ m_filter_create_filter (0),
+ m_filter_get_filter_info (0),
+ m_number_of_filters (0)
+{
+ load (name, config);
+}
+
+bool
+FilterModule::load (const String &name, const ConfigPointer &config)
+{
+ try {
+ if (!m_module.load (name, "Filter"))
+ return false;
+
+ m_filter_init =
+ (FilterModuleInitFunc) m_module.symbol ("scim_filter_module_init");
+
+ m_filter_create_filter =
+ (FilterModuleCreateFilterFunc) m_module.symbol ("scim_filter_module_create_filter");
+
+ m_filter_get_filter_info =
+ (FilterModuleGetFilterInfoFunc) m_module.symbol ("scim_filter_module_get_filter_info");
+
+ if (!m_filter_init || !m_filter_create_filter || !m_filter_get_filter_info ||
+ (m_number_of_filters = m_filter_init (config)) == 0) {
+ m_module.unload ();
+ m_filter_init = 0;
+ m_filter_create_filter = 0;
+ m_filter_get_filter_info = 0;
+ return false;
+ }
+ } catch (...) {
+ m_module.unload ();
+ m_filter_init = 0;
+ m_filter_create_filter = 0;
+ m_filter_get_filter_info = 0;
+ return false;
+ }
+
+ return true;
+}
+
+bool
+FilterModule::unload ()
+{
+ return m_module.unload ();
+}
+
+bool
+FilterModule::valid () const
+{
+ return (m_module.valid () && m_filter_init && m_number_of_filters > 0 &&
+ m_filter_create_filter && m_filter_get_filter_info);
+}
+
+FilterFactoryPointer
+FilterModule::create_filter (unsigned int index) const
+{
+ if (valid () && index < m_number_of_filters)
+ return m_filter_create_filter (index);
+
+ return FilterFactoryPointer (0);
+}
+
+bool
+FilterModule::get_filter_info (unsigned int index, FilterInfo &info) const
+{
+ if (valid () && index < m_number_of_filters)
+ return m_filter_get_filter_info (index, info);
+
+ return false;
+}
+
+unsigned int
+FilterModule::number_of_filters () const
+{
+ return m_number_of_filters;
+}
+
+
+int scim_get_filter_module_list (std::vector <String>& engine_list)
+{
+ return scim_get_module_list (engine_list, "Filter");
+}
+
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_filter_module.h
+ * @brief definition of FilterModule related classes.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_filter_module.h,v 1.7 2005/10/06 18:02:06 liuspider Exp $
+ */
+
+#ifndef __SCIM_FILTER_MODULE_H
+#define __SCIM_FILTER_MODULE_H
+
+namespace scim {
+/**
+ * @addtogroup IMEngine
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+/**
+ * @brief Initialize a Filter Module.
+ *
+ * There must be a function called "scim_filter_module_init"
+ * in each filter module which complies with this prototype.
+ * This function name can have a prefix like sctc_LTX_,
+ * in which "sctc" is the module's name.
+ *
+ * If a filter needs services from other IMEngineFactory objects, it should
+ * obtain the pointer of these IMEngineFactory objects from the given BacnEnd
+ * pointer. But please note that, those IMEngineFactory objects may not be loaded yet,
+ * when initializing this Filter module.
+ * So the pointers of available IMEngineFactory objects should only be queried from
+ * the BackEnd at the first time to used by this Filter.
+ *
+ * @param config a ConfigBase instance to maintain the configuration.
+ *
+ * @return the number of filters provided by this module.
+ */
+typedef unsigned int (*FilterModuleInitFunc) (const ConfigPointer &config);
+
+/**
+ * @brief Create an object of this FilterFactory class
+ *
+ * There must be a function called "scim_filter_module_create_filter"
+ * which complies with this prototype.
+ * This function name can have a prefix like sctc_LTX_,
+ * in which "sctc" is the module's name.
+ *
+ * A new FilterFactory object should be returned for each call. Because
+ * multiple objects would be used at the same time.
+ *
+ * @param index the index of the FilterFactory to be used to create the object.
+ * Must between 0 and (number_of_filters - 1).
+ * @param backend the BackEnd instance which holds all real IMEngineFactory objects.
+ * Some filter may want to use other IMEngineFactory object
+ * to do some job, eg. inverse convert.
+ *
+ * @return the pointer of the FilterFactory object.
+ */
+typedef FilterFactoryPointer (*FilterModuleCreateFilterFunc) (unsigned int index);
+
+/**
+ * @brief Get basic information of the FilterFactory class provided by this module.
+ *
+ * There must be a function called "scim_filter_module_get_filter_info"
+ * which complies with this prototype.
+ * This function name can have a prefix like sctc_LTX_,
+ * in which "sctc" is the module's name.
+ *
+ *
+ * @param index The index of the FilterFactory to be queried.
+ *
+ * @param info The object to hold the information.
+ * @param index the index of the Filter to be queried.
+ *
+ * @return The uuid of this FilterFactory class.
+ */
+typedef bool (*FilterModuleGetFilterInfoFunc) (unsigned int index, FilterInfo &info);
+
+/**
+ * @brief The class to manipulate the Filter modules.
+ *
+ * This is a wrapper of scim::Module class, which is specially
+ * for manipulating the Filter modules.
+ */
+class FilterModule
+{
+ Module m_module;
+
+ FilterModuleInitFunc m_filter_init;
+ FilterModuleCreateFilterFunc m_filter_create_filter;
+ FilterModuleGetFilterInfoFunc m_filter_get_filter_info;
+
+ unsigned int m_number_of_filters;
+
+ FilterModule (const FilterModule &);
+ FilterModule & operator= (const FilterModule &);
+
+public:
+ /**
+ * @brief Default constructor.
+ */
+ FilterModule ();
+
+ /**
+ * @brief Constructor.
+ * @param name the module's name, eg. "sctc".
+ * @param config a ConfigBase instance to maintain the configuration.
+ */
+ FilterModule (const String &name, const ConfigPointer &config);
+
+ /**
+ * @brief Load a Filter Module by its name.
+ *
+ * Load a module into memory.
+ * If another module has been loaded into this object,
+ * then the old module will be unloaded first.
+ * If the old module is resident, false will be returned,
+ * and the old module will be untouched.
+ *
+ * @param name - the name of the Filter Module.
+ * @param config a ConfigBase instance to maintain the configuration.
+ *
+ * @return true if success.
+ */
+ bool load (const String &name, const ConfigPointer &config);
+
+ /**
+ * @brief Unload the Filter Module.
+ * @return true if sucessfully unloaded.
+ */
+ bool unload ();
+
+ /**
+ * @brief Check if a module is loaded and initialized successfully.
+ * @return true if a module is already loaded and initialized successfully.
+ */
+ bool valid () const;
+
+ /**
+ * @brief Get how many Filter factories supported by this module.
+ *
+ * @return the number of Filter factories.
+ */
+ unsigned int number_of_filters () const;
+
+ /**
+ * @brief Create an object for a Filter factory.
+ *
+ * @param index The index of the Filter factory,
+ * must be less than the result of number_of_factories method
+ * and greater than or equal to zero.
+ * @return A smart pointer to the factory object, NULL if failed.
+ */
+ FilterFactoryPointer create_filter (unsigned int index) const;
+
+ /**
+ * @brief Get basic information of the FilterFactory class provided by this module.
+ *
+ * @param index The index of the Filter factory to be queried.
+ * @param info The result will be stored in this parameter.
+ *
+ * @return whether the info is successfully retrieved
+ */
+ bool get_filter_info (unsigned int index, FilterInfo &info) const;
+};
+
+/**
+ * @brief Get a name list of currently available Filter modules.
+ * @param mod_list - the result list will be stored here.
+ * @return the number of the modules, equal to mod_list.size ().
+ */
+int scim_get_filter_module_list (std::vector <String> &mod_list);
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_FILTER_MODULE_H
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
+
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_frontend.cpp,v 1.44 2005/06/26 16:35:33 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_FRONTEND
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+#if SCIM_USE_STL_EXT_HASH_MAP
+typedef __gnu_cxx::hash_map <int, IMEngineInstancePointer, __gnu_cxx::hash <int> > IMEngineInstanceRepository;
+#elif SCIM_USE_STL_HASH_MAP
+typedef std::hash_map <int, IMEngineInstancePointer, std::::hash <int> > IMEngineInstanceRepository;
+#else
+typedef std::map <int, IMEngineInstancePointer> IMEngineInstanceRepository;
+#endif
+
+class FrontEndBase::FrontEndBaseImpl
+{
+public:
+ FrontEndBase *m_frontend;
+ BackEndPointer m_backend;
+ IMEngineInstanceRepository m_instance_repository;
+
+ int m_instance_count;
+public:
+ FrontEndBaseImpl (FrontEndBase *fe, const BackEndPointer &backend)
+ :m_frontend (fe),
+ m_backend (backend),
+ m_instance_count (0)
+ { }
+
+ IMEngineInstancePointer find_instance (int id) const {
+ IMEngineInstanceRepository::const_iterator it = m_instance_repository.find (id);
+ if (it != m_instance_repository.end ())
+ return it->second;
+ return IMEngineInstancePointer (0);
+ }
+
+ void slot_show_preedit_string (IMEngineInstanceBase * si) {
+ m_frontend->show_preedit_string (si->get_id ());
+ }
+
+ void slot_show_aux_string (IMEngineInstanceBase * si) {
+ m_frontend->show_aux_string (si->get_id ());
+ }
+
+ void slot_show_lookup_table (IMEngineInstanceBase * si) {
+ m_frontend->show_lookup_table (si->get_id ());
+ }
+
+ void slot_hide_preedit_string (IMEngineInstanceBase * si) {
+ m_frontend->hide_preedit_string (si->get_id ());
+ }
+
+ void slot_hide_aux_string (IMEngineInstanceBase * si) {
+ m_frontend->hide_aux_string (si->get_id ());
+ }
+
+ void slot_hide_lookup_table (IMEngineInstanceBase * si) {
+ m_frontend->hide_lookup_table (si->get_id ());
+ }
+
+ void slot_update_preedit_caret (IMEngineInstanceBase * si, int caret) {
+ m_frontend->update_preedit_caret (si->get_id (), caret);
+ }
+
+ void slot_update_preedit_string (IMEngineInstanceBase * si, const WideString & str, const AttributeList & attrs) {
+ m_frontend->update_preedit_string (si->get_id (), str, attrs);
+ }
+
+ void slot_update_aux_string (IMEngineInstanceBase * si, const WideString & str, const AttributeList & attrs) {
+ m_frontend->update_aux_string (si->get_id (), str, attrs);
+ }
+
+ void slot_update_lookup_table (IMEngineInstanceBase * si, const LookupTable & table) {
+ m_frontend->update_lookup_table (si->get_id (), table);
+ }
+
+ void slot_commit_string (IMEngineInstanceBase * si, const WideString & str) {
+ m_frontend->commit_string (si->get_id (), str);
+ }
+
+ void slot_forward_key_event (IMEngineInstanceBase * si, const KeyEvent & key) {
+ m_frontend->forward_key_event (si->get_id (), key);
+ }
+
+ void slot_register_properties (IMEngineInstanceBase * si, const PropertyList & properties) {
+ m_frontend->register_properties (si->get_id (), properties);
+ }
+
+ void slot_update_property (IMEngineInstanceBase * si, const Property & property) {
+ m_frontend->update_property (si->get_id (), property);
+ }
+
+ void slot_beep (IMEngineInstanceBase * si) {
+ m_frontend->beep (si->get_id ());
+ }
+
+ void slot_start_helper (IMEngineInstanceBase * si, const String & helper_uuid) {
+ m_frontend->start_helper (si->get_id (), helper_uuid);
+ }
+
+ void slot_stop_helper (IMEngineInstanceBase * si, const String & helper_uuid) {
+ m_frontend->stop_helper (si->get_id (), helper_uuid);
+ }
+
+ void slot_send_helper_event (IMEngineInstanceBase * si, const String & helper_uuid, const Transaction & trans) {
+ m_frontend->send_helper_event (si->get_id (), helper_uuid, trans);
+ }
+
+ bool slot_get_surrounding_text (IMEngineInstanceBase * si, WideString &text, int &cursor, int maxlen_before, int maxlen_after) {
+ return m_frontend->get_surrounding_text (si->get_id (), text, cursor, maxlen_before, maxlen_after);
+ }
+
+ bool slot_delete_surrounding_text(IMEngineInstanceBase * si, int offset, int len) {
+ return m_frontend->delete_surrounding_text (si->get_id (), offset, len);
+ }
+
+ void attach_instance (const IMEngineInstancePointer &si)
+ {
+ si->signal_connect_show_preedit_string (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_show_preedit_string));
+ si->signal_connect_show_aux_string (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_show_aux_string));
+ si->signal_connect_show_lookup_table (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_show_lookup_table));
+
+ si->signal_connect_hide_preedit_string (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_hide_preedit_string));
+ si->signal_connect_hide_aux_string (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_hide_aux_string));
+ si->signal_connect_hide_lookup_table (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_hide_lookup_table));
+
+ si->signal_connect_update_preedit_caret (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_update_preedit_caret));
+ si->signal_connect_update_preedit_string (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_update_preedit_string));
+ si->signal_connect_update_aux_string (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_update_aux_string));
+ si->signal_connect_update_lookup_table (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_update_lookup_table));
+
+ si->signal_connect_commit_string (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_commit_string));
+
+ si->signal_connect_forward_key_event (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_forward_key_event));
+
+ si->signal_connect_register_properties (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_register_properties));
+
+ si->signal_connect_update_property (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_update_property));
+
+ si->signal_connect_beep (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_beep));
+
+ si->signal_connect_start_helper (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_start_helper));
+
+ si->signal_connect_stop_helper (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_stop_helper));
+
+ si->signal_connect_send_helper_event (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_send_helper_event));
+
+ si->signal_connect_get_surrounding_text (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_get_surrounding_text));
+
+ si->signal_connect_delete_surrounding_text (
+ slot (this, &FrontEndBase::FrontEndBaseImpl::slot_delete_surrounding_text));
+ }
+};
+
+FrontEndBase::FrontEndBase (const BackEndPointer &backend)
+ : m_impl (new FrontEndBaseImpl (this, backend))
+{
+}
+
+FrontEndBase::~FrontEndBase ()
+{
+ delete m_impl;
+}
+
+void
+FrontEndBase::add_module (const ConfigPointer &config, const String module, bool is_load_resource) const
+{
+ m_impl->m_backend->add_module (config, module, is_load_resource);
+
+ return;
+}
+
+void
+FrontEndBase::add_module_info (const ConfigPointer &config, const String module) const
+{
+ m_impl->m_backend->add_module_info (config, module);
+
+ return;
+}
+
+uint32
+FrontEndBase::get_factory_list_for_encoding (std::vector<String>& uuids, const String &encoding) const
+{
+ std::vector<IMEngineFactoryPointer> factories;
+
+ m_impl->m_backend->get_factories_for_encoding (factories, encoding);
+
+ uuids.clear ();
+
+ for (std::vector<IMEngineFactoryPointer>::iterator it = factories.begin (); it != factories.end (); ++it)
+ uuids.push_back ((*it)->get_uuid ());
+
+ return uuids.size ();
+}
+
+uint32
+FrontEndBase::get_factory_list_for_language (std::vector<String>& uuids, const String &language) const
+{
+ std::vector<IMEngineFactoryPointer> factories;
+
+ m_impl->m_backend->get_factories_for_language (factories, language);
+
+ uuids.clear ();
+
+ for (std::vector<IMEngineFactoryPointer>::iterator it = factories.begin (); it != factories.end (); ++it)
+ uuids.push_back ((*it)->get_uuid ());
+
+ return uuids.size ();
+}
+
+uint32
+FrontEndBase::get_factory_list (std::vector<String>& uuids) const
+{
+ m_impl->m_backend->get_factory_list (uuids);
+ return uuids.size();
+}
+
+String
+FrontEndBase::get_default_factory (const String &language, const String &encoding) const
+{
+ IMEngineFactoryPointer def = m_impl->m_backend->get_default_factory (language, encoding);
+ if (!def.null ()) return def->get_uuid ();
+ return String ();
+}
+
+void
+FrontEndBase::set_default_factory (const String &language, const String &uuid)
+{
+ m_impl->m_backend->set_default_factory (language, uuid);
+}
+
+String
+FrontEndBase::get_next_factory (const String &language, const String &encoding, const String &cur_uuid) const
+{
+ IMEngineFactoryPointer next = m_impl->m_backend->get_next_factory (language, encoding, cur_uuid);
+ if (!next.null ()) return next->get_uuid ();
+ return String ();
+}
+
+String
+FrontEndBase::get_previous_factory (const String &language, const String &encoding, const String &cur_uuid) const
+{
+ IMEngineFactoryPointer prev = m_impl->m_backend->get_previous_factory (language, encoding, cur_uuid);
+ if (!prev.null ()) return prev->get_uuid ();
+ return String ();
+}
+
+WideString
+FrontEndBase::get_factory_name (const String &uuid) const
+{
+ IMEngineFactoryPointer factory = m_impl->m_backend->get_factory (uuid);
+ if (!factory.null ()) return factory->get_name ();
+ return WideString ();
+}
+
+WideString
+FrontEndBase::get_factory_authors (const String &uuid) const
+{
+ IMEngineFactoryPointer factory = m_impl->m_backend->get_factory (uuid);
+ if (!factory.null ()) return factory->get_authors ();
+ return WideString ();
+}
+
+WideString
+FrontEndBase::get_factory_credits (const String &uuid) const
+{
+ IMEngineFactoryPointer factory = m_impl->m_backend->get_factory (uuid);
+ if (!factory.null ()) return factory->get_credits ();
+ return WideString ();
+}
+
+WideString
+FrontEndBase::get_factory_help (const String &uuid) const
+{
+ IMEngineFactoryPointer factory = m_impl->m_backend->get_factory (uuid);
+ if (!factory.null ()) return factory->get_help ();
+ return WideString ();
+}
+
+String
+FrontEndBase::get_factory_locales (const String &uuid) const
+{
+ IMEngineFactoryPointer factory = m_impl->m_backend->get_factory (uuid);
+ if (!factory.null ()) return factory->get_locales ();
+ return String ();
+}
+
+String
+FrontEndBase::get_factory_language (const String &uuid) const
+{
+ IMEngineFactoryPointer factory = m_impl->m_backend->get_factory (uuid);
+ if (!factory.null ()) return factory->get_language ();
+ return String ();
+}
+
+String
+FrontEndBase::get_factory_icon_file (const String &uuid) const
+{
+ IMEngineFactoryPointer factory = m_impl->m_backend->get_factory (uuid);
+ if (!factory.null ()) return factory->get_icon_file ();
+ return String ();
+}
+
+bool
+FrontEndBase::validate_factory (const String &uuid, const String &encoding) const
+{
+ IMEngineFactoryPointer factory = m_impl->m_backend->get_factory (uuid);
+ return !factory.null () && (encoding.length () == 0 || factory->validate_encoding (encoding));
+}
+
+String
+FrontEndBase::get_all_locales () const
+{
+ return m_impl->m_backend->get_all_locales ();
+}
+
+int
+FrontEndBase::new_instance (const ConfigPointer &config, const String &sf_uuid, const String& encoding)
+{
+ std::cout << "enter new_instance" << std::endl;
+
+ IMEngineFactoryPointer factory = m_impl->m_backend->get_factory (sf_uuid);
+
+ if (factory.null ())
+ {
+ m_impl->m_backend->add_factory_by_uuid(config, sf_uuid);
+ factory = m_impl->m_backend->get_factory (sf_uuid);
+ }
+
+ if (factory.null () || !factory->validate_encoding (encoding)) {
+ SCIM_DEBUG_FRONTEND (1) << "IMEngineFactory " << sf_uuid
+ << " does not support encoding " << encoding << "\n";
+ return -1;
+ }
+
+ IMEngineInstancePointer si =
+ factory->create_instance (encoding, m_impl->m_instance_count);
+
+ if (si.null ()) {
+ SCIM_DEBUG_BACKEND(1) << "IMEngineFactory " << sf_uuid
+ << " failed to create new instance!\n";
+ return -1;
+ }
+
+ ++ m_impl->m_instance_count;
+
+ if (m_impl->m_instance_count < 0)
+ m_impl->m_instance_count = 0;
+
+ m_impl->m_instance_repository [si->get_id ()] = si;
+
+ m_impl->attach_instance (si);
+
+ return si->get_id ();
+}
+
+bool
+FrontEndBase::replace_instance (int si_id, const String &sf_uuid)
+{
+ IMEngineFactoryPointer sf = m_impl->m_backend->get_factory (sf_uuid);
+
+ if (sf.null ()) return false;
+
+ IMEngineInstanceRepository::iterator it = m_impl->m_instance_repository.find (si_id);
+
+ if (it != m_impl->m_instance_repository.end ()) {
+ if (it->second->get_factory_uuid () == sf_uuid)
+ return true;
+
+ String encoding = it->second->get_encoding ();
+ if (sf->validate_encoding (encoding)) {
+ IMEngineInstancePointer si = sf->create_instance (encoding, si_id);
+ if (!si.null ()) {
+ it->second = si;
+ m_impl->attach_instance (it->second);
+ return true;
+ }
+ }
+ }
+
+ SCIM_DEBUG_BACKEND(1) << "Cannot find IMEngine Instance " << si_id << " to replace.\n";
+
+ return false;
+}
+
+bool
+FrontEndBase::delete_instance (int id)
+{
+ String del_uuid;
+ bool ret = false;
+
+ dump_instances ();
+
+ IMEngineInstanceRepository::iterator it = m_impl->m_instance_repository.find (id);
+
+ if (it != m_impl->m_instance_repository.end ()) {
+ std::cout << "delete_instance:" << it->second->get_factory_uuid() << "\n";
+ del_uuid = it->second->get_factory_uuid();
+ m_impl->m_instance_repository.erase (it);
+ ret = true;
+ }
+
+ if (ret)
+ {
+ std::vector<String> use_uuids;
+
+ use_uuids.clear ();
+ for (it = m_impl->m_instance_repository.begin(); it != m_impl->m_instance_repository.end(); it++)
+ {
+ std::vector<String>::iterator it2 = use_uuids.begin();
+
+ for (; it2 != use_uuids.end(); it2++)
+ {
+ if (*it2 == it->second->get_factory_uuid())
+ break;
+ }
+
+ if (it2 == use_uuids.end())
+ use_uuids.push_back(it->second->get_factory_uuid());
+ }
+ m_impl->m_backend->release_module (use_uuids, del_uuid);
+ }
+
+ return ret;
+}
+
+void
+FrontEndBase::delete_all_instances ()
+{
+ m_impl->m_instance_repository.clear ();
+}
+
+String
+FrontEndBase::get_instance_uuid (int id) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) return si->get_factory_uuid ();
+
+ return String ();
+}
+
+String
+FrontEndBase::get_instance_encoding (int id) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) return si->get_encoding ();
+
+ return String ();
+}
+
+WideString
+FrontEndBase::get_instance_name (int id) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) return get_factory_name (si->get_factory_uuid ());
+
+ return WideString ();
+}
+
+WideString
+FrontEndBase::get_instance_authors (int id) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) return get_factory_authors (si->get_factory_uuid ());
+
+ return WideString ();
+}
+
+WideString
+FrontEndBase::get_instance_credits (int id) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) return get_factory_credits (si->get_factory_uuid ());
+
+ return WideString ();
+}
+
+WideString
+FrontEndBase::get_instance_help (int id) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) return get_factory_help (si->get_factory_uuid ());
+
+ return WideString ();
+}
+
+String
+FrontEndBase::get_instance_icon_file (int id) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) return get_factory_icon_file (si->get_factory_uuid ());
+
+ return String ();
+}
+
+void
+FrontEndBase::get_instance_list (std::vector<String> &vec) const
+{
+ IMEngineInstanceRepository::iterator it = m_impl->m_instance_repository.begin ();
+
+ for (; it != m_impl->m_instance_repository.end (); it++) {
+ WideString name = get_instance_name (it->first);
+
+ vec.push_back (utf8_wcstombs (name));
+ }
+}
+
+void
+FrontEndBase::focus_in (int id) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) si->focus_in ();
+}
+
+void
+FrontEndBase::focus_out (int id) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) si->focus_out ();
+}
+
+void
+FrontEndBase::reset (int id) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) si->reset ();
+}
+
+bool
+FrontEndBase::process_key_event (int id, const KeyEvent& key) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) return si->process_key_event (key);
+
+ return false;
+}
+
+void
+FrontEndBase::move_preedit_caret (int id, unsigned int pos) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) si->move_preedit_caret (pos);
+}
+
+void
+FrontEndBase::select_aux (int id, unsigned int index) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) si->select_aux (index);
+}
+
+void
+FrontEndBase::select_candidate (int id, unsigned int index) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) si->select_candidate (index);
+}
+
+void
+FrontEndBase::update_lookup_table_page_size (int id, unsigned int page_size) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) si->update_lookup_table_page_size (page_size);
+}
+
+void
+FrontEndBase::lookup_table_page_up (int id) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) si->lookup_table_page_up ();
+}
+
+void
+FrontEndBase::lookup_table_page_down (int id) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) si->lookup_table_page_down ();
+}
+
+void
+FrontEndBase::reset_option (int id) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) si->reset_option ();
+}
+
+void
+FrontEndBase::trigger_property (int id, const String & property) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) si->trigger_property (property);
+}
+
+void
+FrontEndBase::process_helper_event (int id, const String & helper_uuid, const Transaction & trans) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) si->process_helper_event (helper_uuid, trans);
+}
+
+void
+FrontEndBase::update_client_capabilities (int id, unsigned int cap) const
+{
+ IMEngineInstancePointer si = m_impl->find_instance (id);
+
+ if (!si.null ()) si->update_client_capabilities (cap);
+}
+
+void
+FrontEndBase::show_preedit_string (int id)
+{
+}
+void
+FrontEndBase::show_aux_string (int id)
+{
+}
+void
+FrontEndBase::show_lookup_table (int id)
+{
+}
+void
+FrontEndBase::hide_preedit_string (int id)
+{
+}
+void
+FrontEndBase::hide_aux_string (int id)
+{
+}
+void
+FrontEndBase::hide_lookup_table (int id)
+{
+}
+void
+FrontEndBase::update_preedit_caret (int id, int caret)
+{
+}
+void
+FrontEndBase::update_preedit_string (int id, const WideString & str, const AttributeList & attrs)
+{
+}
+void
+FrontEndBase::update_aux_string (int id, const WideString & str, const AttributeList & attrs)
+{
+}
+void
+FrontEndBase::update_lookup_table (int id, const LookupTable & table)
+{
+}
+void
+FrontEndBase::commit_string (int id, const WideString & str)
+{
+}
+void
+FrontEndBase::forward_key_event (int id, const KeyEvent & key)
+{
+}
+void
+FrontEndBase::register_properties (int id, const PropertyList & properties)
+{
+}
+void
+FrontEndBase::update_property (int id, const Property & property)
+{
+}
+void
+FrontEndBase::beep (int id)
+{
+}
+void
+FrontEndBase::start_helper (int id, const String &helper_uuid)
+{
+}
+void
+FrontEndBase::stop_helper (int id, const String &helper_uuid)
+{
+}
+void
+FrontEndBase::send_helper_event (int id, const String &helper_uuid, const Transaction &trans)
+{
+}
+bool
+FrontEndBase::get_surrounding_text (int id, WideString &text, int &cursor, int maxlen_before, int maxlen_after)
+{
+ return false;
+}
+bool
+FrontEndBase::delete_surrounding_text (int id, int offset, int len)
+{
+ return false;
+}
+void
+FrontEndBase::dump_instances ()
+{
+ std::cout << "Instances in FrontEnd:" << std::endl;
+ IMEngineInstanceRepository::iterator it = m_impl->m_instance_repository.begin ();
+ for (; it != m_impl->m_instance_repository.end (); it++)
+ {
+ String name = get_instance_uuid (it->first);
+ std::cout << "\t" << name << "-----" << it->first << std::endl;
+ }
+
+ return;
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/** @file scim_frontend.h
+ * @brief Defines scim::FrontEndBase interface.
+ *
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_frontend.h,v 1.42 2005/10/06 18:02:06 liuspider Exp $
+ */
+
+#ifndef __SCIM_FRONTEND_H
+#define __SCIM_FRONTEND_H
+
+namespace scim {
+
+/**
+ * @addtogroup FrontEnd
+ * @ingroup InputServiceFramework
+ * The base classes for FrontEnd modules.
+ * @{
+ */
+
+/**
+ * @brief An exception class to hold FrontEnd related errors.
+ *
+ * scim::FrontEndBase and its derived classes must throw
+ * scim::FrontEndError object when error.
+ */
+class FrontEndError: public Exception
+{
+public:
+ FrontEndError (const String& what_arg)
+ : Exception (String("scim::FrontEnd: ") + what_arg) { }
+};
+
+class FrontEndBase;
+
+/**
+ * @typedef typedef Pointer <FrontEndBase> FrontEndPointer;
+ *
+ * A smart pointer for scim::FrontEndBase and its derived classes.
+ */
+typedef Pointer <FrontEndBase> FrontEndPointer;
+
+/**
+ * @brief The base class to implement the FrontEnd objects.
+ *
+ * FrontEnd is an interface between IMEngineFactory/IMEngineInstance objects
+ * and the user applications. It forward the user requests to
+ * IMEngineFactory/IMEngineInstance objects, and handle the requests sent back.
+ */
+class FrontEndBase : public ReferencedObject
+{
+ class FrontEndBaseImpl;
+
+ FrontEndBaseImpl *m_impl;
+
+ friend class FrontEndBaseImpl;
+
+public:
+ /**
+ * @brief Constructor.
+ * @param backend A BackEnd object which holds all IMEngineFactory objects.
+ */
+ FrontEndBase (const BackEndPointer &backend);
+
+ /**
+ * @brief Virtual destructor.
+ */
+ virtual ~FrontEndBase ();
+
+protected:
+ /**
+ * @name functions can be used by derived classes.
+ *
+ * @{
+ */
+
+ /**
+ * @brief Add one IMEngine module in BackEnd
+ *
+ *
+ * @return void.
+ */
+ void add_module (const ConfigPointer &config, const String module, bool is_load_resource) const;
+
+ /**
+ * @brief Add one IMEngine module info in BackEnd
+ *
+ *
+ * @return void.
+ */
+ void add_module_info (const ConfigPointer &config, const String module) const;
+
+ /**
+ * @brief Get the IMEngine factories list for specific encoding
+ *
+ * @param uuids the vector to store the factories' uuids which
+ * support the encoding.
+ * @param encoding the encoding to be queried. If empty,
+ * all IMEngine factories will be returned.
+ *
+ * @return the number of IMEngine factories found.
+ */
+ uint32 get_factory_list_for_encoding (std::vector<String> &uuids, const String &encoding) const;
+
+ /**
+ * @brief Get the IMEngine factories list for specific language
+ *
+ * @param uuids the vector to store the factories' uuids which
+ * support the encoding.
+ * @param language the language to be queried. If empty,
+ * all IMEngine factories will be returned.
+ *
+ * @return the number of IMEngine factories found.
+ */
+ uint32 get_factory_list_for_language (std::vector<String> &uuids, const String &language) const;
+
+ uint32 get_factory_list (std::vector<String> &uuids) const;
+
+ /**
+ * @brief Get the default IMEngineFactory UUID for a specific language and encoding.
+ *
+ * @param language the language to be queried.
+ * @param encoding the encoding to be queried, if empty then don't match encoding.
+ *
+ * @return the UUID of the default IMEngineFactory for this language.
+ */
+ String get_default_factory (const String &language, const String &encoding) const;
+
+ /**
+ * @brief Set the default IMEngineFactory for a specific language.
+ *
+ * @param language the language to be set.
+ * @param uuid the uuid of the default IMEngineFactory for this language.
+ */
+ void set_default_factory (const String &language, const String &uuid);
+
+ /**
+ * @brief Get the next IMEngineFactory for a specific language and encoding.
+ *
+ * @param language the language to be queried, if empty then don't match language.
+ * @param encoding the encoding to be queried, if empty then don't match encoding.
+ * @param cur_uuid the UUID of current IMEngineFactory.
+ *
+ * @return the UUID of the next IMEngineFactory for this language and encoding
+ * corresponding to the current IMEngineFactory.
+ */
+ String get_next_factory (const String &language, const String &encoding, const String &cur_uuid) const;
+
+ /**
+ * @brief Get the previous IMEngineFactory for a specific language and encoding.
+ *
+ * @param language the language to be queried, if empty then don't match language.
+ * @param encoding the encoding to be queried, if empty then don't match encoding.
+ * @param cur_uuid the UUID of current IMEngineFactory.
+ *
+ * @return the UUID of the previous IMEngineFactory for this language and encoding
+ * corresponding to the current IMEngineFactory.
+ */
+ String get_previous_factory (const String &language, const String &encoding, const String &cur_uuid) const;
+
+ /**
+ * @brief get the name of an IMEngine factory.
+ *
+ * @param uuid the uuid of the IMEngine factory
+ * @return the name of the IMEngine factory.
+ */
+ WideString get_factory_name (const String &uuid) const;
+
+ /**
+ * @brief get the authors info of an IMEngine factory.
+ * @param uuid the uuid of the IMEngine factory
+ * @return the authors info of the IMEngine factory.
+ */
+ WideString get_factory_authors (const String &uuid) const;
+
+ /**
+ * @brief get the credits info of an IMEngine factory.
+ * @param uuid the uuid of the IMEngine factory
+ * @return the credits info of the IMEngine factory.
+ */
+ WideString get_factory_credits (const String &uuid) const;
+
+ /**
+ * @brief get the help info of an IMEngine factory.
+ * @param uuid the uuid of the IMEngine factory
+ * @return the help info of the IMEngine factory.
+ */
+ WideString get_factory_help (const String &uuid) const;
+
+ /**
+ * @brief get the icon file of an IMEngine factory.
+ * @param uuid the uuid of the IMEngine factory
+ * @return the icon file name of the IMEngine factory.
+ */
+ String get_factory_icon_file (const String &uuid) const;
+
+ /**
+ * @brief get the supported locales of an IMEngine factory.
+ * @param uuid the uuid of the IMEngine factory
+ * @return a comma separated list of the supported locales.
+ */
+ String get_factory_locales (const String &uuid) const;
+
+ /**
+ * @brief get the language of an IMEngine factory.
+ * @param uuid the uuid of the IMEngine factory
+ * @return the language of this IMEngine factory.
+ */
+ String get_factory_language (const String &uuid) const;
+
+ /**
+ * @brief Check if an IMEngine factory is valid and the given encoding is supported by it.
+ *
+ * @param uuid The uuid of the IMEngine factory to be checked.
+ * @param encoding The encoding should be supported by the factory.
+ * @return true if the factory is valid and the given encoding is supported.
+ */
+ bool validate_factory (const String &uuid, const String &encoding = String ("")) const;
+
+ /**
+ * @brief get all locales supported by BackEnd.
+ * @return a comman separated list of all supported locales.
+ */
+ String get_all_locales () const;
+
+ // IMEngine instance related functions.
+
+ /**
+ * @brief create a new IMEngine instance for specific encoding.
+ *
+ * @param sf_uuid the IMEngineFactory UUID.
+ * @param encoding the encoding to be used.
+ *
+ * @return the newly created IMEngine instance id, -1 means error occurred.
+ */
+ int new_instance (const ConfigPointer &config, const String &sf_uuid, const String &encoding);
+
+ /**
+ * @brief replace an IMEngine instance by a new instance created by another factory.
+ *
+ * This function is used to change the input method for an input context on the fly.
+ *
+ * @param si_id the IMEngine instance to be replaced.
+ * @param sf_uuid the new IMEngine factory to be used.
+ * @return true if success.
+ */
+ bool replace_instance (int si_id, const String &sf_uuid);
+
+ /**
+ * @brief delete an IMEngine instance according to its id.
+ * @param id the id of the IMEngine instance to be deleted.
+ * @return true if success, false if there is no such instance.
+ */
+ bool delete_instance (int id);
+
+ /**
+ * @brief delete all IMEngine instances.
+ *
+ * This function should be called just before quitting the FrontEnd.
+ */
+ void delete_all_instances ();
+
+ /**
+ * @brief get the factory uuid of this instance.
+ * @param id the IMEngine instance id.
+ * @return the factory uuid of this instance.
+ */
+ String get_instance_uuid (int id) const;
+
+ /**
+ * @brief get the working encoding of an IMEngine instance.
+ * @param id the IMEngine instance id.
+ * @return the working encoding of this IMEngine instance.
+ */
+ String get_instance_encoding (int id) const;
+
+ /**
+ * @brief get the name of an IMEngine instance.
+ * @param id the IMEngine instance id.
+ * @return the name of this IMEngine instance,
+ * aka. the name of its factory.
+ */
+ WideString get_instance_name (int id) const;
+
+ /**
+ * @brief get the authors info of an IMEngine instance.
+ * @param id the IMEngine instance id.
+ * @return the authors info of this IMEngine instance,
+ * aka. the authors of its factory.
+ */
+ WideString get_instance_authors (int id) const;
+
+ /**
+ * @brief get the credits info of an IMEngine instance.
+ * @param id the IMEngine instance id.
+ * @return the credits info of this IMEngine instance,
+ * aka. the credits of its factory.
+ */
+ WideString get_instance_credits (int id) const;
+
+ /**
+ * @brief get the help of an IMEngine instance.
+ * @param id the IMEngine instance id.
+ * @return the help of this IMEngine instance,
+ * aka. the help of its factory.
+ */
+ WideString get_instance_help (int id) const;
+
+ /**
+ * @brief get the icon file of an IMEngine instance.
+ * @param id the IMEngine instance id.
+ * @return the icon file name of this IMEngine instance.
+ */
+ String get_instance_icon_file (int id) const;
+
+ void get_instance_list(std::vector<String> &vec) const;
+
+ void dump_instances ();
+
+ /**
+ * @brief process a key event using specific IMEngine instance.
+ * @param id the IMEngine instance id.
+ * @param key the key event to be processed.
+ * @return true if the event was processed successfully,
+ * false if the event was not processed and should
+ * be forward to the client application.
+ */
+ bool process_key_event (int id, const KeyEvent& key) const;
+
+ /**
+ * @brief let a specific IMEngine instance move its preedit caret.
+ * @param id the IMEngine instance id.
+ * @param pos the new preedit caret position.
+ */
+ void move_preedit_caret (int id, unsigned int pos) const;
+
+ /**
+ * @brief let a specific IMEngine instance select a aux in its current aux string.
+ * @param id the IMEngine instance id.
+ * @param index the aux index in current aux string to be selected.
+ */
+ void select_aux (int id, unsigned int index) const;
+
+ /**
+ * @brief let a specific IMEngine instance select a candidate in its current lookup table.
+ * @param id the IMEngine instance id.
+ * @param index the candidate index in current lookup table page to be selected.
+ */
+ void select_candidate (int id, unsigned int index) const;
+
+ /**
+ * @brief update the page size of a specific IMEngine instance's lookup table.
+ * @param id the IMEngine instance id.
+ * @param page_size the new page size to be used.
+ */
+ void update_lookup_table_page_size (int id, unsigned int page_size) const;
+
+ /**
+ * @brief Let a specific IMEngine instance flip its lookup table to the previous page.
+ */
+ void lookup_table_page_up (int id) const;
+
+ /**
+ * @brief Let a specific IMEngine instance flip its lookup table to the previous page.
+ */
+ void lookup_table_page_down (int id) const;
+
+ /**
+ * @brief reset a specific IMEngine option.
+ * @param id the id of the IMEngine instance to be reset.
+ */
+ void reset_option (int id) const;
+
+ /**
+ * @brief reset a specific IMEngine instance.
+ * @param id the id of the IMEngine instance to be reset.
+ */
+ void reset (int id) const;
+
+ /**
+ * @brief focus in a specific IMEngine instance.
+ * @param id the id of the IMEngine instance to be focused in.
+ */
+ void focus_in (int id) const;
+
+ /**
+ * @brief focus out a specific IMEngine instance.
+ * @param id the id of the IMEngine instance to be focused out.
+ */
+ void focus_out (int id) const;
+
+ /**
+ * @brief trigger a property of a specific IMEngine instance.
+ * @param id the id of the IMEngine instance.
+ * @param property the key of the property to be triggered.
+ */
+ void trigger_property (int id, const String &property) const;
+
+ /**
+ * @brief let a specific IMEngine instance to process the events sent from a Helper process.
+ * @param id the id of the IMEngine instance.
+ * @param helper_uuid the uuid of the Helper process.
+ * @param trans the transaction which contains the events.
+ */
+ void process_helper_event (int id, const String &helper_uuid, const Transaction &trans) const;
+
+ /**
+ * @brief let a specific IMEngine instance to update itself according to the capabilities of the client application.
+ * @param id the id of the IMEngine instance.
+ * @param cap the bitset of the capabilities which are supported by client.
+ */
+ void update_client_capabilities (int id, unsigned int cap) const;
+
+ /**
+ * @}
+ */
+
+protected:
+ /**
+ * @name Virtual protected methods.
+ *
+ * The following methods should be implemented by derivation classes.
+ * these functions handle the real things.
+ *
+ * @{
+ */
+
+ /**
+ * @brief show preedit string area for an IMEngine instance.
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ */
+ virtual void show_preedit_string (int id);
+
+ /**
+ * @brief show aux string area for an IMEngine instance.
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ */
+ virtual void show_aux_string (int id);
+
+ /**
+ * @brief show lookup table area for an IMEngine instance.
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ */
+ virtual void show_lookup_table (int id);
+
+ /**
+ * @brief hide preedit string area for an IMEngine instance.
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ */
+ virtual void hide_preedit_string (int id);
+
+ /**
+ * @brief hide aux string area for an IMEngine instance.
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ */
+ virtual void hide_aux_string (int id);
+
+ /**
+ * @brief hide lookup table area for an IMEngine instance.
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ */
+ virtual void hide_lookup_table (int id);
+
+ /**
+ * @brief update the position of preedit caret for an IMEngine instance.
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ * @param caret the new caret position.
+ */
+ virtual void update_preedit_caret (int id, int caret);
+
+ /**
+ * @brief update the content of preedit string for an IMEngine instance.
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ * @param str the new content of preedit string.
+ * @param attrs the string attributes.
+ */
+ virtual void update_preedit_string (int id, const WideString & str, const AttributeList & attrs);
+
+ /**
+ * @brief update the content of aux string for an IMEngine instance.
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ * @param str the new content of aux string.
+ * @param attrs the string attributes.
+ */
+ virtual void update_aux_string (int id, const WideString & str, const AttributeList & attrs);
+
+ /**
+ * @brief update the content of lookup table for an IMEngine instance.
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ * @param table the new lookup table.
+ */
+ virtual void update_lookup_table (int id, const LookupTable & table);
+
+ /**
+ * @brief commit a string to client for an IMEngine instance.
+ * @param id the id of the IMEngine instance to commit the string.
+ * @param str the string to be committed.
+ */
+ virtual void commit_string (int id, const WideString & str);
+
+ /**
+ * @brief forward a keyevent to the client of an IMEngine instance.
+ * @param id the id of the IMEngine instance.
+ * @param key the key event to be forwarded.
+ */
+ virtual void forward_key_event (int id, const KeyEvent & key);
+
+ /**
+ * @brief register all the properties of an IMEngine instance into this FrontEnd.
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ * @param properties the PropertyList contains all the properties of this IMEngine instance.
+ */
+ virtual void register_properties (int id, const PropertyList & properties);
+
+ /**
+ * @brief update a property of an IMEngine instance.
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ * @param property the Property to be updated.
+ */
+ virtual void update_property (int id, const Property & property);
+
+ /**
+ * @brief generate a short beep.
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ */
+ virtual void beep (int id);
+
+ /**
+ * @brief start a Client Helper process.
+ *
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ * @param helper_uuid The UUID of the Helper object.
+ */
+ virtual void start_helper (int id, const String &helper_uuid);
+
+ /**
+ * @brief stop a Client Helper process.
+ *
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ * @param helper_uuid The UUID of the Helper object.
+ */
+ virtual void stop_helper (int id, const String &helper_uuid);
+
+ /**
+ * @brief send an events transaction to a Client Helper process.
+ *
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ * @param helper_uuid The UUID of the Helper object.
+ * @param trans the transaction which contains events.
+ */
+ virtual void send_helper_event (int id, const String &helper_uuid, const Transaction &trans);
+
+ /**
+ * @brief Retrieves context around the insertion point.
+ *
+ * Input methods typically want context in order to constrain
+ * input text based on existing text;
+ * this is important for languages such as Thai where
+ * only some sequences of characters are allowed.
+ *
+ * Unlike other signal activation actions, this action will return the result
+ * immediately.
+ *
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ * @param text location to store the context string around the insertion point.
+ * @param cursor location to store index of the insertion cursor within @text.
+ * @param maxlen_before the maxmium length of context string to be retrieved
+ * before the cursor; -1 means unlimited.
+ * @param maxlen_after the maxmium length of context string to be retrieved
+ * after the cursor; -1 means unlimited.
+ *
+ * @return true if surrounding text was provided.
+ */
+ virtual bool get_surrounding_text (int id, WideString &text, int &cursor, int maxlen_before, int maxlen_after);
+
+ /**
+ * @brief Ask the client to delete characters around the cursor position.
+ *
+ * In order to use this function, you should first call
+ * get_surrounding_text () to get the current context, and
+ * call this function immediately afterwards to make sure that you
+ * know what you are deleting. You should also account for the fact
+ * that even if the signal was handled, the input context might not
+ * have deleted all the characters that were requested to be deleted.
+ *
+ * @param id the id of the IMEngine instance. It must have been focused in.
+ * @param offset offset from cursor position in chars;
+ * a negative value means start before the cursor.
+ * @param len number of characters to delete.
+ *
+ * @return true if the signal was handled.
+ */
+ virtual bool delete_surrounding_text (int id, int offset, int len);
+ /**
+ * @}
+ */
+
+public:
+ /**
+ * @brief init the frontend.
+ *
+ * This method must be implemented by derivation classes.
+ */
+ virtual void init (int argc, char **argv) = 0;
+
+ /**
+ * @brief run the frontend.
+ *
+ * This method must be implemented by derivation classes.
+ */
+ virtual void run () = 0;
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_FRONTEND_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_frontend_module.cpp,v 1.13 2005/01/10 08:30:54 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_FRONTEND_MODULE
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+FrontEndModule::FrontEndModule ()
+ : m_frontend_init (0),
+ m_frontend_run (0)
+{
+}
+
+FrontEndModule::FrontEndModule (const String &name,
+ const BackEndPointer &backend,
+ const ConfigPointer &config,
+ int argc,
+ char **argv)
+ : m_frontend_init (0),
+ m_frontend_run (0)
+{
+ load (name, backend, config, argc, argv);
+}
+
+bool
+FrontEndModule::load (const String &name,
+ const BackEndPointer &backend,
+ const ConfigPointer &config,
+ int argc,
+ char **argv)
+{
+ try {
+ if (!m_module.load (name, "FrontEnd"))
+ return false;
+
+ m_frontend_init = (FrontEndModuleInitFunc) m_module.symbol ("scim_frontend_module_init");
+ m_frontend_run = (FrontEndModuleRunFunc) m_module.symbol ("scim_frontend_module_run");
+
+ if (!m_frontend_init || !m_frontend_run) {
+ m_module.unload ();
+ m_frontend_init = 0;
+ m_frontend_run = 0;
+ return false;
+ }
+
+ m_frontend_init (backend, config, argc, argv);
+ } catch (...) {
+ m_module.unload ();
+ m_frontend_init = 0;
+ m_frontend_run = 0;
+ return false;
+ }
+
+ return true;
+}
+
+bool
+FrontEndModule::valid () const
+{
+ return (m_module.valid () && m_frontend_init && m_frontend_run);
+}
+
+void
+FrontEndModule::run () const
+{
+ if (valid ())
+ m_frontend_run ();
+}
+
+int scim_get_frontend_module_list (std::vector <String>& mod_list)
+{
+ return scim_get_module_list (mod_list, "FrontEnd");
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_frontend_module.h
+ * @brief definition of FrontEndModule related classes.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_frontend_module.h,v 1.16 2005/01/10 08:30:54 suzhe Exp $
+ */
+
+#ifndef __SCIM_FRONTEND_MODULE_H
+#define __SCIM_FRONTEND_MODULE_H
+
+namespace scim {
+
+/**
+ * @addtogroup FrontEnd
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+/**
+ * @brief Initialize a FrontEnd Module.
+ *
+ * There must be a function called "scim_frontend_module_init"
+ * in each frontend module which complies with this prototype.
+ * This function name can have a prefix like x11_LTX_,
+ * in which "x11" is the module's name.
+ *
+ * @param backend - a BackEnd instance which hold all IMEngineFactory instances.
+ * @param config - a ConfigBase instance to maintain the configuration.
+ */
+typedef void (*FrontEndModuleInitFunc) (const BackEndPointer &backend,
+ const ConfigPointer &config,
+ int argc,
+ char **argv);
+
+/**
+ * @brief Run a FrontEnd Module.
+ *
+ * There must be a function called "scim_frontend_module_run"
+ * in each frontend module which complies with this prototype.
+ * This function name can have a prefix like x11_LTX_,
+ * in which "x11" is the module's name.
+ */
+typedef void (*FrontEndModuleRunFunc) (void);
+
+/**
+ * @brief The class to manipulate the frontend modules.
+ *
+ * This is a wrapper of scim::Module class, which is specially
+ * for manipulating the frontend modules.
+ */
+class FrontEndModule
+{
+ Module m_module;
+
+ FrontEndModuleInitFunc m_frontend_init;
+ FrontEndModuleRunFunc m_frontend_run;
+
+ FrontEndModule (const FrontEndModule &);
+ FrontEndModule & operator= (const FrontEndModule &);
+
+public:
+ /**
+ * @brief Default constructor.
+ */
+ FrontEndModule ();
+
+ /**
+ * @brief Constructor.
+ * @param name - the module's name, eg. "rawcode".
+ * @param backend - a BackEnd instance which holds all IMEngineFactory instances.
+ * @param config - a smart pointer points to a ConfigBase instance.
+ * @param argc - the number of (fake) command line arguments
+ * @param argv - the (fake) command line argument vector
+ */
+ FrontEndModule (const String &name,
+ const BackEndPointer &backend,
+ const ConfigPointer &config,
+ int argc,
+ char **argv);
+
+ /**
+ * @brief Load a FrontEnd module by its name.
+ *
+ * Load a module into memory.
+ * If another module has been loaded into this object,
+ * then the old module will be unloaded first.
+ * If the old module is resident, false will be returned,
+ * and the old module will be untouched.
+ *
+ * @param name - the module's name, eg. "rawcode".
+ * @param backend - a BackEnd instance which holds all IMEngineFactory instances.
+ * @param config - a smart pointer points to a ConfigBase instance.
+ * @param argc - the number of (fake) command line arguments
+ * @param argv - the (fake) command line argument vector
+ */
+ bool load (const String &name,
+ const BackEndPointer &backend,
+ const ConfigPointer &config,
+ int argc,
+ char **argv);
+
+ /**
+ * @brief Check if a module is loaded and initialized successfully.
+ * @return true if a module is already loaded and initialized successfully.
+ */
+ bool valid () const;
+
+ /**
+ * @brief run this FrontEnd module.
+ */
+ void run () const;
+};
+
+/**
+ * @brief Get a name list of currently available frontend modules.
+ * @param mod_list - the result list will be stored here.
+ * @return the number of the modules, equal to mod_list.size ().
+ */
+int scim_get_frontend_module_list (std::vector <String>& mod_list);
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_FRONTEND_MODULE_H
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2004-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_global_config.cpp,v 1.7 2005/09/29 10:51:25 suzhe Exp $
+ */
+
+#define Uses_SCIM_UTILITY
+#define Uses_SCIM_GLOBAL_CONFIG
+#define Uses_C_STDLIB
+#define Uses_C_STDIO
+#define Uses_C_STRING
+#define Uses_STL_FSTREAM
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "scim_private.h"
+#include "scim.h"
+#include "scim_stl_map.h"
+
+namespace scim {
+
+#if SCIM_USE_STL_EXT_HASH_MAP
+typedef __gnu_cxx::hash_map <String, String, scim_hash_string> KeyValueRepository;
+#elif SCIM_USE_STL_HASH_MAP
+typedef std::hash_map <String, String, scim_hash_string> KeyValueRepository;
+#else
+typedef std::map <String, String> KeyValueRepository;
+#endif
+
+class GlobalConfigRepository
+{
+public:
+ KeyValueRepository sys;
+ KeyValueRepository usr;
+ KeyValueRepository updated;
+
+ bool initialized;
+
+public:
+ GlobalConfigRepository () : initialized (false) { }
+ ~GlobalConfigRepository () { scim_global_config_flush (); }
+};
+
+static GlobalConfigRepository __config_repository;
+
+static String
+__trim_blank (const String &str)
+{
+ String::size_type begin, len;
+
+ begin = str.find_first_not_of (" \t\n\v");
+
+ if (begin == String::npos)
+ return String ();
+
+ len = str.find_last_not_of (" \t\n\v") - begin + 1;
+
+ return str.substr (begin, len);
+}
+
+static String
+__get_param_portion (const String &str)
+{
+ String ret = str;
+ return (ret.erase (ret.find_first_of (" \t\n\v="), ret.length() - 1));
+}
+
+static String
+__get_value_portion (const String &str)
+{
+ String ret = str;
+ ret.erase (0, ret.find_first_of ("=") + 1);
+ ret.erase (0, ret.find_first_not_of(" \n\t\v"));
+ return (ret.erase (ret.find_last_not_of(" \t\n\v") + 1));
+}
+
+static void
+__parse_config (std::ifstream &is, KeyValueRepository &repository)
+{
+ char *conf_line = new char [10000];
+
+ while (!is.eof ()) {
+ is.getline (conf_line, 10000);
+ String normalized_line = __trim_blank(conf_line);
+ if ((normalized_line.find_first_of("#") > 0) && (normalized_line.length() != 0)) {
+ if (normalized_line.find_first_of("=") == String::npos) {
+ SCIM_DEBUG_MAIN (2) << " Invalid global config line : " << normalized_line << "\n";
+ continue;
+ }
+
+ if (normalized_line[0] == '=') {
+ SCIM_DEBUG_MAIN (2) << " Invalid global config line : " << normalized_line << "\n";
+ continue;
+ }
+
+ String param = __get_param_portion(normalized_line);
+ String value = __get_value_portion (normalized_line);
+ repository [param] = value;
+
+ SCIM_DEBUG_MAIN (2) << " Global config entry " << param << "=" << value << " is successfully read.\n";
+ }
+ }
+
+ delete [] conf_line;
+}
+
+static void
+__initialize_config ()
+{
+ __config_repository.sys.clear ();
+ __config_repository.usr.clear ();
+
+ String sys_conf_file = String (SCIM_SYSCONFDIR) +
+ String (SCIM_PATH_DELIM_STRING) +
+ String ("scim") +
+ String (SCIM_PATH_DELIM_STRING) +
+ String ("global");
+
+ String usr_conf_file = scim_get_home_dir () +
+ String (SCIM_PATH_DELIM_STRING) +
+ String (".scim") +
+ String (SCIM_PATH_DELIM_STRING) +
+ String ("global");
+
+ std::ifstream sys_is (sys_conf_file.c_str ());
+ std::ifstream usr_is (usr_conf_file.c_str ());
+
+ if (sys_is) {
+ __parse_config (sys_is, __config_repository.sys);
+ __config_repository.initialized = true;
+ }
+
+ if (usr_is) {
+ __parse_config (usr_is, __config_repository.usr);
+ __config_repository.initialized = true;
+ }
+
+ // Load second system configure file for localization
+ String sys_conf_file2 = String (SCIM_SYSCONFDIR) +
+ String (SCIM_PATH_DELIM_STRING) +
+ String ("scim") +
+ String (SCIM_PATH_DELIM_STRING) +
+ String ("conf/global");
+ std::ifstream sys_is2 (sys_conf_file2.c_str ());
+ if (sys_is2) {
+ __parse_config (sys_is2, __config_repository.sys);
+ }
+}
+
+String
+scim_global_config_read (const String &key, const String &defVal)
+{
+ if (!__config_repository.initialized) __initialize_config ();
+
+ if (__config_repository.initialized) {
+ KeyValueRepository::iterator it = __config_repository.usr.find (key);
+
+ if (it == __config_repository.usr.end ()) {
+ it = __config_repository.sys.find (key);
+ if (it == __config_repository.sys.end ())
+ return defVal;
+ }
+
+ return it->second;
+ }
+
+ return defVal;
+}
+
+int
+scim_global_config_read (const String &key, int defVal)
+{
+ if (!__config_repository.initialized) __initialize_config ();
+
+ if (__config_repository.initialized) {
+ KeyValueRepository::iterator it = __config_repository.usr.find (key);
+
+ if (it == __config_repository.usr.end ()) {
+ it = __config_repository.sys.find (key);
+ if (it == __config_repository.sys.end ())
+ return defVal;
+ }
+
+ if (it->second.length ())
+ return strtol (it->second.c_str (), (char **) NULL, 10);
+ }
+
+ return defVal;
+}
+
+bool
+scim_global_config_read (const String &key, bool defVal)
+{
+ if (!__config_repository.initialized) __initialize_config ();
+
+ if (__config_repository.initialized) {
+ KeyValueRepository::iterator it = __config_repository.usr.find (key);
+
+ if (it == __config_repository.usr.end ()) {
+ it = __config_repository.sys.find (key);
+ if (it == __config_repository.sys.end ())
+ return defVal;
+ }
+
+ if (it->second.length ()) {
+ if (it->second == "true" || it->second == "TRUE" || it->second == "True" || it->second == "1")
+ return true;
+ else if (it->second == "false" || it->second == "FALSE" || it->second == "False" || it->second == "0")
+ return false;
+ }
+ }
+
+ return defVal;
+}
+
+double
+scim_global_config_read (const String &key, double defVal)
+{
+ if (!__config_repository.initialized) __initialize_config ();
+
+ if (__config_repository.initialized) {
+ KeyValueRepository::iterator it = __config_repository.usr.find (key);
+
+ if (it == __config_repository.usr.end ()) {
+ it = __config_repository.sys.find (key);
+ if (it == __config_repository.sys.end ())
+ return defVal;
+ }
+
+ if (it->second.length ())
+ return strtod (it->second.c_str (), (char **) NULL);
+ }
+
+ return defVal;
+}
+
+std::vector <String>
+scim_global_config_read (const String &key, const std::vector <String> &defVal)
+{
+ if (!__config_repository.initialized) __initialize_config ();
+
+ if (__config_repository.initialized) {
+ KeyValueRepository::iterator it = __config_repository.usr.find (key);
+
+ if (it == __config_repository.usr.end ()) {
+ it = __config_repository.sys.find (key);
+ if (it == __config_repository.sys.end ())
+ return defVal;
+ }
+
+ if (it->second.length ()) {
+ std::vector <String> strs;
+ scim_split_string_list (strs, it->second, ',');
+ return strs;
+ }
+ }
+
+ return defVal;
+}
+
+std::vector <int>
+scim_global_config_read (const String &key, const std::vector <int> &defVal)
+{
+ if (!__config_repository.initialized) __initialize_config ();
+
+ if (__config_repository.initialized) {
+ KeyValueRepository::iterator it = __config_repository.usr.find (key);
+
+ if (it == __config_repository.usr.end ()) {
+ it = __config_repository.sys.find (key);
+ if (it == __config_repository.sys.end ())
+ return defVal;
+ }
+
+ if (it->second.length ()) {
+ std::vector <String> strs;
+ std::vector <int> ints;
+
+ scim_split_string_list (strs, it->second, ',');
+
+ for (std::vector <String>::iterator i = strs.begin (); i != strs.end (); ++i)
+ ints.push_back (strtol (i->c_str (), (char **)NULL, 10));
+
+ return ints;
+ }
+ }
+
+ return defVal;
+}
+
+void
+scim_global_config_write (const String &key, const String &val)
+{
+ if (!__config_repository.initialized) __initialize_config ();
+
+ if (__config_repository.initialized && key.length ()) {
+ __config_repository.usr [key] = val;
+ __config_repository.updated [key] = "updated";
+ }
+}
+
+void
+scim_global_config_write (const String &key, int val)
+{
+ if (!__config_repository.initialized) __initialize_config ();
+
+ if (__config_repository.initialized && key.length ()) {
+ char buf [80];
+ snprintf (buf, 80, "%d", val);
+ __config_repository.usr [key] = String (buf);
+ __config_repository.updated [key] = "updated";
+ }
+}
+
+void
+scim_global_config_write (const String &key, bool val)
+{
+ if (!__config_repository.initialized) __initialize_config ();
+
+ if (__config_repository.initialized && key.length ()) {
+ __config_repository.usr [key] = (val ? "true" : "false");
+ __config_repository.updated [key] = "updated";
+ }
+}
+
+void
+scim_global_config_write (const String &key, double val)
+{
+ if (!__config_repository.initialized) __initialize_config ();
+
+ if (__config_repository.initialized && key.length ()) {
+ char buf [80];
+ snprintf (buf, 80, "%lf", val);
+ __config_repository.usr [key] = String (buf);
+ __config_repository.updated [key] = "updated";
+ }
+}
+
+void
+scim_global_config_write (const String &key, const std::vector <String> &val)
+{
+ if (!__config_repository.initialized) __initialize_config ();
+
+ if (__config_repository.initialized && key.length ()) {
+ __config_repository.usr [key] = scim_combine_string_list (val, ',');
+ __config_repository.updated [key] = "updated";
+ }
+}
+
+void
+scim_global_config_write (const String &key, const std::vector <int> &val)
+{
+ if (!__config_repository.initialized) __initialize_config ();
+
+ if (__config_repository.initialized && key.length ()) {
+ std::vector <String> strvec;
+ char buf [80];
+ for (size_t i = 0; i < val.size (); ++i) {
+ snprintf (buf, 80, "%d", val [i]);
+ strvec.push_back (buf);
+ }
+ __config_repository.usr [key] = scim_combine_string_list (strvec, ',');
+ __config_repository.updated [key] = "updated";
+ }
+}
+
+void
+scim_global_config_reset (const String &key)
+{
+ if (!__config_repository.initialized) __initialize_config ();
+
+ if (__config_repository.initialized && key.length ()) {
+ __config_repository.usr.erase (key);
+ __config_repository.updated [key] = "erased";
+ }
+}
+
+void
+scim_global_config_update ()
+{
+ __initialize_config ();
+}
+
+bool
+scim_global_config_flush ()
+{
+ if (!__config_repository.initialized)
+ return false;
+
+ if (!__config_repository.updated.size ())
+ return true;
+
+ String usr_conf_dir = scim_get_home_dir () +
+ String (SCIM_PATH_DELIM_STRING) +
+ String (".scim");
+
+ String usr_conf_file = usr_conf_dir +
+ String (SCIM_PATH_DELIM_STRING) +
+ String ("global");
+
+ if (access (usr_conf_dir.c_str (), R_OK | W_OK) != 0) {
+ mkdir (usr_conf_dir.c_str (), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
+ if (access (usr_conf_dir.c_str (), R_OK | W_OK) != 0)
+ return false;
+ }
+
+ KeyValueRepository backup_usr = __config_repository.usr;
+
+ // Reload all configuration.
+ __initialize_config ();
+
+ for (KeyValueRepository::iterator it = __config_repository.updated.begin ();
+ it != __config_repository.updated.end (); ++it) {
+ if (it->second == "updated")
+ __config_repository.usr [it->first] = backup_usr [it->first];
+ else if (it->second == "erased")
+ __config_repository.usr.erase (it->first);
+ }
+
+ std::ofstream usr_os (usr_conf_file.c_str ());
+
+ if (usr_os) {
+ for (KeyValueRepository::iterator it = __config_repository.usr.begin ();
+ it != __config_repository.usr.end (); ++it) {
+ usr_os << it->first << " = " << it->second << "\n";
+ }
+ __config_repository.updated.clear ();
+ return true;
+ }
+
+ return false;
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/** @file scim_global_config.h
+ * @brief functions to read the global configurations.
+ *
+ * The global configuration file (normally /etc/scim/global) is used to store
+ * the configurations for libscim itself and the system wide configurations which
+ * will be read before any Config module is loaded.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2004-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_global_config.h,v 1.4 2005/01/10 08:30:54 suzhe Exp $
+ */
+
+#ifndef __SCIM_GLOBAL_CONFIG_H
+#define __SCIM_GLOBAL_CONFIG_H
+
+namespace scim {
+/**
+ * @addtogroup Accessories
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+/**
+ * @brief Read a string value from the global configuration file.
+ *
+ * @param key The key to be read, like /PanelProgram etc.
+ * @param defVal The default value to be returned if there is no such key in the configuration file.
+ *
+ * @return the value string of the key.
+ */
+String scim_global_config_read (const String &key, const String &defVal = String ());
+
+/**
+ * @brief Read an int value from the global configuration file.
+ *
+ * @param key The key to be read, like /SocketTimeout etc.
+ * @param defVal The default value to be returned if there is no such key in the configuration file.
+ *
+ * @return the value of the key.
+ */
+int scim_global_config_read (const String &key, int defVal);
+
+/**
+ * @brief Read a bool value from the global configuration file.
+ *
+ * @param key The key to be read.
+ * @param defVal The default value to be returned if there is no such key in the configuration file.
+ *
+ * @return the value of the key.
+ */
+bool scim_global_config_read (const String &key, bool defVal);
+
+/**
+ * @brief Read a double value from the global configuration file.
+ *
+ * @param key The key to be read.
+ * @param defVal The default value to be returned if there is no such key in the configuration file.
+ *
+ * @return the value of the key.
+ */
+double scim_global_config_read (const String &key, double defVal);
+
+/**
+ * @brief Read a string list from the global configuration file.
+ *
+ * @param key The key to be read.
+ * @param defVal The default value to be returned if there is no such key in the configuration file.
+ *
+ * @return the value of the key.
+ */
+std::vector <String> scim_global_config_read (const String &key, const std::vector <String> &defVal);
+
+/**
+ * @brief Read an int list from the global configuration file.
+ *
+ * @param key The key to be read.
+ * @param defVal The default value to be returned if there is no such key in the configuration file.
+ *
+ * @return the value of the key.
+ */
+std::vector <int> scim_global_config_read (const String &key, const std::vector <int> &defVal);
+
+/**
+ * @brief Write a string value into the user global config.
+ *
+ * @param key The key to be associated.
+ * @param val The string value to be written.
+ */
+void scim_global_config_write (const String &key, const String &val);
+
+/**
+ * @brief Write an int value into the user global config.
+ *
+ * @param key The key to be associated.
+ * @param val The int value to be written.
+ */
+void scim_global_config_write (const String &key, int val);
+
+/**
+ * @brief Write a bool value into the user global config.
+ *
+ * @param key The key to be associated.
+ * @param val The bool value to be written.
+ */
+void scim_global_config_write (const String &key, bool val);
+
+/**
+ * @brief Write a double value into the user global config.
+ *
+ * @param key The key to be associated.
+ * @param val The double value to be written.
+ */
+void scim_global_config_write (const String &key, double val);
+
+/**
+ * @brief Write a string list into the user global config.
+ *
+ * @param key The key to be associated.
+ * @param val The string list to be written.
+ */
+void scim_global_config_write (const String &key, const std::vector <String> &val);
+
+/**
+ * @brief Write an int list into the user global config.
+ *
+ * @param key The key to be associated.
+ * @param val The int list to be written.
+ */
+void scim_global_config_write (const String &key, const std::vector <int> &val);
+
+/**
+ * @brief Reset the value associated to the specified key to its default value.
+ *
+ * @param key The key to be reset.
+ */
+void scim_global_config_reset (const String &key);
+
+/**
+* @brief update the global config
+*/
+void scim_global_config_update();
+/**
+ * @brief Flush the updated global config into user global config file.
+ * @return true if success.
+ */
+bool scim_global_config_flush ();
+
+/** @} */
+} // namespace scim
+
+#endif //__SCIM_GLOBAL_CONFIG_H
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/** @file scim_helper.cpp
+ * @brief Implementation of class HelperAgent.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2004-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_helper.cpp,v 1.13 2005/05/24 12:22:51 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_TRANSACTION
+#define Uses_SCIM_TRANS_COMMANDS
+#define Uses_SCIM_HELPER
+#define Uses_SCIM_SOCKET
+#define Uses_SCIM_EVENT
+
+#include <string.h>
+
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+typedef Signal3<void, const HelperAgent *, int, const String &>
+ HelperAgentSignalVoid;
+
+typedef Signal4<void, const HelperAgent *, int, const String &, const String &>
+ HelperAgentSignalString;
+
+typedef Signal4<void, const HelperAgent *, int, const String &, const std::vector<String> &>
+ HelperAgentSignalStringVector;
+
+typedef Signal5<void, const HelperAgent *, int, const String &, const String &, const String &>
+ HelperAgentSignalString2;
+
+typedef Signal4<void, const HelperAgent *, int, const String &, int>
+ HelperAgentSignalInt;
+
+typedef Signal5<void, const HelperAgent *, int, const String &, int, int>
+ HelperAgentSignalIntInt;
+
+typedef Signal4<void, const HelperAgent *, int, const String &, const Transaction &>
+ HelperAgentSignalTransaction;
+
+typedef Signal4<void, const HelperAgent *, int, const String &, const rectinfo &>
+ HelperAgentSignalRect;
+
+typedef Signal2<void, const HelperAgent *, struct rectinfo &>
+ HelperAgentSignalSize;
+
+typedef Signal2<void, const HelperAgent *, uint32 &>
+ HelperAgentSignalUintVoid;
+
+typedef Signal3<void, const HelperAgent *, int, uint32 &>
+ HelperAgentSignalIntUint;
+
+typedef Signal3 <void, const HelperAgent *, char *, size_t &>
+ HelperAgentSignalRawVoid;
+
+typedef Signal4 <void, const HelperAgent *, int, char *, size_t &>
+ HelperAgentSignalIntRawVoid;
+
+typedef Signal3 <void, const HelperAgent *, char **, size_t &>
+ HelperAgentSignalGetIMDataVoid;
+
+typedef Signal5 <void, const HelperAgent *, uint32 &, uint32 &, char *, char *>
+ HelperAgentSignalSetPrivateKeyVoid;
+
+typedef Signal4<void, const HelperAgent *, uint32 &, uint32 &, uint32 &>
+ HelperAgentSignalSetDisableKeyVoid;
+
+typedef Signal2<void, const HelperAgent *, std::vector<uint32> &>
+ HelperAgentSignalUintVector;
+
+class HelperAgent::HelperAgentImpl
+{
+public:
+ SocketClient socket;
+ SocketClient socket_active;
+ Transaction recv;
+ Transaction send;
+ uint32 magic;
+ uint32 magic_active;
+ int timeout;
+
+ HelperAgentSignalVoid signal_exit;
+ HelperAgentSignalVoid signal_attach_input_context;
+ HelperAgentSignalVoid signal_detach_input_context;
+ HelperAgentSignalVoid signal_reload_config;
+ HelperAgentSignalInt signal_update_screen;
+ HelperAgentSignalIntInt signal_update_spot_location;
+ HelperAgentSignalInt signal_update_cursor_position;
+ HelperAgentSignalString signal_trigger_property;
+ HelperAgentSignalTransaction signal_process_imengine_event;
+ HelperAgentSignalVoid signal_focus_out;
+ HelperAgentSignalVoid signal_focus_in;
+ HelperAgentSignalIntRawVoid signal_ise_show;
+ HelperAgentSignalVoid signal_ise_hide;
+ HelperAgentSignalSize signal_get_size;
+ HelperAgentSignalUintVoid signal_set_mode;
+ HelperAgentSignalUintVoid signal_set_language;
+ HelperAgentSignalRawVoid signal_set_imdata;
+ HelperAgentSignalGetIMDataVoid signal_get_imdata;
+ HelperAgentSignalSetPrivateKeyVoid signal_set_private_key_by_label;
+ HelperAgentSignalSetPrivateKeyVoid signal_set_private_key_by_image;
+ HelperAgentSignalSetDisableKeyVoid signal_set_disable_key;
+ HelperAgentSignalUintVoid signal_set_layout;
+ HelperAgentSignalUintVoid signal_get_layout;
+ HelperAgentSignalUintVoid signal_set_caps_mode;
+ HelperAgentSignalUintVector signal_get_layout_list;
+ HelperAgentSignalVoid signal_reset_input_context;
+ HelperAgentSignalIntInt signal_update_candidate_ui;
+ HelperAgentSignalRect signal_update_candidate_rect;
+ HelperAgentSignalString2 signal_update_keyboard_ise;
+ HelperAgentSignalStringVector signal_update_keyboard_ise_list;
+ HelperAgentSignalVoid signal_candidate_more_window_show;
+ HelperAgentSignalVoid signal_candidate_more_window_hide;
+ HelperAgentSignalInt signal_select_candidate;
+ HelperAgentSignalVoid signal_candidate_table_page_up;
+ HelperAgentSignalVoid signal_candidate_table_page_down;
+ HelperAgentSignalInt signal_update_candidate_table_page_size;
+ HelperAgentSignalInt signal_select_associate;
+ HelperAgentSignalVoid signal_associate_table_page_up;
+ HelperAgentSignalVoid signal_associate_table_page_down;
+ HelperAgentSignalInt signal_update_associate_table_page_size;
+ HelperAgentSignalVoid signal_reset_ise_context;
+ HelperAgentSignalUintVoid signal_set_screen_direction;
+ HelperAgentSignalRawVoid signal_set_indicator_char_count;
+ HelperAgentSignalRawVoid signal_set_im_embedded_editor_im_button_label;
+ HelperAgentSignalRawVoid signal_set_im_embedded_editor_preset_text;
+ HelperAgentSignalRawVoid signal_set_im_embedded_editor_text;
+ HelperAgentSignalUintVoid signal_set_im_embedded_editor_max_length;
+ HelperAgentSignalUintVoid signal_set_im_embedded_editor_button_senstivity;
+ HelperAgentSignalIntUint signal_set_im_embedded_editor_progress_bar;
+ HelperAgentSignalGetIMDataVoid signal_get_im_embedded_editor_text;
+ HelperAgentSignalRawVoid signal_set_im_indicator_count_label;
+ HelperAgentSignalUintVoid signal_turn_on_log;
+
+public:
+ HelperAgentImpl () : magic (0), magic_active (0), timeout (-1) { }
+};
+
+HelperAgent::HelperAgent ()
+ : m_impl (new HelperAgentImpl ())
+{
+}
+
+HelperAgent::~HelperAgent ()
+{
+ delete m_impl;
+}
+
+/**
+ * @brief Open socket connection to the Panel.
+ *
+ * @param info The information of this Helper object.
+ * @param display The display which this Helper object should run on.
+ *
+ * @return The connection socket id. -1 means failed to create
+ * the connection.
+ */
+int
+HelperAgent::open_connection (const HelperInfo &info,
+ const String &display)
+{
+ if (m_impl->socket.is_connected ())
+ close_connection ();
+
+ SocketAddress address (scim_get_default_panel_socket_address (display));
+ int timeout = scim_get_default_socket_timeout ();
+ uint32 magic;
+
+ if (!address.valid ())
+ return -1;
+ bool ret;
+ int i;
+ ret = m_impl->socket.connect (address);
+ if (ret == false) {
+ scim_usleep (100000);
+ std::cerr << " Re-connecting to PanelAgent server.";
+ ISF_SYSLOG (" Re-connecting to PanelAgent server.\n");
+ for (i = 0; i < 200; ++i) {
+ if (m_impl->socket.connect (address)) {
+ ret = true;
+ break;
+ }
+ std::cerr << ".";
+ scim_usleep (100000);
+ }
+ std::cerr << " Connected :" << i << "\n";
+ ISF_SYSLOG (" Connected :%d\n", i);
+ }
+
+ if (ret == false)
+ {
+ std::cerr << "m_impl->socket.connect () is failed!!!\n";
+ ISF_SYSLOG ("m_impl->socket.connect () is failed!!!\n");
+ return -1;
+ }
+
+ if (!scim_socket_open_connection (magic,
+ String ("Helper"),
+ String ("Panel"),
+ m_impl->socket,
+ timeout)) {
+ m_impl->socket.close ();
+ std::cerr << "scim_socket_open_connection () is failed!!!\n";
+ ISF_SYSLOG ("scim_socket_open_connection () is failed!!!\n");
+ return -1;
+ }
+
+ ISF_SYSLOG ("scim_socket_open_connection () is successful.\n");
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (magic);
+ m_impl->send.put_command (SCIM_TRANS_CMD_PANEL_REGISTER_HELPER);
+ m_impl->send.put_data (info.uuid);
+ m_impl->send.put_data (info.name);
+ m_impl->send.put_data (info.icon);
+ m_impl->send.put_data (info.description);
+ m_impl->send.put_data (info.option);
+
+ if (!m_impl->send.write_to_socket (m_impl->socket, magic)) {
+ m_impl->socket.close ();
+ return -1;
+ }
+
+ int cmd;
+ if (m_impl->recv.read_from_socket (m_impl->socket, timeout) &&
+ m_impl->recv.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ m_impl->recv.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) {
+ m_impl->magic = magic;
+ m_impl->timeout = timeout;
+
+ while (m_impl->recv.get_command (cmd)) {
+ switch (cmd) {
+ case SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT:
+ {
+ uint32 ic;
+ String ic_uuid;
+ while (m_impl->recv.get_data (ic) && m_impl->recv.get_data (ic_uuid))
+ m_impl->signal_attach_input_context (this, ic, ic_uuid);
+ break;
+ }
+ case SCIM_TRANS_CMD_UPDATE_SCREEN:
+ {
+ uint32 screen;
+ if (m_impl->recv.get_data (screen))
+ m_impl->signal_update_screen (this, (uint32) -1, String (""), (int) screen);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ }
+
+ /* connect to the panel agent as the active helper client */
+ if (!m_impl->socket_active.connect (address)) return -1;
+ if (!scim_socket_open_connection (magic,
+ String ("Helper_Active"),
+ String ("Panel"),
+ m_impl->socket_active,
+ timeout)) {
+ m_impl->socket_active.close ();
+ return -1;
+ }
+
+ m_impl->socket_active.set_nonblock_mode ();
+
+ m_impl->magic_active = magic;
+
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (magic);
+ m_impl->send.put_command (SCIM_TRANS_CMD_PANEL_REGISTER_ACTIVE_HELPER);
+ m_impl->send.put_data (info.uuid);
+ m_impl->send.put_data (info.name);
+ m_impl->send.put_data (info.icon);
+ m_impl->send.put_data (info.description);
+ m_impl->send.put_data (info.option);
+
+ if (!m_impl->send.write_to_socket (m_impl->socket_active, magic)) {
+ m_impl->socket_active.close ();
+ return -1;
+ }
+
+ return m_impl->socket.get_id ();
+}
+
+/**
+ * @brief Close the socket connection to Panel.
+ */
+void
+HelperAgent::close_connection ()
+{
+ m_impl->socket.close ();
+ m_impl->socket_active.close ();
+ m_impl->send.clear ();
+ m_impl->recv.clear ();
+ m_impl->magic = 0;
+ m_impl->magic_active = 0;
+ m_impl->timeout = 0;
+}
+
+/**
+ * @brief Get the connection id previously returned by open_connection().
+ *
+ * @return the connection id
+ */
+int
+HelperAgent::get_connection_number () const
+{
+ if (m_impl->socket.is_connected ())
+ return m_impl->socket.get_id ();
+ return -1;
+}
+
+/**
+ * @brief Check whether this HelperAgent has been connected to a Panel.
+ *
+ * Return true when it is connected to panel, otherwise return false.
+ */
+bool
+HelperAgent::is_connected () const
+{
+ return m_impl->socket.is_connected ();
+}
+
+/**
+ * @brief Check if there are any events available to be processed.
+ *
+ * If it returns true then Helper object should call
+ * HelperAgent::filter_event() to process them.
+ *
+ * @return true if there are any events available.
+ */
+bool
+HelperAgent::has_pending_event () const
+{
+ if (m_impl->socket.is_connected () && m_impl->socket.wait_for_data (0) > 0)
+ return true;
+
+ return false;
+}
+
+/**
+ * @brief Process the pending events.
+ *
+ * This function will emit the corresponding signals according
+ * to the events.
+ *
+ * @return false if the connection is broken, otherwise return true.
+ */
+bool
+HelperAgent::filter_event ()
+{
+ if (!m_impl->socket.is_connected () || !m_impl->recv.read_from_socket (m_impl->socket, m_impl->timeout))
+ return false;
+
+ int cmd;
+
+ uint32 ic = (uint32) -1;
+ String ic_uuid;
+
+ if (!m_impl->recv.get_command (cmd) || cmd != SCIM_TRANS_CMD_REPLY)
+ return true;
+
+ /* If there are ic and ic_uuid then read them. */
+ if (!(m_impl->recv.get_data_type () == SCIM_TRANS_DATA_COMMAND) &&
+ !(m_impl->recv.get_data (ic) && m_impl->recv.get_data (ic_uuid)))
+ return true;
+
+ while (m_impl->recv.get_command (cmd)) {
+ switch (cmd) {
+ case SCIM_TRANS_CMD_EXIT:
+ m_impl->signal_exit (this, ic, ic_uuid);
+ break;
+ case SCIM_TRANS_CMD_RELOAD_CONFIG:
+ m_impl->signal_reload_config (this, ic, ic_uuid);
+ break;
+ case SCIM_TRANS_CMD_UPDATE_SCREEN:
+ {
+ uint32 screen;
+ if (m_impl->recv.get_data (screen))
+ m_impl->signal_update_screen (this, ic, ic_uuid, (int) screen);
+ break;
+ }
+ case SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION:
+ {
+ uint32 x, y;
+ if (m_impl->recv.get_data (x) && m_impl->recv.get_data (y))
+ m_impl->signal_update_spot_location (this, ic, ic_uuid, (int) x, (int) y);
+ break;
+ }
+ case ISM_TRANS_CMD_UPDATE_CURSOR_POSITION:
+ {
+ uint32 cursor_pos;
+ if (m_impl->recv.get_data (cursor_pos))
+ m_impl->signal_update_cursor_position (this, ic, ic_uuid, (int) cursor_pos);
+ break;
+ }
+ case SCIM_TRANS_CMD_TRIGGER_PROPERTY:
+ {
+ String property;
+ if (m_impl->recv.get_data (property))
+ m_impl->signal_trigger_property (this, ic, ic_uuid, property);
+ break;
+ }
+ case SCIM_TRANS_CMD_HELPER_PROCESS_IMENGINE_EVENT:
+ {
+ Transaction trans;
+ if (m_impl->recv.get_data (trans))
+ m_impl->signal_process_imengine_event (this, ic, ic_uuid, trans);
+ break;
+ }
+ case SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT:
+ m_impl->signal_attach_input_context (this, ic, ic_uuid);
+ break;
+ case SCIM_TRANS_CMD_HELPER_DETACH_INPUT_CONTEXT:
+ m_impl->signal_detach_input_context (this, ic, ic_uuid);
+ break;
+ case SCIM_TRANS_CMD_FOCUS_OUT:
+ {
+ m_impl->signal_focus_out (this, ic, ic_uuid);
+ break;
+ }
+ case SCIM_TRANS_CMD_FOCUS_IN:
+ {
+ m_impl->signal_focus_in (this, ic, ic_uuid);
+ break;
+ }
+ case ISM_TRANS_CMD_SHOW_ISE:
+ {
+ char *data = NULL;
+ size_t len;
+ if (m_impl->recv.get_data (&data, len))
+ m_impl->signal_ise_show (this, ic, data, len);
+ if (data)
+ delete [] data;
+ break;
+ }
+ case ISM_TRANS_CMD_HIDE_ISE:
+ {
+ m_impl->signal_ise_hide (this, ic, ic_uuid);
+ break;
+ }
+ case ISM_TRANS_CMD_GET_ACTIVE_ISE_SIZE:
+ {
+ struct rectinfo info = {0, 0, 0, 0};
+ m_impl->signal_get_size (this, info);
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REPLY);
+ m_impl->send.put_data (info.pos_x);
+ m_impl->send.put_data (info.pos_y);
+ m_impl->send.put_data (info.width);
+ m_impl->send.put_data (info.height);
+ m_impl->send.write_to_socket (m_impl->socket);
+ break;
+ }
+ case ISM_TRANS_CMD_SET_ISE_MODE:
+ {
+ uint32 mode;
+ if (m_impl->recv.get_data (mode))
+ m_impl->signal_set_mode (this, mode);
+ break;
+ }
+ case ISM_TRANS_CMD_SET_ISE_LANGUAGE:
+ {
+ uint32 language;
+ if (m_impl->recv.get_data (language))
+ m_impl->signal_set_language (this, language);
+ break;
+ }
+ case ISM_TRANS_CMD_SET_ISE_IMDATA:
+ {
+ char *imdata = NULL;
+ size_t len;
+ if (m_impl->recv.get_data (&imdata, len))
+ m_impl->signal_set_imdata (this, imdata, len);
+
+ if (NULL != imdata)
+ delete[] imdata;
+ break;
+ }
+ case ISM_TRANS_CMD_GET_ISE_IMDATA:
+ {
+ char *buf = NULL;
+ size_t len = 0;
+
+ m_impl->signal_get_imdata (this, &buf, len);
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REPLY);
+ m_impl->send.put_data (buf, len);
+ m_impl->send.write_to_socket (m_impl->socket);
+ if (NULL != buf)
+ delete[] buf;
+ break;
+ }
+ case ISM_TRANS_CMD_SET_PRIVATE_KEY:
+ {
+ uint32 layout_idx, key_idx;
+ char *label = NULL;
+ size_t len1;
+ char *value = NULL;
+ size_t len2;
+
+ if (m_impl->recv.get_data (layout_idx)
+ && m_impl->recv.get_data (key_idx)
+ && m_impl->recv.get_data (&label, len1)
+ && m_impl->recv.get_data (&value, len2))
+ {
+ m_impl->signal_set_private_key_by_label (this,
+ layout_idx,
+ key_idx,
+ label,
+ value);
+ }
+ if (NULL != label)
+ delete[] label;
+ if (NULL != value)
+ delete[] value;
+ break;
+ }
+ case ISM_TRANS_CMD_SET_PRIVATE_KEY_BY_IMG:
+ {
+ uint32 layout_idx, key_idx;
+ char *image = NULL;
+ size_t len1;
+ char *value = NULL;
+ size_t len2;
+
+ if (m_impl->recv.get_data (layout_idx)
+ && m_impl->recv.get_data (key_idx)
+ && m_impl->recv.get_data (&image, len1)
+ && m_impl->recv.get_data (&value, len2))
+ {
+ m_impl->signal_set_private_key_by_image (this,
+ layout_idx,
+ key_idx,
+ image,
+ value);
+ }
+ if (NULL != image)
+ delete[] image;
+ if (NULL != value)
+ delete[] value;
+ break;
+ }
+ case ISM_TRANS_CMD_SET_DISABLE_KEY:
+ {
+ uint32 layout_idx, key_idx, disabled;
+
+ if (m_impl->recv.get_data (layout_idx)
+ && m_impl->recv.get_data (key_idx)
+ && m_impl->recv.get_data (disabled))
+ {
+ m_impl->signal_set_disable_key (this,
+ layout_idx,
+ key_idx,
+ disabled);
+ }
+ break;
+ }
+ case ISM_TRANS_CMD_SET_LAYOUT:
+ {
+ uint32 layout;
+
+ if (m_impl->recv.get_data (layout))
+ m_impl->signal_set_layout (this, layout);
+ break;
+ }
+ case ISM_TRANS_CMD_GET_LAYOUT_LIST:
+ {
+ std::vector<uint32> list;
+ list.clear();
+
+ m_impl->signal_get_layout_list (this, list);
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REPLY);
+ m_impl->send.put_data (list);
+ m_impl->send.write_to_socket (m_impl->socket);
+ break;
+ }
+ case ISM_TRANS_CMD_GET_LAYOUT:
+ {
+ uint32 layout = 0;
+
+ m_impl->signal_get_layout (this, layout);
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REPLY);
+ m_impl->send.put_data (layout);
+ m_impl->send.write_to_socket (m_impl->socket);
+ break;
+ }
+ case ISM_TRANS_CMD_SET_CAPS_MODE:
+ {
+ uint32 mode;
+
+ if (m_impl->recv.get_data (mode))
+ m_impl->signal_set_caps_mode (this, mode);
+ break;
+ }
+ case SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT:
+ {
+ m_impl->signal_reset_input_context (this, ic, ic_uuid);
+ break;
+ }
+ case ISM_TRANS_CMD_UPDATE_CANDIDATE_UI:
+ {
+ uint32 style, mode;
+ if (m_impl->recv.get_data (style) && m_impl->recv.get_data (mode))
+ m_impl->signal_update_candidate_ui (this, ic, ic_uuid, style, mode);
+ break;
+ }
+ case ISM_TRANS_CMD_UPDATE_CANDIDATE_RECT:
+ {
+ struct rectinfo info = {0, 0, 0, 0};
+ if (m_impl->recv.get_data (info.pos_x)
+ && m_impl->recv.get_data (info.pos_y)
+ && m_impl->recv.get_data (info.width)
+ && m_impl->recv.get_data (info.height))
+ m_impl->signal_update_candidate_rect (this, ic, ic_uuid, info);
+ break;
+ }
+ case ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE:
+ {
+ String name, uuid;
+ if (m_impl->recv.get_data (name) && m_impl->recv.get_data (uuid))
+ m_impl->signal_update_keyboard_ise (this, ic, ic_uuid, name, uuid);
+ break;
+ }
+ case ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE_LIST:
+ {
+ uint32 num;
+ String ise;
+ std::vector<String> list;
+ if (m_impl->recv.get_data (num))
+ {
+ for (unsigned int i = 0; i < num; i++)
+ {
+ if (m_impl->recv.get_data (ise))
+ list.push_back (ise);
+ else
+ {
+ list.clear ();
+ break;
+ }
+ }
+ m_impl->signal_update_keyboard_ise_list (this, ic, ic_uuid, list);
+ }
+ break;
+ }
+ case ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_SHOW:
+ {
+ m_impl->signal_candidate_more_window_show (this, ic, ic_uuid);
+ break;
+ }
+ case ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_HIDE:
+ {
+ m_impl->signal_candidate_more_window_hide (this, ic, ic_uuid);
+ break;
+ }
+ case SCIM_TRANS_CMD_SELECT_CANDIDATE:
+ {
+ uint32 item;
+ if (m_impl->recv.get_data (item))
+ m_impl->signal_select_candidate (this, ic, ic_uuid, item);
+ break;
+ }
+ case SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP:
+ {
+ m_impl->signal_candidate_table_page_up (this, ic, ic_uuid);
+ break;
+ }
+ case SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN:
+ {
+ m_impl->signal_candidate_table_page_down (this, ic, ic_uuid);
+ break;
+ }
+ case SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE:
+ {
+ uint32 size;
+ if (m_impl->recv.get_data (size))
+ m_impl->signal_update_candidate_table_page_size (this, ic, ic_uuid, size);
+ break;
+ }
+ case ISM_TRANS_CMD_SELECT_ASSOCIATE:
+ {
+ uint32 item;
+ if (m_impl->recv.get_data (item))
+ m_impl->signal_select_associate (this, ic, ic_uuid, item);
+ break;
+ }
+ case ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_UP:
+ {
+ m_impl->signal_associate_table_page_up (this, ic, ic_uuid);
+ break;
+ }
+ case ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_DOWN:
+ {
+ m_impl->signal_associate_table_page_down (this, ic, ic_uuid);
+ break;
+ }
+ case ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE_PAGE_SIZE:
+ {
+ uint32 size;
+ if (m_impl->recv.get_data (size))
+ m_impl->signal_update_associate_table_page_size (this, ic, ic_uuid, size);
+ break;
+ }
+ case ISM_TRANS_CMD_RESET_ISE_CONTEXT:
+ {
+ m_impl->signal_reset_ise_context (this, ic, ic_uuid);
+ break;
+ }
+ case ISM_TRANS_CMD_SET_ISE_SCREEN_DIRECTION:
+ {
+ uint32 direction;
+ if (m_impl->recv.get_data (direction))
+ m_impl->signal_set_screen_direction (this, direction);
+ break;
+ }
+ case ISM_TRANS_CMD_SET_INDICATOR_CHAR_COUNT:
+ {
+ char *buf = NULL;
+ size_t len;
+ if (m_impl->recv.get_data (&buf, len))
+ m_impl->signal_set_indicator_char_count (this, buf, len);
+ if (buf)
+ delete [] buf;
+ break;
+ }
+ case ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_IM_BUTTON_SET_LABEL:
+ {
+ char *buf = NULL;
+ size_t len;
+ if (m_impl->recv.get_data (&buf, len))
+ m_impl->signal_set_im_embedded_editor_im_button_label (this, buf, len);
+ if (buf)
+ delete [] buf;
+ break;
+ }
+ case ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_PRESET_TEXT:
+ {
+ char *buf = NULL;
+ size_t len;
+ if (m_impl->recv.get_data (&buf, len))
+ m_impl->signal_set_im_embedded_editor_preset_text (this, buf, len);
+ if (buf)
+ delete [] buf;
+ break;
+ }
+ case ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_TEXT:
+ {
+ char *buf = NULL;
+ size_t len;
+ if (m_impl->recv.get_data (&buf, len))
+ m_impl->signal_set_im_embedded_editor_text (this, buf, len);
+ if (buf)
+ delete [] buf;
+ break;
+ }
+ case ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_MAX_LENGTH:
+ {
+ uint32 length;
+
+ if (m_impl->recv.get_data (length))
+ m_impl->signal_set_im_embedded_editor_max_length (this, length);
+ break;
+ }
+ case ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_BUTTON_SENSTIVITY:
+ {
+ uint32 senstivity;
+
+ if (m_impl->recv.get_data (senstivity))
+ m_impl->signal_set_im_embedded_editor_button_senstivity (this, senstivity);
+ break;
+ }
+ case ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_PROGRESS_BAR:
+ {
+ uint32 timeout,is_showing;
+
+ if (m_impl->recv.get_data (timeout) && m_impl->recv.get_data (is_showing) )
+ m_impl->signal_set_im_embedded_editor_progress_bar (this, timeout,is_showing);
+ break;
+ }
+ case ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_GET_TEXT:
+ {
+ char *buf = NULL;
+ size_t len = 0;
+
+ m_impl->signal_get_im_embedded_editor_text (this, &buf, len);
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REPLY);
+ m_impl->send.put_data (buf, len);
+ m_impl->send.write_to_socket (m_impl->socket);
+ break;
+ }
+ case ISM_TRANS_CMD_IM_INDICATOR_SET_COUNT_LABEL:
+ {
+ char *buf = NULL;
+ size_t len;
+ if (m_impl->recv.get_data (&buf, len))
+ m_impl->signal_set_im_indicator_count_label (this, buf, len);
+ if (buf)
+ delete [] buf;
+ break;
+ }
+ case ISM_TRANS_CMD_TURN_ON_LOG:
+ {
+ uint32 isOn;
+ if (m_impl->recv.get_data (isOn))
+ m_impl->signal_turn_on_log (this, isOn);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ return true;
+}
+
+/**
+ * @brief Request SCIM to reload all configuration.
+ *
+ * This function should only by used by Setup Helper to request
+ * scim's reloading the configuration.
+ */
+void
+HelperAgent::reload_config () const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (SCIM_TRANS_CMD_RELOAD_CONFIG);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Register some properties into Panel.
+ *
+ * This function send the request to Panel to register a list
+ * of Properties.
+ *
+ * @param properties The list of Properties to be registered into Panel.
+ *
+ * @sa scim::Property.
+ */
+void
+HelperAgent::register_properties (const PropertyList &properties) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (SCIM_TRANS_CMD_REGISTER_PROPERTIES);
+ m_impl->send.put_data (properties);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Update a registered property.
+ *
+ * @param property The property to be updated.
+ */
+void
+HelperAgent::update_property (const Property &property) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (SCIM_TRANS_CMD_UPDATE_PROPERTY);
+ m_impl->send.put_data (property);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Send a set of events to an IMEngineInstance.
+ *
+ * All events should be put into a Transaction.
+ * And the events can only be received by one IMEngineInstance object.
+ *
+ * @param ic The handle of the Input Context to receive the events.
+ * @param ic_uuid The UUID of the Input Context.
+ * @param trans The Transaction object holds the events.
+ */
+void
+HelperAgent::send_imengine_event (int ic,
+ const String &ic_uuid,
+ const Transaction &trans) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (SCIM_TRANS_CMD_PANEL_SEND_IMENGINE_EVENT);
+ m_impl->send.put_data ((uint32)ic);
+ m_impl->send.put_data (ic_uuid);
+ m_impl->send.put_data (trans);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Send a KeyEvent to an IMEngineInstance.
+ *
+ * @param ic The handle of the IMEngineInstance to receive the event.
+ * -1 means the currently focused IMEngineInstance.
+ * @param ic_uuid The UUID of the IMEngineInstance. Empty means don't match.
+ * @param key The KeyEvent to be sent.
+ */
+void
+HelperAgent::send_key_event (int ic,
+ const String &ic_uuid,
+ const KeyEvent &key) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (SCIM_TRANS_CMD_PANEL_SEND_KEY_EVENT);
+ m_impl->send.put_data ((uint32)ic);
+ m_impl->send.put_data (ic_uuid);
+ m_impl->send.put_data (key);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Forward a KeyEvent to client application directly.
+ *
+ * @param ic The handle of the client Input Context to receive the event.
+ * -1 means the currently focused Input Context.
+ * @param ic_uuid The UUID of the IMEngine used by the Input Context.
+ * Empty means don't match.
+ * @param key The KeyEvent to be forwarded.
+ */
+void
+HelperAgent::forward_key_event (int ic,
+ const String &ic_uuid,
+ const KeyEvent &key) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (SCIM_TRANS_CMD_FORWARD_KEY_EVENT);
+ m_impl->send.put_data ((uint32)ic);
+ m_impl->send.put_data (ic_uuid);
+ m_impl->send.put_data (key);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Commit a WideString to client application directly.
+ *
+ * @param ic The handle of the client Input Context to receive the WideString.
+ * -1 means the currently focused Input Context.
+ * @param ic_uuid The UUID of the IMEngine used by the Input Context.
+ * Empty means don't match.
+ * @param wstr The WideString to be committed.
+ */
+void
+HelperAgent::commit_string (int ic,
+ const String &ic_uuid,
+ const WideString &wstr) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (SCIM_TRANS_CMD_COMMIT_STRING);
+ m_impl->send.put_data ((uint32)ic);
+ m_impl->send.put_data (ic_uuid);
+ m_impl->send.put_data (wstr);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Commit a buffer to client application by IMControl.
+ *
+ * @param buf The result context.
+ * @param len The length of buffer.
+ */
+void
+HelperAgent::commit_ise_result_to_imcontrol (char *buf, size_t len) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (ISM_TRANS_CMD_ISE_RESULT_TO_IMCONTROL);
+ m_impl->send.put_data (buf, len);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Request to show preedit string.
+ *
+ * @param ic The handle of the client Input Context to receive the request.
+ * -1 means the currently focused Input Context.
+ * @param ic_uuid The UUID of the IMEngine used by the Input Context.
+ * Empty means don't match.
+ */
+void
+HelperAgent::show_preedit_string (int ic,
+ const String &ic_uuid) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (SCIM_TRANS_CMD_SHOW_PREEDIT_STRING);
+ m_impl->send.put_data ((uint32)ic);
+ m_impl->send.put_data (ic_uuid);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Request to show aux string.
+ */
+void
+HelperAgent::show_aux_string (void) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (SCIM_TRANS_CMD_SHOW_AUX_STRING);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Request to show candidate string.
+ */
+void
+HelperAgent::show_candidate_string (void) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Request to show associate string.
+ */
+void
+HelperAgent::show_associate_string (void) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Request to hide preedit string.
+ *
+ * @param ic The handle of the client Input Context to receive the request.
+ * -1 means the currently focused Input Context.
+ * @param ic_uuid The UUID of the IMEngine used by the Input Context.
+ * Empty means don't match.
+ */
+void
+HelperAgent::hide_preedit_string (int ic,
+ const String &ic_uuid) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (SCIM_TRANS_CMD_HIDE_PREEDIT_STRING);
+ m_impl->send.put_data ((uint32)ic);
+ m_impl->send.put_data (ic_uuid);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Request to hide aux string.
+ */
+void
+HelperAgent::hide_aux_string (void) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (SCIM_TRANS_CMD_HIDE_AUX_STRING);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Request to hide candidate string.
+ */
+void
+HelperAgent::hide_candidate_string (void) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Request to hide associate string.
+ */
+void
+HelperAgent::hide_associate_string (void) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Update a new WideString for preedit.
+ *
+ * @param ic The handle of the client Input Context to receive the WideString.
+ * -1 means the currently focused Input Context.
+ * @param ic_uuid The UUID of the IMEngine used by the Input Context.
+ * Empty means don't match.
+ * @param wstr The WideString to be updated.
+ * @param attrs The attribute list for preedit string.
+ */
+void
+HelperAgent::update_preedit_string (int ic,
+ const String &ic_uuid,
+ const WideString &str,
+ const AttributeList &attrs) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
+ m_impl->send.put_data ((uint32)ic);
+ m_impl->send.put_data (ic_uuid);
+ m_impl->send.put_data (str);
+ m_impl->send.put_data (attrs);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Update a new string for aux.
+ *
+ * @param str The string to be updated.
+ * @param attrs The attribute list for aux string.
+ */
+void
+HelperAgent::update_aux_string (const String &str,
+ const AttributeList &attrs) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (SCIM_TRANS_CMD_UPDATE_AUX_STRING);
+ m_impl->send.put_data (str);
+ m_impl->send.put_data (attrs);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Request to update candidate.
+ *
+ * @param table The lookup table for candidate.
+ */
+void
+HelperAgent::update_candidate_string (const LookupTable &table) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE);
+ m_impl->send.put_data (table);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Request to update associate.
+ *
+ * @param table The lookup table for associate.
+ */
+void
+HelperAgent::update_associate_string (const LookupTable &table) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE);
+ m_impl->send.put_data (table);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief When the input context of ISE is changed,
+ * ISE can call this function to notify application
+ *
+ * @param type type of event.
+ * @param value value of event.
+ */
+void
+HelperAgent::update_input_context (uint32 type, uint32 value) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT);
+ m_impl->send.put_data (type);
+ m_impl->send.put_data (value);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Request to get uuid list of all keyboard ISEs.
+ *
+ * @param uuid The helper ISE UUID.
+ */
+void
+HelperAgent::get_keyboard_ise_list (const String &uuid) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (ISM_TRANS_CMD_GET_KEYBOARD_ISE_LIST);
+ m_impl->send.put_data (uuid);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Set new candidate UI.
+ *
+ * @param style style of new candidate UI.
+ * @param mode mode of new candidate UI.
+ */
+void
+HelperAgent::set_candidate_ui (const ISF_CANDIDATE_STYLE_T style,
+ const ISF_CANDIDATE_MODE_T mode) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (ISM_TRANS_CMD_SET_CANDIDATE_UI);
+ m_impl->send.put_data (style);
+ m_impl->send.put_data (mode);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Request to get current candidate style and mode.
+ *
+ * @param uuid The helper ISE UUID.
+ */
+void
+HelperAgent::get_candidate_ui (const String &uuid) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (ISM_TRANS_CMD_GET_CANDIDATE_UI);
+ m_impl->send.put_data (uuid);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Set candidate position in screen.
+ *
+ * @param left The x position in screen.
+ * @param top The y position in screen.
+ */
+void
+HelperAgent::set_candidate_position (int left, int top) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (ISM_TRANS_CMD_SET_CANDIDATE_POSITION);
+ m_impl->send.put_data (left);
+ m_impl->send.put_data (top);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Request to hide candidate window.
+ */
+void
+HelperAgent::candidate_hide (void) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (ISM_TRANS_CMD_HIDE_CANDIDATE);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Request to get candidate window size and position.
+ *
+ * @param uuid The helper ISE UUID.
+ */
+void
+HelperAgent::get_candidate_window_rect (const String &uuid) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (ISM_TRANS_CMD_GET_CANDIDATE_RECT);
+ m_impl->send.put_data (uuid);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Set current keyboard ISE.
+ *
+ * @param uuid The keyboard ISE UUID.
+ */
+void
+HelperAgent::set_keyboard_ise_by_uuid (const String &uuid) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID);
+ m_impl->send.put_data (uuid);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Request to get current keyboard ISE information.
+ *
+ * @param uuid The helper ISE UUID.
+ */
+void
+HelperAgent::get_keyboard_ise (const String &uuid) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (ISM_TRANS_CMD_GET_KEYBOARD_ISE);
+ m_impl->send.put_data (uuid);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Launch another helper ISE.
+ *
+ * @param loop If loop is true, this function will launch helper ISE by loop.
+ * If loop is false, this function will popup helper ISE list window.
+ */
+void
+HelperAgent::launch_helper_ise (const bool loop) const
+{
+ if (m_impl->socket_active.is_connected ()) {
+ m_impl->send.clear ();
+ m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_impl->send.put_data (m_impl->magic_active);
+ m_impl->send.put_command (ISM_TRANS_CMD_LAUNCH_HELPER_ISE_LIST_SELECTION);
+ if (loop)
+ m_impl->send.put_data (0);
+ else
+ m_impl->send.put_data (1);
+ m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
+ }
+}
+
+/**
+ * @brief Connect a slot to Helper exit signal.
+ *
+ * This signal is used to let the Helper exit.
+ *
+ * The prototype of the slot is:
+ *
+ * void exit (const HelperAgent *agent, int ic, const String &ic_uuid);
+ *
+ * Parameters:
+ * - agent The pointer to the HelperAgent object which emits this signal.
+ * - ic An opaque handle of the currently focused input context.
+ * - ic_uuid The UUID of the IMEngineInstance associated with the focused input context.
+ */
+Connection
+HelperAgent::signal_connect_exit (HelperAgentSlotVoid *slot)
+{
+ return m_impl->signal_exit.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper attach input context signal.
+ *
+ * This signal is used to attach an input context to this helper.
+ *
+ * When an input context requst to start this helper, then this
+ * signal will be emitted as soon as the helper is started.
+ *
+ * When an input context want to start an already started helper,
+ * this signal will also be emitted.
+ *
+ * Helper can send some events back to the IMEngineInstance in this
+ * signal-slot, to inform that it has been started sccessfully.
+ *
+ * The prototype of the slot is:
+ *
+ * void attach_input_context (const HelperAgent *agent, int ic, const String &ic_uuid);
+ */
+Connection
+HelperAgent::signal_connect_attach_input_context (HelperAgentSlotVoid *slot)
+{
+ return m_impl->signal_attach_input_context.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper detach input context signal.
+ *
+ * This signal is used to detach an input context from this helper.
+ *
+ * When an input context requst to stop this helper, then this
+ * signal will be emitted.
+ *
+ * Helper shouldn't send any event back to the IMEngineInstance, because
+ * the IMEngineInstance attached to the ic should have been destroyed.
+ *
+ * The prototype of the slot is:
+ *
+ * void detach_input_context (const HelperAgent *agent, int ic, const String &ic_uuid);
+ */
+Connection
+HelperAgent::signal_connect_detach_input_context (HelperAgentSlotVoid *slot)
+{
+ return m_impl->signal_detach_input_context.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper reload config signal.
+ *
+ * This signal is used to let the Helper reload configuration.
+ *
+ * The prototype of the slot is:
+ *
+ * void reload_config (const HelperAgent *agent, int ic, const String &ic_uuid);
+ */
+Connection
+HelperAgent::signal_connect_reload_config (HelperAgentSlotVoid *slot)
+{
+ return m_impl->signal_reload_config.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper update screen signal.
+ *
+ * This signal is used to let the Helper move its GUI to another screen.
+ * It can only be emitted when SCIM_HELPER_NEED_SCREEN_INFO is set in HelperInfo.option.
+ *
+ * The prototype of the slot is:
+ *
+ * void update_screen (const HelperAgent *agent, int ic, const String &ic_uuid, int screen_number);
+ */
+Connection
+HelperAgent::signal_connect_update_screen (HelperAgentSlotInt *slot)
+{
+ return m_impl->signal_update_screen.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper update spot location signal.
+ *
+ * This signal is used to let the Helper move its GUI according to the current spot location.
+ * It can only be emitted when SCIM_HELPER_NEED_SPOT_LOCATION_INFO is set in HelperInfo.option.
+ *
+ * The prototype of the slot is:
+ * void update_spot_location (const HelperAgent *agent, int ic, const String &ic_uuid, int x, int y);
+ */
+Connection
+HelperAgent::signal_connect_update_spot_location (HelperAgentSlotIntInt *slot)
+{
+ return m_impl->signal_update_spot_location.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper update cursor position signal.
+ *
+ * This signal is used to let the Helper get the cursor position information.
+ *
+ * The prototype of the slot is:
+ * void update_cursor_position (const HelperAgent *agent, int ic, const String &ic_uuid, int cursor_pos);
+ */
+Connection
+HelperAgent::signal_connect_update_cursor_position (HelperAgentSlotInt *slot)
+{
+ return m_impl->signal_update_cursor_position.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper trigger property signal.
+ *
+ * This signal is used to trigger a property registered by this Helper.
+ * A property will be triggered when user clicks on it.
+ *
+ * The prototype of the slot is:
+ * void trigger_property (const HelperAgent *agent, int ic, const String &ic_uuid, const String &property);
+ */
+Connection
+HelperAgent::signal_connect_trigger_property (HelperAgentSlotString *slot)
+{
+ return m_impl->signal_trigger_property.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper process imengine event signal.
+ *
+ * This signal is used to deliver the events sent from IMEngine to Helper.
+ *
+ * The prototype of the slot is:
+ * void process_imengine_event (const HelperAgent *agent, int ic, const String &ic_uuid, const Transaction &transaction);
+ */
+Connection
+HelperAgent::signal_connect_process_imengine_event (HelperAgentSlotTransaction *slot)
+{
+ return m_impl->signal_process_imengine_event.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper focus out signal.
+ *
+ * This signal is used to do something when input context is focus out.
+ *
+ * The prototype of the slot is:
+ * void focus_out (const HelperAgent *agent, int ic, const String &ic_uuid);
+ */
+Connection
+HelperAgent::signal_connect_focus_out (HelperAgentSlotVoid *slot)
+{
+ return m_impl->signal_focus_out.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper focus in signal.
+ *
+ * This signal is used to do something when input context is focus in.
+ *
+ * The prototype of the slot is:
+ * void focus_in (const HelperAgent *agent, int ic, const String &ic_uuid);
+ */
+Connection
+HelperAgent::signal_connect_focus_in (HelperAgentSlotVoid *slot)
+{
+ return m_impl->signal_focus_in.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper show signal.
+ *
+ * This signal is used to show Helper ISE window.
+ *
+ * The prototype of the slot is:
+ * void ise_show (const HelperAgent *agent, int ic, char *buf, size_t &len);
+ */
+Connection
+HelperAgent::signal_connect_ise_show (HelperAgentSlotIntRawVoid *slot)
+{
+ return m_impl->signal_ise_show.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper hide signal.
+ *
+ * This signal is used to hide Helper ISE window.
+ *
+ * The prototype of the slot is:
+ * void ise_hide (const HelperAgent *agent, int ic, const String &ic_uuid);
+ */
+Connection
+HelperAgent::signal_connect_ise_hide (HelperAgentSlotVoid *slot)
+{
+ return m_impl->signal_ise_hide.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper get rect signal.
+ *
+ * This signal is used to get Helper ISE window size and position.
+ *
+ * The prototype of the slot is:
+ * void get_rect (const HelperAgent *agent, struct rectinfo &info);
+ */
+Connection
+HelperAgent::signal_connect_get_size (HelperAgentSlotSize *slot)
+{
+ return m_impl->signal_get_size.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper set mode signal.
+ *
+ * This signal is used to set Helper ISE mode.
+ *
+ * The prototype of the slot is:
+ * void set_mode (const HelperAgent *agent, uint32 &mode);
+ */
+Connection
+HelperAgent::signal_connect_set_mode (HelperAgentSlotUintVoid *slot)
+{
+ return m_impl->signal_set_mode.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper set language signal.
+ *
+ * This signal is used to set Helper ISE language.
+ *
+ * The prototype of the slot is:
+ * void set_language (const HelperAgent *agent, uint32 &language);
+ */
+Connection
+HelperAgent::signal_connect_set_language (HelperAgentSlotUintVoid *slot)
+{
+ return m_impl->signal_set_language.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper set im data signal.
+ *
+ * This signal is used to send im data to Helper ISE.
+ *
+ * The prototype of the slot is:
+ * void set_imdata (const HelperAgent *agent, char *buf, size_t &len);
+ */
+Connection
+HelperAgent::signal_connect_set_imdata (HelperAgentSlotRawVoid *slot)
+{
+ return m_impl->signal_set_imdata.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper get im data signal.
+ *
+ * This signal is used to get im data from Helper ISE.
+ *
+ * The prototype of the slot is:
+ * void get_imdata (const HelperAgent *, char **buf, size_t &len);
+ */
+Connection
+HelperAgent::signal_connect_get_imdata (HelperAgentSlotGetIMDataVoid *slot)
+{
+ return m_impl->signal_get_imdata.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper set label private key signal.
+ *
+ * This signal is used to send label private key to Helper ISE.
+ *
+ * The prototype of the slot is:
+ * void set_private_key_by_label (const HelperAgent *agent, uint32 &layout_idx,
+ * uint32 & key_idx, char *label, char *value);
+ */
+Connection
+HelperAgent::signal_connect_set_private_key_by_label (HelperAgentSlotSetPrivateKeyVoid *slot)
+{
+ return m_impl->signal_set_private_key_by_label.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper set image private key signal.
+ *
+ * This signal is used to send image private key to Helper ISE.
+ *
+ * The prototype of the slot is:
+ * void set_private_key_by_image (const HelperAgent *agent, uint32 &layout_idx,
+ * uint32 & key_idx, char *img_path, char *value);
+ */
+Connection
+HelperAgent::signal_connect_set_private_key_by_image (HelperAgentSlotSetPrivateKeyVoid *slot)
+{
+ return m_impl->signal_set_private_key_by_image.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper set disable key signal.
+ *
+ * This signal is used to send disable key to Helper ISE.
+ *
+ * The prototype of the slot is:
+ * void set_disable_key (const HelperAgent *agent, uint32 &layout_idx, uint32 &key_idx, uint32 &disabled);
+ */
+Connection
+HelperAgent::signal_connect_set_disable_key (HelperAgentSlotSetDisableKeyVoid *slot)
+{
+ return m_impl->signal_set_disable_key.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper set layout signal.
+ *
+ * This signal is used to set Helper ISE layout.
+ *
+ * The prototype of the slot is:
+ * void set_layout (const HelperAgent *agent, uint32 &layout);
+ */
+Connection
+HelperAgent::signal_connect_set_layout (HelperAgentSlotUintVoid *slot)
+{
+ return m_impl->signal_set_layout.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper get layout signal.
+ *
+ * This signal is used to get Helper ISE layout.
+ *
+ * The prototype of the slot is:
+ * void get_layout (const HelperAgent *agent, uint32 &layout);
+ */
+Connection
+HelperAgent::signal_connect_get_layout (HelperAgentSlotUintVoid *slot)
+{
+ return m_impl->signal_get_layout.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper set shift mode signal.
+ *
+ * This signal is used to set Helper shift mode.
+ *
+ * The prototype of the slot is:
+ * void set_caps_mode (const HelperAgent *agent, uint32 &mode);
+ */
+Connection
+HelperAgent::signal_connect_set_caps_mode (HelperAgentSlotUintVoid *slot)
+{
+ return m_impl->signal_set_caps_mode.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper to get layout list signal.
+ *
+ * This signal is used to get the availabe Helper ISE layout list.
+ *
+ * The prototype of the slot is:
+ * void get_layout_list (const HelperAgent *agent, std::vector<uint32> &list);
+ */
+Connection
+HelperAgent::signal_connect_get_layout_list (HelperAgentSlotUintVector *slot)
+{
+ return m_impl->signal_get_layout_list.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper reset input context signal.
+ *
+ * This signal is used to reset Helper ISE input context.
+ *
+ * The prototype of the slot is:
+ * void reset_input_context (const HelperAgent *agent, int ic, const String &uuid);
+ */
+Connection
+HelperAgent::signal_connect_reset_input_context (HelperAgentSlotVoid *slot)
+{
+ return m_impl->signal_reset_input_context.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper update candidate ui signal.
+ *
+ * This signal is used to get candidate ui style and mode.
+ *
+ * The prototype of the slot is:
+ * void update_candidate_ui (const HelperAgent *agent, int ic, const String &uuid, int style, int mode);
+ */
+Connection
+HelperAgent::signal_connect_update_candidate_ui (HelperAgentSlotIntInt *slot)
+{
+ return m_impl->signal_update_candidate_ui.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper update candidate rect signal.
+ *
+ * This signal is used to get candidate window size and position.
+ *
+ * The prototype of the slot is:
+ * void update_candidate_rect (const HelperAgent *agent, int ic, const String &uuid, const rectinfo &info);
+ */
+Connection
+HelperAgent::signal_connect_update_candidate_rect (HelperAgentSlotRect *slot)
+{
+ return m_impl->signal_update_candidate_rect.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper update keyboard ISE signal.
+ *
+ * This signal is used to get current keyboard ISE name and uuid.
+ *
+ * The prototype of the slot is:
+ * void update_keyboard_ise (const HelperAgent *agent, int ic, const String &uuid,
+ * const String &ise_name, const String &ise_uuid);
+ */
+Connection
+HelperAgent::signal_connect_update_keyboard_ise (HelperAgentSlotString2 *slot)
+{
+ return m_impl->signal_update_keyboard_ise.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper update keyboard ISE list signal.
+ *
+ * This signal is used to get uuid list of all keyboard ISEs.
+ *
+ * The prototype of the slot is:
+ * void update_keyboard_ise_list (const HelperAgent *agent, int ic, const String &uuid,
+ * const std::vector<String> &ise_list);
+ */
+Connection
+HelperAgent::signal_connect_update_keyboard_ise_list (HelperAgentSlotStringVector *slot)
+{
+ return m_impl->signal_update_keyboard_ise_list.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper candidate more window show signal.
+ *
+ * This signal is used to do someting when candidate more window is showed.
+ *
+ * The prototype of the slot is:
+ * void candidate_more_window_show (const HelperAgent *agent, int ic, const String &uuid);
+ */
+Connection
+HelperAgent::signal_connect_candidate_more_window_show (HelperAgentSlotVoid *slot)
+{
+ return m_impl->signal_candidate_more_window_show.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper candidate more window hide signal.
+ *
+ * This signal is used to do someting when candidate more window is hidden.
+ *
+ * The prototype of the slot is:
+ * void candidate_more_window_hide (const HelperAgent *agent, int ic, const String &uuid);
+ */
+Connection
+HelperAgent::signal_connect_candidate_more_window_hide (HelperAgentSlotVoid *slot)
+{
+ return m_impl->signal_candidate_more_window_hide.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper select candidate signal.
+ *
+ * This signal is used to do something when candidate is selected.
+ *
+ * The prototype of the slot is:
+ * void select_candidate (const HelperAgent *agent, int ic, const String &uuid, int index);
+ */
+Connection
+HelperAgent::signal_connect_select_candidate (HelperAgentSlotInt *slot)
+{
+ return m_impl->signal_select_candidate.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper candidate table page up signal.
+ *
+ * This signal is used to do something when candidate table is paged up.
+ *
+ * The prototype of the slot is:
+ * void candidate_table_page_up (const HelperAgent *agent, int ic, const String &uuid);
+ */
+Connection
+HelperAgent::signal_connect_candidate_table_page_up (HelperAgentSlotVoid *slot)
+{
+ return m_impl->signal_candidate_table_page_up.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper candidate table page down signal.
+ *
+ * This signal is used to do something when candidate table is paged down.
+ *
+ * The prototype of the slot is:
+ * void candidate_table_page_down (const HelperAgent *agent, int ic, const String &uuid);
+ */
+Connection
+HelperAgent::signal_connect_candidate_table_page_down (HelperAgentSlotVoid *slot)
+{
+ return m_impl->signal_candidate_table_page_down.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper update candidate table page size signal.
+ *
+ * This signal is used to do something when candidate table page size is changed.
+ *
+ * The prototype of the slot is:
+ * void update_candidate_table_page_size (const HelperAgent *, int ic, const String &uuid, int page_size);
+ */
+Connection
+HelperAgent::signal_connect_update_candidate_table_page_size (HelperAgentSlotInt *slot)
+{
+ return m_impl->signal_update_candidate_table_page_size.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper select associate signal.
+ *
+ * This signal is used to do something when associate is selected.
+ *
+ * The prototype of the slot is:
+ * void select_associate (const HelperAgent *agent, int ic, const String &uuid, int index);
+ */
+Connection
+HelperAgent::signal_connect_select_associate (HelperAgentSlotInt *slot)
+{
+ return m_impl->signal_select_associate.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper associate table page up signal.
+ *
+ * This signal is used to do something when associate table is paged up.
+ *
+ * The prototype of the slot is:
+ * void associate_table_page_up (const HelperAgent *agent, int ic, const String &uuid);
+ */
+Connection
+HelperAgent::signal_connect_associate_table_page_up (HelperAgentSlotVoid *slot)
+{
+ return m_impl->signal_associate_table_page_up.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper associate table page down signal.
+ *
+ * This signal is used to do something when associate table is paged down.
+ *
+ * The prototype of the slot is:
+ * void associate_table_page_down (const HelperAgent *agent, int ic, const String &uuid);
+ */
+Connection
+HelperAgent::signal_connect_associate_table_page_down (HelperAgentSlotVoid *slot)
+{
+ return m_impl->signal_associate_table_page_down.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper update associate table page size signal.
+ *
+ * This signal is used to do something when associate table page size is changed.
+ *
+ * The prototype of the slot is:
+ * void update_associate_table_page_size (const HelperAgent *, int ic, const String &uuid, int page_size);
+ */
+Connection
+HelperAgent::signal_connect_update_associate_table_page_size (HelperAgentSlotInt *slot)
+{
+ return m_impl->signal_update_associate_table_page_size.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper reset ISE context signal.
+ *
+ * This signal is used to reset Helper ISE.
+ *
+ * The prototype of the slot is:
+ * void reset_ise_context (const HelperAgent *agent, int ic, const String &uuid);
+ */
+Connection
+HelperAgent::signal_connect_reset_ise_context (HelperAgentSlotVoid *slot)
+{
+ return m_impl->signal_reset_ise_context.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper set screen direction signal.
+ *
+ * This signal is used to rotate and resize Helper when screen direction is changed.
+ *
+ * The prototype of the slot is:
+ * void set_screen_direction (const HelperAgent *agent, uint32 &mode);
+ */
+Connection
+HelperAgent::signal_connect_set_screen_direction (HelperAgentSlotUintVoid *slot)
+{
+ return m_impl->signal_set_screen_direction.connect (slot);
+}
+
+/**
+ * @brief Connect a slot to Helper turn on log signal.
+ *
+ * This signal is used to turn on Helper ISE debug information.
+ *
+ * The prototype of the slot is:
+ * void turn_on_log (const HelperAgent *agent, uint32 &on);
+ */
+Connection
+HelperAgent::signal_connect_turn_on_log (HelperAgentSlotUintVoid *slot)
+{
+ return m_impl->signal_turn_on_log.connect (slot);
+}
+
+} /* namespace scim */
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/**
+ * @file scim_helper.h
+ * @brief Defines scim::HelperAgent and it's related types.
+ *
+ * scim::HelperAgent is a class used to write Client Helper modules.
+ *
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2004-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_helper.h,v 1.16 2005/05/24 12:22:51 suzhe Exp $
+ */
+
+#ifndef __SCIM_HELPER_H
+#define __SCIM_HELPER_H
+
+#include "scim_utility.h"
+
+namespace scim {
+
+/**
+ * @addtogroup Helper
+ * @ingroup InputServiceFramework
+ * The accessory classes to help develop and manage Client Helper objects.
+ * @{
+ */
+class HelperError: public Exception
+{
+public:
+ HelperError (const String& what_arg)
+ : Exception (String("scim::Helper: ") + what_arg) { }
+};
+
+/**
+ * @brief Helper option indicates that it's a stand alone Helper.
+ *
+ * Stand alone Helper has no corresponding IMEngine Factory,
+ * Such Helper can not be started by IMEngine Factory.
+ * So Panel must provide a menu, or something else, which contains
+ * all stand alone Helper items, so that user can start them by
+ * clicking the items.
+ */
+const uint32 SCIM_HELPER_STAND_ALONE = 1;
+
+/**
+ * @brief Helper option indicates that it must be started
+ * automatically when Panel starts.
+ *
+ * If Helper objects want to start itself as soon as
+ * the Panel starts, set this option.
+ */
+const uint32 SCIM_HELPER_AUTO_START = (1<<1);
+
+/**
+ * @brief Helper option indicates that it should be restarted
+ * when it exits abnormally.
+ *
+ * This option should not be used with #SCIM_HELPER_STAND_ALONE.
+ */
+const uint32 SCIM_HELPER_AUTO_RESTART = (1<<2);
+
+/**
+ * @brief Helper option indicates that it needs the screen update
+ * information.
+ *
+ * Helper object with this option will receive the UPDATE_SCREEN event
+ * when the screen of focused ic is changed.
+ */
+const uint32 SCIM_HELPER_NEED_SCREEN_INFO = (1<<3);
+
+/**
+ * @brief Helper option indicates that it needs the spot location
+ * information.
+ *
+ * Helper object with this option will receive the SPOT_LOCATION_INFO event
+ * when the spot location of focused ic is changed.
+ */
+const uint32 SCIM_HELPER_NEED_SPOT_LOCATION_INFO = (1<<4);
+
+/**
+ * @brief ISE option indicates whether it should be full style
+ */
+const uint32 ISM_ISE_FULL_STYLE = (1<<16);
+
+/**
+ * @brief ISE option indicates whether it should be hidden in control panel.
+ */
+const uint32 ISM_ISE_HIDE_IN_CONTROL_PANEL = (1<<17);
+
+
+/**
+ * @brief Structure to hold the information of a Helper object.
+ */
+struct HelperInfo
+{
+ String uuid; /**< The UUID of this Helper object */
+ String name; /**< The Name of this Helper object, UTF-8 encoding. */
+ String icon; /**< The Icon file path of this Helper object. */
+ String description; /**< The short description of this Helper object. */
+ uint32 option; /**< The options of this Helper object. @sa #SCIM_HELPER_STAND_ALONE etc.*/
+
+ HelperInfo (const String &puuid = String (),
+ const String &pname = String (),
+ const String &picon = String (),
+ const String &pdesc = String (),
+ uint32 opt = 0)
+ : uuid (puuid),
+ name (pname),
+ icon (picon),
+ description (pdesc),
+ option (opt) {
+ }
+};
+
+enum HelperState
+{
+ HELPER_SHOWED,
+ HELPER_HIDED,
+ HELPER_INVALID_STATE
+};
+
+class HelperAgent;
+
+typedef Slot3<void, const HelperAgent *, int, const String &>
+ HelperAgentSlotVoid;
+
+typedef Slot4<void, const HelperAgent *, int, const String &, const String &>
+ HelperAgentSlotString;
+
+typedef Slot4<void, const HelperAgent *, int, const String &, const std::vector<String> &>
+ HelperAgentSlotStringVector;
+
+typedef Slot5<void, const HelperAgent *, int, const String &, const String &, const String &>
+ HelperAgentSlotString2;
+
+typedef Slot4<void, const HelperAgent *, int, const String &, int>
+ HelperAgentSlotInt;
+
+typedef Slot5<void, const HelperAgent *, int, const String &, int, int>
+ HelperAgentSlotIntInt;
+
+typedef Slot4<void, const HelperAgent *, int, const String &, const Transaction &>
+ HelperAgentSlotTransaction;
+
+typedef Slot4<void, const HelperAgent *, int, const String &, const rectinfo &>
+ HelperAgentSlotRect;
+
+typedef Slot2<void, const HelperAgent *, struct rectinfo &>
+ HelperAgentSlotSize;
+
+typedef Slot2<void, const HelperAgent *, uint32 &>
+ HelperAgentSlotUintVoid;
+
+typedef Slot3<void, const HelperAgent *, int, uint32 &>
+ HelperAgentSlotIntUint;
+
+typedef Slot3 <void, const HelperAgent *, char *, size_t &>
+ HelperAgentSlotRawVoid;
+
+typedef Slot4 <void, const HelperAgent *, int, char *, size_t &>
+ HelperAgentSlotIntRawVoid;
+
+typedef Slot3 <void, const HelperAgent *, char **, size_t &>
+ HelperAgentSlotGetIMDataVoid;
+
+typedef Slot5 <void, const HelperAgent *, uint32 &, uint32 &, char *, char *>
+ HelperAgentSlotSetPrivateKeyVoid;
+
+typedef Slot4 <void, const HelperAgent *, uint32 &, uint32 &, uint32 &>
+ HelperAgentSlotSetDisableKeyVoid;
+
+typedef Slot2<void, const HelperAgent *, std::vector<uint32> &>
+ HelperAgentSlotUintVector;
+
+/**
+ * @brief The accessory class to write a Helper object.
+ *
+ * This class implements all Socket Transaction protocol between
+ * Helper object and Panel.
+ */
+class HelperAgent
+{
+ class HelperAgentImpl;
+ HelperAgentImpl *m_impl;
+
+ HelperAgent (const HelperAgent &);
+ const HelperAgent & operator = (const HelperAgent &);
+
+public:
+ HelperAgent ();
+ ~HelperAgent ();
+
+ /**
+ * @brief Open socket connection to the Panel.
+ *
+ * Helper objects and Panel communicate with each other via the Socket
+ * created by Panel, just same as the Socket between FrontEnds and Panel.
+ *
+ * Helper object can select/poll on the connection id returned by this function
+ * to see if there are any data available to be read. If any data are available,
+ * Helper object should call HelperAgent::filter_event() to process the data.
+ *
+ * This method should be called after the necessary signal-slots are connected.
+ * If this Helper is started by an IMEngine Instance, then signal attach_input_context
+ * will be emitted during this call.
+ *
+ * Signal update_screen will be emitted during this call as well to set the startup
+ * screen of this Helper. The ic and ic_uuid parameters are invalid here.
+ *
+ * @param info The information of this Helper object.
+ * @param display The display which this Helper object should run on.
+ *
+ * @return The connection socket id. -1 means failed to create
+ * the connection.
+ */
+ int open_connection (const HelperInfo &info,
+ const String &display);
+
+ /**
+ * @brief Close the socket connection to Panel.
+ */
+ void close_connection ();
+
+ /**
+ * @brief Get the connection id previously returned by open_connection().
+ *
+ * @return the connection id
+ */
+ int get_connection_number () const;
+
+ /**
+ * @brief Check whether this HelperAgent has been connected to a Panel.
+ *
+ * Return true when it is connected to panel, otherwise return false.
+ */
+ bool is_connected () const;
+
+ /**
+ * @brief Check if there are any events available to be processed.
+ *
+ * If it returns true then Helper object should call
+ * HelperAgent::filter_event() to process them.
+ *
+ * @return true if there are any events available.
+ */
+ bool has_pending_event () const;
+
+ /**
+ * @brief Process the pending events.
+ *
+ * This function will emit the corresponding signals according
+ * to the events.
+ *
+ * @return false if the connection is broken, otherwise return true.
+ */
+ bool filter_event ();
+
+ /**
+ * @brief Request SCIM to reload all configuration.
+ *
+ * This function should only by used by Setup Helper to request
+ * scim's reloading the configuration.
+ */
+ void reload_config () const;
+
+ /**
+ * @brief Register some properties into Panel.
+ *
+ * This function send the request to Panel to register a list
+ * of Properties.
+ *
+ * @param properties The list of Properties to be registered into Panel.
+ *
+ * @sa scim::Property.
+ */
+ void register_properties (const PropertyList &properties) const;
+
+ /**
+ * @brief Update a registered property.
+ *
+ * @param property The property to be updated.
+ */
+ void update_property (const Property &property) const;
+
+ /**
+ * @brief Send a set of events to an IMEngineInstance.
+ *
+ * All events should be put into a Transaction.
+ * And the events can only be received by one IMEngineInstance object.
+ *
+ * @param ic The handle of the Input Context to receive the events.
+ * @param ic_uuid The UUID of the Input Context.
+ * @param trans The Transaction object holds the events.
+ */
+ void send_imengine_event (int ic,
+ const String &ic_uuid,
+ const Transaction &trans) const;
+
+ /**
+ * @brief Send a KeyEvent to an IMEngineInstance.
+ *
+ * @param ic The handle of the IMEngineInstance to receive the event.
+ * -1 means the currently focused IMEngineInstance.
+ * @param ic_uuid The UUID of the IMEngineInstance. Empty means don't match.
+ * @param key The KeyEvent to be sent.
+ */
+ void send_key_event (int ic,
+ const String &ic_uuid,
+ const KeyEvent &key) const;
+
+ /**
+ * @brief Forward a KeyEvent to client application directly.
+ *
+ * @param ic The handle of the client Input Context to receive the event.
+ * -1 means the currently focused Input Context.
+ * @param ic_uuid The UUID of the IMEngine used by the Input Context.
+ * Empty means don't match.
+ * @param key The KeyEvent to be forwarded.
+ */
+ void forward_key_event (int ic,
+ const String &ic_uuid,
+ const KeyEvent &key) const;
+
+ /**
+ * @brief Commit a WideString to client application directly.
+ *
+ * @param ic The handle of the client Input Context to receive the WideString.
+ * -1 means the currently focused Input Context.
+ * @param ic_uuid The UUID of the IMEngine used by the Input Context.
+ * Empty means don't match.
+ * @param wstr The WideString to be committed.
+ */
+ void commit_string (int ic,
+ const String &ic_uuid,
+ const WideString &wstr) const;
+
+ /**
+ * @brief Commit a buffer to client application by IMControl.
+ *
+ * @param buf The result context.
+ * @param len The length of buffer.
+ */
+ void commit_ise_result_to_imcontrol (char *buf, size_t len) const;
+
+ /**
+ * @brief Request to show preedit string.
+ *
+ * @param ic The handle of the client Input Context to receive the request.
+ * -1 means the currently focused Input Context.
+ * @param ic_uuid The UUID of the IMEngine used by the Input Context.
+ * Empty means don't match.
+ */
+ void show_preedit_string (int ic,
+ const String &ic_uuid) const;
+
+ /**
+ * @brief Request to show aux string.
+ */
+ void show_aux_string (void) const;
+
+ /**
+ * @brief Request to show candidate string.
+ */
+ void show_candidate_string (void) const;
+
+ /**
+ * @brief Request to show associate string.
+ */
+ void show_associate_string (void) const;
+
+ /**
+ * @brief Request to hide preedit string.
+ *
+ * @param ic The handle of the client Input Context to receive the request.
+ * -1 means the currently focused Input Context.
+ * @param ic_uuid The UUID of the IMEngine used by the Input Context.
+ * Empty means don't match.
+ */
+ void hide_preedit_string (int ic,
+ const String &ic_uuid) const;
+
+ /**
+ * @brief Request to hide aux string.
+ */
+ void hide_aux_string (void) const;
+
+ /**
+ * @brief Request to hide candidate string.
+ */
+ void hide_candidate_string (void) const;
+
+ /**
+ * @brief Request to hide associate string.
+ */
+ void hide_associate_string (void) const;
+
+ /**
+ * @brief Update a new WideString for preedit.
+ *
+ * @param ic The handle of the client Input Context to receive the WideString.
+ * -1 means the currently focused Input Context.
+ * @param ic_uuid The UUID of the IMEngine used by the Input Context.
+ * Empty means don't match.
+ * @param wstr The WideString to be updated.
+ * @param attrs The attribute list for preedit string.
+ */
+ void update_preedit_string (int ic,
+ const String &ic_uuid,
+ const WideString &wstr,
+ const AttributeList &attrs) const;
+
+ /**
+ * @brief Update a new string for aux.
+ *
+ * @param str The string to be updated.
+ * @param attrs The attribute list for aux string.
+ */
+ void update_aux_string (const String &str,
+ const AttributeList &attrs) const;
+
+ /**
+ * @brief Request to update candidate.
+ *
+ * @param table The lookup table for candidate.
+ */
+ void update_candidate_string (const LookupTable &table) const;
+
+ /**
+ * @brief Request to update associate.
+ *
+ * @param table The lookup table for associate.
+ */
+ void update_associate_string (const LookupTable &table) const;
+
+ /**
+ * @ brief When the input context of ISE is changed,
+ * ISE can call this function to notify application
+ *
+ * @param type type of event.
+ * @param value value of event.
+ */
+ void update_input_context (uint32 type,
+ uint32 value) const;
+
+ /**
+ * @ brief Set new candidate UI.
+ *
+ * @param style style of new candidate UI.
+ * @param mode mode of new candidate UI.
+ */
+ void set_candidate_ui (const ISF_CANDIDATE_STYLE_T style,
+ const ISF_CANDIDATE_MODE_T mode) const;
+
+ /**
+ * @ brief Request to get current candidate style and mode.
+ *
+ * @param uuid The helper ISE UUID.
+ */
+ void get_candidate_ui (const String &uuid) const;
+
+ /**
+ * @ brief Set candidate position in screen.
+ *
+ * @param left The x position in screen.
+ * @param top The y position in screen.
+ */
+ void set_candidate_position (int left,
+ int top) const;
+
+ /**
+ * @ brief Request to hide candidate window.
+ */
+ void candidate_hide (void) const;
+
+ /**
+ * @ brief Request to get candidate window size and position.
+ *
+ * @param uuid The helper ISE UUID.
+ */
+ void get_candidate_window_rect(const String &uuid) const;
+
+ /**
+ * @ brief Set current keyboard ISE.
+ *
+ * @param uuid The keyboard ISE UUID.
+ */
+ void set_keyboard_ise_by_uuid (const String &uuid) const;
+
+ /**
+ * @ brief Request to get current keyboard ISE information.
+ *
+ * @param uuid The helper ISE UUID.
+ */
+ void get_keyboard_ise (const String &uuid) const;
+
+ /**
+ * @ brief Request to get uuid list of all keyboard ISEs.
+ *
+ * @param uuid The helper ISE UUID.
+ */
+ void get_keyboard_ise_list (const String &uuid) const;
+
+ /**
+ * @ brief Launch another helper ISE.
+ *
+ * @param loop If loop is true, this function will launch helper ISE by loop.
+ * If loop is false, this function will popup helper ISE list window.
+ */
+ void launch_helper_ise (const bool loop) const;
+
+public:
+ /**
+ * @brief Connect a slot to Helper exit signal.
+ *
+ * This signal is used to let the Helper exit.
+ *
+ * The prototype of the slot is:
+ *
+ * void exit (const HelperAgent *agent, int ic, const String &ic_uuid);
+ *
+ * Parameters:
+ * - agent The pointer to the HelperAgent object which emits this signal.
+ * - ic An opaque handle of the currently focused input context.
+ * - ic_uuid The UUID of the IMEngineInstance associated with the focused input context.
+ */
+ Connection signal_connect_exit (HelperAgentSlotVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper attach input context signal.
+ *
+ * This signal is used to attach an input context to this helper.
+ *
+ * When an input context requst to start this helper, then this
+ * signal will be emitted as soon as the helper is started.
+ *
+ * When an input context want to start an already started helper,
+ * this signal will also be emitted.
+ *
+ * Helper can send some events back to the IMEngineInstance in this
+ * signal-slot, to inform that it has been started sccessfully.
+ *
+ * The prototype of the slot is:
+ *
+ * void attach_input_context (const HelperAgent *agent, int ic, const String &ic_uuid);
+ */
+ Connection signal_connect_attach_input_context (HelperAgentSlotVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper detach input context signal.
+ *
+ * This signal is used to detach an input context from this helper.
+ *
+ * When an input context requst to stop this helper, then this
+ * signal will be emitted.
+ *
+ * Helper shouldn't send any event back to the IMEngineInstance, because
+ * the IMEngineInstance attached to the ic should have been destroyed.
+ *
+ * The prototype of the slot is:
+ *
+ * void detach_input_context (const HelperAgent *agent, int ic, const String &ic_uuid);
+ */
+ Connection signal_connect_detach_input_context (HelperAgentSlotVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper reload config signal.
+ *
+ * This signal is used to let the Helper reload configuration.
+ *
+ * The prototype of the slot is:
+ *
+ * void reload_config (const HelperAgent *agent, int ic, const String &ic_uuid);
+ */
+ Connection signal_connect_reload_config (HelperAgentSlotVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper update screen signal.
+ *
+ * This signal is used to let the Helper move its GUI to another screen.
+ * It can only be emitted when SCIM_HELPER_NEED_SCREEN_INFO is set in HelperInfo.option.
+ *
+ * The prototype of the slot is:
+ *
+ * void update_screen (const HelperAgent *agent, int ic, const String &ic_uuid, int screen_number);
+ */
+ Connection signal_connect_update_screen (HelperAgentSlotInt *slot);
+
+ /**
+ * @brief Connect a slot to Helper update spot location signal.
+ *
+ * This signal is used to let the Helper move its GUI according to the current spot location.
+ * It can only be emitted when SCIM_HELPER_NEED_SPOT_LOCATION_INFO is set in HelperInfo.option.
+ *
+ * The prototype of the slot is:
+ * void update_spot_location (const HelperAgent *agent, int ic, const String &ic_uuid, int x, int y);
+ */
+ Connection signal_connect_update_spot_location (HelperAgentSlotIntInt *slot);
+
+ /**
+ * @brief Connect a slot to Helper update cursor position signal.
+ *
+ * This signal is used to let the Helper get the cursor position information.
+ *
+ * The prototype of the slot is:
+ * void update_cursor_position (const HelperAgent *agent, int ic, const String &ic_uuid, int cursor_pos);
+ */
+ Connection signal_connect_update_cursor_position (HelperAgentSlotInt *slot);
+
+ /**
+ * @brief Connect a slot to Helper trigger property signal.
+ *
+ * This signal is used to trigger a property registered by this Helper.
+ * A property will be triggered when user clicks on it.
+ *
+ * The prototype of the slot is:
+ * void trigger_property (const HelperAgent *agent, int ic, const String &ic_uuid, const String &property);
+ */
+ Connection signal_connect_trigger_property (HelperAgentSlotString *slot);
+
+ /**
+ * @brief Connect a slot to Helper process imengine event signal.
+ *
+ * This signal is used to deliver the events sent from IMEngine to Helper.
+ *
+ * The prototype of the slot is:
+ * void process_imengine_event (const HelperAgent *agent, int ic, const String &ic_uuid, const Transaction &transaction);
+ */
+ Connection signal_connect_process_imengine_event (HelperAgentSlotTransaction *slot);
+
+ /**
+ * @brief Connect a slot to Helper focus out signal.
+ *
+ * This signal is used to do something when input context is focus out.
+ *
+ * The prototype of the slot is:
+ * void focus_out (const HelperAgent *agent, int ic, const String &ic_uuid);
+ */
+ Connection signal_connect_focus_out (HelperAgentSlotVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper focus in signal.
+ *
+ * This signal is used to do something when input context is focus in.
+ *
+ * The prototype of the slot is:
+ * void focus_in (const HelperAgent *agent, int ic, const String &ic_uuid);
+ */
+ Connection signal_connect_focus_in (HelperAgentSlotVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper show signal.
+ *
+ * This signal is used to show Helper ISE window.
+ *
+ * The prototype of the slot is:
+ * void ise_show (const HelperAgent *agent, int ic, char *buf, size_t &len);
+ */
+ Connection signal_connect_ise_show (HelperAgentSlotIntRawVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper hide signal.
+ *
+ * This signal is used to hide Helper ISE window.
+ *
+ * The prototype of the slot is:
+ * void ise_hide (const HelperAgent *agent, int ic, const String &ic_uuid);
+ */
+ Connection signal_connect_ise_hide (HelperAgentSlotVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper get rect signal.
+ *
+ * This signal is used to get Helper ISE window size and position.
+ *
+ * The prototype of the slot is:
+ * void get_rect (const HelperAgent *agent, struct rectinfo &info);
+ */
+ Connection signal_connect_get_size (HelperAgentSlotSize *slot);
+
+ /**
+ * @brief Connect a slot to Helper set mode signal.
+ *
+ * This signal is used to set Helper ISE mode.
+ *
+ * The prototype of the slot is:
+ * void set_mode (const HelperAgent *agent, uint32 &mode);
+ */
+ Connection signal_connect_set_mode (HelperAgentSlotUintVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper set language signal.
+ *
+ * This signal is used to set Helper ISE language.
+ *
+ * The prototype of the slot is:
+ * void set_language (const HelperAgent *agent, uint32 &language);
+ */
+ Connection signal_connect_set_language (HelperAgentSlotUintVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper set im data signal.
+ *
+ * This signal is used to send im data to Helper ISE.
+ *
+ * The prototype of the slot is:
+ * void set_imdata (const HelperAgent *agent, char *buf, size_t &len);
+ */
+ Connection signal_connect_set_imdata (HelperAgentSlotRawVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper get im data signal.
+ *
+ * This signal is used to get im data from Helper ISE.
+ *
+ * The prototype of the slot is:
+ * void get_imdata (const HelperAgent *, char **buf, size_t &len);
+ */
+ Connection signal_connect_get_imdata (HelperAgentSlotGetIMDataVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper set label private key signal.
+ *
+ * This signal is used to send label private key to Helper ISE.
+ *
+ * The prototype of the slot is:
+ * void set_private_key_by_label (const HelperAgent *agent, uint32 &layout_idx,
+ * uint32 & key_idx, char *label, char *value);
+ */
+ Connection signal_connect_set_private_key_by_label (HelperAgentSlotSetPrivateKeyVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper set image private key signal.
+ *
+ * This signal is used to send image private key to Helper ISE.
+ *
+ * The prototype of the slot is:
+ * void set_private_key_by_image (const HelperAgent *agent, uint32 &layout_idx,
+ * uint32 & key_idx, char *img_path, char *value);
+ */
+ Connection signal_connect_set_private_key_by_image (HelperAgentSlotSetPrivateKeyVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper set disable key signal.
+ *
+ * This signal is used to send disable key to Helper ISE.
+ *
+ * The prototype of the slot is:
+ * void set_disable_key (const HelperAgent *agent, uint32 &layout_idx, uint32 &key_idx, uint32 &disabled);
+ */
+ Connection signal_connect_set_disable_key (HelperAgentSlotSetDisableKeyVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper get layout signal.
+ *
+ * This signal is used to get Helper ISE layout.
+ *
+ * The prototype of the slot is:
+ * void get_layout (const HelperAgent *agent, uint32 &layout);
+ */
+ Connection signal_connect_get_layout (HelperAgentSlotUintVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper to get layout list signal.
+ *
+ * This signal is used to get the availabe Helper ISE layout list.
+ *
+ * The prototype of the slot is:
+ * void get_layout_list (const HelperAgent *agent, std::vector<uint32> &list);
+ */
+ Connection signal_connect_get_layout_list (HelperAgentSlotUintVector *slot);
+
+ /**
+ * @brief Connect a slot to Helper set layout signal.
+ *
+ * This signal is used to set Helper ISE layout.
+ *
+ * The prototype of the slot is:
+ * void set_layout (const HelperAgent *agent, uint32 &layout);
+ */
+ Connection signal_connect_set_layout (HelperAgentSlotUintVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper set shift mode signal.
+ *
+ * This signal is used to set Helper shift mode.
+ *
+ * The prototype of the slot is:
+ * void set_caps_mode (const HelperAgent *agent, uint32 &mode);
+ */
+ Connection signal_connect_set_caps_mode (HelperAgentSlotUintVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper reset input context signal.
+ *
+ * This signal is used to reset Helper ISE input context.
+ *
+ * The prototype of the slot is:
+ * void reset_input_context (const HelperAgent *agent, int ic, const String &uuid);
+ */
+ Connection signal_connect_reset_input_context (HelperAgentSlotVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper update candidate ui signal.
+ *
+ * This signal is used to get candidate ui style and mode.
+ *
+ * The prototype of the slot is:
+ * void update_candidate_ui (const HelperAgent *agent, int ic, const String &uuid, int style, int mode);
+ */
+ Connection signal_connect_update_candidate_ui (HelperAgentSlotIntInt *slot);
+
+ /**
+ * @brief Connect a slot to Helper update candidate rect signal.
+ *
+ * This signal is used to get candidate window size and position.
+ *
+ * The prototype of the slot is:
+ * void update_candidate_rect (const HelperAgent *agent, int ic, const String &uuid, const rectinfo &info);
+ */
+ Connection signal_connect_update_candidate_rect (HelperAgentSlotRect *slot);
+
+ /**
+ * @brief Connect a slot to Helper update keyboard ISE signal.
+ *
+ * This signal is used to get current keyboard ISE name and uuid.
+ *
+ * The prototype of the slot is:
+ * void update_keyboard_ise (const HelperAgent *agent, int ic, const String &uuid,
+ * const String &ise_name, const String &ise_uuid);
+ */
+ Connection signal_connect_update_keyboard_ise (HelperAgentSlotString2 *slot);
+
+ /**
+ * @brief Connect a slot to Helper update keyboard ISE list signal.
+ *
+ * This signal is used to get uuid list of all keyboard ISEs.
+ *
+ * The prototype of the slot is:
+ * void update_keyboard_ise_list (const HelperAgent *agent, int ic, const String &uuid,
+ * const std::vector<String> &ise_list);
+ */
+ Connection signal_connect_update_keyboard_ise_list (HelperAgentSlotStringVector *slot);
+
+ /**
+ * @brief Connect a slot to Helper candidate more window show signal.
+ *
+ * This signal is used to do someting when candidate more window is showed.
+ *
+ * The prototype of the slot is:
+ * void candidate_more_window_show (const HelperAgent *agent, int ic, const String &uuid);
+ */
+ Connection signal_connect_candidate_more_window_show (HelperAgentSlotVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper candidate more window hide signal.
+ *
+ * This signal is used to do someting when candidate more window is hidden.
+ *
+ * The prototype of the slot is:
+ * void candidate_more_window_hide (const HelperAgent *agent, int ic, const String &uuid);
+ */
+ Connection signal_connect_candidate_more_window_hide (HelperAgentSlotVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper select candidate signal.
+ *
+ * This signal is used to do something when candidate is selected.
+ *
+ * The prototype of the slot is:
+ * void select_candidate (const HelperAgent *agent, int ic, const String &uuid, int index);
+ */
+ Connection signal_connect_select_candidate (HelperAgentSlotInt *slot);
+
+ /**
+ * @brief Connect a slot to Helper candidate table page up signal.
+ *
+ * This signal is used to do something when candidate table is paged up.
+ *
+ * The prototype of the slot is:
+ * void candidate_table_page_up (const HelperAgent *agent, int ic, const String &uuid);
+ */
+ Connection signal_connect_candidate_table_page_up (HelperAgentSlotVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper candidate table page down signal.
+ *
+ * This signal is used to do something when candidate table is paged down.
+ *
+ * The prototype of the slot is:
+ * void candidate_table_page_down (const HelperAgent *agent, int ic, const String &uuid);
+ */
+ Connection signal_connect_candidate_table_page_down (HelperAgentSlotVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper update candidate table page size signal.
+ *
+ * This signal is used to do something when candidate table page size is changed.
+ *
+ * The prototype of the slot is:
+ * void update_candidate_table_page_size (const HelperAgent *, int ic, const String &uuid, int page_size);
+ */
+ Connection signal_connect_update_candidate_table_page_size (HelperAgentSlotInt *slot);
+
+ /**
+ * @brief Connect a slot to Helper select associate signal.
+ *
+ * This signal is used to do something when associate is selected.
+ *
+ * The prototype of the slot is:
+ * void select_associate (const HelperAgent *agent, int ic, const String &uuid, int index);
+ */
+ Connection signal_connect_select_associate (HelperAgentSlotInt *slot);
+
+ /**
+ * @brief Connect a slot to Helper associate table page up signal.
+ *
+ * This signal is used to do something when associate table is paged up.
+ *
+ * The prototype of the slot is:
+ * void associate_table_page_up (const HelperAgent *agent, int ic, const String &uuid);
+ */
+ Connection signal_connect_associate_table_page_up (HelperAgentSlotVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper associate table page down signal.
+ *
+ * This signal is used to do something when associate table is paged down.
+ *
+ * The prototype of the slot is:
+ * void associate_table_page_down (const HelperAgent *agent, int ic, const String &uuid);
+ */
+ Connection signal_connect_associate_table_page_down (HelperAgentSlotVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper update associate table page size signal.
+ *
+ * This signal is used to do something when associate table page size is changed.
+ *
+ * The prototype of the slot is:
+ * void update_associate_table_page_size (const HelperAgent *, int ic, const String &uuid, int page_size);
+ */
+ Connection signal_connect_update_associate_table_page_size (HelperAgentSlotInt *slot);
+
+ /**
+ * @brief Connect a slot to Helper reset ISE context signal.
+ *
+ * This signal is used to reset Helper ISE.
+ *
+ * The prototype of the slot is:
+ * void reset_ise_context (const HelperAgent *agent, int ic, const String &uuid);
+ */
+ Connection signal_connect_reset_ise_context (HelperAgentSlotVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper set screen direction signal.
+ *
+ * This signal is used to rotate and resize Helper when screen direction is changed.
+ *
+ * The prototype of the slot is:
+ * void set_screen_direction (const HelperAgent *agent, uint32 &mode);
+ */
+ Connection signal_connect_set_screen_direction (HelperAgentSlotUintVoid *slot);
+
+ /**
+ * @brief Connect a slot to Helper turn on log signal.
+ *
+ * This signal is used to turn on Helper ISE debug information.
+ *
+ * The prototype of the slot is:
+ * void turn_on_log (const HelperAgent *agent, uint32 &on);
+ */
+ Connection signal_connect_turn_on_log (HelperAgentSlotUintVoid *slot);
+};
+
+/** @} */
+
+} /* namespace scim */
+
+struct ArgInfo
+{
+ char **argv;
+ int argc;
+};
+
+#endif /* __SCIM_HELPER_H */
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2004-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_helper_launcher.cpp,v 1.6 2005/05/16 01:25:46 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_HELPER_MODULE
+#define Uses_SCIM_GLOBAL_CONFIG
+#define Uses_SCIM_CONFIG_PATH
+#include <stdlib.h>
+#include "scim_private.h"
+#include "scim.h"
+
+using namespace scim;
+
+int main (int argc, char *argv [])
+{
+ int i = 0;
+ int j = 0;
+ String config;
+ String display;
+ String helper;
+ String uuid;
+ bool daemon = false;
+
+ char *p = getenv ("DISPLAY");
+ if (p) display = String (p);
+
+ config = scim_global_config_read (SCIM_GLOBAL_CONFIG_DEFAULT_CONFIG_MODULE, String ("simple"));
+
+ while (i < argc) {
+ if (++i >= argc) break;
+
+ if (String ("-c") == argv [i] ||
+ String ("--config") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "No argument for option " << argv [i-1] << "\n";
+ exit (-1);
+ }
+ config = argv [i];
+ continue;
+ }
+
+ if (String ("-d") == argv [i] ||
+ String ("--daemon") == argv [i]) {
+ daemon = true;
+ continue;
+ }
+
+ if (String ("--display") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "No argument for option " << argv [i-1] << "\n";
+ exit (-1);
+ }
+ display = argv [i];
+ continue;
+ }
+
+ if (String ("-h") == argv [i] ||
+ String ("--help") == argv [i]) {
+ std::cout << "Usage: " << argv [0] << " [options] module uuid\n\n"
+ << "The options are:\n"
+ << " -c, --config name Use specified config module, default is \"simple\".\n"
+ << " -d, --daemon Run as daemon.\n"
+ << " --display name run setup on a specified DISPLAY.\n"
+ << " -h, --help Show this help message.\n"
+ << "module The name of the Helper module\n"
+ << "uuid The uuid of the Helper to be launched.\n";
+ return 0;
+ }
+
+ if (String ("-v") == argv [i] ||
+ String ("--verbose") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "No argument for option " << argv [i-1] << "\n";
+ return -1;
+ }
+ DebugOutput::set_verbose_level (atoi (argv [i]));
+ continue;
+ }
+
+ if (String ("-m") == argv [i] ||
+ String ("--mask") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "No argument for option " << argv [i-1] << "\n";
+ return -1;
+ }
+ if (String (argv [i]) != "none") {
+ std::vector<String> debug_mask_list;
+ scim_split_string_list (debug_mask_list, argv [i], ',');
+ DebugOutput::disable_debug (SCIM_DEBUG_AllMask);
+ for (size_t j=0; j<debug_mask_list.size (); j++)
+ DebugOutput::enable_debug_by_name (debug_mask_list [j]);
+ }
+ continue;
+ }
+
+ if (String ("-o") == argv [i] ||
+ String ("--output") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "No argument for option " << argv [i-1] << "\n";
+ return -1;
+ }
+ DebugOutput::set_output (String (argv [i]));
+ continue;
+ }
+
+ ++j;
+
+ if (j == 1) {
+ helper = String (argv [i]);
+ continue;
+ } else if (j == 2) {
+ uuid = String (argv [i]);
+ continue;
+ }
+
+ std::cerr << "Invalid command line option: " << argv [i] << "\n";
+ return -1;
+ }
+
+ SCIM_DEBUG_MAIN(1) << "scim-helper-launcher: " << config << " " << display << " " << helper << " " << uuid << "\n";
+
+ if (!helper.length () || !uuid.length ()) {
+ std::cerr << "Module name or Helper UUID is missing.\n";
+ return -1;
+ }
+
+ HelperModule helper_module (helper);
+
+ if (!helper_module.valid () || helper_module.number_of_helpers () == 0) {
+ std::cerr << "Unable to load Helper module: " << helper << "\n";
+ return -1;
+ }
+
+ ConfigModule config_module (config);
+
+ ConfigPointer config_pointer;
+
+ if (config_module.valid ()) {
+ config_pointer = config_module.create_config ();
+ }
+
+ if (config_pointer.null ()) {
+ config_pointer = new DummyConfig ();
+ }
+
+// if (daemon) scim_daemon ();
+
+ helper_module.run_helper (uuid, config_pointer, display);
+
+ if (!config_pointer.null ())
+ config_pointer.reset ();
+
+ exit (0);
+}
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_helper_manager.cpp
+ * @brief Implementation of class HelperManager.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2004-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_helper_manager.cpp,v 1.2 2005/01/05 13:41:10 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_HELPER_MANAGER
+#define Uses_SCIM_SOCKET
+#define Uses_SCIM_TRANSACTION
+#define Uses_SCIM_TRANS_COMMAND
+#define Uses_C_STDLIB
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include "scim_private.h"
+#include "scim.h"
+#include "scim_utility.h"
+
+
+namespace scim {
+
+
+#ifndef SCIM_HELPER_MANAGER_PROGRAM
+ #define SCIM_HELPER_MANAGER_PROGRAM (SCIM_LIBEXECDIR "/scim-helper-manager")
+#endif
+
+
+class HelperManager::HelperManagerImpl
+{
+ std::vector <HelperInfo> m_helpers;
+
+ uint32 m_socket_key;
+ SocketClient m_socket_client;
+ int m_socket_timeout;
+
+public:
+ HelperManagerImpl ()
+ : m_socket_key (0),
+ m_socket_timeout (scim_get_default_socket_timeout ())
+ {
+ if (open_connection ()) {
+ get_helper_list ();
+ }
+ }
+
+ ~HelperManagerImpl ()
+ {
+ m_socket_client.close ();
+ }
+
+ unsigned int number_of_helpers (void) const
+ {
+ return m_helpers.size ();
+ }
+
+ bool get_helper_info (unsigned int idx, HelperInfo &info) const
+ {
+ if (idx < m_helpers.size ()) {
+ info = m_helpers [idx];
+ return true;
+ }
+ return false;
+ }
+
+ void run_helper (const String &uuid, const String &config_name, const String &display)
+ {
+ if (!m_socket_client.is_connected () || !uuid.length () || !m_helpers.size ())
+ return;
+
+ Transaction trans;
+
+ for (int i = 0; i < 3; ++i) {
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_data (m_socket_key);
+ trans.put_command (SCIM_TRANS_CMD_HELPER_MANAGER_RUN_HELPER);
+ trans.put_data (uuid);
+ trans.put_data (config_name);
+ trans.put_data (display);
+
+ if (trans.write_to_socket (m_socket_client))
+ return;
+
+ m_socket_client.close ();
+
+ if (open_connection ())
+ get_helper_list ();
+ }
+ }
+
+ void stop_helper (const String &name) const
+ {
+ if (!m_socket_client.is_connected () || !name.length ())
+ return;
+
+ Transaction trans;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_data (m_socket_key);
+ trans.put_command (SCIM_TRANS_CMD_HELPER_MANAGER_STOP_HELPER);
+ trans.put_data (name);
+
+ int cmd;
+ if (trans.write_to_socket (m_socket_client)
+ && trans.read_from_socket (m_socket_client)
+ && trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY
+ && trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK)
+ return;
+ }
+
+ int get_active_ise_list (std::vector<String> &strlist) const
+ {
+ if (!m_socket_client.is_connected ())
+ return -1;
+
+ strlist.clear ();
+
+ Transaction trans;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_data (m_socket_key);
+ trans.put_command (ISM_TRANS_CMD_GET_ACTIVE_ISE_LIST);
+
+ int cmd;
+ if (trans.write_to_socket (m_socket_client) &&
+ trans.read_from_socket (m_socket_client) )
+ {
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_data (strlist)) {
+ return (int)(strlist.size ());
+ }
+ }
+
+ return -1;
+ }
+
+ int send_display_name (String &name) const
+ {
+ if (!m_socket_client.is_connected ())
+ return -1;
+
+ Transaction trans;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_data (m_socket_key);
+
+ trans.put_command (SCIM_TRANS_CMD_HELPER_MANAGER_SEND_DISPLAY);
+ trans.put_data (name);
+
+ int cmd;
+ if (trans.write_to_socket (m_socket_client)
+ && trans.read_from_socket (m_socket_client)
+ && trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY
+ && trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK)
+ return 0;
+
+ return -1;
+ }
+
+ int send_ise_list (String &ise_list) const
+ {
+ if (!m_socket_client.is_connected ())
+ return -1;
+
+ Transaction trans;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_data (m_socket_key);
+
+ trans.put_command (SCIM_TRANS_CMD_HELPER_MANAGER_SEND_ISE_LIST);
+ trans.put_data (ise_list);
+
+ if (trans.write_to_socket (m_socket_client))
+ return 0;
+
+ return -1;
+ }
+
+ int turn_on_log (uint32 isOn) const
+ {
+ if (!m_socket_client.is_connected ())
+ return -1;
+
+ Transaction trans;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_data (m_socket_key);
+ trans.put_command (ISM_TRANS_CMD_TURN_ON_LOG);
+ trans.put_data (isOn);
+
+ int cmd;
+ if (trans.write_to_socket (m_socket_client)
+ && trans.read_from_socket (m_socket_client)
+ && trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY
+ && trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK)
+ return 0;
+
+ return -1;
+ }
+
+ bool open_connection (void)
+ {
+ if (m_socket_client.is_connected ())
+ return true;
+
+ SocketAddress address (scim_get_default_helper_manager_socket_address ());
+
+ if (address.valid ()) {
+ if (!m_socket_client.connect (address)) {
+ int i = 0;
+ {
+ std::cerr << " Re-connecting to ISF(scim) server.";
+ for (i = 0; i < 200; ++i) {
+ if (m_socket_client.connect (address))
+ break;
+ scim_usleep (100000);
+ std::cerr << ".";
+ }
+ std::cerr << " Connected :" << i << "\n";
+ }
+ }
+ }
+
+ if (m_socket_client.is_connected () &&
+ scim_socket_open_connection (m_socket_key,
+ "HelperManager",
+ "HelperLauncher",
+ m_socket_client,
+ m_socket_timeout)) {
+ return true;
+ }
+
+ m_socket_client.close ();
+ std::cerr << " helper_manager open_connection failed!\n";
+ return false;
+ }
+
+ void get_helper_list (void)
+ {
+ Transaction trans;
+ uint32 num;
+ int cmd;
+ HelperInfo info;
+
+ m_helpers.clear ();
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_data (m_socket_key);
+ trans.put_command (SCIM_TRANS_CMD_HELPER_MANAGER_GET_HELPER_LIST);
+
+ if (trans.write_to_socket (m_socket_client) &&
+ trans.read_from_socket (m_socket_client, m_socket_timeout)) {
+
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_data (num) && num > 0) {
+
+ for (uint32 j = 0; j < num; j++) {
+ if (trans.get_data (info.uuid) &&
+ trans.get_data (info.name) &&
+ trans.get_data (info.icon) &&
+ trans.get_data (info.description) &&
+ trans.get_data (info.option)) {
+ m_helpers.push_back (info);
+ }
+ }
+ }
+ }
+ }
+};
+
+HelperManager::HelperManager ()
+ : m_impl (new HelperManagerImpl ())
+{
+}
+
+HelperManager::~HelperManager ()
+{
+ delete m_impl;
+}
+
+unsigned int
+HelperManager::number_of_helpers (void) const
+{
+ return m_impl->number_of_helpers ();
+}
+
+bool
+HelperManager::get_helper_info (unsigned int idx, HelperInfo &info) const
+{
+ return m_impl->get_helper_info (idx, info);
+}
+
+void
+HelperManager::run_helper (const String &uuid, const String &config_name, const String &display) const
+{
+ m_impl->run_helper (uuid, config_name, display);
+}
+
+void
+HelperManager::stop_helper (const String &name) const
+{
+ m_impl->stop_helper (name);
+}
+
+void
+HelperManager::get_helper_list (void) const
+{
+ m_impl->get_helper_list ();
+}
+
+int
+HelperManager::get_active_ise_list (std::vector<String> &strlist) const
+{
+ return m_impl->get_active_ise_list (strlist);
+}
+
+int
+HelperManager::send_display_name (String &name) const
+{
+ return m_impl->send_display_name (name);
+}
+
+int
+HelperManager::send_ise_list (String &ise_list) const
+{
+ return m_impl->send_ise_list (ise_list);
+}
+
+int
+HelperManager::turn_on_log (uint32 isOn) const
+{
+ return m_impl->turn_on_log (isOn);
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/**
+ * @file scim_helper_manager.h
+ * @brief Defines scim::HelperManager.
+ *
+ * scim::HelperManager is a class used to manage all Client Helper modules.
+ *
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2004-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_helper_manager.h,v 1.3 2005/05/17 06:45:15 suzhe Exp $
+ */
+
+#ifndef __SCIM_HELPER_MANAGER_H
+#define __SCIM_HELPER_MANAGER_H
+
+namespace scim {
+
+/**
+ * @addtogroup Helper
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+/**
+ * @brief This class is used to manage all helper objects.
+ *
+ */
+class HelperManager
+{
+ class HelperManagerImpl;
+ HelperManagerImpl *m_impl;
+
+ HelperManager (const HelperManager &);
+ const HelperManager & operator = (const HelperManager &);
+
+public:
+ HelperManager ();
+ ~HelperManager ();
+
+ /**
+ * @brief Get the total number of helpers supported by all helper modules.
+ */
+ unsigned int number_of_helpers (void) const;
+
+ /**
+ * @brief Get the information of a specific helper by its index.
+ *
+ * @param idx The index of the helper, must between 0 to number_of_helpers () - 1.
+ * @param info The HelperInfo object to store the information.
+ * @return true if this helper is ok and the information is stored correctly.
+ */
+ bool get_helper_info (unsigned int idx, HelperInfo &info) const;
+
+ /**
+ * @brief Run a specific helper.
+ *
+ * The helper will run in a newly forked process, so this function will return as soon
+ * as the new process is launched.
+ *
+ * @param config_name The name of the ConfigModule to be used to read configurations.
+ * @param uuid The UUID of the helper to be run.
+ * @param display The display in which the helper will be run.
+ */
+ void run_helper (const String &uuid, const String &config_name, const String &display) const;
+ void stop_helper (const String &name) const;
+ void get_helper_list (void) const;
+
+ int get_active_ise_list (std::vector<String> &strlist) const;
+ int send_display_name (String &name) const;
+ int send_ise_list (String &ise_list) const;
+ int turn_on_log (uint32 isOn) const;
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_HELPER_MANAGER_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/** @file scim_helper_module.cpp
+ * @brief Implementation of class HelperModule.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2004-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_helper_module.cpp,v 1.5 2005/01/05 13:41:10 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_HELPER
+#define Uses_SCIM_HELPER_MODULE
+#define Uses_SCIM_CONFIG_MODULE
+#define Uses_C_STDLIB
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+HelperModule::HelperModule (const String &name)
+ : m_number_of_helpers (0),
+ m_get_helper_info (0),
+ m_get_helper_lang (0),
+ m_run_helper (0)
+{
+ if (name.length ()) load (name);
+}
+
+bool
+HelperModule::load (const String &name)
+{
+ try {
+ if (!m_module.load (name, "Helper"))
+ return false;
+
+ m_number_of_helpers =
+ (HelperModuleNumberOfHelpersFunc) m_module.symbol ("scim_helper_module_number_of_helpers");
+
+ m_get_helper_info =
+ (HelperModuleGetHelperInfoFunc) m_module.symbol ("scim_helper_module_get_helper_info");
+
+ m_get_helper_lang =
+ (HelperModuleGetHelperLangFunc) m_module.symbol ("scim_helper_module_get_helper_language");
+
+ m_run_helper =
+ (HelperModuleRunHelperFunc) m_module.symbol ("scim_helper_module_run_helper");
+
+ if (!m_number_of_helpers || !m_get_helper_info || !m_run_helper) {
+ m_module.unload ();
+ m_number_of_helpers = 0;
+ m_get_helper_info = 0;
+ m_get_helper_lang = 0;
+ m_run_helper = 0;
+ return false;
+ }
+ } catch (...) {
+ m_module.unload ();
+ m_number_of_helpers = 0;
+ m_get_helper_info = 0;
+ m_get_helper_lang = 0;
+ m_run_helper = 0;
+ return false;
+ }
+
+ return true;
+}
+
+bool
+HelperModule::unload ()
+{
+ return m_module.unload ();
+}
+
+bool
+HelperModule::valid () const
+{
+ return (m_module.valid () &&
+ m_number_of_helpers &&
+ m_get_helper_info &&
+ m_run_helper &&
+ m_number_of_helpers () > 0);
+}
+
+unsigned int
+HelperModule::number_of_helpers () const
+{
+ if (m_module.valid () && m_number_of_helpers && m_get_helper_info && m_run_helper)
+ return m_number_of_helpers ();
+
+ return (unsigned int) 0;
+}
+
+bool
+HelperModule::get_helper_info (unsigned int idx, HelperInfo &info) const
+{
+ if (m_module.valid () && m_number_of_helpers && m_get_helper_info && m_run_helper)
+ return m_get_helper_info (idx, info);
+
+ return false;
+}
+
+String
+HelperModule::get_helper_lang (unsigned int idx) const
+{
+ if (m_module.valid () && m_get_helper_lang)
+ return m_get_helper_lang (idx);
+
+ return String("other");
+}
+
+void
+HelperModule::run_helper (const String &uuid, const ConfigPointer &config, const String &display) const
+{
+ m_run_helper (uuid, config, display);
+}
+
+int scim_get_helper_module_list (std::vector <String> &mod_list)
+{
+ return scim_get_module_list (mod_list, "Helper");
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/**
+ * @file scim_helper_module.h
+ * @brief Defines scim::HelperModule and it's related types.
+ *
+ * scim::HelperModule is a class used to load Client Helper modules.
+ *
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2004-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_helper_module.h,v 1.6 2005/01/10 08:30:54 suzhe Exp $
+ */
+
+#ifndef __SCIM_HELPER_MODULE_H
+#define __SCIM_HELPER_MODULE_H
+
+namespace scim {
+
+/**
+ * @addtogroup Helper
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+/**
+ * @brief Get the number of Helpers in this module.
+ *
+ * A helper module can have multiple Helpers in it.
+ * But each helper will run in its own process space.
+ *
+ * There must be a function called "scim_helper_module_number_of_helpers"
+ * in each helper module which complies with this prototype.
+ * This function name can have a prefix like kbd_LTX_,
+ * in which "kbd" is the module's name.
+ */
+typedef unsigned int (*HelperModuleNumberOfHelpersFunc) (void);
+
+/**
+ * @brief Get the information of a Helper.
+ *
+ * There must be a function called "scim_helper_module_get_helper_info"
+ * in each helper module which complies with this prototype.
+ * This function name can have a prefix like kbd_LTX_,
+ * in which "kbd" is the module's name.
+ *
+ * @param idx The index of this helper, must between 0 to (the number of helpers) - 1.
+ * @param info The HelperInfo object to store the information.
+ * @return true if this Helper is valid and the correct information is stored into info.
+ */
+typedef bool (*HelperModuleGetHelperInfoFunc) (unsigned int idx, HelperInfo &info);
+
+/**
+ * @brief Get the language of a Helper.
+ *
+ * There must be a function called "scim_helper_module_get_helper_language"
+ * in each helper module which complies with this prototype.
+ * This function name can have a prefix like kbd_LTX_,
+ * in which "kbd" is the module's name.
+ *
+ * @param idx The index of this helper, must between 0 to (the number of helpers) - 1.
+ * @return this Helper's language.
+ */
+typedef String (*HelperModuleGetHelperLangFunc) (unsigned int idx);
+
+/**
+ * @brief Run a specific Helper.
+ *
+ * This function will be called within an independent process.
+ *
+ * There must be a function called "scim_helper_module_run_helper"
+ * in each helper module which complies with this prototype.
+ * This function name can have a prefix like kbd_LTX_,
+ * in which "kbd" is the module's name.
+ *
+ * @param config The Config object should be used to read/write configurations.
+ * @param uuid The UUID of the Helper to be run.
+ * @param display The display in which this helper should run.
+ */
+typedef void (*HelperModuleRunHelperFunc) (const String &uuid, const ConfigPointer &config, const String &display);
+
+
+/**
+ * @brief The class used to load a Helper module and run its Helpers.
+ *
+ * This class should not be used directly. HelperManager should be used instead.
+ */
+class HelperModule
+{
+ Module m_module;
+
+ HelperModuleNumberOfHelpersFunc m_number_of_helpers;
+ HelperModuleGetHelperInfoFunc m_get_helper_info;
+ HelperModuleGetHelperLangFunc m_get_helper_lang;
+ HelperModuleRunHelperFunc m_run_helper;
+
+ HelperModule (const HelperModule &);
+ HelperModule & operator= (const HelperModule &);
+
+public:
+ /**
+ * @brief Constructor.
+ *
+ * @param name The name of the Helper module to be loaded.
+ */
+ HelperModule (const String &name = String (""));
+
+ /**
+ * @brief Load a Helper module.
+ *
+ * If a module has already been loaded, then it'll be unloaded first.
+ *
+ * @param name The name of the Helper module to be loaded.
+ * @return true if success.
+ */
+ bool load (const String &name);
+
+ /**
+ * @brief Unload the module.
+ *
+ * @return true if success.
+ */
+ bool unload ();
+
+ /**
+ * @brief Check if a Helper module has been loaded successfully.
+ *
+ * @return true if a module has been loaded successfully.
+ */
+ bool valid () const;
+
+ /**
+ * @brief Get the number of helpers supported by this module.
+ *
+ * @return the number of helpers supported by this module.
+ */
+ unsigned int number_of_helpers () const;
+
+ /**
+ * @brief The the information of a specific helper.
+ *
+ * @param idx The index of the helper, must between 0 to number_of_helpers () - 1.
+ * @param info The HeperInfo object to store the information.
+ * @return true if this helper is ok and the information is stored into info successfully.
+ */
+ bool get_helper_info (unsigned int idx, HelperInfo &info) const;
+
+ /**
+ * @brief The language of a specific helper.
+ *
+ * @param idx The index of the helper, must between 0 to number_of_helpers () - 1.
+ * @return this helper's language.
+ */
+ String get_helper_lang (unsigned int idx) const;
+
+ /**
+ * @brief Run a specific helper.
+ *
+ * The helper should be run in an independent process, this function will not return
+ * until the helper exits.
+ *
+ * @param config The Config object to be used to read configurations.
+ * @param uuid The UUID of the helper, which is returned by get_helper_info ().
+ * @param display The display in which this helper should run.
+ */
+ void run_helper (const String &uuid, const ConfigPointer &config, const String &display) const;
+};
+
+/**
+ * @brief Get a name list of currently available Helper modules.
+ * @param mod_list - the result list will be stored here.
+ * @return the number of the modules, equal to mod_list.size ().
+ */
+int scim_get_helper_module_list (std::vector <String> &mod_list);
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_HELPER_MODULE_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_hotkey.cpp,v 1.8 2005/06/18 13:19:35 suzhe Exp $
+ */
+
+#define Uses_SCIM_HOTKEY
+#define Uses_SCIM_CONFIG_PATH
+#include "scim_private.h"
+#include "scim.h"
+#include "scim_stl_map.h"
+
+namespace scim {
+
+struct scim_hash_keyevent {
+ size_t operator () (const KeyEvent &key) const {
+ return (key.code & 0xFFFF) | (((uint32)key.mask) << 16);
+ }
+};
+
+#if SCIM_USE_STL_EXT_HASH_MAP
+typedef __gnu_cxx::hash_map <KeyEvent, int, scim_hash_keyevent> HotkeyRepository;
+#elif SCIM_USE_STL_HASH_MAP
+typedef std::hash_map <KeyEvent, int, scim_hash_keyevent> HotkeyRepository;
+#else
+typedef std::map <KeyEvent, int> HotkeyRepository;
+#endif
+
+class HotkeyMatcher::HotkeyMatcherImpl
+{
+public:
+ HotkeyRepository m_hotkeys;
+ uint32 m_prev_code;
+ bool m_matched;
+ int m_result;
+
+ HotkeyMatcherImpl ()
+ : m_prev_code (0),
+ m_matched (false),
+ m_result (-1) {
+ }
+};
+
+HotkeyMatcher::HotkeyMatcher ()
+ : m_impl (new HotkeyMatcherImpl ())
+{
+}
+HotkeyMatcher::~HotkeyMatcher ()
+{
+ delete m_impl;
+}
+
+void
+HotkeyMatcher::add_hotkey (const KeyEvent &key, int id)
+{
+ if (!key.empty ())
+ m_impl->m_hotkeys [key] = id;
+}
+
+void
+HotkeyMatcher::add_hotkeys (const KeyEventList &keys, int id)
+{
+ for (KeyEventList::const_iterator it = keys.begin (); it != keys.end (); ++it) {
+ if (!it->empty ())
+ m_impl->m_hotkeys [*it] = id;
+ }
+}
+
+size_t
+HotkeyMatcher::get_all_hotkeys (KeyEventList &keys, std::vector <int> &ids) const
+{
+ keys.clear ();
+ ids.clear ();
+
+ for (HotkeyRepository::iterator it = m_impl->m_hotkeys.begin (); it != m_impl->m_hotkeys.end (); ++it) {
+ keys.push_back (it->first);
+ ids.push_back (it->second);
+ }
+
+ return keys.size ();
+}
+
+size_t
+HotkeyMatcher::find_hotkeys (int id, KeyEventList &keys) const
+{
+ keys.clear ();
+
+ for (HotkeyRepository::iterator it = m_impl->m_hotkeys.begin (); it != m_impl->m_hotkeys.end (); ++it) {
+ if (it->second == id) keys.push_back (it->first);
+ }
+
+ return keys.size ();
+}
+
+void
+HotkeyMatcher::push_key_event (const KeyEvent &key)
+{
+ HotkeyRepository::iterator it = m_impl->m_hotkeys.find (key);
+
+ if (it != m_impl->m_hotkeys.end () && (!(key.mask & SCIM_KEY_ReleaseMask) || m_impl->m_prev_code == key.code)) {
+ m_impl->m_matched = true;
+ m_impl->m_result = it->second;
+ } else {
+ m_impl->m_matched = false;
+ m_impl->m_result = -1;
+ }
+
+ m_impl->m_prev_code = key.code;
+}
+
+void
+HotkeyMatcher::reset (void)
+{
+ m_impl->m_prev_code = 0;
+ m_impl->m_matched = false;
+ m_impl->m_result = -1;
+}
+
+void
+HotkeyMatcher::clear (void)
+{
+ m_impl->m_hotkeys.clear ();
+ reset ();
+}
+
+bool
+HotkeyMatcher::is_matched (void) const
+{
+ return m_impl->m_matched;
+}
+
+int
+HotkeyMatcher::get_match_result (void) const
+{
+ return m_impl->m_result;
+}
+
+//===================== IMEngineHotkeyMatcher =======================
+class IMEngineHotkeyMatcher::IMEngineHotkeyMatcherImpl
+{
+public:
+ HotkeyMatcher m_matcher;
+ std::vector <ISEInfo> m_uuids;
+};
+
+IMEngineHotkeyMatcher::IMEngineHotkeyMatcher ()
+ : m_impl (new IMEngineHotkeyMatcherImpl ())
+{
+}
+
+IMEngineHotkeyMatcher::~IMEngineHotkeyMatcher ()
+{
+ delete m_impl;
+}
+
+void
+IMEngineHotkeyMatcher::load_hotkeys (const ConfigPointer &config)
+{
+ clear ();
+
+ if (config.null () || !config->valid ()) return;
+
+ std::vector <String> uuids;
+
+ scim_split_string_list (uuids, config->read (String (SCIM_CONFIG_HOTKEYS_IMENGINE_LIST), String ("")));
+
+ std::sort (uuids.begin (), uuids.end ());
+ uuids.erase (std::unique (uuids.begin (), uuids.end ()), uuids.end ());
+
+ if (uuids.size ()) {
+ KeyEventList keys;
+ for (std::vector <String>::iterator uit = uuids.begin (); uit != uuids.end (); ++uit) {
+ if (scim_string_to_key_list (keys, config->read (String (SCIM_CONFIG_HOTKEYS_IMENGINE "/") + *uit, String ("")))) {
+ ISEInfo info;
+ info.type = IMENGINE_T;
+ info.uuid = *uit;
+ m_impl->m_matcher.add_hotkeys (keys, (int) m_impl->m_uuids.size ());
+ m_impl->m_uuids.push_back (info);
+ }
+ }
+ }
+ uuids.clear();
+
+ scim_split_string_list (uuids, config->read (String (SCIM_CONFIG_HOTKEYS_HELPER_LIST), String ("")));
+
+ std::sort (uuids.begin (), uuids.end ());
+ uuids.erase (std::unique (uuids.begin (), uuids.end ()), uuids.end ());
+
+ if (uuids.size ()) {
+ KeyEventList keys;
+ for (std::vector <String>::iterator uit = uuids.begin (); uit != uuids.end (); ++uit) {
+ if (scim_string_to_key_list (keys, config->read (String (SCIM_CONFIG_HOTKEYS_HELPER "/") + *uit, String ("")))) {
+ ISEInfo info;
+ info.type = HELPER_T;
+ info.uuid = *uit;
+ m_impl->m_matcher.add_hotkeys (keys, (int) m_impl->m_uuids.size ());
+ m_impl->m_uuids.push_back (info);
+ }
+ }
+ }
+ uuids.clear ();
+
+ scim_split_string_list (uuids, config->read (String (SCIM_CONFIG_HOTKEYS_NEWISE_LIST), String ("")));
+
+ std::sort (uuids.begin (), uuids.end ());
+ uuids.erase (std::unique (uuids.begin (), uuids.end ()), uuids.end ());
+
+ if (uuids.size ()) {
+ KeyEventList keys;
+ for (std::vector <String>::iterator uit = uuids.begin (); uit != uuids.end (); ++uit) {
+ if (scim_string_to_key_list (keys, config->read (String (SCIM_CONFIG_HOTKEYS_NEWISE "/") + *uit, String ("")))) {
+ ISEInfo info;
+ info.type = NEWISE_T;
+ info.uuid = *uit;
+ m_impl->m_matcher.add_hotkeys (keys, (int) m_impl->m_uuids.size ());
+ m_impl->m_uuids.push_back (info);
+ }
+ }
+ }
+}
+
+void
+IMEngineHotkeyMatcher::save_hotkeys (const ConfigPointer &config) const
+{
+ if (config.null () || !config->valid () /*|| !m_impl->m_uuids.size ()*/) return;//liushuo
+
+ std::vector <String> uuids;
+ KeyEventList keys;
+ String keystr;
+ std::vector <String> i_uuids;
+ std::vector <String> n_uuids;
+ std::vector <String> h_uuids;
+//-------------------clear imengine hotkeys in config file --------------------
+ scim_split_string_list (uuids, config->read (String (SCIM_CONFIG_HOTKEYS_IMENGINE_LIST), String ("")));
+
+ std::sort (uuids.begin (), uuids.end ());
+ uuids.erase (std::unique (uuids.begin (), uuids.end ()), uuids.end ());
+
+ if (uuids.size ()) {
+ for (std::vector <String>::iterator uit = uuids.begin (); uit != uuids.end (); ++uit)
+ {
+ config->write (String (SCIM_CONFIG_HOTKEYS_IMENGINE "/") + *uit, "");
+ }
+ }
+
+ config->write (String (SCIM_CONFIG_HOTKEYS_IMENGINE_LIST), "");
+ uuids.clear();
+//---------------clear new ise hotkeys in config file--------------------------
+ scim_split_string_list (uuids, config->read (String (SCIM_CONFIG_HOTKEYS_NEWISE_LIST), String ("")));
+
+ std::sort (uuids.begin (), uuids.end ());
+ uuids.erase (std::unique (uuids.begin (), uuids.end ()), uuids.end ());
+
+ if (uuids.size ()) {
+ for (std::vector <String>::iterator uit = uuids.begin (); uit != uuids.end (); ++uit)
+ {
+ config->write (String (SCIM_CONFIG_HOTKEYS_NEWISE "/") + *uit, "");
+ }
+ }
+
+ config->write (String (SCIM_CONFIG_HOTKEYS_NEWISE_LIST), "");
+ uuids.clear ();
+//-----------------clear helper hotkeys in config file----------------------------
+ scim_split_string_list (uuids, config->read (String (SCIM_CONFIG_HOTKEYS_HELPER_LIST), String ("")));
+
+ std::sort (uuids.begin (), uuids.end ());
+ uuids.erase (std::unique (uuids.begin (), uuids.end ()), uuids.end ());
+
+ if (uuids.size ()) {
+ for (std::vector <String>::iterator uit = uuids.begin (); uit != uuids.end (); ++uit)
+ {
+ config->write (String (SCIM_CONFIG_HOTKEYS_HELPER "/") + *uit, "");
+ }
+ }
+
+ config->write (String (SCIM_CONFIG_HOTKEYS_HELPER_LIST), "");
+ uuids.clear ();
+
+//---------------------- save to config --------------------------------------------
+ for (size_t i = 0; i < m_impl->m_uuids.size (); ++i) {
+ if (m_impl->m_matcher.find_hotkeys ((int) i, keys) > 0 && scim_key_list_to_string (keystr, keys)) {
+ ISE_TYPE type = m_impl->m_uuids [i].type;
+ if (type == IMENGINE_T) {
+ config->write (String (SCIM_CONFIG_HOTKEYS_IMENGINE "/") + m_impl->m_uuids [i].uuid, keystr);
+ i_uuids.push_back (m_impl->m_uuids [i].uuid);
+ } else if (type == NEWISE_T) {
+ config->write (String (SCIM_CONFIG_HOTKEYS_NEWISE "/") + m_impl->m_uuids [i].uuid, keystr);
+ n_uuids.push_back (m_impl->m_uuids [i].uuid);
+ } else if (type == HELPER_T) {
+ config->write (String (SCIM_CONFIG_HOTKEYS_HELPER "/") + m_impl->m_uuids [i].uuid, keystr);
+ h_uuids.push_back (m_impl->m_uuids [i].uuid);
+ }
+ }
+ }
+
+ config->write (String (SCIM_CONFIG_HOTKEYS_IMENGINE_LIST), scim_combine_string_list (i_uuids));
+ config->write (String (SCIM_CONFIG_HOTKEYS_NEWISE_LIST), scim_combine_string_list (n_uuids));
+ config->write (String (SCIM_CONFIG_HOTKEYS_HELPER_LIST), scim_combine_string_list (h_uuids));
+}
+
+void
+IMEngineHotkeyMatcher::add_hotkey(const KeyEvent &key, const String &uuid, const ISE_TYPE &type)
+{
+ if (key.empty () || !uuid.length ()) return;
+
+ size_t i;
+
+ for (i = 0; i < m_impl->m_uuids.size (); ++i) {
+ if (m_impl->m_uuids [i].uuid == uuid)
+ break;
+ }
+
+ if (i == m_impl->m_uuids.size ()) {
+ ISEInfo info;
+ info.type = type;
+ info.uuid = uuid;
+ m_impl->m_uuids.push_back (info);
+ }
+
+
+ m_impl->m_matcher.add_hotkey (key, i);
+}
+
+void
+IMEngineHotkeyMatcher::add_hotkeys (const KeyEventList &keys, const String &uuid, const ISE_TYPE &type)
+{
+ if (!keys.size () || !uuid.length ()) return;
+
+ size_t i;
+
+ for (i = 0; i < m_impl->m_uuids.size (); ++i) {
+ if (m_impl->m_uuids [i].uuid == uuid)
+ break;
+ }
+
+ if (i == m_impl->m_uuids.size ()) {
+ ISEInfo info;
+ info.type = type;
+ info.uuid = uuid;
+ m_impl->m_uuids.push_back (info);
+ }
+
+ m_impl->m_matcher.add_hotkeys (keys, i);
+}
+
+size_t
+IMEngineHotkeyMatcher::find_hotkeys (const String &uuid, KeyEventList &keys) const
+{
+ for (size_t i = 0; i < m_impl->m_uuids.size (); ++i) {
+ if (m_impl->m_uuids [i].uuid == uuid)
+ return m_impl->m_matcher.find_hotkeys ((int) i, keys);
+ }
+
+ keys.clear ();
+ return 0;
+}
+
+size_t
+IMEngineHotkeyMatcher::get_all_hotkeys (KeyEventList &keys, std::vector <String> &uuids) const
+{
+ keys.clear ();
+ uuids.clear ();
+ std::vector <int> ids;
+
+ if (m_impl->m_matcher.get_all_hotkeys (keys, ids) > 0) {
+ for (size_t i = 0; i < ids.size (); ++i)
+ uuids.push_back (m_impl->m_uuids [ids [i]].uuid);
+ }
+
+ return keys.size ();
+}
+
+void
+IMEngineHotkeyMatcher::reset (void)
+{
+ m_impl->m_matcher.reset ();
+}
+
+void
+IMEngineHotkeyMatcher::clear (void)
+{
+ m_impl->m_matcher.clear ();
+ m_impl->m_uuids.clear ();
+}
+
+void
+IMEngineHotkeyMatcher::push_key_event (const KeyEvent &key)
+{
+ m_impl->m_matcher.push_key_event (key);
+}
+
+bool
+IMEngineHotkeyMatcher::is_matched (void) const
+{
+ return m_impl->m_matcher.is_matched ();
+}
+
+ISEInfo
+IMEngineHotkeyMatcher::get_match_result (void) const
+{
+ int id = m_impl->m_matcher.get_match_result ();
+
+ if (id >= 0 && id < (int) m_impl->m_uuids.size ())
+ return m_impl->m_uuids [id];
+
+ return ISEInfo ();
+}
+
+//============================ FrontEndHotkeyMatcher ==========================
+static const char *__scim_frontend_hotkey_config_paths [] =
+{
+ 0,
+ SCIM_CONFIG_HOTKEYS_FRONTEND_TRIGGER,
+ SCIM_CONFIG_HOTKEYS_FRONTEND_ON,
+ SCIM_CONFIG_HOTKEYS_FRONTEND_OFF,
+ SCIM_CONFIG_HOTKEYS_FRONTEND_NEXT_FACTORY,
+ SCIM_CONFIG_HOTKEYS_FRONTEND_PREVIOUS_FACTORY,
+ SCIM_CONFIG_HOTKEYS_FRONTEND_SHOW_FACTORY_MENU,
+ 0
+};
+
+static const char *__scim_frontend_hotkey_defaults [] =
+{
+ 0,
+ "Control+space",
+ "",
+ "",
+ "Control+Alt+Down,Control+Shift+Shift_L+KeyRelease,Control+Shift+Shift_R+KeyRelease",
+ "Control+Alt+Up,Control+Shift+Control_L+KeyRelease,Control+Shift+Control_R+KeyRelease",
+ "Control+Alt+Right",
+ 0
+};
+
+class FrontEndHotkeyMatcher::FrontEndHotkeyMatcherImpl
+{
+public:
+ HotkeyMatcher m_matcher;
+};
+
+FrontEndHotkeyMatcher::FrontEndHotkeyMatcher ()
+ : m_impl (new FrontEndHotkeyMatcherImpl ())
+{
+}
+
+FrontEndHotkeyMatcher::~FrontEndHotkeyMatcher ()
+{
+ delete m_impl;
+}
+
+void
+FrontEndHotkeyMatcher::load_hotkeys (const ConfigPointer &config)
+{
+ clear ();
+
+ if (config.null () || !config->valid ()) return;
+
+ KeyEventList keys;
+
+ // Load the least important hotkeys first.
+ for (int i = SCIM_FRONTEND_HOTKEY_SHOW_FACTORY_MENU; i >= SCIM_FRONTEND_HOTKEY_TRIGGER; --i) {
+ if (scim_string_to_key_list (keys, config->read (String (__scim_frontend_hotkey_config_paths [i]), String (__scim_frontend_hotkey_defaults [i]))))
+ m_impl->m_matcher.add_hotkeys (keys, i);
+ }
+}
+
+void
+FrontEndHotkeyMatcher::save_hotkeys (const ConfigPointer &config) const
+{
+ if (config.null () || !config->valid ()) return;
+
+ KeyEventList keys;
+ String keystr;
+
+ for (int i = SCIM_FRONTEND_HOTKEY_TRIGGER; i <= SCIM_FRONTEND_HOTKEY_SHOW_FACTORY_MENU; ++i) {
+ if (m_impl->m_matcher.find_hotkeys (i, keys) > 0 && scim_key_list_to_string (keystr, keys))
+ config->write (String (__scim_frontend_hotkey_config_paths [i]), keystr);
+ }
+}
+
+void
+FrontEndHotkeyMatcher::add_hotkey (const KeyEvent &key, FrontEndHotkeyAction action)
+{
+ if (key.empty () || action < SCIM_FRONTEND_HOTKEY_TRIGGER || action > SCIM_FRONTEND_HOTKEY_SHOW_FACTORY_MENU) return;
+
+ m_impl->m_matcher.add_hotkey (key, (int) action);
+}
+
+void
+FrontEndHotkeyMatcher::add_hotkeys (const KeyEventList &keys, FrontEndHotkeyAction action)
+{
+ if (!keys.size () || action < SCIM_FRONTEND_HOTKEY_TRIGGER || action > SCIM_FRONTEND_HOTKEY_SHOW_FACTORY_MENU) return;
+
+ m_impl->m_matcher.add_hotkeys (keys, (int) action);
+}
+
+size_t
+FrontEndHotkeyMatcher::find_hotkeys (FrontEndHotkeyAction action, KeyEventList &keys) const
+{
+ return m_impl->m_matcher.find_hotkeys ((int) action, keys);
+}
+
+size_t
+FrontEndHotkeyMatcher::get_all_hotkeys (KeyEventList &keys, std::vector <FrontEndHotkeyAction> &actions) const
+{
+ keys.clear ();
+ actions.clear ();
+
+ std::vector <int> ids;
+
+ m_impl->m_matcher.get_all_hotkeys (keys, ids);
+
+ for (size_t i = 0; i < ids.size (); ++i)
+ actions.push_back (static_cast<FrontEndHotkeyAction> (ids [i]));
+
+ return keys.size ();
+}
+
+void
+FrontEndHotkeyMatcher::reset (void)
+{
+ m_impl->m_matcher.reset ();
+}
+
+void
+FrontEndHotkeyMatcher::clear (void)
+{
+ m_impl->m_matcher.clear ();
+}
+
+void
+FrontEndHotkeyMatcher::push_key_event (const KeyEvent &key)
+{
+ m_impl->m_matcher.push_key_event (key);
+}
+
+bool
+FrontEndHotkeyMatcher::is_matched (void) const
+{
+ return m_impl->m_matcher.is_matched ();
+}
+
+FrontEndHotkeyAction
+FrontEndHotkeyMatcher::get_match_result (void) const
+{
+ int id = m_impl->m_matcher.get_match_result ();
+
+ if (id >= SCIM_FRONTEND_HOTKEY_TRIGGER && id <= SCIM_FRONTEND_HOTKEY_SHOW_FACTORY_MENU)
+ return static_cast<FrontEndHotkeyAction> (id);
+
+ return SCIM_FRONTEND_HOTKEY_NOOP;
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/**
+ * @file scim_hotkey.h
+ * @brief Defines the scim::HotkeyMatcher and scim::IMEngineHotkeyMatcher classes.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_hotkey.h,v 1.5 2005/10/06 18:02:06 liuspider Exp $
+ */
+
+#ifndef __SCIM_HOTKEY_H
+#define __SCIM_HOTKEY_H
+
+namespace scim {
+/**
+ * @addtogroup Accessories
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+/**
+ * @brief This class is used to match a KeyEvent among a set of hotkeys.
+ *
+ * This class keeps the key event history so that it can match any kind of
+ * key events, including key release events, correctly.
+ *
+ * If there are large amount of hotkeys to be matched, this class can provide
+ * very good performance.
+ */
+class HotkeyMatcher
+{
+ class HotkeyMatcherImpl;
+
+ HotkeyMatcherImpl *m_impl;
+
+ HotkeyMatcher (const HotkeyMatcher &);
+ const HotkeyMatcher & operator = (const HotkeyMatcher &);
+
+public:
+ /**
+ * @brief Constructor
+ */
+ HotkeyMatcher ();
+
+ /**
+ * @brief Destructor.
+ */
+ ~HotkeyMatcher ();
+
+ /**
+ * @brief Add a Hotkey into this HotkeyMatcher.
+ *
+ * If a same Hotkey was already added, then it'll be replaced by this new one.
+ *
+ * @param key A Hotkey to be added.
+ * @param id An id to be binded to this Hotkey.
+ */
+ void add_hotkey (const KeyEvent &key, int id);
+
+ /**
+ * @brief Add a set of Hotkeys into this HotkeyMatcher.
+ *
+ * If a same Hotkey in the list was already added, then it'll be replaced by the new one.
+ *
+ * @param keys A set of Hotkeys to be added.
+ * @param id An id to be binded to these Hotkeys.
+ */
+ void add_hotkeys (const KeyEventList &keys, int id);
+
+ /**
+ * @brief Find all Hotkeys binded to a specific id.
+ *
+ * @param id The id to be found.
+ * @param keys A KeyEventList object to hold all KeyEvents binded to the id.
+ * @return The number of Hotkeys found.
+ */
+ size_t find_hotkeys (int id, KeyEventList &keys) const;
+
+ /**
+ * @brief Get all Hotkeys added into this HotkeyMatcher.
+ *
+ * @param keys A KeyEventList object to hold all KeyEvents.
+ * @param ids A int list to hold all corresponding IDs.
+ *
+ * @return The number of available Hotkeys.
+ */
+ size_t get_all_hotkeys (KeyEventList &keys, std::vector <int> &ids) const;
+
+ /**
+ * @brief Reset the HotkeyMatcher.
+ *
+ * The KeyEvent queue will be cleared, all state will be reset.
+ * The Hotkeys which were already added will not be touched.
+ */
+ void reset (void);
+
+ /**
+ * @brief Clear all Hotkeys.
+ */
+ void clear (void);
+
+ /**
+ * @brief Push a KeyEvent into the queue.
+ *
+ * This KeyEvent will be matched against the available Hotkeys immediately.
+ *
+ * @param key The key to be pushed into.
+ */
+ void push_key_event (const KeyEvent &key);
+
+ /**
+ * @brief Check if the last KeyEvent pushed by push_key_event () matched with any Hotkey.
+ *
+ * @return true If the KeyEvent matched with a Hotkey.
+ */
+ bool is_matched (void) const;
+
+ /**
+ * @brief Get the match result.
+ *
+ * @return The corresponding id of the matched Hotkey. If no Hotkey was matched, return -1.
+ */
+ int get_match_result (void) const;
+
+};
+
+typedef enum {
+ NEWISE_T,
+ HELPER_T,
+ IMENGINE_T
+} ISE_TYPE;
+
+typedef struct {
+ String uuid;
+ ISE_TYPE type;
+} ISEInfo;
+
+/**
+ * @brief This class hold all Hotkeys for each IMEngines.
+ */
+class IMEngineHotkeyMatcher
+{
+ class IMEngineHotkeyMatcherImpl;
+
+ IMEngineHotkeyMatcherImpl *m_impl;
+
+ IMEngineHotkeyMatcher (const IMEngineHotkeyMatcher &);
+ const IMEngineHotkeyMatcher & operator = (const IMEngineHotkeyMatcher &);
+
+public:
+ IMEngineHotkeyMatcher ();
+ ~IMEngineHotkeyMatcher ();
+
+ /**
+ * @brief Load all Hotkeys for IMEngines from Config.
+ *
+ * @param config The Config object in which the Hotkeys are stored.
+ */
+ void load_hotkeys (const ConfigPointer &config);
+
+ /**
+ * @brief Save all Hotkeys for IMEngines to Config.
+ *
+ * @param config Store all Hotkeys to this Config object.
+ */
+ void save_hotkeys (const ConfigPointer &config) const;
+
+ /**
+ * @brief Add a Hotkey for an IMEngine into this IMEngineHotkeyMatcher.
+ *
+ * @param key The Hotkey.
+ * @param uuid The UUID of the corresponding IMEngine.
+ */
+ void add_hotkey (const KeyEvent &key, const String &uuid, const ISE_TYPE &type);
+
+ /**
+ * @brief Add a set of Hotkeys for an IMEngine into this IMEngineHotkeyMatcher.
+ *
+ * @param keys The Hotkeys.
+ * @param uuid The UUID of the corresponding IMEngine.
+ */
+ void add_hotkeys (const KeyEventList &keys, const String &uuid, const ISE_TYPE &type);
+
+ /**
+ * @brief Find all Hotkeys binded to a specific IMEngine UUID.
+ *
+ * @param uuid The IMEngine uuid to be found.
+ * @param keys A KeyEventList object to hold all KeyEvents binded to the uuid.
+ * @return The number of Hotkeys found.
+ */
+ size_t find_hotkeys (const String &uuid, KeyEventList &keys) const;
+
+ /**
+ * @brief Get all hotkeys in this IMEngineHotkeyMatcher.
+ *
+ * @param keys A list of all Hotkeys.
+ * @param uuids A list of all corresponding IMEngine UUIDs.
+ * @return the number of hotkeys found.
+ */
+ size_t get_all_hotkeys (KeyEventList &keys, std::vector <String> &uuids) const;
+
+ /**
+ * @brief Reset the IMEngineHotkeyMatcher.
+ *
+ * The KeyEvent queue will be cleared, all state will be reset.
+ * The Hotkeys which were already added will not be touched.
+ */
+ void reset (void);
+
+ /**
+ * @brief Clear all Hotkeys and reset the IMEngineHotkeyMatcher.
+ */
+ void clear (void);
+
+ /**
+ * @brief Push a KeyEvent into the queue.
+ *
+ * This KeyEvent will be matched against the available Hotkeys immediately.
+ *
+ * @param key The key to be pushed into.
+ */
+ void push_key_event (const KeyEvent &key);
+
+ /**
+ * @brief Check if the last KeyEvent pushed by push_key_event () matched with any Hotkey.
+ *
+ * @return true If the KeyEvent matched with a Hotkey.
+ */
+ bool is_matched (void) const;
+
+ /**
+ * @brief Get the match result.
+ *
+ * @return The corresponding UUID of the matched Hotkey. If no Hotkey was matched, return null string.
+ */
+ ISEInfo get_match_result (void) const;
+};
+
+/**
+ * @brief FrontEnd actions which could be binded with Hotkeys.
+ */
+enum FrontEndHotkeyAction
+{
+ SCIM_FRONTEND_HOTKEY_NOOP = 0, /**< No action */
+ SCIM_FRONTEND_HOTKEY_TRIGGER = 1, /**< Turn on/off the input method. */
+ SCIM_FRONTEND_HOTKEY_ON = 2, /**< Turn on the input method. */
+ SCIM_FRONTEND_HOTKEY_OFF = 3, /**< Turn off the input method. */
+ SCIM_FRONTEND_HOTKEY_NEXT_FACTORY = 4, /**< Switch current Input Context to use the next available IMEngine Factory. */
+ SCIM_FRONTEND_HOTKEY_PREVIOUS_FACTORY = 5, /**< Switch current Input Context to use the previous available IMEngine Factory. */
+ SCIM_FRONTEND_HOTKEY_SHOW_FACTORY_MENU = 6 /**< Show a menu of all available IMEngine Factories. */
+};
+
+/**
+ * @brief This class hold all FrontEnd specific Hotkeys, such as trigger keys, on/off keys, etc.
+ */
+class FrontEndHotkeyMatcher
+{
+ class FrontEndHotkeyMatcherImpl;
+
+ FrontEndHotkeyMatcherImpl *m_impl;
+
+ FrontEndHotkeyMatcher (const FrontEndHotkeyMatcher &);
+ const FrontEndHotkeyMatcher & operator = (const FrontEndHotkeyMatcher &);
+
+public:
+ FrontEndHotkeyMatcher ();
+ ~FrontEndHotkeyMatcher ();
+
+ /**
+ * @brief Load all FrontEnd specific Hotkeys from Config.
+ *
+ * @param config The Config object in which the Hotkeys are stored.
+ */
+ void load_hotkeys (const ConfigPointer &config);
+
+ /**
+ * @brief Save all FrontEnd specific Hotkeys to Config.
+ *
+ * @param config Store all Hotkeys to this Config object.
+ */
+ void save_hotkeys (const ConfigPointer &config) const;
+
+ /**
+ * @brief Add a Hotkey for an FrontEnd into this FrontEndHotkeyMatcher.
+ *
+ * @param key The Hotkey.
+ * @param action The action to do when the hotkey is matched.
+ */
+ void add_hotkey (const KeyEvent &key, FrontEndHotkeyAction action);
+
+ /**
+ * @brief Add a set of Hotkeys for an FrontEnd into this FrontEndHotkeyMatcher.
+ *
+ * @param keys The Hotkeys.
+ * @param action The action to do when the hotkey is matched.
+ */
+ void add_hotkeys (const KeyEventList &keys, FrontEndHotkeyAction action);
+
+ /**
+ * @brief Find all Hotkeys binded to a specific action.
+ *
+ * @param action The action to be found.
+ * @param keys A KeyEventList object to hold all KeyEvents binded to the action.
+ * @return The number of Hotkeys found.
+ */
+ size_t find_hotkeys (FrontEndHotkeyAction action, KeyEventList &keys) const;
+
+ /**
+ * @brief Get all hotkeys in this FrontEndHotkeyMatcher.
+ *
+ * @param keys A list of all Hotkeys.
+ * @param actions A list of all corresponding actions
+ */
+ size_t get_all_hotkeys (KeyEventList &keys, std::vector <FrontEndHotkeyAction> &actions) const;
+
+ /**
+ * @brief Reset the FrontEndHotkeyMatcher.
+ *
+ * The KeyEvent queue will be cleared, all state will be reset.
+ * The Hotkeys which were already added will not be touched.
+ */
+ void reset (void);
+
+ /**
+ * @brief Clear all Hotkeys and reset the FrontEndHotkeyMatcher.
+ */
+ void clear (void);
+
+ /**
+ * @brief Push a KeyEvent into the queue.
+ *
+ * This KeyEvent will be matched against the available Hotkeys immediately.
+ *
+ * @param key The key to be pushed into.
+ */
+ void push_key_event (const KeyEvent &key);
+
+ /**
+ * @brief Check if the last KeyEvent pushed by push_key_event () matched with any Hotkey.
+ *
+ * @return true If the KeyEvent matched with a Hotkey.
+ */
+ bool is_matched (void) const;
+
+ /**
+ * @brief Get the match result.
+ *
+ * @return The corresponding action of the matched Hotkey.
+ */
+ FrontEndHotkeyAction get_match_result (void) const;
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_HOTKEY_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_iconv.cpp,v 1.18.2.1 2007/04/14 08:35:54 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_ICONV
+#define Uses_C_LIMITS
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+struct IConvert::IConvertImpl
+{
+ String m_encoding;
+ iconv_t m_iconv_from_unicode;
+ iconv_t m_iconv_to_unicode;
+
+ IConvertImpl ()
+ : m_iconv_from_unicode ((iconv_t)-1),
+ m_iconv_to_unicode ((iconv_t)-1) {
+ }
+
+ ~IConvertImpl () {
+ if (m_iconv_from_unicode != (iconv_t) -1)
+ iconv_close (m_iconv_from_unicode);
+ if (m_iconv_to_unicode != (iconv_t) -1)
+ iconv_close (m_iconv_to_unicode);
+ }
+};
+
+IConvert::IConvert (const String& encoding)
+ : m_impl (new IConvertImpl)
+{
+ set_encoding (encoding);
+}
+
+IConvert::IConvert (const IConvert & iconvert)
+ : m_impl (new IConvertImpl)
+{
+ set_encoding (iconvert.m_impl->m_encoding);
+}
+
+IConvert::~IConvert ()
+{
+ delete m_impl;
+}
+
+const IConvert &
+IConvert::operator= (const IConvert & iconvert)
+{
+ if (this != &iconvert)
+ set_encoding (iconvert.m_impl->m_encoding);
+
+ return *this;
+}
+
+bool
+IConvert::set_encoding (const String& encoding)
+{
+ if (encoding.length () == 0) {
+ if (m_impl->m_iconv_from_unicode != (iconv_t) -1)
+ iconv_close (m_impl->m_iconv_from_unicode);
+ if (m_impl->m_iconv_to_unicode != (iconv_t) -1)
+ iconv_close (m_impl->m_iconv_to_unicode);
+ m_impl->m_iconv_from_unicode = (iconv_t) -1;
+ m_impl->m_iconv_to_unicode = (iconv_t) -1;
+ return true;
+ }
+
+ if (m_impl->m_iconv_from_unicode != (iconv_t) -1 &&
+ m_impl->m_iconv_to_unicode != (iconv_t) -1 &&
+ encoding == m_impl->m_encoding)
+ return true;
+
+ iconv_t new_iconv_from_unicode;
+ iconv_t new_iconv_to_unicode;
+
+ if (scim_is_little_endian ()) {
+ new_iconv_from_unicode = iconv_open (encoding.c_str (), "UCS-4LE");
+ new_iconv_to_unicode = iconv_open ("UCS-4LE", encoding.c_str ());
+ } else {
+ new_iconv_from_unicode = iconv_open (encoding.c_str (), "UCS-4BE");
+ new_iconv_to_unicode = iconv_open ("UCS-4BE", encoding.c_str ());
+ }
+
+ if (new_iconv_from_unicode == (iconv_t) -1 ||
+ new_iconv_to_unicode == (iconv_t) -1) {
+
+ if (new_iconv_from_unicode != (iconv_t) -1)
+ iconv_close (new_iconv_from_unicode);
+ if (new_iconv_to_unicode != (iconv_t) -1)
+ iconv_close (new_iconv_to_unicode);
+
+ return false;
+ }
+
+ if (m_impl->m_iconv_from_unicode != (iconv_t) -1)
+ iconv_close (m_impl->m_iconv_from_unicode);
+ if (m_impl->m_iconv_to_unicode != (iconv_t) -1)
+ iconv_close (m_impl->m_iconv_to_unicode);
+
+ m_impl->m_iconv_from_unicode = new_iconv_from_unicode;
+ m_impl->m_iconv_to_unicode = new_iconv_to_unicode;
+ m_impl->m_encoding = encoding;
+
+ return true;
+}
+
+String
+IConvert::get_encoding () const
+{
+ return m_impl->m_encoding;
+}
+
+bool
+IConvert::convert (String &dest, const ucs4_t *src, int src_len) const
+{
+ if (m_impl->m_iconv_from_unicode == (iconv_t) -1) return false;
+
+ char dest_buf [SCIM_MAX_BUFSIZE * MB_LEN_MAX];
+
+ size_t dest_buf_size = 0;
+ size_t src_buf_size = 0;
+ size_t ret;
+
+ iconv (m_impl->m_iconv_from_unicode, 0, &src_buf_size, 0, &dest_buf_size);
+
+ char *dest_buf_ptr = dest_buf;
+ ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) src;
+
+ dest_buf_size = SCIM_MAX_BUFSIZE * MB_LEN_MAX;
+ src_buf_size = src_len * sizeof (ucs4_t);
+
+ ret = iconv (m_impl->m_iconv_from_unicode, &src_buf_ptr, &src_buf_size, &dest_buf_ptr, &dest_buf_size);
+ dest.assign (dest_buf, dest_buf_ptr);
+
+ return ret != (size_t) -1;
+}
+
+bool
+IConvert::convert (String &dest, const WideString &src) const
+{
+ return convert (dest, src.data (), src.length ());
+}
+
+bool
+IConvert::test_convert (const ucs4_t *src, int src_len) const
+{
+ if (m_impl->m_iconv_from_unicode == (iconv_t) -1) return false;
+
+ char dest_buf [SCIM_MAX_BUFSIZE * MB_LEN_MAX];
+ size_t src_buf_size = 0;
+ size_t dest_buf_size = 0;
+ size_t ret;
+
+ iconv (m_impl->m_iconv_from_unicode, 0, &src_buf_size, 0, &dest_buf_size);
+
+ char *dest_buf_ptr = dest_buf;
+ ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) src;
+
+ src_buf_size = src_len * sizeof (ucs4_t);
+ dest_buf_size = SCIM_MAX_BUFSIZE * MB_LEN_MAX;
+
+ ret = iconv (m_impl->m_iconv_from_unicode, &src_buf_ptr, &src_buf_size, &dest_buf_ptr, &dest_buf_size);
+
+ return ret != (size_t) -1;
+}
+
+bool
+IConvert::test_convert (const WideString &src) const
+{
+ return test_convert (src.data (), src.length ());
+}
+
+bool
+IConvert::convert (WideString &dest, const char *src, int src_len) const
+{
+ if (m_impl->m_iconv_to_unicode == (iconv_t) -1) return false;
+
+ ucs4_t dest_buf [SCIM_MAX_BUFSIZE];
+
+ size_t dest_buf_size = 0;
+ size_t src_buf_size = 0;
+ size_t ret;
+
+ iconv (m_impl->m_iconv_to_unicode, 0, &src_buf_size, 0, &dest_buf_size);
+
+ char *dest_buf_ptr = (char*) dest_buf;
+ ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) src;
+
+ dest_buf_size = SCIM_MAX_BUFSIZE * sizeof (ucs4_t);
+ src_buf_size = src_len;
+
+ ret = iconv (m_impl->m_iconv_to_unicode, &src_buf_ptr, &src_buf_size, &dest_buf_ptr, &dest_buf_size);
+ dest.assign (dest_buf, (ucs4_t*) dest_buf_ptr);
+
+ return ret != (size_t) -1;
+}
+
+bool
+IConvert::convert (WideString &dest, const String &src) const
+{
+ return convert (dest, src.data (), src.length ());
+}
+
+bool
+IConvert::test_convert (const char *src, int src_len) const
+{
+ if (m_impl->m_iconv_to_unicode == (iconv_t) -1) return false;
+
+ ucs4_t dest_buf [SCIM_MAX_BUFSIZE];
+
+ size_t src_buf_size = 0;
+ size_t dest_buf_size = 0;
+ size_t ret;
+
+ iconv (m_impl->m_iconv_from_unicode, 0, &src_buf_size, 0, &dest_buf_size);
+
+ char *dest_buf_ptr = (char*) dest_buf;
+ ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) src;
+
+ src_buf_size = src_len;
+ dest_buf_size = SCIM_MAX_BUFSIZE * sizeof (ucs4_t);
+
+ ret = iconv (m_impl->m_iconv_to_unicode, &src_buf_ptr, &src_buf_size, &dest_buf_ptr, &dest_buf_size);
+
+ return ret != (size_t) -1;
+}
+
+bool
+IConvert::test_convert (const String &src) const
+{
+ return test_convert (src.data (), src.length ());
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_iconv.h
+ * @brief definition of IConvert related classes.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_iconv.h,v 1.18 2005/08/15 12:45:46 suzhe Exp $
+ */
+
+#ifndef __SCIM_ICONVERT_H
+#define __SCIM_ICONVERT_H
+
+namespace scim {
+
+/**
+ * @addtogroup Accessories
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+#define SCIM_MAX_BUFSIZE 4096
+
+/**
+ * @brief A class to convert strings between UCS-4 and local encodings.
+ */
+class IConvert
+{
+ class IConvertImpl;
+
+ IConvertImpl * m_impl;
+
+public:
+ /**
+ * @brief Constructor
+ * @param encoding the local encoding to be used.
+ */
+ IConvert (const String& encoding = String ());
+
+ /**
+ * @brief Copy constructor
+ */
+ IConvert (const IConvert & iconvert);
+
+ ~IConvert ();
+
+ /**
+ * @brief Assign operator
+ */
+ const IConvert & operator = (const IConvert & iconvert);
+
+ /**
+ * @brief Set the working local encoding.
+ * @param encoding the local encoding to be used.
+ * @return whether the encoding is ok or not.
+ */
+ bool set_encoding (const String& encoding);
+
+ /**
+ * @brief Get the current working local encoding.
+ * @return The name of the local encoding, like "UTF-8", "GB2312" etc.
+ */
+ String get_encoding () const;
+
+ /**
+ * @brief Convert a UCS-4 encoded WideString into a local encoded String.
+ * @param dest the result string will be stored here.
+ * @param src the WideString to be converted.
+ * @return true if success.
+ */
+ bool convert (String &dest, const WideString &src) const;
+
+ /**
+ * @brief Convert a UCS-4 encoded WideString into a local encoded String.
+ * @param dest the result string will be stored here.
+ * @param src the ucs-4 encoded string to be converted.
+ * @param src_len the length of source string.
+ * @return true if success.
+ */
+ bool convert (String &dest, const ucs4_t *src, int src_len) const;
+
+ /**
+ * @brief Convert a local encoded String into a UCS-4 encoded WideString.
+ * @param dest the result string will be stored here.
+ * @param src the local encoded string to be converted.
+ * @return ture if success.
+ */
+ bool convert (WideString &dest, const String &src) const;
+
+ /**
+ * @brief Convert a local encoded String into a UCS-4 encoded WideString.
+ * @param dest the result string will be stored here.
+ * @param src the local encoded string to be converted.
+ * @param src_len the length of source string.
+ * @return ture if success.
+ */
+ bool convert (WideString &dest, const char *src, int src_len) const;
+
+ /**
+ * @brief Test if a UCS-4 encoded WideString can be converted to a local encoded String.
+ * @param src the ucs-4 encoded string to be test.
+ * @return true if it can be converted without any problem.
+ */
+ bool test_convert (const WideString &src) const;
+
+ /**
+ * @brief Test if a ucs-4 encoded string can be converted to a local encoded String.
+ * @param src the ucs-4 encoded string to be test.
+ * @param src_len the length of source string.
+ * @return true if it can be converted without any problem.
+ */
+ bool test_convert (const ucs4_t *src, int src_len) const;
+
+ /**
+ * @brief Test if a local encoded string can be converted to a UCS-4 encoded WideString.
+ * @param src the local encoded string to be test.
+ * @return true if it can be converted without any problem.
+ */
+ bool test_convert (const String &src) const;
+
+ /**
+ * @brief Test if a local encoded string can be converted to a UCS-4 encoded WideString.
+ * @param src the local encoded string to be test.
+ * @param src_len the length of source string.
+ * @return true if it can be converted without any problem.
+ */
+ bool test_convert (const char *src, int src_len) const;
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_ICONVERT_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_imengine.cpp
+ * @brief Implementation of class IMEngineFactoryBase and IMEngineInstanceBase.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_imengine.cpp,v 1.15 2005/04/08 15:24:11 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_IMENGINE
+#define Uses_C_CTYPE
+
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+typedef Signal1<void, IMEngineInstanceBase*>
+ IMEngineSignalVoid;
+
+typedef Signal2<void, IMEngineInstanceBase*,int>
+ IMEngineSignalInt;
+
+typedef Signal2<void, IMEngineInstanceBase*,bool>
+ IMEngineSignalBool;
+
+typedef Signal2<void, IMEngineInstanceBase*,const String&>
+ IMEngineSignalString;
+
+typedef Signal2<void, IMEngineInstanceBase*,const WideString&>
+ IMEngineSignalWideString;
+
+typedef Signal2<void, IMEngineInstanceBase*,const KeyEvent&>
+ IMEngineSignalKeyEvent;
+
+typedef Signal2<void, IMEngineInstanceBase*,const Property&>
+ IMEngineSignalProperty;
+
+typedef Signal2<void, IMEngineInstanceBase*,const PropertyList&>
+ IMEngineSignalPropertyList;
+
+typedef Signal2<void, IMEngineInstanceBase*,const LookupTable&>
+ IMEngineSignalLookupTable;
+
+typedef Signal3<void, IMEngineInstanceBase*,const String&,const Transaction&>
+ IMEngineSignalStringTransaction;
+
+typedef Signal3<void, IMEngineInstanceBase*,const WideString&,const AttributeList&>
+ IMEngineSignalWideStringAttributeList;
+
+typedef Signal5<bool, IMEngineInstanceBase*,WideString&,int&,int,int>
+ IMEngineSignalGetSurroundingText;
+
+typedef Signal3<bool, IMEngineInstanceBase*,int,int>
+ IMEngineSignalDeleteSurroundingText;
+
+class IMEngineFactoryBase::IMEngineFactoryBaseImpl
+{
+public:
+ std::vector<String> m_encoding_list;
+ std::vector<String> m_locale_list;
+ String m_language;
+};
+
+class IMEngineInstanceBase::IMEngineInstanceBaseImpl
+{
+public:
+ IMEngineFactoryPointer m_factory;
+ String m_encoding;
+
+ IMEngineSignalVoid m_signal_show_preedit_string;
+ IMEngineSignalVoid m_signal_show_aux_string;
+ IMEngineSignalVoid m_signal_show_lookup_table;
+
+ IMEngineSignalVoid m_signal_hide_preedit_string;
+ IMEngineSignalVoid m_signal_hide_aux_string;
+ IMEngineSignalVoid m_signal_hide_lookup_table;
+
+ IMEngineSignalInt m_signal_update_preedit_caret;
+ IMEngineSignalWideStringAttributeList m_signal_update_preedit_string;
+ IMEngineSignalWideStringAttributeList m_signal_update_aux_string;
+ IMEngineSignalWideString m_signal_commit_string;
+ IMEngineSignalLookupTable m_signal_update_lookup_table;
+
+ IMEngineSignalKeyEvent m_signal_forward_key_event;
+
+ IMEngineSignalPropertyList m_signal_register_properties;
+ IMEngineSignalProperty m_signal_update_property;
+
+ IMEngineSignalVoid m_signal_beep;
+
+ IMEngineSignalString m_signal_start_helper;
+ IMEngineSignalString m_signal_stop_helper;
+ IMEngineSignalStringTransaction m_signal_send_helper_event;
+
+ IMEngineSignalGetSurroundingText m_signal_get_surrounding_text;
+ IMEngineSignalDeleteSurroundingText m_signal_delete_surrounding_text;
+
+
+ int m_id;
+ void * m_frontend_data;
+
+ IMEngineInstanceBaseImpl () : m_id (0), m_frontend_data (0) { }
+};
+
+IMEngineFactoryBase::IMEngineFactoryBase ()
+ : m_impl (new IMEngineFactoryBaseImpl ())
+{
+}
+
+IMEngineFactoryBase::~IMEngineFactoryBase ()
+{
+ delete m_impl;
+}
+
+bool
+IMEngineFactoryBase::validate_encoding (const String& encoding) const
+{
+ if (encoding == "UTF-8")
+ return true;
+
+ for (size_t i=0; i<m_impl->m_encoding_list.size (); ++i)
+ if (m_impl->m_encoding_list [i] == encoding)
+ return true;
+
+ return false;
+}
+
+bool
+IMEngineFactoryBase::validate_locale (const String& locale) const
+{
+ for (size_t i=0; i<m_impl->m_locale_list.size (); ++i)
+ if (m_impl->m_locale_list [i] == locale)
+ return true;
+
+ if (scim_get_locale_encoding (locale) == "UTF-8")
+ return true;
+
+ return false;
+}
+
+String
+IMEngineFactoryBase::get_language () const
+{
+ return m_impl->m_language;
+}
+
+WideString
+IMEngineFactoryBase::inverse_query (const WideString &str)
+{
+ return WideString ();
+}
+
+void
+IMEngineFactoryBase::load_resource ()
+{
+ return ;
+}
+
+String
+IMEngineFactoryBase::get_encodings () const
+{
+ return scim_combine_string_list (m_impl->m_encoding_list);
+}
+
+String
+IMEngineFactoryBase::get_locales () const
+{
+ return scim_combine_string_list (m_impl->m_locale_list);
+}
+
+String
+IMEngineFactoryBase::get_default_encoding () const
+{
+ if (m_impl->m_encoding_list.size ())
+ return m_impl->m_encoding_list [0];
+ return String ("UTF-8");
+}
+
+String
+IMEngineFactoryBase::get_default_locale () const
+{
+ if (m_impl->m_locale_list.size ())
+ return m_impl->m_locale_list [0];
+ return String ("");
+}
+
+void
+IMEngineFactoryBase::set_locales (const String& locales)
+{
+ m_impl->m_locale_list.clear ();
+ m_impl->m_encoding_list.clear ();
+
+ if (locales.size () == 0) return;
+
+ String locale;
+ std::vector <String> lc_list;
+
+ scim_split_string_list (lc_list, locales);
+
+ for (size_t i=0; i<lc_list.size (); ++i) {
+ locale = scim_validate_locale (lc_list [i]);
+ if (locale.length ()) {
+ m_impl->m_locale_list.push_back (locale);
+ m_impl->m_encoding_list.push_back (scim_get_locale_encoding (locale));
+ }
+ }
+
+ m_impl->m_language = scim_get_locale_language (get_default_locale ());
+}
+
+void
+IMEngineFactoryBase::set_languages (const String& languages)
+{
+ std::vector <String> lang_list;
+ String locales;
+ String all_locales;
+ std::vector<String> valid_langlist;
+ String valid_lang;
+
+ scim_split_string_list (lang_list, languages, ',');
+
+ for (size_t i = 0; i < lang_list.size (); ++ i) {
+ locales = scim_get_language_locales (lang_list [i]);
+ if (locales.length ()) {
+ if (all_locales.length ())
+ all_locales.push_back (',');
+ all_locales += locales;
+ }
+ }
+
+ if (all_locales.length ())
+ set_locales (all_locales);
+
+ if (lang_list.size ())
+ {
+ for(size_t i = 0;i<lang_list.size();i++)
+ {
+ valid_lang = scim_validate_language (lang_list [i]);
+ valid_langlist.push_back(valid_lang);
+ }
+ m_impl->m_language = scim_combine_string_list (valid_langlist);
+ }
+}
+
+IMEngineInstanceBase::IMEngineInstanceBase (IMEngineFactoryBase *factory,
+ const String &encoding,
+ int id)
+ : m_impl (new IMEngineInstanceBaseImpl ())
+{
+ m_impl->m_factory = factory;
+ m_impl->m_encoding = encoding;
+ m_impl->m_id = id;
+
+ if (!m_impl->m_factory.null ()) {
+ if (!m_impl->m_factory->validate_encoding (encoding)) {
+ m_impl->m_encoding = m_impl->m_factory->get_default_encoding ();
+ }
+ } else {
+ m_impl->m_encoding = String ("UTF-8");
+ }
+}
+
+IMEngineInstanceBase::~IMEngineInstanceBase ()
+{
+ delete m_impl;
+}
+
+bool
+IMEngineInstanceBase::set_encoding (const String &encoding)
+{
+ if (!m_impl->m_factory.null () && m_impl->m_factory->validate_encoding (encoding)) {
+ m_impl->m_encoding = encoding;
+ return true;
+ }
+ return false;
+}
+
+String
+IMEngineInstanceBase::get_encoding () const
+{
+ return m_impl->m_encoding;
+}
+
+int
+IMEngineInstanceBase::get_id () const
+{
+ return m_impl->m_id;
+}
+
+String
+IMEngineInstanceBase::get_factory_uuid () const
+{
+ if (!m_impl->m_factory.null ())
+ return m_impl->m_factory->get_uuid ();
+
+ return String ();
+}
+
+void
+IMEngineInstanceBase::set_frontend_data (void *data)
+{
+ m_impl->m_frontend_data = data;
+}
+
+void *
+IMEngineInstanceBase::get_frontend_data (void)
+{
+ return m_impl->m_frontend_data;
+}
+
+void
+IMEngineInstanceBase::move_preedit_caret (unsigned int)
+{
+}
+
+void
+IMEngineInstanceBase::select_aux (unsigned int)
+{
+}
+
+void
+IMEngineInstanceBase::select_candidate (unsigned int)
+{
+}
+
+void
+IMEngineInstanceBase::update_lookup_table_page_size (unsigned int)
+{
+}
+
+void
+IMEngineInstanceBase::lookup_table_page_up ()
+{
+}
+
+void
+IMEngineInstanceBase::lookup_table_page_down ()
+{
+}
+
+void
+IMEngineInstanceBase::reset_option ()
+{
+}
+
+void
+IMEngineInstanceBase::reset ()
+{
+}
+
+void
+IMEngineInstanceBase::focus_in ()
+{
+}
+
+void
+IMEngineInstanceBase::focus_out ()
+{
+}
+
+void
+IMEngineInstanceBase::trigger_property (const String &)
+{
+}
+
+void
+IMEngineInstanceBase::process_helper_event (const String &, const Transaction &)
+{
+}
+
+void
+IMEngineInstanceBase::update_client_capabilities (unsigned int /*cap*/)
+{
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_show_preedit_string (IMEngineSlotVoid *slot)
+{
+ return m_impl->m_signal_show_preedit_string.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_show_aux_string (IMEngineSlotVoid *slot)
+{
+ return m_impl->m_signal_show_aux_string.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_show_lookup_table (IMEngineSlotVoid *slot)
+{
+ return m_impl->m_signal_show_lookup_table.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_hide_preedit_string (IMEngineSlotVoid *slot)
+{
+ return m_impl->m_signal_hide_preedit_string.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_hide_aux_string (IMEngineSlotVoid *slot)
+{
+ return m_impl->m_signal_hide_aux_string.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_hide_lookup_table (IMEngineSlotVoid *slot)
+{
+ return m_impl->m_signal_hide_lookup_table.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_update_preedit_caret (IMEngineSlotInt *slot)
+{
+ return m_impl->m_signal_update_preedit_caret.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_update_preedit_string (IMEngineSlotWideStringAttributeList *slot)
+{
+ return m_impl->m_signal_update_preedit_string.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_update_aux_string (IMEngineSlotWideStringAttributeList *slot)
+{
+ return m_impl->m_signal_update_aux_string.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_update_lookup_table (IMEngineSlotLookupTable *slot)
+{
+ return m_impl->m_signal_update_lookup_table.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_commit_string (IMEngineSlotWideString *slot)
+{
+ return m_impl->m_signal_commit_string.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_forward_key_event (IMEngineSlotKeyEvent *slot)
+{
+ return m_impl->m_signal_forward_key_event.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_register_properties (IMEngineSlotPropertyList *slot)
+{
+ return m_impl->m_signal_register_properties.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_update_property (IMEngineSlotProperty *slot)
+{
+ return m_impl->m_signal_update_property.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_beep (IMEngineSlotVoid *slot)
+{
+ return m_impl->m_signal_beep.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_start_helper (IMEngineSlotString *slot)
+{
+ return m_impl->m_signal_start_helper.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_stop_helper (IMEngineSlotString *slot)
+{
+ return m_impl->m_signal_stop_helper.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_send_helper_event (IMEngineSlotStringTransaction *slot)
+{
+ return m_impl->m_signal_send_helper_event.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_get_surrounding_text (IMEngineSlotGetSurroundingText *slot)
+{
+ return m_impl->m_signal_get_surrounding_text.connect (slot);
+}
+
+Connection
+IMEngineInstanceBase::signal_connect_delete_surrounding_text (IMEngineSlotDeleteSurroundingText *slot)
+{
+ return m_impl->m_signal_delete_surrounding_text.connect (slot);
+}
+
+void
+IMEngineInstanceBase::show_preedit_string ()
+{
+ m_impl->m_signal_show_preedit_string (this);
+}
+
+void
+IMEngineInstanceBase::show_aux_string ()
+{
+ m_impl->m_signal_show_aux_string (this);
+}
+
+void
+IMEngineInstanceBase::show_lookup_table ()
+{
+ m_impl->m_signal_show_lookup_table (this);
+}
+
+void
+IMEngineInstanceBase::hide_preedit_string ()
+{
+ m_impl->m_signal_hide_preedit_string (this);
+}
+
+void
+IMEngineInstanceBase::hide_aux_string ()
+{
+ m_impl->m_signal_hide_aux_string (this);
+}
+
+void
+IMEngineInstanceBase::hide_lookup_table ()
+{
+ m_impl->m_signal_hide_lookup_table (this);
+}
+
+void
+IMEngineInstanceBase::update_preedit_caret (int caret)
+{
+ m_impl->m_signal_update_preedit_caret (this, caret);
+}
+
+void
+IMEngineInstanceBase::update_preedit_string (const WideString &str,
+ const AttributeList &attrs)
+{
+ m_impl->m_signal_update_preedit_string (this, str, attrs);
+}
+
+void
+IMEngineInstanceBase::update_aux_string (const WideString &str,
+ const AttributeList &attrs)
+{
+ m_impl->m_signal_update_aux_string (this, str, attrs);
+}
+
+void
+IMEngineInstanceBase::update_lookup_table (const LookupTable &table)
+{
+ m_impl->m_signal_update_lookup_table (this, table);
+}
+
+void
+IMEngineInstanceBase::commit_string (const WideString &str)
+{
+ m_impl->m_signal_commit_string (this, str);
+}
+
+void
+IMEngineInstanceBase::forward_key_event (const KeyEvent &key)
+{
+ m_impl->m_signal_forward_key_event (this, key);
+}
+
+void
+IMEngineInstanceBase::register_properties (const PropertyList &properties)
+{
+ m_impl->m_signal_register_properties (this, properties);
+}
+
+void
+IMEngineInstanceBase::update_property (const Property &property)
+{
+ m_impl->m_signal_update_property (this, property);
+}
+
+void
+IMEngineInstanceBase::beep ()
+{
+ m_impl->m_signal_beep (this);
+}
+
+void
+IMEngineInstanceBase::start_helper (const String &helper_uuid)
+{
+ m_impl->m_signal_start_helper (this, helper_uuid);
+}
+
+void
+IMEngineInstanceBase::stop_helper (const String &helper_uuid)
+{
+ m_impl->m_signal_stop_helper (this, helper_uuid);
+}
+
+void
+IMEngineInstanceBase::send_helper_event (const String &helper_uuid, const Transaction &trans)
+{
+ m_impl->m_signal_send_helper_event (this, helper_uuid, trans);
+}
+
+bool
+IMEngineInstanceBase::get_surrounding_text (WideString &text, int &cursor, int maxlen_before, int maxlen_after)
+{
+ text = WideString ();
+ cursor = 0;
+
+ if (maxlen_before == 0 && maxlen_after == 0)
+ return false;
+
+ if (m_impl->m_signal_get_surrounding_text (this, text, cursor, maxlen_before, maxlen_after) && text.length ())
+ return true;
+
+ return false;
+}
+
+bool
+IMEngineInstanceBase::delete_surrounding_text (int offset, int len)
+{
+ return m_impl->m_signal_delete_surrounding_text (this, offset, len);
+}
+
+// implementation of DummyIMEngine
+DummyIMEngineFactory::DummyIMEngineFactory ()
+{
+ set_locales ("C");
+}
+
+DummyIMEngineFactory::~DummyIMEngineFactory ()
+{
+}
+
+WideString
+DummyIMEngineFactory::get_name () const
+{
+ return utf8_mbstowcs (_("English/Keyboard"));
+}
+
+WideString
+DummyIMEngineFactory::get_authors () const
+{
+ return WideString ();
+}
+
+WideString
+DummyIMEngineFactory::get_credits () const
+{
+ return WideString ();
+}
+
+WideString
+DummyIMEngineFactory::get_help () const
+{
+ return WideString ();
+}
+
+String
+DummyIMEngineFactory::get_uuid () const
+{
+ return String ("0148bcec-850d-45f2-ba95-a493bb31492e");
+}
+
+String
+DummyIMEngineFactory::get_icon_file () const
+{
+ return String (SCIM_KEYBOARD_ICON_FILE);
+}
+
+bool
+DummyIMEngineFactory::validate_encoding (const String& encoding) const
+{
+ return true;
+}
+
+bool
+DummyIMEngineFactory::validate_locale (const String& locale) const
+{
+ return true;
+}
+
+IMEngineInstancePointer
+DummyIMEngineFactory::create_instance (const String& encoding, int id)
+{
+ return new DummyIMEngineInstance (this, encoding, id);
+}
+
+DummyIMEngineInstance::DummyIMEngineInstance (DummyIMEngineFactory *factory,
+ const String& encoding,
+ int id)
+ : IMEngineInstanceBase (factory, encoding, id)
+{
+}
+
+DummyIMEngineInstance::~DummyIMEngineInstance ()
+{
+}
+
+bool
+DummyIMEngineInstance::process_key_event (const KeyEvent& key)
+{
+ return false;
+}
+
+void
+DummyIMEngineInstance::focus_in ()
+{
+ register_properties (PropertyList ());
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/**
+ * @file scim_imengine.h
+ * @brief Defines scim::IMEngineFactoryBase and scim::IMEngineInstanceBase interfaces.
+ *
+ * scim::IMEngineFactoryBase and scim::IMEngineInstanceBase are the most important
+ * part of SCIM platform.
+ *
+ * These interfaces are used to write input method engine modules.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_imengine.h,v 1.19 2005/08/15 12:45:46 suzhe Exp $
+ */
+
+#ifndef __SCIM_IMENGINE_H
+#define __SCIM_IMENGINE_H
+
+namespace scim {
+/**
+ * @addtogroup IMEngine
+ * @ingroup InputServiceFramework
+ * The base classes for input method engine modules.
+ * @{
+ */
+
+/**
+ * @brief Enum values of all Client Capabilities bitmask.
+ *
+ * These capabilities are not always supported by all kinds of clients.
+ * So if an IMEngine requires some of them to realize some features,
+ * it should make sure that they are supported by client by checking the cap value
+ * sent by update_client_capabilities() action.
+ */
+enum ClientCapability
+{
+ SCIM_CLIENT_CAP_ONTHESPOT_PREEDIT = (1 << 0), /**< The client support OnTheSpot preedit (embed preedit string into client window) */
+ SCIM_CLIENT_CAP_SINGLE_LEVEL_PROPERTY = (1 << 1), /**< The client support displaying single level property, property tree may not be supported*/
+ SCIM_CLIENT_CAP_MULTI_LEVEL_PROPERTY = (1 << 2), /**< The client support displaying multiple level property, aka. property tree */
+ SCIM_CLIENT_CAP_TRIGGER_PROPERTY = (1 << 3), /**< The client is capabile to trigger the IMEngine property. */
+ SCIM_CLIENT_CAP_HELPER_MODULE = (1 << 4), /**< The client support helper module */
+ SCIM_CLIENT_CAP_SURROUNDING_TEXT = (1 << 5), /**< The client support get/delete surrounding text operations */
+ SCIM_CLIENT_CAP_ALL_CAPABILITIES = 0x3F
+};
+
+/**
+ * @brief An exception class to hold IMEngine related errors.
+ *
+ * scim::IMEngineBase and its derived classes must throw
+ * scim::IMEngineError object when error.
+ */
+class IMEngineError: public Exception
+{
+public:
+ IMEngineError (const String& what_arg)
+ : Exception (String("scim::IMEngine: ") + what_arg) { }
+};
+
+class IMEngineFactoryBase;
+class IMEngineInstanceBase;
+
+/**
+ * @typedef typedef Pointer <IMEngineFactoryBase> IMEngineFactoryPointer;
+ *
+ * A smart pointer for scim::IMEngineFactoryBase and its derived classes.
+ */
+typedef Pointer <IMEngineFactoryBase> IMEngineFactoryPointer;
+
+/**
+ * @typedef typedef Pointer <IMEngineInstanceBase> IMEngineInstancePointer;
+ *
+ * A smart pointer for scim::IMEngineInstanceBase and its derived classes.
+ */
+typedef Pointer <IMEngineInstanceBase> IMEngineInstancePointer;
+
+typedef Slot1<void, IMEngineInstanceBase*>
+ IMEngineSlotVoid;
+
+typedef Slot2<void, IMEngineInstanceBase*,int>
+ IMEngineSlotInt;
+
+typedef Slot2<void, IMEngineInstanceBase*,bool>
+ IMEngineSlotBool;
+
+typedef Slot2<void, IMEngineInstanceBase*,const String&>
+ IMEngineSlotString;
+
+typedef Slot2<void, IMEngineInstanceBase*,const WideString&>
+ IMEngineSlotWideString;
+
+typedef Slot2<void, IMEngineInstanceBase*,const KeyEvent&>
+ IMEngineSlotKeyEvent;
+
+typedef Slot2<void, IMEngineInstanceBase*,const LookupTable&>
+ IMEngineSlotLookupTable;
+
+typedef Slot2<void, IMEngineInstanceBase*,const Property&>
+ IMEngineSlotProperty;
+
+typedef Slot2<void, IMEngineInstanceBase*,const PropertyList&>
+ IMEngineSlotPropertyList;
+
+typedef Slot3<void, IMEngineInstanceBase*,const String&,const Transaction&>
+ IMEngineSlotStringTransaction;
+
+typedef Slot3<void, IMEngineInstanceBase*,const WideString&,const AttributeList&>
+ IMEngineSlotWideStringAttributeList;
+
+typedef Slot5<bool, IMEngineInstanceBase*,WideString&,int&,int,int>
+ IMEngineSlotGetSurroundingText;
+
+typedef Slot3<bool, IMEngineInstanceBase*,int,int>
+ IMEngineSlotDeleteSurroundingText;
+
+/**
+ * @brief The base class of the real input methods' IMEngineFactory classes.
+ *
+ * Each input method should implement a class derived from scim::IMEngineFactoryBase,
+ * which takes charge of holding shared data, creating IMEngineInstances etc.
+ */
+class IMEngineFactoryBase : public ReferencedObject
+{
+ class IMEngineFactoryBaseImpl;
+
+ IMEngineFactoryBaseImpl *m_impl;
+
+public:
+ IMEngineFactoryBase ();
+
+ /**
+ * @brief Virtual destructor.
+ */
+ virtual ~IMEngineFactoryBase ();
+
+ /**
+ * @name Pure virtual members.
+ *
+ * These member functions must be implemented in derived classes.
+ *
+ * @{
+ */
+
+ /**
+ * @brief Get the name of this input method engine.
+ *
+ * This name should be a localized string.
+ *
+ * @return A WideString containing the name.
+ */
+ virtual WideString get_name () const = 0;
+
+ /**
+ * @brief Get the UUID of this input method engine.
+ *
+ * Each input method engine has an unique UUID to
+ * distinguish itself from other engines.
+ *
+ * You may use uuidgen command shipped with e2fsprogs package to generate this UUID.
+ *
+ * @return A String containing an unique UUID.
+ */
+ virtual String get_uuid () const = 0;
+
+ /**
+ * @brief Get the icon file path of this input method engine.
+ *
+ * @return A String containing the icon file path on the local filesystem.
+ */
+ virtual String get_icon_file () const = 0;
+
+ /**
+ * @brief Get the authors information of this input method engine.
+ *
+ * This string should be a localized string.
+ *
+ * @return A WideString containing a list of the authors' name.
+ */
+ virtual WideString get_authors () const = 0;
+
+ /**
+ * @brief Get the credits information of this input method engine.
+ *
+ * This string should be a localized string.
+ *
+ * @return A WideString containing the credits information.
+ */
+ virtual WideString get_credits () const = 0;
+
+ /**
+ * @brief Get the help information of this input method engine.
+ *
+ * This string should be a localized string.
+ *
+ * @return A WideString containing the help information.
+ */
+ virtual WideString get_help () const = 0;
+
+ /**
+ * @brief Create a new IMEngineInstance object.
+ *
+ * This method creates a new scim::IMEngineInstanceBase object with the given encoding and id.
+ *
+ * @param encoding - the encoding supported by the client.
+ * @param id - the instance id, should be unique.
+ * @return A smart pointer points to this new IMEngineInstance object.
+ */
+ virtual IMEngineInstancePointer create_instance (const String& encoding, int id = -1) = 0;
+ /**
+ * @}
+ */
+
+ /**
+ * @brief Check if an encoding is supported by this IMEngineFactory.
+ *
+ * The default implementation of this virtual function validates the
+ * encoding against the locale list set by method set_locales.
+ *
+ * It should be enough in most case.
+ *
+ * @param encoding - the encoding name to be checked.
+ * @return true if the encoding is supported, otherwise false.
+ */
+ virtual bool validate_encoding (const String& encoding) const;
+
+ /**
+ * @brief Check if a locale is supported by this IMEngineFactory.
+ *
+ * The default implementation of this virtual function validates the
+ * locale against the locale list set by method set_locales.
+ *
+ * It should be enough in most case.
+ *
+ * @param locale - the locale name to be checked.
+ * @return true if the locale is supported, otherwise false.
+ */
+ virtual bool validate_locale (const String& locale) const;
+
+ /**
+ * @brief Get the supported language of this input method engine.
+ *
+ * The language name conforms to glibc locale naming standard, like:
+ * zh_CN Simplified Chinese
+ * zh_TW Traditional Chinese
+ * ja_JP Japanese
+ * ru_RU for Russian
+ *
+ * The second part of the name (territory id) can be omitted.
+ *
+ * The default implementation of this method will get the language name
+ * according to the return value of get_default_locale () method.
+ *
+ * This method maybe overwrited to return another language name,
+ * for example returning "~other" means other uncategorized languages.
+ */
+ virtual String get_language () const;
+
+ /**
+ * @brief Get the original key string of a composed string.
+ *
+ * For example, in the pinyin input method of Simplified Chinese:
+ * the key string of composed string "中国" can be "zhongguo".
+ *
+ * The default implementation just returns a empty string.
+ *
+ * @param str The composed string to be queried.
+ *
+ * @return the original key string of the given composed string.
+ */
+ virtual WideString inverse_query (const WideString &str);
+
+ /**
+ * @brief Load resource for ISE.
+ *
+ * The default implementation does nothing.
+ *
+ * @return void.
+ */
+ virtual void load_resource ();
+
+ /**
+ * @brief Get the default locale of this input method engine.
+ *
+ * The default locale is the first locale in the locale list,
+ * which is set by method set_locales.
+ *
+ * @return The default locale name.
+ */
+ String get_default_locale () const;
+
+ /**
+ * @brief Get the default encoding of this input method engine.
+ *
+ * The default encoding is the first locale's encoding in the locale list,
+ * which is set by method set_locales.
+ *
+ * @return The default encoding name.
+ */
+ String get_default_encoding () const;
+
+ /**
+ * @brief Get a list of all supported locales, separated by comma.
+ *
+ * @return A comma separated locale list.
+ */
+ String get_locales () const;
+
+ /**
+ * @brief Get a list of all supported encodings, separated by comma.
+ *
+ * @return A comma separated encoding list.
+ */
+ String get_encodings () const;
+
+protected:
+ /**
+ * @brief Set the locales supported by this input method engine.
+ *
+ * This method should be called within the constructors of the derived classes.
+ *
+ * set_locales () and set_languages () are exclusive with each other. Only one
+ * method should be used for one Factory object.
+ *
+ * @param locales - a comma separated list containing all valid locales
+ * should be supported by this input method engine.
+ * The first locale is the default one.
+ */
+ void set_locales (const String &locales);
+
+ /**
+ * @brief Set the languages supported by this input method engine.
+ *
+ * This method should be called within the constructors of the derived classes.
+ *
+ * set_locales () and set_languages () are exclusive with each other. Only one
+ * method should be used for one Factory object.
+ *
+ * @param languages - a comma separated list containing all valid languages
+ * should be supported by this input method engine.
+ * The first language is the default one.
+ */
+ void set_languages (const String &languages);
+};
+
+/**
+ * @brief The base class of the real input methods' IMEngineInstance classes.
+ *
+ * Each input method should implement a class derived from scim::IMEngineInstanceBase,
+ * which takes charge of recording Input Context status and processing user input events.
+ */
+class IMEngineInstanceBase : public ReferencedObject
+{
+ class IMEngineInstanceBaseImpl;
+
+ IMEngineInstanceBaseImpl *m_impl;
+
+public:
+ /**
+ * @brief Constructor.
+ *
+ * @param factory - the factory which creates this instance.
+ * @param encoding - the working encoding.
+ * @param id - the unique id of this instance.
+ */
+ IMEngineInstanceBase (IMEngineFactoryBase *factory,
+ const String &encoding,
+ int id = -1);
+
+ /**
+ * @brief Virtual destructor.
+ */
+ virtual ~IMEngineInstanceBase ();
+
+ /**
+ * @brief Set the working encoding for this instance.
+ *
+ * One engine instance can only support one client encoding at the same time.
+ * This encoding must be supported by the IMEngineFactory as well.
+ *
+ * This method could be overrided in derived class to do some extra job. But
+ * the method of this base class must be invoked within the new method.
+ *
+ * After invoking this method, reset() should be invoked to
+ * let the new encoding take effect.
+ *
+ * @return true if the encoding is supported, otherwise false.
+ */
+ virtual bool set_encoding (const String &encoding);
+
+ /**
+ * @brief Get the working encoding of this instance.
+ *
+ * This method returns the encoding passed to the
+ * constructor when constructing this object.
+ *
+ * @return The working encoding.
+ */
+ String get_encoding () const;
+
+ /**
+ * @brief Get the unique id of this instance.
+ *
+ * @return The id of this instance.
+ */
+ int get_id () const;
+
+ /**
+ * @brief Get the UUID of the engine factory.
+ *
+ * @return The UUID string of the engine factory.
+ */
+ String get_factory_uuid () const;
+
+ /**
+ * @brief Attach a pointer to this IMEngineInstance, which is pointed to corresponding FrontEnd data.
+ *
+ * @param data The pointer to corresponding FrontEnd data, eg. input context object.
+ */
+ void set_frontend_data (void *data);
+
+ /**
+ * @brief Retrieve the pointer previously attached by set_frontend_data();
+ *
+ * @return The pointer previously attached by set_frontend_data();
+ */
+ void * get_frontend_data (void);
+
+public:
+ /**
+ * @name Signal connection functions.
+ *
+ * These functions are used by FrontEnds to connect their corresponding slots to
+ * this IMEngineInstance's signals.
+ *
+ * @{
+ */
+ Connection signal_connect_show_preedit_string (IMEngineSlotVoid *slot);
+ Connection signal_connect_show_aux_string (IMEngineSlotVoid *slot);
+ Connection signal_connect_show_lookup_table (IMEngineSlotVoid *slot);
+ Connection signal_connect_hide_preedit_string (IMEngineSlotVoid *slot);
+ Connection signal_connect_hide_aux_string (IMEngineSlotVoid *slot);
+ Connection signal_connect_hide_lookup_table (IMEngineSlotVoid *slot);
+ Connection signal_connect_update_preedit_caret (IMEngineSlotInt *slot);
+ Connection signal_connect_update_preedit_string (IMEngineSlotWideStringAttributeList *slot);
+ Connection signal_connect_update_aux_string (IMEngineSlotWideStringAttributeList *slot);
+ Connection signal_connect_update_lookup_table (IMEngineSlotLookupTable *slot);
+ Connection signal_connect_commit_string (IMEngineSlotWideString *slot);
+ Connection signal_connect_forward_key_event (IMEngineSlotKeyEvent *slot);
+ Connection signal_connect_register_properties (IMEngineSlotPropertyList *slot);
+ Connection signal_connect_update_property (IMEngineSlotProperty *slot);
+ Connection signal_connect_beep (IMEngineSlotVoid *slot);
+ Connection signal_connect_start_helper (IMEngineSlotString *slot);
+ Connection signal_connect_stop_helper (IMEngineSlotString *slot);
+ Connection signal_connect_send_helper_event (IMEngineSlotStringTransaction *slot);
+
+ Connection signal_connect_get_surrounding_text (IMEngineSlotGetSurroundingText *slot);
+ Connection signal_connect_delete_surrounding_text (IMEngineSlotDeleteSurroundingText *slot);
+ /** @} */
+
+public:
+ /**
+ * @name Action functions.
+ *
+ * These functions will be called by FrontEnds to send events to
+ * this IMEngineInstance.
+ *
+ * @{
+ */
+
+ /**
+ * @brief Process a key event.
+ *
+ * @param key - the key event to be processed.
+ * @return true if the event is processed, otherwise the event
+ * is not processed and should be forward to client application.
+ */
+ virtual bool process_key_event (const KeyEvent &key) = 0;
+
+ /**
+ * @brief Move the preedit caret in the preedit string.
+ *
+ * @param pos - the new position that user requested.
+ */
+ virtual void move_preedit_caret (unsigned int pos);
+
+ /**
+ * @brief Select a aux in current aux string.
+ *
+ * When user click a aux directly,
+ * this method will be invoked by FrontEnd.
+ *
+ * @param index - the index in current page of the selected aux.
+ */
+ virtual void select_aux (unsigned int index);
+
+ /**
+ * @brief Select a candidate in current lookup table.
+ *
+ * When user click a candidate directly,
+ * this method will be invoked by FrontEnd.
+ *
+ * @param index - the index in current page of the selected candidate.
+ */
+ virtual void select_candidate (unsigned int index);
+
+ /**
+ * @brief Update the page size of current lookup table.
+ *
+ * In the next time, the lookup table should page down by
+ * this size.
+ *
+ * @param page_size - the new size of current page.
+ */
+ virtual void update_lookup_table_page_size (unsigned int page_size);
+
+ /**
+ * @brief Flip the lookup table to the previous page.
+ *
+ * The method will be invoked by FrontEnd when user click
+ * the lookup table page up button.
+ */
+ virtual void lookup_table_page_up ();
+
+ /**
+ * @brief Flip the lookup table to the next page.
+ *
+ * The method will be invoked by FrontEnd when user click
+ * the lookup table page down button.
+ */
+ virtual void lookup_table_page_down ();
+
+ /**
+ * @brief Reset option.
+ *
+ * The method will be invoked by FrontEnd when user click
+ * the reset button.
+ */
+ virtual void reset_option ();
+
+ /**
+ * @brief Reset this engine instance.
+ *
+ * All status of this engine instance should be reset,
+ * including the working encoding.
+ *
+ * The client encoding may have been changed before calling
+ * this method, so if the IMEngine makes use of the client's encoding
+ * information, it should check whether the encoding has been changed.
+ * IMEngineInstance could call the get_encoding () method of base class
+ * to get the client encoding.
+ */
+ virtual void reset ();
+
+ /**
+ * @brief Focus in this engine instance.
+ *
+ * This function should update/show/hide the status area,
+ * preedit area and lookup table, and update the
+ * full width punctuation/letter state.
+ */
+ virtual void focus_in ();
+
+ /**
+ * @brief Focus out this engine instance.
+ */
+ virtual void focus_out ();
+
+ /**
+ * @brief Trigger a property.
+ *
+ * This function should do some action according
+ * to the triggered property.
+ * For example toggle the input mode, etc.
+ *
+ * @param property the key of the triggered property.
+ */
+ virtual void trigger_property (const String &property);
+
+ /**
+ * @brief Process the events sent from a Client Helper process.
+ *
+ * @param helper_uuid The UUID of the Helper process which sent the events.
+ * @param trans The transaction which contains the events.
+ */
+ virtual void process_helper_event (const String &helper_uuid, const Transaction &trans);
+
+ /**
+ * @brief Update the capabilities of current client application which is attached to this IMEngineInstance.
+ *
+ * Some client may not support all capabilities provided by the IMEngine API. For example:
+ *
+ * - OnTheSpot preedit string display (Embedded into client window).
+ * - Property display
+ * - Helper module
+ * - etc.
+ *
+ * This method will be called to inform this IMEngineInstance object which capabilities are supported by the
+ * client application. It may be called multiple times, if the capabilities was changed.
+ *
+ * @param cap A bitmask to indicate which client capabilities are supported by the client application.
+ *
+ * @sa scim::ClientCapability
+ */
+ virtual void update_client_capabilities (unsigned int cap);
+ /** @} */
+
+protected:
+ /**
+ * @name Signal activation functions
+ *
+ * These functions should be called by derived classes
+ * to fire the corresponding signals. The FrontEnd
+ * connected to those signals will receive and process them.
+ *
+ * @{
+ */
+
+ /**
+ * @brief Show the preedit string area.
+ *
+ * The preedit string should be updated by calling
+ * update_preedit_string before or right after this call.
+ */
+ void show_preedit_string ();
+
+ /**
+ * @brief Show the aux string area.
+ *
+ * The aux string should be updated by calling
+ * update_aux_string before or right after this call.
+ *
+ * The aux string can contain any additional information whatever
+ * the input method engine want.
+ */
+ void show_aux_string ();
+
+ /**
+ * @brief Show the lookup table area.
+ *
+ * The lookup table should be updated by calling
+ * update_lookup_table before or right after this call.
+ */
+ void show_lookup_table ();
+
+ /**
+ * @brief Hide the preedit string area.
+ */
+ void hide_preedit_string ();
+
+ /**
+ * @brief Hide the aux string area.
+ */
+ void hide_aux_string ();
+
+ /**
+ * @brief Hide the lookup table area.
+ */
+ void hide_lookup_table ();
+
+ /**
+ * @brief Update the preedit caret position in the preedit string.
+ *
+ * @param caret - the new position of the preedit caret.
+ */
+ void update_preedit_caret (int caret);
+
+ /**
+ * @brief Update the content of the preedit string,
+ *
+ * @param str - the string content
+ * @param attrs - the string attributes
+ */
+ void update_preedit_string (const WideString &str,
+ const AttributeList &attrs = AttributeList ());
+
+ /**
+ * @brief Update the content of the aux string,
+ *
+ * @param str - the string content
+ * @param attrs - the string attribute
+ */
+ void update_aux_string (const WideString &str,
+ const AttributeList &attrs = AttributeList ());
+
+ /**
+ * @brief Update the content of the lookup table,
+ *
+ * FrontEnd may reduce the page size of the table
+ * according to screen resolution. If the page size
+ * is changed, FrontEnd will inform this engine instance
+ * by calling update_lookup_table_page_size method.
+ *
+ * @param table - the new LookupTable
+ */
+ void update_lookup_table (const LookupTable &table);
+
+ /**
+ * @brief Commit a string to the client application.
+ *
+ * The preedit string should be hid before calling
+ * this method. Otherwise the clients which use
+ * OnTheSpot input mode will flicker annoyingly.
+ *
+ * @param str - the string to be committed.
+ */
+ void commit_string (const WideString &str);
+
+ /**
+ * @brief Forward a key event to the client application.
+ *
+ * @param key - the key event to be forwarded.
+ */
+ void forward_key_event (const KeyEvent &key);
+
+ /**
+ * @brief Register all properties of this IMEngineInstance into the FrontEnd.
+ *
+ * The old properties previously registered by other IMEngineInstance will be discarded,
+ * so for each time focus_in() is called, all properties should be registered
+ * no matter whether they had been registered before.
+ *
+ * @param properties the PropertyList contains all of the properties.
+ */
+ void register_properties (const PropertyList &properties);
+
+ /**
+ * @brief Update a registered property.
+ *
+ * Update a property which already registered by register_properties () method.
+ *
+ * @param property the property to be updated.
+ */
+ void update_property (const Property &property);
+
+ /**
+ * @brief Generate a short beep.
+ */
+ void beep ();
+
+ /**
+ * @brief Start a Client Helper process.
+ *
+ * @param helper_uuid The UUID of the Helper object.
+ */
+ void start_helper (const String &helper_uuid);
+
+ /**
+ * @brief Stop a Client Helper process which was started by start_helper.
+ *
+ * @param helper_uuid The UUID of the Helper object.
+ */
+ void stop_helper (const String &helper_uuid);
+
+ /**
+ * @brief Send an events transaction to a client helper process.
+ *
+ * @param helper_uuid The UUID of the Helper object.
+ * @param trans The transaction which contains events.
+ */
+ void send_helper_event (const String &helper_uuid, const Transaction &trans);
+
+ /**
+ * @brief Retrieves context around the insertion point.
+ *
+ * Input methods typically want context in order to constrain
+ * input text based on existing text;
+ * this is important for languages such as Thai where
+ * only some sequences of characters are allowed.
+ *
+ * Unlike other signal activation actions, this action will return the result
+ * immediately.
+ *
+ * @param text location to store the context string around the insertion point.
+ * @param cursor location to store index of the insertion cursor within @text.
+ * @param maxlen_before the maxmium length of context string to be retrieved
+ * before the cursor; -1 means unlimited.
+ * @param maxlen_after the maxmium length of context string to be retrieved
+ * after the cursor; -1 means unlimited.
+ *
+ * @return true if surrounding text was provided.
+ */
+ bool get_surrounding_text (WideString &text, int &cursor, int maxlen_before = -1, int maxlen_after = -1);
+
+ /**
+ * @brief Ask the client to delete characters around the cursor position.
+ *
+ * In order to use this function, you should first call
+ * get_surrounding_text () to get the current context, and
+ * call this function immediately afterwards to make sure that you
+ * know what you are deleting. You should also account for the fact
+ * that even if the signal was handled, the input context might not
+ * have deleted all the characters that were requested to be deleted.
+ *
+ * @param offset offset from cursor position in chars;
+ * a negative value means start before the cursor.
+ * @param len number of characters to delete.
+ *
+ * @return true if the signal was handled.
+ */
+ bool delete_surrounding_text (int offset, int len);
+ /** @} */
+};
+
+/**
+ * @brief A trivial IMEngine that do nothing.
+ */
+class DummyIMEngineFactory : public IMEngineFactoryBase
+{
+public:
+ DummyIMEngineFactory ();
+ virtual ~DummyIMEngineFactory ();
+
+ virtual WideString get_name () const;
+ virtual String get_uuid () const;
+ virtual String get_icon_file () const;
+ virtual WideString get_authors () const;
+ virtual WideString get_credits () const;
+ virtual WideString get_help () const;
+
+ virtual bool validate_encoding (const String& encoding) const;
+ virtual bool validate_locale (const String& locale) const;
+
+ virtual IMEngineInstancePointer create_instance (const String& encoding, int id = -1);
+};
+
+class DummyIMEngineInstance : public IMEngineInstanceBase
+{
+public:
+ DummyIMEngineInstance (DummyIMEngineFactory *factory,
+ const String &encoding,
+ int id = -1);
+
+ virtual ~DummyIMEngineInstance ();
+
+ virtual bool process_key_event (const KeyEvent& key);
+ virtual void focus_in ();
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_IMENGINE_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_imengine_module.cpp,v 1.3 2005/01/10 08:30:54 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_IMENGINE_MODULE
+#define Uses_SCIM_MODULE
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+IMEngineModule::IMEngineModule ()
+ : m_imengine_init (0),
+ m_imengine_create_factory (0),
+ m_number_of_factories (0)
+{
+}
+
+IMEngineModule::IMEngineModule (const String &name, const ConfigPointer &config)
+ : m_imengine_init (0),
+ m_imengine_create_factory (0),
+ m_number_of_factories (0)
+{
+ load (name, config);
+}
+
+bool
+IMEngineModule::load (const String &name, const ConfigPointer &config)
+{
+ m_module_name = name;
+ try {
+ if (!m_module.load (name, "IMEngine"))
+ return false;
+
+ m_imengine_init =
+ (IMEngineModuleInitFunc) m_module.symbol ("scim_imengine_module_init");
+
+ m_imengine_create_factory =
+ (IMEngineModuleCreateFactoryFunc) m_module.symbol ("scim_imengine_module_create_factory");
+
+ if (!m_imengine_init || !m_imengine_create_factory) {
+ m_module.unload ();
+ m_imengine_init = 0;
+ m_imengine_create_factory = 0;
+ m_number_of_factories = 0;
+ return false;
+ }
+
+ m_number_of_factories = m_imengine_init (config);
+ } catch (...) {
+ m_module.unload ();
+ m_imengine_init = 0;
+ m_imengine_create_factory = 0;
+ m_number_of_factories = 0;
+ return false;
+ }
+
+ return true;
+}
+
+bool
+IMEngineModule::unload ()
+{
+ return m_module.unload ();
+}
+
+bool
+IMEngineModule::valid () const
+{
+ return (m_module.valid () && m_imengine_init &&
+ m_imengine_create_factory && m_number_of_factories > 0);
+}
+
+IMEngineFactoryPointer
+IMEngineModule::create_factory (unsigned int engine) const
+{
+ if (valid () && engine < m_number_of_factories )
+ return m_imengine_create_factory (engine);
+
+ return IMEngineFactoryPointer (0);
+}
+
+unsigned int
+IMEngineModule::number_of_factories ()
+{
+ if (m_module_name == "socket")
+ m_number_of_factories = m_imengine_init (NULL);
+ return m_number_of_factories ;
+}
+
+String
+IMEngineModule::get_module_name () const
+{
+ return m_module_name;
+}
+
+int scim_get_imengine_module_list (std::vector <String>& engine_list)
+{
+ return scim_get_module_list (engine_list, "IMEngine");
+}
+
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_imengine_module.h
+ * @brief definition of IMEngineModule related classes.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_imengine_module.h,v 1.4 2005/01/10 08:30:54 suzhe Exp $
+ */
+
+#ifndef __SCIM_IMENGINE_MODULE_H
+#define __SCIM_IMENGINE_MODULE_H
+
+namespace scim {
+/**
+ * @addtogroup IMEngine
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+/**
+ * @brief Initialize a IMEngine Module.
+ *
+ * There must be a function called "scim_imengine_module_init"
+ * in each imengine module which complies with this prototype.
+ * This function name can have a prefix like table_LTX_,
+ * in which "table" is the module's name.
+ *
+ * @param config - a ConfigBase instance to maintain the configuration.
+ * @return the number of factories supported by this IMEngine Module.
+ */
+typedef unsigned int (*IMEngineModuleInitFunc) (const ConfigPointer &config);
+
+/**
+ * @brief Create a factory instance for an engine,
+ *
+ * There must be a function called "scim_imengine_module_create_factory"
+ * which complies with this prototype.
+ * This function name can have a prefix like table_LTX_,
+ * in which "table" is the module's name.
+ *
+ * @param engine - the index of the engine for which a factory object will be created.
+ * @return the pointer of the factory object.
+ */
+typedef IMEngineFactoryPointer (*IMEngineModuleCreateFactoryFunc) (unsigned int engine);
+
+/**
+ * @brief The class to manipulate the IMEngine modules.
+ *
+ * This is a wrapper of scim::Module class, which is specially
+ * for manipulating the IMEngine modules.
+ */
+class IMEngineModule
+{
+ Module m_module;
+ String m_module_name;
+
+ IMEngineModuleInitFunc m_imengine_init;
+ IMEngineModuleCreateFactoryFunc m_imengine_create_factory;
+
+ unsigned int m_number_of_factories;
+
+ IMEngineModule (const IMEngineModule &);
+ IMEngineModule & operator= (const IMEngineModule &);
+
+public:
+ /**
+ * @brief Default constructor.
+ */
+ IMEngineModule ();
+
+ /**
+ * @brief Constructor.
+ * @param name - the module's name, eg. "rawcode".
+ * @param config - a smart pointer points to a ConfigBase instance.
+ */
+ IMEngineModule (const String &name, const ConfigPointer &config);
+
+ /**
+ * @brief Load a IMEngine Module by its name.
+ *
+ * Load a module into memory.
+ * If another module has been loaded into this object,
+ * then the old module will be unloaded first.
+ * If the old module is resident, false will be returned,
+ * and the old module will be untouched.
+ *
+ * @param name - the name of the IMEngine Module.
+ * @param config - the ConfigBase instance to be used for storing/loading configs.
+ * @return true if success.
+ */
+ bool load (const String &name, const ConfigPointer &config);
+
+ /**
+ * @brief Unload the IMEngine Module.
+ * @return true if sucessfully unloaded.
+ */
+ bool unload ();
+
+ /**
+ * @brief Check if a module is loaded and initialized successfully.
+ * @return true if a module is already loaded and initialized successfully.
+ */
+ bool valid () const;
+
+ /**
+ * @brief Get how many IMEngine factories supported by this module.
+ *
+ * @return the number of IMEngine factories.
+ */
+ unsigned int number_of_factories ();
+
+ /**
+ * @brief Create an object for an IMEngine factory.
+ *
+ * @param engine - the index of this IMEngine factory,
+ * must be less than the result of number_of_factories method
+ * and greater than or equal to zero.
+ * @return A smart pointer to the factory object, NULL if failed.
+ */
+ IMEngineFactoryPointer create_factory (unsigned int engine) const;
+
+ String get_module_name () const;
+};
+
+/**
+ * @brief Get a name list of currently available IMEngine modules.
+ * @param mod_list - the result list will be stored here.
+ * @return the number of the modules, equal to mod_list.size ().
+ */
+int scim_get_imengine_module_list (std::vector <String> &mod_list);
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_IMENGINE_MODULE_H
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+// KeyEvent code mapping pairs.
+// From To
+static __Uint16Pair __belgian_to_us_normal [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_8 },
+ { SCIM_KEY_quotedbl, SCIM_KEY_3 },
+ { SCIM_KEY_dollar, SCIM_KEY_bracketright },
+ { SCIM_KEY_ampersand, SCIM_KEY_1 },
+ { SCIM_KEY_apostrophe, SCIM_KEY_4 },
+ { SCIM_KEY_parenleft, SCIM_KEY_5 },
+ { SCIM_KEY_parenright, SCIM_KEY_minus },
+ { SCIM_KEY_comma, SCIM_KEY_m },
+ { SCIM_KEY_minus, SCIM_KEY_equal },
+ { SCIM_KEY_colon, SCIM_KEY_period },
+ { SCIM_KEY_semicolon, SCIM_KEY_comma },
+ { SCIM_KEY_equal, SCIM_KEY_slash },
+ { SCIM_KEY_a, SCIM_KEY_q },
+ { SCIM_KEY_m, SCIM_KEY_semicolon },
+ { SCIM_KEY_q, SCIM_KEY_a },
+ { SCIM_KEY_w, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_w },
+ { SCIM_KEY_section, SCIM_KEY_6 },
+ { SCIM_KEY_twosuperior, SCIM_KEY_grave },
+ { SCIM_KEY_mu, SCIM_KEY_backslash },
+ { SCIM_KEY_agrave, SCIM_KEY_0 },
+ { SCIM_KEY_ccedilla, SCIM_KEY_9 },
+ { SCIM_KEY_egrave, SCIM_KEY_7 },
+ { SCIM_KEY_eacute, SCIM_KEY_2 },
+ { SCIM_KEY_ugrave, SCIM_KEY_apostrophe },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_bracketleft },
+};
+
+static __Uint16Pair __us_to_belgian_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_ugrave },
+ { SCIM_KEY_comma, SCIM_KEY_semicolon },
+ { SCIM_KEY_minus, SCIM_KEY_parenright },
+ { SCIM_KEY_period, SCIM_KEY_colon },
+ { SCIM_KEY_slash, SCIM_KEY_equal },
+ { SCIM_KEY_0, SCIM_KEY_agrave },
+ { SCIM_KEY_1, SCIM_KEY_ampersand },
+ { SCIM_KEY_2, SCIM_KEY_eacute },
+ { SCIM_KEY_3, SCIM_KEY_quotedbl },
+ { SCIM_KEY_4, SCIM_KEY_apostrophe },
+ { SCIM_KEY_5, SCIM_KEY_parenleft },
+ { SCIM_KEY_6, SCIM_KEY_section },
+ { SCIM_KEY_7, SCIM_KEY_egrave },
+ { SCIM_KEY_8, SCIM_KEY_exclam },
+ { SCIM_KEY_9, SCIM_KEY_ccedilla },
+ { SCIM_KEY_semicolon, SCIM_KEY_m },
+ { SCIM_KEY_equal, SCIM_KEY_minus },
+ { SCIM_KEY_bracketleft, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_backslash, SCIM_KEY_mu },
+ { SCIM_KEY_bracketright, SCIM_KEY_dollar },
+ { SCIM_KEY_grave, SCIM_KEY_twosuperior },
+ { SCIM_KEY_a, SCIM_KEY_q },
+ { SCIM_KEY_m, SCIM_KEY_comma },
+ { SCIM_KEY_q, SCIM_KEY_a },
+ { SCIM_KEY_w, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_w },
+};
+
+static __Uint16Pair __belgian_to_us_caps [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_8 },
+ { SCIM_KEY_quotedbl, SCIM_KEY_3 },
+ { SCIM_KEY_dollar, SCIM_KEY_bracketright },
+ { SCIM_KEY_ampersand, SCIM_KEY_1 },
+ { SCIM_KEY_apostrophe, SCIM_KEY_4 },
+ { SCIM_KEY_parenleft, SCIM_KEY_5 },
+ { SCIM_KEY_parenright, SCIM_KEY_minus },
+ { SCIM_KEY_comma, SCIM_KEY_M },
+ { SCIM_KEY_minus, SCIM_KEY_equal },
+ { SCIM_KEY_colon, SCIM_KEY_period },
+ { SCIM_KEY_semicolon, SCIM_KEY_comma },
+ { SCIM_KEY_equal, SCIM_KEY_slash },
+ { SCIM_KEY_A, SCIM_KEY_Q },
+ { SCIM_KEY_M, SCIM_KEY_semicolon },
+ { SCIM_KEY_Q, SCIM_KEY_A },
+ { SCIM_KEY_W, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_W },
+ { SCIM_KEY_section, SCIM_KEY_6 },
+ { SCIM_KEY_twosuperior, SCIM_KEY_grave },
+ { SCIM_KEY_mu, SCIM_KEY_backslash },
+ { SCIM_KEY_Agrave, SCIM_KEY_0 },
+ { SCIM_KEY_Ccedilla, SCIM_KEY_9 },
+ { SCIM_KEY_Egrave, SCIM_KEY_7 },
+ { SCIM_KEY_Eacute, SCIM_KEY_2 },
+ { SCIM_KEY_Ugrave, SCIM_KEY_apostrophe },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_bracketleft },
+};
+
+static __Uint16Pair __us_to_belgian_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_Ugrave },
+ { SCIM_KEY_comma, SCIM_KEY_semicolon },
+ { SCIM_KEY_minus, SCIM_KEY_parenright },
+ { SCIM_KEY_period, SCIM_KEY_colon },
+ { SCIM_KEY_slash, SCIM_KEY_equal },
+ { SCIM_KEY_0, SCIM_KEY_Agrave },
+ { SCIM_KEY_1, SCIM_KEY_ampersand },
+ { SCIM_KEY_2, SCIM_KEY_Eacute },
+ { SCIM_KEY_3, SCIM_KEY_quotedbl },
+ { SCIM_KEY_4, SCIM_KEY_apostrophe },
+ { SCIM_KEY_5, SCIM_KEY_parenleft },
+ { SCIM_KEY_6, SCIM_KEY_section },
+ { SCIM_KEY_7, SCIM_KEY_Egrave },
+ { SCIM_KEY_8, SCIM_KEY_exclam },
+ { SCIM_KEY_9, SCIM_KEY_Ccedilla },
+ { SCIM_KEY_semicolon, SCIM_KEY_M },
+ { SCIM_KEY_equal, SCIM_KEY_minus },
+ { SCIM_KEY_A, SCIM_KEY_Q },
+ { SCIM_KEY_M, SCIM_KEY_comma },
+ { SCIM_KEY_Q, SCIM_KEY_A },
+ { SCIM_KEY_W, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_W },
+ { SCIM_KEY_bracketleft, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_backslash, SCIM_KEY_mu },
+ { SCIM_KEY_bracketright, SCIM_KEY_dollar },
+ { SCIM_KEY_grave, SCIM_KEY_twosuperior },
+};
+
+static __Uint16Pair __belgian_to_us_shift [] = {
+ { SCIM_KEY_percent, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asterisk, SCIM_KEY_braceright },
+ { SCIM_KEY_plus, SCIM_KEY_question },
+ { SCIM_KEY_period, SCIM_KEY_less },
+ { SCIM_KEY_slash, SCIM_KEY_greater },
+ { SCIM_KEY_0, SCIM_KEY_parenright },
+ { SCIM_KEY_1, SCIM_KEY_exclam },
+ { SCIM_KEY_2, SCIM_KEY_at },
+ { SCIM_KEY_3, SCIM_KEY_numbersign },
+ { SCIM_KEY_4, SCIM_KEY_dollar },
+ { SCIM_KEY_5, SCIM_KEY_percent },
+ { SCIM_KEY_6, SCIM_KEY_asciicircum },
+ { SCIM_KEY_7, SCIM_KEY_ampersand },
+ { SCIM_KEY_8, SCIM_KEY_asterisk },
+ { SCIM_KEY_9, SCIM_KEY_parenleft },
+ { SCIM_KEY_question, SCIM_KEY_M },
+ { SCIM_KEY_A, SCIM_KEY_Q },
+ { SCIM_KEY_M, SCIM_KEY_colon },
+ { SCIM_KEY_Q, SCIM_KEY_A },
+ { SCIM_KEY_W, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_W },
+ { SCIM_KEY_underscore, SCIM_KEY_plus },
+ { SCIM_KEY_sterling, SCIM_KEY_bar },
+ { SCIM_KEY_degree, SCIM_KEY_underscore },
+ { SCIM_KEY_threesuperior, SCIM_KEY_asciitilde },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_braceleft },
+};
+
+static __Uint16Pair __us_to_belgian_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_1 },
+ { SCIM_KEY_quotedbl, SCIM_KEY_percent },
+ { SCIM_KEY_numbersign, SCIM_KEY_3 },
+ { SCIM_KEY_dollar, SCIM_KEY_4 },
+ { SCIM_KEY_percent, SCIM_KEY_5 },
+ { SCIM_KEY_ampersand, SCIM_KEY_7 },
+ { SCIM_KEY_parenleft, SCIM_KEY_9 },
+ { SCIM_KEY_parenright, SCIM_KEY_0 },
+ { SCIM_KEY_asterisk, SCIM_KEY_8 },
+ { SCIM_KEY_plus, SCIM_KEY_underscore },
+ { SCIM_KEY_colon, SCIM_KEY_M },
+ { SCIM_KEY_less, SCIM_KEY_period },
+ { SCIM_KEY_greater, SCIM_KEY_slash },
+ { SCIM_KEY_question, SCIM_KEY_plus },
+ { SCIM_KEY_at, SCIM_KEY_2 },
+ { SCIM_KEY_A, SCIM_KEY_Q },
+ { SCIM_KEY_M, SCIM_KEY_question },
+ { SCIM_KEY_Q, SCIM_KEY_A },
+ { SCIM_KEY_W, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_W },
+ { SCIM_KEY_asciicircum, SCIM_KEY_6 },
+ { SCIM_KEY_underscore, SCIM_KEY_degree },
+ { SCIM_KEY_braceleft, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_bar, SCIM_KEY_sterling },
+ { SCIM_KEY_braceright, SCIM_KEY_asterisk },
+ { SCIM_KEY_asciitilde, SCIM_KEY_threesuperior },
+};
+
+static __Uint16Pair __belgian_to_us_caps_shift [] = {
+ { SCIM_KEY_percent, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asterisk, SCIM_KEY_braceright },
+ { SCIM_KEY_plus, SCIM_KEY_question },
+ { SCIM_KEY_period, SCIM_KEY_less },
+ { SCIM_KEY_slash, SCIM_KEY_greater },
+ { SCIM_KEY_0, SCIM_KEY_parenright },
+ { SCIM_KEY_1, SCIM_KEY_exclam },
+ { SCIM_KEY_2, SCIM_KEY_at },
+ { SCIM_KEY_3, SCIM_KEY_numbersign },
+ { SCIM_KEY_4, SCIM_KEY_dollar },
+ { SCIM_KEY_5, SCIM_KEY_percent },
+ { SCIM_KEY_6, SCIM_KEY_asciicircum },
+ { SCIM_KEY_7, SCIM_KEY_ampersand },
+ { SCIM_KEY_8, SCIM_KEY_asterisk },
+ { SCIM_KEY_9, SCIM_KEY_parenleft },
+ { SCIM_KEY_question, SCIM_KEY_m },
+ { SCIM_KEY_underscore, SCIM_KEY_plus },
+ { SCIM_KEY_a, SCIM_KEY_q },
+ { SCIM_KEY_m, SCIM_KEY_colon },
+ { SCIM_KEY_q, SCIM_KEY_a },
+ { SCIM_KEY_w, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_w },
+ { SCIM_KEY_sterling, SCIM_KEY_bar },
+ { SCIM_KEY_degree, SCIM_KEY_underscore },
+ { SCIM_KEY_threesuperior, SCIM_KEY_asciitilde },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_braceleft },
+};
+
+static __Uint16Pair __us_to_belgian_caps_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_1 },
+ { SCIM_KEY_quotedbl, SCIM_KEY_percent },
+ { SCIM_KEY_numbersign, SCIM_KEY_3 },
+ { SCIM_KEY_dollar, SCIM_KEY_4 },
+ { SCIM_KEY_percent, SCIM_KEY_5 },
+ { SCIM_KEY_ampersand, SCIM_KEY_7 },
+ { SCIM_KEY_parenleft, SCIM_KEY_9 },
+ { SCIM_KEY_parenright, SCIM_KEY_0 },
+ { SCIM_KEY_asterisk, SCIM_KEY_8 },
+ { SCIM_KEY_plus, SCIM_KEY_underscore },
+ { SCIM_KEY_colon, SCIM_KEY_m },
+ { SCIM_KEY_less, SCIM_KEY_period },
+ { SCIM_KEY_greater, SCIM_KEY_slash },
+ { SCIM_KEY_question, SCIM_KEY_plus },
+ { SCIM_KEY_at, SCIM_KEY_2 },
+ { SCIM_KEY_asciicircum, SCIM_KEY_6 },
+ { SCIM_KEY_underscore, SCIM_KEY_degree },
+ { SCIM_KEY_a, SCIM_KEY_q },
+ { SCIM_KEY_m, SCIM_KEY_question },
+ { SCIM_KEY_q, SCIM_KEY_a },
+ { SCIM_KEY_w, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_w },
+ { SCIM_KEY_braceleft, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_bar, SCIM_KEY_sterling },
+ { SCIM_KEY_braceright, SCIM_KEY_asterisk },
+ { SCIM_KEY_asciitilde, SCIM_KEY_threesuperior },
+};
+
+static __Uint16Pair __czech_to_us_normal [] = {
+ { SCIM_KEY_parenright, SCIM_KEY_bracketright },
+ { SCIM_KEY_plus, SCIM_KEY_1 },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_semicolon, SCIM_KEY_grave },
+ { SCIM_KEY_equal, SCIM_KEY_minus },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_section, SCIM_KEY_apostrophe },
+ { SCIM_KEY_aacute, SCIM_KEY_8 },
+ { SCIM_KEY_eacute, SCIM_KEY_0 },
+ { SCIM_KEY_iacute, SCIM_KEY_9 },
+ { SCIM_KEY_uacute, SCIM_KEY_bracketleft },
+ { SCIM_KEY_yacute, SCIM_KEY_7 },
+ { SCIM_KEY_scaron, SCIM_KEY_3 },
+ { SCIM_KEY_zcaron, SCIM_KEY_6 },
+ { SCIM_KEY_ccaron, SCIM_KEY_4 },
+ { SCIM_KEY_ecaron, SCIM_KEY_2 },
+ { SCIM_KEY_rcaron, SCIM_KEY_5 },
+ { SCIM_KEY_uring, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_backslash },
+};
+
+static __Uint16Pair __us_to_czech_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_section },
+ { SCIM_KEY_minus, SCIM_KEY_equal },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_0, SCIM_KEY_eacute },
+ { SCIM_KEY_1, SCIM_KEY_plus },
+ { SCIM_KEY_2, SCIM_KEY_ecaron },
+ { SCIM_KEY_3, SCIM_KEY_scaron },
+ { SCIM_KEY_4, SCIM_KEY_ccaron },
+ { SCIM_KEY_5, SCIM_KEY_rcaron },
+ { SCIM_KEY_6, SCIM_KEY_zcaron },
+ { SCIM_KEY_7, SCIM_KEY_yacute },
+ { SCIM_KEY_8, SCIM_KEY_aacute },
+ { SCIM_KEY_9, SCIM_KEY_iacute },
+ { SCIM_KEY_semicolon, SCIM_KEY_uring },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_bracketleft, SCIM_KEY_uacute },
+ { SCIM_KEY_backslash, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_bracketright, SCIM_KEY_parenright },
+ { SCIM_KEY_grave, SCIM_KEY_semicolon },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+};
+
+static __Uint16Pair __czech_to_us_caps [] = {
+ { SCIM_KEY_parenright, SCIM_KEY_bracketright },
+ { SCIM_KEY_plus, SCIM_KEY_1 },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_semicolon, SCIM_KEY_grave },
+ { SCIM_KEY_equal, SCIM_KEY_minus },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_section, SCIM_KEY_apostrophe },
+ { SCIM_KEY_Aacute, SCIM_KEY_8 },
+ { SCIM_KEY_Eacute, SCIM_KEY_0 },
+ { SCIM_KEY_Iacute, SCIM_KEY_9 },
+ { SCIM_KEY_Uacute, SCIM_KEY_bracketleft },
+ { SCIM_KEY_Yacute, SCIM_KEY_7 },
+ { SCIM_KEY_Scaron, SCIM_KEY_3 },
+ { SCIM_KEY_Zcaron, SCIM_KEY_6 },
+ { SCIM_KEY_Ccaron, SCIM_KEY_4 },
+ { SCIM_KEY_Ecaron, SCIM_KEY_2 },
+ { SCIM_KEY_Rcaron, SCIM_KEY_5 },
+ { SCIM_KEY_Uring, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_backslash },
+};
+
+static __Uint16Pair __us_to_czech_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_section },
+ { SCIM_KEY_minus, SCIM_KEY_equal },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_0, SCIM_KEY_Eacute },
+ { SCIM_KEY_1, SCIM_KEY_plus },
+ { SCIM_KEY_2, SCIM_KEY_Ecaron },
+ { SCIM_KEY_3, SCIM_KEY_Scaron },
+ { SCIM_KEY_4, SCIM_KEY_Ccaron },
+ { SCIM_KEY_5, SCIM_KEY_Rcaron },
+ { SCIM_KEY_6, SCIM_KEY_Zcaron },
+ { SCIM_KEY_7, SCIM_KEY_Yacute },
+ { SCIM_KEY_8, SCIM_KEY_Aacute },
+ { SCIM_KEY_9, SCIM_KEY_Iacute },
+ { SCIM_KEY_semicolon, SCIM_KEY_Uring },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_bracketleft, SCIM_KEY_Uacute },
+ { SCIM_KEY_backslash, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_bracketright, SCIM_KEY_parenright },
+ { SCIM_KEY_grave, SCIM_KEY_semicolon },
+};
+
+static __Uint16Pair __czech_to_us_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_quotedbl },
+ { SCIM_KEY_quotedbl, SCIM_KEY_colon },
+ { SCIM_KEY_percent, SCIM_KEY_underscore },
+ { SCIM_KEY_apostrophe, SCIM_KEY_bar },
+ { SCIM_KEY_parenleft, SCIM_KEY_braceright },
+ { SCIM_KEY_slash, SCIM_KEY_braceleft },
+ { SCIM_KEY_0, SCIM_KEY_parenright },
+ { SCIM_KEY_1, SCIM_KEY_exclam },
+ { SCIM_KEY_2, SCIM_KEY_at },
+ { SCIM_KEY_3, SCIM_KEY_numbersign },
+ { SCIM_KEY_4, SCIM_KEY_dollar },
+ { SCIM_KEY_5, SCIM_KEY_percent },
+ { SCIM_KEY_6, SCIM_KEY_asciicircum },
+ { SCIM_KEY_7, SCIM_KEY_ampersand },
+ { SCIM_KEY_8, SCIM_KEY_asterisk },
+ { SCIM_KEY_9, SCIM_KEY_parenleft },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_question, SCIM_KEY_less },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_dead_abovering, SCIM_KEY_asciitilde },
+ { SCIM_KEY_dead_caron, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __us_to_czech_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_1 },
+ { SCIM_KEY_quotedbl, SCIM_KEY_exclam },
+ { SCIM_KEY_numbersign, SCIM_KEY_3 },
+ { SCIM_KEY_dollar, SCIM_KEY_4 },
+ { SCIM_KEY_percent, SCIM_KEY_5 },
+ { SCIM_KEY_ampersand, SCIM_KEY_7 },
+ { SCIM_KEY_parenleft, SCIM_KEY_9 },
+ { SCIM_KEY_parenright, SCIM_KEY_0 },
+ { SCIM_KEY_asterisk, SCIM_KEY_8 },
+ { SCIM_KEY_plus, SCIM_KEY_dead_caron },
+ { SCIM_KEY_colon, SCIM_KEY_quotedbl },
+ { SCIM_KEY_less, SCIM_KEY_question },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_2 },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_asciicircum, SCIM_KEY_6 },
+ { SCIM_KEY_underscore, SCIM_KEY_percent },
+ { SCIM_KEY_braceleft, SCIM_KEY_slash },
+ { SCIM_KEY_bar, SCIM_KEY_apostrophe },
+ { SCIM_KEY_braceright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asciitilde, SCIM_KEY_dead_abovering },
+};
+
+static __Uint16Pair __czech_to_us_caps_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_quotedbl },
+ { SCIM_KEY_quotedbl, SCIM_KEY_colon },
+ { SCIM_KEY_percent, SCIM_KEY_underscore },
+ { SCIM_KEY_apostrophe, SCIM_KEY_bar },
+ { SCIM_KEY_parenleft, SCIM_KEY_braceright },
+ { SCIM_KEY_slash, SCIM_KEY_braceleft },
+ { SCIM_KEY_0, SCIM_KEY_parenright },
+ { SCIM_KEY_1, SCIM_KEY_exclam },
+ { SCIM_KEY_2, SCIM_KEY_at },
+ { SCIM_KEY_3, SCIM_KEY_numbersign },
+ { SCIM_KEY_4, SCIM_KEY_dollar },
+ { SCIM_KEY_5, SCIM_KEY_percent },
+ { SCIM_KEY_6, SCIM_KEY_asciicircum },
+ { SCIM_KEY_7, SCIM_KEY_ampersand },
+ { SCIM_KEY_8, SCIM_KEY_asterisk },
+ { SCIM_KEY_9, SCIM_KEY_parenleft },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_question, SCIM_KEY_less },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_dead_abovering, SCIM_KEY_asciitilde },
+ { SCIM_KEY_dead_caron, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __us_to_czech_caps_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_1 },
+ { SCIM_KEY_quotedbl, SCIM_KEY_exclam },
+ { SCIM_KEY_numbersign, SCIM_KEY_3 },
+ { SCIM_KEY_dollar, SCIM_KEY_4 },
+ { SCIM_KEY_percent, SCIM_KEY_5 },
+ { SCIM_KEY_ampersand, SCIM_KEY_7 },
+ { SCIM_KEY_parenleft, SCIM_KEY_9 },
+ { SCIM_KEY_parenright, SCIM_KEY_0 },
+ { SCIM_KEY_asterisk, SCIM_KEY_8 },
+ { SCIM_KEY_plus, SCIM_KEY_dead_caron },
+ { SCIM_KEY_colon, SCIM_KEY_quotedbl },
+ { SCIM_KEY_less, SCIM_KEY_question },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_2 },
+ { SCIM_KEY_asciicircum, SCIM_KEY_6 },
+ { SCIM_KEY_underscore, SCIM_KEY_percent },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_braceleft, SCIM_KEY_slash },
+ { SCIM_KEY_bar, SCIM_KEY_apostrophe },
+ { SCIM_KEY_braceright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asciitilde, SCIM_KEY_dead_abovering },
+};
+
+static __Uint16Pair __czech_qwerty_to_us_normal [] = {
+ { SCIM_KEY_parenright, SCIM_KEY_bracketright },
+ { SCIM_KEY_plus, SCIM_KEY_1 },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_semicolon, SCIM_KEY_grave },
+ { SCIM_KEY_equal, SCIM_KEY_minus },
+ { SCIM_KEY_section, SCIM_KEY_apostrophe },
+ { SCIM_KEY_aacute, SCIM_KEY_8 },
+ { SCIM_KEY_eacute, SCIM_KEY_0 },
+ { SCIM_KEY_iacute, SCIM_KEY_9 },
+ { SCIM_KEY_uacute, SCIM_KEY_bracketleft },
+ { SCIM_KEY_yacute, SCIM_KEY_7 },
+ { SCIM_KEY_scaron, SCIM_KEY_3 },
+ { SCIM_KEY_zcaron, SCIM_KEY_6 },
+ { SCIM_KEY_ccaron, SCIM_KEY_4 },
+ { SCIM_KEY_ecaron, SCIM_KEY_2 },
+ { SCIM_KEY_rcaron, SCIM_KEY_5 },
+ { SCIM_KEY_uring, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_backslash },
+};
+
+static __Uint16Pair __us_to_czech_qwerty_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_section },
+ { SCIM_KEY_minus, SCIM_KEY_equal },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_0, SCIM_KEY_eacute },
+ { SCIM_KEY_1, SCIM_KEY_plus },
+ { SCIM_KEY_2, SCIM_KEY_ecaron },
+ { SCIM_KEY_3, SCIM_KEY_scaron },
+ { SCIM_KEY_4, SCIM_KEY_ccaron },
+ { SCIM_KEY_5, SCIM_KEY_rcaron },
+ { SCIM_KEY_6, SCIM_KEY_zcaron },
+ { SCIM_KEY_7, SCIM_KEY_yacute },
+ { SCIM_KEY_8, SCIM_KEY_aacute },
+ { SCIM_KEY_9, SCIM_KEY_iacute },
+ { SCIM_KEY_semicolon, SCIM_KEY_uring },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_bracketleft, SCIM_KEY_uacute },
+ { SCIM_KEY_backslash, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_bracketright, SCIM_KEY_parenright },
+ { SCIM_KEY_grave, SCIM_KEY_semicolon },
+};
+
+static __Uint16Pair __czech_qwerty_to_us_caps [] = {
+ { SCIM_KEY_parenright, SCIM_KEY_bracketright },
+ { SCIM_KEY_plus, SCIM_KEY_1 },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_semicolon, SCIM_KEY_grave },
+ { SCIM_KEY_equal, SCIM_KEY_minus },
+ { SCIM_KEY_section, SCIM_KEY_apostrophe },
+ { SCIM_KEY_Aacute, SCIM_KEY_8 },
+ { SCIM_KEY_Eacute, SCIM_KEY_0 },
+ { SCIM_KEY_Iacute, SCIM_KEY_9 },
+ { SCIM_KEY_Uacute, SCIM_KEY_bracketleft },
+ { SCIM_KEY_Yacute, SCIM_KEY_7 },
+ { SCIM_KEY_Scaron, SCIM_KEY_3 },
+ { SCIM_KEY_Zcaron, SCIM_KEY_6 },
+ { SCIM_KEY_Ccaron, SCIM_KEY_4 },
+ { SCIM_KEY_Ecaron, SCIM_KEY_2 },
+ { SCIM_KEY_Rcaron, SCIM_KEY_5 },
+ { SCIM_KEY_Uring, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_backslash },
+};
+
+static __Uint16Pair __us_to_czech_qwerty_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_section },
+ { SCIM_KEY_minus, SCIM_KEY_equal },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_0, SCIM_KEY_Eacute },
+ { SCIM_KEY_1, SCIM_KEY_plus },
+ { SCIM_KEY_2, SCIM_KEY_Ecaron },
+ { SCIM_KEY_3, SCIM_KEY_Scaron },
+ { SCIM_KEY_4, SCIM_KEY_Ccaron },
+ { SCIM_KEY_5, SCIM_KEY_Rcaron },
+ { SCIM_KEY_6, SCIM_KEY_Zcaron },
+ { SCIM_KEY_7, SCIM_KEY_Yacute },
+ { SCIM_KEY_8, SCIM_KEY_Aacute },
+ { SCIM_KEY_9, SCIM_KEY_Iacute },
+ { SCIM_KEY_semicolon, SCIM_KEY_Uring },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_bracketleft, SCIM_KEY_Uacute },
+ { SCIM_KEY_backslash, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_bracketright, SCIM_KEY_parenright },
+ { SCIM_KEY_grave, SCIM_KEY_semicolon },
+};
+
+static __Uint16Pair __czech_qwerty_to_us_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_quotedbl },
+ { SCIM_KEY_quotedbl, SCIM_KEY_colon },
+ { SCIM_KEY_percent, SCIM_KEY_underscore },
+ { SCIM_KEY_apostrophe, SCIM_KEY_bar },
+ { SCIM_KEY_parenleft, SCIM_KEY_braceright },
+ { SCIM_KEY_slash, SCIM_KEY_braceleft },
+ { SCIM_KEY_0, SCIM_KEY_parenright },
+ { SCIM_KEY_1, SCIM_KEY_exclam },
+ { SCIM_KEY_2, SCIM_KEY_at },
+ { SCIM_KEY_3, SCIM_KEY_numbersign },
+ { SCIM_KEY_4, SCIM_KEY_dollar },
+ { SCIM_KEY_5, SCIM_KEY_percent },
+ { SCIM_KEY_6, SCIM_KEY_asciicircum },
+ { SCIM_KEY_7, SCIM_KEY_ampersand },
+ { SCIM_KEY_8, SCIM_KEY_asterisk },
+ { SCIM_KEY_9, SCIM_KEY_parenleft },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_question, SCIM_KEY_less },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_dead_abovering, SCIM_KEY_asciitilde },
+ { SCIM_KEY_dead_caron, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __us_to_czech_qwerty_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_1 },
+ { SCIM_KEY_quotedbl, SCIM_KEY_exclam },
+ { SCIM_KEY_numbersign, SCIM_KEY_3 },
+ { SCIM_KEY_dollar, SCIM_KEY_4 },
+ { SCIM_KEY_percent, SCIM_KEY_5 },
+ { SCIM_KEY_ampersand, SCIM_KEY_7 },
+ { SCIM_KEY_parenleft, SCIM_KEY_9 },
+ { SCIM_KEY_parenright, SCIM_KEY_0 },
+ { SCIM_KEY_asterisk, SCIM_KEY_8 },
+ { SCIM_KEY_plus, SCIM_KEY_dead_caron },
+ { SCIM_KEY_colon, SCIM_KEY_quotedbl },
+ { SCIM_KEY_less, SCIM_KEY_question },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_2 },
+ { SCIM_KEY_asciicircum, SCIM_KEY_6 },
+ { SCIM_KEY_underscore, SCIM_KEY_percent },
+ { SCIM_KEY_braceleft, SCIM_KEY_slash },
+ { SCIM_KEY_bar, SCIM_KEY_apostrophe },
+ { SCIM_KEY_braceright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asciitilde, SCIM_KEY_dead_abovering },
+};
+
+static __Uint16Pair __czech_qwerty_to_us_caps_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_quotedbl },
+ { SCIM_KEY_quotedbl, SCIM_KEY_colon },
+ { SCIM_KEY_percent, SCIM_KEY_underscore },
+ { SCIM_KEY_apostrophe, SCIM_KEY_bar },
+ { SCIM_KEY_parenleft, SCIM_KEY_braceright },
+ { SCIM_KEY_slash, SCIM_KEY_braceleft },
+ { SCIM_KEY_0, SCIM_KEY_parenright },
+ { SCIM_KEY_1, SCIM_KEY_exclam },
+ { SCIM_KEY_2, SCIM_KEY_at },
+ { SCIM_KEY_3, SCIM_KEY_numbersign },
+ { SCIM_KEY_4, SCIM_KEY_dollar },
+ { SCIM_KEY_5, SCIM_KEY_percent },
+ { SCIM_KEY_6, SCIM_KEY_asciicircum },
+ { SCIM_KEY_7, SCIM_KEY_ampersand },
+ { SCIM_KEY_8, SCIM_KEY_asterisk },
+ { SCIM_KEY_9, SCIM_KEY_parenleft },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_question, SCIM_KEY_less },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_dead_abovering, SCIM_KEY_asciitilde },
+ { SCIM_KEY_dead_caron, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __us_to_czech_qwerty_caps_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_1 },
+ { SCIM_KEY_quotedbl, SCIM_KEY_exclam },
+ { SCIM_KEY_numbersign, SCIM_KEY_3 },
+ { SCIM_KEY_dollar, SCIM_KEY_4 },
+ { SCIM_KEY_percent, SCIM_KEY_5 },
+ { SCIM_KEY_ampersand, SCIM_KEY_7 },
+ { SCIM_KEY_parenleft, SCIM_KEY_9 },
+ { SCIM_KEY_parenright, SCIM_KEY_0 },
+ { SCIM_KEY_asterisk, SCIM_KEY_8 },
+ { SCIM_KEY_plus, SCIM_KEY_dead_caron },
+ { SCIM_KEY_colon, SCIM_KEY_quotedbl },
+ { SCIM_KEY_less, SCIM_KEY_question },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_2 },
+ { SCIM_KEY_asciicircum, SCIM_KEY_6 },
+ { SCIM_KEY_underscore, SCIM_KEY_percent },
+ { SCIM_KEY_braceleft, SCIM_KEY_slash },
+ { SCIM_KEY_bar, SCIM_KEY_apostrophe },
+ { SCIM_KEY_braceright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asciitilde, SCIM_KEY_dead_abovering },
+};
+
+static __Uint16Pair __danish_to_us_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_backslash },
+ { SCIM_KEY_plus, SCIM_KEY_minus },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_onehalf, SCIM_KEY_grave },
+ { SCIM_KEY_aring, SCIM_KEY_bracketleft },
+ { SCIM_KEY_ae, SCIM_KEY_semicolon },
+ { SCIM_KEY_oslash, SCIM_KEY_apostrophe },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_bracketright },
+};
+
+static __Uint16Pair __us_to_danish_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_oslash },
+ { SCIM_KEY_minus, SCIM_KEY_plus },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_ae },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_bracketleft, SCIM_KEY_aring },
+ { SCIM_KEY_backslash, SCIM_KEY_apostrophe },
+ { SCIM_KEY_bracketright, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_onehalf },
+};
+
+static __Uint16Pair __danish_to_us_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_backslash },
+ { SCIM_KEY_plus, SCIM_KEY_minus },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_onehalf, SCIM_KEY_grave },
+ { SCIM_KEY_Aring, SCIM_KEY_bracketleft },
+ { SCIM_KEY_AE, SCIM_KEY_semicolon },
+ { SCIM_KEY_Ooblique, SCIM_KEY_apostrophe },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_bracketright },
+};
+
+static __Uint16Pair __us_to_danish_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_Ooblique },
+ { SCIM_KEY_minus, SCIM_KEY_plus },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_AE },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_bracketleft, SCIM_KEY_Aring },
+ { SCIM_KEY_backslash, SCIM_KEY_apostrophe },
+ { SCIM_KEY_bracketright, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_onehalf },
+};
+
+static __Uint16Pair __danish_to_us_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_bar },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_currency, SCIM_KEY_dollar },
+ { SCIM_KEY_section, SCIM_KEY_asciitilde },
+ { SCIM_KEY_Aring, SCIM_KEY_braceleft },
+ { SCIM_KEY_AE, SCIM_KEY_colon },
+ { SCIM_KEY_Ooblique, SCIM_KEY_quotedbl },
+ { SCIM_KEY_dead_grave, SCIM_KEY_plus },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_braceright },
+};
+
+static __Uint16Pair __us_to_danish_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_Ooblique },
+ { SCIM_KEY_dollar, SCIM_KEY_currency },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dead_grave },
+ { SCIM_KEY_colon, SCIM_KEY_AE },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_Aring },
+ { SCIM_KEY_bar, SCIM_KEY_asterisk },
+ { SCIM_KEY_braceright, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_asciitilde, SCIM_KEY_section },
+};
+
+static __Uint16Pair __danish_to_us_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_bar },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_currency, SCIM_KEY_dollar },
+ { SCIM_KEY_section, SCIM_KEY_asciitilde },
+ { SCIM_KEY_aring, SCIM_KEY_braceleft },
+ { SCIM_KEY_ae, SCIM_KEY_colon },
+ { SCIM_KEY_oslash, SCIM_KEY_quotedbl },
+ { SCIM_KEY_dead_grave, SCIM_KEY_plus },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_braceright },
+};
+
+static __Uint16Pair __us_to_danish_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_oslash },
+ { SCIM_KEY_dollar, SCIM_KEY_currency },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dead_grave },
+ { SCIM_KEY_colon, SCIM_KEY_ae },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_aring },
+ { SCIM_KEY_bar, SCIM_KEY_asterisk },
+ { SCIM_KEY_braceright, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_asciitilde, SCIM_KEY_section },
+};
+
+static __Uint16Pair __dvorak_to_us_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_q },
+ { SCIM_KEY_comma, SCIM_KEY_w },
+ { SCIM_KEY_minus, SCIM_KEY_apostrophe },
+ { SCIM_KEY_period, SCIM_KEY_e },
+ { SCIM_KEY_slash, SCIM_KEY_bracketleft },
+ { SCIM_KEY_semicolon, SCIM_KEY_z },
+ { SCIM_KEY_equal, SCIM_KEY_bracketright },
+ { SCIM_KEY_bracketleft, SCIM_KEY_minus },
+ { SCIM_KEY_bracketright, SCIM_KEY_equal },
+ { SCIM_KEY_b, SCIM_KEY_n },
+ { SCIM_KEY_c, SCIM_KEY_i },
+ { SCIM_KEY_d, SCIM_KEY_h },
+ { SCIM_KEY_e, SCIM_KEY_d },
+ { SCIM_KEY_f, SCIM_KEY_y },
+ { SCIM_KEY_g, SCIM_KEY_u },
+ { SCIM_KEY_h, SCIM_KEY_j },
+ { SCIM_KEY_i, SCIM_KEY_g },
+ { SCIM_KEY_j, SCIM_KEY_c },
+ { SCIM_KEY_k, SCIM_KEY_v },
+ { SCIM_KEY_l, SCIM_KEY_p },
+ { SCIM_KEY_n, SCIM_KEY_l },
+ { SCIM_KEY_o, SCIM_KEY_s },
+ { SCIM_KEY_p, SCIM_KEY_r },
+ { SCIM_KEY_q, SCIM_KEY_x },
+ { SCIM_KEY_r, SCIM_KEY_o },
+ { SCIM_KEY_s, SCIM_KEY_semicolon },
+ { SCIM_KEY_t, SCIM_KEY_k },
+ { SCIM_KEY_u, SCIM_KEY_f },
+ { SCIM_KEY_v, SCIM_KEY_period },
+ { SCIM_KEY_w, SCIM_KEY_comma },
+ { SCIM_KEY_x, SCIM_KEY_b },
+ { SCIM_KEY_y, SCIM_KEY_t },
+ { SCIM_KEY_z, SCIM_KEY_slash },
+};
+
+static __Uint16Pair __us_to_dvorak_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_minus },
+ { SCIM_KEY_comma, SCIM_KEY_w },
+ { SCIM_KEY_minus, SCIM_KEY_bracketleft },
+ { SCIM_KEY_period, SCIM_KEY_v },
+ { SCIM_KEY_slash, SCIM_KEY_z },
+ { SCIM_KEY_semicolon, SCIM_KEY_s },
+ { SCIM_KEY_equal, SCIM_KEY_bracketright },
+ { SCIM_KEY_bracketleft, SCIM_KEY_slash },
+ { SCIM_KEY_bracketright, SCIM_KEY_equal },
+ { SCIM_KEY_b, SCIM_KEY_x },
+ { SCIM_KEY_c, SCIM_KEY_j },
+ { SCIM_KEY_d, SCIM_KEY_e },
+ { SCIM_KEY_e, SCIM_KEY_period },
+ { SCIM_KEY_f, SCIM_KEY_u },
+ { SCIM_KEY_g, SCIM_KEY_i },
+ { SCIM_KEY_h, SCIM_KEY_d },
+ { SCIM_KEY_i, SCIM_KEY_c },
+ { SCIM_KEY_j, SCIM_KEY_h },
+ { SCIM_KEY_k, SCIM_KEY_t },
+ { SCIM_KEY_l, SCIM_KEY_n },
+ { SCIM_KEY_n, SCIM_KEY_b },
+ { SCIM_KEY_o, SCIM_KEY_r },
+ { SCIM_KEY_p, SCIM_KEY_l },
+ { SCIM_KEY_q, SCIM_KEY_apostrophe },
+ { SCIM_KEY_r, SCIM_KEY_p },
+ { SCIM_KEY_s, SCIM_KEY_o },
+ { SCIM_KEY_t, SCIM_KEY_y },
+ { SCIM_KEY_u, SCIM_KEY_g },
+ { SCIM_KEY_v, SCIM_KEY_k },
+ { SCIM_KEY_w, SCIM_KEY_comma },
+ { SCIM_KEY_x, SCIM_KEY_q },
+ { SCIM_KEY_y, SCIM_KEY_f },
+ { SCIM_KEY_z, SCIM_KEY_semicolon },
+};
+
+static __Uint16Pair __dvorak_to_us_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_Q },
+ { SCIM_KEY_comma, SCIM_KEY_W },
+ { SCIM_KEY_minus, SCIM_KEY_apostrophe },
+ { SCIM_KEY_period, SCIM_KEY_E },
+ { SCIM_KEY_slash, SCIM_KEY_bracketleft },
+ { SCIM_KEY_semicolon, SCIM_KEY_Z },
+ { SCIM_KEY_equal, SCIM_KEY_bracketright },
+ { SCIM_KEY_B, SCIM_KEY_N },
+ { SCIM_KEY_C, SCIM_KEY_I },
+ { SCIM_KEY_D, SCIM_KEY_H },
+ { SCIM_KEY_E, SCIM_KEY_D },
+ { SCIM_KEY_F, SCIM_KEY_Y },
+ { SCIM_KEY_G, SCIM_KEY_U },
+ { SCIM_KEY_H, SCIM_KEY_J },
+ { SCIM_KEY_I, SCIM_KEY_G },
+ { SCIM_KEY_J, SCIM_KEY_C },
+ { SCIM_KEY_K, SCIM_KEY_V },
+ { SCIM_KEY_L, SCIM_KEY_P },
+ { SCIM_KEY_N, SCIM_KEY_L },
+ { SCIM_KEY_O, SCIM_KEY_S },
+ { SCIM_KEY_P, SCIM_KEY_R },
+ { SCIM_KEY_Q, SCIM_KEY_X },
+ { SCIM_KEY_R, SCIM_KEY_O },
+ { SCIM_KEY_S, SCIM_KEY_semicolon },
+ { SCIM_KEY_T, SCIM_KEY_K },
+ { SCIM_KEY_U, SCIM_KEY_F },
+ { SCIM_KEY_V, SCIM_KEY_period },
+ { SCIM_KEY_W, SCIM_KEY_comma },
+ { SCIM_KEY_X, SCIM_KEY_B },
+ { SCIM_KEY_Y, SCIM_KEY_T },
+ { SCIM_KEY_Z, SCIM_KEY_slash },
+ { SCIM_KEY_bracketleft, SCIM_KEY_minus },
+ { SCIM_KEY_bracketright, SCIM_KEY_equal },
+};
+
+static __Uint16Pair __us_to_dvorak_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_minus },
+ { SCIM_KEY_comma, SCIM_KEY_W },
+ { SCIM_KEY_minus, SCIM_KEY_bracketleft },
+ { SCIM_KEY_period, SCIM_KEY_V },
+ { SCIM_KEY_slash, SCIM_KEY_Z },
+ { SCIM_KEY_semicolon, SCIM_KEY_S },
+ { SCIM_KEY_equal, SCIM_KEY_bracketright },
+ { SCIM_KEY_B, SCIM_KEY_X },
+ { SCIM_KEY_C, SCIM_KEY_J },
+ { SCIM_KEY_D, SCIM_KEY_E },
+ { SCIM_KEY_E, SCIM_KEY_period },
+ { SCIM_KEY_F, SCIM_KEY_U },
+ { SCIM_KEY_G, SCIM_KEY_I },
+ { SCIM_KEY_H, SCIM_KEY_D },
+ { SCIM_KEY_I, SCIM_KEY_C },
+ { SCIM_KEY_J, SCIM_KEY_H },
+ { SCIM_KEY_K, SCIM_KEY_T },
+ { SCIM_KEY_L, SCIM_KEY_N },
+ { SCIM_KEY_N, SCIM_KEY_B },
+ { SCIM_KEY_O, SCIM_KEY_R },
+ { SCIM_KEY_P, SCIM_KEY_L },
+ { SCIM_KEY_Q, SCIM_KEY_apostrophe },
+ { SCIM_KEY_R, SCIM_KEY_P },
+ { SCIM_KEY_S, SCIM_KEY_O },
+ { SCIM_KEY_T, SCIM_KEY_Y },
+ { SCIM_KEY_U, SCIM_KEY_G },
+ { SCIM_KEY_V, SCIM_KEY_K },
+ { SCIM_KEY_W, SCIM_KEY_comma },
+ { SCIM_KEY_X, SCIM_KEY_Q },
+ { SCIM_KEY_Y, SCIM_KEY_F },
+ { SCIM_KEY_Z, SCIM_KEY_semicolon },
+ { SCIM_KEY_bracketleft, SCIM_KEY_slash },
+ { SCIM_KEY_bracketright, SCIM_KEY_equal },
+};
+
+static __Uint16Pair __dvorak_to_us_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_Q },
+ { SCIM_KEY_plus, SCIM_KEY_braceright },
+ { SCIM_KEY_colon, SCIM_KEY_Z },
+ { SCIM_KEY_less, SCIM_KEY_W },
+ { SCIM_KEY_greater, SCIM_KEY_E },
+ { SCIM_KEY_question, SCIM_KEY_braceleft },
+ { SCIM_KEY_B, SCIM_KEY_N },
+ { SCIM_KEY_C, SCIM_KEY_I },
+ { SCIM_KEY_D, SCIM_KEY_H },
+ { SCIM_KEY_E, SCIM_KEY_D },
+ { SCIM_KEY_F, SCIM_KEY_Y },
+ { SCIM_KEY_G, SCIM_KEY_U },
+ { SCIM_KEY_H, SCIM_KEY_J },
+ { SCIM_KEY_I, SCIM_KEY_G },
+ { SCIM_KEY_J, SCIM_KEY_C },
+ { SCIM_KEY_K, SCIM_KEY_V },
+ { SCIM_KEY_L, SCIM_KEY_P },
+ { SCIM_KEY_N, SCIM_KEY_L },
+ { SCIM_KEY_O, SCIM_KEY_S },
+ { SCIM_KEY_P, SCIM_KEY_R },
+ { SCIM_KEY_Q, SCIM_KEY_X },
+ { SCIM_KEY_R, SCIM_KEY_O },
+ { SCIM_KEY_S, SCIM_KEY_colon },
+ { SCIM_KEY_T, SCIM_KEY_K },
+ { SCIM_KEY_U, SCIM_KEY_F },
+ { SCIM_KEY_V, SCIM_KEY_greater },
+ { SCIM_KEY_W, SCIM_KEY_less },
+ { SCIM_KEY_X, SCIM_KEY_B },
+ { SCIM_KEY_Y, SCIM_KEY_T },
+ { SCIM_KEY_Z, SCIM_KEY_question },
+ { SCIM_KEY_underscore, SCIM_KEY_quotedbl },
+ { SCIM_KEY_braceleft, SCIM_KEY_underscore },
+ { SCIM_KEY_braceright, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __us_to_dvorak_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_underscore },
+ { SCIM_KEY_plus, SCIM_KEY_braceright },
+ { SCIM_KEY_colon, SCIM_KEY_S },
+ { SCIM_KEY_less, SCIM_KEY_W },
+ { SCIM_KEY_greater, SCIM_KEY_V },
+ { SCIM_KEY_question, SCIM_KEY_Z },
+ { SCIM_KEY_B, SCIM_KEY_X },
+ { SCIM_KEY_C, SCIM_KEY_J },
+ { SCIM_KEY_D, SCIM_KEY_E },
+ { SCIM_KEY_E, SCIM_KEY_greater },
+ { SCIM_KEY_F, SCIM_KEY_U },
+ { SCIM_KEY_G, SCIM_KEY_I },
+ { SCIM_KEY_H, SCIM_KEY_D },
+ { SCIM_KEY_I, SCIM_KEY_C },
+ { SCIM_KEY_J, SCIM_KEY_H },
+ { SCIM_KEY_K, SCIM_KEY_T },
+ { SCIM_KEY_L, SCIM_KEY_N },
+ { SCIM_KEY_N, SCIM_KEY_B },
+ { SCIM_KEY_O, SCIM_KEY_R },
+ { SCIM_KEY_P, SCIM_KEY_L },
+ { SCIM_KEY_Q, SCIM_KEY_quotedbl },
+ { SCIM_KEY_R, SCIM_KEY_P },
+ { SCIM_KEY_S, SCIM_KEY_O },
+ { SCIM_KEY_T, SCIM_KEY_Y },
+ { SCIM_KEY_U, SCIM_KEY_G },
+ { SCIM_KEY_V, SCIM_KEY_K },
+ { SCIM_KEY_W, SCIM_KEY_less },
+ { SCIM_KEY_X, SCIM_KEY_Q },
+ { SCIM_KEY_Y, SCIM_KEY_F },
+ { SCIM_KEY_Z, SCIM_KEY_colon },
+ { SCIM_KEY_underscore, SCIM_KEY_braceleft },
+ { SCIM_KEY_braceleft, SCIM_KEY_question },
+ { SCIM_KEY_braceright, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __dvorak_to_us_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_q },
+ { SCIM_KEY_plus, SCIM_KEY_braceright },
+ { SCIM_KEY_colon, SCIM_KEY_z },
+ { SCIM_KEY_less, SCIM_KEY_w },
+ { SCIM_KEY_greater, SCIM_KEY_e },
+ { SCIM_KEY_question, SCIM_KEY_braceleft },
+ { SCIM_KEY_underscore, SCIM_KEY_quotedbl },
+ { SCIM_KEY_b, SCIM_KEY_n },
+ { SCIM_KEY_c, SCIM_KEY_i },
+ { SCIM_KEY_d, SCIM_KEY_h },
+ { SCIM_KEY_e, SCIM_KEY_d },
+ { SCIM_KEY_f, SCIM_KEY_y },
+ { SCIM_KEY_g, SCIM_KEY_u },
+ { SCIM_KEY_h, SCIM_KEY_j },
+ { SCIM_KEY_i, SCIM_KEY_g },
+ { SCIM_KEY_j, SCIM_KEY_c },
+ { SCIM_KEY_k, SCIM_KEY_v },
+ { SCIM_KEY_l, SCIM_KEY_p },
+ { SCIM_KEY_n, SCIM_KEY_l },
+ { SCIM_KEY_o, SCIM_KEY_s },
+ { SCIM_KEY_p, SCIM_KEY_r },
+ { SCIM_KEY_q, SCIM_KEY_x },
+ { SCIM_KEY_r, SCIM_KEY_o },
+ { SCIM_KEY_s, SCIM_KEY_colon },
+ { SCIM_KEY_t, SCIM_KEY_k },
+ { SCIM_KEY_u, SCIM_KEY_f },
+ { SCIM_KEY_v, SCIM_KEY_greater },
+ { SCIM_KEY_w, SCIM_KEY_less },
+ { SCIM_KEY_x, SCIM_KEY_b },
+ { SCIM_KEY_y, SCIM_KEY_t },
+ { SCIM_KEY_z, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_underscore },
+ { SCIM_KEY_braceright, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __us_to_dvorak_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_underscore },
+ { SCIM_KEY_plus, SCIM_KEY_braceright },
+ { SCIM_KEY_colon, SCIM_KEY_s },
+ { SCIM_KEY_less, SCIM_KEY_w },
+ { SCIM_KEY_greater, SCIM_KEY_v },
+ { SCIM_KEY_question, SCIM_KEY_z },
+ { SCIM_KEY_underscore, SCIM_KEY_braceleft },
+ { SCIM_KEY_b, SCIM_KEY_x },
+ { SCIM_KEY_c, SCIM_KEY_j },
+ { SCIM_KEY_d, SCIM_KEY_e },
+ { SCIM_KEY_e, SCIM_KEY_greater },
+ { SCIM_KEY_f, SCIM_KEY_u },
+ { SCIM_KEY_g, SCIM_KEY_i },
+ { SCIM_KEY_h, SCIM_KEY_d },
+ { SCIM_KEY_i, SCIM_KEY_c },
+ { SCIM_KEY_j, SCIM_KEY_h },
+ { SCIM_KEY_k, SCIM_KEY_t },
+ { SCIM_KEY_l, SCIM_KEY_n },
+ { SCIM_KEY_n, SCIM_KEY_b },
+ { SCIM_KEY_o, SCIM_KEY_r },
+ { SCIM_KEY_p, SCIM_KEY_l },
+ { SCIM_KEY_q, SCIM_KEY_quotedbl },
+ { SCIM_KEY_r, SCIM_KEY_p },
+ { SCIM_KEY_s, SCIM_KEY_o },
+ { SCIM_KEY_t, SCIM_KEY_y },
+ { SCIM_KEY_u, SCIM_KEY_g },
+ { SCIM_KEY_v, SCIM_KEY_k },
+ { SCIM_KEY_w, SCIM_KEY_less },
+ { SCIM_KEY_x, SCIM_KEY_q },
+ { SCIM_KEY_y, SCIM_KEY_f },
+ { SCIM_KEY_z, SCIM_KEY_colon },
+ { SCIM_KEY_braceleft, SCIM_KEY_question },
+ { SCIM_KEY_braceright, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __estonian_to_us_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_backslash },
+ { SCIM_KEY_plus, SCIM_KEY_minus },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_adiaeresis, SCIM_KEY_apostrophe },
+ { SCIM_KEY_otilde, SCIM_KEY_bracketright },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_semicolon },
+ { SCIM_KEY_udiaeresis, SCIM_KEY_bracketleft },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+ { SCIM_KEY_dead_caron, SCIM_KEY_grave },
+};
+
+static __Uint16Pair __us_to_estonian_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_adiaeresis },
+ { SCIM_KEY_minus, SCIM_KEY_plus },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_bracketleft, SCIM_KEY_udiaeresis },
+ { SCIM_KEY_backslash, SCIM_KEY_apostrophe },
+ { SCIM_KEY_bracketright, SCIM_KEY_otilde },
+ { SCIM_KEY_grave, SCIM_KEY_dead_caron },
+};
+
+static __Uint16Pair __estonian_to_us_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_backslash },
+ { SCIM_KEY_plus, SCIM_KEY_minus },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_Adiaeresis, SCIM_KEY_apostrophe },
+ { SCIM_KEY_Otilde, SCIM_KEY_bracketright },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_semicolon },
+ { SCIM_KEY_Udiaeresis, SCIM_KEY_bracketleft },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+ { SCIM_KEY_dead_caron, SCIM_KEY_grave },
+};
+
+static __Uint16Pair __us_to_estonian_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_Adiaeresis },
+ { SCIM_KEY_minus, SCIM_KEY_plus },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_bracketleft, SCIM_KEY_Udiaeresis },
+ { SCIM_KEY_backslash, SCIM_KEY_apostrophe },
+ { SCIM_KEY_bracketright, SCIM_KEY_Otilde },
+ { SCIM_KEY_grave, SCIM_KEY_dead_caron },
+};
+
+static __Uint16Pair __estonian_to_us_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_bar },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_currency, SCIM_KEY_dollar },
+ { SCIM_KEY_Adiaeresis, SCIM_KEY_quotedbl },
+ { SCIM_KEY_Otilde, SCIM_KEY_braceright },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_colon },
+ { SCIM_KEY_Udiaeresis, SCIM_KEY_braceleft },
+ { SCIM_KEY_dead_grave, SCIM_KEY_plus },
+ { SCIM_KEY_dead_tilde, SCIM_KEY_asciitilde },
+};
+
+static __Uint16Pair __us_to_estonian_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_Adiaeresis },
+ { SCIM_KEY_dollar, SCIM_KEY_currency },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dead_grave },
+ { SCIM_KEY_colon, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_Udiaeresis },
+ { SCIM_KEY_bar, SCIM_KEY_asterisk },
+ { SCIM_KEY_braceright, SCIM_KEY_Otilde },
+ { SCIM_KEY_asciitilde, SCIM_KEY_dead_tilde },
+};
+
+static __Uint16Pair __estonian_to_us_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_bar },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_currency, SCIM_KEY_dollar },
+ { SCIM_KEY_adiaeresis, SCIM_KEY_quotedbl },
+ { SCIM_KEY_otilde, SCIM_KEY_braceright },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_colon },
+ { SCIM_KEY_udiaeresis, SCIM_KEY_braceleft },
+ { SCIM_KEY_dead_grave, SCIM_KEY_plus },
+ { SCIM_KEY_dead_tilde, SCIM_KEY_asciitilde },
+};
+
+static __Uint16Pair __us_to_estonian_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_adiaeresis },
+ { SCIM_KEY_dollar, SCIM_KEY_currency },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dead_grave },
+ { SCIM_KEY_colon, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_udiaeresis },
+ { SCIM_KEY_bar, SCIM_KEY_asterisk },
+ { SCIM_KEY_braceright, SCIM_KEY_otilde },
+ { SCIM_KEY_asciitilde, SCIM_KEY_dead_tilde },
+};
+
+static __Uint16Pair __finnish_to_us_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_backslash },
+ { SCIM_KEY_plus, SCIM_KEY_minus },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_section, SCIM_KEY_grave },
+ { SCIM_KEY_adiaeresis, SCIM_KEY_apostrophe },
+ { SCIM_KEY_aring, SCIM_KEY_bracketleft },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_bracketright },
+};
+
+static __Uint16Pair __us_to_finnish_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_adiaeresis },
+ { SCIM_KEY_minus, SCIM_KEY_plus },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_bracketleft, SCIM_KEY_aring },
+ { SCIM_KEY_backslash, SCIM_KEY_apostrophe },
+ { SCIM_KEY_bracketright, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_section },
+};
+
+static __Uint16Pair __finnish_to_us_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_backslash },
+ { SCIM_KEY_plus, SCIM_KEY_minus },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_section, SCIM_KEY_grave },
+ { SCIM_KEY_Adiaeresis, SCIM_KEY_apostrophe },
+ { SCIM_KEY_Aring, SCIM_KEY_bracketleft },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_bracketright },
+};
+
+static __Uint16Pair __us_to_finnish_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_Adiaeresis },
+ { SCIM_KEY_minus, SCIM_KEY_plus },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_bracketleft, SCIM_KEY_Aring },
+ { SCIM_KEY_backslash, SCIM_KEY_apostrophe },
+ { SCIM_KEY_bracketright, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_section },
+};
+
+static __Uint16Pair __finnish_to_us_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_bar },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_currency, SCIM_KEY_dollar },
+ { SCIM_KEY_onehalf, SCIM_KEY_asciitilde },
+ { SCIM_KEY_Adiaeresis, SCIM_KEY_quotedbl },
+ { SCIM_KEY_Aring, SCIM_KEY_braceleft },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_colon },
+ { SCIM_KEY_dead_grave, SCIM_KEY_plus },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_braceright },
+};
+
+static __Uint16Pair __us_to_finnish_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_Adiaeresis },
+ { SCIM_KEY_dollar, SCIM_KEY_currency },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dead_grave },
+ { SCIM_KEY_colon, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_Aring },
+ { SCIM_KEY_bar, SCIM_KEY_asterisk },
+ { SCIM_KEY_braceright, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_asciitilde, SCIM_KEY_onehalf },
+};
+
+static __Uint16Pair __finnish_to_us_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_bar },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_currency, SCIM_KEY_dollar },
+ { SCIM_KEY_onehalf, SCIM_KEY_asciitilde },
+ { SCIM_KEY_adiaeresis, SCIM_KEY_quotedbl },
+ { SCIM_KEY_aring, SCIM_KEY_braceleft },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_colon },
+ { SCIM_KEY_dead_grave, SCIM_KEY_plus },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_braceright },
+};
+
+static __Uint16Pair __us_to_finnish_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_adiaeresis },
+ { SCIM_KEY_dollar, SCIM_KEY_currency },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dead_grave },
+ { SCIM_KEY_colon, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_aring },
+ { SCIM_KEY_bar, SCIM_KEY_asterisk },
+ { SCIM_KEY_braceright, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_asciitilde, SCIM_KEY_onehalf },
+};
+
+static __Uint16Pair __french_to_us_normal [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_slash },
+ { SCIM_KEY_quotedbl, SCIM_KEY_3 },
+ { SCIM_KEY_dollar, SCIM_KEY_bracketright },
+ { SCIM_KEY_ampersand, SCIM_KEY_1 },
+ { SCIM_KEY_apostrophe, SCIM_KEY_4 },
+ { SCIM_KEY_parenleft, SCIM_KEY_5 },
+ { SCIM_KEY_parenright, SCIM_KEY_minus },
+ { SCIM_KEY_asterisk, SCIM_KEY_backslash },
+ { SCIM_KEY_comma, SCIM_KEY_m },
+ { SCIM_KEY_minus, SCIM_KEY_6 },
+ { SCIM_KEY_colon, SCIM_KEY_period },
+ { SCIM_KEY_semicolon, SCIM_KEY_comma },
+ { SCIM_KEY_underscore, SCIM_KEY_8 },
+ { SCIM_KEY_a, SCIM_KEY_q },
+ { SCIM_KEY_m, SCIM_KEY_semicolon },
+ { SCIM_KEY_q, SCIM_KEY_a },
+ { SCIM_KEY_w, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_w },
+ { SCIM_KEY_twosuperior, SCIM_KEY_grave },
+ { SCIM_KEY_agrave, SCIM_KEY_0 },
+ { SCIM_KEY_ccedilla, SCIM_KEY_9 },
+ { SCIM_KEY_egrave, SCIM_KEY_7 },
+ { SCIM_KEY_eacute, SCIM_KEY_2 },
+ { SCIM_KEY_ugrave, SCIM_KEY_apostrophe },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_bracketleft },
+};
+
+static __Uint16Pair __us_to_french_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_ugrave },
+ { SCIM_KEY_comma, SCIM_KEY_semicolon },
+ { SCIM_KEY_minus, SCIM_KEY_parenright },
+ { SCIM_KEY_period, SCIM_KEY_colon },
+ { SCIM_KEY_slash, SCIM_KEY_exclam },
+ { SCIM_KEY_0, SCIM_KEY_agrave },
+ { SCIM_KEY_1, SCIM_KEY_ampersand },
+ { SCIM_KEY_2, SCIM_KEY_eacute },
+ { SCIM_KEY_3, SCIM_KEY_quotedbl },
+ { SCIM_KEY_4, SCIM_KEY_apostrophe },
+ { SCIM_KEY_5, SCIM_KEY_parenleft },
+ { SCIM_KEY_6, SCIM_KEY_minus },
+ { SCIM_KEY_7, SCIM_KEY_egrave },
+ { SCIM_KEY_8, SCIM_KEY_underscore },
+ { SCIM_KEY_9, SCIM_KEY_ccedilla },
+ { SCIM_KEY_semicolon, SCIM_KEY_m },
+ { SCIM_KEY_bracketleft, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_backslash, SCIM_KEY_asterisk },
+ { SCIM_KEY_bracketright, SCIM_KEY_dollar },
+ { SCIM_KEY_grave, SCIM_KEY_twosuperior },
+ { SCIM_KEY_a, SCIM_KEY_q },
+ { SCIM_KEY_m, SCIM_KEY_comma },
+ { SCIM_KEY_q, SCIM_KEY_a },
+ { SCIM_KEY_w, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_w },
+};
+
+static __Uint16Pair __french_to_us_caps [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_slash },
+ { SCIM_KEY_quotedbl, SCIM_KEY_3 },
+ { SCIM_KEY_dollar, SCIM_KEY_bracketright },
+ { SCIM_KEY_ampersand, SCIM_KEY_1 },
+ { SCIM_KEY_apostrophe, SCIM_KEY_4 },
+ { SCIM_KEY_parenleft, SCIM_KEY_5 },
+ { SCIM_KEY_parenright, SCIM_KEY_minus },
+ { SCIM_KEY_asterisk, SCIM_KEY_backslash },
+ { SCIM_KEY_comma, SCIM_KEY_M },
+ { SCIM_KEY_minus, SCIM_KEY_6 },
+ { SCIM_KEY_colon, SCIM_KEY_period },
+ { SCIM_KEY_semicolon, SCIM_KEY_comma },
+ { SCIM_KEY_A, SCIM_KEY_Q },
+ { SCIM_KEY_M, SCIM_KEY_semicolon },
+ { SCIM_KEY_Q, SCIM_KEY_A },
+ { SCIM_KEY_W, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_W },
+ { SCIM_KEY_underscore, SCIM_KEY_8 },
+ { SCIM_KEY_twosuperior, SCIM_KEY_grave },
+ { SCIM_KEY_Agrave, SCIM_KEY_0 },
+ { SCIM_KEY_Ccedilla, SCIM_KEY_9 },
+ { SCIM_KEY_Egrave, SCIM_KEY_7 },
+ { SCIM_KEY_Eacute, SCIM_KEY_2 },
+ { SCIM_KEY_Ugrave, SCIM_KEY_apostrophe },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_bracketleft },
+};
+
+static __Uint16Pair __us_to_french_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_Ugrave },
+ { SCIM_KEY_comma, SCIM_KEY_semicolon },
+ { SCIM_KEY_minus, SCIM_KEY_parenright },
+ { SCIM_KEY_period, SCIM_KEY_colon },
+ { SCIM_KEY_slash, SCIM_KEY_exclam },
+ { SCIM_KEY_0, SCIM_KEY_Agrave },
+ { SCIM_KEY_1, SCIM_KEY_ampersand },
+ { SCIM_KEY_2, SCIM_KEY_Eacute },
+ { SCIM_KEY_3, SCIM_KEY_quotedbl },
+ { SCIM_KEY_4, SCIM_KEY_apostrophe },
+ { SCIM_KEY_5, SCIM_KEY_parenleft },
+ { SCIM_KEY_6, SCIM_KEY_minus },
+ { SCIM_KEY_7, SCIM_KEY_Egrave },
+ { SCIM_KEY_8, SCIM_KEY_underscore },
+ { SCIM_KEY_9, SCIM_KEY_Ccedilla },
+ { SCIM_KEY_semicolon, SCIM_KEY_M },
+ { SCIM_KEY_A, SCIM_KEY_Q },
+ { SCIM_KEY_M, SCIM_KEY_comma },
+ { SCIM_KEY_Q, SCIM_KEY_A },
+ { SCIM_KEY_W, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_W },
+ { SCIM_KEY_bracketleft, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_backslash, SCIM_KEY_asterisk },
+ { SCIM_KEY_bracketright, SCIM_KEY_dollar },
+ { SCIM_KEY_grave, SCIM_KEY_twosuperior },
+};
+
+static __Uint16Pair __french_to_us_shift [] = {
+ { SCIM_KEY_percent, SCIM_KEY_quotedbl },
+ { SCIM_KEY_period, SCIM_KEY_less },
+ { SCIM_KEY_slash, SCIM_KEY_greater },
+ { SCIM_KEY_0, SCIM_KEY_parenright },
+ { SCIM_KEY_1, SCIM_KEY_exclam },
+ { SCIM_KEY_2, SCIM_KEY_at },
+ { SCIM_KEY_3, SCIM_KEY_numbersign },
+ { SCIM_KEY_4, SCIM_KEY_dollar },
+ { SCIM_KEY_5, SCIM_KEY_percent },
+ { SCIM_KEY_6, SCIM_KEY_asciicircum },
+ { SCIM_KEY_7, SCIM_KEY_ampersand },
+ { SCIM_KEY_8, SCIM_KEY_asterisk },
+ { SCIM_KEY_9, SCIM_KEY_parenleft },
+ { SCIM_KEY_question, SCIM_KEY_M },
+ { SCIM_KEY_A, SCIM_KEY_Q },
+ { SCIM_KEY_M, SCIM_KEY_colon },
+ { SCIM_KEY_Q, SCIM_KEY_A },
+ { SCIM_KEY_W, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_W },
+ { SCIM_KEY_sterling, SCIM_KEY_braceright },
+ { SCIM_KEY_section, SCIM_KEY_question },
+ { SCIM_KEY_degree, SCIM_KEY_underscore },
+ { SCIM_KEY_mu, SCIM_KEY_bar },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_braceleft },
+};
+
+static __Uint16Pair __us_to_french_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_1 },
+ { SCIM_KEY_quotedbl, SCIM_KEY_percent },
+ { SCIM_KEY_numbersign, SCIM_KEY_3 },
+ { SCIM_KEY_dollar, SCIM_KEY_4 },
+ { SCIM_KEY_percent, SCIM_KEY_5 },
+ { SCIM_KEY_ampersand, SCIM_KEY_7 },
+ { SCIM_KEY_parenleft, SCIM_KEY_9 },
+ { SCIM_KEY_parenright, SCIM_KEY_0 },
+ { SCIM_KEY_asterisk, SCIM_KEY_8 },
+ { SCIM_KEY_colon, SCIM_KEY_M },
+ { SCIM_KEY_less, SCIM_KEY_period },
+ { SCIM_KEY_greater, SCIM_KEY_slash },
+ { SCIM_KEY_question, SCIM_KEY_section },
+ { SCIM_KEY_at, SCIM_KEY_2 },
+ { SCIM_KEY_A, SCIM_KEY_Q },
+ { SCIM_KEY_M, SCIM_KEY_question },
+ { SCIM_KEY_Q, SCIM_KEY_A },
+ { SCIM_KEY_W, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_W },
+ { SCIM_KEY_asciicircum, SCIM_KEY_6 },
+ { SCIM_KEY_underscore, SCIM_KEY_degree },
+ { SCIM_KEY_braceleft, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_bar, SCIM_KEY_mu },
+ { SCIM_KEY_braceright, SCIM_KEY_sterling },
+};
+
+static __Uint16Pair __french_to_us_caps_shift [] = {
+ { SCIM_KEY_percent, SCIM_KEY_quotedbl },
+ { SCIM_KEY_period, SCIM_KEY_less },
+ { SCIM_KEY_slash, SCIM_KEY_greater },
+ { SCIM_KEY_0, SCIM_KEY_parenright },
+ { SCIM_KEY_1, SCIM_KEY_exclam },
+ { SCIM_KEY_2, SCIM_KEY_at },
+ { SCIM_KEY_3, SCIM_KEY_numbersign },
+ { SCIM_KEY_4, SCIM_KEY_dollar },
+ { SCIM_KEY_5, SCIM_KEY_percent },
+ { SCIM_KEY_6, SCIM_KEY_asciicircum },
+ { SCIM_KEY_7, SCIM_KEY_ampersand },
+ { SCIM_KEY_8, SCIM_KEY_asterisk },
+ { SCIM_KEY_9, SCIM_KEY_parenleft },
+ { SCIM_KEY_question, SCIM_KEY_m },
+ { SCIM_KEY_a, SCIM_KEY_q },
+ { SCIM_KEY_m, SCIM_KEY_colon },
+ { SCIM_KEY_q, SCIM_KEY_a },
+ { SCIM_KEY_w, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_w },
+ { SCIM_KEY_sterling, SCIM_KEY_braceright },
+ { SCIM_KEY_section, SCIM_KEY_question },
+ { SCIM_KEY_degree, SCIM_KEY_underscore },
+ { SCIM_KEY_mu, SCIM_KEY_bar },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_braceleft },
+};
+
+static __Uint16Pair __us_to_french_caps_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_1 },
+ { SCIM_KEY_quotedbl, SCIM_KEY_percent },
+ { SCIM_KEY_numbersign, SCIM_KEY_3 },
+ { SCIM_KEY_dollar, SCIM_KEY_4 },
+ { SCIM_KEY_percent, SCIM_KEY_5 },
+ { SCIM_KEY_ampersand, SCIM_KEY_7 },
+ { SCIM_KEY_parenleft, SCIM_KEY_9 },
+ { SCIM_KEY_parenright, SCIM_KEY_0 },
+ { SCIM_KEY_asterisk, SCIM_KEY_8 },
+ { SCIM_KEY_colon, SCIM_KEY_m },
+ { SCIM_KEY_less, SCIM_KEY_period },
+ { SCIM_KEY_greater, SCIM_KEY_slash },
+ { SCIM_KEY_question, SCIM_KEY_section },
+ { SCIM_KEY_at, SCIM_KEY_2 },
+ { SCIM_KEY_asciicircum, SCIM_KEY_6 },
+ { SCIM_KEY_underscore, SCIM_KEY_degree },
+ { SCIM_KEY_a, SCIM_KEY_q },
+ { SCIM_KEY_m, SCIM_KEY_question },
+ { SCIM_KEY_q, SCIM_KEY_a },
+ { SCIM_KEY_w, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_w },
+ { SCIM_KEY_braceleft, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_bar, SCIM_KEY_mu },
+ { SCIM_KEY_braceright, SCIM_KEY_sterling },
+};
+
+static __Uint16Pair __french_switzerland_to_us_normal [] = {
+ { SCIM_KEY_dollar, SCIM_KEY_backslash },
+ { SCIM_KEY_apostrophe, SCIM_KEY_minus },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_section, SCIM_KEY_grave },
+ { SCIM_KEY_agrave, SCIM_KEY_apostrophe },
+ { SCIM_KEY_egrave, SCIM_KEY_bracketleft },
+ { SCIM_KEY_eacute, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_equal },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_bracketright },
+};
+
+static __Uint16Pair __us_to_french_switzerland_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_agrave },
+ { SCIM_KEY_minus, SCIM_KEY_apostrophe },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_eacute },
+ { SCIM_KEY_equal, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_bracketleft, SCIM_KEY_egrave },
+ { SCIM_KEY_backslash, SCIM_KEY_dollar },
+ { SCIM_KEY_bracketright, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_section },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+};
+
+static __Uint16Pair __french_switzerland_to_us_caps [] = {
+ { SCIM_KEY_dollar, SCIM_KEY_backslash },
+ { SCIM_KEY_apostrophe, SCIM_KEY_minus },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_section, SCIM_KEY_grave },
+ { SCIM_KEY_Agrave, SCIM_KEY_apostrophe },
+ { SCIM_KEY_Egrave, SCIM_KEY_bracketleft },
+ { SCIM_KEY_Eacute, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_equal },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_bracketright },
+};
+
+static __Uint16Pair __us_to_french_switzerland_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_Agrave },
+ { SCIM_KEY_minus, SCIM_KEY_apostrophe },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_Eacute },
+ { SCIM_KEY_equal, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_bracketleft, SCIM_KEY_Egrave },
+ { SCIM_KEY_backslash, SCIM_KEY_dollar },
+ { SCIM_KEY_bracketright, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_section },
+};
+
+static __Uint16Pair __french_switzerland_to_us_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_braceright },
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_numbersign },
+ { SCIM_KEY_plus, SCIM_KEY_exclam },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_sterling, SCIM_KEY_bar },
+ { SCIM_KEY_degree, SCIM_KEY_asciitilde },
+ { SCIM_KEY_adiaeresis, SCIM_KEY_quotedbl },
+ { SCIM_KEY_ccedilla, SCIM_KEY_dollar },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_colon },
+ { SCIM_KEY_udiaeresis, SCIM_KEY_braceleft },
+ { SCIM_KEY_dead_grave, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __us_to_french_switzerland_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_plus },
+ { SCIM_KEY_quotedbl, SCIM_KEY_adiaeresis },
+ { SCIM_KEY_numbersign, SCIM_KEY_asterisk },
+ { SCIM_KEY_dollar, SCIM_KEY_ccedilla },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dead_grave },
+ { SCIM_KEY_colon, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_udiaeresis },
+ { SCIM_KEY_bar, SCIM_KEY_sterling },
+ { SCIM_KEY_braceright, SCIM_KEY_exclam },
+ { SCIM_KEY_asciitilde, SCIM_KEY_degree },
+};
+
+static __Uint16Pair __french_switzerland_to_us_caps_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_braceright },
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_numbersign },
+ { SCIM_KEY_plus, SCIM_KEY_exclam },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_sterling, SCIM_KEY_bar },
+ { SCIM_KEY_degree, SCIM_KEY_asciitilde },
+ { SCIM_KEY_Adiaeresis, SCIM_KEY_quotedbl },
+ { SCIM_KEY_Ccedilla, SCIM_KEY_dollar },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_colon },
+ { SCIM_KEY_Udiaeresis, SCIM_KEY_braceleft },
+ { SCIM_KEY_dead_grave, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __us_to_french_switzerland_caps_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_plus },
+ { SCIM_KEY_quotedbl, SCIM_KEY_Adiaeresis },
+ { SCIM_KEY_numbersign, SCIM_KEY_asterisk },
+ { SCIM_KEY_dollar, SCIM_KEY_Ccedilla },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dead_grave },
+ { SCIM_KEY_colon, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_braceleft, SCIM_KEY_Udiaeresis },
+ { SCIM_KEY_bar, SCIM_KEY_sterling },
+ { SCIM_KEY_braceright, SCIM_KEY_exclam },
+ { SCIM_KEY_asciitilde, SCIM_KEY_degree },
+};
+
+static __Uint16Pair __german_deadkeys_to_us_normal [] = {
+ { SCIM_KEY_numbersign, SCIM_KEY_backslash },
+ { SCIM_KEY_plus, SCIM_KEY_bracketright },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_ssharp, SCIM_KEY_minus },
+ { SCIM_KEY_adiaeresis, SCIM_KEY_apostrophe },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_semicolon },
+ { SCIM_KEY_udiaeresis, SCIM_KEY_bracketleft },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_grave },
+};
+
+static __Uint16Pair __us_to_german_deadkeys_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_adiaeresis },
+ { SCIM_KEY_minus, SCIM_KEY_ssharp },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_bracketleft, SCIM_KEY_udiaeresis },
+ { SCIM_KEY_backslash, SCIM_KEY_numbersign },
+ { SCIM_KEY_bracketright, SCIM_KEY_plus },
+ { SCIM_KEY_grave, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+};
+
+static __Uint16Pair __german_deadkeys_to_us_caps [] = {
+ { SCIM_KEY_numbersign, SCIM_KEY_backslash },
+ { SCIM_KEY_plus, SCIM_KEY_bracketright },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_Adiaeresis, SCIM_KEY_apostrophe },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_semicolon },
+ { SCIM_KEY_Udiaeresis, SCIM_KEY_bracketleft },
+ { SCIM_KEY_ssharp, SCIM_KEY_minus },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_grave },
+};
+
+static __Uint16Pair __us_to_german_deadkeys_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_Adiaeresis },
+ { SCIM_KEY_minus, SCIM_KEY_ssharp },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_bracketleft, SCIM_KEY_Udiaeresis },
+ { SCIM_KEY_backslash, SCIM_KEY_numbersign },
+ { SCIM_KEY_bracketright, SCIM_KEY_plus },
+ { SCIM_KEY_grave, SCIM_KEY_dead_circumflex },
+};
+
+static __Uint16Pair __german_deadkeys_to_us_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_apostrophe, SCIM_KEY_bar },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_braceright },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_section, SCIM_KEY_numbersign },
+ { SCIM_KEY_degree, SCIM_KEY_asciitilde },
+ { SCIM_KEY_Adiaeresis, SCIM_KEY_quotedbl },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_colon },
+ { SCIM_KEY_Udiaeresis, SCIM_KEY_braceleft },
+ { SCIM_KEY_dead_grave, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __us_to_german_deadkeys_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_Adiaeresis },
+ { SCIM_KEY_numbersign, SCIM_KEY_section },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dead_grave },
+ { SCIM_KEY_colon, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_Udiaeresis },
+ { SCIM_KEY_bar, SCIM_KEY_apostrophe },
+ { SCIM_KEY_braceright, SCIM_KEY_asterisk },
+ { SCIM_KEY_asciitilde, SCIM_KEY_degree },
+};
+
+static __Uint16Pair __german_deadkeys_to_us_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_apostrophe, SCIM_KEY_bar },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_braceright },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_section, SCIM_KEY_numbersign },
+ { SCIM_KEY_degree, SCIM_KEY_asciitilde },
+ { SCIM_KEY_adiaeresis, SCIM_KEY_quotedbl },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_colon },
+ { SCIM_KEY_udiaeresis, SCIM_KEY_braceleft },
+ { SCIM_KEY_dead_grave, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __us_to_german_deadkeys_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_adiaeresis },
+ { SCIM_KEY_numbersign, SCIM_KEY_section },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dead_grave },
+ { SCIM_KEY_colon, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_braceleft, SCIM_KEY_udiaeresis },
+ { SCIM_KEY_bar, SCIM_KEY_apostrophe },
+ { SCIM_KEY_braceright, SCIM_KEY_asterisk },
+ { SCIM_KEY_asciitilde, SCIM_KEY_degree },
+};
+
+static __Uint16Pair __german_to_us_normal [] = {
+ { SCIM_KEY_numbersign, SCIM_KEY_backslash },
+ { SCIM_KEY_plus, SCIM_KEY_bracketright },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_asciicircum, SCIM_KEY_grave },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_acute, SCIM_KEY_equal },
+ { SCIM_KEY_ssharp, SCIM_KEY_minus },
+ { SCIM_KEY_adiaeresis, SCIM_KEY_apostrophe },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_semicolon },
+ { SCIM_KEY_udiaeresis, SCIM_KEY_bracketleft },
+};
+
+static __Uint16Pair __us_to_german_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_adiaeresis },
+ { SCIM_KEY_minus, SCIM_KEY_ssharp },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_equal, SCIM_KEY_acute },
+ { SCIM_KEY_bracketleft, SCIM_KEY_udiaeresis },
+ { SCIM_KEY_backslash, SCIM_KEY_numbersign },
+ { SCIM_KEY_bracketright, SCIM_KEY_plus },
+ { SCIM_KEY_grave, SCIM_KEY_asciicircum },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+};
+
+static __Uint16Pair __german_to_us_caps [] = {
+ { SCIM_KEY_numbersign, SCIM_KEY_backslash },
+ { SCIM_KEY_plus, SCIM_KEY_bracketright },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_asciicircum, SCIM_KEY_grave },
+ { SCIM_KEY_acute, SCIM_KEY_equal },
+ { SCIM_KEY_Adiaeresis, SCIM_KEY_apostrophe },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_semicolon },
+ { SCIM_KEY_Udiaeresis, SCIM_KEY_bracketleft },
+ { SCIM_KEY_ssharp, SCIM_KEY_minus },
+};
+
+static __Uint16Pair __us_to_german_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_Adiaeresis },
+ { SCIM_KEY_minus, SCIM_KEY_ssharp },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_equal, SCIM_KEY_acute },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_bracketleft, SCIM_KEY_Udiaeresis },
+ { SCIM_KEY_backslash, SCIM_KEY_numbersign },
+ { SCIM_KEY_bracketright, SCIM_KEY_plus },
+ { SCIM_KEY_grave, SCIM_KEY_asciicircum },
+};
+
+static __Uint16Pair __german_to_us_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_apostrophe, SCIM_KEY_bar },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_braceright },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_grave, SCIM_KEY_plus },
+ { SCIM_KEY_section, SCIM_KEY_numbersign },
+ { SCIM_KEY_degree, SCIM_KEY_asciitilde },
+ { SCIM_KEY_Adiaeresis, SCIM_KEY_quotedbl },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_colon },
+ { SCIM_KEY_Udiaeresis, SCIM_KEY_braceleft },
+};
+
+static __Uint16Pair __us_to_german_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_Adiaeresis },
+ { SCIM_KEY_numbersign, SCIM_KEY_section },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_grave },
+ { SCIM_KEY_colon, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_Udiaeresis },
+ { SCIM_KEY_bar, SCIM_KEY_apostrophe },
+ { SCIM_KEY_braceright, SCIM_KEY_asterisk },
+ { SCIM_KEY_asciitilde, SCIM_KEY_degree },
+};
+
+static __Uint16Pair __german_to_us_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_apostrophe, SCIM_KEY_bar },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_braceright },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_grave, SCIM_KEY_plus },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_section, SCIM_KEY_numbersign },
+ { SCIM_KEY_degree, SCIM_KEY_asciitilde },
+ { SCIM_KEY_adiaeresis, SCIM_KEY_quotedbl },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_colon },
+ { SCIM_KEY_udiaeresis, SCIM_KEY_braceleft },
+};
+
+static __Uint16Pair __us_to_german_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_adiaeresis },
+ { SCIM_KEY_numbersign, SCIM_KEY_section },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_grave },
+ { SCIM_KEY_colon, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_braceleft, SCIM_KEY_udiaeresis },
+ { SCIM_KEY_bar, SCIM_KEY_apostrophe },
+ { SCIM_KEY_braceright, SCIM_KEY_asterisk },
+ { SCIM_KEY_asciitilde, SCIM_KEY_degree },
+};
+
+static __Uint16Pair __german_swiss_to_us_normal [] = {
+ { SCIM_KEY_dollar, SCIM_KEY_backslash },
+ { SCIM_KEY_apostrophe, SCIM_KEY_minus },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_section, SCIM_KEY_grave },
+ { SCIM_KEY_adiaeresis, SCIM_KEY_apostrophe },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_semicolon },
+ { SCIM_KEY_udiaeresis, SCIM_KEY_bracketleft },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_equal },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_bracketright },
+};
+
+static __Uint16Pair __us_to_german_swiss_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_adiaeresis },
+ { SCIM_KEY_minus, SCIM_KEY_apostrophe },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_equal, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_bracketleft, SCIM_KEY_udiaeresis },
+ { SCIM_KEY_backslash, SCIM_KEY_dollar },
+ { SCIM_KEY_bracketright, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_section },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+};
+
+static __Uint16Pair __german_swiss_to_us_caps [] = {
+ { SCIM_KEY_dollar, SCIM_KEY_backslash },
+ { SCIM_KEY_apostrophe, SCIM_KEY_minus },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_section, SCIM_KEY_grave },
+ { SCIM_KEY_Adiaeresis, SCIM_KEY_apostrophe },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_semicolon },
+ { SCIM_KEY_Udiaeresis, SCIM_KEY_bracketleft },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_equal },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_bracketright },
+};
+
+static __Uint16Pair __us_to_german_swiss_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_Adiaeresis },
+ { SCIM_KEY_minus, SCIM_KEY_apostrophe },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_equal, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_bracketleft, SCIM_KEY_Udiaeresis },
+ { SCIM_KEY_backslash, SCIM_KEY_dollar },
+ { SCIM_KEY_bracketright, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_section },
+};
+
+static __Uint16Pair __german_swiss_to_us_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_braceright },
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_numbersign },
+ { SCIM_KEY_plus, SCIM_KEY_exclam },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_sterling, SCIM_KEY_bar },
+ { SCIM_KEY_degree, SCIM_KEY_asciitilde },
+ { SCIM_KEY_agrave, SCIM_KEY_quotedbl },
+ { SCIM_KEY_ccedilla, SCIM_KEY_dollar },
+ { SCIM_KEY_egrave, SCIM_KEY_braceleft },
+ { SCIM_KEY_eacute, SCIM_KEY_colon },
+ { SCIM_KEY_dead_grave, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __us_to_german_swiss_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_plus },
+ { SCIM_KEY_quotedbl, SCIM_KEY_agrave },
+ { SCIM_KEY_numbersign, SCIM_KEY_asterisk },
+ { SCIM_KEY_dollar, SCIM_KEY_ccedilla },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dead_grave },
+ { SCIM_KEY_colon, SCIM_KEY_eacute },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_egrave },
+ { SCIM_KEY_bar, SCIM_KEY_sterling },
+ { SCIM_KEY_braceright, SCIM_KEY_exclam },
+ { SCIM_KEY_asciitilde, SCIM_KEY_degree },
+};
+
+static __Uint16Pair __german_swiss_to_us_caps_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_braceright },
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_numbersign },
+ { SCIM_KEY_plus, SCIM_KEY_exclam },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_sterling, SCIM_KEY_bar },
+ { SCIM_KEY_degree, SCIM_KEY_asciitilde },
+ { SCIM_KEY_Agrave, SCIM_KEY_quotedbl },
+ { SCIM_KEY_Ccedilla, SCIM_KEY_dollar },
+ { SCIM_KEY_Egrave, SCIM_KEY_braceleft },
+ { SCIM_KEY_Eacute, SCIM_KEY_colon },
+ { SCIM_KEY_dead_grave, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __us_to_german_swiss_caps_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_plus },
+ { SCIM_KEY_quotedbl, SCIM_KEY_Agrave },
+ { SCIM_KEY_numbersign, SCIM_KEY_asterisk },
+ { SCIM_KEY_dollar, SCIM_KEY_Ccedilla },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dead_grave },
+ { SCIM_KEY_colon, SCIM_KEY_Eacute },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_braceleft, SCIM_KEY_Egrave },
+ { SCIM_KEY_bar, SCIM_KEY_sterling },
+ { SCIM_KEY_braceright, SCIM_KEY_exclam },
+ { SCIM_KEY_asciitilde, SCIM_KEY_degree },
+};
+
+static __Uint16Pair __hungarian_to_us_normal [] = {
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_0, SCIM_KEY_grave },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_aacute, SCIM_KEY_apostrophe },
+ { SCIM_KEY_eacute, SCIM_KEY_semicolon },
+ { SCIM_KEY_oacute, SCIM_KEY_equal },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_0 },
+ { SCIM_KEY_uacute, SCIM_KEY_bracketright },
+ { SCIM_KEY_udiaeresis, SCIM_KEY_minus },
+ { SCIM_KEY_odoubleacute, SCIM_KEY_bracketleft },
+ { SCIM_KEY_udoubleacute, SCIM_KEY_backslash },
+};
+
+static __Uint16Pair __us_to_hungarian_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_aacute },
+ { SCIM_KEY_minus, SCIM_KEY_udiaeresis },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_0, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_semicolon, SCIM_KEY_eacute },
+ { SCIM_KEY_equal, SCIM_KEY_oacute },
+ { SCIM_KEY_bracketleft, SCIM_KEY_odoubleacute },
+ { SCIM_KEY_backslash, SCIM_KEY_udoubleacute },
+ { SCIM_KEY_bracketright, SCIM_KEY_uacute },
+ { SCIM_KEY_grave, SCIM_KEY_0 },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+};
+
+static __Uint16Pair __hungarian_to_us_caps [] = {
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_0, SCIM_KEY_grave },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_Aacute, SCIM_KEY_apostrophe },
+ { SCIM_KEY_Eacute, SCIM_KEY_semicolon },
+ { SCIM_KEY_Oacute, SCIM_KEY_equal },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_0 },
+ { SCIM_KEY_Uacute, SCIM_KEY_bracketright },
+ { SCIM_KEY_Udiaeresis, SCIM_KEY_minus },
+ { SCIM_KEY_Odoubleacute, SCIM_KEY_bracketleft },
+ { SCIM_KEY_Udoubleacute, SCIM_KEY_backslash },
+};
+
+static __Uint16Pair __us_to_hungarian_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_Aacute },
+ { SCIM_KEY_minus, SCIM_KEY_Udiaeresis },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_0, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_semicolon, SCIM_KEY_Eacute },
+ { SCIM_KEY_equal, SCIM_KEY_Oacute },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_bracketleft, SCIM_KEY_Odoubleacute },
+ { SCIM_KEY_backslash, SCIM_KEY_Udoubleacute },
+ { SCIM_KEY_bracketright, SCIM_KEY_Uacute },
+ { SCIM_KEY_grave, SCIM_KEY_0 },
+};
+
+static __Uint16Pair __hungarian_to_us_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_dollar },
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_apostrophe, SCIM_KEY_exclam },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_numbersign },
+ { SCIM_KEY_slash, SCIM_KEY_asciicircum },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_equal, SCIM_KEY_ampersand },
+ { SCIM_KEY_question, SCIM_KEY_less },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_section, SCIM_KEY_asciitilde },
+ { SCIM_KEY_Aacute, SCIM_KEY_quotedbl },
+ { SCIM_KEY_Eacute, SCIM_KEY_colon },
+ { SCIM_KEY_Oacute, SCIM_KEY_plus },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_parenright },
+ { SCIM_KEY_Uacute, SCIM_KEY_braceright },
+ { SCIM_KEY_Udiaeresis, SCIM_KEY_underscore },
+ { SCIM_KEY_Odoubleacute, SCIM_KEY_braceleft },
+ { SCIM_KEY_Udoubleacute, SCIM_KEY_bar },
+};
+
+static __Uint16Pair __us_to_hungarian_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_apostrophe },
+ { SCIM_KEY_quotedbl, SCIM_KEY_Aacute },
+ { SCIM_KEY_numbersign, SCIM_KEY_plus },
+ { SCIM_KEY_dollar, SCIM_KEY_exclam },
+ { SCIM_KEY_ampersand, SCIM_KEY_equal },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_Oacute },
+ { SCIM_KEY_colon, SCIM_KEY_Eacute },
+ { SCIM_KEY_less, SCIM_KEY_question },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_asciicircum, SCIM_KEY_slash },
+ { SCIM_KEY_underscore, SCIM_KEY_Udiaeresis },
+ { SCIM_KEY_braceleft, SCIM_KEY_Odoubleacute },
+ { SCIM_KEY_bar, SCIM_KEY_Udoubleacute },
+ { SCIM_KEY_braceright, SCIM_KEY_Uacute },
+ { SCIM_KEY_asciitilde, SCIM_KEY_section },
+};
+
+static __Uint16Pair __hungarian_to_us_caps_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_dollar },
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_apostrophe, SCIM_KEY_exclam },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_numbersign },
+ { SCIM_KEY_slash, SCIM_KEY_asciicircum },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_equal, SCIM_KEY_ampersand },
+ { SCIM_KEY_question, SCIM_KEY_less },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_section, SCIM_KEY_asciitilde },
+ { SCIM_KEY_aacute, SCIM_KEY_quotedbl },
+ { SCIM_KEY_eacute, SCIM_KEY_colon },
+ { SCIM_KEY_oacute, SCIM_KEY_plus },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_parenright },
+ { SCIM_KEY_uacute, SCIM_KEY_braceright },
+ { SCIM_KEY_udiaeresis, SCIM_KEY_underscore },
+ { SCIM_KEY_odoubleacute, SCIM_KEY_braceleft },
+ { SCIM_KEY_udoubleacute, SCIM_KEY_bar },
+};
+
+static __Uint16Pair __us_to_hungarian_caps_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_apostrophe },
+ { SCIM_KEY_quotedbl, SCIM_KEY_aacute },
+ { SCIM_KEY_numbersign, SCIM_KEY_plus },
+ { SCIM_KEY_dollar, SCIM_KEY_exclam },
+ { SCIM_KEY_ampersand, SCIM_KEY_equal },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_oacute },
+ { SCIM_KEY_colon, SCIM_KEY_eacute },
+ { SCIM_KEY_less, SCIM_KEY_question },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_slash },
+ { SCIM_KEY_underscore, SCIM_KEY_udiaeresis },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_braceleft, SCIM_KEY_odoubleacute },
+ { SCIM_KEY_bar, SCIM_KEY_udoubleacute },
+ { SCIM_KEY_braceright, SCIM_KEY_uacute },
+ { SCIM_KEY_asciitilde, SCIM_KEY_section },
+};
+
+static __Uint16Pair __italian_to_us_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_minus },
+ { SCIM_KEY_plus, SCIM_KEY_bracketright },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_backslash, SCIM_KEY_grave },
+ { SCIM_KEY_agrave, SCIM_KEY_apostrophe },
+ { SCIM_KEY_egrave, SCIM_KEY_bracketleft },
+ { SCIM_KEY_igrave, SCIM_KEY_equal },
+ { SCIM_KEY_ograve, SCIM_KEY_semicolon },
+ { SCIM_KEY_ugrave, SCIM_KEY_backslash },
+};
+
+static __Uint16Pair __us_to_italian_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_agrave },
+ { SCIM_KEY_minus, SCIM_KEY_apostrophe },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_ograve },
+ { SCIM_KEY_equal, SCIM_KEY_igrave },
+ { SCIM_KEY_bracketleft, SCIM_KEY_egrave },
+ { SCIM_KEY_backslash, SCIM_KEY_ugrave },
+ { SCIM_KEY_bracketright, SCIM_KEY_plus },
+ { SCIM_KEY_grave, SCIM_KEY_backslash },
+};
+
+static __Uint16Pair __italian_to_us_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_minus },
+ { SCIM_KEY_plus, SCIM_KEY_bracketright },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_backslash, SCIM_KEY_grave },
+ { SCIM_KEY_Agrave, SCIM_KEY_apostrophe },
+ { SCIM_KEY_Egrave, SCIM_KEY_bracketleft },
+ { SCIM_KEY_Igrave, SCIM_KEY_equal },
+ { SCIM_KEY_Ograve, SCIM_KEY_semicolon },
+ { SCIM_KEY_Ugrave, SCIM_KEY_backslash },
+};
+
+static __Uint16Pair __us_to_italian_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_Agrave },
+ { SCIM_KEY_minus, SCIM_KEY_apostrophe },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_Ograve },
+ { SCIM_KEY_equal, SCIM_KEY_Igrave },
+ { SCIM_KEY_bracketleft, SCIM_KEY_Egrave },
+ { SCIM_KEY_backslash, SCIM_KEY_Ugrave },
+ { SCIM_KEY_bracketright, SCIM_KEY_plus },
+ { SCIM_KEY_grave, SCIM_KEY_backslash },
+};
+
+static __Uint16Pair __italian_to_us_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_braceright },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_asciicircum, SCIM_KEY_plus },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_bar, SCIM_KEY_asciitilde },
+ { SCIM_KEY_sterling, SCIM_KEY_numbersign },
+ { SCIM_KEY_section, SCIM_KEY_bar },
+ { SCIM_KEY_degree, SCIM_KEY_quotedbl },
+ { SCIM_KEY_ccedilla, SCIM_KEY_colon },
+ { SCIM_KEY_eacute, SCIM_KEY_braceleft },
+};
+
+static __Uint16Pair __us_to_italian_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_degree },
+ { SCIM_KEY_numbersign, SCIM_KEY_sterling },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_asciicircum },
+ { SCIM_KEY_colon, SCIM_KEY_ccedilla },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_eacute },
+ { SCIM_KEY_bar, SCIM_KEY_section },
+ { SCIM_KEY_braceright, SCIM_KEY_asterisk },
+ { SCIM_KEY_asciitilde, SCIM_KEY_bar },
+};
+
+static __Uint16Pair __italian_to_us_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_braceright },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_asciicircum, SCIM_KEY_plus },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_bar, SCIM_KEY_asciitilde },
+ { SCIM_KEY_sterling, SCIM_KEY_numbersign },
+ { SCIM_KEY_section, SCIM_KEY_bar },
+ { SCIM_KEY_degree, SCIM_KEY_quotedbl },
+ { SCIM_KEY_Ccedilla, SCIM_KEY_colon },
+ { SCIM_KEY_Eacute, SCIM_KEY_braceleft },
+};
+
+static __Uint16Pair __us_to_italian_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_degree },
+ { SCIM_KEY_numbersign, SCIM_KEY_sterling },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_asciicircum },
+ { SCIM_KEY_colon, SCIM_KEY_Ccedilla },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_Eacute },
+ { SCIM_KEY_bar, SCIM_KEY_section },
+ { SCIM_KEY_braceright, SCIM_KEY_asterisk },
+ { SCIM_KEY_asciitilde, SCIM_KEY_bar },
+};
+
+static __Uint16Pair __japanese_to_us_normal [] = {
+ { SCIM_KEY_colon, SCIM_KEY_apostrophe },
+ { SCIM_KEY_at, SCIM_KEY_bracketleft },
+ { SCIM_KEY_bracketleft, SCIM_KEY_bracketright },
+ { SCIM_KEY_bracketright, SCIM_KEY_backslash },
+ { SCIM_KEY_asciicircum, SCIM_KEY_equal },
+ { SCIM_KEY_Zenkaku_Hankaku, SCIM_KEY_grave },
+};
+
+static __Uint16Pair __us_to_japanese_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_colon },
+ { SCIM_KEY_equal, SCIM_KEY_asciicircum },
+ { SCIM_KEY_bracketleft, SCIM_KEY_at },
+ { SCIM_KEY_backslash, SCIM_KEY_bracketright },
+ { SCIM_KEY_bracketright, SCIM_KEY_bracketleft },
+ { SCIM_KEY_grave, SCIM_KEY_Zenkaku_Hankaku },
+};
+
+static __Uint16Pair __japanese_to_us_caps [] = {
+ { SCIM_KEY_colon, SCIM_KEY_apostrophe },
+ { SCIM_KEY_at, SCIM_KEY_bracketleft },
+ { SCIM_KEY_bracketleft, SCIM_KEY_bracketright },
+ { SCIM_KEY_bracketright, SCIM_KEY_backslash },
+ { SCIM_KEY_asciicircum, SCIM_KEY_equal },
+ { SCIM_KEY_Zenkaku_Hankaku, SCIM_KEY_grave },
+};
+
+static __Uint16Pair __us_to_japanese_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_colon },
+ { SCIM_KEY_equal, SCIM_KEY_asciicircum },
+ { SCIM_KEY_bracketleft, SCIM_KEY_at },
+ { SCIM_KEY_backslash, SCIM_KEY_bracketright },
+ { SCIM_KEY_bracketright, SCIM_KEY_bracketleft },
+ { SCIM_KEY_grave, SCIM_KEY_Zenkaku_Hankaku },
+};
+
+static __Uint16Pair __japanese_to_us_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_apostrophe, SCIM_KEY_ampersand },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_quotedbl },
+ { SCIM_KEY_plus, SCIM_KEY_colon },
+ { SCIM_KEY_equal, SCIM_KEY_underscore },
+ { SCIM_KEY_grave, SCIM_KEY_braceleft },
+ { SCIM_KEY_braceleft, SCIM_KEY_braceright },
+ { SCIM_KEY_braceright, SCIM_KEY_bar },
+ { SCIM_KEY_asciitilde, SCIM_KEY_parenright },
+ { SCIM_KEY_asciitilde, SCIM_KEY_plus },
+ { SCIM_KEY_Zenkaku_Hankaku, SCIM_KEY_asciitilde },
+};
+
+static __Uint16Pair __us_to_japanese_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_asterisk },
+ { SCIM_KEY_ampersand, SCIM_KEY_apostrophe },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_asciitilde },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_asciitilde },
+ { SCIM_KEY_colon, SCIM_KEY_plus },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_equal },
+ { SCIM_KEY_braceleft, SCIM_KEY_grave },
+ { SCIM_KEY_bar, SCIM_KEY_braceright },
+ { SCIM_KEY_braceright, SCIM_KEY_braceleft },
+ { SCIM_KEY_asciitilde, SCIM_KEY_Zenkaku_Hankaku },
+};
+
+static __Uint16Pair __japanese_to_us_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_apostrophe, SCIM_KEY_ampersand },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_quotedbl },
+ { SCIM_KEY_plus, SCIM_KEY_colon },
+ { SCIM_KEY_equal, SCIM_KEY_underscore },
+ { SCIM_KEY_grave, SCIM_KEY_braceleft },
+ { SCIM_KEY_braceleft, SCIM_KEY_braceright },
+ { SCIM_KEY_braceright, SCIM_KEY_bar },
+ { SCIM_KEY_asciitilde, SCIM_KEY_parenright },
+ { SCIM_KEY_asciitilde, SCIM_KEY_plus },
+ { SCIM_KEY_Zenkaku_Hankaku, SCIM_KEY_asciitilde },
+};
+
+static __Uint16Pair __us_to_japanese_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_asterisk },
+ { SCIM_KEY_ampersand, SCIM_KEY_apostrophe },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_asciitilde },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_asciitilde },
+ { SCIM_KEY_colon, SCIM_KEY_plus },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_equal },
+ { SCIM_KEY_braceleft, SCIM_KEY_grave },
+ { SCIM_KEY_bar, SCIM_KEY_braceright },
+ { SCIM_KEY_braceright, SCIM_KEY_braceleft },
+ { SCIM_KEY_asciitilde, SCIM_KEY_Zenkaku_Hankaku },
+};
+
+static __Uint16Pair __norwegian_to_us_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_backslash },
+ { SCIM_KEY_plus, SCIM_KEY_minus },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_backslash, SCIM_KEY_equal },
+ { SCIM_KEY_bar, SCIM_KEY_grave },
+ { SCIM_KEY_aring, SCIM_KEY_bracketleft },
+ { SCIM_KEY_ae, SCIM_KEY_apostrophe },
+ { SCIM_KEY_oslash, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_bracketright },
+};
+
+static __Uint16Pair __us_to_norwegian_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_ae },
+ { SCIM_KEY_minus, SCIM_KEY_plus },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_oslash },
+ { SCIM_KEY_equal, SCIM_KEY_backslash },
+ { SCIM_KEY_bracketleft, SCIM_KEY_aring },
+ { SCIM_KEY_backslash, SCIM_KEY_apostrophe },
+ { SCIM_KEY_bracketright, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_bar },
+};
+
+static __Uint16Pair __norwegian_to_us_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_backslash },
+ { SCIM_KEY_plus, SCIM_KEY_minus },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_backslash, SCIM_KEY_equal },
+ { SCIM_KEY_bar, SCIM_KEY_grave },
+ { SCIM_KEY_Aring, SCIM_KEY_bracketleft },
+ { SCIM_KEY_AE, SCIM_KEY_apostrophe },
+ { SCIM_KEY_Ooblique, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_bracketright },
+};
+
+static __Uint16Pair __us_to_norwegian_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_AE },
+ { SCIM_KEY_minus, SCIM_KEY_plus },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_Ooblique },
+ { SCIM_KEY_equal, SCIM_KEY_backslash },
+ { SCIM_KEY_bracketleft, SCIM_KEY_Aring },
+ { SCIM_KEY_backslash, SCIM_KEY_apostrophe },
+ { SCIM_KEY_bracketright, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_bar },
+};
+
+static __Uint16Pair __norwegian_to_us_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_bar },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_currency, SCIM_KEY_dollar },
+ { SCIM_KEY_section, SCIM_KEY_asciitilde },
+ { SCIM_KEY_Aring, SCIM_KEY_braceleft },
+ { SCIM_KEY_AE, SCIM_KEY_quotedbl },
+ { SCIM_KEY_Ooblique, SCIM_KEY_colon },
+ { SCIM_KEY_dead_grave, SCIM_KEY_plus },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_braceright },
+};
+
+static __Uint16Pair __us_to_norwegian_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_AE },
+ { SCIM_KEY_dollar, SCIM_KEY_currency },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dead_grave },
+ { SCIM_KEY_colon, SCIM_KEY_Ooblique },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_Aring },
+ { SCIM_KEY_bar, SCIM_KEY_asterisk },
+ { SCIM_KEY_braceright, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_asciitilde, SCIM_KEY_section },
+};
+
+static __Uint16Pair __norwegian_to_us_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_bar },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_currency, SCIM_KEY_dollar },
+ { SCIM_KEY_section, SCIM_KEY_asciitilde },
+ { SCIM_KEY_aring, SCIM_KEY_braceleft },
+ { SCIM_KEY_ae, SCIM_KEY_quotedbl },
+ { SCIM_KEY_oslash, SCIM_KEY_colon },
+ { SCIM_KEY_dead_grave, SCIM_KEY_plus },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_braceright },
+};
+
+static __Uint16Pair __us_to_norwegian_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_ae },
+ { SCIM_KEY_dollar, SCIM_KEY_currency },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dead_grave },
+ { SCIM_KEY_colon, SCIM_KEY_oslash },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_aring },
+ { SCIM_KEY_bar, SCIM_KEY_asterisk },
+ { SCIM_KEY_braceright, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_asciitilde, SCIM_KEY_section },
+};
+
+static __Uint16Pair __portuguese_brazil_to_us_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_grave },
+ { SCIM_KEY_semicolon, SCIM_KEY_slash },
+ { SCIM_KEY_bracketleft, SCIM_KEY_bracketright },
+ { SCIM_KEY_bracketright, SCIM_KEY_backslash },
+ { SCIM_KEY_ccedilla, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_acute, SCIM_KEY_bracketleft },
+ { SCIM_KEY_dead_tilde, SCIM_KEY_apostrophe },
+};
+
+static __Uint16Pair __us_to_portuguese_brazil_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_dead_tilde },
+ { SCIM_KEY_slash, SCIM_KEY_semicolon },
+ { SCIM_KEY_semicolon, SCIM_KEY_ccedilla },
+ { SCIM_KEY_bracketleft, SCIM_KEY_dead_acute },
+ { SCIM_KEY_backslash, SCIM_KEY_bracketright },
+ { SCIM_KEY_bracketright, SCIM_KEY_bracketleft },
+ { SCIM_KEY_grave, SCIM_KEY_apostrophe },
+};
+
+static __Uint16Pair __portuguese_brazil_to_us_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_grave },
+ { SCIM_KEY_semicolon, SCIM_KEY_slash },
+ { SCIM_KEY_bracketleft, SCIM_KEY_bracketright },
+ { SCIM_KEY_bracketright, SCIM_KEY_backslash },
+ { SCIM_KEY_Ccedilla, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_acute, SCIM_KEY_bracketleft },
+ { SCIM_KEY_dead_tilde, SCIM_KEY_apostrophe },
+};
+
+static __Uint16Pair __us_to_portuguese_brazil_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_dead_tilde },
+ { SCIM_KEY_slash, SCIM_KEY_semicolon },
+ { SCIM_KEY_semicolon, SCIM_KEY_Ccedilla },
+ { SCIM_KEY_bracketleft, SCIM_KEY_dead_acute },
+ { SCIM_KEY_backslash, SCIM_KEY_bracketright },
+ { SCIM_KEY_bracketright, SCIM_KEY_bracketleft },
+ { SCIM_KEY_grave, SCIM_KEY_apostrophe },
+};
+
+static __Uint16Pair __portuguese_brazil_to_us_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_asciitilde },
+ { SCIM_KEY_colon, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_braceright },
+ { SCIM_KEY_braceright, SCIM_KEY_bar },
+ { SCIM_KEY_Ccedilla, SCIM_KEY_colon },
+ { SCIM_KEY_dead_grave, SCIM_KEY_braceleft },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_quotedbl },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_asciicircum },
+};
+
+static __Uint16Pair __us_to_portuguese_brazil_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_colon, SCIM_KEY_Ccedilla },
+ { SCIM_KEY_question, SCIM_KEY_colon },
+ { SCIM_KEY_asciicircum, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_braceleft, SCIM_KEY_dead_grave },
+ { SCIM_KEY_bar, SCIM_KEY_braceright },
+ { SCIM_KEY_braceright, SCIM_KEY_braceleft },
+ { SCIM_KEY_asciitilde, SCIM_KEY_quotedbl },
+};
+
+static __Uint16Pair __portuguese_brazil_to_us_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_asciitilde },
+ { SCIM_KEY_colon, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_braceright },
+ { SCIM_KEY_braceright, SCIM_KEY_bar },
+ { SCIM_KEY_ccedilla, SCIM_KEY_colon },
+ { SCIM_KEY_dead_grave, SCIM_KEY_braceleft },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_quotedbl },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_asciicircum },
+};
+
+static __Uint16Pair __us_to_portuguese_brazil_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_colon, SCIM_KEY_ccedilla },
+ { SCIM_KEY_question, SCIM_KEY_colon },
+ { SCIM_KEY_asciicircum, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_braceleft, SCIM_KEY_dead_grave },
+ { SCIM_KEY_bar, SCIM_KEY_braceright },
+ { SCIM_KEY_braceright, SCIM_KEY_braceleft },
+ { SCIM_KEY_asciitilde, SCIM_KEY_quotedbl },
+};
+
+static __Uint16Pair __portuguese_brazil_us_accents_to_us_normal [] = {
+ { SCIM_KEY_dead_grave, SCIM_KEY_grave },
+ { SCIM_KEY_dead_acute, SCIM_KEY_apostrophe },
+};
+
+static __Uint16Pair __us_to_portuguese_brazil_us_accents_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_dead_acute },
+ { SCIM_KEY_grave, SCIM_KEY_dead_grave },
+};
+
+static __Uint16Pair __portuguese_brazil_us_accents_to_us_caps [] = {
+ { SCIM_KEY_dead_grave, SCIM_KEY_grave },
+ { SCIM_KEY_dead_acute, SCIM_KEY_apostrophe },
+};
+
+static __Uint16Pair __us_to_portuguese_brazil_us_accents_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_dead_acute },
+ { SCIM_KEY_grave, SCIM_KEY_dead_grave },
+};
+
+static __Uint16Pair __portuguese_brazil_us_accents_to_us_shift [] = {
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_asciicircum },
+ { SCIM_KEY_dead_tilde, SCIM_KEY_asciitilde },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_quotedbl },
+};
+
+static __Uint16Pair __us_to_portuguese_brazil_us_accents_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_asciicircum, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_asciitilde, SCIM_KEY_dead_tilde },
+};
+
+static __Uint16Pair __portuguese_brazil_us_accents_to_us_caps_shift [] = {
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_asciicircum },
+ { SCIM_KEY_dead_tilde, SCIM_KEY_asciitilde },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_quotedbl },
+};
+
+static __Uint16Pair __us_to_portuguese_brazil_us_accents_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_asciicircum, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_asciitilde, SCIM_KEY_dead_tilde },
+};
+
+static __Uint16Pair __portuguese_to_us_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_minus },
+ { SCIM_KEY_plus, SCIM_KEY_bracketleft },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_backslash, SCIM_KEY_grave },
+ { SCIM_KEY_asciitilde, SCIM_KEY_backslash },
+ { SCIM_KEY_guillemotleft, SCIM_KEY_equal },
+ { SCIM_KEY_acute, SCIM_KEY_bracketright },
+ { SCIM_KEY_masculine, SCIM_KEY_apostrophe },
+ { SCIM_KEY_ccedilla, SCIM_KEY_semicolon },
+};
+
+static __Uint16Pair __us_to_portuguese_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_masculine },
+ { SCIM_KEY_minus, SCIM_KEY_apostrophe },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_ccedilla },
+ { SCIM_KEY_equal, SCIM_KEY_guillemotleft },
+ { SCIM_KEY_bracketleft, SCIM_KEY_plus },
+ { SCIM_KEY_backslash, SCIM_KEY_asciitilde },
+ { SCIM_KEY_bracketright, SCIM_KEY_acute },
+ { SCIM_KEY_grave, SCIM_KEY_backslash },
+};
+
+static __Uint16Pair __portuguese_to_us_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_minus },
+ { SCIM_KEY_plus, SCIM_KEY_bracketleft },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_backslash, SCIM_KEY_grave },
+ { SCIM_KEY_asciitilde, SCIM_KEY_backslash },
+ { SCIM_KEY_guillemotleft, SCIM_KEY_equal },
+ { SCIM_KEY_acute, SCIM_KEY_bracketright },
+ { SCIM_KEY_masculine, SCIM_KEY_apostrophe },
+ { SCIM_KEY_Ccedilla, SCIM_KEY_semicolon },
+};
+
+static __Uint16Pair __us_to_portuguese_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_masculine },
+ { SCIM_KEY_minus, SCIM_KEY_apostrophe },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_Ccedilla },
+ { SCIM_KEY_equal, SCIM_KEY_guillemotleft },
+ { SCIM_KEY_bracketleft, SCIM_KEY_plus },
+ { SCIM_KEY_backslash, SCIM_KEY_asciitilde },
+ { SCIM_KEY_bracketright, SCIM_KEY_acute },
+ { SCIM_KEY_grave, SCIM_KEY_backslash },
+};
+
+static __Uint16Pair __portuguese_to_us_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_braceleft },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_asciicircum, SCIM_KEY_bar },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_grave, SCIM_KEY_braceright },
+ { SCIM_KEY_bar, SCIM_KEY_asciitilde },
+ { SCIM_KEY_ordfeminine, SCIM_KEY_quotedbl },
+ { SCIM_KEY_guillemotright, SCIM_KEY_plus },
+ { SCIM_KEY_Ccedilla, SCIM_KEY_colon },
+};
+
+static __Uint16Pair __us_to_portuguese_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_ordfeminine },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_guillemotright },
+ { SCIM_KEY_colon, SCIM_KEY_Ccedilla },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_bar, SCIM_KEY_asciicircum },
+ { SCIM_KEY_braceright, SCIM_KEY_grave },
+ { SCIM_KEY_asciitilde, SCIM_KEY_bar },
+};
+
+static __Uint16Pair __portuguese_to_us_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_braceleft },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_asciicircum, SCIM_KEY_bar },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_grave, SCIM_KEY_braceright },
+ { SCIM_KEY_bar, SCIM_KEY_asciitilde },
+ { SCIM_KEY_ordfeminine, SCIM_KEY_quotedbl },
+ { SCIM_KEY_guillemotright, SCIM_KEY_plus },
+ { SCIM_KEY_ccedilla, SCIM_KEY_colon },
+};
+
+static __Uint16Pair __us_to_portuguese_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_ordfeminine },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_guillemotright },
+ { SCIM_KEY_colon, SCIM_KEY_ccedilla },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_bar, SCIM_KEY_asciicircum },
+ { SCIM_KEY_braceright, SCIM_KEY_grave },
+ { SCIM_KEY_asciitilde, SCIM_KEY_bar },
+};
+
+static __Uint16Pair __slovak_to_us_normal [] = {
+ { SCIM_KEY_plus, SCIM_KEY_1 },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_semicolon, SCIM_KEY_grave },
+ { SCIM_KEY_equal, SCIM_KEY_minus },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_section, SCIM_KEY_apostrophe },
+ { SCIM_KEY_aacute, SCIM_KEY_8 },
+ { SCIM_KEY_adiaeresis, SCIM_KEY_bracketright },
+ { SCIM_KEY_eacute, SCIM_KEY_0 },
+ { SCIM_KEY_iacute, SCIM_KEY_9 },
+ { SCIM_KEY_ocircumflex, SCIM_KEY_semicolon },
+ { SCIM_KEY_uacute, SCIM_KEY_bracketleft },
+ { SCIM_KEY_yacute, SCIM_KEY_7 },
+ { SCIM_KEY_lcaron, SCIM_KEY_2 },
+ { SCIM_KEY_scaron, SCIM_KEY_3 },
+ { SCIM_KEY_tcaron, SCIM_KEY_5 },
+ { SCIM_KEY_zcaron, SCIM_KEY_6 },
+ { SCIM_KEY_ccaron, SCIM_KEY_4 },
+ { SCIM_KEY_ncaron, SCIM_KEY_backslash },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+};
+
+static __Uint16Pair __us_to_slovak_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_section },
+ { SCIM_KEY_minus, SCIM_KEY_equal },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_0, SCIM_KEY_eacute },
+ { SCIM_KEY_1, SCIM_KEY_plus },
+ { SCIM_KEY_2, SCIM_KEY_lcaron },
+ { SCIM_KEY_3, SCIM_KEY_scaron },
+ { SCIM_KEY_4, SCIM_KEY_ccaron },
+ { SCIM_KEY_5, SCIM_KEY_tcaron },
+ { SCIM_KEY_6, SCIM_KEY_zcaron },
+ { SCIM_KEY_7, SCIM_KEY_yacute },
+ { SCIM_KEY_8, SCIM_KEY_aacute },
+ { SCIM_KEY_9, SCIM_KEY_iacute },
+ { SCIM_KEY_semicolon, SCIM_KEY_ocircumflex },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_bracketleft, SCIM_KEY_uacute },
+ { SCIM_KEY_backslash, SCIM_KEY_ncaron },
+ { SCIM_KEY_bracketright, SCIM_KEY_adiaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_semicolon },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+};
+
+static __Uint16Pair __slovak_to_us_caps [] = {
+ { SCIM_KEY_plus, SCIM_KEY_1 },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_semicolon, SCIM_KEY_grave },
+ { SCIM_KEY_equal, SCIM_KEY_minus },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_section, SCIM_KEY_apostrophe },
+ { SCIM_KEY_Aacute, SCIM_KEY_8 },
+ { SCIM_KEY_Adiaeresis, SCIM_KEY_bracketright },
+ { SCIM_KEY_Eacute, SCIM_KEY_0 },
+ { SCIM_KEY_Iacute, SCIM_KEY_9 },
+ { SCIM_KEY_Ocircumflex, SCIM_KEY_semicolon },
+ { SCIM_KEY_Uacute, SCIM_KEY_bracketleft },
+ { SCIM_KEY_Yacute, SCIM_KEY_7 },
+ { SCIM_KEY_Lcaron, SCIM_KEY_2 },
+ { SCIM_KEY_Scaron, SCIM_KEY_3 },
+ { SCIM_KEY_Tcaron, SCIM_KEY_5 },
+ { SCIM_KEY_Zcaron, SCIM_KEY_6 },
+ { SCIM_KEY_Ccaron, SCIM_KEY_4 },
+ { SCIM_KEY_Ncaron, SCIM_KEY_backslash },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+};
+
+static __Uint16Pair __us_to_slovak_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_section },
+ { SCIM_KEY_minus, SCIM_KEY_equal },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_0, SCIM_KEY_Eacute },
+ { SCIM_KEY_1, SCIM_KEY_plus },
+ { SCIM_KEY_2, SCIM_KEY_Lcaron },
+ { SCIM_KEY_3, SCIM_KEY_Scaron },
+ { SCIM_KEY_4, SCIM_KEY_Ccaron },
+ { SCIM_KEY_5, SCIM_KEY_Tcaron },
+ { SCIM_KEY_6, SCIM_KEY_Zcaron },
+ { SCIM_KEY_7, SCIM_KEY_Yacute },
+ { SCIM_KEY_8, SCIM_KEY_Aacute },
+ { SCIM_KEY_9, SCIM_KEY_Iacute },
+ { SCIM_KEY_semicolon, SCIM_KEY_Ocircumflex },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_bracketleft, SCIM_KEY_Uacute },
+ { SCIM_KEY_backslash, SCIM_KEY_Ncaron },
+ { SCIM_KEY_bracketright, SCIM_KEY_Adiaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_semicolon },
+};
+
+static __Uint16Pair __slovak_to_us_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_quotedbl },
+ { SCIM_KEY_quotedbl, SCIM_KEY_colon },
+ { SCIM_KEY_percent, SCIM_KEY_underscore },
+ { SCIM_KEY_parenleft, SCIM_KEY_braceright },
+ { SCIM_KEY_parenright, SCIM_KEY_bar },
+ { SCIM_KEY_slash, SCIM_KEY_braceleft },
+ { SCIM_KEY_0, SCIM_KEY_parenright },
+ { SCIM_KEY_1, SCIM_KEY_exclam },
+ { SCIM_KEY_2, SCIM_KEY_at },
+ { SCIM_KEY_3, SCIM_KEY_numbersign },
+ { SCIM_KEY_4, SCIM_KEY_dollar },
+ { SCIM_KEY_5, SCIM_KEY_percent },
+ { SCIM_KEY_6, SCIM_KEY_asciicircum },
+ { SCIM_KEY_7, SCIM_KEY_ampersand },
+ { SCIM_KEY_8, SCIM_KEY_asterisk },
+ { SCIM_KEY_9, SCIM_KEY_parenleft },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_question, SCIM_KEY_less },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_dead_abovering, SCIM_KEY_asciitilde },
+ { SCIM_KEY_dead_caron, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __us_to_slovak_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_1 },
+ { SCIM_KEY_quotedbl, SCIM_KEY_exclam },
+ { SCIM_KEY_numbersign, SCIM_KEY_3 },
+ { SCIM_KEY_dollar, SCIM_KEY_4 },
+ { SCIM_KEY_percent, SCIM_KEY_5 },
+ { SCIM_KEY_ampersand, SCIM_KEY_7 },
+ { SCIM_KEY_parenleft, SCIM_KEY_9 },
+ { SCIM_KEY_parenright, SCIM_KEY_0 },
+ { SCIM_KEY_asterisk, SCIM_KEY_8 },
+ { SCIM_KEY_plus, SCIM_KEY_dead_caron },
+ { SCIM_KEY_colon, SCIM_KEY_quotedbl },
+ { SCIM_KEY_less, SCIM_KEY_question },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_2 },
+ { SCIM_KEY_Y, SCIM_KEY_Z },
+ { SCIM_KEY_Z, SCIM_KEY_Y },
+ { SCIM_KEY_asciicircum, SCIM_KEY_6 },
+ { SCIM_KEY_underscore, SCIM_KEY_percent },
+ { SCIM_KEY_braceleft, SCIM_KEY_slash },
+ { SCIM_KEY_bar, SCIM_KEY_parenright },
+ { SCIM_KEY_braceright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asciitilde, SCIM_KEY_dead_abovering },
+};
+
+static __Uint16Pair __slovak_to_us_caps_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_quotedbl },
+ { SCIM_KEY_quotedbl, SCIM_KEY_colon },
+ { SCIM_KEY_percent, SCIM_KEY_underscore },
+ { SCIM_KEY_parenleft, SCIM_KEY_braceright },
+ { SCIM_KEY_parenright, SCIM_KEY_bar },
+ { SCIM_KEY_slash, SCIM_KEY_braceleft },
+ { SCIM_KEY_0, SCIM_KEY_parenright },
+ { SCIM_KEY_1, SCIM_KEY_exclam },
+ { SCIM_KEY_2, SCIM_KEY_at },
+ { SCIM_KEY_3, SCIM_KEY_numbersign },
+ { SCIM_KEY_4, SCIM_KEY_dollar },
+ { SCIM_KEY_5, SCIM_KEY_percent },
+ { SCIM_KEY_6, SCIM_KEY_asciicircum },
+ { SCIM_KEY_7, SCIM_KEY_ampersand },
+ { SCIM_KEY_8, SCIM_KEY_asterisk },
+ { SCIM_KEY_9, SCIM_KEY_parenleft },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_question, SCIM_KEY_less },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_dead_abovering, SCIM_KEY_asciitilde },
+ { SCIM_KEY_dead_caron, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __us_to_slovak_caps_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_1 },
+ { SCIM_KEY_quotedbl, SCIM_KEY_exclam },
+ { SCIM_KEY_numbersign, SCIM_KEY_3 },
+ { SCIM_KEY_dollar, SCIM_KEY_4 },
+ { SCIM_KEY_percent, SCIM_KEY_5 },
+ { SCIM_KEY_ampersand, SCIM_KEY_7 },
+ { SCIM_KEY_parenleft, SCIM_KEY_9 },
+ { SCIM_KEY_parenright, SCIM_KEY_0 },
+ { SCIM_KEY_asterisk, SCIM_KEY_8 },
+ { SCIM_KEY_plus, SCIM_KEY_dead_caron },
+ { SCIM_KEY_colon, SCIM_KEY_quotedbl },
+ { SCIM_KEY_less, SCIM_KEY_question },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_2 },
+ { SCIM_KEY_asciicircum, SCIM_KEY_6 },
+ { SCIM_KEY_underscore, SCIM_KEY_percent },
+ { SCIM_KEY_y, SCIM_KEY_z },
+ { SCIM_KEY_z, SCIM_KEY_y },
+ { SCIM_KEY_braceleft, SCIM_KEY_slash },
+ { SCIM_KEY_bar, SCIM_KEY_parenright },
+ { SCIM_KEY_braceright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asciitilde, SCIM_KEY_dead_abovering },
+};
+
+static __Uint16Pair __slovak_qwerty_to_us_normal [] = {
+ { SCIM_KEY_plus, SCIM_KEY_1 },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_semicolon, SCIM_KEY_grave },
+ { SCIM_KEY_equal, SCIM_KEY_minus },
+ { SCIM_KEY_section, SCIM_KEY_apostrophe },
+ { SCIM_KEY_aacute, SCIM_KEY_8 },
+ { SCIM_KEY_adiaeresis, SCIM_KEY_bracketright },
+ { SCIM_KEY_eacute, SCIM_KEY_0 },
+ { SCIM_KEY_iacute, SCIM_KEY_9 },
+ { SCIM_KEY_ocircumflex, SCIM_KEY_semicolon },
+ { SCIM_KEY_uacute, SCIM_KEY_bracketleft },
+ { SCIM_KEY_yacute, SCIM_KEY_7 },
+ { SCIM_KEY_lcaron, SCIM_KEY_2 },
+ { SCIM_KEY_scaron, SCIM_KEY_3 },
+ { SCIM_KEY_tcaron, SCIM_KEY_5 },
+ { SCIM_KEY_zcaron, SCIM_KEY_6 },
+ { SCIM_KEY_ccaron, SCIM_KEY_4 },
+ { SCIM_KEY_ncaron, SCIM_KEY_backslash },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+};
+
+static __Uint16Pair __us_to_slovak_qwerty_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_section },
+ { SCIM_KEY_minus, SCIM_KEY_equal },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_0, SCIM_KEY_eacute },
+ { SCIM_KEY_1, SCIM_KEY_plus },
+ { SCIM_KEY_2, SCIM_KEY_lcaron },
+ { SCIM_KEY_3, SCIM_KEY_scaron },
+ { SCIM_KEY_4, SCIM_KEY_ccaron },
+ { SCIM_KEY_5, SCIM_KEY_tcaron },
+ { SCIM_KEY_6, SCIM_KEY_zcaron },
+ { SCIM_KEY_7, SCIM_KEY_yacute },
+ { SCIM_KEY_8, SCIM_KEY_aacute },
+ { SCIM_KEY_9, SCIM_KEY_iacute },
+ { SCIM_KEY_semicolon, SCIM_KEY_ocircumflex },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_bracketleft, SCIM_KEY_uacute },
+ { SCIM_KEY_backslash, SCIM_KEY_ncaron },
+ { SCIM_KEY_bracketright, SCIM_KEY_adiaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_semicolon },
+};
+
+static __Uint16Pair __slovak_qwerty_to_us_caps [] = {
+ { SCIM_KEY_plus, SCIM_KEY_1 },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_semicolon, SCIM_KEY_grave },
+ { SCIM_KEY_equal, SCIM_KEY_minus },
+ { SCIM_KEY_section, SCIM_KEY_apostrophe },
+ { SCIM_KEY_Aacute, SCIM_KEY_8 },
+ { SCIM_KEY_Adiaeresis, SCIM_KEY_bracketright },
+ { SCIM_KEY_Eacute, SCIM_KEY_0 },
+ { SCIM_KEY_Iacute, SCIM_KEY_9 },
+ { SCIM_KEY_Ocircumflex, SCIM_KEY_semicolon },
+ { SCIM_KEY_Uacute, SCIM_KEY_bracketleft },
+ { SCIM_KEY_Yacute, SCIM_KEY_7 },
+ { SCIM_KEY_Lcaron, SCIM_KEY_2 },
+ { SCIM_KEY_Scaron, SCIM_KEY_3 },
+ { SCIM_KEY_Tcaron, SCIM_KEY_5 },
+ { SCIM_KEY_Zcaron, SCIM_KEY_6 },
+ { SCIM_KEY_Ccaron, SCIM_KEY_4 },
+ { SCIM_KEY_Ncaron, SCIM_KEY_backslash },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+};
+
+static __Uint16Pair __us_to_slovak_qwerty_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_section },
+ { SCIM_KEY_minus, SCIM_KEY_equal },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_0, SCIM_KEY_Eacute },
+ { SCIM_KEY_1, SCIM_KEY_plus },
+ { SCIM_KEY_2, SCIM_KEY_Lcaron },
+ { SCIM_KEY_3, SCIM_KEY_Scaron },
+ { SCIM_KEY_4, SCIM_KEY_Ccaron },
+ { SCIM_KEY_5, SCIM_KEY_Tcaron },
+ { SCIM_KEY_6, SCIM_KEY_Zcaron },
+ { SCIM_KEY_7, SCIM_KEY_Yacute },
+ { SCIM_KEY_8, SCIM_KEY_Aacute },
+ { SCIM_KEY_9, SCIM_KEY_Iacute },
+ { SCIM_KEY_semicolon, SCIM_KEY_Ocircumflex },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_bracketleft, SCIM_KEY_Uacute },
+ { SCIM_KEY_backslash, SCIM_KEY_Ncaron },
+ { SCIM_KEY_bracketright, SCIM_KEY_Adiaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_semicolon },
+};
+
+static __Uint16Pair __slovak_qwerty_to_us_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_quotedbl },
+ { SCIM_KEY_quotedbl, SCIM_KEY_colon },
+ { SCIM_KEY_percent, SCIM_KEY_underscore },
+ { SCIM_KEY_parenleft, SCIM_KEY_braceright },
+ { SCIM_KEY_parenright, SCIM_KEY_bar },
+ { SCIM_KEY_slash, SCIM_KEY_braceleft },
+ { SCIM_KEY_0, SCIM_KEY_parenright },
+ { SCIM_KEY_1, SCIM_KEY_exclam },
+ { SCIM_KEY_2, SCIM_KEY_at },
+ { SCIM_KEY_3, SCIM_KEY_numbersign },
+ { SCIM_KEY_4, SCIM_KEY_dollar },
+ { SCIM_KEY_5, SCIM_KEY_percent },
+ { SCIM_KEY_6, SCIM_KEY_asciicircum },
+ { SCIM_KEY_7, SCIM_KEY_ampersand },
+ { SCIM_KEY_8, SCIM_KEY_asterisk },
+ { SCIM_KEY_9, SCIM_KEY_parenleft },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_question, SCIM_KEY_less },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_dead_abovering, SCIM_KEY_asciitilde },
+ { SCIM_KEY_dead_caron, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __us_to_slovak_qwerty_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_1 },
+ { SCIM_KEY_quotedbl, SCIM_KEY_exclam },
+ { SCIM_KEY_numbersign, SCIM_KEY_3 },
+ { SCIM_KEY_dollar, SCIM_KEY_4 },
+ { SCIM_KEY_percent, SCIM_KEY_5 },
+ { SCIM_KEY_ampersand, SCIM_KEY_7 },
+ { SCIM_KEY_parenleft, SCIM_KEY_9 },
+ { SCIM_KEY_parenright, SCIM_KEY_0 },
+ { SCIM_KEY_asterisk, SCIM_KEY_8 },
+ { SCIM_KEY_plus, SCIM_KEY_dead_caron },
+ { SCIM_KEY_colon, SCIM_KEY_quotedbl },
+ { SCIM_KEY_less, SCIM_KEY_question },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_2 },
+ { SCIM_KEY_asciicircum, SCIM_KEY_6 },
+ { SCIM_KEY_underscore, SCIM_KEY_percent },
+ { SCIM_KEY_braceleft, SCIM_KEY_slash },
+ { SCIM_KEY_bar, SCIM_KEY_parenright },
+ { SCIM_KEY_braceright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asciitilde, SCIM_KEY_dead_abovering },
+};
+
+static __Uint16Pair __slovak_qwerty_to_us_caps_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_quotedbl },
+ { SCIM_KEY_quotedbl, SCIM_KEY_colon },
+ { SCIM_KEY_percent, SCIM_KEY_underscore },
+ { SCIM_KEY_parenleft, SCIM_KEY_braceright },
+ { SCIM_KEY_parenright, SCIM_KEY_bar },
+ { SCIM_KEY_slash, SCIM_KEY_braceleft },
+ { SCIM_KEY_0, SCIM_KEY_parenright },
+ { SCIM_KEY_1, SCIM_KEY_exclam },
+ { SCIM_KEY_2, SCIM_KEY_at },
+ { SCIM_KEY_3, SCIM_KEY_numbersign },
+ { SCIM_KEY_4, SCIM_KEY_dollar },
+ { SCIM_KEY_5, SCIM_KEY_percent },
+ { SCIM_KEY_6, SCIM_KEY_asciicircum },
+ { SCIM_KEY_7, SCIM_KEY_ampersand },
+ { SCIM_KEY_8, SCIM_KEY_asterisk },
+ { SCIM_KEY_9, SCIM_KEY_parenleft },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_question, SCIM_KEY_less },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_dead_abovering, SCIM_KEY_asciitilde },
+ { SCIM_KEY_dead_caron, SCIM_KEY_plus },
+};
+
+static __Uint16Pair __us_to_slovak_qwerty_caps_shift [] = {
+ { SCIM_KEY_exclam, SCIM_KEY_1 },
+ { SCIM_KEY_quotedbl, SCIM_KEY_exclam },
+ { SCIM_KEY_numbersign, SCIM_KEY_3 },
+ { SCIM_KEY_dollar, SCIM_KEY_4 },
+ { SCIM_KEY_percent, SCIM_KEY_5 },
+ { SCIM_KEY_ampersand, SCIM_KEY_7 },
+ { SCIM_KEY_parenleft, SCIM_KEY_9 },
+ { SCIM_KEY_parenright, SCIM_KEY_0 },
+ { SCIM_KEY_asterisk, SCIM_KEY_8 },
+ { SCIM_KEY_plus, SCIM_KEY_dead_caron },
+ { SCIM_KEY_colon, SCIM_KEY_quotedbl },
+ { SCIM_KEY_less, SCIM_KEY_question },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_2 },
+ { SCIM_KEY_asciicircum, SCIM_KEY_6 },
+ { SCIM_KEY_underscore, SCIM_KEY_percent },
+ { SCIM_KEY_braceleft, SCIM_KEY_slash },
+ { SCIM_KEY_bar, SCIM_KEY_parenright },
+ { SCIM_KEY_braceright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asciitilde, SCIM_KEY_dead_abovering },
+};
+
+static __Uint16Pair __spanish_cp850_to_us_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_minus },
+ { SCIM_KEY_plus, SCIM_KEY_bracketright },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_exclamdown, SCIM_KEY_equal },
+ { SCIM_KEY_masculine, SCIM_KEY_grave },
+ { SCIM_KEY_ccedilla, SCIM_KEY_backslash },
+ { SCIM_KEY_ntilde, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_grave, SCIM_KEY_bracketleft },
+ { SCIM_KEY_dead_acute, SCIM_KEY_apostrophe },
+};
+
+static __Uint16Pair __us_to_spanish_cp850_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_dead_acute },
+ { SCIM_KEY_minus, SCIM_KEY_apostrophe },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_ntilde },
+ { SCIM_KEY_equal, SCIM_KEY_exclamdown },
+ { SCIM_KEY_bracketleft, SCIM_KEY_dead_grave },
+ { SCIM_KEY_backslash, SCIM_KEY_ccedilla },
+ { SCIM_KEY_bracketright, SCIM_KEY_plus },
+ { SCIM_KEY_grave, SCIM_KEY_masculine },
+};
+
+static __Uint16Pair __spanish_cp850_to_us_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_minus },
+ { SCIM_KEY_plus, SCIM_KEY_bracketright },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_exclamdown, SCIM_KEY_equal },
+ { SCIM_KEY_masculine, SCIM_KEY_grave },
+ { SCIM_KEY_Ccedilla, SCIM_KEY_backslash },
+ { SCIM_KEY_Ntilde, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_grave, SCIM_KEY_bracketleft },
+ { SCIM_KEY_dead_acute, SCIM_KEY_apostrophe },
+};
+
+static __Uint16Pair __us_to_spanish_cp850_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_dead_acute },
+ { SCIM_KEY_minus, SCIM_KEY_apostrophe },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_Ntilde },
+ { SCIM_KEY_equal, SCIM_KEY_exclamdown },
+ { SCIM_KEY_bracketleft, SCIM_KEY_dead_grave },
+ { SCIM_KEY_backslash, SCIM_KEY_Ccedilla },
+ { SCIM_KEY_bracketright, SCIM_KEY_plus },
+ { SCIM_KEY_grave, SCIM_KEY_masculine },
+};
+
+static __Uint16Pair __spanish_cp850_to_us_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_braceright },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_ordfeminine, SCIM_KEY_asciitilde },
+ { SCIM_KEY_periodcentered, SCIM_KEY_numbersign },
+ { SCIM_KEY_questiondown, SCIM_KEY_plus },
+ { SCIM_KEY_Ccedilla, SCIM_KEY_bar },
+ { SCIM_KEY_Ntilde, SCIM_KEY_colon },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_braceleft },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_quotedbl },
+};
+
+static __Uint16Pair __us_to_spanish_cp850_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_numbersign, SCIM_KEY_periodcentered },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_questiondown },
+ { SCIM_KEY_colon, SCIM_KEY_Ntilde },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_bar, SCIM_KEY_Ccedilla },
+ { SCIM_KEY_braceright, SCIM_KEY_asterisk },
+ { SCIM_KEY_asciitilde, SCIM_KEY_ordfeminine },
+};
+
+static __Uint16Pair __spanish_cp850_to_us_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_braceright },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_ordfeminine, SCIM_KEY_asciitilde },
+ { SCIM_KEY_periodcentered, SCIM_KEY_numbersign },
+ { SCIM_KEY_questiondown, SCIM_KEY_plus },
+ { SCIM_KEY_ccedilla, SCIM_KEY_bar },
+ { SCIM_KEY_ntilde, SCIM_KEY_colon },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_braceleft },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_quotedbl },
+};
+
+static __Uint16Pair __us_to_spanish_cp850_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_numbersign, SCIM_KEY_periodcentered },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_questiondown },
+ { SCIM_KEY_colon, SCIM_KEY_ntilde },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_bar, SCIM_KEY_ccedilla },
+ { SCIM_KEY_braceright, SCIM_KEY_asterisk },
+ { SCIM_KEY_asciitilde, SCIM_KEY_ordfeminine },
+};
+
+static __Uint16Pair __spanish_to_us_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_minus },
+ { SCIM_KEY_plus, SCIM_KEY_bracketright },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_exclamdown, SCIM_KEY_equal },
+ { SCIM_KEY_masculine, SCIM_KEY_grave },
+ { SCIM_KEY_ccedilla, SCIM_KEY_backslash },
+ { SCIM_KEY_ntilde, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_grave, SCIM_KEY_bracketleft },
+ { SCIM_KEY_dead_acute, SCIM_KEY_apostrophe },
+};
+
+static __Uint16Pair __us_to_spanish_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_dead_acute },
+ { SCIM_KEY_minus, SCIM_KEY_apostrophe },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_ntilde },
+ { SCIM_KEY_equal, SCIM_KEY_exclamdown },
+ { SCIM_KEY_bracketleft, SCIM_KEY_dead_grave },
+ { SCIM_KEY_backslash, SCIM_KEY_ccedilla },
+ { SCIM_KEY_bracketright, SCIM_KEY_plus },
+ { SCIM_KEY_grave, SCIM_KEY_masculine },
+};
+
+static __Uint16Pair __spanish_to_us_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_minus },
+ { SCIM_KEY_plus, SCIM_KEY_bracketright },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_exclamdown, SCIM_KEY_equal },
+ { SCIM_KEY_masculine, SCIM_KEY_grave },
+ { SCIM_KEY_Ccedilla, SCIM_KEY_backslash },
+ { SCIM_KEY_Ntilde, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_grave, SCIM_KEY_bracketleft },
+ { SCIM_KEY_dead_acute, SCIM_KEY_apostrophe },
+};
+
+static __Uint16Pair __us_to_spanish_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_dead_acute },
+ { SCIM_KEY_minus, SCIM_KEY_apostrophe },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_Ntilde },
+ { SCIM_KEY_equal, SCIM_KEY_exclamdown },
+ { SCIM_KEY_bracketleft, SCIM_KEY_dead_grave },
+ { SCIM_KEY_backslash, SCIM_KEY_Ccedilla },
+ { SCIM_KEY_bracketright, SCIM_KEY_plus },
+ { SCIM_KEY_grave, SCIM_KEY_masculine },
+};
+
+static __Uint16Pair __spanish_to_us_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_braceright },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_ordfeminine, SCIM_KEY_asciitilde },
+ { SCIM_KEY_periodcentered, SCIM_KEY_numbersign },
+ { SCIM_KEY_questiondown, SCIM_KEY_plus },
+ { SCIM_KEY_Ccedilla, SCIM_KEY_bar },
+ { SCIM_KEY_Ntilde, SCIM_KEY_colon },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_braceleft },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_quotedbl },
+};
+
+static __Uint16Pair __us_to_spanish_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_numbersign, SCIM_KEY_periodcentered },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_questiondown },
+ { SCIM_KEY_colon, SCIM_KEY_Ntilde },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_bar, SCIM_KEY_Ccedilla },
+ { SCIM_KEY_braceright, SCIM_KEY_asterisk },
+ { SCIM_KEY_asciitilde, SCIM_KEY_ordfeminine },
+};
+
+static __Uint16Pair __spanish_to_us_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_braceright },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_ordfeminine, SCIM_KEY_asciitilde },
+ { SCIM_KEY_periodcentered, SCIM_KEY_numbersign },
+ { SCIM_KEY_questiondown, SCIM_KEY_plus },
+ { SCIM_KEY_ccedilla, SCIM_KEY_bar },
+ { SCIM_KEY_ntilde, SCIM_KEY_colon },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_braceleft },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_quotedbl },
+};
+
+static __Uint16Pair __us_to_spanish_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_numbersign, SCIM_KEY_periodcentered },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_questiondown },
+ { SCIM_KEY_colon, SCIM_KEY_ntilde },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_bar, SCIM_KEY_ccedilla },
+ { SCIM_KEY_braceright, SCIM_KEY_asterisk },
+ { SCIM_KEY_asciitilde, SCIM_KEY_ordfeminine },
+};
+
+static __Uint16Pair __spanish_latin_america_to_us_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_minus },
+ { SCIM_KEY_plus, SCIM_KEY_bracketright },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_exclamdown, SCIM_KEY_equal },
+ { SCIM_KEY_masculine, SCIM_KEY_grave },
+ { SCIM_KEY_ccedilla, SCIM_KEY_backslash },
+ { SCIM_KEY_ntilde, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_grave, SCIM_KEY_bracketleft },
+ { SCIM_KEY_dead_acute, SCIM_KEY_apostrophe },
+};
+
+static __Uint16Pair __us_to_spanish_latin_america_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_dead_acute },
+ { SCIM_KEY_minus, SCIM_KEY_apostrophe },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_ntilde },
+ { SCIM_KEY_equal, SCIM_KEY_exclamdown },
+ { SCIM_KEY_bracketleft, SCIM_KEY_dead_grave },
+ { SCIM_KEY_backslash, SCIM_KEY_ccedilla },
+ { SCIM_KEY_bracketright, SCIM_KEY_plus },
+ { SCIM_KEY_grave, SCIM_KEY_masculine },
+};
+
+static __Uint16Pair __spanish_latin_america_to_us_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_minus },
+ { SCIM_KEY_plus, SCIM_KEY_bracketright },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_exclamdown, SCIM_KEY_equal },
+ { SCIM_KEY_masculine, SCIM_KEY_grave },
+ { SCIM_KEY_Ccedilla, SCIM_KEY_backslash },
+ { SCIM_KEY_Ntilde, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_grave, SCIM_KEY_bracketleft },
+ { SCIM_KEY_dead_acute, SCIM_KEY_apostrophe },
+};
+
+static __Uint16Pair __us_to_spanish_latin_america_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_dead_acute },
+ { SCIM_KEY_minus, SCIM_KEY_apostrophe },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_Ntilde },
+ { SCIM_KEY_equal, SCIM_KEY_exclamdown },
+ { SCIM_KEY_bracketleft, SCIM_KEY_dead_grave },
+ { SCIM_KEY_backslash, SCIM_KEY_Ccedilla },
+ { SCIM_KEY_bracketright, SCIM_KEY_plus },
+ { SCIM_KEY_grave, SCIM_KEY_masculine },
+};
+
+static __Uint16Pair __spanish_latin_america_to_us_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_braceright },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_ordfeminine, SCIM_KEY_asciitilde },
+ { SCIM_KEY_periodcentered, SCIM_KEY_numbersign },
+ { SCIM_KEY_questiondown, SCIM_KEY_plus },
+ { SCIM_KEY_Ccedilla, SCIM_KEY_bar },
+ { SCIM_KEY_Ntilde, SCIM_KEY_colon },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_braceleft },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_quotedbl },
+};
+
+static __Uint16Pair __us_to_spanish_latin_america_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_numbersign, SCIM_KEY_periodcentered },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_questiondown },
+ { SCIM_KEY_colon, SCIM_KEY_Ntilde },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_bar, SCIM_KEY_Ccedilla },
+ { SCIM_KEY_braceright, SCIM_KEY_asterisk },
+ { SCIM_KEY_asciitilde, SCIM_KEY_ordfeminine },
+};
+
+static __Uint16Pair __spanish_latin_america_to_us_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_braceright },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_ordfeminine, SCIM_KEY_asciitilde },
+ { SCIM_KEY_periodcentered, SCIM_KEY_numbersign },
+ { SCIM_KEY_questiondown, SCIM_KEY_plus },
+ { SCIM_KEY_ccedilla, SCIM_KEY_bar },
+ { SCIM_KEY_ntilde, SCIM_KEY_colon },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_braceleft },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_quotedbl },
+};
+
+static __Uint16Pair __us_to_spanish_latin_america_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_numbersign, SCIM_KEY_periodcentered },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_questiondown },
+ { SCIM_KEY_colon, SCIM_KEY_ntilde },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_bar, SCIM_KEY_ccedilla },
+ { SCIM_KEY_braceright, SCIM_KEY_asterisk },
+ { SCIM_KEY_asciitilde, SCIM_KEY_ordfeminine },
+};
+
+static __Uint16Pair __swedish_to_us_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_backslash },
+ { SCIM_KEY_plus, SCIM_KEY_minus },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_section, SCIM_KEY_grave },
+ { SCIM_KEY_adiaeresis, SCIM_KEY_apostrophe },
+ { SCIM_KEY_aring, SCIM_KEY_bracketleft },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_bracketright },
+};
+
+static __Uint16Pair __us_to_swedish_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_adiaeresis },
+ { SCIM_KEY_minus, SCIM_KEY_plus },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_bracketleft, SCIM_KEY_aring },
+ { SCIM_KEY_backslash, SCIM_KEY_apostrophe },
+ { SCIM_KEY_bracketright, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_section },
+};
+
+static __Uint16Pair __swedish_to_us_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_backslash },
+ { SCIM_KEY_plus, SCIM_KEY_minus },
+ { SCIM_KEY_minus, SCIM_KEY_slash },
+ { SCIM_KEY_section, SCIM_KEY_grave },
+ { SCIM_KEY_Adiaeresis, SCIM_KEY_apostrophe },
+ { SCIM_KEY_Aring, SCIM_KEY_bracketleft },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_semicolon },
+ { SCIM_KEY_dead_acute, SCIM_KEY_equal },
+ { SCIM_KEY_dead_diaeresis, SCIM_KEY_bracketright },
+};
+
+static __Uint16Pair __us_to_swedish_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_Adiaeresis },
+ { SCIM_KEY_minus, SCIM_KEY_plus },
+ { SCIM_KEY_slash, SCIM_KEY_minus },
+ { SCIM_KEY_semicolon, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_equal, SCIM_KEY_dead_acute },
+ { SCIM_KEY_bracketleft, SCIM_KEY_Aring },
+ { SCIM_KEY_backslash, SCIM_KEY_apostrophe },
+ { SCIM_KEY_bracketright, SCIM_KEY_dead_diaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_section },
+};
+
+static __Uint16Pair __swedish_to_us_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_bar },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_currency, SCIM_KEY_dollar },
+ { SCIM_KEY_onehalf, SCIM_KEY_asciitilde },
+ { SCIM_KEY_Adiaeresis, SCIM_KEY_quotedbl },
+ { SCIM_KEY_Aring, SCIM_KEY_braceleft },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_colon },
+ { SCIM_KEY_dead_grave, SCIM_KEY_plus },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_braceright },
+};
+
+static __Uint16Pair __us_to_swedish_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_Adiaeresis },
+ { SCIM_KEY_dollar, SCIM_KEY_currency },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dead_grave },
+ { SCIM_KEY_colon, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_Aring },
+ { SCIM_KEY_bar, SCIM_KEY_asterisk },
+ { SCIM_KEY_braceright, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_asciitilde, SCIM_KEY_onehalf },
+};
+
+static __Uint16Pair __swedish_to_us_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_bar },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_currency, SCIM_KEY_dollar },
+ { SCIM_KEY_onehalf, SCIM_KEY_asciitilde },
+ { SCIM_KEY_adiaeresis, SCIM_KEY_quotedbl },
+ { SCIM_KEY_aring, SCIM_KEY_braceleft },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_colon },
+ { SCIM_KEY_dead_grave, SCIM_KEY_plus },
+ { SCIM_KEY_dead_circumflex, SCIM_KEY_braceright },
+};
+
+static __Uint16Pair __us_to_swedish_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_adiaeresis },
+ { SCIM_KEY_dollar, SCIM_KEY_currency },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dead_grave },
+ { SCIM_KEY_colon, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_aring },
+ { SCIM_KEY_bar, SCIM_KEY_asterisk },
+ { SCIM_KEY_braceright, SCIM_KEY_dead_circumflex },
+ { SCIM_KEY_asciitilde, SCIM_KEY_onehalf },
+};
+
+static __Uint16Pair __turkish_to_us_normal [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_grave },
+ { SCIM_KEY_asterisk, SCIM_KEY_minus },
+ { SCIM_KEY_comma, SCIM_KEY_backslash },
+ { SCIM_KEY_minus, SCIM_KEY_equal },
+ { SCIM_KEY_period, SCIM_KEY_slash },
+ { SCIM_KEY_i, SCIM_KEY_apostrophe },
+ { SCIM_KEY_ccedilla, SCIM_KEY_period },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_comma },
+ { SCIM_KEY_udiaeresis, SCIM_KEY_bracketright },
+ { SCIM_KEY_scedilla, SCIM_KEY_semicolon },
+ { SCIM_KEY_idotless, SCIM_KEY_i },
+ { SCIM_KEY_gbreve, SCIM_KEY_bracketleft },
+};
+
+static __Uint16Pair __us_to_turkish_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_i },
+ { SCIM_KEY_comma, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_minus, SCIM_KEY_asterisk },
+ { SCIM_KEY_period, SCIM_KEY_ccedilla },
+ { SCIM_KEY_slash, SCIM_KEY_period },
+ { SCIM_KEY_semicolon, SCIM_KEY_scedilla },
+ { SCIM_KEY_equal, SCIM_KEY_minus },
+ { SCIM_KEY_bracketleft, SCIM_KEY_gbreve },
+ { SCIM_KEY_backslash, SCIM_KEY_comma },
+ { SCIM_KEY_bracketright, SCIM_KEY_udiaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_quotedbl },
+ { SCIM_KEY_i, SCIM_KEY_idotless },
+};
+
+static __Uint16Pair __turkish_to_us_caps [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_grave },
+ { SCIM_KEY_asterisk, SCIM_KEY_minus },
+ { SCIM_KEY_comma, SCIM_KEY_backslash },
+ { SCIM_KEY_minus, SCIM_KEY_equal },
+ { SCIM_KEY_period, SCIM_KEY_slash },
+ { SCIM_KEY_I, SCIM_KEY_apostrophe },
+ { SCIM_KEY_Ccedilla, SCIM_KEY_period },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_comma },
+ { SCIM_KEY_Udiaeresis, SCIM_KEY_bracketright },
+ { SCIM_KEY_Scedilla, SCIM_KEY_semicolon },
+ { SCIM_KEY_Gbreve, SCIM_KEY_bracketleft },
+ { SCIM_KEY_idotless, SCIM_KEY_I },
+};
+
+static __Uint16Pair __us_to_turkish_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_I },
+ { SCIM_KEY_comma, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_minus, SCIM_KEY_asterisk },
+ { SCIM_KEY_period, SCIM_KEY_Ccedilla },
+ { SCIM_KEY_slash, SCIM_KEY_period },
+ { SCIM_KEY_semicolon, SCIM_KEY_Scedilla },
+ { SCIM_KEY_equal, SCIM_KEY_minus },
+ { SCIM_KEY_I, SCIM_KEY_idotless },
+ { SCIM_KEY_bracketleft, SCIM_KEY_Gbreve },
+ { SCIM_KEY_backslash, SCIM_KEY_comma },
+ { SCIM_KEY_bracketright, SCIM_KEY_Udiaeresis },
+ { SCIM_KEY_grave, SCIM_KEY_quotedbl },
+};
+
+static __Uint16Pair __turkish_to_us_shift [] = {
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_apostrophe, SCIM_KEY_at },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dollar },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_question },
+ { SCIM_KEY_semicolon, SCIM_KEY_bar },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_backslash, SCIM_KEY_asciitilde },
+ { SCIM_KEY_asciicircum, SCIM_KEY_numbersign },
+ { SCIM_KEY_underscore, SCIM_KEY_plus },
+ { SCIM_KEY_Ccedilla, SCIM_KEY_greater },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_less },
+ { SCIM_KEY_Udiaeresis, SCIM_KEY_braceright },
+ { SCIM_KEY_Scedilla, SCIM_KEY_colon },
+ { SCIM_KEY_Iabovedot, SCIM_KEY_quotedbl },
+ { SCIM_KEY_Gbreve, SCIM_KEY_braceleft },
+};
+
+static __Uint16Pair __us_to_turkish_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_Iabovedot },
+ { SCIM_KEY_numbersign, SCIM_KEY_asciicircum },
+ { SCIM_KEY_dollar, SCIM_KEY_plus },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_underscore },
+ { SCIM_KEY_colon, SCIM_KEY_Scedilla },
+ { SCIM_KEY_less, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_greater, SCIM_KEY_Ccedilla },
+ { SCIM_KEY_question, SCIM_KEY_colon },
+ { SCIM_KEY_at, SCIM_KEY_apostrophe },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_braceleft, SCIM_KEY_Gbreve },
+ { SCIM_KEY_bar, SCIM_KEY_semicolon },
+ { SCIM_KEY_braceright, SCIM_KEY_Udiaeresis },
+ { SCIM_KEY_asciitilde, SCIM_KEY_backslash },
+};
+
+static __Uint16Pair __turkish_to_us_caps_shift [] = {
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_apostrophe, SCIM_KEY_at },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_dollar },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_question },
+ { SCIM_KEY_semicolon, SCIM_KEY_bar },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_underscore },
+ { SCIM_KEY_I, SCIM_KEY_i },
+ { SCIM_KEY_backslash, SCIM_KEY_asciitilde },
+ { SCIM_KEY_asciicircum, SCIM_KEY_numbersign },
+ { SCIM_KEY_underscore, SCIM_KEY_plus },
+ { SCIM_KEY_ccedilla, SCIM_KEY_greater },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_less },
+ { SCIM_KEY_udiaeresis, SCIM_KEY_braceright },
+ { SCIM_KEY_scedilla, SCIM_KEY_colon },
+ { SCIM_KEY_Iabovedot, SCIM_KEY_quotedbl },
+ { SCIM_KEY_gbreve, SCIM_KEY_braceleft },
+};
+
+static __Uint16Pair __us_to_turkish_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_Iabovedot },
+ { SCIM_KEY_numbersign, SCIM_KEY_asciicircum },
+ { SCIM_KEY_dollar, SCIM_KEY_plus },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_underscore },
+ { SCIM_KEY_colon, SCIM_KEY_scedilla },
+ { SCIM_KEY_less, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_greater, SCIM_KEY_ccedilla },
+ { SCIM_KEY_question, SCIM_KEY_colon },
+ { SCIM_KEY_at, SCIM_KEY_apostrophe },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_question },
+ { SCIM_KEY_i, SCIM_KEY_I },
+ { SCIM_KEY_braceleft, SCIM_KEY_gbreve },
+ { SCIM_KEY_bar, SCIM_KEY_semicolon },
+ { SCIM_KEY_braceright, SCIM_KEY_udiaeresis },
+ { SCIM_KEY_asciitilde, SCIM_KEY_backslash },
+};
+
+static __Uint16Pair __uk_to_us_normal [] = {
+ { SCIM_KEY_numbersign, SCIM_KEY_backslash },
+};
+
+static __Uint16Pair __us_to_uk_normal [] = {
+ { SCIM_KEY_backslash, SCIM_KEY_numbersign },
+};
+
+static __Uint16Pair __uk_to_us_caps [] = {
+ { SCIM_KEY_numbersign, SCIM_KEY_backslash },
+};
+
+static __Uint16Pair __us_to_uk_caps [] = {
+ { SCIM_KEY_backslash, SCIM_KEY_numbersign },
+};
+
+static __Uint16Pair __uk_to_us_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciitilde, SCIM_KEY_bar },
+ { SCIM_KEY_sterling, SCIM_KEY_numbersign },
+ { SCIM_KEY_notsign, SCIM_KEY_asciitilde },
+};
+
+static __Uint16Pair __us_to_uk_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_numbersign, SCIM_KEY_sterling },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_bar, SCIM_KEY_asciitilde },
+ { SCIM_KEY_asciitilde, SCIM_KEY_notsign },
+};
+
+static __Uint16Pair __uk_to_us_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciitilde, SCIM_KEY_bar },
+ { SCIM_KEY_sterling, SCIM_KEY_numbersign },
+ { SCIM_KEY_notsign, SCIM_KEY_asciitilde },
+};
+
+static __Uint16Pair __us_to_uk_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_numbersign, SCIM_KEY_sterling },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_bar, SCIM_KEY_asciitilde },
+ { SCIM_KEY_asciitilde, SCIM_KEY_notsign },
+};
+
+static __Uint16Pair __icelandic_to_us_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_bracketright },
+ { SCIM_KEY_plus, SCIM_KEY_backslash },
+ { SCIM_KEY_minus, SCIM_KEY_equal },
+ { SCIM_KEY_degree, SCIM_KEY_grave },
+ { SCIM_KEY_ae, SCIM_KEY_semicolon },
+ { SCIM_KEY_eth, SCIM_KEY_bracketleft },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_minus },
+ { SCIM_KEY_thorn, SCIM_KEY_slash },
+ { SCIM_KEY_dead_acute, SCIM_KEY_apostrophe },
+};
+
+static __Uint16Pair __us_to_icelandic_normal [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_dead_acute },
+ { SCIM_KEY_minus, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_slash, SCIM_KEY_thorn },
+ { SCIM_KEY_semicolon, SCIM_KEY_ae },
+ { SCIM_KEY_equal, SCIM_KEY_minus },
+ { SCIM_KEY_bracketleft, SCIM_KEY_eth },
+ { SCIM_KEY_backslash, SCIM_KEY_plus },
+ { SCIM_KEY_bracketright, SCIM_KEY_apostrophe },
+ { SCIM_KEY_grave, SCIM_KEY_degree },
+};
+
+static __Uint16Pair __icelandic_to_us_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_bracketright },
+ { SCIM_KEY_plus, SCIM_KEY_backslash },
+ { SCIM_KEY_minus, SCIM_KEY_equal },
+ { SCIM_KEY_degree, SCIM_KEY_grave },
+ { SCIM_KEY_AE, SCIM_KEY_semicolon },
+ { SCIM_KEY_ETH, SCIM_KEY_bracketleft },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_minus },
+ { SCIM_KEY_THORN, SCIM_KEY_slash },
+ { SCIM_KEY_dead_acute, SCIM_KEY_apostrophe },
+};
+
+static __Uint16Pair __us_to_icelandic_caps [] = {
+ { SCIM_KEY_apostrophe, SCIM_KEY_dead_acute },
+ { SCIM_KEY_minus, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_slash, SCIM_KEY_THORN },
+ { SCIM_KEY_semicolon, SCIM_KEY_AE },
+ { SCIM_KEY_equal, SCIM_KEY_minus },
+ { SCIM_KEY_bracketleft, SCIM_KEY_ETH },
+ { SCIM_KEY_backslash, SCIM_KEY_plus },
+ { SCIM_KEY_bracketright, SCIM_KEY_apostrophe },
+ { SCIM_KEY_grave, SCIM_KEY_degree },
+};
+
+static __Uint16Pair __icelandic_to_us_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_bar },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_braceright },
+ { SCIM_KEY_underscore, SCIM_KEY_plus },
+ { SCIM_KEY_diaeresis, SCIM_KEY_asciitilde },
+ { SCIM_KEY_Adiaeresis, SCIM_KEY_quotedbl },
+ { SCIM_KEY_AE, SCIM_KEY_colon },
+ { SCIM_KEY_ETH, SCIM_KEY_braceleft },
+ { SCIM_KEY_Odiaeresis, SCIM_KEY_underscore },
+ { SCIM_KEY_THORN, SCIM_KEY_question },
+};
+
+static __Uint16Pair __us_to_icelandic_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_Adiaeresis },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_underscore },
+ { SCIM_KEY_colon, SCIM_KEY_AE },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_THORN },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_Odiaeresis },
+ { SCIM_KEY_braceleft, SCIM_KEY_ETH },
+ { SCIM_KEY_bar, SCIM_KEY_asterisk },
+ { SCIM_KEY_braceright, SCIM_KEY_question },
+ { SCIM_KEY_asciitilde, SCIM_KEY_diaeresis },
+};
+
+static __Uint16Pair __icelandic_to_us_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_at },
+ { SCIM_KEY_ampersand, SCIM_KEY_asciicircum },
+ { SCIM_KEY_parenleft, SCIM_KEY_asterisk },
+ { SCIM_KEY_parenright, SCIM_KEY_parenleft },
+ { SCIM_KEY_asterisk, SCIM_KEY_bar },
+ { SCIM_KEY_slash, SCIM_KEY_ampersand },
+ { SCIM_KEY_colon, SCIM_KEY_greater },
+ { SCIM_KEY_semicolon, SCIM_KEY_less },
+ { SCIM_KEY_equal, SCIM_KEY_parenright },
+ { SCIM_KEY_question, SCIM_KEY_braceright },
+ { SCIM_KEY_underscore, SCIM_KEY_plus },
+ { SCIM_KEY_diaeresis, SCIM_KEY_asciitilde },
+ { SCIM_KEY_Adiaeresis, SCIM_KEY_quotedbl },
+ { SCIM_KEY_ae, SCIM_KEY_colon },
+ { SCIM_KEY_eth, SCIM_KEY_braceleft },
+ { SCIM_KEY_odiaeresis, SCIM_KEY_underscore },
+ { SCIM_KEY_thorn, SCIM_KEY_question },
+};
+
+static __Uint16Pair __us_to_icelandic_caps_shift [] = {
+ { SCIM_KEY_quotedbl, SCIM_KEY_Adiaeresis },
+ { SCIM_KEY_ampersand, SCIM_KEY_slash },
+ { SCIM_KEY_parenleft, SCIM_KEY_parenright },
+ { SCIM_KEY_parenright, SCIM_KEY_equal },
+ { SCIM_KEY_asterisk, SCIM_KEY_parenleft },
+ { SCIM_KEY_plus, SCIM_KEY_underscore },
+ { SCIM_KEY_colon, SCIM_KEY_ae },
+ { SCIM_KEY_less, SCIM_KEY_semicolon },
+ { SCIM_KEY_greater, SCIM_KEY_colon },
+ { SCIM_KEY_question, SCIM_KEY_thorn },
+ { SCIM_KEY_at, SCIM_KEY_quotedbl },
+ { SCIM_KEY_asciicircum, SCIM_KEY_ampersand },
+ { SCIM_KEY_underscore, SCIM_KEY_odiaeresis },
+ { SCIM_KEY_braceleft, SCIM_KEY_eth },
+ { SCIM_KEY_bar, SCIM_KEY_asterisk },
+ { SCIM_KEY_braceright, SCIM_KEY_question },
+ { SCIM_KEY_asciitilde, SCIM_KEY_diaeresis },
+};
+
+
+// KeyEvent remapping map
+static __KeyCodeMap __normal_map [] =
+{
+ { 0, 0 },
+ { 0, 0 },
+ { sizeof(__belgian_to_us_normal) / sizeof (__Uint16Pair), __belgian_to_us_normal },
+ { 0, 0 }, // Croatian
+ { sizeof(__czech_to_us_normal) / sizeof (__Uint16Pair), __czech_to_us_normal },
+ { sizeof(__czech_qwerty_to_us_normal) / sizeof (__Uint16Pair), __czech_qwerty_to_us_normal },
+ { sizeof(__danish_to_us_normal) / sizeof (__Uint16Pair), __danish_to_us_normal },
+ { 0, 0 }, // Dutch
+ { sizeof(__dvorak_to_us_normal) / sizeof (__Uint16Pair), __dvorak_to_us_normal },
+ { sizeof(__estonian_to_us_normal) / sizeof (__Uint16Pair), __estonian_to_us_normal },
+ { sizeof(__finnish_to_us_normal) / sizeof (__Uint16Pair), __finnish_to_us_normal },
+ { sizeof(__french_to_us_normal) / sizeof (__Uint16Pair), __french_to_us_normal },
+ { 0, 0 }, // French Canadian
+ { sizeof(__french_switzerland_to_us_normal) / sizeof (__Uint16Pair), __french_switzerland_to_us_normal },
+ { sizeof(__german_to_us_normal) / sizeof (__Uint16Pair), __german_to_us_normal },
+ { sizeof(__german_deadkeys_to_us_normal) / sizeof (__Uint16Pair), __german_deadkeys_to_us_normal },
+ { sizeof(__german_swiss_to_us_normal) / sizeof (__Uint16Pair), __german_swiss_to_us_normal },
+ { 0, 0 }, // Greek
+ { sizeof(__hungarian_to_us_normal) / sizeof (__Uint16Pair), __hungarian_to_us_normal },
+ { sizeof(__italian_to_us_normal) / sizeof (__Uint16Pair), __italian_to_us_normal },
+ { sizeof(__japanese_to_us_normal) / sizeof (__Uint16Pair), __japanese_to_us_normal },
+ { sizeof(__norwegian_to_us_normal) / sizeof (__Uint16Pair), __norwegian_to_us_normal },
+ { 0, 0 }, // Polish
+ { sizeof(__portuguese_to_us_normal) / sizeof (__Uint16Pair), __portuguese_to_us_normal },
+ { sizeof(__portuguese_brazil_to_us_normal) / sizeof (__Uint16Pair), __portuguese_brazil_to_us_normal },
+ { sizeof(__portuguese_brazil_us_accents_to_us_normal) / sizeof (__Uint16Pair), __portuguese_brazil_us_accents_to_us_normal },
+ { 0, 0 }, // Russian
+ { sizeof(__slovak_to_us_normal) / sizeof (__Uint16Pair), __slovak_to_us_normal },
+ { sizeof(__slovak_qwerty_to_us_normal) / sizeof (__Uint16Pair), __slovak_qwerty_to_us_normal },
+ { 0, 0 }, // Slovene
+ { sizeof(__spanish_to_us_normal) / sizeof (__Uint16Pair), __spanish_to_us_normal },
+ { sizeof(__spanish_cp850_to_us_normal) / sizeof (__Uint16Pair), __spanish_cp850_to_us_normal },
+ { sizeof(__spanish_latin_america_to_us_normal) / sizeof (__Uint16Pair), __spanish_latin_america_to_us_normal },
+ { sizeof(__swedish_to_us_normal) / sizeof (__Uint16Pair), __swedish_to_us_normal },
+ { sizeof(__turkish_to_us_normal) / sizeof (__Uint16Pair), __turkish_to_us_normal },
+ { sizeof(__uk_to_us_normal) / sizeof (__Uint16Pair), __uk_to_us_normal },
+ { sizeof(__icelandic_to_us_normal) / sizeof (__Uint16Pair), __icelandic_to_us_normal },
+ { 0, 0 }, // Icelandic
+ { 0, 0 }, // Ukrainian
+};
+
+static __KeyCodeMap __normal_invert_map [] =
+{
+ { 0, 0 },
+ { 0, 0 },
+ { sizeof(__us_to_belgian_normal) / sizeof (__Uint16Pair), __us_to_belgian_normal },
+ { 0, 0 }, // Croatian
+ { sizeof(__us_to_czech_normal) / sizeof (__Uint16Pair), __us_to_czech_normal },
+ { sizeof(__us_to_czech_qwerty_normal) / sizeof (__Uint16Pair), __us_to_czech_qwerty_normal },
+ { sizeof(__us_to_danish_normal) / sizeof (__Uint16Pair), __us_to_danish_normal },
+ { 0, 0 }, // Dutch
+ { sizeof(__us_to_dvorak_normal) / sizeof (__Uint16Pair), __us_to_dvorak_normal },
+ { sizeof(__us_to_estonian_normal) / sizeof (__Uint16Pair), __us_to_estonian_normal },
+ { sizeof(__us_to_finnish_normal) / sizeof (__Uint16Pair), __us_to_finnish_normal },
+ { sizeof(__us_to_french_normal) / sizeof (__Uint16Pair), __us_to_french_normal },
+ { 0, 0 }, // French Canadian
+ { sizeof(__us_to_french_switzerland_normal) / sizeof (__Uint16Pair), __us_to_french_switzerland_normal },
+ { sizeof(__us_to_german_normal) / sizeof (__Uint16Pair), __us_to_german_normal },
+ { sizeof(__us_to_german_deadkeys_normal) / sizeof (__Uint16Pair), __us_to_german_deadkeys_normal },
+ { sizeof(__us_to_german_swiss_normal) / sizeof (__Uint16Pair), __us_to_german_swiss_normal },
+ { 0, 0 }, // Greek
+ { sizeof(__us_to_hungarian_normal) / sizeof (__Uint16Pair), __us_to_hungarian_normal },
+ { sizeof(__us_to_italian_normal) / sizeof (__Uint16Pair), __us_to_italian_normal },
+ { sizeof(__us_to_japanese_normal) / sizeof (__Uint16Pair), __us_to_japanese_normal },
+ { sizeof(__us_to_norwegian_normal) / sizeof (__Uint16Pair), __us_to_norwegian_normal },
+ { 0, 0 }, // Polish
+ { sizeof(__us_to_portuguese_normal) / sizeof (__Uint16Pair), __us_to_portuguese_normal },
+ { sizeof(__us_to_portuguese_brazil_normal) / sizeof (__Uint16Pair), __us_to_portuguese_brazil_normal },
+ { sizeof(__us_to_portuguese_brazil_us_accents_normal) / sizeof (__Uint16Pair), __us_to_portuguese_brazil_us_accents_normal },
+ { 0, 0 }, // Russian
+ { sizeof(__us_to_slovak_normal) / sizeof (__Uint16Pair), __us_to_slovak_normal },
+ { sizeof(__us_to_slovak_qwerty_normal) / sizeof (__Uint16Pair), __us_to_slovak_qwerty_normal },
+ { 0, 0 }, // Slovene
+ { sizeof(__us_to_spanish_normal) / sizeof (__Uint16Pair), __us_to_spanish_normal },
+ { sizeof(__us_to_spanish_cp850_normal) / sizeof (__Uint16Pair), __us_to_spanish_cp850_normal },
+ { sizeof(__us_to_spanish_latin_america_normal) / sizeof (__Uint16Pair), __us_to_spanish_latin_america_normal },
+ { sizeof(__us_to_swedish_normal) / sizeof (__Uint16Pair), __us_to_swedish_normal },
+ { sizeof(__us_to_turkish_normal) / sizeof (__Uint16Pair), __us_to_turkish_normal },
+ { sizeof(__us_to_uk_normal) / sizeof (__Uint16Pair), __us_to_uk_normal },
+ { sizeof(__us_to_icelandic_normal) / sizeof (__Uint16Pair), __us_to_icelandic_normal },
+ { 0, 0 }, // Icelandic
+ { 0, 0 }, // Ukrainian
+};
+
+static __KeyCodeMap __caps_map [] =
+{
+ { 0, 0 },
+ { 0, 0 },
+ { sizeof(__belgian_to_us_caps) / sizeof (__Uint16Pair), __belgian_to_us_caps },
+ { 0, 0 }, // Croatian
+ { sizeof(__czech_to_us_caps) / sizeof (__Uint16Pair), __czech_to_us_caps },
+ { sizeof(__czech_qwerty_to_us_caps) / sizeof (__Uint16Pair), __czech_qwerty_to_us_caps },
+ { sizeof(__danish_to_us_caps) / sizeof (__Uint16Pair), __danish_to_us_caps },
+ { 0, 0 }, // Dutch
+ { sizeof(__dvorak_to_us_caps) / sizeof (__Uint16Pair), __dvorak_to_us_caps },
+ { sizeof(__estonian_to_us_caps) / sizeof (__Uint16Pair), __estonian_to_us_caps },
+ { sizeof(__finnish_to_us_caps) / sizeof (__Uint16Pair), __finnish_to_us_caps },
+ { sizeof(__french_to_us_caps) / sizeof (__Uint16Pair), __french_to_us_caps },
+ { 0, 0 }, // French Canadian
+ { sizeof(__french_switzerland_to_us_caps) / sizeof (__Uint16Pair), __french_switzerland_to_us_caps },
+ { sizeof(__german_to_us_caps) / sizeof (__Uint16Pair), __german_to_us_caps },
+ { sizeof(__german_deadkeys_to_us_caps) / sizeof (__Uint16Pair), __german_deadkeys_to_us_caps },
+ { sizeof(__german_swiss_to_us_caps) / sizeof (__Uint16Pair), __german_swiss_to_us_caps },
+ { 0, 0 }, // Greek
+ { sizeof(__hungarian_to_us_caps) / sizeof (__Uint16Pair), __hungarian_to_us_caps },
+ { sizeof(__italian_to_us_caps) / sizeof (__Uint16Pair), __italian_to_us_caps },
+ { sizeof(__japanese_to_us_caps) / sizeof (__Uint16Pair), __japanese_to_us_caps },
+ { sizeof(__norwegian_to_us_caps) / sizeof (__Uint16Pair), __norwegian_to_us_caps },
+ { 0, 0 }, // Polish
+ { sizeof(__portuguese_to_us_caps) / sizeof (__Uint16Pair), __portuguese_to_us_caps },
+ { sizeof(__portuguese_brazil_to_us_caps) / sizeof (__Uint16Pair), __portuguese_brazil_to_us_caps },
+ { sizeof(__portuguese_brazil_us_accents_to_us_caps) / sizeof (__Uint16Pair), __portuguese_brazil_us_accents_to_us_caps },
+ { 0, 0 }, // Russian
+ { sizeof(__slovak_to_us_caps) / sizeof (__Uint16Pair), __slovak_to_us_caps },
+ { sizeof(__slovak_qwerty_to_us_caps) / sizeof (__Uint16Pair), __slovak_qwerty_to_us_caps },
+ { 0, 0 }, // Slovene
+ { sizeof(__spanish_to_us_caps) / sizeof (__Uint16Pair), __spanish_to_us_caps },
+ { sizeof(__spanish_cp850_to_us_caps) / sizeof (__Uint16Pair), __spanish_cp850_to_us_caps },
+ { sizeof(__spanish_latin_america_to_us_caps) / sizeof (__Uint16Pair), __spanish_latin_america_to_us_caps },
+ { sizeof(__swedish_to_us_caps) / sizeof (__Uint16Pair), __swedish_to_us_caps },
+ { sizeof(__turkish_to_us_caps) / sizeof (__Uint16Pair), __turkish_to_us_caps },
+ { sizeof(__uk_to_us_caps) / sizeof (__Uint16Pair), __uk_to_us_caps },
+ { sizeof(__icelandic_to_us_caps) / sizeof (__Uint16Pair), __icelandic_to_us_caps },
+ { 0, 0 }, // Icelandic
+ { 0, 0 }, // Ukrainian
+};
+
+static __KeyCodeMap __caps_invert_map [] =
+{
+ { 0, 0 },
+ { 0, 0 },
+ { sizeof(__us_to_belgian_caps) / sizeof (__Uint16Pair), __us_to_belgian_caps },
+ { 0, 0 }, // Croatian
+ { sizeof(__us_to_czech_caps) / sizeof (__Uint16Pair), __us_to_czech_caps },
+ { sizeof(__us_to_czech_qwerty_caps) / sizeof (__Uint16Pair), __us_to_czech_qwerty_caps },
+ { sizeof(__us_to_danish_caps) / sizeof (__Uint16Pair), __us_to_danish_caps },
+ { 0, 0 }, // Dutch
+ { sizeof(__us_to_dvorak_caps) / sizeof (__Uint16Pair), __us_to_dvorak_caps },
+ { sizeof(__us_to_estonian_caps) / sizeof (__Uint16Pair), __us_to_estonian_caps },
+ { sizeof(__us_to_finnish_caps) / sizeof (__Uint16Pair), __us_to_finnish_caps },
+ { sizeof(__us_to_french_caps) / sizeof (__Uint16Pair), __us_to_french_caps },
+ { 0, 0 }, // French Canadian
+ { sizeof(__us_to_french_switzerland_caps) / sizeof (__Uint16Pair), __us_to_french_switzerland_caps },
+ { sizeof(__us_to_german_caps) / sizeof (__Uint16Pair), __us_to_german_caps },
+ { sizeof(__us_to_german_deadkeys_caps) / sizeof (__Uint16Pair), __us_to_german_deadkeys_caps },
+ { sizeof(__us_to_german_swiss_caps) / sizeof (__Uint16Pair), __us_to_german_swiss_caps },
+ { 0, 0 }, // Greek
+ { sizeof(__us_to_hungarian_caps) / sizeof (__Uint16Pair), __us_to_hungarian_caps },
+ { sizeof(__us_to_italian_caps) / sizeof (__Uint16Pair), __us_to_italian_caps },
+ { sizeof(__us_to_japanese_caps) / sizeof (__Uint16Pair), __us_to_japanese_caps },
+ { sizeof(__us_to_norwegian_caps) / sizeof (__Uint16Pair), __us_to_norwegian_caps },
+ { 0, 0 }, // Polish
+ { sizeof(__us_to_portuguese_caps) / sizeof (__Uint16Pair), __us_to_portuguese_caps },
+ { sizeof(__us_to_portuguese_brazil_caps) / sizeof (__Uint16Pair), __us_to_portuguese_brazil_caps },
+ { sizeof(__us_to_portuguese_brazil_us_accents_caps) / sizeof (__Uint16Pair), __us_to_portuguese_brazil_us_accents_caps },
+ { 0, 0 }, // Russian
+ { sizeof(__us_to_slovak_caps) / sizeof (__Uint16Pair), __us_to_slovak_caps },
+ { sizeof(__us_to_slovak_qwerty_caps) / sizeof (__Uint16Pair), __us_to_slovak_qwerty_caps },
+ { 0, 0 }, // Slovene
+ { sizeof(__us_to_spanish_caps) / sizeof (__Uint16Pair), __us_to_spanish_caps },
+ { sizeof(__us_to_spanish_cp850_caps) / sizeof (__Uint16Pair), __us_to_spanish_cp850_caps },
+ { sizeof(__us_to_spanish_latin_america_caps) / sizeof (__Uint16Pair), __us_to_spanish_latin_america_caps },
+ { sizeof(__us_to_swedish_caps) / sizeof (__Uint16Pair), __us_to_swedish_caps },
+ { sizeof(__us_to_turkish_caps) / sizeof (__Uint16Pair), __us_to_turkish_caps },
+ { sizeof(__us_to_uk_caps) / sizeof (__Uint16Pair), __us_to_uk_caps },
+ { sizeof(__us_to_icelandic_caps) / sizeof (__Uint16Pair), __us_to_icelandic_caps },
+ { 0, 0 }, // Icelandic
+ { 0, 0 }, // Ukrainian
+};
+
+static __KeyCodeMap __shift_map [] =
+{
+ { 0, 0 },
+ { 0, 0 },
+ { sizeof(__belgian_to_us_shift) / sizeof (__Uint16Pair), __belgian_to_us_shift },
+ { 0, 0 }, // Croatian
+ { sizeof(__czech_to_us_shift) / sizeof (__Uint16Pair), __czech_to_us_shift },
+ { sizeof(__czech_qwerty_to_us_shift) / sizeof (__Uint16Pair), __czech_qwerty_to_us_shift },
+ { sizeof(__danish_to_us_shift) / sizeof (__Uint16Pair), __danish_to_us_shift },
+ { 0, 0 }, // Dutch
+ { sizeof(__dvorak_to_us_shift) / sizeof (__Uint16Pair), __dvorak_to_us_shift },
+ { sizeof(__estonian_to_us_shift) / sizeof (__Uint16Pair), __estonian_to_us_shift },
+ { sizeof(__finnish_to_us_shift) / sizeof (__Uint16Pair), __finnish_to_us_shift },
+ { sizeof(__french_to_us_shift) / sizeof (__Uint16Pair), __french_to_us_shift },
+ { 0, 0 }, // French Canadian
+ { sizeof(__french_switzerland_to_us_shift) / sizeof (__Uint16Pair), __french_switzerland_to_us_shift },
+ { sizeof(__german_to_us_shift) / sizeof (__Uint16Pair), __german_to_us_shift },
+ { sizeof(__german_deadkeys_to_us_shift) / sizeof (__Uint16Pair), __german_deadkeys_to_us_shift },
+ { sizeof(__german_swiss_to_us_shift) / sizeof (__Uint16Pair), __german_swiss_to_us_shift },
+ { 0, 0 }, // Greek
+ { sizeof(__hungarian_to_us_shift) / sizeof (__Uint16Pair), __hungarian_to_us_shift },
+ { sizeof(__italian_to_us_shift) / sizeof (__Uint16Pair), __italian_to_us_shift },
+ { sizeof(__japanese_to_us_shift) / sizeof (__Uint16Pair), __japanese_to_us_shift },
+ { sizeof(__norwegian_to_us_shift) / sizeof (__Uint16Pair), __norwegian_to_us_shift },
+ { 0, 0 }, // Polish
+ { sizeof(__portuguese_to_us_shift) / sizeof (__Uint16Pair), __portuguese_to_us_shift },
+ { sizeof(__portuguese_brazil_to_us_shift) / sizeof (__Uint16Pair), __portuguese_brazil_to_us_shift },
+ { sizeof(__portuguese_brazil_us_accents_to_us_shift) / sizeof (__Uint16Pair), __portuguese_brazil_us_accents_to_us_shift },
+ { 0, 0 }, // Russian
+ { sizeof(__slovak_to_us_shift) / sizeof (__Uint16Pair), __slovak_to_us_shift },
+ { sizeof(__slovak_qwerty_to_us_shift) / sizeof (__Uint16Pair), __slovak_qwerty_to_us_shift },
+ { 0, 0 }, // Slovene
+ { sizeof(__spanish_to_us_shift) / sizeof (__Uint16Pair), __spanish_to_us_shift },
+ { sizeof(__spanish_cp850_to_us_shift) / sizeof (__Uint16Pair), __spanish_cp850_to_us_shift },
+ { sizeof(__spanish_latin_america_to_us_shift) / sizeof (__Uint16Pair), __spanish_latin_america_to_us_shift },
+ { sizeof(__swedish_to_us_shift) / sizeof (__Uint16Pair), __swedish_to_us_shift },
+ { sizeof(__turkish_to_us_shift) / sizeof (__Uint16Pair), __turkish_to_us_shift },
+ { sizeof(__uk_to_us_shift) / sizeof (__Uint16Pair), __uk_to_us_shift },
+ { sizeof(__icelandic_to_us_shift) / sizeof (__Uint16Pair), __icelandic_to_us_shift },
+ { 0, 0 }, // Icelandic
+ { 0, 0 }, // Ukrainian
+};
+
+static __KeyCodeMap __shift_invert_map [] =
+{
+ { 0, 0 },
+ { 0, 0 },
+ { sizeof(__us_to_belgian_shift) / sizeof (__Uint16Pair), __us_to_belgian_shift },
+ { 0, 0 }, // Croatian
+ { sizeof(__us_to_czech_shift) / sizeof (__Uint16Pair), __us_to_czech_shift },
+ { sizeof(__us_to_czech_qwerty_shift) / sizeof (__Uint16Pair), __us_to_czech_qwerty_shift },
+ { sizeof(__us_to_danish_shift) / sizeof (__Uint16Pair), __us_to_danish_shift },
+ { 0, 0 }, // Dutch
+ { sizeof(__us_to_dvorak_shift) / sizeof (__Uint16Pair), __us_to_dvorak_shift },
+ { sizeof(__us_to_estonian_shift) / sizeof (__Uint16Pair), __us_to_estonian_shift },
+ { sizeof(__us_to_finnish_shift) / sizeof (__Uint16Pair), __us_to_finnish_shift },
+ { sizeof(__us_to_french_shift) / sizeof (__Uint16Pair), __us_to_french_shift },
+ { 0, 0 }, // French Canadian
+ { sizeof(__us_to_french_switzerland_shift) / sizeof (__Uint16Pair), __us_to_french_switzerland_shift },
+ { sizeof(__us_to_german_shift) / sizeof (__Uint16Pair), __us_to_german_shift },
+ { sizeof(__us_to_german_deadkeys_shift) / sizeof (__Uint16Pair), __us_to_german_deadkeys_shift },
+ { sizeof(__us_to_german_swiss_shift) / sizeof (__Uint16Pair), __us_to_german_swiss_shift },
+ { 0, 0 }, // Greek
+ { sizeof(__us_to_hungarian_shift) / sizeof (__Uint16Pair), __us_to_hungarian_shift },
+ { sizeof(__us_to_italian_shift) / sizeof (__Uint16Pair), __us_to_italian_shift },
+ { sizeof(__us_to_japanese_shift) / sizeof (__Uint16Pair), __us_to_japanese_shift },
+ { sizeof(__us_to_norwegian_shift) / sizeof (__Uint16Pair), __us_to_norwegian_shift },
+ { 0, 0 }, // Polish
+ { sizeof(__us_to_portuguese_shift) / sizeof (__Uint16Pair), __us_to_portuguese_shift },
+ { sizeof(__us_to_portuguese_brazil_shift) / sizeof (__Uint16Pair), __us_to_portuguese_brazil_shift },
+ { sizeof(__us_to_portuguese_brazil_us_accents_shift) / sizeof (__Uint16Pair), __us_to_portuguese_brazil_us_accents_shift },
+ { 0, 0 }, // Russian
+ { sizeof(__us_to_slovak_shift) / sizeof (__Uint16Pair), __us_to_slovak_shift },
+ { sizeof(__us_to_slovak_qwerty_shift) / sizeof (__Uint16Pair), __us_to_slovak_qwerty_shift },
+ { 0, 0 }, // Slovene
+ { sizeof(__us_to_spanish_shift) / sizeof (__Uint16Pair), __us_to_spanish_shift },
+ { sizeof(__us_to_spanish_cp850_shift) / sizeof (__Uint16Pair), __us_to_spanish_cp850_shift },
+ { sizeof(__us_to_spanish_latin_america_shift) / sizeof (__Uint16Pair), __us_to_spanish_latin_america_shift },
+ { sizeof(__us_to_swedish_shift) / sizeof (__Uint16Pair), __us_to_swedish_shift },
+ { sizeof(__us_to_turkish_shift) / sizeof (__Uint16Pair), __us_to_turkish_shift },
+ { sizeof(__us_to_uk_shift) / sizeof (__Uint16Pair), __us_to_uk_shift },
+ { sizeof(__us_to_icelandic_shift) / sizeof (__Uint16Pair), __us_to_icelandic_shift },
+ { 0, 0 }, // Icelandic
+ { 0, 0 }, // Ukrainian
+};
+
+static __KeyCodeMap __caps_shift_map [] =
+{
+ { 0, 0 },
+ { 0, 0 },
+ { sizeof(__belgian_to_us_caps_shift) / sizeof (__Uint16Pair), __belgian_to_us_caps_shift },
+ { 0, 0 }, // Croatian
+ { sizeof(__czech_to_us_caps_shift) / sizeof (__Uint16Pair), __czech_to_us_caps_shift },
+ { sizeof(__czech_qwerty_to_us_caps_shift) / sizeof (__Uint16Pair), __czech_qwerty_to_us_caps_shift },
+ { sizeof(__danish_to_us_caps_shift) / sizeof (__Uint16Pair), __danish_to_us_caps_shift },
+ { 0, 0 }, // Dutch
+ { sizeof(__dvorak_to_us_caps_shift) / sizeof (__Uint16Pair), __dvorak_to_us_caps_shift },
+ { sizeof(__estonian_to_us_caps_shift) / sizeof (__Uint16Pair), __estonian_to_us_caps_shift },
+ { sizeof(__finnish_to_us_caps_shift) / sizeof (__Uint16Pair), __finnish_to_us_caps_shift },
+ { sizeof(__french_to_us_caps_shift) / sizeof (__Uint16Pair), __french_to_us_caps_shift },
+ { 0, 0 }, // French Canadian
+ { sizeof(__french_switzerland_to_us_caps_shift) / sizeof (__Uint16Pair), __french_switzerland_to_us_caps_shift },
+ { sizeof(__german_to_us_caps_shift) / sizeof (__Uint16Pair), __german_to_us_caps_shift },
+ { sizeof(__german_deadkeys_to_us_caps_shift) / sizeof (__Uint16Pair), __german_deadkeys_to_us_caps_shift },
+ { sizeof(__german_swiss_to_us_caps_shift) / sizeof (__Uint16Pair), __german_swiss_to_us_caps_shift },
+ { 0, 0 }, // Greek
+ { sizeof(__hungarian_to_us_caps_shift) / sizeof (__Uint16Pair), __hungarian_to_us_caps_shift },
+ { sizeof(__italian_to_us_caps_shift) / sizeof (__Uint16Pair), __italian_to_us_caps_shift },
+ { sizeof(__japanese_to_us_caps_shift) / sizeof (__Uint16Pair), __japanese_to_us_caps_shift },
+ { sizeof(__norwegian_to_us_caps_shift) / sizeof (__Uint16Pair), __norwegian_to_us_caps_shift },
+ { 0, 0 }, // Polish
+ { sizeof(__portuguese_to_us_caps_shift) / sizeof (__Uint16Pair), __portuguese_to_us_caps_shift },
+ { sizeof(__portuguese_brazil_to_us_caps_shift) / sizeof (__Uint16Pair), __portuguese_brazil_to_us_caps_shift },
+ { sizeof(__portuguese_brazil_us_accents_to_us_caps_shift) / sizeof (__Uint16Pair), __portuguese_brazil_us_accents_to_us_caps_shift },
+ { 0, 0 }, // Russian
+ { sizeof(__slovak_to_us_caps_shift) / sizeof (__Uint16Pair), __slovak_to_us_caps_shift },
+ { sizeof(__slovak_qwerty_to_us_caps_shift) / sizeof (__Uint16Pair), __slovak_qwerty_to_us_caps_shift },
+ { 0, 0 }, // Slovene
+ { sizeof(__spanish_to_us_caps_shift) / sizeof (__Uint16Pair), __spanish_to_us_caps_shift },
+ { sizeof(__spanish_cp850_to_us_caps_shift) / sizeof (__Uint16Pair), __spanish_cp850_to_us_caps_shift },
+ { sizeof(__spanish_latin_america_to_us_caps_shift) / sizeof (__Uint16Pair), __spanish_latin_america_to_us_caps_shift },
+ { sizeof(__swedish_to_us_caps_shift) / sizeof (__Uint16Pair), __swedish_to_us_caps_shift },
+ { sizeof(__turkish_to_us_caps_shift) / sizeof (__Uint16Pair), __turkish_to_us_caps_shift },
+ { sizeof(__uk_to_us_caps_shift) / sizeof (__Uint16Pair), __uk_to_us_caps_shift },
+ { sizeof(__icelandic_to_us_caps_shift) / sizeof (__Uint16Pair), __icelandic_to_us_caps_shift },
+ { 0, 0 }, // Icelandic
+ { 0, 0 }, // Ukrainian
+};
+
+static __KeyCodeMap __caps_shift_invert_map [] =
+{
+ { 0, 0 },
+ { 0, 0 },
+ { sizeof(__us_to_belgian_caps_shift) / sizeof (__Uint16Pair), __us_to_belgian_caps_shift },
+ { 0, 0 }, // Croatian
+ { sizeof(__us_to_czech_caps_shift) / sizeof (__Uint16Pair), __us_to_czech_caps_shift },
+ { sizeof(__us_to_czech_qwerty_caps_shift) / sizeof (__Uint16Pair), __us_to_czech_qwerty_caps_shift },
+ { sizeof(__us_to_danish_caps_shift) / sizeof (__Uint16Pair), __us_to_danish_caps_shift },
+ { 0, 0 }, // Dutch
+ { sizeof(__us_to_dvorak_caps_shift) / sizeof (__Uint16Pair), __us_to_dvorak_caps_shift },
+ { sizeof(__us_to_estonian_caps_shift) / sizeof (__Uint16Pair), __us_to_estonian_caps_shift },
+ { sizeof(__us_to_finnish_caps_shift) / sizeof (__Uint16Pair), __us_to_finnish_caps_shift },
+ { sizeof(__us_to_french_caps_shift) / sizeof (__Uint16Pair), __us_to_french_caps_shift },
+ { 0, 0 }, // French Canadian
+ { sizeof(__us_to_french_switzerland_caps_shift) / sizeof (__Uint16Pair), __us_to_french_switzerland_caps_shift },
+ { sizeof(__us_to_german_caps_shift) / sizeof (__Uint16Pair), __us_to_german_caps_shift },
+ { sizeof(__us_to_german_deadkeys_caps_shift) / sizeof (__Uint16Pair), __us_to_german_deadkeys_caps_shift },
+ { sizeof(__us_to_german_swiss_caps_shift) / sizeof (__Uint16Pair), __us_to_german_swiss_caps_shift },
+ { 0, 0 }, // Greek
+ { sizeof(__us_to_hungarian_caps_shift) / sizeof (__Uint16Pair), __us_to_hungarian_caps_shift },
+ { sizeof(__us_to_italian_caps_shift) / sizeof (__Uint16Pair), __us_to_italian_caps_shift },
+ { sizeof(__us_to_japanese_caps_shift) / sizeof (__Uint16Pair), __us_to_japanese_caps_shift },
+ { sizeof(__us_to_norwegian_caps_shift) / sizeof (__Uint16Pair), __us_to_norwegian_caps_shift },
+ { 0, 0 }, // Polish
+ { sizeof(__us_to_portuguese_caps_shift) / sizeof (__Uint16Pair), __us_to_portuguese_caps_shift },
+ { sizeof(__us_to_portuguese_brazil_caps_shift) / sizeof (__Uint16Pair), __us_to_portuguese_brazil_caps_shift },
+ { sizeof(__us_to_portuguese_brazil_us_accents_caps_shift) / sizeof (__Uint16Pair), __us_to_portuguese_brazil_us_accents_caps_shift },
+ { 0, 0 }, // Russian
+ { sizeof(__us_to_slovak_caps_shift) / sizeof (__Uint16Pair), __us_to_slovak_caps_shift },
+ { sizeof(__us_to_slovak_qwerty_caps_shift) / sizeof (__Uint16Pair), __us_to_slovak_qwerty_caps_shift },
+ { 0, 0 }, // Slovene
+ { sizeof(__us_to_spanish_caps_shift) / sizeof (__Uint16Pair), __us_to_spanish_caps_shift },
+ { sizeof(__us_to_spanish_cp850_caps_shift) / sizeof (__Uint16Pair), __us_to_spanish_cp850_caps_shift },
+ { sizeof(__us_to_spanish_latin_america_caps_shift) / sizeof (__Uint16Pair), __us_to_spanish_latin_america_caps_shift },
+ { sizeof(__us_to_swedish_caps_shift) / sizeof (__Uint16Pair), __us_to_swedish_caps_shift },
+ { sizeof(__us_to_turkish_caps_shift) / sizeof (__Uint16Pair), __us_to_turkish_caps_shift },
+ { sizeof(__us_to_uk_caps_shift) / sizeof (__Uint16Pair), __us_to_uk_caps_shift },
+ { sizeof(__us_to_icelandic_caps_shift) / sizeof (__Uint16Pair), __us_to_icelandic_caps_shift },
+ { 0, 0 }, // Icelandic
+ { 0, 0 }, // Ukrainian
+};
+
+// Keyboard Layout string IDs sorted by code.
+static __KeyName __scim_keyboard_layout_ids_by_code [] =
+{
+ {SCIM_KEYBOARD_Unknown ,"Unknown"},
+ {SCIM_KEYBOARD_Default ,"US_Default"},
+ {SCIM_KEYBOARD_Belgian ,"Belgian"},
+ {SCIM_KEYBOARD_Croatian ,"Croatian"},
+ {SCIM_KEYBOARD_Czech ,"Czech"},
+ {SCIM_KEYBOARD_Czech_Qwerty ,"Czech_Qwerty"},
+ {SCIM_KEYBOARD_Danish ,"Danish"},
+ {SCIM_KEYBOARD_Dutch ,"Dutch"},
+ {SCIM_KEYBOARD_Dvorak ,"Dvorak"},
+ {SCIM_KEYBOARD_Estonian ,"Estonian"},
+ {SCIM_KEYBOARD_Finnish ,"Finnish"},
+ {SCIM_KEYBOARD_French ,"French"},
+ {SCIM_KEYBOARD_French_Canadian ,"French_Canadian"},
+ {SCIM_KEYBOARD_French_Switzerland ,"French_Switzerland"},
+ {SCIM_KEYBOARD_German ,"German"},
+ {SCIM_KEYBOARD_German_Deadkeys ,"German_Deadkeys"},
+ {SCIM_KEYBOARD_German_Swiss ,"German_Swiss"},
+ {SCIM_KEYBOARD_Greek ,"Greek"},
+ {SCIM_KEYBOARD_Hungarian ,"Hungarian"},
+ {SCIM_KEYBOARD_Italian ,"Italian"},
+ {SCIM_KEYBOARD_Japanese ,"Japanese"},
+ {SCIM_KEYBOARD_Norwegian ,"Norwegian"},
+ {SCIM_KEYBOARD_Polish ,"Polish"},
+ {SCIM_KEYBOARD_Portuguese ,"Portuguese"},
+ {SCIM_KEYBOARD_Portuguese_Brazil ,"Portuguese_Brazil"},
+ {SCIM_KEYBOARD_Portuguese_Brazil_US_Accents ,"Portuguese_Brazil_US_Accents"},
+ {SCIM_KEYBOARD_Russian ,"Russian"},
+ {SCIM_KEYBOARD_Slovak ,"Slovak"},
+ {SCIM_KEYBOARD_Slovak_Qwerty ,"Slovak_Qwerty"},
+ {SCIM_KEYBOARD_Slovene ,"Slovene"},
+ {SCIM_KEYBOARD_Spanish ,"Spanish"},
+ {SCIM_KEYBOARD_Spanish_CP850 ,"Spanish_CP850"},
+ {SCIM_KEYBOARD_Spanish_Latin_America ,"Spanish_Latin_America"},
+ {SCIM_KEYBOARD_Swedish ,"Swedish"},
+ {SCIM_KEYBOARD_Turkish ,"Turkish"},
+ {SCIM_KEYBOARD_UK ,"UK"},
+ {SCIM_KEYBOARD_Icelandic ,"Icelandic"},
+ {SCIM_KEYBOARD_Lithuanian ,"Lithuanian"},
+ {SCIM_KEYBOARD_Ukrainian ,"Ukrainian"},
+};
+
+// Keyboard Layout string IDs sorted by name.
+static __KeyName __scim_keyboard_layout_ids_by_name [] =
+{
+ {SCIM_KEYBOARD_Unknown ,"Unknown"},
+ {SCIM_KEYBOARD_Default ,"US_Default"},
+ {SCIM_KEYBOARD_Belgian ,"Belgian"},
+ {SCIM_KEYBOARD_Croatian ,"Croatian"},
+ {SCIM_KEYBOARD_Czech ,"Czech"},
+ {SCIM_KEYBOARD_Czech_Qwerty ,"Czech_Qwerty"},
+ {SCIM_KEYBOARD_Danish ,"Danish"},
+ {SCIM_KEYBOARD_Dutch ,"Dutch"},
+ {SCIM_KEYBOARD_Dvorak ,"Dvorak"},
+ {SCIM_KEYBOARD_Estonian ,"Estonian"},
+ {SCIM_KEYBOARD_Finnish ,"Finnish"},
+ {SCIM_KEYBOARD_French ,"French"},
+ {SCIM_KEYBOARD_French_Canadian ,"French_Canadian"},
+ {SCIM_KEYBOARD_French_Switzerland ,"French_Switzerland"},
+ {SCIM_KEYBOARD_German ,"German"},
+ {SCIM_KEYBOARD_German_Deadkeys ,"German_Deadkeys"},
+ {SCIM_KEYBOARD_German_Swiss ,"German_Swiss"},
+ {SCIM_KEYBOARD_Greek ,"Greek"},
+ {SCIM_KEYBOARD_Hungarian ,"Hungarian"},
+ {SCIM_KEYBOARD_Icelandic ,"Icelandic"},
+ {SCIM_KEYBOARD_Italian ,"Italian"},
+ {SCIM_KEYBOARD_Japanese ,"Japanese"},
+ {SCIM_KEYBOARD_Lithuanian ,"Lithuanian"},
+ {SCIM_KEYBOARD_Norwegian ,"Norwegian"},
+ {SCIM_KEYBOARD_Polish ,"Polish"},
+ {SCIM_KEYBOARD_Portuguese ,"Portuguese"},
+ {SCIM_KEYBOARD_Portuguese_Brazil ,"Portuguese_Brazil"},
+ {SCIM_KEYBOARD_Portuguese_Brazil_US_Accents ,"Portuguese_Brazil_US_Accents"},
+ {SCIM_KEYBOARD_Russian ,"Russian"},
+ {SCIM_KEYBOARD_Slovak ,"Slovak"},
+ {SCIM_KEYBOARD_Slovak_Qwerty ,"Slovak_Qwerty"},
+ {SCIM_KEYBOARD_Slovene ,"Slovene"},
+ {SCIM_KEYBOARD_Spanish ,"Spanish"},
+ {SCIM_KEYBOARD_Spanish_CP850 ,"Spanish_CP850"},
+ {SCIM_KEYBOARD_Spanish_Latin_America ,"Spanish_Latin_America"},
+ {SCIM_KEYBOARD_Swedish ,"Swedish"},
+ {SCIM_KEYBOARD_Turkish ,"Turkish"},
+ {SCIM_KEYBOARD_UK ,"UK"},
+ {SCIM_KEYBOARD_Ukrainian ,"Ukrainian"},
+};
+
+
+// Keyboard Layout display names.
+static const char *__scim_keyboard_layout_names [] =
+{
+ N_("Unknown"),
+ N_("English (US)"),
+ N_("Belgian"),
+ N_("Croatian"),
+ N_("Czech"),
+ N_("Czech (qwerty)"),
+ N_("Danish"),
+ N_("Dutch"),
+ N_("Dvorak"),
+ N_("Estonian"),
+ N_("Finnish"),
+ N_("French"),
+ N_("French (Canadian)"),
+ N_("French (Switzerland)"),
+ N_("German"),
+ N_("German (with deadkeys)"),
+ N_("German (Swiss)"),
+ N_("Greek"),
+ N_("Hungarian"),
+ N_("Italian"),
+ N_("Japanese"),
+ N_("Norwegian"),
+ N_("Polish"),
+ N_("Portuguese"),
+ N_("Portuguese (Brazil)"),
+ N_("Portuguese (Brazil US accents)"),
+ N_("Russian"),
+ N_("Slovak"),
+ N_("Slovak (qwerty)"),
+ N_("Slovenian"),
+ N_("Spanish"),
+ N_("Spanish (CP 850)"),
+ N_("Spanish (Latin America)"),
+ N_("Swedish"),
+ N_("Turkish"),
+ N_("English (UK)"),
+ N_("Icelandic"),
+ N_("Lithuanian"),
+ N_("Ukrainian"),
+};
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/* Thanks to Markus G. Kuhn <mkuhn@acm.org> for the ksysym<->Unicode
+ * mapping functions, from the xterm sources.
+ */
+
+/* These tables could be compressed by contiguous ranges, but the benefit of doing so
+ * is smallish. It would save about ~1000 bytes total.
+ */
+static __Uint16Pair __scim_key_to_unicode_tab [] = {
+ { 0x01a1, 0x0104 }, /* Aogonek Ą LATIN CAPITAL LETTER A WITH OGONEK */
+ { 0x01a2, 0x02d8 }, /* breve ˘ BREVE */
+ { 0x01a3, 0x0141 }, /* Lstroke Ł LATIN CAPITAL LETTER L WITH STROKE */
+ { 0x01a5, 0x013d }, /* Lcaron Ľ LATIN CAPITAL LETTER L WITH CARON */
+ { 0x01a6, 0x015a }, /* Sacute Ś LATIN CAPITAL LETTER S WITH ACUTE */
+ { 0x01a9, 0x0160 }, /* Scaron Š LATIN CAPITAL LETTER S WITH CARON */
+ { 0x01aa, 0x015e }, /* Scedilla Ş LATIN CAPITAL LETTER S WITH CEDILLA */
+ { 0x01ab, 0x0164 }, /* Tcaron Ť LATIN CAPITAL LETTER T WITH CARON */
+ { 0x01ac, 0x0179 }, /* Zacute Ź LATIN CAPITAL LETTER Z WITH ACUTE */
+ { 0x01ae, 0x017d }, /* Zcaron Ž LATIN CAPITAL LETTER Z WITH CARON */
+ { 0x01af, 0x017b }, /* Zabovedot Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE */
+ { 0x01b1, 0x0105 }, /* aogonek ą LATIN SMALL LETTER A WITH OGONEK */
+ { 0x01b2, 0x02db }, /* ogonek ˛ OGONEK */
+ { 0x01b3, 0x0142 }, /* lstroke ł LATIN SMALL LETTER L WITH STROKE */
+ { 0x01b5, 0x013e }, /* lcaron ľ LATIN SMALL LETTER L WITH CARON */
+ { 0x01b6, 0x015b }, /* sacute ś LATIN SMALL LETTER S WITH ACUTE */
+ { 0x01b7, 0x02c7 }, /* caron ˇ CARON */
+ { 0x01b9, 0x0161 }, /* scaron š LATIN SMALL LETTER S WITH CARON */
+ { 0x01ba, 0x015f }, /* scedilla ş LATIN SMALL LETTER S WITH CEDILLA */
+ { 0x01bb, 0x0165 }, /* tcaron ť LATIN SMALL LETTER T WITH CARON */
+ { 0x01bc, 0x017a }, /* zacute ź LATIN SMALL LETTER Z WITH ACUTE */
+ { 0x01bd, 0x02dd }, /* doubleacute ˝ DOUBLE ACUTE ACCENT */
+ { 0x01be, 0x017e }, /* zcaron ž LATIN SMALL LETTER Z WITH CARON */
+ { 0x01bf, 0x017c }, /* zabovedot ż LATIN SMALL LETTER Z WITH DOT ABOVE */
+ { 0x01c0, 0x0154 }, /* Racute Ŕ LATIN CAPITAL LETTER R WITH ACUTE */
+ { 0x01c3, 0x0102 }, /* Abreve Ă LATIN CAPITAL LETTER A WITH BREVE */
+ { 0x01c5, 0x0139 }, /* Lacute Ĺ LATIN CAPITAL LETTER L WITH ACUTE */
+ { 0x01c6, 0x0106 }, /* Cacute Ć LATIN CAPITAL LETTER C WITH ACUTE */
+ { 0x01c8, 0x010c }, /* Ccaron Č LATIN CAPITAL LETTER C WITH CARON */
+ { 0x01ca, 0x0118 }, /* Eogonek Ę LATIN CAPITAL LETTER E WITH OGONEK */
+ { 0x01cc, 0x011a }, /* Ecaron Ě LATIN CAPITAL LETTER E WITH CARON */
+ { 0x01cf, 0x010e }, /* Dcaron Ď LATIN CAPITAL LETTER D WITH CARON */
+ { 0x01d0, 0x0110 }, /* Dstroke Đ LATIN CAPITAL LETTER D WITH STROKE */
+ { 0x01d1, 0x0143 }, /* Nacute Ń LATIN CAPITAL LETTER N WITH ACUTE */
+ { 0x01d2, 0x0147 }, /* Ncaron Ň LATIN CAPITAL LETTER N WITH CARON */
+ { 0x01d5, 0x0150 }, /* Odoubleacute Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
+ { 0x01d8, 0x0158 }, /* Rcaron Ř LATIN CAPITAL LETTER R WITH CARON */
+ { 0x01d9, 0x016e }, /* Uring Ů LATIN CAPITAL LETTER U WITH RING ABOVE */
+ { 0x01db, 0x0170 }, /* Udoubleacute Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
+ { 0x01de, 0x0162 }, /* Tcedilla Ţ LATIN CAPITAL LETTER T WITH CEDILLA */
+ { 0x01e0, 0x0155 }, /* racute ŕ LATIN SMALL LETTER R WITH ACUTE */
+ { 0x01e3, 0x0103 }, /* abreve ă LATIN SMALL LETTER A WITH BREVE */
+ { 0x01e5, 0x013a }, /* lacute ĺ LATIN SMALL LETTER L WITH ACUTE */
+ { 0x01e6, 0x0107 }, /* cacute ć LATIN SMALL LETTER C WITH ACUTE */
+ { 0x01e8, 0x010d }, /* ccaron č LATIN SMALL LETTER C WITH CARON */
+ { 0x01ea, 0x0119 }, /* eogonek ę LATIN SMALL LETTER E WITH OGONEK */
+ { 0x01ec, 0x011b }, /* ecaron ě LATIN SMALL LETTER E WITH CARON */
+ { 0x01ef, 0x010f }, /* dcaron ď LATIN SMALL LETTER D WITH CARON */
+ { 0x01f0, 0x0111 }, /* dstroke đ LATIN SMALL LETTER D WITH STROKE */
+ { 0x01f1, 0x0144 }, /* nacute ń LATIN SMALL LETTER N WITH ACUTE */
+ { 0x01f2, 0x0148 }, /* ncaron ň LATIN SMALL LETTER N WITH CARON */
+ { 0x01f5, 0x0151 }, /* odoubleacute ő LATIN SMALL LETTER O WITH DOUBLE ACUTE */
+ { 0x01f8, 0x0159 }, /* rcaron ř LATIN SMALL LETTER R WITH CARON */
+ { 0x01f9, 0x016f }, /* uring ů LATIN SMALL LETTER U WITH RING ABOVE */
+ { 0x01fb, 0x0171 }, /* udoubleacute ű LATIN SMALL LETTER U WITH DOUBLE ACUTE */
+ { 0x01fe, 0x0163 }, /* tcedilla ţ LATIN SMALL LETTER T WITH CEDILLA */
+ { 0x01ff, 0x02d9 }, /* abovedot ˙ DOT ABOVE */
+ { 0x02a1, 0x0126 }, /* Hstroke Ħ LATIN CAPITAL LETTER H WITH STROKE */
+ { 0x02a6, 0x0124 }, /* Hcircumflex Ĥ LATIN CAPITAL LETTER H WITH CIRCUMFLEX */
+ { 0x02a9, 0x0130 }, /* Iabovedot İ LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ { 0x02ab, 0x011e }, /* Gbreve Ğ LATIN CAPITAL LETTER G WITH BREVE */
+ { 0x02ac, 0x0134 }, /* Jcircumflex Ĵ LATIN CAPITAL LETTER J WITH CIRCUMFLEX */
+ { 0x02b1, 0x0127 }, /* hstroke ħ LATIN SMALL LETTER H WITH STROKE */
+ { 0x02b6, 0x0125 }, /* hcircumflex ĥ LATIN SMALL LETTER H WITH CIRCUMFLEX */
+ { 0x02b9, 0x0131 }, /* idotless ı LATIN SMALL LETTER DOTLESS I */
+ { 0x02bb, 0x011f }, /* gbreve ğ LATIN SMALL LETTER G WITH BREVE */
+ { 0x02bc, 0x0135 }, /* jcircumflex ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX */
+ { 0x02c5, 0x010a }, /* Cabovedot Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE */
+ { 0x02c6, 0x0108 }, /* Ccircumflex Ĉ LATIN CAPITAL LETTER C WITH CIRCUMFLEX */
+ { 0x02d5, 0x0120 }, /* Gabovedot Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE */
+ { 0x02d8, 0x011c }, /* Gcircumflex Ĝ LATIN CAPITAL LETTER G WITH CIRCUMFLEX */
+ { 0x02dd, 0x016c }, /* Ubreve Ŭ LATIN CAPITAL LETTER U WITH BREVE */
+ { 0x02de, 0x015c }, /* Scircumflex Ŝ LATIN CAPITAL LETTER S WITH CIRCUMFLEX */
+ { 0x02e5, 0x010b }, /* cabovedot ċ LATIN SMALL LETTER C WITH DOT ABOVE */
+ { 0x02e6, 0x0109 }, /* ccircumflex ĉ LATIN SMALL LETTER C WITH CIRCUMFLEX */
+ { 0x02f5, 0x0121 }, /* gabovedot ġ LATIN SMALL LETTER G WITH DOT ABOVE */
+ { 0x02f8, 0x011d }, /* gcircumflex ĝ LATIN SMALL LETTER G WITH CIRCUMFLEX */
+ { 0x02fd, 0x016d }, /* ubreve ŭ LATIN SMALL LETTER U WITH BREVE */
+ { 0x02fe, 0x015d }, /* scircumflex ŝ LATIN SMALL LETTER S WITH CIRCUMFLEX */
+ { 0x03a2, 0x0138 }, /* kra ĸ LATIN SMALL LETTER KRA */
+ { 0x03a3, 0x0156 }, /* Rcedilla Ŗ LATIN CAPITAL LETTER R WITH CEDILLA */
+ { 0x03a5, 0x0128 }, /* Itilde Ĩ LATIN CAPITAL LETTER I WITH TILDE */
+ { 0x03a6, 0x013b }, /* Lcedilla Ļ LATIN CAPITAL LETTER L WITH CEDILLA */
+ { 0x03aa, 0x0112 }, /* Emacron Ē LATIN CAPITAL LETTER E WITH MACRON */
+ { 0x03ab, 0x0122 }, /* Gcedilla Ģ LATIN CAPITAL LETTER G WITH CEDILLA */
+ { 0x03ac, 0x0166 }, /* Tslash Ŧ LATIN CAPITAL LETTER T WITH STROKE */
+ { 0x03b3, 0x0157 }, /* rcedilla ŗ LATIN SMALL LETTER R WITH CEDILLA */
+ { 0x03b5, 0x0129 }, /* itilde ĩ LATIN SMALL LETTER I WITH TILDE */
+ { 0x03b6, 0x013c }, /* lcedilla ļ LATIN SMALL LETTER L WITH CEDILLA */
+ { 0x03ba, 0x0113 }, /* emacron ē LATIN SMALL LETTER E WITH MACRON */
+ { 0x03bb, 0x0123 }, /* gcedilla ģ LATIN SMALL LETTER G WITH CEDILLA */
+ { 0x03bc, 0x0167 }, /* tslash ŧ LATIN SMALL LETTER T WITH STROKE */
+ { 0x03bd, 0x014a }, /* ENG Ŋ LATIN CAPITAL LETTER ENG */
+ { 0x03bf, 0x014b }, /* eng ŋ LATIN SMALL LETTER ENG */
+ { 0x03c0, 0x0100 }, /* Amacron Ā LATIN CAPITAL LETTER A WITH MACRON */
+ { 0x03c7, 0x012e }, /* Iogonek Į LATIN CAPITAL LETTER I WITH OGONEK */
+ { 0x03cc, 0x0116 }, /* Eabovedot Ė LATIN CAPITAL LETTER E WITH DOT ABOVE */
+ { 0x03cf, 0x012a }, /* Imacron Ī LATIN CAPITAL LETTER I WITH MACRON */
+ { 0x03d1, 0x0145 }, /* Ncedilla Ņ LATIN CAPITAL LETTER N WITH CEDILLA */
+ { 0x03d2, 0x014c }, /* Omacron Ō LATIN CAPITAL LETTER O WITH MACRON */
+ { 0x03d3, 0x0136 }, /* Kcedilla Ķ LATIN CAPITAL LETTER K WITH CEDILLA */
+ { 0x03d9, 0x0172 }, /* Uogonek Ų LATIN CAPITAL LETTER U WITH OGONEK */
+ { 0x03dd, 0x0168 }, /* Utilde Ũ LATIN CAPITAL LETTER U WITH TILDE */
+ { 0x03de, 0x016a }, /* Umacron Ū LATIN CAPITAL LETTER U WITH MACRON */
+ { 0x03e0, 0x0101 }, /* amacron ā LATIN SMALL LETTER A WITH MACRON */
+ { 0x03e7, 0x012f }, /* iogonek į LATIN SMALL LETTER I WITH OGONEK */
+ { 0x03ec, 0x0117 }, /* eabovedot ė LATIN SMALL LETTER E WITH DOT ABOVE */
+ { 0x03ef, 0x012b }, /* imacron ī LATIN SMALL LETTER I WITH MACRON */
+ { 0x03f1, 0x0146 }, /* ncedilla ņ LATIN SMALL LETTER N WITH CEDILLA */
+ { 0x03f2, 0x014d }, /* omacron ō LATIN SMALL LETTER O WITH MACRON */
+ { 0x03f3, 0x0137 }, /* kcedilla ķ LATIN SMALL LETTER K WITH CEDILLA */
+ { 0x03f9, 0x0173 }, /* uogonek ų LATIN SMALL LETTER U WITH OGONEK */
+ { 0x03fd, 0x0169 }, /* utilde ũ LATIN SMALL LETTER U WITH TILDE */
+ { 0x03fe, 0x016b }, /* umacron ū LATIN SMALL LETTER U WITH MACRON */
+ { 0x047e, 0x203e }, /* overline ‾ OVERLINE */
+ { 0x04a1, 0x3002 }, /* kana_fullstop 。 IDEOGRAPHIC FULL STOP */
+ { 0x04a2, 0x300c }, /* kana_openingbracket 「 LEFT CORNER BRACKET */
+ { 0x04a3, 0x300d }, /* kana_closingbracket 」 RIGHT CORNER BRACKET */
+ { 0x04a4, 0x3001 }, /* kana_comma 、 IDEOGRAPHIC COMMA */
+ { 0x04a5, 0x30fb }, /* kana_conjunctive ・ KATAKANA MIDDLE DOT */
+ { 0x04a6, 0x30f2 }, /* kana_WO ヲ KATAKANA LETTER WO */
+ { 0x04a7, 0x30a1 }, /* kana_a ァ KATAKANA LETTER SMALL A */
+ { 0x04a8, 0x30a3 }, /* kana_i ィ KATAKANA LETTER SMALL I */
+ { 0x04a9, 0x30a5 }, /* kana_u ゥ KATAKANA LETTER SMALL U */
+ { 0x04aa, 0x30a7 }, /* kana_e ェ KATAKANA LETTER SMALL E */
+ { 0x04ab, 0x30a9 }, /* kana_o ォ KATAKANA LETTER SMALL O */
+ { 0x04ac, 0x30e3 }, /* kana_ya ャ KATAKANA LETTER SMALL YA */
+ { 0x04ad, 0x30e5 }, /* kana_yu ュ KATAKANA LETTER SMALL YU */
+ { 0x04ae, 0x30e7 }, /* kana_yo ョ KATAKANA LETTER SMALL YO */
+ { 0x04af, 0x30c3 }, /* kana_tsu ッ KATAKANA LETTER SMALL TU */
+ { 0x04b0, 0x30fc }, /* prolongedsound ー KATAKANA-HIRAGANA PROLONGED SOUND MARK */
+ { 0x04b1, 0x30a2 }, /* kana_A ア KATAKANA LETTER A */
+ { 0x04b2, 0x30a4 }, /* kana_I イ KATAKANA LETTER I */
+ { 0x04b3, 0x30a6 }, /* kana_U ウ KATAKANA LETTER U */
+ { 0x04b4, 0x30a8 }, /* kana_E エ KATAKANA LETTER E */
+ { 0x04b5, 0x30aa }, /* kana_O オ KATAKANA LETTER O */
+ { 0x04b6, 0x30ab }, /* kana_KA カ KATAKANA LETTER KA */
+ { 0x04b7, 0x30ad }, /* kana_KI キ KATAKANA LETTER KI */
+ { 0x04b8, 0x30af }, /* kana_KU ク KATAKANA LETTER KU */
+ { 0x04b9, 0x30b1 }, /* kana_KE ケ KATAKANA LETTER KE */
+ { 0x04ba, 0x30b3 }, /* kana_KO コ KATAKANA LETTER KO */
+ { 0x04bb, 0x30b5 }, /* kana_SA サ KATAKANA LETTER SA */
+ { 0x04bc, 0x30b7 }, /* kana_SHI シ KATAKANA LETTER SI */
+ { 0x04bd, 0x30b9 }, /* kana_SU ス KATAKANA LETTER SU */
+ { 0x04be, 0x30bb }, /* kana_SE セ KATAKANA LETTER SE */
+ { 0x04bf, 0x30bd }, /* kana_SO ソ KATAKANA LETTER SO */
+ { 0x04c0, 0x30bf }, /* kana_TA タ KATAKANA LETTER TA */
+ { 0x04c1, 0x30c1 }, /* kana_CHI チ KATAKANA LETTER TI */
+ { 0x04c2, 0x30c4 }, /* kana_TSU ツ KATAKANA LETTER TU */
+ { 0x04c3, 0x30c6 }, /* kana_TE テ KATAKANA LETTER TE */
+ { 0x04c4, 0x30c8 }, /* kana_TO ト KATAKANA LETTER TO */
+ { 0x04c5, 0x30ca }, /* kana_NA ナ KATAKANA LETTER NA */
+ { 0x04c6, 0x30cb }, /* kana_NI ニ KATAKANA LETTER NI */
+ { 0x04c7, 0x30cc }, /* kana_NU ヌ KATAKANA LETTER NU */
+ { 0x04c8, 0x30cd }, /* kana_NE ネ KATAKANA LETTER NE */
+ { 0x04c9, 0x30ce }, /* kana_NO ノ KATAKANA LETTER NO */
+ { 0x04ca, 0x30cf }, /* kana_HA ハ KATAKANA LETTER HA */
+ { 0x04cb, 0x30d2 }, /* kana_HI ヒ KATAKANA LETTER HI */
+ { 0x04cc, 0x30d5 }, /* kana_FU フ KATAKANA LETTER HU */
+ { 0x04cd, 0x30d8 }, /* kana_HE ヘ KATAKANA LETTER HE */
+ { 0x04ce, 0x30db }, /* kana_HO ホ KATAKANA LETTER HO */
+ { 0x04cf, 0x30de }, /* kana_MA マ KATAKANA LETTER MA */
+ { 0x04d0, 0x30df }, /* kana_MI ミ KATAKANA LETTER MI */
+ { 0x04d1, 0x30e0 }, /* kana_MU ム KATAKANA LETTER MU */
+ { 0x04d2, 0x30e1 }, /* kana_ME メ KATAKANA LETTER ME */
+ { 0x04d3, 0x30e2 }, /* kana_MO モ KATAKANA LETTER MO */
+ { 0x04d4, 0x30e4 }, /* kana_YA ヤ KATAKANA LETTER YA */
+ { 0x04d5, 0x30e6 }, /* kana_YU ユ KATAKANA LETTER YU */
+ { 0x04d6, 0x30e8 }, /* kana_YO ヨ KATAKANA LETTER YO */
+ { 0x04d7, 0x30e9 }, /* kana_RA ラ KATAKANA LETTER RA */
+ { 0x04d8, 0x30ea }, /* kana_RI リ KATAKANA LETTER RI */
+ { 0x04d9, 0x30eb }, /* kana_RU ル KATAKANA LETTER RU */
+ { 0x04da, 0x30ec }, /* kana_RE レ KATAKANA LETTER RE */
+ { 0x04db, 0x30ed }, /* kana_RO ロ KATAKANA LETTER RO */
+ { 0x04dc, 0x30ef }, /* kana_WA ワ KATAKANA LETTER WA */
+ { 0x04dd, 0x30f3 }, /* kana_N ン KATAKANA LETTER N */
+ { 0x04de, 0x309b }, /* voicedsound ゛ KATAKANA-HIRAGANA VOICED SOUND MARK */
+ { 0x04df, 0x309c }, /* semivoicedsound ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
+ { 0x05ac, 0x060c }, /* Arabic_comma ، ARABIC COMMA */
+ { 0x05bb, 0x061b }, /* Arabic_semicolon ؛ ARABIC SEMICOLON */
+ { 0x05bf, 0x061f }, /* Arabic_question_mark ؟ ARABIC QUESTION MARK */
+ { 0x05c1, 0x0621 }, /* Arabic_hamza ء ARABIC LETTER HAMZA */
+ { 0x05c2, 0x0622 }, /* Arabic_maddaonalef آ ARABIC LETTER ALEF WITH MADDA ABOVE */
+ { 0x05c3, 0x0623 }, /* Arabic_hamzaonalef أ ARABIC LETTER ALEF WITH HAMZA ABOVE */
+ { 0x05c4, 0x0624 }, /* Arabic_hamzaonwaw ؤ ARABIC LETTER WAW WITH HAMZA ABOVE */
+ { 0x05c5, 0x0625 }, /* Arabic_hamzaunderalef إ ARABIC LETTER ALEF WITH HAMZA BELOW */
+ { 0x05c6, 0x0626 }, /* Arabic_hamzaonyeh ئ ARABIC LETTER YEH WITH HAMZA ABOVE */
+ { 0x05c7, 0x0627 }, /* Arabic_alef ا ARABIC LETTER ALEF */
+ { 0x05c8, 0x0628 }, /* Arabic_beh ب ARABIC LETTER BEH */
+ { 0x05c9, 0x0629 }, /* Arabic_tehmarbuta ة ARABIC LETTER TEH MARBUTA */
+ { 0x05ca, 0x062a }, /* Arabic_teh ت ARABIC LETTER TEH */
+ { 0x05cb, 0x062b }, /* Arabic_theh ث ARABIC LETTER THEH */
+ { 0x05cc, 0x062c }, /* Arabic_jeem ج ARABIC LETTER JEEM */
+ { 0x05cd, 0x062d }, /* Arabic_hah ح ARABIC LETTER HAH */
+ { 0x05ce, 0x062e }, /* Arabic_khah خ ARABIC LETTER KHAH */
+ { 0x05cf, 0x062f }, /* Arabic_dal د ARABIC LETTER DAL */
+ { 0x05d0, 0x0630 }, /* Arabic_thal ذ ARABIC LETTER THAL */
+ { 0x05d1, 0x0631 }, /* Arabic_ra ر ARABIC LETTER REH */
+ { 0x05d2, 0x0632 }, /* Arabic_zain ز ARABIC LETTER ZAIN */
+ { 0x05d3, 0x0633 }, /* Arabic_seen س ARABIC LETTER SEEN */
+ { 0x05d4, 0x0634 }, /* Arabic_sheen ش ARABIC LETTER SHEEN */
+ { 0x05d5, 0x0635 }, /* Arabic_sad ص ARABIC LETTER SAD */
+ { 0x05d6, 0x0636 }, /* Arabic_dad ض ARABIC LETTER DAD */
+ { 0x05d7, 0x0637 }, /* Arabic_tah ط ARABIC LETTER TAH */
+ { 0x05d8, 0x0638 }, /* Arabic_zah ظ ARABIC LETTER ZAH */
+ { 0x05d9, 0x0639 }, /* Arabic_ain ع ARABIC LETTER AIN */
+ { 0x05da, 0x063a }, /* Arabic_ghain غ ARABIC LETTER GHAIN */
+ { 0x05e0, 0x0640 }, /* Arabic_tatweel ـ ARABIC TATWEEL */
+ { 0x05e1, 0x0641 }, /* Arabic_feh ف ARABIC LETTER FEH */
+ { 0x05e2, 0x0642 }, /* Arabic_qaf ق ARABIC LETTER QAF */
+ { 0x05e3, 0x0643 }, /* Arabic_kaf ك ARABIC LETTER KAF */
+ { 0x05e4, 0x0644 }, /* Arabic_lam ل ARABIC LETTER LAM */
+ { 0x05e5, 0x0645 }, /* Arabic_meem م ARABIC LETTER MEEM */
+ { 0x05e6, 0x0646 }, /* Arabic_noon ن ARABIC LETTER NOON */
+ { 0x05e7, 0x0647 }, /* Arabic_ha ه ARABIC LETTER HEH */
+ { 0x05e8, 0x0648 }, /* Arabic_waw و ARABIC LETTER WAW */
+ { 0x05e9, 0x0649 }, /* Arabic_alefmaksura ى ARABIC LETTER ALEF MAKSURA */
+ { 0x05ea, 0x064a }, /* Arabic_yeh ي ARABIC LETTER YEH */
+ { 0x05eb, 0x064b }, /* Arabic_fathatan ً ARABIC FATHATAN */
+ { 0x05ec, 0x064c }, /* Arabic_dammatan ٌ ARABIC DAMMATAN */
+ { 0x05ed, 0x064d }, /* Arabic_kasratan ٍ ARABIC KASRATAN */
+ { 0x05ee, 0x064e }, /* Arabic_fatha َ ARABIC FATHA */
+ { 0x05ef, 0x064f }, /* Arabic_damma ُ ARABIC DAMMA */
+ { 0x05f0, 0x0650 }, /* Arabic_kasra ِ ARABIC KASRA */
+ { 0x05f1, 0x0651 }, /* Arabic_shadda ّ ARABIC SHADDA */
+ { 0x05f2, 0x0652 }, /* Arabic_sukun ْ ARABIC SUKUN */
+ { 0x06a1, 0x0452 }, /* Serbian_dje ђ CYRILLIC SMALL LETTER DJE */
+ { 0x06a2, 0x0453 }, /* Macedonia_gje ѓ CYRILLIC SMALL LETTER GJE */
+ { 0x06a3, 0x0451 }, /* Cyrillic_io ё CYRILLIC SMALL LETTER IO */
+ { 0x06a4, 0x0454 }, /* Ukrainian_ie є CYRILLIC SMALL LETTER UKRAINIAN IE */
+ { 0x06a5, 0x0455 }, /* Macedonia_dse ѕ CYRILLIC SMALL LETTER DZE */
+ { 0x06a6, 0x0456 }, /* Ukrainian_i і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */
+ { 0x06a7, 0x0457 }, /* Ukrainian_yi ї CYRILLIC SMALL LETTER YI */
+ { 0x06a8, 0x0458 }, /* Cyrillic_je ј CYRILLIC SMALL LETTER JE */
+ { 0x06a9, 0x0459 }, /* Cyrillic_lje љ CYRILLIC SMALL LETTER LJE */
+ { 0x06aa, 0x045a }, /* Cyrillic_nje њ CYRILLIC SMALL LETTER NJE */
+ { 0x06ab, 0x045b }, /* Serbian_tshe ћ CYRILLIC SMALL LETTER TSHE */
+ { 0x06ac, 0x045c }, /* Macedonia_kje ќ CYRILLIC SMALL LETTER KJE */
+ { 0x06ae, 0x045e }, /* Byelorussian_shortu ў CYRILLIC SMALL LETTER SHORT U */
+ { 0x06af, 0x045f }, /* Cyrillic_dzhe џ CYRILLIC SMALL LETTER DZHE */
+ { 0x06b0, 0x2116 }, /* numerosign № NUMERO SIGN */
+ { 0x06b1, 0x0402 }, /* Serbian_DJE Ђ CYRILLIC CAPITAL LETTER DJE */
+ { 0x06b2, 0x0403 }, /* Macedonia_GJE Ѓ CYRILLIC CAPITAL LETTER GJE */
+ { 0x06b3, 0x0401 }, /* Cyrillic_IO Ё CYRILLIC CAPITAL LETTER IO */
+ { 0x06b4, 0x0404 }, /* Ukrainian_IE Є CYRILLIC CAPITAL LETTER UKRAINIAN IE */
+ { 0x06b5, 0x0405 }, /* Macedonia_DSE Ѕ CYRILLIC CAPITAL LETTER DZE */
+ { 0x06b6, 0x0406 }, /* Ukrainian_I І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */
+ { 0x06b7, 0x0407 }, /* Ukrainian_YI Ї CYRILLIC CAPITAL LETTER YI */
+ { 0x06b8, 0x0408 }, /* Cyrillic_JE Ј CYRILLIC CAPITAL LETTER JE */
+ { 0x06b9, 0x0409 }, /* Cyrillic_LJE Љ CYRILLIC CAPITAL LETTER LJE */
+ { 0x06ba, 0x040a }, /* Cyrillic_NJE Њ CYRILLIC CAPITAL LETTER NJE */
+ { 0x06bb, 0x040b }, /* Serbian_TSHE Ћ CYRILLIC CAPITAL LETTER TSHE */
+ { 0x06bc, 0x040c }, /* Macedonia_KJE Ќ CYRILLIC CAPITAL LETTER KJE */
+ { 0x06be, 0x040e }, /* Byelorussian_SHORTU Ў CYRILLIC CAPITAL LETTER SHORT U */
+ { 0x06bf, 0x040f }, /* Cyrillic_DZHE Џ CYRILLIC CAPITAL LETTER DZHE */
+ { 0x06c0, 0x044e }, /* Cyrillic_yu ю CYRILLIC SMALL LETTER YU */
+ { 0x06c1, 0x0430 }, /* Cyrillic_a а CYRILLIC SMALL LETTER A */
+ { 0x06c2, 0x0431 }, /* Cyrillic_be б CYRILLIC SMALL LETTER BE */
+ { 0x06c3, 0x0446 }, /* Cyrillic_tse ц CYRILLIC SMALL LETTER TSE */
+ { 0x06c4, 0x0434 }, /* Cyrillic_de д CYRILLIC SMALL LETTER DE */
+ { 0x06c5, 0x0435 }, /* Cyrillic_ie е CYRILLIC SMALL LETTER IE */
+ { 0x06c6, 0x0444 }, /* Cyrillic_ef ф CYRILLIC SMALL LETTER EF */
+ { 0x06c7, 0x0433 }, /* Cyrillic_ghe г CYRILLIC SMALL LETTER GHE */
+ { 0x06c8, 0x0445 }, /* Cyrillic_ha х CYRILLIC SMALL LETTER HA */
+ { 0x06c9, 0x0438 }, /* Cyrillic_i и CYRILLIC SMALL LETTER I */
+ { 0x06ca, 0x0439 }, /* Cyrillic_shorti й CYRILLIC SMALL LETTER SHORT I */
+ { 0x06cb, 0x043a }, /* Cyrillic_ka к CYRILLIC SMALL LETTER KA */
+ { 0x06cc, 0x043b }, /* Cyrillic_el л CYRILLIC SMALL LETTER EL */
+ { 0x06cd, 0x043c }, /* Cyrillic_em м CYRILLIC SMALL LETTER EM */
+ { 0x06ce, 0x043d }, /* Cyrillic_en н CYRILLIC SMALL LETTER EN */
+ { 0x06cf, 0x043e }, /* Cyrillic_o о CYRILLIC SMALL LETTER O */
+ { 0x06d0, 0x043f }, /* Cyrillic_pe п CYRILLIC SMALL LETTER PE */
+ { 0x06d1, 0x044f }, /* Cyrillic_ya я CYRILLIC SMALL LETTER YA */
+ { 0x06d2, 0x0440 }, /* Cyrillic_er р CYRILLIC SMALL LETTER ER */
+ { 0x06d3, 0x0441 }, /* Cyrillic_es с CYRILLIC SMALL LETTER ES */
+ { 0x06d4, 0x0442 }, /* Cyrillic_te т CYRILLIC SMALL LETTER TE */
+ { 0x06d5, 0x0443 }, /* Cyrillic_u у CYRILLIC SMALL LETTER U */
+ { 0x06d6, 0x0436 }, /* Cyrillic_zhe ж CYRILLIC SMALL LETTER ZHE */
+ { 0x06d7, 0x0432 }, /* Cyrillic_ve в CYRILLIC SMALL LETTER VE */
+ { 0x06d8, 0x044c }, /* Cyrillic_softsign ь CYRILLIC SMALL LETTER SOFT SIGN */
+ { 0x06d9, 0x044b }, /* Cyrillic_yeru ы CYRILLIC SMALL LETTER YERU */
+ { 0x06da, 0x0437 }, /* Cyrillic_ze з CYRILLIC SMALL LETTER ZE */
+ { 0x06db, 0x0448 }, /* Cyrillic_sha ш CYRILLIC SMALL LETTER SHA */
+ { 0x06dc, 0x044d }, /* Cyrillic_e э CYRILLIC SMALL LETTER E */
+ { 0x06dd, 0x0449 }, /* Cyrillic_shcha щ CYRILLIC SMALL LETTER SHCHA */
+ { 0x06de, 0x0447 }, /* Cyrillic_che ч CYRILLIC SMALL LETTER CHE */
+ { 0x06df, 0x044a }, /* Cyrillic_hardsign ъ CYRILLIC SMALL LETTER HARD SIGN */
+ { 0x06e0, 0x042e }, /* Cyrillic_YU Ю CYRILLIC CAPITAL LETTER YU */
+ { 0x06e1, 0x0410 }, /* Cyrillic_A А CYRILLIC CAPITAL LETTER A */
+ { 0x06e2, 0x0411 }, /* Cyrillic_BE Б CYRILLIC CAPITAL LETTER BE */
+ { 0x06e3, 0x0426 }, /* Cyrillic_TSE Ц CYRILLIC CAPITAL LETTER TSE */
+ { 0x06e4, 0x0414 }, /* Cyrillic_DE Д CYRILLIC CAPITAL LETTER DE */
+ { 0x06e5, 0x0415 }, /* Cyrillic_IE Е CYRILLIC CAPITAL LETTER IE */
+ { 0x06e6, 0x0424 }, /* Cyrillic_EF Ф CYRILLIC CAPITAL LETTER EF */
+ { 0x06e7, 0x0413 }, /* Cyrillic_GHE Г CYRILLIC CAPITAL LETTER GHE */
+ { 0x06e8, 0x0425 }, /* Cyrillic_HA Х CYRILLIC CAPITAL LETTER HA */
+ { 0x06e9, 0x0418 }, /* Cyrillic_I И CYRILLIC CAPITAL LETTER I */
+ { 0x06ea, 0x0419 }, /* Cyrillic_SHORTI Й CYRILLIC CAPITAL LETTER SHORT I */
+ { 0x06eb, 0x041a }, /* Cyrillic_KA К CYRILLIC CAPITAL LETTER KA */
+ { 0x06ec, 0x041b }, /* Cyrillic_EL Л CYRILLIC CAPITAL LETTER EL */
+ { 0x06ed, 0x041c }, /* Cyrillic_EM М CYRILLIC CAPITAL LETTER EM */
+ { 0x06ee, 0x041d }, /* Cyrillic_EN Н CYRILLIC CAPITAL LETTER EN */
+ { 0x06ef, 0x041e }, /* Cyrillic_O О CYRILLIC CAPITAL LETTER O */
+ { 0x06f0, 0x041f }, /* Cyrillic_PE П CYRILLIC CAPITAL LETTER PE */
+ { 0x06f1, 0x042f }, /* Cyrillic_YA Я CYRILLIC CAPITAL LETTER YA */
+ { 0x06f2, 0x0420 }, /* Cyrillic_ER Р CYRILLIC CAPITAL LETTER ER */
+ { 0x06f3, 0x0421 }, /* Cyrillic_ES С CYRILLIC CAPITAL LETTER ES */
+ { 0x06f4, 0x0422 }, /* Cyrillic_TE Т CYRILLIC CAPITAL LETTER TE */
+ { 0x06f5, 0x0423 }, /* Cyrillic_U У CYRILLIC CAPITAL LETTER U */
+ { 0x06f6, 0x0416 }, /* Cyrillic_ZHE Ж CYRILLIC CAPITAL LETTER ZHE */
+ { 0x06f7, 0x0412 }, /* Cyrillic_VE В CYRILLIC CAPITAL LETTER VE */
+ { 0x06f8, 0x042c }, /* Cyrillic_SOFTSIGN Ь CYRILLIC CAPITAL LETTER SOFT SIGN */
+ { 0x06f9, 0x042b }, /* Cyrillic_YERU Ы CYRILLIC CAPITAL LETTER YERU */
+ { 0x06fa, 0x0417 }, /* Cyrillic_ZE З CYRILLIC CAPITAL LETTER ZE */
+ { 0x06fb, 0x0428 }, /* Cyrillic_SHA Ш CYRILLIC CAPITAL LETTER SHA */
+ { 0x06fc, 0x042d }, /* Cyrillic_E Э CYRILLIC CAPITAL LETTER E */
+ { 0x06fd, 0x0429 }, /* Cyrillic_SHCHA Щ CYRILLIC CAPITAL LETTER SHCHA */
+ { 0x06fe, 0x0427 }, /* Cyrillic_CHE Ч CYRILLIC CAPITAL LETTER CHE */
+ { 0x06ff, 0x042a }, /* Cyrillic_HARDSIGN Ъ CYRILLIC CAPITAL LETTER HARD SIGN */
+ { 0x07a1, 0x0386 }, /* Greek_ALPHAaccent Ά GREEK CAPITAL LETTER ALPHA WITH TONOS */
+ { 0x07a2, 0x0388 }, /* Greek_EPSILONaccent Έ GREEK CAPITAL LETTER EPSILON WITH TONOS */
+ { 0x07a3, 0x0389 }, /* Greek_ETAaccent Ή GREEK CAPITAL LETTER ETA WITH TONOS */
+ { 0x07a4, 0x038a }, /* Greek_IOTAaccent Ί GREEK CAPITAL LETTER IOTA WITH TONOS */
+ { 0x07a5, 0x03aa }, /* Greek_IOTAdiaeresis Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
+ { 0x07a7, 0x038c }, /* Greek_OMICRONaccent Ό GREEK CAPITAL LETTER OMICRON WITH TONOS */
+ { 0x07a8, 0x038e }, /* Greek_UPSILONaccent Ύ GREEK CAPITAL LETTER UPSILON WITH TONOS */
+ { 0x07a9, 0x03ab }, /* Greek_UPSILONdieresis Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
+ { 0x07ab, 0x038f }, /* Greek_OMEGAaccent Ώ GREEK CAPITAL LETTER OMEGA WITH TONOS */
+ { 0x07ae, 0x0385 }, /* Greek_accentdieresis ΅ GREEK DIALYTIKA TONOS */
+ { 0x07af, 0x2015 }, /* Greek_horizbar ― HORIZONTAL BAR */
+ { 0x07b1, 0x03ac }, /* Greek_alphaaccent ά GREEK SMALL LETTER ALPHA WITH TONOS */
+ { 0x07b2, 0x03ad }, /* Greek_epsilonaccent έ GREEK SMALL LETTER EPSILON WITH TONOS */
+ { 0x07b3, 0x03ae }, /* Greek_etaaccent ή GREEK SMALL LETTER ETA WITH TONOS */
+ { 0x07b4, 0x03af }, /* Greek_iotaaccent ί GREEK SMALL LETTER IOTA WITH TONOS */
+ { 0x07b5, 0x03ca }, /* Greek_iotadieresis ϊ GREEK SMALL LETTER IOTA WITH DIALYTIKA */
+ { 0x07b6, 0x0390 }, /* Greek_iotaaccentdieresis ΐ GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+ { 0x07b7, 0x03cc }, /* Greek_omicronaccent ό GREEK SMALL LETTER OMICRON WITH TONOS */
+ { 0x07b8, 0x03cd }, /* Greek_upsilonaccent ύ GREEK SMALL LETTER UPSILON WITH TONOS */
+ { 0x07b9, 0x03cb }, /* Greek_upsilondieresis ϋ GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
+ { 0x07ba, 0x03b0 }, /* Greek_upsilonaccentdieresis ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
+ { 0x07bb, 0x03ce }, /* Greek_omegaaccent ώ GREEK SMALL LETTER OMEGA WITH TONOS */
+ { 0x07c1, 0x0391 }, /* Greek_ALPHA Α GREEK CAPITAL LETTER ALPHA */
+ { 0x07c2, 0x0392 }, /* Greek_BETA Β GREEK CAPITAL LETTER BETA */
+ { 0x07c3, 0x0393 }, /* Greek_GAMMA Γ GREEK CAPITAL LETTER GAMMA */
+ { 0x07c4, 0x0394 }, /* Greek_DELTA Δ GREEK CAPITAL LETTER DELTA */
+ { 0x07c5, 0x0395 }, /* Greek_EPSILON Ε GREEK CAPITAL LETTER EPSILON */
+ { 0x07c6, 0x0396 }, /* Greek_ZETA Ζ GREEK CAPITAL LETTER ZETA */
+ { 0x07c7, 0x0397 }, /* Greek_ETA Η GREEK CAPITAL LETTER ETA */
+ { 0x07c8, 0x0398 }, /* Greek_THETA Θ GREEK CAPITAL LETTER THETA */
+ { 0x07c9, 0x0399 }, /* Greek_IOTA Ι GREEK CAPITAL LETTER IOTA */
+ { 0x07ca, 0x039a }, /* Greek_KAPPA Κ GREEK CAPITAL LETTER KAPPA */
+ { 0x07cb, 0x039b }, /* Greek_LAMBDA Λ GREEK CAPITAL LETTER LAMDA */
+ { 0x07cc, 0x039c }, /* Greek_MU Μ GREEK CAPITAL LETTER MU */
+ { 0x07cd, 0x039d }, /* Greek_NU Ν GREEK CAPITAL LETTER NU */
+ { 0x07ce, 0x039e }, /* Greek_XI Ξ GREEK CAPITAL LETTER XI */
+ { 0x07cf, 0x039f }, /* Greek_OMICRON Ο GREEK CAPITAL LETTER OMICRON */
+ { 0x07d0, 0x03a0 }, /* Greek_PI Π GREEK CAPITAL LETTER PI */
+ { 0x07d1, 0x03a1 }, /* Greek_RHO Ρ GREEK CAPITAL LETTER RHO */
+ { 0x07d2, 0x03a3 }, /* Greek_SIGMA Σ GREEK CAPITAL LETTER SIGMA */
+ { 0x07d4, 0x03a4 }, /* Greek_TAU Τ GREEK CAPITAL LETTER TAU */
+ { 0x07d5, 0x03a5 }, /* Greek_UPSILON Υ GREEK CAPITAL LETTER UPSILON */
+ { 0x07d6, 0x03a6 }, /* Greek_PHI Φ GREEK CAPITAL LETTER PHI */
+ { 0x07d7, 0x03a7 }, /* Greek_CHI Χ GREEK CAPITAL LETTER CHI */
+ { 0x07d8, 0x03a8 }, /* Greek_PSI Ψ GREEK CAPITAL LETTER PSI */
+ { 0x07d9, 0x03a9 }, /* Greek_OMEGA Ω GREEK CAPITAL LETTER OMEGA */
+ { 0x07e1, 0x03b1 }, /* Greek_alpha α GREEK SMALL LETTER ALPHA */
+ { 0x07e2, 0x03b2 }, /* Greek_beta β GREEK SMALL LETTER BETA */
+ { 0x07e3, 0x03b3 }, /* Greek_gamma γ GREEK SMALL LETTER GAMMA */
+ { 0x07e4, 0x03b4 }, /* Greek_delta δ GREEK SMALL LETTER DELTA */
+ { 0x07e5, 0x03b5 }, /* Greek_epsilon ε GREEK SMALL LETTER EPSILON */
+ { 0x07e6, 0x03b6 }, /* Greek_zeta ζ GREEK SMALL LETTER ZETA */
+ { 0x07e7, 0x03b7 }, /* Greek_eta η GREEK SMALL LETTER ETA */
+ { 0x07e8, 0x03b8 }, /* Greek_theta θ GREEK SMALL LETTER THETA */
+ { 0x07e9, 0x03b9 }, /* Greek_iota ι GREEK SMALL LETTER IOTA */
+ { 0x07ea, 0x03ba }, /* Greek_kappa κ GREEK SMALL LETTER KAPPA */
+ { 0x07eb, 0x03bb }, /* Greek_lambda λ GREEK SMALL LETTER LAMDA */
+ { 0x07ec, 0x03bc }, /* Greek_mu μ GREEK SMALL LETTER MU */
+ { 0x07ed, 0x03bd }, /* Greek_nu ν GREEK SMALL LETTER NU */
+ { 0x07ee, 0x03be }, /* Greek_xi ξ GREEK SMALL LETTER XI */
+ { 0x07ef, 0x03bf }, /* Greek_omicron ο GREEK SMALL LETTER OMICRON */
+ { 0x07f0, 0x03c0 }, /* Greek_pi π GREEK SMALL LETTER PI */
+ { 0x07f1, 0x03c1 }, /* Greek_rho ρ GREEK SMALL LETTER RHO */
+ { 0x07f2, 0x03c3 }, /* Greek_sigma σ GREEK SMALL LETTER SIGMA */
+ { 0x07f3, 0x03c2 }, /* Greek_finalsmallsigma ς GREEK SMALL LETTER FINAL SIGMA */
+ { 0x07f4, 0x03c4 }, /* Greek_tau τ GREEK SMALL LETTER TAU */
+ { 0x07f5, 0x03c5 }, /* Greek_upsilon υ GREEK SMALL LETTER UPSILON */
+ { 0x07f6, 0x03c6 }, /* Greek_phi φ GREEK SMALL LETTER PHI */
+ { 0x07f7, 0x03c7 }, /* Greek_chi χ GREEK SMALL LETTER CHI */
+ { 0x07f8, 0x03c8 }, /* Greek_psi ψ GREEK SMALL LETTER PSI */
+ { 0x07f9, 0x03c9 }, /* Greek_omega ω GREEK SMALL LETTER OMEGA */
+/* 0x08a1 leftradical ? ??? */
+/* 0x08a2 topleftradical ? ??? */
+/* 0x08a3 horizconnector ? ??? */
+ { 0x08a4, 0x2320 }, /* topintegral ⌠ TOP HALF INTEGRAL */
+ { 0x08a5, 0x2321 }, /* botintegral ⌡ BOTTOM HALF INTEGRAL */
+ { 0x08a6, 0x2502 }, /* vertconnector │ BOX DRAWINGS LIGHT VERTICAL */
+/* 0x08a7 topleftsqbracket ? ??? */
+/* 0x08a8 botleftsqbracket ? ??? */
+/* 0x08a9 toprightsqbracket ? ??? */
+/* 0x08aa botrightsqbracket ? ??? */
+/* 0x08ab topleftparens ? ??? */
+/* 0x08ac botleftparens ? ??? */
+/* 0x08ad toprightparens ? ??? */
+/* 0x08ae botrightparens ? ??? */
+/* 0x08af leftmiddlecurlybrace ? ??? */
+/* 0x08b0 rightmiddlecurlybrace ? ??? */
+/* 0x08b1 topleftsummation ? ??? */
+/* 0x08b2 botleftsummation ? ??? */
+/* 0x08b3 topvertsummationconnector ? ??? */
+/* 0x08b4 botvertsummationconnector ? ??? */
+/* 0x08b5 toprightsummation ? ??? */
+/* 0x08b6 botrightsummation ? ??? */
+/* 0x08b7 rightmiddlesummation ? ??? */
+ { 0x08bc, 0x2264 }, /* lessthanequal ≤ LESS-THAN OR EQUAL TO */
+ { 0x08bd, 0x2260 }, /* notequal ≠ NOT EQUAL TO */
+ { 0x08be, 0x2265 }, /* greaterthanequal ≥ GREATER-THAN OR EQUAL TO */
+ { 0x08bf, 0x222b }, /* integral ∫ INTEGRAL */
+ { 0x08c0, 0x2234 }, /* therefore ∴ THEREFORE */
+ { 0x08c1, 0x221d }, /* variation ∝ PROPORTIONAL TO */
+ { 0x08c2, 0x221e }, /* infinity ∞ INFINITY */
+ { 0x08c5, 0x2207 }, /* nabla ∇ NABLA */
+ { 0x08c8, 0x2245 }, /* approximate ≅ APPROXIMATELY EQUAL TO */
+/* 0x08c9 similarequal ? ??? */
+ { 0x08cd, 0x21d4 }, /* ifonlyif ⇔ LEFT RIGHT DOUBLE ARROW */
+ { 0x08ce, 0x21d2 }, /* implies ⇒ RIGHTWARDS DOUBLE ARROW */
+ { 0x08cf, 0x2261 }, /* identical ≡ IDENTICAL TO */
+ { 0x08d6, 0x221a }, /* radical √ SQUARE ROOT */
+ { 0x08da, 0x2282 }, /* includedin ⊂ SUBSET OF */
+ { 0x08db, 0x2283 }, /* includes ⊃ SUPERSET OF */
+ { 0x08dc, 0x2229 }, /* intersection ∩ INTERSECTION */
+ { 0x08dd, 0x222a }, /* union ∪ UNION */
+ { 0x08de, 0x2227 }, /* logicaland ∧ LOGICAL AND */
+ { 0x08df, 0x2228 }, /* logicalor ∨ LOGICAL OR */
+ { 0x08ef, 0x2202 }, /* partialderivative ∂ PARTIAL DIFFERENTIAL */
+ { 0x08f6, 0x0192 }, /* function ƒ LATIN SMALL LETTER F WITH HOOK */
+ { 0x08fb, 0x2190 }, /* leftarrow ← LEFTWARDS ARROW */
+ { 0x08fc, 0x2191 }, /* uparrow ↑ UPWARDS ARROW */
+ { 0x08fd, 0x2192 }, /* rightarrow → RIGHTWARDS ARROW */
+ { 0x08fe, 0x2193 }, /* downarrow ↓ DOWNWARDS ARROW */
+ { 0x09df, 0x2422 }, /* blank ␢ BLANK SYMBOL */
+ { 0x09e0, 0x25c6 }, /* soliddiamond ◆ BLACK DIAMOND */
+ { 0x09e1, 0x2592 }, /* checkerboard ▒ MEDIUM SHADE */
+ { 0x09e2, 0x2409 }, /* ht ␉ SYMBOL FOR HORIZONTAL TABULATION */
+ { 0x09e3, 0x240c }, /* ff ␌ SYMBOL FOR FORM FEED */
+ { 0x09e4, 0x240d }, /* cr ␍ SYMBOL FOR CARRIAGE RETURN */
+ { 0x09e5, 0x240a }, /* lf ␊ SYMBOL FOR LINE FEED */
+ { 0x09e8, 0x2424 }, /* nl  SYMBOL FOR NEWLINE */
+ { 0x09e9, 0x240b }, /* vt ␋ SYMBOL FOR VERTICAL TABULATION */
+ { 0x09ea, 0x2518 }, /* lowrightcorner ┘ BOX DRAWINGS LIGHT UP AND LEFT */
+ { 0x09eb, 0x2510 }, /* uprightcorner ┐ BOX DRAWINGS LIGHT DOWN AND LEFT */
+ { 0x09ec, 0x250c }, /* upleftcorner ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */
+ { 0x09ed, 0x2514 }, /* lowleftcorner └ BOX DRAWINGS LIGHT UP AND RIGHT */
+ { 0x09ee, 0x253c }, /* crossinglines ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
+/* 0x09ef horizlinescan1 ? ??? */
+/* 0x09f0 horizlinescan3 ? ??? */
+ { 0x09f1, 0x2500 }, /* horizlinescan5 ─ BOX DRAWINGS LIGHT HORIZONTAL */
+/* 0x09f2 horizlinescan7 ? ??? */
+/* 0x09f3 horizlinescan9 ? ??? */
+ { 0x09f4, 0x251c }, /* leftt ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
+ { 0x09f5, 0x2524 }, /* rightt ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT */
+ { 0x09f6, 0x2534 }, /* bott ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL */
+ { 0x09f7, 0x252c }, /* topt ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
+ { 0x09f8, 0x2502 }, /* vertbar │ BOX DRAWINGS LIGHT VERTICAL */
+ { 0x0aa1, 0x2003 }, /* emspace EM SPACE */
+ { 0x0aa2, 0x2002 }, /* enspace EN SPACE */
+ { 0x0aa3, 0x2004 }, /* em3space THREE-PER-EM SPACE */
+ { 0x0aa4, 0x2005 }, /* em4space FOUR-PER-EM SPACE */
+ { 0x0aa5, 0x2007 }, /* digitspace FIGURE SPACE */
+ { 0x0aa6, 0x2008 }, /* punctspace PUNCTUATION SPACE */
+ { 0x0aa7, 0x2009 }, /* thinspace THIN SPACE */
+ { 0x0aa8, 0x200a }, /* hairspace HAIR SPACE */
+ { 0x0aa9, 0x2014 }, /* emdash — EM DASH */
+ { 0x0aaa, 0x2013 }, /* endash – EN DASH */
+/* 0x0aac signifblank ? ??? */
+ { 0x0aae, 0x2026 }, /* ellipsis … HORIZONTAL ELLIPSIS */
+/* 0x0aaf doubbaselinedot ? ??? */
+ { 0x0ab0, 0x2153 }, /* onethird ⅓ VULGAR FRACTION ONE THIRD */
+ { 0x0ab1, 0x2154 }, /* twothirds ⅔ VULGAR FRACTION TWO THIRDS */
+ { 0x0ab2, 0x2155 }, /* onefifth ⅕ VULGAR FRACTION ONE FIFTH */
+ { 0x0ab3, 0x2156 }, /* twofifths ⅖ VULGAR FRACTION TWO FIFTHS */
+ { 0x0ab4, 0x2157 }, /* threefifths ⅗ VULGAR FRACTION THREE FIFTHS */
+ { 0x0ab5, 0x2158 }, /* fourfifths ⅘ VULGAR FRACTION FOUR FIFTHS */
+ { 0x0ab6, 0x2159 }, /* onesixth ⅙ VULGAR FRACTION ONE SIXTH */
+ { 0x0ab7, 0x215a }, /* fivesixths ⅚ VULGAR FRACTION FIVE SIXTHS */
+ { 0x0ab8, 0x2105 }, /* careof ℅ CARE OF */
+ { 0x0abb, 0x2012 }, /* figdash ‒ FIGURE DASH */
+ { 0x0abc, 0x2329 }, /* leftanglebracket 〈 LEFT-POINTING ANGLE BRACKET */
+ { 0x0abd, 0x002e }, /* decimalpoint . FULL STOP */
+ { 0x0abe, 0x232a }, /* rightanglebracket 〉 RIGHT-POINTING ANGLE BRACKET */
+/* 0x0abf marker ? ??? */
+ { 0x0ac3, 0x215b }, /* oneeighth ⅛ VULGAR FRACTION ONE EIGHTH */
+ { 0x0ac4, 0x215c }, /* threeeighths ⅜ VULGAR FRACTION THREE EIGHTHS */
+ { 0x0ac5, 0x215d }, /* fiveeighths ⅝ VULGAR FRACTION FIVE EIGHTHS */
+ { 0x0ac6, 0x215e }, /* seveneighths ⅞ VULGAR FRACTION SEVEN EIGHTHS */
+ { 0x0ac9, 0x2122 }, /* trademark ™ TRADE MARK SIGN */
+ { 0x0aca, 0x2613 }, /* signaturemark ☓ SALTIRE */
+/* 0x0acb trademarkincircle ? ??? */
+ { 0x0acc, 0x25c1 }, /* leftopentriangle ◁ WHITE LEFT-POINTING TRIANGLE */
+ { 0x0acd, 0x25b7 }, /* rightopentriangle ▷ WHITE RIGHT-POINTING TRIANGLE */
+ { 0x0ace, 0x25cb }, /* emopencircle ○ WHITE CIRCLE */
+ { 0x0acf, 0x25a1 }, /* emopenrectangle □ WHITE SQUARE */
+ { 0x0ad0, 0x2018 }, /* leftsinglequotemark ‘ LEFT SINGLE QUOTATION MARK */
+ { 0x0ad1, 0x2019 }, /* rightsinglequotemark ’ RIGHT SINGLE QUOTATION MARK */
+ { 0x0ad2, 0x201c }, /* leftdoublequotemark “ LEFT DOUBLE QUOTATION MARK */
+ { 0x0ad3, 0x201d }, /* rightdoublequotemark ” RIGHT DOUBLE QUOTATION MARK */
+ { 0x0ad4, 0x211e }, /* prescription ℞ PRESCRIPTION TAKE */
+ { 0x0ad6, 0x2032 }, /* minutes ′ PRIME */
+ { 0x0ad7, 0x2033 }, /* seconds ″ DOUBLE PRIME */
+ { 0x0ad9, 0x271d }, /* latincross ✝ LATIN CROSS */
+/* 0x0ada hexagram ? ??? */
+ { 0x0adb, 0x25ac }, /* filledrectbullet ▬ BLACK RECTANGLE */
+ { 0x0adc, 0x25c0 }, /* filledlefttribullet ◀ BLACK LEFT-POINTING TRIANGLE */
+ { 0x0add, 0x25b6 }, /* filledrighttribullet ▶ BLACK RIGHT-POINTING TRIANGLE */
+ { 0x0ade, 0x25cf }, /* emfilledcircle ● BLACK CIRCLE */
+ { 0x0adf, 0x25a0 }, /* emfilledrect ■ BLACK SQUARE */
+ { 0x0ae0, 0x25e6 }, /* enopencircbullet ◦ WHITE BULLET */
+ { 0x0ae1, 0x25ab }, /* enopensquarebullet ▫ WHITE SMALL SQUARE */
+ { 0x0ae2, 0x25ad }, /* openrectbullet ▭ WHITE RECTANGLE */
+ { 0x0ae3, 0x25b3 }, /* opentribulletup △ WHITE UP-POINTING TRIANGLE */
+ { 0x0ae4, 0x25bd }, /* opentribulletdown ▽ WHITE DOWN-POINTING TRIANGLE */
+ { 0x0ae5, 0x2606 }, /* openstar ☆ WHITE STAR */
+ { 0x0ae6, 0x2022 }, /* enfilledcircbullet • BULLET */
+ { 0x0ae7, 0x25aa }, /* enfilledsqbullet ▪ BLACK SMALL SQUARE */
+ { 0x0ae8, 0x25b2 }, /* filledtribulletup ▲ BLACK UP-POINTING TRIANGLE */
+ { 0x0ae9, 0x25bc }, /* filledtribulletdown ▼ BLACK DOWN-POINTING TRIANGLE */
+ { 0x0aea, 0x261c }, /* leftpointer ☜ WHITE LEFT POINTING INDEX */
+ { 0x0aeb, 0x261e }, /* rightpointer ☞ WHITE RIGHT POINTING INDEX */
+ { 0x0aec, 0x2663 }, /* club ♣ BLACK CLUB SUIT */
+ { 0x0aed, 0x2666 }, /* diamond ♦ BLACK DIAMOND SUIT */
+ { 0x0aee, 0x2665 }, /* heart ♥ BLACK HEART SUIT */
+ { 0x0af0, 0x2720 }, /* maltesecross ✠ MALTESE CROSS */
+ { 0x0af1, 0x2020 }, /* dagger † DAGGER */
+ { 0x0af2, 0x2021 }, /* doubledagger ‡ DOUBLE DAGGER */
+ { 0x0af3, 0x2713 }, /* checkmark ✓ CHECK MARK */
+ { 0x0af4, 0x2717 }, /* ballotcross ✗ BALLOT X */
+ { 0x0af5, 0x266f }, /* musicalsharp ♯ MUSIC SHARP SIGN */
+ { 0x0af6, 0x266d }, /* musicalflat ♭ MUSIC FLAT SIGN */
+ { 0x0af7, 0x2642 }, /* malesymbol ♂ MALE SIGN */
+ { 0x0af8, 0x2640 }, /* femalesymbol ♀ FEMALE SIGN */
+ { 0x0af9, 0x260e }, /* telephone ☎ BLACK TELEPHONE */
+ { 0x0afa, 0x2315 }, /* telephonerecorder ⌕ TELEPHONE RECORDER */
+ { 0x0afb, 0x2117 }, /* phonographcopyright ℗ SOUND RECORDING COPYRIGHT */
+ { 0x0afc, 0x2038 }, /* caret ‸ CARET */
+ { 0x0afd, 0x201a }, /* singlelowquotemark ‚ SINGLE LOW-9 QUOTATION MARK */
+ { 0x0afe, 0x201e }, /* doublelowquotemark „ DOUBLE LOW-9 QUOTATION MARK */
+/* 0x0aff cursor ? ??? */
+ { 0x0ba3, 0x003c }, /* leftcaret < LESS-THAN SIGN */
+ { 0x0ba6, 0x003e }, /* rightcaret > GREATER-THAN SIGN */
+ { 0x0ba8, 0x2228 }, /* downcaret ∨ LOGICAL OR */
+ { 0x0ba9, 0x2227 }, /* upcaret ∧ LOGICAL AND */
+ { 0x0bc0, 0x00af }, /* overbar ¯ MACRON */
+ { 0x0bc2, 0x22a4 }, /* downtack ⊤ DOWN TACK */
+ { 0x0bc3, 0x2229 }, /* upshoe ∩ INTERSECTION */
+ { 0x0bc4, 0x230a }, /* downstile ⌊ LEFT FLOOR */
+ { 0x0bc6, 0x005f }, /* underbar _ LOW LINE */
+ { 0x0bca, 0x2218 }, /* jot ∘ RING OPERATOR */
+ { 0x0bcc, 0x2395 }, /* quad ⎕ APL FUNCTIONAL SYMBOL QUAD (Unicode 3.0) */
+ { 0x0bce, 0x22a5 }, /* uptack ⊥ UP TACK */
+ { 0x0bcf, 0x25cb }, /* circle ○ WHITE CIRCLE */
+ { 0x0bd3, 0x2308 }, /* upstile ⌈ LEFT CEILING */
+ { 0x0bd6, 0x222a }, /* downshoe ∪ UNION */
+ { 0x0bd8, 0x2283 }, /* rightshoe ⊃ SUPERSET OF */
+ { 0x0bda, 0x2282 }, /* leftshoe ⊂ SUBSET OF */
+ { 0x0bdc, 0x22a3 }, /* lefttack ⊣ LEFT TACK */
+ { 0x0bfc, 0x22a2 }, /* righttack ⊢ RIGHT TACK */
+ { 0x0cdf, 0x2017 }, /* hebrew_doublelowline ‗ DOUBLE LOW LINE */
+ { 0x0ce0, 0x05d0 }, /* hebrew_aleph א HEBREW LETTER ALEF */
+ { 0x0ce1, 0x05d1 }, /* hebrew_bet ב HEBREW LETTER BET */
+ { 0x0ce2, 0x05d2 }, /* hebrew_gimel ג HEBREW LETTER GIMEL */
+ { 0x0ce3, 0x05d3 }, /* hebrew_dalet ד HEBREW LETTER DALET */
+ { 0x0ce4, 0x05d4 }, /* hebrew_he ה HEBREW LETTER HE */
+ { 0x0ce5, 0x05d5 }, /* hebrew_waw ו HEBREW LETTER VAV */
+ { 0x0ce6, 0x05d6 }, /* hebrew_zain ז HEBREW LETTER ZAYIN */
+ { 0x0ce7, 0x05d7 }, /* hebrew_chet ח HEBREW LETTER HET */
+ { 0x0ce8, 0x05d8 }, /* hebrew_tet ט HEBREW LETTER TET */
+ { 0x0ce9, 0x05d9 }, /* hebrew_yod י HEBREW LETTER YOD */
+ { 0x0cea, 0x05da }, /* hebrew_finalkaph ך HEBREW LETTER FINAL KAF */
+ { 0x0ceb, 0x05db }, /* hebrew_kaph כ HEBREW LETTER KAF */
+ { 0x0cec, 0x05dc }, /* hebrew_lamed ל HEBREW LETTER LAMED */
+ { 0x0ced, 0x05dd }, /* hebrew_finalmem ם HEBREW LETTER FINAL MEM */
+ { 0x0cee, 0x05de }, /* hebrew_mem מ HEBREW LETTER MEM */
+ { 0x0cef, 0x05df }, /* hebrew_finalnun ן HEBREW LETTER FINAL NUN */
+ { 0x0cf0, 0x05e0 }, /* hebrew_nun נ HEBREW LETTER NUN */
+ { 0x0cf1, 0x05e1 }, /* hebrew_samech ס HEBREW LETTER SAMEKH */
+ { 0x0cf2, 0x05e2 }, /* hebrew_ayin ע HEBREW LETTER AYIN */
+ { 0x0cf3, 0x05e3 }, /* hebrew_finalpe ף HEBREW LETTER FINAL PE */
+ { 0x0cf4, 0x05e4 }, /* hebrew_pe פ HEBREW LETTER PE */
+ { 0x0cf5, 0x05e5 }, /* hebrew_finalzade ץ HEBREW LETTER FINAL TSADI */
+ { 0x0cf6, 0x05e6 }, /* hebrew_zade צ HEBREW LETTER TSADI */
+ { 0x0cf7, 0x05e7 }, /* hebrew_qoph ק HEBREW LETTER QOF */
+ { 0x0cf8, 0x05e8 }, /* hebrew_resh ר HEBREW LETTER RESH */
+ { 0x0cf9, 0x05e9 }, /* hebrew_shin ש HEBREW LETTER SHIN */
+ { 0x0cfa, 0x05ea }, /* hebrew_taw ת HEBREW LETTER TAV */
+ { 0x0da1, 0x0e01 }, /* Thai_kokai ก THAI CHARACTER KO KAI */
+ { 0x0da2, 0x0e02 }, /* Thai_khokhai ข THAI CHARACTER KHO KHAI */
+ { 0x0da3, 0x0e03 }, /* Thai_khokhuat ฃ THAI CHARACTER KHO KHUAT */
+ { 0x0da4, 0x0e04 }, /* Thai_khokhwai ค THAI CHARACTER KHO KHWAI */
+ { 0x0da5, 0x0e05 }, /* Thai_khokhon ฅ THAI CHARACTER KHO KHON */
+ { 0x0da6, 0x0e06 }, /* Thai_khorakhang ฆ THAI CHARACTER KHO RAKHANG */
+ { 0x0da7, 0x0e07 }, /* Thai_ngongu ง THAI CHARACTER NGO NGU */
+ { 0x0da8, 0x0e08 }, /* Thai_chochan จ THAI CHARACTER CHO CHAN */
+ { 0x0da9, 0x0e09 }, /* Thai_choching ฉ THAI CHARACTER CHO CHING */
+ { 0x0daa, 0x0e0a }, /* Thai_chochang ช THAI CHARACTER CHO CHANG */
+ { 0x0dab, 0x0e0b }, /* Thai_soso ซ THAI CHARACTER SO SO */
+ { 0x0dac, 0x0e0c }, /* Thai_chochoe ฌ THAI CHARACTER CHO CHOE */
+ { 0x0dad, 0x0e0d }, /* Thai_yoying ญ THAI CHARACTER YO YING */
+ { 0x0dae, 0x0e0e }, /* Thai_dochada ฎ THAI CHARACTER DO CHADA */
+ { 0x0daf, 0x0e0f }, /* Thai_topatak ฏ THAI CHARACTER TO PATAK */
+ { 0x0db0, 0x0e10 }, /* Thai_thothan ฐ THAI CHARACTER THO THAN */
+ { 0x0db1, 0x0e11 }, /* Thai_thonangmontho ฑ THAI CHARACTER THO NANGMONTHO */
+ { 0x0db2, 0x0e12 }, /* Thai_thophuthao ฒ THAI CHARACTER THO PHUTHAO */
+ { 0x0db3, 0x0e13 }, /* Thai_nonen ณ THAI CHARACTER NO NEN */
+ { 0x0db4, 0x0e14 }, /* Thai_dodek ด THAI CHARACTER DO DEK */
+ { 0x0db5, 0x0e15 }, /* Thai_totao ต THAI CHARACTER TO TAO */
+ { 0x0db6, 0x0e16 }, /* Thai_thothung ถ THAI CHARACTER THO THUNG */
+ { 0x0db7, 0x0e17 }, /* Thai_thothahan ท THAI CHARACTER THO THAHAN */
+ { 0x0db8, 0x0e18 }, /* Thai_thothong ธ THAI CHARACTER THO THONG */
+ { 0x0db9, 0x0e19 }, /* Thai_nonu น THAI CHARACTER NO NU */
+ { 0x0dba, 0x0e1a }, /* Thai_bobaimai บ THAI CHARACTER BO BAIMAI */
+ { 0x0dbb, 0x0e1b }, /* Thai_popla ป THAI CHARACTER PO PLA */
+ { 0x0dbc, 0x0e1c }, /* Thai_phophung ผ THAI CHARACTER PHO PHUNG */
+ { 0x0dbd, 0x0e1d }, /* Thai_fofa ฝ THAI CHARACTER FO FA */
+ { 0x0dbe, 0x0e1e }, /* Thai_phophan พ THAI CHARACTER PHO PHAN */
+ { 0x0dbf, 0x0e1f }, /* Thai_fofan ฟ THAI CHARACTER FO FAN */
+ { 0x0dc0, 0x0e20 }, /* Thai_phosamphao ภ THAI CHARACTER PHO SAMPHAO */
+ { 0x0dc1, 0x0e21 }, /* Thai_moma ม THAI CHARACTER MO MA */
+ { 0x0dc2, 0x0e22 }, /* Thai_yoyak ย THAI CHARACTER YO YAK */
+ { 0x0dc3, 0x0e23 }, /* Thai_rorua ร THAI CHARACTER RO RUA */
+ { 0x0dc4, 0x0e24 }, /* Thai_ru ฤ THAI CHARACTER RU */
+ { 0x0dc5, 0x0e25 }, /* Thai_loling ล THAI CHARACTER LO LING */
+ { 0x0dc6, 0x0e26 }, /* Thai_lu ฦ THAI CHARACTER LU */
+ { 0x0dc7, 0x0e27 }, /* Thai_wowaen ว THAI CHARACTER WO WAEN */
+ { 0x0dc8, 0x0e28 }, /* Thai_sosala ศ THAI CHARACTER SO SALA */
+ { 0x0dc9, 0x0e29 }, /* Thai_sorusi ษ THAI CHARACTER SO RUSI */
+ { 0x0dca, 0x0e2a }, /* Thai_sosua ส THAI CHARACTER SO SUA */
+ { 0x0dcb, 0x0e2b }, /* Thai_hohip ห THAI CHARACTER HO HIP */
+ { 0x0dcc, 0x0e2c }, /* Thai_lochula ฬ THAI CHARACTER LO CHULA */
+ { 0x0dcd, 0x0e2d }, /* Thai_oang อ THAI CHARACTER O ANG */
+ { 0x0dce, 0x0e2e }, /* Thai_honokhuk ฮ THAI CHARACTER HO NOKHUK */
+ { 0x0dcf, 0x0e2f }, /* Thai_paiyannoi ฯ THAI CHARACTER PAIYANNOI */
+ { 0x0dd0, 0x0e30 }, /* Thai_saraa ะ THAI CHARACTER SARA A */
+ { 0x0dd1, 0x0e31 }, /* Thai_maihanakat ั THAI CHARACTER MAI HAN-AKAT */
+ { 0x0dd2, 0x0e32 }, /* Thai_saraaa า THAI CHARACTER SARA AA */
+ { 0x0dd3, 0x0e33 }, /* Thai_saraam ำ THAI CHARACTER SARA AM */
+ { 0x0dd4, 0x0e34 }, /* Thai_sarai ิ THAI CHARACTER SARA I */
+ { 0x0dd5, 0x0e35 }, /* Thai_saraii ี THAI CHARACTER SARA II */
+ { 0x0dd6, 0x0e36 }, /* Thai_saraue ึ THAI CHARACTER SARA UE */
+ { 0x0dd7, 0x0e37 }, /* Thai_sarauee ื THAI CHARACTER SARA UEE */
+ { 0x0dd8, 0x0e38 }, /* Thai_sarau ุ THAI CHARACTER SARA U */
+ { 0x0dd9, 0x0e39 }, /* Thai_sarauu ู THAI CHARACTER SARA UU */
+ { 0x0dda, 0x0e3a }, /* Thai_phinthu ฺ THAI CHARACTER PHINTHU */
+ { 0x0dde, 0x0e3e }, /* Thai_maihanakat_maitho ??? */
+ { 0x0ddf, 0x0e3f }, /* Thai_baht ฿ THAI CURRENCY SYMBOL BAHT */
+ { 0x0de0, 0x0e40 }, /* Thai_sarae เ THAI CHARACTER SARA E */
+ { 0x0de1, 0x0e41 }, /* Thai_saraae แ THAI CHARACTER SARA AE */
+ { 0x0de2, 0x0e42 }, /* Thai_sarao โ THAI CHARACTER SARA O */
+ { 0x0de3, 0x0e43 }, /* Thai_saraaimaimuan ใ THAI CHARACTER SARA AI MAIMUAN */
+ { 0x0de4, 0x0e44 }, /* Thai_saraaimaimalai ไ THAI CHARACTER SARA AI MAIMALAI */
+ { 0x0de5, 0x0e45 }, /* Thai_lakkhangyao ๅ THAI CHARACTER LAKKHANGYAO */
+ { 0x0de6, 0x0e46 }, /* Thai_maiyamok ๆ THAI CHARACTER MAIYAMOK */
+ { 0x0de7, 0x0e47 }, /* Thai_maitaikhu ็ THAI CHARACTER MAITAIKHU */
+ { 0x0de8, 0x0e48 }, /* Thai_maiek ่ THAI CHARACTER MAI EK */
+ { 0x0de9, 0x0e49 }, /* Thai_maitho ้ THAI CHARACTER MAI THO */
+ { 0x0dea, 0x0e4a }, /* Thai_maitri ๊ THAI CHARACTER MAI TRI */
+ { 0x0deb, 0x0e4b }, /* Thai_maichattawa ๋ THAI CHARACTER MAI CHATTAWA */
+ { 0x0dec, 0x0e4c }, /* Thai_thanthakhat ์ THAI CHARACTER THANTHAKHAT */
+ { 0x0ded, 0x0e4d }, /* Thai_nikhahit ํ THAI CHARACTER NIKHAHIT */
+ { 0x0df0, 0x0e50 }, /* Thai_leksun ๐ THAI DIGIT ZERO */
+ { 0x0df1, 0x0e51 }, /* Thai_leknung ๑ THAI DIGIT ONE */
+ { 0x0df2, 0x0e52 }, /* Thai_leksong ๒ THAI DIGIT TWO */
+ { 0x0df3, 0x0e53 }, /* Thai_leksam ๓ THAI DIGIT THREE */
+ { 0x0df4, 0x0e54 }, /* Thai_leksi ๔ THAI DIGIT FOUR */
+ { 0x0df5, 0x0e55 }, /* Thai_lekha ๕ THAI DIGIT FIVE */
+ { 0x0df6, 0x0e56 }, /* Thai_lekhok ๖ THAI DIGIT SIX */
+ { 0x0df7, 0x0e57 }, /* Thai_lekchet ๗ THAI DIGIT SEVEN */
+ { 0x0df8, 0x0e58 }, /* Thai_lekpaet ๘ THAI DIGIT EIGHT */
+ { 0x0df9, 0x0e59 }, /* Thai_lekkao ๙ THAI DIGIT NINE */
+ { 0x0ea1, 0x3131 }, /* Hangul_Kiyeog ㄱ HANGUL LETTER KIYEOK */
+ { 0x0ea2, 0x3132 }, /* Hangul_SsangKiyeog ㄲ HANGUL LETTER SSANGKIYEOK */
+ { 0x0ea3, 0x3133 }, /* Hangul_KiyeogSios ㄳ HANGUL LETTER KIYEOK-SIOS */
+ { 0x0ea4, 0x3134 }, /* Hangul_Nieun ㄴ HANGUL LETTER NIEUN */
+ { 0x0ea5, 0x3135 }, /* Hangul_NieunJieuj ㄵ HANGUL LETTER NIEUN-CIEUC */
+ { 0x0ea6, 0x3136 }, /* Hangul_NieunHieuh ㄶ HANGUL LETTER NIEUN-HIEUH */
+ { 0x0ea7, 0x3137 }, /* Hangul_Dikeud ㄷ HANGUL LETTER TIKEUT */
+ { 0x0ea8, 0x3138 }, /* Hangul_SsangDikeud ㄸ HANGUL LETTER SSANGTIKEUT */
+ { 0x0ea9, 0x3139 }, /* Hangul_Rieul ㄹ HANGUL LETTER RIEUL */
+ { 0x0eaa, 0x313a }, /* Hangul_RieulKiyeog ㄺ HANGUL LETTER RIEUL-KIYEOK */
+ { 0x0eab, 0x313b }, /* Hangul_RieulMieum ㄻ HANGUL LETTER RIEUL-MIEUM */
+ { 0x0eac, 0x313c }, /* Hangul_RieulPieub ㄼ HANGUL LETTER RIEUL-PIEUP */
+ { 0x0ead, 0x313d }, /* Hangul_RieulSios ㄽ HANGUL LETTER RIEUL-SIOS */
+ { 0x0eae, 0x313e }, /* Hangul_RieulTieut ㄾ HANGUL LETTER RIEUL-THIEUTH */
+ { 0x0eaf, 0x313f }, /* Hangul_RieulPhieuf ㄿ HANGUL LETTER RIEUL-PHIEUPH */
+ { 0x0eb0, 0x3140 }, /* Hangul_RieulHieuh ㅀ HANGUL LETTER RIEUL-HIEUH */
+ { 0x0eb1, 0x3141 }, /* Hangul_Mieum ㅁ HANGUL LETTER MIEUM */
+ { 0x0eb2, 0x3142 }, /* Hangul_Pieub ㅂ HANGUL LETTER PIEUP */
+ { 0x0eb3, 0x3143 }, /* Hangul_SsangPieub ㅃ HANGUL LETTER SSANGPIEUP */
+ { 0x0eb4, 0x3144 }, /* Hangul_PieubSios ㅄ HANGUL LETTER PIEUP-SIOS */
+ { 0x0eb5, 0x3145 }, /* Hangul_Sios ㅅ HANGUL LETTER SIOS */
+ { 0x0eb6, 0x3146 }, /* Hangul_SsangSios ㅆ HANGUL LETTER SSANGSIOS */
+ { 0x0eb7, 0x3147 }, /* Hangul_Ieung ㅇ HANGUL LETTER IEUNG */
+ { 0x0eb8, 0x3148 }, /* Hangul_Jieuj ㅈ HANGUL LETTER CIEUC */
+ { 0x0eb9, 0x3149 }, /* Hangul_SsangJieuj ㅉ HANGUL LETTER SSANGCIEUC */
+ { 0x0eba, 0x314a }, /* Hangul_Cieuc ㅊ HANGUL LETTER CHIEUCH */
+ { 0x0ebb, 0x314b }, /* Hangul_Khieuq ㅋ HANGUL LETTER KHIEUKH */
+ { 0x0ebc, 0x314c }, /* Hangul_Tieut ㅌ HANGUL LETTER THIEUTH */
+ { 0x0ebd, 0x314d }, /* Hangul_Phieuf ㅍ HANGUL LETTER PHIEUPH */
+ { 0x0ebe, 0x314e }, /* Hangul_Hieuh ㅎ HANGUL LETTER HIEUH */
+ { 0x0ebf, 0x314f }, /* Hangul_A ㅏ HANGUL LETTER A */
+ { 0x0ec0, 0x3150 }, /* Hangul_AE ㅐ HANGUL LETTER AE */
+ { 0x0ec1, 0x3151 }, /* Hangul_YA ㅑ HANGUL LETTER YA */
+ { 0x0ec2, 0x3152 }, /* Hangul_YAE ㅒ HANGUL LETTER YAE */
+ { 0x0ec3, 0x3153 }, /* Hangul_EO ㅓ HANGUL LETTER EO */
+ { 0x0ec4, 0x3154 }, /* Hangul_E ㅔ HANGUL LETTER E */
+ { 0x0ec5, 0x3155 }, /* Hangul_YEO ㅕ HANGUL LETTER YEO */
+ { 0x0ec6, 0x3156 }, /* Hangul_YE ㅖ HANGUL LETTER YE */
+ { 0x0ec7, 0x3157 }, /* Hangul_O ㅗ HANGUL LETTER O */
+ { 0x0ec8, 0x3158 }, /* Hangul_WA ㅘ HANGUL LETTER WA */
+ { 0x0ec9, 0x3159 }, /* Hangul_WAE ㅙ HANGUL LETTER WAE */
+ { 0x0eca, 0x315a }, /* Hangul_OE ㅚ HANGUL LETTER OE */
+ { 0x0ecb, 0x315b }, /* Hangul_YO ㅛ HANGUL LETTER YO */
+ { 0x0ecc, 0x315c }, /* Hangul_U ㅜ HANGUL LETTER U */
+ { 0x0ecd, 0x315d }, /* Hangul_WEO ㅝ HANGUL LETTER WEO */
+ { 0x0ece, 0x315e }, /* Hangul_WE ㅞ HANGUL LETTER WE */
+ { 0x0ecf, 0x315f }, /* Hangul_WI ㅟ HANGUL LETTER WI */
+ { 0x0ed0, 0x3160 }, /* Hangul_YU ㅠ HANGUL LETTER YU */
+ { 0x0ed1, 0x3161 }, /* Hangul_EU ㅡ HANGUL LETTER EU */
+ { 0x0ed2, 0x3162 }, /* Hangul_YI ㅢ HANGUL LETTER YI */
+ { 0x0ed3, 0x3163 }, /* Hangul_I ㅣ HANGUL LETTER I */
+ { 0x0ed4, 0x11a8 }, /* Hangul_J_Kiyeog ᆨ HANGUL JONGSEONG KIYEOK */
+ { 0x0ed5, 0x11a9 }, /* Hangul_J_SsangKiyeog ᆩ HANGUL JONGSEONG SSANGKIYEOK */
+ { 0x0ed6, 0x11aa }, /* Hangul_J_KiyeogSios ᆪ HANGUL JONGSEONG KIYEOK-SIOS */
+ { 0x0ed7, 0x11ab }, /* Hangul_J_Nieun ᆫ HANGUL JONGSEONG NIEUN */
+ { 0x0ed8, 0x11ac }, /* Hangul_J_NieunJieuj ᆬ HANGUL JONGSEONG NIEUN-CIEUC */
+ { 0x0ed9, 0x11ad }, /* Hangul_J_NieunHieuh ᆭ HANGUL JONGSEONG NIEUN-HIEUH */
+ { 0x0eda, 0x11ae }, /* Hangul_J_Dikeud ᆮ HANGUL JONGSEONG TIKEUT */
+ { 0x0edb, 0x11af }, /* Hangul_J_Rieul ᆯ HANGUL JONGSEONG RIEUL */
+ { 0x0edc, 0x11b0 }, /* Hangul_J_RieulKiyeog ᆰ HANGUL JONGSEONG RIEUL-KIYEOK */
+ { 0x0edd, 0x11b1 }, /* Hangul_J_RieulMieum ᆱ HANGUL JONGSEONG RIEUL-MIEUM */
+ { 0x0ede, 0x11b2 }, /* Hangul_J_RieulPieub ᆲ HANGUL JONGSEONG RIEUL-PIEUP */
+ { 0x0edf, 0x11b3 }, /* Hangul_J_RieulSios ᆳ HANGUL JONGSEONG RIEUL-SIOS */
+ { 0x0ee0, 0x11b4 }, /* Hangul_J_RieulTieut ᆴ HANGUL JONGSEONG RIEUL-THIEUTH */
+ { 0x0ee1, 0x11b5 }, /* Hangul_J_RieulPhieuf ᆵ HANGUL JONGSEONG RIEUL-PHIEUPH */
+ { 0x0ee2, 0x11b6 }, /* Hangul_J_RieulHieuh ᆶ HANGUL JONGSEONG RIEUL-HIEUH */
+ { 0x0ee3, 0x11b7 }, /* Hangul_J_Mieum ᆷ HANGUL JONGSEONG MIEUM */
+ { 0x0ee4, 0x11b8 }, /* Hangul_J_Pieub ᆸ HANGUL JONGSEONG PIEUP */
+ { 0x0ee5, 0x11b9 }, /* Hangul_J_PieubSios ᆹ HANGUL JONGSEONG PIEUP-SIOS */
+ { 0x0ee6, 0x11ba }, /* Hangul_J_Sios ᆺ HANGUL JONGSEONG SIOS */
+ { 0x0ee7, 0x11bb }, /* Hangul_J_SsangSios ᆻ HANGUL JONGSEONG SSANGSIOS */
+ { 0x0ee8, 0x11bc }, /* Hangul_J_Ieung ᆼ HANGUL JONGSEONG IEUNG */
+ { 0x0ee9, 0x11bd }, /* Hangul_J_Jieuj ᆽ HANGUL JONGSEONG CIEUC */
+ { 0x0eea, 0x11be }, /* Hangul_J_Cieuc ᆾ HANGUL JONGSEONG CHIEUCH */
+ { 0x0eeb, 0x11bf }, /* Hangul_J_Khieuq ᆿ HANGUL JONGSEONG KHIEUKH */
+ { 0x0eec, 0x11c0 }, /* Hangul_J_Tieut ᇀ HANGUL JONGSEONG THIEUTH */
+ { 0x0eed, 0x11c1 }, /* Hangul_J_Phieuf ᇁ HANGUL JONGSEONG PHIEUPH */
+ { 0x0eee, 0x11c2 }, /* Hangul_J_Hieuh ᇂ HANGUL JONGSEONG HIEUH */
+ { 0x0eef, 0x316d }, /* Hangul_RieulYeorinHieuh ㅭ HANGUL LETTER RIEUL-YEORINHIEUH */
+ { 0x0ef0, 0x3171 }, /* Hangul_SunkyeongeumMieum ㅱ HANGUL LETTER KAPYEOUNMIEUM */
+ { 0x0ef1, 0x3178 }, /* Hangul_SunkyeongeumPieub ㅸ HANGUL LETTER KAPYEOUNPIEUP */
+ { 0x0ef2, 0x317f }, /* Hangul_PanSios ㅿ HANGUL LETTER PANSIOS */
+/* 0x0ef3 Hangul_KkogjiDalrinIeung ? ??? */
+ { 0x0ef4, 0x3184 }, /* Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH */
+ { 0x0ef5, 0x3186 }, /* Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */
+ { 0x0ef6, 0x318d }, /* Hangul_AraeA ㆍ HANGUL LETTER ARAEA */
+ { 0x0ef7, 0x318e }, /* Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE */
+ { 0x0ef8, 0x11eb }, /* Hangul_J_PanSios ᇫ HANGUL JONGSEONG PANSIOS */
+/* 0x0ef9 Hangul_J_KkogjiDalrinIeung ? ??? */
+ { 0x0efa, 0x11f9 }, /* Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH */
+ { 0x0eff, 0x20a9 }, /* Korean_Won ₩ WON SIGN */
+ { 0x13bc, 0x0152 }, /* OE Œ LATIN CAPITAL LIGATURE OE */
+ { 0x13bd, 0x0153 }, /* oe œ LATIN SMALL LIGATURE OE */
+ { 0x13be, 0x0178 }, /* Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS */
+ { 0x20a0, 0x20a0 }, /* EcuSign ₠ EURO-CURRENCY SIGN */
+ { 0x20a1, 0x20a1 }, /* ColonSign ₡ COLON SIGN */
+ { 0x20a2, 0x20a2 }, /* CruzeiroSign ₢ CRUZEIRO SIGN */
+ { 0x20a3, 0x20a3 }, /* FFrancSign ₣ FRENCH FRANC SIGN */
+ { 0x20a4, 0x20a4 }, /* LiraSign ₤ LIRA SIGN */
+ { 0x20a5, 0x20a5 }, /* MillSign ₥ MILL SIGN */
+ { 0x20a6, 0x20a6 }, /* NairaSign ₦ NAIRA SIGN */
+ { 0x20a7, 0x20a7 }, /* PesetaSign ₧ PESETA SIGN */
+ { 0x20a8, 0x20a8 }, /* RupeeSign ₨ RUPEE SIGN */
+ { 0x20a9, 0x20a9 }, /* WonSign ₩ WON SIGN */
+ { 0x20aa, 0x20aa }, /* NewSheqelSign ₪ NEW SHEQEL SIGN */
+ { 0x20ab, 0x20ab }, /* DongSign ₫ DONG SIGN */
+ { 0x20ac, 0x20ac }, /* EuroSign € EURO SIGN */
+
+ /* Following items added to SCIM, not in the xterm table */
+
+ /* Function keys */
+ { 0xFF09, 0x0009 },
+ { 0xFF0A, 0x000a },
+ { 0xFF0D, 0x000d },
+
+ /* Numeric keypad */
+ { 0xFF80 /* Space */, ' ' },
+ { 0xFF89 /* Space */, 0x09 },
+ { 0xFF8D /* Enter */, 0x0d },
+ { 0xFFAA /* Multiply */, '*' },
+ { 0xFFAB /* Add */, '+' },
+ { 0xFFAD /* Subtract */, '-' },
+ { 0xFFAE /* Decimal */, '.' },
+ { 0xFFAF /* Divide */, '/' },
+ { 0xFFB0 /* 0 */, '0' },
+ { 0xFFB1 /* 1 */, '1' },
+ { 0xFFB2 /* 2 */, '2' },
+ { 0xFFB3 /* 3 */, '3' },
+ { 0xFFB4 /* 4 */, '4' },
+ { 0xFFB5 /* 5 */, '5' },
+ { 0xFFB6 /* 6 */, '6' },
+ { 0xFFB7 /* 7 */, '7' },
+ { 0xFFB8 /* 8 */, '8' },
+ { 0xFFB9 /* 9 */, '9' },
+ { 0xFFBD /* Equal */, '=' },
+
+ /* End numeric keypad */
+};
+
+static __KeyName __scim_keys_by_code [] = {
+ { 0x0020, "space" },
+ { 0x0021, "exclam" },
+ { 0x0022, "quotedbl" },
+ { 0x0023, "numbersign" },
+ { 0x0024, "dollar" },
+ { 0x0025, "percent" },
+ { 0x0026, "ampersand" },
+ { 0x0027, "apostrophe" },
+ { 0x0027, "quoteright" },
+ { 0x0028, "parenleft" },
+ { 0x0029, "parenright" },
+ { 0x002a, "asterisk" },
+ { 0x002b, "plus" },
+ { 0x002c, "comma" },
+ { 0x002d, "minus" },
+ { 0x002e, "period" },
+ { 0x002f, "slash" },
+ { 0x0030, "0" },
+ { 0x0031, "1" },
+ { 0x0032, "2" },
+ { 0x0033, "3" },
+ { 0x0034, "4" },
+ { 0x0035, "5" },
+ { 0x0036, "6" },
+ { 0x0037, "7" },
+ { 0x0038, "8" },
+ { 0x0039, "9" },
+ { 0x003a, "colon" },
+ { 0x003b, "semicolon" },
+ { 0x003c, "less" },
+ { 0x003d, "equal" },
+ { 0x003e, "greater" },
+ { 0x003f, "question" },
+ { 0x0040, "at" },
+ { 0x0041, "A" },
+ { 0x0042, "B" },
+ { 0x0043, "C" },
+ { 0x0044, "D" },
+ { 0x0045, "E" },
+ { 0x0046, "F" },
+ { 0x0047, "G" },
+ { 0x0048, "H" },
+ { 0x0049, "I" },
+ { 0x004a, "J" },
+ { 0x004b, "K" },
+ { 0x004c, "L" },
+ { 0x004d, "M" },
+ { 0x004e, "N" },
+ { 0x004f, "O" },
+ { 0x0050, "P" },
+ { 0x0051, "Q" },
+ { 0x0052, "R" },
+ { 0x0053, "S" },
+ { 0x0054, "T" },
+ { 0x0055, "U" },
+ { 0x0056, "V" },
+ { 0x0057, "W" },
+ { 0x0058, "X" },
+ { 0x0059, "Y" },
+ { 0x005a, "Z" },
+ { 0x005b, "bracketleft" },
+ { 0x005c, "backslash" },
+ { 0x005d, "bracketright" },
+ { 0x005e, "asciicircum" },
+ { 0x005f, "underscore" },
+ { 0x0060, "grave" },
+ { 0x0060, "quoteleft" },
+ { 0x0061, "a" },
+ { 0x0062, "b" },
+ { 0x0063, "c" },
+ { 0x0064, "d" },
+ { 0x0065, "e" },
+ { 0x0066, "f" },
+ { 0x0067, "g" },
+ { 0x0068, "h" },
+ { 0x0069, "i" },
+ { 0x006a, "j" },
+ { 0x006b, "k" },
+ { 0x006c, "l" },
+ { 0x006d, "m" },
+ { 0x006e, "n" },
+ { 0x006f, "o" },
+ { 0x0070, "p" },
+ { 0x0071, "q" },
+ { 0x0072, "r" },
+ { 0x0073, "s" },
+ { 0x0074, "t" },
+ { 0x0075, "u" },
+ { 0x0076, "v" },
+ { 0x0077, "w" },
+ { 0x0078, "x" },
+ { 0x0079, "y" },
+ { 0x007a, "z" },
+ { 0x007b, "braceleft" },
+ { 0x007c, "bar" },
+ { 0x007d, "braceright" },
+ { 0x007e, "asciitilde" },
+ { 0x00a0, "nobreakspace" },
+ { 0x00a1, "exclamdown" },
+ { 0x00a2, "cent" },
+ { 0x00a3, "sterling" },
+ { 0x00a4, "currency" },
+ { 0x00a5, "yen" },
+ { 0x00a6, "brokenbar" },
+ { 0x00a7, "section" },
+ { 0x00a8, "diaeresis" },
+ { 0x00a9, "copyright" },
+ { 0x00aa, "ordfeminine" },
+ { 0x00ab, "guillemotleft" },
+ { 0x00ac, "notsign" },
+ { 0x00ad, "hyphen" },
+ { 0x00ae, "registered" },
+ { 0x00af, "macron" },
+ { 0x00b0, "degree" },
+ { 0x00b1, "plusminus" },
+ { 0x00b2, "twosuperior" },
+ { 0x00b3, "threesuperior" },
+ { 0x00b4, "acute" },
+ { 0x00b5, "mu" },
+ { 0x00b6, "paragraph" },
+ { 0x00b7, "periodcentered" },
+ { 0x00b8, "cedilla" },
+ { 0x00b9, "onesuperior" },
+ { 0x00ba, "masculine" },
+ { 0x00bb, "guillemotright" },
+ { 0x00bc, "onequarter" },
+ { 0x00bd, "onehalf" },
+ { 0x00be, "threequarters" },
+ { 0x00bf, "questiondown" },
+ { 0x00c0, "Agrave" },
+ { 0x00c1, "Aacute" },
+ { 0x00c2, "Acircumflex" },
+ { 0x00c3, "Atilde" },
+ { 0x00c4, "Adiaeresis" },
+ { 0x00c5, "Aring" },
+ { 0x00c6, "AE" },
+ { 0x00c7, "Ccedilla" },
+ { 0x00c8, "Egrave" },
+ { 0x00c9, "Eacute" },
+ { 0x00ca, "Ecircumflex" },
+ { 0x00cb, "Ediaeresis" },
+ { 0x00cc, "Igrave" },
+ { 0x00cd, "Iacute" },
+ { 0x00ce, "Icircumflex" },
+ { 0x00cf, "Idiaeresis" },
+ { 0x00d0, "ETH" },
+ { 0x00d0, "Eth" },
+ { 0x00d1, "Ntilde" },
+ { 0x00d2, "Ograve" },
+ { 0x00d3, "Oacute" },
+ { 0x00d4, "Ocircumflex" },
+ { 0x00d5, "Otilde" },
+ { 0x00d6, "Odiaeresis" },
+ { 0x00d7, "multiply" },
+ { 0x00d8, "Ooblique" },
+ { 0x00d9, "Ugrave" },
+ { 0x00da, "Uacute" },
+ { 0x00db, "Ucircumflex" },
+ { 0x00dc, "Udiaeresis" },
+ { 0x00dd, "Yacute" },
+ { 0x00de, "THORN" },
+ { 0x00de, "Thorn" },
+ { 0x00df, "ssharp" },
+ { 0x00e0, "agrave" },
+ { 0x00e1, "aacute" },
+ { 0x00e2, "acircumflex" },
+ { 0x00e3, "atilde" },
+ { 0x00e4, "adiaeresis" },
+ { 0x00e5, "aring" },
+ { 0x00e6, "ae" },
+ { 0x00e7, "ccedilla" },
+ { 0x00e8, "egrave" },
+ { 0x00e9, "eacute" },
+ { 0x00ea, "ecircumflex" },
+ { 0x00eb, "ediaeresis" },
+ { 0x00ec, "igrave" },
+ { 0x00ed, "iacute" },
+ { 0x00ee, "icircumflex" },
+ { 0x00ef, "idiaeresis" },
+ { 0x00f0, "eth" },
+ { 0x00f1, "ntilde" },
+ { 0x00f2, "ograve" },
+ { 0x00f3, "oacute" },
+ { 0x00f4, "ocircumflex" },
+ { 0x00f5, "otilde" },
+ { 0x00f6, "odiaeresis" },
+ { 0x00f7, "division" },
+ { 0x00f8, "oslash" },
+ { 0x00f9, "ugrave" },
+ { 0x00fa, "uacute" },
+ { 0x00fb, "ucircumflex" },
+ { 0x00fc, "udiaeresis" },
+ { 0x00fd, "yacute" },
+ { 0x00fe, "thorn" },
+ { 0x00ff, "ydiaeresis" },
+ { 0x01a1, "Aogonek" },
+ { 0x01a2, "breve" },
+ { 0x01a3, "Lstroke" },
+ { 0x01a5, "Lcaron" },
+ { 0x01a6, "Sacute" },
+ { 0x01a9, "Scaron" },
+ { 0x01aa, "Scedilla" },
+ { 0x01ab, "Tcaron" },
+ { 0x01ac, "Zacute" },
+ { 0x01ae, "Zcaron" },
+ { 0x01af, "Zabovedot" },
+ { 0x01b1, "aogonek" },
+ { 0x01b2, "ogonek" },
+ { 0x01b3, "lstroke" },
+ { 0x01b5, "lcaron" },
+ { 0x01b6, "sacute" },
+ { 0x01b7, "caron" },
+ { 0x01b9, "scaron" },
+ { 0x01ba, "scedilla" },
+ { 0x01bb, "tcaron" },
+ { 0x01bc, "zacute" },
+ { 0x01bd, "doubleacute" },
+ { 0x01be, "zcaron" },
+ { 0x01bf, "zabovedot" },
+ { 0x01c0, "Racute" },
+ { 0x01c3, "Abreve" },
+ { 0x01c5, "Lacute" },
+ { 0x01c6, "Cacute" },
+ { 0x01c8, "Ccaron" },
+ { 0x01ca, "Eogonek" },
+ { 0x01cc, "Ecaron" },
+ { 0x01cf, "Dcaron" },
+ { 0x01d0, "Dstroke" },
+ { 0x01d1, "Nacute" },
+ { 0x01d2, "Ncaron" },
+ { 0x01d5, "Odoubleacute" },
+ { 0x01d8, "Rcaron" },
+ { 0x01d9, "Uring" },
+ { 0x01db, "Udoubleacute" },
+ { 0x01de, "Tcedilla" },
+ { 0x01e0, "racute" },
+ { 0x01e3, "abreve" },
+ { 0x01e5, "lacute" },
+ { 0x01e6, "cacute" },
+ { 0x01e8, "ccaron" },
+ { 0x01ea, "eogonek" },
+ { 0x01ec, "ecaron" },
+ { 0x01ef, "dcaron" },
+ { 0x01f0, "dstroke" },
+ { 0x01f1, "nacute" },
+ { 0x01f2, "ncaron" },
+ { 0x01f5, "odoubleacute" },
+ { 0x01f8, "rcaron" },
+ { 0x01f9, "uring" },
+ { 0x01fb, "udoubleacute" },
+ { 0x01fe, "tcedilla" },
+ { 0x01ff, "abovedot" },
+ { 0x02a1, "Hstroke" },
+ { 0x02a6, "Hcircumflex" },
+ { 0x02a9, "Iabovedot" },
+ { 0x02ab, "Gbreve" },
+ { 0x02ac, "Jcircumflex" },
+ { 0x02b1, "hstroke" },
+ { 0x02b6, "hcircumflex" },
+ { 0x02b9, "idotless" },
+ { 0x02bb, "gbreve" },
+ { 0x02bc, "jcircumflex" },
+ { 0x02c5, "Cabovedot" },
+ { 0x02c6, "Ccircumflex" },
+ { 0x02d5, "Gabovedot" },
+ { 0x02d8, "Gcircumflex" },
+ { 0x02dd, "Ubreve" },
+ { 0x02de, "Scircumflex" },
+ { 0x02e5, "cabovedot" },
+ { 0x02e6, "ccircumflex" },
+ { 0x02f5, "gabovedot" },
+ { 0x02f8, "gcircumflex" },
+ { 0x02fd, "ubreve" },
+ { 0x02fe, "scircumflex" },
+ { 0x03a2, "kappa" },
+ { 0x03a2, "kra" },
+ { 0x03a3, "Rcedilla" },
+ { 0x03a5, "Itilde" },
+ { 0x03a6, "Lcedilla" },
+ { 0x03aa, "Emacron" },
+ { 0x03ab, "Gcedilla" },
+ { 0x03ac, "Tslash" },
+ { 0x03b3, "rcedilla" },
+ { 0x03b5, "itilde" },
+ { 0x03b6, "lcedilla" },
+ { 0x03ba, "emacron" },
+ { 0x03bb, "gcedilla" },
+ { 0x03bc, "tslash" },
+ { 0x03bd, "ENG" },
+ { 0x03bf, "eng" },
+ { 0x03c0, "Amacron" },
+ { 0x03c7, "Iogonek" },
+ { 0x03cc, "Eabovedot" },
+ { 0x03cf, "Imacron" },
+ { 0x03d1, "Ncedilla" },
+ { 0x03d2, "Omacron" },
+ { 0x03d3, "Kcedilla" },
+ { 0x03d9, "Uogonek" },
+ { 0x03dd, "Utilde" },
+ { 0x03de, "Umacron" },
+ { 0x03e0, "amacron" },
+ { 0x03e7, "iogonek" },
+ { 0x03ec, "eabovedot" },
+ { 0x03ef, "imacron" },
+ { 0x03f1, "ncedilla" },
+ { 0x03f2, "omacron" },
+ { 0x03f3, "kcedilla" },
+ { 0x03f9, "uogonek" },
+ { 0x03fd, "utilde" },
+ { 0x03fe, "umacron" },
+ { 0x047e, "overline" },
+ { 0x04a1, "kana_fullstop" },
+ { 0x04a2, "kana_openingbracket" },
+ { 0x04a3, "kana_closingbracket" },
+ { 0x04a4, "kana_comma" },
+ { 0x04a5, "kana_conjunctive" },
+ { 0x04a5, "kana_middledot" },
+ { 0x04a6, "kana_WO" },
+ { 0x04a7, "kana_a" },
+ { 0x04a8, "kana_i" },
+ { 0x04a9, "kana_u" },
+ { 0x04aa, "kana_e" },
+ { 0x04ab, "kana_o" },
+ { 0x04ac, "kana_ya" },
+ { 0x04ad, "kana_yu" },
+ { 0x04ae, "kana_yo" },
+ { 0x04af, "kana_tsu" },
+ { 0x04af, "kana_tu" },
+ { 0x04b0, "prolongedsound" },
+ { 0x04b1, "kana_A" },
+ { 0x04b2, "kana_I" },
+ { 0x04b3, "kana_U" },
+ { 0x04b4, "kana_E" },
+ { 0x04b5, "kana_O" },
+ { 0x04b6, "kana_KA" },
+ { 0x04b7, "kana_KI" },
+ { 0x04b8, "kana_KU" },
+ { 0x04b9, "kana_KE" },
+ { 0x04ba, "kana_KO" },
+ { 0x04bb, "kana_SA" },
+ { 0x04bc, "kana_SHI" },
+ { 0x04bd, "kana_SU" },
+ { 0x04be, "kana_SE" },
+ { 0x04bf, "kana_SO" },
+ { 0x04c0, "kana_TA" },
+ { 0x04c1, "kana_CHI" },
+ { 0x04c1, "kana_TI" },
+ { 0x04c2, "kana_TSU" },
+ { 0x04c2, "kana_TU" },
+ { 0x04c3, "kana_TE" },
+ { 0x04c4, "kana_TO" },
+ { 0x04c5, "kana_NA" },
+ { 0x04c6, "kana_NI" },
+ { 0x04c7, "kana_NU" },
+ { 0x04c8, "kana_NE" },
+ { 0x04c9, "kana_NO" },
+ { 0x04ca, "kana_HA" },
+ { 0x04cb, "kana_HI" },
+ { 0x04cc, "kana_FU" },
+ { 0x04cc, "kana_HU" },
+ { 0x04cd, "kana_HE" },
+ { 0x04ce, "kana_HO" },
+ { 0x04cf, "kana_MA" },
+ { 0x04d0, "kana_MI" },
+ { 0x04d1, "kana_MU" },
+ { 0x04d2, "kana_ME" },
+ { 0x04d3, "kana_MO" },
+ { 0x04d4, "kana_YA" },
+ { 0x04d5, "kana_YU" },
+ { 0x04d6, "kana_YO" },
+ { 0x04d7, "kana_RA" },
+ { 0x04d8, "kana_RI" },
+ { 0x04d9, "kana_RU" },
+ { 0x04da, "kana_RE" },
+ { 0x04db, "kana_RO" },
+ { 0x04dc, "kana_WA" },
+ { 0x04dd, "kana_N" },
+ { 0x04de, "voicedsound" },
+ { 0x04df, "semivoicedsound" },
+ { 0x05ac, "Arabic_comma" },
+ { 0x05bb, "Arabic_semicolon" },
+ { 0x05bf, "Arabic_question_mark" },
+ { 0x05c1, "Arabic_hamza" },
+ { 0x05c2, "Arabic_maddaonalef" },
+ { 0x05c3, "Arabic_hamzaonalef" },
+ { 0x05c4, "Arabic_hamzaonwaw" },
+ { 0x05c5, "Arabic_hamzaunderalef" },
+ { 0x05c6, "Arabic_hamzaonyeh" },
+ { 0x05c7, "Arabic_alef" },
+ { 0x05c8, "Arabic_beh" },
+ { 0x05c9, "Arabic_tehmarbuta" },
+ { 0x05ca, "Arabic_teh" },
+ { 0x05cb, "Arabic_theh" },
+ { 0x05cc, "Arabic_jeem" },
+ { 0x05cd, "Arabic_hah" },
+ { 0x05ce, "Arabic_khah" },
+ { 0x05cf, "Arabic_dal" },
+ { 0x05d0, "Arabic_thal" },
+ { 0x05d1, "Arabic_ra" },
+ { 0x05d2, "Arabic_zain" },
+ { 0x05d3, "Arabic_seen" },
+ { 0x05d4, "Arabic_sheen" },
+ { 0x05d5, "Arabic_sad" },
+ { 0x05d6, "Arabic_dad" },
+ { 0x05d7, "Arabic_tah" },
+ { 0x05d8, "Arabic_zah" },
+ { 0x05d9, "Arabic_ain" },
+ { 0x05da, "Arabic_ghain" },
+ { 0x05e0, "Arabic_tatweel" },
+ { 0x05e1, "Arabic_feh" },
+ { 0x05e2, "Arabic_qaf" },
+ { 0x05e3, "Arabic_kaf" },
+ { 0x05e4, "Arabic_lam" },
+ { 0x05e5, "Arabic_meem" },
+ { 0x05e6, "Arabic_noon" },
+ { 0x05e7, "Arabic_ha" },
+ { 0x05e7, "Arabic_heh" },
+ { 0x05e8, "Arabic_waw" },
+ { 0x05e9, "Arabic_alefmaksura" },
+ { 0x05ea, "Arabic_yeh" },
+ { 0x05eb, "Arabic_fathatan" },
+ { 0x05ec, "Arabic_dammatan" },
+ { 0x05ed, "Arabic_kasratan" },
+ { 0x05ee, "Arabic_fatha" },
+ { 0x05ef, "Arabic_damma" },
+ { 0x05f0, "Arabic_kasra" },
+ { 0x05f1, "Arabic_shadda" },
+ { 0x05f2, "Arabic_sukun" },
+ { 0x06a1, "Serbian_dje" },
+ { 0x06a2, "Macedonia_gje" },
+ { 0x06a3, "Cyrillic_io" },
+ { 0x06a4, "Ukrainian_ie" },
+ { 0x06a4, "Ukranian_je" },
+ { 0x06a5, "Macedonia_dse" },
+ { 0x06a6, "Ukrainian_i" },
+ { 0x06a6, "Ukranian_i" },
+ { 0x06a7, "Ukrainian_yi" },
+ { 0x06a7, "Ukranian_yi" },
+ { 0x06a8, "Cyrillic_je" },
+ { 0x06a8, "Serbian_je" },
+ { 0x06a9, "Cyrillic_lje" },
+ { 0x06a9, "Serbian_lje" },
+ { 0x06aa, "Cyrillic_nje" },
+ { 0x06aa, "Serbian_nje" },
+ { 0x06ab, "Serbian_tshe" },
+ { 0x06ac, "Macedonia_kje" },
+ { 0x06ae, "Byelorussian_shortu" },
+ { 0x06af, "Cyrillic_dzhe" },
+ { 0x06af, "Serbian_dze" },
+ { 0x06b0, "numerosign" },
+ { 0x06b1, "Serbian_DJE" },
+ { 0x06b2, "Macedonia_GJE" },
+ { 0x06b3, "Cyrillic_IO" },
+ { 0x06b4, "Ukrainian_IE" },
+ { 0x06b4, "Ukranian_JE" },
+ { 0x06b5, "Macedonia_DSE" },
+ { 0x06b6, "Ukrainian_I" },
+ { 0x06b6, "Ukranian_I" },
+ { 0x06b7, "Ukrainian_YI" },
+ { 0x06b7, "Ukranian_YI" },
+ { 0x06b8, "Cyrillic_JE" },
+ { 0x06b8, "Serbian_JE" },
+ { 0x06b9, "Cyrillic_LJE" },
+ { 0x06b9, "Serbian_LJE" },
+ { 0x06ba, "Cyrillic_NJE" },
+ { 0x06ba, "Serbian_NJE" },
+ { 0x06bb, "Serbian_TSHE" },
+ { 0x06bc, "Macedonia_KJE" },
+ { 0x06be, "Byelorussian_SHORTU" },
+ { 0x06bf, "Cyrillic_DZHE" },
+ { 0x06bf, "Serbian_DZE" },
+ { 0x06c0, "Cyrillic_yu" },
+ { 0x06c1, "Cyrillic_a" },
+ { 0x06c2, "Cyrillic_be" },
+ { 0x06c3, "Cyrillic_tse" },
+ { 0x06c4, "Cyrillic_de" },
+ { 0x06c5, "Cyrillic_ie" },
+ { 0x06c6, "Cyrillic_ef" },
+ { 0x06c7, "Cyrillic_ghe" },
+ { 0x06c8, "Cyrillic_ha" },
+ { 0x06c9, "Cyrillic_i" },
+ { 0x06ca, "Cyrillic_shorti" },
+ { 0x06cb, "Cyrillic_ka" },
+ { 0x06cc, "Cyrillic_el" },
+ { 0x06cd, "Cyrillic_em" },
+ { 0x06ce, "Cyrillic_en" },
+ { 0x06cf, "Cyrillic_o" },
+ { 0x06d0, "Cyrillic_pe" },
+ { 0x06d1, "Cyrillic_ya" },
+ { 0x06d2, "Cyrillic_er" },
+ { 0x06d3, "Cyrillic_es" },
+ { 0x06d4, "Cyrillic_te" },
+ { 0x06d5, "Cyrillic_u" },
+ { 0x06d6, "Cyrillic_zhe" },
+ { 0x06d7, "Cyrillic_ve" },
+ { 0x06d8, "Cyrillic_softsign" },
+ { 0x06d9, "Cyrillic_yeru" },
+ { 0x06da, "Cyrillic_ze" },
+ { 0x06db, "Cyrillic_sha" },
+ { 0x06dc, "Cyrillic_e" },
+ { 0x06dd, "Cyrillic_shcha" },
+ { 0x06de, "Cyrillic_che" },
+ { 0x06df, "Cyrillic_hardsign" },
+ { 0x06e0, "Cyrillic_YU" },
+ { 0x06e1, "Cyrillic_A" },
+ { 0x06e2, "Cyrillic_BE" },
+ { 0x06e3, "Cyrillic_TSE" },
+ { 0x06e4, "Cyrillic_DE" },
+ { 0x06e5, "Cyrillic_IE" },
+ { 0x06e6, "Cyrillic_EF" },
+ { 0x06e7, "Cyrillic_GHE" },
+ { 0x06e8, "Cyrillic_HA" },
+ { 0x06e9, "Cyrillic_I" },
+ { 0x06ea, "Cyrillic_SHORTI" },
+ { 0x06eb, "Cyrillic_KA" },
+ { 0x06ec, "Cyrillic_EL" },
+ { 0x06ed, "Cyrillic_EM" },
+ { 0x06ee, "Cyrillic_EN" },
+ { 0x06ef, "Cyrillic_O" },
+ { 0x06f0, "Cyrillic_PE" },
+ { 0x06f1, "Cyrillic_YA" },
+ { 0x06f2, "Cyrillic_ER" },
+ { 0x06f3, "Cyrillic_ES" },
+ { 0x06f4, "Cyrillic_TE" },
+ { 0x06f5, "Cyrillic_U" },
+ { 0x06f6, "Cyrillic_ZHE" },
+ { 0x06f7, "Cyrillic_VE" },
+ { 0x06f8, "Cyrillic_SOFTSIGN" },
+ { 0x06f9, "Cyrillic_YERU" },
+ { 0x06fa, "Cyrillic_ZE" },
+ { 0x06fb, "Cyrillic_SHA" },
+ { 0x06fc, "Cyrillic_E" },
+ { 0x06fd, "Cyrillic_SHCHA" },
+ { 0x06fe, "Cyrillic_CHE" },
+ { 0x06ff, "Cyrillic_HARDSIGN" },
+ { 0x07a1, "Greek_ALPHAaccent" },
+ { 0x07a2, "Greek_EPSILONaccent" },
+ { 0x07a3, "Greek_ETAaccent" },
+ { 0x07a4, "Greek_IOTAaccent" },
+ { 0x07a5, "Greek_IOTAdiaeresis" },
+ { 0x07a7, "Greek_OMICRONaccent" },
+ { 0x07a8, "Greek_UPSILONaccent" },
+ { 0x07a9, "Greek_UPSILONdieresis" },
+ { 0x07ab, "Greek_OMEGAaccent" },
+ { 0x07ae, "Greek_accentdieresis" },
+ { 0x07af, "Greek_horizbar" },
+ { 0x07b1, "Greek_alphaaccent" },
+ { 0x07b2, "Greek_epsilonaccent" },
+ { 0x07b3, "Greek_etaaccent" },
+ { 0x07b4, "Greek_iotaaccent" },
+ { 0x07b5, "Greek_iotadieresis" },
+ { 0x07b6, "Greek_iotaaccentdieresis" },
+ { 0x07b7, "Greek_omicronaccent" },
+ { 0x07b8, "Greek_upsilonaccent" },
+ { 0x07b9, "Greek_upsilondieresis" },
+ { 0x07ba, "Greek_upsilonaccentdieresis" },
+ { 0x07bb, "Greek_omegaaccent" },
+ { 0x07c1, "Greek_ALPHA" },
+ { 0x07c2, "Greek_BETA" },
+ { 0x07c3, "Greek_GAMMA" },
+ { 0x07c4, "Greek_DELTA" },
+ { 0x07c5, "Greek_EPSILON" },
+ { 0x07c6, "Greek_ZETA" },
+ { 0x07c7, "Greek_ETA" },
+ { 0x07c8, "Greek_THETA" },
+ { 0x07c9, "Greek_IOTA" },
+ { 0x07ca, "Greek_KAPPA" },
+ { 0x07cb, "Greek_LAMBDA" },
+ { 0x07cb, "Greek_LAMDA" },
+ { 0x07cc, "Greek_MU" },
+ { 0x07cd, "Greek_NU" },
+ { 0x07ce, "Greek_XI" },
+ { 0x07cf, "Greek_OMICRON" },
+ { 0x07d0, "Greek_PI" },
+ { 0x07d1, "Greek_RHO" },
+ { 0x07d2, "Greek_SIGMA" },
+ { 0x07d4, "Greek_TAU" },
+ { 0x07d5, "Greek_UPSILON" },
+ { 0x07d6, "Greek_PHI" },
+ { 0x07d7, "Greek_CHI" },
+ { 0x07d8, "Greek_PSI" },
+ { 0x07d9, "Greek_OMEGA" },
+ { 0x07e1, "Greek_alpha" },
+ { 0x07e2, "Greek_beta" },
+ { 0x07e3, "Greek_gamma" },
+ { 0x07e4, "Greek_delta" },
+ { 0x07e5, "Greek_epsilon" },
+ { 0x07e6, "Greek_zeta" },
+ { 0x07e7, "Greek_eta" },
+ { 0x07e8, "Greek_theta" },
+ { 0x07e9, "Greek_iota" },
+ { 0x07ea, "Greek_kappa" },
+ { 0x07eb, "Greek_lambda" },
+ { 0x07eb, "Greek_lamda" },
+ { 0x07ec, "Greek_mu" },
+ { 0x07ed, "Greek_nu" },
+ { 0x07ee, "Greek_xi" },
+ { 0x07ef, "Greek_omicron" },
+ { 0x07f0, "Greek_pi" },
+ { 0x07f1, "Greek_rho" },
+ { 0x07f2, "Greek_sigma" },
+ { 0x07f3, "Greek_finalsmallsigma" },
+ { 0x07f4, "Greek_tau" },
+ { 0x07f5, "Greek_upsilon" },
+ { 0x07f6, "Greek_phi" },
+ { 0x07f7, "Greek_chi" },
+ { 0x07f8, "Greek_psi" },
+ { 0x07f9, "Greek_omega" },
+ { 0x08a1, "leftradical" },
+ { 0x08a2, "topleftradical" },
+ { 0x08a3, "horizconnector" },
+ { 0x08a4, "topintegral" },
+ { 0x08a5, "botintegral" },
+ { 0x08a6, "vertconnector" },
+ { 0x08a7, "topleftsqbracket" },
+ { 0x08a8, "botleftsqbracket" },
+ { 0x08a9, "toprightsqbracket" },
+ { 0x08aa, "botrightsqbracket" },
+ { 0x08ab, "topleftparens" },
+ { 0x08ac, "botleftparens" },
+ { 0x08ad, "toprightparens" },
+ { 0x08ae, "botrightparens" },
+ { 0x08af, "leftmiddlecurlybrace" },
+ { 0x08b0, "rightmiddlecurlybrace" },
+ { 0x08b1, "topleftsummation" },
+ { 0x08b2, "botleftsummation" },
+ { 0x08b3, "topvertsummationconnector" },
+ { 0x08b4, "botvertsummationconnector" },
+ { 0x08b5, "toprightsummation" },
+ { 0x08b6, "botrightsummation" },
+ { 0x08b7, "rightmiddlesummation" },
+ { 0x08bc, "lessthanequal" },
+ { 0x08bd, "notequal" },
+ { 0x08be, "greaterthanequal" },
+ { 0x08bf, "integral" },
+ { 0x08c0, "therefore" },
+ { 0x08c1, "variation" },
+ { 0x08c2, "infinity" },
+ { 0x08c5, "nabla" },
+ { 0x08c8, "approximate" },
+ { 0x08c9, "similarequal" },
+ { 0x08cd, "ifonlyif" },
+ { 0x08ce, "implies" },
+ { 0x08cf, "identical" },
+ { 0x08d6, "radical" },
+ { 0x08da, "includedin" },
+ { 0x08db, "includes" },
+ { 0x08dc, "intersection" },
+ { 0x08dd, "union" },
+ { 0x08de, "logicaland" },
+ { 0x08df, "logicalor" },
+ { 0x08ef, "partialderivative" },
+ { 0x08f6, "function" },
+ { 0x08fb, "leftarrow" },
+ { 0x08fc, "uparrow" },
+ { 0x08fd, "rightarrow" },
+ { 0x08fe, "downarrow" },
+ { 0x09df, "blank" },
+ { 0x09e0, "soliddiamond" },
+ { 0x09e1, "checkerboard" },
+ { 0x09e2, "ht" },
+ { 0x09e3, "ff" },
+ { 0x09e4, "cr" },
+ { 0x09e5, "lf" },
+ { 0x09e8, "nl" },
+ { 0x09e9, "vt" },
+ { 0x09ea, "lowrightcorner" },
+ { 0x09eb, "uprightcorner" },
+ { 0x09ec, "upleftcorner" },
+ { 0x09ed, "lowleftcorner" },
+ { 0x09ee, "crossinglines" },
+ { 0x09ef, "horizlinescan1" },
+ { 0x09f0, "horizlinescan3" },
+ { 0x09f1, "horizlinescan5" },
+ { 0x09f2, "horizlinescan7" },
+ { 0x09f3, "horizlinescan9" },
+ { 0x09f4, "leftt" },
+ { 0x09f5, "rightt" },
+ { 0x09f6, "bott" },
+ { 0x09f7, "topt" },
+ { 0x09f8, "vertbar" },
+ { 0x0aa1, "emspace" },
+ { 0x0aa2, "enspace" },
+ { 0x0aa3, "em3space" },
+ { 0x0aa4, "em4space" },
+ { 0x0aa5, "digitspace" },
+ { 0x0aa6, "punctspace" },
+ { 0x0aa7, "thinspace" },
+ { 0x0aa8, "hairspace" },
+ { 0x0aa9, "emdash" },
+ { 0x0aaa, "endash" },
+ { 0x0aac, "signifblank" },
+ { 0x0aae, "ellipsis" },
+ { 0x0aaf, "doubbaselinedot" },
+ { 0x0ab0, "onethird" },
+ { 0x0ab1, "twothirds" },
+ { 0x0ab2, "onefifth" },
+ { 0x0ab3, "twofifths" },
+ { 0x0ab4, "threefifths" },
+ { 0x0ab5, "fourfifths" },
+ { 0x0ab6, "onesixth" },
+ { 0x0ab7, "fivesixths" },
+ { 0x0ab8, "careof" },
+ { 0x0abb, "figdash" },
+ { 0x0abc, "leftanglebracket" },
+ { 0x0abd, "decimalpoint" },
+ { 0x0abe, "rightanglebracket" },
+ { 0x0abf, "marker" },
+ { 0x0ac3, "oneeighth" },
+ { 0x0ac4, "threeeighths" },
+ { 0x0ac5, "fiveeighths" },
+ { 0x0ac6, "seveneighths" },
+ { 0x0ac9, "trademark" },
+ { 0x0aca, "signaturemark" },
+ { 0x0acb, "trademarkincircle" },
+ { 0x0acc, "leftopentriangle" },
+ { 0x0acd, "rightopentriangle" },
+ { 0x0ace, "emopencircle" },
+ { 0x0acf, "emopenrectangle" },
+ { 0x0ad0, "leftsinglequotemark" },
+ { 0x0ad1, "rightsinglequotemark" },
+ { 0x0ad2, "leftdoublequotemark" },
+ { 0x0ad3, "rightdoublequotemark" },
+ { 0x0ad4, "prescription" },
+ { 0x0ad6, "minutes" },
+ { 0x0ad7, "seconds" },
+ { 0x0ad9, "latincross" },
+ { 0x0ada, "hexagram" },
+ { 0x0adb, "filledrectbullet" },
+ { 0x0adc, "filledlefttribullet" },
+ { 0x0add, "filledrighttribullet" },
+ { 0x0ade, "emfilledcircle" },
+ { 0x0adf, "emfilledrect" },
+ { 0x0ae0, "enopencircbullet" },
+ { 0x0ae1, "enopensquarebullet" },
+ { 0x0ae2, "openrectbullet" },
+ { 0x0ae3, "opentribulletup" },
+ { 0x0ae4, "opentribulletdown" },
+ { 0x0ae5, "openstar" },
+ { 0x0ae6, "enfilledcircbullet" },
+ { 0x0ae7, "enfilledsqbullet" },
+ { 0x0ae8, "filledtribulletup" },
+ { 0x0ae9, "filledtribulletdown" },
+ { 0x0aea, "leftpointer" },
+ { 0x0aeb, "rightpointer" },
+ { 0x0aec, "club" },
+ { 0x0aed, "diamond" },
+ { 0x0aee, "heart" },
+ { 0x0af0, "maltesecross" },
+ { 0x0af1, "dagger" },
+ { 0x0af2, "doubledagger" },
+ { 0x0af3, "checkmark" },
+ { 0x0af4, "ballotcross" },
+ { 0x0af5, "musicalsharp" },
+ { 0x0af6, "musicalflat" },
+ { 0x0af7, "malesymbol" },
+ { 0x0af8, "femalesymbol" },
+ { 0x0af9, "telephone" },
+ { 0x0afa, "telephonerecorder" },
+ { 0x0afb, "phonographcopyright" },
+ { 0x0afc, "caret" },
+ { 0x0afd, "singlelowquotemark" },
+ { 0x0afe, "doublelowquotemark" },
+ { 0x0aff, "cursor" },
+ { 0x0ba3, "leftcaret" },
+ { 0x0ba6, "rightcaret" },
+ { 0x0ba8, "downcaret" },
+ { 0x0ba9, "upcaret" },
+ { 0x0bc0, "overbar" },
+ { 0x0bc2, "downtack" },
+ { 0x0bc3, "upshoe" },
+ { 0x0bc4, "downstile" },
+ { 0x0bc6, "underbar" },
+ { 0x0bca, "jot" },
+ { 0x0bcc, "quad" },
+ { 0x0bce, "uptack" },
+ { 0x0bcf, "circle" },
+ { 0x0bd3, "upstile" },
+ { 0x0bd6, "downshoe" },
+ { 0x0bd8, "rightshoe" },
+ { 0x0bda, "leftshoe" },
+ { 0x0bdc, "lefttack" },
+ { 0x0bfc, "righttack" },
+ { 0x0cdf, "hebrew_doublelowline" },
+ { 0x0ce0, "hebrew_aleph" },
+ { 0x0ce1, "hebrew_bet" },
+ { 0x0ce1, "hebrew_beth" },
+ { 0x0ce2, "hebrew_gimel" },
+ { 0x0ce2, "hebrew_gimmel" },
+ { 0x0ce3, "hebrew_dalet" },
+ { 0x0ce3, "hebrew_daleth" },
+ { 0x0ce4, "hebrew_he" },
+ { 0x0ce5, "hebrew_waw" },
+ { 0x0ce6, "hebrew_zain" },
+ { 0x0ce6, "hebrew_zayin" },
+ { 0x0ce7, "hebrew_chet" },
+ { 0x0ce7, "hebrew_het" },
+ { 0x0ce8, "hebrew_tet" },
+ { 0x0ce8, "hebrew_teth" },
+ { 0x0ce9, "hebrew_yod" },
+ { 0x0cea, "hebrew_finalkaph" },
+ { 0x0ceb, "hebrew_kaph" },
+ { 0x0cec, "hebrew_lamed" },
+ { 0x0ced, "hebrew_finalmem" },
+ { 0x0cee, "hebrew_mem" },
+ { 0x0cef, "hebrew_finalnun" },
+ { 0x0cf0, "hebrew_nun" },
+ { 0x0cf1, "hebrew_samech" },
+ { 0x0cf1, "hebrew_samekh" },
+ { 0x0cf2, "hebrew_ayin" },
+ { 0x0cf3, "hebrew_finalpe" },
+ { 0x0cf4, "hebrew_pe" },
+ { 0x0cf5, "hebrew_finalzade" },
+ { 0x0cf5, "hebrew_finalzadi" },
+ { 0x0cf6, "hebrew_zade" },
+ { 0x0cf6, "hebrew_zadi" },
+ { 0x0cf7, "hebrew_kuf" },
+ { 0x0cf7, "hebrew_qoph" },
+ { 0x0cf8, "hebrew_resh" },
+ { 0x0cf9, "hebrew_shin" },
+ { 0x0cfa, "hebrew_taf" },
+ { 0x0cfa, "hebrew_taw" },
+ { 0x0da1, "Thai_kokai" },
+ { 0x0da2, "Thai_khokhai" },
+ { 0x0da3, "Thai_khokhuat" },
+ { 0x0da4, "Thai_khokhwai" },
+ { 0x0da5, "Thai_khokhon" },
+ { 0x0da6, "Thai_khorakhang" },
+ { 0x0da7, "Thai_ngongu" },
+ { 0x0da8, "Thai_chochan" },
+ { 0x0da9, "Thai_choching" },
+ { 0x0daa, "Thai_chochang" },
+ { 0x0dab, "Thai_soso" },
+ { 0x0dac, "Thai_chochoe" },
+ { 0x0dad, "Thai_yoying" },
+ { 0x0dae, "Thai_dochada" },
+ { 0x0daf, "Thai_topatak" },
+ { 0x0db0, "Thai_thothan" },
+ { 0x0db1, "Thai_thonangmontho" },
+ { 0x0db2, "Thai_thophuthao" },
+ { 0x0db3, "Thai_nonen" },
+ { 0x0db4, "Thai_dodek" },
+ { 0x0db5, "Thai_totao" },
+ { 0x0db6, "Thai_thothung" },
+ { 0x0db7, "Thai_thothahan" },
+ { 0x0db8, "Thai_thothong" },
+ { 0x0db9, "Thai_nonu" },
+ { 0x0dba, "Thai_bobaimai" },
+ { 0x0dbb, "Thai_popla" },
+ { 0x0dbc, "Thai_phophung" },
+ { 0x0dbd, "Thai_fofa" },
+ { 0x0dbe, "Thai_phophan" },
+ { 0x0dbf, "Thai_fofan" },
+ { 0x0dc0, "Thai_phosamphao" },
+ { 0x0dc1, "Thai_moma" },
+ { 0x0dc2, "Thai_yoyak" },
+ { 0x0dc3, "Thai_rorua" },
+ { 0x0dc4, "Thai_ru" },
+ { 0x0dc5, "Thai_loling" },
+ { 0x0dc6, "Thai_lu" },
+ { 0x0dc7, "Thai_wowaen" },
+ { 0x0dc8, "Thai_sosala" },
+ { 0x0dc9, "Thai_sorusi" },
+ { 0x0dca, "Thai_sosua" },
+ { 0x0dcb, "Thai_hohip" },
+ { 0x0dcc, "Thai_lochula" },
+ { 0x0dcd, "Thai_oang" },
+ { 0x0dce, "Thai_honokhuk" },
+ { 0x0dcf, "Thai_paiyannoi" },
+ { 0x0dd0, "Thai_saraa" },
+ { 0x0dd1, "Thai_maihanakat" },
+ { 0x0dd2, "Thai_saraaa" },
+ { 0x0dd3, "Thai_saraam" },
+ { 0x0dd4, "Thai_sarai" },
+ { 0x0dd5, "Thai_saraii" },
+ { 0x0dd6, "Thai_saraue" },
+ { 0x0dd7, "Thai_sarauee" },
+ { 0x0dd8, "Thai_sarau" },
+ { 0x0dd9, "Thai_sarauu" },
+ { 0x0dda, "Thai_phinthu" },
+ { 0x0dde, "Thai_maihanakat_maitho" },
+ { 0x0ddf, "Thai_baht" },
+ { 0x0de0, "Thai_sarae" },
+ { 0x0de1, "Thai_saraae" },
+ { 0x0de2, "Thai_sarao" },
+ { 0x0de3, "Thai_saraaimaimuan" },
+ { 0x0de4, "Thai_saraaimaimalai" },
+ { 0x0de5, "Thai_lakkhangyao" },
+ { 0x0de6, "Thai_maiyamok" },
+ { 0x0de7, "Thai_maitaikhu" },
+ { 0x0de8, "Thai_maiek" },
+ { 0x0de9, "Thai_maitho" },
+ { 0x0dea, "Thai_maitri" },
+ { 0x0deb, "Thai_maichattawa" },
+ { 0x0dec, "Thai_thanthakhat" },
+ { 0x0ded, "Thai_nikhahit" },
+ { 0x0df0, "Thai_leksun" },
+ { 0x0df1, "Thai_leknung" },
+ { 0x0df2, "Thai_leksong" },
+ { 0x0df3, "Thai_leksam" },
+ { 0x0df4, "Thai_leksi" },
+ { 0x0df5, "Thai_lekha" },
+ { 0x0df6, "Thai_lekhok" },
+ { 0x0df7, "Thai_lekchet" },
+ { 0x0df8, "Thai_lekpaet" },
+ { 0x0df9, "Thai_lekkao" },
+ { 0x0ea1, "Hangul_Kiyeog" },
+ { 0x0ea2, "Hangul_SsangKiyeog" },
+ { 0x0ea3, "Hangul_KiyeogSios" },
+ { 0x0ea4, "Hangul_Nieun" },
+ { 0x0ea5, "Hangul_NieunJieuj" },
+ { 0x0ea6, "Hangul_NieunHieuh" },
+ { 0x0ea7, "Hangul_Dikeud" },
+ { 0x0ea8, "Hangul_SsangDikeud" },
+ { 0x0ea9, "Hangul_Rieul" },
+ { 0x0eaa, "Hangul_RieulKiyeog" },
+ { 0x0eab, "Hangul_RieulMieum" },
+ { 0x0eac, "Hangul_RieulPieub" },
+ { 0x0ead, "Hangul_RieulSios" },
+ { 0x0eae, "Hangul_RieulTieut" },
+ { 0x0eaf, "Hangul_RieulPhieuf" },
+ { 0x0eb0, "Hangul_RieulHieuh" },
+ { 0x0eb1, "Hangul_Mieum" },
+ { 0x0eb2, "Hangul_Pieub" },
+ { 0x0eb3, "Hangul_SsangPieub" },
+ { 0x0eb4, "Hangul_PieubSios" },
+ { 0x0eb5, "Hangul_Sios" },
+ { 0x0eb6, "Hangul_SsangSios" },
+ { 0x0eb7, "Hangul_Ieung" },
+ { 0x0eb8, "Hangul_Jieuj" },
+ { 0x0eb9, "Hangul_SsangJieuj" },
+ { 0x0eba, "Hangul_Cieuc" },
+ { 0x0ebb, "Hangul_Khieuq" },
+ { 0x0ebc, "Hangul_Tieut" },
+ { 0x0ebd, "Hangul_Phieuf" },
+ { 0x0ebe, "Hangul_Hieuh" },
+ { 0x0ebf, "Hangul_A" },
+ { 0x0ec0, "Hangul_AE" },
+ { 0x0ec1, "Hangul_YA" },
+ { 0x0ec2, "Hangul_YAE" },
+ { 0x0ec3, "Hangul_EO" },
+ { 0x0ec4, "Hangul_E" },
+ { 0x0ec5, "Hangul_YEO" },
+ { 0x0ec6, "Hangul_YE" },
+ { 0x0ec7, "Hangul_O" },
+ { 0x0ec8, "Hangul_WA" },
+ { 0x0ec9, "Hangul_WAE" },
+ { 0x0eca, "Hangul_OE" },
+ { 0x0ecb, "Hangul_YO" },
+ { 0x0ecc, "Hangul_U" },
+ { 0x0ecd, "Hangul_WEO" },
+ { 0x0ece, "Hangul_WE" },
+ { 0x0ecf, "Hangul_WI" },
+ { 0x0ed0, "Hangul_YU" },
+ { 0x0ed1, "Hangul_EU" },
+ { 0x0ed2, "Hangul_YI" },
+ { 0x0ed3, "Hangul_I" },
+ { 0x0ed4, "Hangul_J_Kiyeog" },
+ { 0x0ed5, "Hangul_J_SsangKiyeog" },
+ { 0x0ed6, "Hangul_J_KiyeogSios" },
+ { 0x0ed7, "Hangul_J_Nieun" },
+ { 0x0ed8, "Hangul_J_NieunJieuj" },
+ { 0x0ed9, "Hangul_J_NieunHieuh" },
+ { 0x0eda, "Hangul_J_Dikeud" },
+ { 0x0edb, "Hangul_J_Rieul" },
+ { 0x0edc, "Hangul_J_RieulKiyeog" },
+ { 0x0edd, "Hangul_J_RieulMieum" },
+ { 0x0ede, "Hangul_J_RieulPieub" },
+ { 0x0edf, "Hangul_J_RieulSios" },
+ { 0x0ee0, "Hangul_J_RieulTieut" },
+ { 0x0ee1, "Hangul_J_RieulPhieuf" },
+ { 0x0ee2, "Hangul_J_RieulHieuh" },
+ { 0x0ee3, "Hangul_J_Mieum" },
+ { 0x0ee4, "Hangul_J_Pieub" },
+ { 0x0ee5, "Hangul_J_PieubSios" },
+ { 0x0ee6, "Hangul_J_Sios" },
+ { 0x0ee7, "Hangul_J_SsangSios" },
+ { 0x0ee8, "Hangul_J_Ieung" },
+ { 0x0ee9, "Hangul_J_Jieuj" },
+ { 0x0eea, "Hangul_J_Cieuc" },
+ { 0x0eeb, "Hangul_J_Khieuq" },
+ { 0x0eec, "Hangul_J_Tieut" },
+ { 0x0eed, "Hangul_J_Phieuf" },
+ { 0x0eee, "Hangul_J_Hieuh" },
+ { 0x0eef, "Hangul_RieulYeorinHieuh" },
+ { 0x0ef0, "Hangul_SunkyeongeumMieum" },
+ { 0x0ef1, "Hangul_SunkyeongeumPieub" },
+ { 0x0ef2, "Hangul_PanSios" },
+ { 0x0ef3, "Hangul_KkogjiDalrinIeung" },
+ { 0x0ef4, "Hangul_SunkyeongeumPhieuf" },
+ { 0x0ef5, "Hangul_YeorinHieuh" },
+ { 0x0ef6, "Hangul_AraeA" },
+ { 0x0ef7, "Hangul_AraeAE" },
+ { 0x0ef8, "Hangul_J_PanSios" },
+ { 0x0ef9, "Hangul_J_KkogjiDalrinIeung" },
+ { 0x0efa, "Hangul_J_YeorinHieuh" },
+ { 0x0eff, "Korean_Won" },
+ { 0x13bc, "OE" },
+ { 0x13bd, "oe" },
+ { 0x13be, "Ydiaeresis" },
+
+ { 0x1e9f, "combining_tilde" },
+ { 0x1ef2, "combining_grave" },
+ { 0x1ef3, "combining_acute" },
+ { 0x1efa, "Ohorn" },
+ { 0x1efb, "ohorn" },
+ { 0x1efc, "Uhorn" },
+ { 0x1efd, "uhorn" },
+ { 0x1efe, "combining_hook" },
+ { 0x1eff, "combining_belowdot" },
+
+ { 0x20a0, "EcuSign" },
+ { 0x20a1, "ColonSign" },
+ { 0x20a2, "CruzeiroSign" },
+ { 0x20a3, "FFrancSign" },
+ { 0x20a4, "LiraSign" },
+ { 0x20a5, "MillSign" },
+ { 0x20a6, "NairaSign" },
+ { 0x20a7, "PesetaSign" },
+ { 0x20a8, "RupeeSign" },
+ { 0x20a9, "WonSign" },
+ { 0x20aa, "NewSheqelSign" },
+ { 0x20ab, "DongSign" },
+ { 0x20ac, "EuroSign" },
+ { 0xfd01, "3270_Duplicate" },
+ { 0xfd02, "3270_FieldMark" },
+ { 0xfd03, "3270_Right2" },
+ { 0xfd04, "3270_Left2" },
+ { 0xfd05, "3270_BackTab" },
+ { 0xfd06, "3270_EraseEOF" },
+ { 0xfd07, "3270_EraseInput" },
+ { 0xfd08, "3270_Reset" },
+ { 0xfd09, "3270_Quit" },
+ { 0xfd0a, "3270_PA1" },
+ { 0xfd0b, "3270_PA2" },
+ { 0xfd0c, "3270_PA3" },
+ { 0xfd0d, "3270_Test" },
+ { 0xfd0e, "3270_Attn" },
+ { 0xfd0f, "3270_CursorBlink" },
+ { 0xfd10, "3270_AltCursor" },
+ { 0xfd11, "3270_KeyClick" },
+ { 0xfd12, "3270_Jump" },
+ { 0xfd13, "3270_Ident" },
+ { 0xfd14, "3270_Rule" },
+ { 0xfd15, "3270_Copy" },
+ { 0xfd16, "3270_Play" },
+ { 0xfd17, "3270_Setup" },
+ { 0xfd18, "3270_Record" },
+ { 0xfd19, "3270_ChangeScreen" },
+ { 0xfd1a, "3270_DeleteWord" },
+ { 0xfd1b, "3270_ExSelect" },
+ { 0xfd1c, "3270_CursorSelect" },
+ { 0xfd1d, "3270_PrintScreen" },
+ { 0xfd1e, "3270_Enter" },
+ { 0xfe01, "ISO_Lock" },
+ { 0xfe02, "ISO_Level2_Latch" },
+ { 0xfe03, "ISO_Level3_Shift" },
+ { 0xfe04, "ISO_Level3_Latch" },
+ { 0xfe05, "ISO_Level3_Lock" },
+ { 0xfe06, "ISO_Group_Latch" },
+ { 0xfe07, "ISO_Group_Lock" },
+ { 0xfe08, "ISO_Next_Group" },
+ { 0xfe09, "ISO_Next_Group_Lock" },
+ { 0xfe0a, "ISO_Prev_Group" },
+ { 0xfe0b, "ISO_Prev_Group_Lock" },
+ { 0xfe0c, "ISO_First_Group" },
+ { 0xfe0d, "ISO_First_Group_Lock" },
+ { 0xfe0e, "ISO_Last_Group" },
+ { 0xfe0f, "ISO_Last_Group_Lock" },
+ { 0xfe20, "ISO_Left_Tab" },
+ { 0xfe21, "ISO_Move_Line_Up" },
+ { 0xfe22, "ISO_Move_Line_Down" },
+ { 0xfe23, "ISO_Partial_Line_Up" },
+ { 0xfe24, "ISO_Partial_Line_Down" },
+ { 0xfe25, "ISO_Partial_Space_Left" },
+ { 0xfe26, "ISO_Partial_Space_Right" },
+ { 0xfe27, "ISO_Set_Margin_Left" },
+ { 0xfe28, "ISO_Set_Margin_Right" },
+ { 0xfe29, "ISO_Release_Margin_Left" },
+ { 0xfe2a, "ISO_Release_Margin_Right" },
+ { 0xfe2b, "ISO_Release_Both_Margins" },
+ { 0xfe2c, "ISO_Fast_Cursor_Left" },
+ { 0xfe2d, "ISO_Fast_Cursor_Right" },
+ { 0xfe2e, "ISO_Fast_Cursor_Up" },
+ { 0xfe2f, "ISO_Fast_Cursor_Down" },
+ { 0xfe30, "ISO_Continuous_Underline" },
+ { 0xfe31, "ISO_Discontinuous_Underline" },
+ { 0xfe32, "ISO_Emphasize" },
+ { 0xfe33, "ISO_Center_Object" },
+ { 0xfe34, "ISO_Enter" },
+ { 0xfe50, "dead_grave" },
+ { 0xfe51, "dead_acute" },
+ { 0xfe52, "dead_circumflex" },
+ { 0xfe53, "dead_tilde" },
+ { 0xfe54, "dead_macron" },
+ { 0xfe55, "dead_breve" },
+ { 0xfe56, "dead_abovedot" },
+ { 0xfe57, "dead_diaeresis" },
+ { 0xfe58, "dead_abovering" },
+ { 0xfe59, "dead_doubleacute" },
+ { 0xfe5a, "dead_caron" },
+ { 0xfe5b, "dead_cedilla" },
+ { 0xfe5c, "dead_ogonek" },
+ { 0xfe5d, "dead_iota" },
+ { 0xfe5e, "dead_voiced_sound" },
+ { 0xfe5f, "dead_semivoiced_sound" },
+ { 0xfe60, "dead_belowdot" },
+ { 0xfe61, "dead_hook" },
+ { 0xfe62, "dead_horn" },
+ { 0xfe70, "AccessX_Enable" },
+ { 0xfe71, "AccessX_Feedback_Enable" },
+ { 0xfe72, "RepeatKeys_Enable" },
+ { 0xfe73, "SlowKeys_Enable" },
+ { 0xfe74, "BounceKeys_Enable" },
+ { 0xfe75, "StickyKeys_Enable" },
+ { 0xfe76, "MouseKeys_Enable" },
+ { 0xfe77, "MouseKeys_Accel_Enable" },
+ { 0xfe78, "Overlay1_Enable" },
+ { 0xfe79, "Overlay2_Enable" },
+ { 0xfe7a, "AudibleBell_Enable" },
+ { 0xfed0, "First_Virtual_Screen" },
+ { 0xfed1, "Prev_Virtual_Screen" },
+ { 0xfed2, "Next_Virtual_Screen" },
+ { 0xfed4, "Last_Virtual_Screen" },
+ { 0xfed5, "Terminate_Server" },
+ { 0xfee0, "Pointer_Left" },
+ { 0xfee1, "Pointer_Right" },
+ { 0xfee2, "Pointer_Up" },
+ { 0xfee3, "Pointer_Down" },
+ { 0xfee4, "Pointer_UpLeft" },
+ { 0xfee5, "Pointer_UpRight" },
+ { 0xfee6, "Pointer_DownLeft" },
+ { 0xfee7, "Pointer_DownRight" },
+ { 0xfee8, "Pointer_Button_Dflt" },
+ { 0xfee9, "Pointer_Button1" },
+ { 0xfeea, "Pointer_Button2" },
+ { 0xfeeb, "Pointer_Button3" },
+ { 0xfeec, "Pointer_Button4" },
+ { 0xfeed, "Pointer_Button5" },
+ { 0xfeee, "Pointer_DblClick_Dflt" },
+ { 0xfeef, "Pointer_DblClick1" },
+ { 0xfef0, "Pointer_DblClick2" },
+ { 0xfef1, "Pointer_DblClick3" },
+ { 0xfef2, "Pointer_DblClick4" },
+ { 0xfef3, "Pointer_DblClick5" },
+ { 0xfef4, "Pointer_Drag_Dflt" },
+ { 0xfef5, "Pointer_Drag1" },
+ { 0xfef6, "Pointer_Drag2" },
+ { 0xfef7, "Pointer_Drag3" },
+ { 0xfef8, "Pointer_Drag4" },
+ { 0xfef9, "Pointer_EnableKeys" },
+ { 0xfefa, "Pointer_Accelerate" },
+ { 0xfefb, "Pointer_DfltBtnNext" },
+ { 0xfefc, "Pointer_DfltBtnPrev" },
+ { 0xfefd, "Pointer_Drag5" },
+ { 0xff08, "BackSpace" },
+ { 0xff09, "Tab" },
+ { 0xff0a, "Linefeed" },
+ { 0xff0b, "Clear" },
+ { 0xff0d, "Return" },
+ { 0xff13, "Pause" },
+ { 0xff14, "Scroll_Lock" },
+ { 0xff15, "Sys_Req" },
+ { 0xff1b, "Escape" },
+ { 0xff20, "Multi_key" },
+ { 0xff21, "Kanji" },
+ { 0xff22, "Muhenkan" },
+ { 0xff23, "Henkan" },
+ { 0xff23, "Henkan_Mode" },
+ { 0xff24, "Romaji" },
+ { 0xff25, "Hiragana" },
+ { 0xff26, "Katakana" },
+ { 0xff27, "Hiragana_Katakana" },
+ { 0xff28, "Zenkaku" },
+ { 0xff29, "Hankaku" },
+ { 0xff2a, "Zenkaku_Hankaku" },
+ { 0xff2b, "Touroku" },
+ { 0xff2c, "Massyo" },
+ { 0xff2d, "Kana_Lock" },
+ { 0xff2e, "Kana_Shift" },
+ { 0xff2f, "Eisu_Shift" },
+ { 0xff30, "Eisu_toggle" },
+ { 0xff31, "Hangul" },
+ { 0xff32, "Hangul_Start" },
+ { 0xff33, "Hangul_End" },
+ { 0xff34, "Hangul_Hanja" },
+ { 0xff35, "Hangul_Jamo" },
+ { 0xff36, "Hangul_Romaja" },
+ { 0xff37, "Codeinput" },
+ { 0xff38, "Hangul_Jeonja" },
+ { 0xff39, "Hangul_Banja" },
+ { 0xff3a, "Hangul_PreHanja" },
+ { 0xff3b, "Hangul_PostHanja" },
+ { 0xff3c, "SingleCandidate" },
+ { 0xff3d, "MultipleCandidate" },
+ { 0xff3e, "PreviousCandidate" },
+ { 0xff3f, "Hangul_Special" },
+ { 0xff50, "Home" },
+ { 0xff51, "Left" },
+ { 0xff52, "Up" },
+ { 0xff53, "Right" },
+ { 0xff54, "Down" },
+ { 0xff55, "Page_Up" },
+ { 0xff55, "Prior" },
+ { 0xff56, "Page_Down" },
+ { 0xff56, "Next" },
+ { 0xff57, "End" },
+ { 0xff58, "Begin" },
+ { 0xff60, "Select" },
+ { 0xff61, "Print" },
+ { 0xff62, "Execute" },
+ { 0xff63, "Insert" },
+ { 0xff65, "Undo" },
+ { 0xff66, "Redo" },
+ { 0xff67, "Menu" },
+ { 0xff68, "Find" },
+ { 0xff69, "Cancel" },
+ { 0xff6a, "Help" },
+ { 0xff6b, "Break" },
+ { 0xff7e, "Mode_switch" },
+ { 0xff7e, "Arabic_switch" },
+ { 0xff7e, "Greek_switch" },
+ { 0xff7e, "Hangul_switch" },
+ { 0xff7e, "Hebrew_switch" },
+ { 0xff7e, "ISO_Group_Shift" },
+ { 0xff7e, "kana_switch" },
+ { 0xff7e, "script_switch" },
+ { 0xff7f, "Num_Lock" },
+ { 0xff80, "KP_Space" },
+ { 0xff89, "KP_Tab" },
+ { 0xff8d, "KP_Enter" },
+ { 0xff91, "KP_F1" },
+ { 0xff92, "KP_F2" },
+ { 0xff93, "KP_F3" },
+ { 0xff94, "KP_F4" },
+ { 0xff95, "KP_Home" },
+ { 0xff96, "KP_Left" },
+ { 0xff97, "KP_Up" },
+ { 0xff98, "KP_Right" },
+ { 0xff99, "KP_Down" },
+ { 0xff9a, "KP_Page_Up" },
+ { 0xff9a, "KP_Prior" },
+ { 0xff9b, "KP_Page_Down" },
+ { 0xff9b, "KP_Next" },
+ { 0xff9c, "KP_End" },
+ { 0xff9d, "KP_Begin" },
+ { 0xff9e, "KP_Insert" },
+ { 0xff9f, "KP_Delete" },
+ { 0xffaa, "KP_Multiply" },
+ { 0xffab, "KP_Add" },
+ { 0xffac, "KP_Separator" },
+ { 0xffad, "KP_Subtract" },
+ { 0xffae, "KP_Decimal" },
+ { 0xffaf, "KP_Divide" },
+ { 0xffb0, "KP_0" },
+ { 0xffb1, "KP_1" },
+ { 0xffb2, "KP_2" },
+ { 0xffb3, "KP_3" },
+ { 0xffb4, "KP_4" },
+ { 0xffb5, "KP_5" },
+ { 0xffb6, "KP_6" },
+ { 0xffb7, "KP_7" },
+ { 0xffb8, "KP_8" },
+ { 0xffb9, "KP_9" },
+ { 0xffbd, "KP_Equal" },
+ { 0xffbe, "F1" },
+ { 0xffbf, "F2" },
+ { 0xffc0, "F3" },
+ { 0xffc1, "F4" },
+ { 0xffc2, "F5" },
+ { 0xffc3, "F6" },
+ { 0xffc4, "F7" },
+ { 0xffc5, "F8" },
+ { 0xffc6, "F9" },
+ { 0xffc7, "F10" },
+ { 0xffc8, "F11" },
+ { 0xffc9, "F12" },
+ { 0xffca, "F13" },
+ { 0xffcb, "F14" },
+ { 0xffcc, "F15" },
+ { 0xffcd, "F16" },
+ { 0xffce, "F17" },
+ { 0xffcf, "F18" },
+ { 0xffd0, "F19" },
+ { 0xffd1, "F20" },
+ { 0xffd2, "F21" },
+ { 0xffd3, "F22" },
+ { 0xffd4, "F23" },
+ { 0xffd5, "F24" },
+ { 0xffd6, "F25" },
+ { 0xffd7, "F26" },
+ { 0xffd8, "F27" },
+ { 0xffd9, "F28" },
+ { 0xffda, "F29" },
+ { 0xffdb, "F30" },
+ { 0xffdc, "F31" },
+ { 0xffdd, "F32" },
+ { 0xffde, "F33" },
+ { 0xffdf, "F34" },
+ { 0xffe0, "F35" },
+ { 0xffe1, "Shift_L" },
+ { 0xffe2, "Shift_R" },
+ { 0xffe3, "Control_L" },
+ { 0xffe4, "Control_R" },
+ { 0xffe5, "Caps_Lock" },
+ { 0xffe6, "Shift_Lock" },
+ { 0xffe7, "Meta_L" },
+ { 0xffe8, "Meta_R" },
+ { 0xffe9, "Alt_L" },
+ { 0xffea, "Alt_R" },
+ { 0xffeb, "Super_L" },
+ { 0xffec, "Super_R" },
+ { 0xffed, "Hyper_L" },
+ { 0xffee, "Hyper_R" },
+ { 0xffff, "Delete" }
+};
+
+static __KeyName __scim_keys_by_name [] = {
+ { 0x0030, "0" },
+ { 0x0031, "1" },
+ { 0x0032, "2" },
+ { 0x0033, "3" },
+ { 0xFD10, "3270_AltCursor" },
+ { 0xFD0E, "3270_Attn" },
+ { 0xFD05, "3270_BackTab" },
+ { 0xFD19, "3270_ChangeScreen" },
+ { 0xFD15, "3270_Copy" },
+ { 0xFD0F, "3270_CursorBlink" },
+ { 0xFD1C, "3270_CursorSelect" },
+ { 0xFD1A, "3270_DeleteWord" },
+ { 0xFD01, "3270_Duplicate" },
+ { 0xFD1E, "3270_Enter" },
+ { 0xFD06, "3270_EraseEOF" },
+ { 0xFD07, "3270_EraseInput" },
+ { 0xFD1B, "3270_ExSelect" },
+ { 0xFD02, "3270_FieldMark" },
+ { 0xFD13, "3270_Ident" },
+ { 0xFD12, "3270_Jump" },
+ { 0xFD11, "3270_KeyClick" },
+ { 0xFD04, "3270_Left2" },
+ { 0xFD0A, "3270_PA1" },
+ { 0xFD0B, "3270_PA2" },
+ { 0xFD0C, "3270_PA3" },
+ { 0xFD16, "3270_Play" },
+ { 0xFD1D, "3270_PrintScreen" },
+ { 0xFD09, "3270_Quit" },
+ { 0xFD18, "3270_Record" },
+ { 0xFD08, "3270_Reset" },
+ { 0xFD03, "3270_Right2" },
+ { 0xFD14, "3270_Rule" },
+ { 0xFD17, "3270_Setup" },
+ { 0xFD0D, "3270_Test" },
+ { 0x0034, "4" },
+ { 0x0035, "5" },
+ { 0x0036, "6" },
+ { 0x0037, "7" },
+ { 0x0038, "8" },
+ { 0x0039, "9" },
+ { 0x0041, "A" },
+ { 0x00C6, "AE" },
+ { 0x00C1, "Aacute" },
+ { 0x01C3, "Abreve" },
+ { 0xFE70, "AccessX_Enable" },
+ { 0xFE71, "AccessX_Feedback_Enable" },
+ { 0x00C2, "Acircumflex" },
+ { 0x00C4, "Adiaeresis" },
+ { 0x00C0, "Agrave" },
+ { 0xFFE9, "Alt_L" },
+ { 0xFFEA, "Alt_R" },
+ { 0x03C0, "Amacron" },
+ { 0x01A1, "Aogonek" },
+ { 0x05D9, "Arabic_ain" },
+ { 0x05C7, "Arabic_alef" },
+ { 0x05E9, "Arabic_alefmaksura" },
+ { 0x05C8, "Arabic_beh" },
+ { 0x05AC, "Arabic_comma" },
+ { 0x05D6, "Arabic_dad" },
+ { 0x05CF, "Arabic_dal" },
+ { 0x05EF, "Arabic_damma" },
+ { 0x05EC, "Arabic_dammatan" },
+ { 0x05EE, "Arabic_fatha" },
+ { 0x05EB, "Arabic_fathatan" },
+ { 0x05E1, "Arabic_feh" },
+ { 0x05DA, "Arabic_ghain" },
+ { 0x05E7, "Arabic_ha" },
+ { 0x05CD, "Arabic_hah" },
+ { 0x05C1, "Arabic_hamza" },
+ { 0x05C3, "Arabic_hamzaonalef" },
+ { 0x05C4, "Arabic_hamzaonwaw" },
+ { 0x05C6, "Arabic_hamzaonyeh" },
+ { 0x05C5, "Arabic_hamzaunderalef" },
+ { 0x05E7, "Arabic_heh" },
+ { 0x05CC, "Arabic_jeem" },
+ { 0x05E3, "Arabic_kaf" },
+ { 0x05F0, "Arabic_kasra" },
+ { 0x05ED, "Arabic_kasratan" },
+ { 0x05CE, "Arabic_khah" },
+ { 0x05E4, "Arabic_lam" },
+ { 0x05C2, "Arabic_maddaonalef" },
+ { 0x05E5, "Arabic_meem" },
+ { 0x05E6, "Arabic_noon" },
+ { 0x05E2, "Arabic_qaf" },
+ { 0x05BF, "Arabic_question_mark" },
+ { 0x05D1, "Arabic_ra" },
+ { 0x05D5, "Arabic_sad" },
+ { 0x05D3, "Arabic_seen" },
+ { 0x05BB, "Arabic_semicolon" },
+ { 0x05F1, "Arabic_shadda" },
+ { 0x05D4, "Arabic_sheen" },
+ { 0x05F2, "Arabic_sukun" },
+ { 0xFF7E, "Arabic_switch" },
+ { 0x05D7, "Arabic_tah" },
+ { 0x05E0, "Arabic_tatweel" },
+ { 0x05CA, "Arabic_teh" },
+ { 0x05C9, "Arabic_tehmarbuta" },
+ { 0x05D0, "Arabic_thal" },
+ { 0x05CB, "Arabic_theh" },
+ { 0x05E8, "Arabic_waw" },
+ { 0x05EA, "Arabic_yeh" },
+ { 0x05D8, "Arabic_zah" },
+ { 0x05D2, "Arabic_zain" },
+ { 0x00C5, "Aring" },
+ { 0x00C3, "Atilde" },
+ { 0xFE7A, "AudibleBell_Enable" },
+ { 0x0042, "B" },
+ { 0xFF08, "BackSpace" },
+ { 0xFF58, "Begin" },
+ { 0xFE74, "BounceKeys_Enable" },
+ { 0xFF6B, "Break" },
+ { 0x06BE, "Byelorussian_SHORTU" },
+ { 0x06AE, "Byelorussian_shortu" },
+ { 0x0043, "C" },
+ { 0x02C5, "Cabovedot" },
+ { 0x01C6, "Cacute" },
+ { 0xFF69, "Cancel" },
+ { 0xFFE5, "Caps_Lock" },
+ { 0x01C8, "Ccaron" },
+ { 0x00C7, "Ccedilla" },
+ { 0x02C6, "Ccircumflex" },
+ { 0xFF0B, "Clear" },
+ { 0xFF37, "Codeinput" },
+ { 0x20A1, "ColonSign" },
+ { 0xFFE3, "Control_L" },
+ { 0xFFE4, "Control_R" },
+ { 0x20A2, "CruzeiroSign" },
+ { 0x06E1, "Cyrillic_A" },
+ { 0x06E2, "Cyrillic_BE" },
+ { 0x06FE, "Cyrillic_CHE" },
+ { 0x06E4, "Cyrillic_DE" },
+ { 0x06BF, "Cyrillic_DZHE" },
+ { 0x06FC, "Cyrillic_E" },
+ { 0x06E6, "Cyrillic_EF" },
+ { 0x06EC, "Cyrillic_EL" },
+ { 0x06ED, "Cyrillic_EM" },
+ { 0x06EE, "Cyrillic_EN" },
+ { 0x06F2, "Cyrillic_ER" },
+ { 0x06F3, "Cyrillic_ES" },
+ { 0x06E7, "Cyrillic_GHE" },
+ { 0x06E8, "Cyrillic_HA" },
+ { 0x06FF, "Cyrillic_HARDSIGN" },
+ { 0x06E9, "Cyrillic_I" },
+ { 0x06E5, "Cyrillic_IE" },
+ { 0x06B3, "Cyrillic_IO" },
+ { 0x06B8, "Cyrillic_JE" },
+ { 0x06EB, "Cyrillic_KA" },
+ { 0x06B9, "Cyrillic_LJE" },
+ { 0x06BA, "Cyrillic_NJE" },
+ { 0x06EF, "Cyrillic_O" },
+ { 0x06F0, "Cyrillic_PE" },
+ { 0x06FB, "Cyrillic_SHA" },
+ { 0x06FD, "Cyrillic_SHCHA" },
+ { 0x06EA, "Cyrillic_SHORTI" },
+ { 0x06F8, "Cyrillic_SOFTSIGN" },
+ { 0x06F4, "Cyrillic_TE" },
+ { 0x06E3, "Cyrillic_TSE" },
+ { 0x06F5, "Cyrillic_U" },
+ { 0x06F7, "Cyrillic_VE" },
+ { 0x06F1, "Cyrillic_YA" },
+ { 0x06F9, "Cyrillic_YERU" },
+ { 0x06E0, "Cyrillic_YU" },
+ { 0x06FA, "Cyrillic_ZE" },
+ { 0x06F6, "Cyrillic_ZHE" },
+ { 0x06C1, "Cyrillic_a" },
+ { 0x06C2, "Cyrillic_be" },
+ { 0x06DE, "Cyrillic_che" },
+ { 0x06C4, "Cyrillic_de" },
+ { 0x06AF, "Cyrillic_dzhe" },
+ { 0x06DC, "Cyrillic_e" },
+ { 0x06C6, "Cyrillic_ef" },
+ { 0x06CC, "Cyrillic_el" },
+ { 0x06CD, "Cyrillic_em" },
+ { 0x06CE, "Cyrillic_en" },
+ { 0x06D2, "Cyrillic_er" },
+ { 0x06D3, "Cyrillic_es" },
+ { 0x06C7, "Cyrillic_ghe" },
+ { 0x06C8, "Cyrillic_ha" },
+ { 0x06DF, "Cyrillic_hardsign" },
+ { 0x06C9, "Cyrillic_i" },
+ { 0x06C5, "Cyrillic_ie" },
+ { 0x06A3, "Cyrillic_io" },
+ { 0x06A8, "Cyrillic_je" },
+ { 0x06CB, "Cyrillic_ka" },
+ { 0x06A9, "Cyrillic_lje" },
+ { 0x06AA, "Cyrillic_nje" },
+ { 0x06CF, "Cyrillic_o" },
+ { 0x06D0, "Cyrillic_pe" },
+ { 0x06DB, "Cyrillic_sha" },
+ { 0x06DD, "Cyrillic_shcha" },
+ { 0x06CA, "Cyrillic_shorti" },
+ { 0x06D8, "Cyrillic_softsign" },
+ { 0x06D4, "Cyrillic_te" },
+ { 0x06C3, "Cyrillic_tse" },
+ { 0x06D5, "Cyrillic_u" },
+ { 0x06D7, "Cyrillic_ve" },
+ { 0x06D1, "Cyrillic_ya" },
+ { 0x06D9, "Cyrillic_yeru" },
+ { 0x06C0, "Cyrillic_yu" },
+ { 0x06DA, "Cyrillic_ze" },
+ { 0x06D6, "Cyrillic_zhe" },
+ { 0x0044, "D" },
+ { 0x01CF, "Dcaron" },
+ { 0xFFFF, "Delete" },
+ { 0x20AB, "DongSign" },
+ { 0xFF54, "Down" },
+ { 0x01D0, "Dstroke" },
+ { 0x0045, "E" },
+ { 0x03BD, "ENG" },
+ { 0x00D0, "ETH" },
+ { 0x03CC, "Eabovedot" },
+ { 0x00C9, "Eacute" },
+ { 0x01CC, "Ecaron" },
+ { 0x00CA, "Ecircumflex" },
+ { 0x20A0, "EcuSign" },
+ { 0x00CB, "Ediaeresis" },
+ { 0x00C8, "Egrave" },
+ { 0xFF2F, "Eisu_Shift" },
+ { 0xFF30, "Eisu_toggle" },
+ { 0x03AA, "Emacron" },
+ { 0xFF57, "End" },
+ { 0x01CA, "Eogonek" },
+ { 0xFF1B, "Escape" },
+ { 0x00D0, "Eth" },
+ { 0x20AC, "EuroSign" },
+ { 0xFF62, "Execute" },
+ { 0x0046, "F" },
+ { 0xFFBE, "F1" },
+ { 0xFFC7, "F10" },
+ { 0xFFC8, "F11" },
+ { 0xFFC9, "F12" },
+ { 0xFFCA, "F13" },
+ { 0xFFCB, "F14" },
+ { 0xFFCC, "F15" },
+ { 0xFFCD, "F16" },
+ { 0xFFCE, "F17" },
+ { 0xFFCF, "F18" },
+ { 0xFFD0, "F19" },
+ { 0xFFBF, "F2" },
+ { 0xFFD1, "F20" },
+ { 0xFFD2, "F21" },
+ { 0xFFD3, "F22" },
+ { 0xFFD4, "F23" },
+ { 0xFFD5, "F24" },
+ { 0xFFD6, "F25" },
+ { 0xFFD7, "F26" },
+ { 0xFFD8, "F27" },
+ { 0xFFD9, "F28" },
+ { 0xFFDA, "F29" },
+ { 0xFFC0, "F3" },
+ { 0xFFDB, "F30" },
+ { 0xFFDC, "F31" },
+ { 0xFFDD, "F32" },
+ { 0xFFDE, "F33" },
+ { 0xFFDF, "F34" },
+ { 0xFFE0, "F35" },
+ { 0xFFC1, "F4" },
+ { 0xFFC2, "F5" },
+ { 0xFFC3, "F6" },
+ { 0xFFC4, "F7" },
+ { 0xFFC5, "F8" },
+ { 0xFFC6, "F9" },
+ { 0x20A3, "FFrancSign" },
+ { 0xFF68, "Find" },
+ { 0xFED0, "First_Virtual_Screen" },
+ { 0x0047, "G" },
+ { 0x02D5, "Gabovedot" },
+ { 0x02AB, "Gbreve" },
+ { 0x03AB, "Gcedilla" },
+ { 0x02D8, "Gcircumflex" },
+ { 0x07C1, "Greek_ALPHA" },
+ { 0x07A1, "Greek_ALPHAaccent" },
+ { 0x07C2, "Greek_BETA" },
+ { 0x07D7, "Greek_CHI" },
+ { 0x07C4, "Greek_DELTA" },
+ { 0x07C5, "Greek_EPSILON" },
+ { 0x07A2, "Greek_EPSILONaccent" },
+ { 0x07C7, "Greek_ETA" },
+ { 0x07A3, "Greek_ETAaccent" },
+ { 0x07C3, "Greek_GAMMA" },
+ { 0x07C9, "Greek_IOTA" },
+ { 0x07A4, "Greek_IOTAaccent" },
+ { 0x07A5, "Greek_IOTAdiaeresis" },
+ { 0x07CA, "Greek_KAPPA" },
+ { 0x07CB, "Greek_LAMBDA" },
+ { 0x07CB, "Greek_LAMDA" },
+ { 0x07CC, "Greek_MU" },
+ { 0x07CD, "Greek_NU" },
+ { 0x07D9, "Greek_OMEGA" },
+ { 0x07AB, "Greek_OMEGAaccent" },
+ { 0x07CF, "Greek_OMICRON" },
+ { 0x07A7, "Greek_OMICRONaccent" },
+ { 0x07D6, "Greek_PHI" },
+ { 0x07D0, "Greek_PI" },
+ { 0x07D8, "Greek_PSI" },
+ { 0x07D1, "Greek_RHO" },
+ { 0x07D2, "Greek_SIGMA" },
+ { 0x07D4, "Greek_TAU" },
+ { 0x07C8, "Greek_THETA" },
+ { 0x07D5, "Greek_UPSILON" },
+ { 0x07A8, "Greek_UPSILONaccent" },
+ { 0x07A9, "Greek_UPSILONdieresis" },
+ { 0x07CE, "Greek_XI" },
+ { 0x07C6, "Greek_ZETA" },
+ { 0x07AE, "Greek_accentdieresis" },
+ { 0x07E1, "Greek_alpha" },
+ { 0x07B1, "Greek_alphaaccent" },
+ { 0x07E2, "Greek_beta" },
+ { 0x07F7, "Greek_chi" },
+ { 0x07E4, "Greek_delta" },
+ { 0x07E5, "Greek_epsilon" },
+ { 0x07B2, "Greek_epsilonaccent" },
+ { 0x07E7, "Greek_eta" },
+ { 0x07B3, "Greek_etaaccent" },
+ { 0x07F3, "Greek_finalsmallsigma" },
+ { 0x07E3, "Greek_gamma" },
+ { 0x07AF, "Greek_horizbar" },
+ { 0x07E9, "Greek_iota" },
+ { 0x07B4, "Greek_iotaaccent" },
+ { 0x07B6, "Greek_iotaaccentdieresis" },
+ { 0x07B5, "Greek_iotadieresis" },
+ { 0x07EA, "Greek_kappa" },
+ { 0x07EB, "Greek_lambda" },
+ { 0x07EB, "Greek_lamda" },
+ { 0x07EC, "Greek_mu" },
+ { 0x07ED, "Greek_nu" },
+ { 0x07F9, "Greek_omega" },
+ { 0x07BB, "Greek_omegaaccent" },
+ { 0x07EF, "Greek_omicron" },
+ { 0x07B7, "Greek_omicronaccent" },
+ { 0x07F6, "Greek_phi" },
+ { 0x07F0, "Greek_pi" },
+ { 0x07F8, "Greek_psi" },
+ { 0x07F1, "Greek_rho" },
+ { 0x07F2, "Greek_sigma" },
+ { 0xFF7E, "Greek_switch" },
+ { 0x07F4, "Greek_tau" },
+ { 0x07E8, "Greek_theta" },
+ { 0x07F5, "Greek_upsilon" },
+ { 0x07B8, "Greek_upsilonaccent" },
+ { 0x07BA, "Greek_upsilonaccentdieresis" },
+ { 0x07B9, "Greek_upsilondieresis" },
+ { 0x07EE, "Greek_xi" },
+ { 0x07E6, "Greek_zeta" },
+ { 0x0048, "H" },
+ { 0xFF31, "Hangul" },
+ { 0x0EBF, "Hangul_A" },
+ { 0x0EC0, "Hangul_AE" },
+ { 0x0EF6, "Hangul_AraeA" },
+ { 0x0EF7, "Hangul_AraeAE" },
+ { 0xFF39, "Hangul_Banja" },
+ { 0x0EBA, "Hangul_Cieuc" },
+ { 0x0EA7, "Hangul_Dikeud" },
+ { 0x0EC4, "Hangul_E" },
+ { 0x0EC3, "Hangul_EO" },
+ { 0x0ED1, "Hangul_EU" },
+ { 0xFF33, "Hangul_End" },
+ { 0xFF34, "Hangul_Hanja" },
+ { 0x0EBE, "Hangul_Hieuh" },
+ { 0x0ED3, "Hangul_I" },
+ { 0x0EB7, "Hangul_Ieung" },
+ { 0x0EEA, "Hangul_J_Cieuc" },
+ { 0x0EDA, "Hangul_J_Dikeud" },
+ { 0x0EEE, "Hangul_J_Hieuh" },
+ { 0x0EE8, "Hangul_J_Ieung" },
+ { 0x0EE9, "Hangul_J_Jieuj" },
+ { 0x0EEB, "Hangul_J_Khieuq" },
+ { 0x0ED4, "Hangul_J_Kiyeog" },
+ { 0x0ED6, "Hangul_J_KiyeogSios" },
+ { 0x0EF9, "Hangul_J_KkogjiDalrinIeung" },
+ { 0x0EE3, "Hangul_J_Mieum" },
+ { 0x0ED7, "Hangul_J_Nieun" },
+ { 0x0ED9, "Hangul_J_NieunHieuh" },
+ { 0x0ED8, "Hangul_J_NieunJieuj" },
+ { 0x0EF8, "Hangul_J_PanSios" },
+ { 0x0EED, "Hangul_J_Phieuf" },
+ { 0x0EE4, "Hangul_J_Pieub" },
+ { 0x0EE5, "Hangul_J_PieubSios" },
+ { 0x0EDB, "Hangul_J_Rieul" },
+ { 0x0EE2, "Hangul_J_RieulHieuh" },
+ { 0x0EDC, "Hangul_J_RieulKiyeog" },
+ { 0x0EDD, "Hangul_J_RieulMieum" },
+ { 0x0EE1, "Hangul_J_RieulPhieuf" },
+ { 0x0EDE, "Hangul_J_RieulPieub" },
+ { 0x0EDF, "Hangul_J_RieulSios" },
+ { 0x0EE0, "Hangul_J_RieulTieut" },
+ { 0x0EE6, "Hangul_J_Sios" },
+ { 0x0ED5, "Hangul_J_SsangKiyeog" },
+ { 0x0EE7, "Hangul_J_SsangSios" },
+ { 0x0EEC, "Hangul_J_Tieut" },
+ { 0x0EFA, "Hangul_J_YeorinHieuh" },
+ { 0xFF35, "Hangul_Jamo" },
+ { 0xFF38, "Hangul_Jeonja" },
+ { 0x0EB8, "Hangul_Jieuj" },
+ { 0x0EBB, "Hangul_Khieuq" },
+ { 0x0EA1, "Hangul_Kiyeog" },
+ { 0x0EA3, "Hangul_KiyeogSios" },
+ { 0x0EF3, "Hangul_KkogjiDalrinIeung" },
+ { 0x0EB1, "Hangul_Mieum" },
+ { 0x0EA4, "Hangul_Nieun" },
+ { 0x0EA6, "Hangul_NieunHieuh" },
+ { 0x0EA5, "Hangul_NieunJieuj" },
+ { 0x0EC7, "Hangul_O" },
+ { 0x0ECA, "Hangul_OE" },
+ { 0x0EF2, "Hangul_PanSios" },
+ { 0x0EBD, "Hangul_Phieuf" },
+ { 0x0EB2, "Hangul_Pieub" },
+ { 0x0EB4, "Hangul_PieubSios" },
+ { 0xFF3B, "Hangul_PostHanja" },
+ { 0xFF3A, "Hangul_PreHanja" },
+ { 0x0EA9, "Hangul_Rieul" },
+ { 0x0EB0, "Hangul_RieulHieuh" },
+ { 0x0EAA, "Hangul_RieulKiyeog" },
+ { 0x0EAB, "Hangul_RieulMieum" },
+ { 0x0EAF, "Hangul_RieulPhieuf" },
+ { 0x0EAC, "Hangul_RieulPieub" },
+ { 0x0EAD, "Hangul_RieulSios" },
+ { 0x0EAE, "Hangul_RieulTieut" },
+ { 0x0EEF, "Hangul_RieulYeorinHieuh" },
+ { 0xFF36, "Hangul_Romaja" },
+ { 0x0EB5, "Hangul_Sios" },
+ { 0xFF3F, "Hangul_Special" },
+ { 0x0EA8, "Hangul_SsangDikeud" },
+ { 0x0EB9, "Hangul_SsangJieuj" },
+ { 0x0EA2, "Hangul_SsangKiyeog" },
+ { 0x0EB3, "Hangul_SsangPieub" },
+ { 0x0EB6, "Hangul_SsangSios" },
+ { 0xFF32, "Hangul_Start" },
+ { 0x0EF0, "Hangul_SunkyeongeumMieum" },
+ { 0x0EF4, "Hangul_SunkyeongeumPhieuf" },
+ { 0x0EF1, "Hangul_SunkyeongeumPieub" },
+ { 0x0EBC, "Hangul_Tieut" },
+ { 0x0ECC, "Hangul_U" },
+ { 0x0EC8, "Hangul_WA" },
+ { 0x0EC9, "Hangul_WAE" },
+ { 0x0ECE, "Hangul_WE" },
+ { 0x0ECD, "Hangul_WEO" },
+ { 0x0ECF, "Hangul_WI" },
+ { 0x0EC1, "Hangul_YA" },
+ { 0x0EC2, "Hangul_YAE" },
+ { 0x0EC6, "Hangul_YE" },
+ { 0x0EC5, "Hangul_YEO" },
+ { 0x0ED2, "Hangul_YI" },
+ { 0x0ECB, "Hangul_YO" },
+ { 0x0ED0, "Hangul_YU" },
+ { 0x0EF5, "Hangul_YeorinHieuh" },
+ { 0xFF7E, "Hangul_switch" },
+ { 0xFF29, "Hankaku" },
+ { 0x02A6, "Hcircumflex" },
+ { 0xFF7E, "Hebrew_switch" },
+ { 0xFF6A, "Help" },
+ { 0xFF23, "Henkan" },
+ { 0xFF23, "Henkan_Mode" },
+ { 0xFF25, "Hiragana" },
+ { 0xFF27, "Hiragana_Katakana" },
+ { 0xFF50, "Home" },
+ { 0x02A1, "Hstroke" },
+ { 0xFFED, "Hyper_L" },
+ { 0xFFEE, "Hyper_R" },
+ { 0x0049, "I" },
+ { 0xFE33, "ISO_Center_Object" },
+ { 0xFE30, "ISO_Continuous_Underline" },
+ { 0xFE31, "ISO_Discontinuous_Underline" },
+ { 0xFE32, "ISO_Emphasize" },
+ { 0xFE34, "ISO_Enter" },
+ { 0xFE2F, "ISO_Fast_Cursor_Down" },
+ { 0xFE2C, "ISO_Fast_Cursor_Left" },
+ { 0xFE2D, "ISO_Fast_Cursor_Right" },
+ { 0xFE2E, "ISO_Fast_Cursor_Up" },
+ { 0xFE0C, "ISO_First_Group" },
+ { 0xFE0D, "ISO_First_Group_Lock" },
+ { 0xFE06, "ISO_Group_Latch" },
+ { 0xFE07, "ISO_Group_Lock" },
+ { 0xFF7E, "ISO_Group_Shift" },
+ { 0xFE0E, "ISO_Last_Group" },
+ { 0xFE0F, "ISO_Last_Group_Lock" },
+ { 0xFE20, "ISO_Left_Tab" },
+ { 0xFE02, "ISO_Level2_Latch" },
+ { 0xFE04, "ISO_Level3_Latch" },
+ { 0xFE05, "ISO_Level3_Lock" },
+ { 0xFE03, "ISO_Level3_Shift" },
+ { 0xFE01, "ISO_Lock" },
+ { 0xFE22, "ISO_Move_Line_Down" },
+ { 0xFE21, "ISO_Move_Line_Up" },
+ { 0xFE08, "ISO_Next_Group" },
+ { 0xFE09, "ISO_Next_Group_Lock" },
+ { 0xFE24, "ISO_Partial_Line_Down" },
+ { 0xFE23, "ISO_Partial_Line_Up" },
+ { 0xFE25, "ISO_Partial_Space_Left" },
+ { 0xFE26, "ISO_Partial_Space_Right" },
+ { 0xFE0A, "ISO_Prev_Group" },
+ { 0xFE0B, "ISO_Prev_Group_Lock" },
+ { 0xFE2B, "ISO_Release_Both_Margins" },
+ { 0xFE29, "ISO_Release_Margin_Left" },
+ { 0xFE2A, "ISO_Release_Margin_Right" },
+ { 0xFE27, "ISO_Set_Margin_Left" },
+ { 0xFE28, "ISO_Set_Margin_Right" },
+ { 0x02A9, "Iabovedot" },
+ { 0x00CD, "Iacute" },
+ { 0x00CE, "Icircumflex" },
+ { 0x00CF, "Idiaeresis" },
+ { 0x00CC, "Igrave" },
+ { 0x03CF, "Imacron" },
+ { 0xFF63, "Insert" },
+ { 0x03C7, "Iogonek" },
+ { 0x03A5, "Itilde" },
+ { 0x004A, "J" },
+ { 0x02AC, "Jcircumflex" },
+ { 0x004B, "K" },
+ { 0xFFB0, "KP_0" },
+ { 0xFFB1, "KP_1" },
+ { 0xFFB2, "KP_2" },
+ { 0xFFB3, "KP_3" },
+ { 0xFFB4, "KP_4" },
+ { 0xFFB5, "KP_5" },
+ { 0xFFB6, "KP_6" },
+ { 0xFFB7, "KP_7" },
+ { 0xFFB8, "KP_8" },
+ { 0xFFB9, "KP_9" },
+ { 0xFFAB, "KP_Add" },
+ { 0xFF9D, "KP_Begin" },
+ { 0xFFAE, "KP_Decimal" },
+ { 0xFF9F, "KP_Delete" },
+ { 0xFFAF, "KP_Divide" },
+ { 0xFF99, "KP_Down" },
+ { 0xFF9C, "KP_End" },
+ { 0xFF8D, "KP_Enter" },
+ { 0xFFBD, "KP_Equal" },
+ { 0xFF91, "KP_F1" },
+ { 0xFF92, "KP_F2" },
+ { 0xFF93, "KP_F3" },
+ { 0xFF94, "KP_F4" },
+ { 0xFF95, "KP_Home" },
+ { 0xFF9E, "KP_Insert" },
+ { 0xFF96, "KP_Left" },
+ { 0xFFAA, "KP_Multiply" },
+ { 0xFF9B, "KP_Next" },
+ { 0xFF9B, "KP_Page_Down" },
+ { 0xFF9A, "KP_Page_Up" },
+ { 0xFF9A, "KP_Prior" },
+ { 0xFF98, "KP_Right" },
+ { 0xFFAC, "KP_Separator" },
+ { 0xFF80, "KP_Space" },
+ { 0xFFAD, "KP_Subtract" },
+ { 0xFF89, "KP_Tab" },
+ { 0xFF97, "KP_Up" },
+ { 0xFF2D, "Kana_Lock" },
+ { 0xFF2E, "Kana_Shift" },
+ { 0xFF21, "Kanji" },
+ { 0xFF26, "Katakana" },
+ { 0x03D3, "Kcedilla" },
+ { 0x0EFF, "Korean_Won" },
+ { 0x004C, "L" },
+ { 0x01C5, "Lacute" },
+ { 0xFED4, "Last_Virtual_Screen" },
+ { 0x01A5, "Lcaron" },
+ { 0x03A6, "Lcedilla" },
+ { 0xFF51, "Left" },
+ { 0xFF0A, "Linefeed" },
+ { 0x20A4, "LiraSign" },
+ { 0x01A3, "Lstroke" },
+ { 0x004D, "M" },
+ { 0x06B5, "Macedonia_DSE" },
+ { 0x06B2, "Macedonia_GJE" },
+ { 0x06BC, "Macedonia_KJE" },
+ { 0x06A5, "Macedonia_dse" },
+ { 0x06A2, "Macedonia_gje" },
+ { 0x06AC, "Macedonia_kje" },
+ { 0xFF2C, "Massyo" },
+ { 0xFF67, "Menu" },
+ { 0xFFE7, "Meta_L" },
+ { 0xFFE8, "Meta_R" },
+ { 0x20A5, "MillSign" },
+ { 0xFF7E, "Mode_switch" },
+ { 0xFE77, "MouseKeys_Accel_Enable" },
+ { 0xFE76, "MouseKeys_Enable" },
+ { 0xFF22, "Muhenkan" },
+ { 0xFF20, "Multi_key" },
+ { 0xFF3D, "MultipleCandidate" },
+ { 0x004E, "N" },
+ { 0x01D1, "Nacute" },
+ { 0x20A6, "NairaSign" },
+ { 0x01D2, "Ncaron" },
+ { 0x03D1, "Ncedilla" },
+ { 0x20AA, "NewSheqelSign" },
+ { 0xFF56, "Next" },
+ { 0xFED2, "Next_Virtual_Screen" },
+ { 0x00D1, "Ntilde" },
+ { 0xFF7F, "Num_Lock" },
+ { 0x004F, "O" },
+ { 0x13BC, "OE" },
+ { 0x00D3, "Oacute" },
+ { 0x00D4, "Ocircumflex" },
+ { 0x00D6, "Odiaeresis" },
+ { 0x01D5, "Odoubleacute" },
+ { 0x00D2, "Ograve" },
+ { 0x1EFA, "Ohorn" },
+ { 0x03D2, "Omacron" },
+ { 0x00D8, "Ooblique" },
+ { 0x00D5, "Otilde" },
+ { 0xFE78, "Overlay1_Enable" },
+ { 0xFE79, "Overlay2_Enable" },
+ { 0x0050, "P" },
+ { 0xFF56, "Page_Down" },
+ { 0xFF55, "Page_Up" },
+ { 0xFF13, "Pause" },
+ { 0x20A7, "PesetaSign" },
+ { 0xFEFA, "Pointer_Accelerate" },
+ { 0xFEE9, "Pointer_Button1" },
+ { 0xFEEA, "Pointer_Button2" },
+ { 0xFEEB, "Pointer_Button3" },
+ { 0xFEEC, "Pointer_Button4" },
+ { 0xFEED, "Pointer_Button5" },
+ { 0xFEE8, "Pointer_Button_Dflt" },
+ { 0xFEEF, "Pointer_DblClick1" },
+ { 0xFEF0, "Pointer_DblClick2" },
+ { 0xFEF1, "Pointer_DblClick3" },
+ { 0xFEF2, "Pointer_DblClick4" },
+ { 0xFEF3, "Pointer_DblClick5" },
+ { 0xFEEE, "Pointer_DblClick_Dflt" },
+ { 0xFEFB, "Pointer_DfltBtnNext" },
+ { 0xFEFC, "Pointer_DfltBtnPrev" },
+ { 0xFEE3, "Pointer_Down" },
+ { 0xFEE6, "Pointer_DownLeft" },
+ { 0xFEE7, "Pointer_DownRight" },
+ { 0xFEF5, "Pointer_Drag1" },
+ { 0xFEF6, "Pointer_Drag2" },
+ { 0xFEF7, "Pointer_Drag3" },
+ { 0xFEF8, "Pointer_Drag4" },
+ { 0xFEFD, "Pointer_Drag5" },
+ { 0xFEF4, "Pointer_Drag_Dflt" },
+ { 0xFEF9, "Pointer_EnableKeys" },
+ { 0xFEE0, "Pointer_Left" },
+ { 0xFEE1, "Pointer_Right" },
+ { 0xFEE2, "Pointer_Up" },
+ { 0xFEE4, "Pointer_UpLeft" },
+ { 0xFEE5, "Pointer_UpRight" },
+ { 0xFED1, "Prev_Virtual_Screen" },
+ { 0xFF3E, "PreviousCandidate" },
+ { 0xFF61, "Print" },
+ { 0xFF55, "Prior" },
+ { 0x0051, "Q" },
+ { 0x0052, "R" },
+ { 0x01C0, "Racute" },
+ { 0x01D8, "Rcaron" },
+ { 0x03A3, "Rcedilla" },
+ { 0xFF66, "Redo" },
+ { 0xFE72, "RepeatKeys_Enable" },
+ { 0xFF0D, "Return" },
+ { 0xFF53, "Right" },
+ { 0xFF24, "Romaji" },
+ { 0x20A8, "RupeeSign" },
+ { 0x0053, "S" },
+ { 0x01A6, "Sacute" },
+ { 0x01A9, "Scaron" },
+ { 0x01AA, "Scedilla" },
+ { 0x02DE, "Scircumflex" },
+ { 0xFF14, "Scroll_Lock" },
+ { 0xFF60, "Select" },
+ { 0x06B1, "Serbian_DJE" },
+ { 0x06BF, "Serbian_DZE" },
+ { 0x06B8, "Serbian_JE" },
+ { 0x06B9, "Serbian_LJE" },
+ { 0x06BA, "Serbian_NJE" },
+ { 0x06BB, "Serbian_TSHE" },
+ { 0x06A1, "Serbian_dje" },
+ { 0x06AF, "Serbian_dze" },
+ { 0x06A8, "Serbian_je" },
+ { 0x06A9, "Serbian_lje" },
+ { 0x06AA, "Serbian_nje" },
+ { 0x06AB, "Serbian_tshe" },
+ { 0xFFE1, "Shift_L" },
+ { 0xFFE6, "Shift_Lock" },
+ { 0xFFE2, "Shift_R" },
+ { 0xFF3C, "SingleCandidate" },
+ { 0xFE73, "SlowKeys_Enable" },
+ { 0xFE75, "StickyKeys_Enable" },
+ { 0xFFEB, "Super_L" },
+ { 0xFFEC, "Super_R" },
+ { 0xFF15, "Sys_Req" },
+ { 0x0054, "T" },
+ { 0x00DE, "THORN" },
+ { 0xFF09, "Tab" },
+ { 0x01AB, "Tcaron" },
+ { 0x01DE, "Tcedilla" },
+ { 0xFED5, "Terminate_Server" },
+ { 0x0DDF, "Thai_baht" },
+ { 0x0DBA, "Thai_bobaimai" },
+ { 0x0DA8, "Thai_chochan" },
+ { 0x0DAA, "Thai_chochang" },
+ { 0x0DA9, "Thai_choching" },
+ { 0x0DAC, "Thai_chochoe" },
+ { 0x0DAE, "Thai_dochada" },
+ { 0x0DB4, "Thai_dodek" },
+ { 0x0DBD, "Thai_fofa" },
+ { 0x0DBF, "Thai_fofan" },
+ { 0x0DCB, "Thai_hohip" },
+ { 0x0DCE, "Thai_honokhuk" },
+ { 0x0DA2, "Thai_khokhai" },
+ { 0x0DA5, "Thai_khokhon" },
+ { 0x0DA3, "Thai_khokhuat" },
+ { 0x0DA4, "Thai_khokhwai" },
+ { 0x0DA6, "Thai_khorakhang" },
+ { 0x0DA1, "Thai_kokai" },
+ { 0x0DE5, "Thai_lakkhangyao" },
+ { 0x0DF7, "Thai_lekchet" },
+ { 0x0DF5, "Thai_lekha" },
+ { 0x0DF6, "Thai_lekhok" },
+ { 0x0DF9, "Thai_lekkao" },
+ { 0x0DF1, "Thai_leknung" },
+ { 0x0DF8, "Thai_lekpaet" },
+ { 0x0DF3, "Thai_leksam" },
+ { 0x0DF4, "Thai_leksi" },
+ { 0x0DF2, "Thai_leksong" },
+ { 0x0DF0, "Thai_leksun" },
+ { 0x0DCC, "Thai_lochula" },
+ { 0x0DC5, "Thai_loling" },
+ { 0x0DC6, "Thai_lu" },
+ { 0x0DEB, "Thai_maichattawa" },
+ { 0x0DE8, "Thai_maiek" },
+ { 0x0DD1, "Thai_maihanakat" },
+ { 0x0DDE, "Thai_maihanakat_maitho" },
+ { 0x0DE7, "Thai_maitaikhu" },
+ { 0x0DE9, "Thai_maitho" },
+ { 0x0DEA, "Thai_maitri" },
+ { 0x0DE6, "Thai_maiyamok" },
+ { 0x0DC1, "Thai_moma" },
+ { 0x0DA7, "Thai_ngongu" },
+ { 0x0DED, "Thai_nikhahit" },
+ { 0x0DB3, "Thai_nonen" },
+ { 0x0DB9, "Thai_nonu" },
+ { 0x0DCD, "Thai_oang" },
+ { 0x0DCF, "Thai_paiyannoi" },
+ { 0x0DDA, "Thai_phinthu" },
+ { 0x0DBE, "Thai_phophan" },
+ { 0x0DBC, "Thai_phophung" },
+ { 0x0DC0, "Thai_phosamphao" },
+ { 0x0DBB, "Thai_popla" },
+ { 0x0DC3, "Thai_rorua" },
+ { 0x0DC4, "Thai_ru" },
+ { 0x0DD0, "Thai_saraa" },
+ { 0x0DD2, "Thai_saraaa" },
+ { 0x0DE1, "Thai_saraae" },
+ { 0x0DE4, "Thai_saraaimaimalai" },
+ { 0x0DE3, "Thai_saraaimaimuan" },
+ { 0x0DD3, "Thai_saraam" },
+ { 0x0DE0, "Thai_sarae" },
+ { 0x0DD4, "Thai_sarai" },
+ { 0x0DD5, "Thai_saraii" },
+ { 0x0DE2, "Thai_sarao" },
+ { 0x0DD8, "Thai_sarau" },
+ { 0x0DD6, "Thai_saraue" },
+ { 0x0DD7, "Thai_sarauee" },
+ { 0x0DD9, "Thai_sarauu" },
+ { 0x0DC9, "Thai_sorusi" },
+ { 0x0DC8, "Thai_sosala" },
+ { 0x0DAB, "Thai_soso" },
+ { 0x0DCA, "Thai_sosua" },
+ { 0x0DEC, "Thai_thanthakhat" },
+ { 0x0DB1, "Thai_thonangmontho" },
+ { 0x0DB2, "Thai_thophuthao" },
+ { 0x0DB7, "Thai_thothahan" },
+ { 0x0DB0, "Thai_thothan" },
+ { 0x0DB8, "Thai_thothong" },
+ { 0x0DB6, "Thai_thothung" },
+ { 0x0DAF, "Thai_topatak" },
+ { 0x0DB5, "Thai_totao" },
+ { 0x0DC7, "Thai_wowaen" },
+ { 0x0DC2, "Thai_yoyak" },
+ { 0x0DAD, "Thai_yoying" },
+ { 0x00DE, "Thorn" },
+ { 0xFF2B, "Touroku" },
+ { 0x03AC, "Tslash" },
+ { 0x0055, "U" },
+ { 0x00DA, "Uacute" },
+ { 0x02DD, "Ubreve" },
+ { 0x00DB, "Ucircumflex" },
+ { 0x00DC, "Udiaeresis" },
+ { 0x01DB, "Udoubleacute" },
+ { 0x00D9, "Ugrave" },
+ { 0x1EFC, "Uhorn" },
+ { 0x06B6, "Ukrainian_I" },
+ { 0x06B4, "Ukrainian_IE" },
+ { 0x06B7, "Ukrainian_YI" },
+ { 0x06A6, "Ukrainian_i" },
+ { 0x06A4, "Ukrainian_ie" },
+ { 0x06A7, "Ukrainian_yi" },
+ { 0x06B6, "Ukranian_I" },
+ { 0x06B4, "Ukranian_JE" },
+ { 0x06B7, "Ukranian_YI" },
+ { 0x06A6, "Ukranian_i" },
+ { 0x06A4, "Ukranian_je" },
+ { 0x06A7, "Ukranian_yi" },
+ { 0x03DE, "Umacron" },
+ { 0xFF65, "Undo" },
+ { 0x03D9, "Uogonek" },
+ { 0xFF52, "Up" },
+ { 0x01D9, "Uring" },
+ { 0x03DD, "Utilde" },
+ { 0x0056, "V" },
+ { 0x0057, "W" },
+ { 0x20A9, "WonSign" },
+ { 0x0058, "X" },
+ { 0x0059, "Y" },
+ { 0x00DD, "Yacute" },
+ { 0x13BE, "Ydiaeresis" },
+ { 0x005A, "Z" },
+ { 0x01AF, "Zabovedot" },
+ { 0x01AC, "Zacute" },
+ { 0x01AE, "Zcaron" },
+ { 0xFF28, "Zenkaku" },
+ { 0xFF2A, "Zenkaku_Hankaku" },
+ { 0x0061, "a" },
+ { 0x00E1, "aacute" },
+ { 0x01FF, "abovedot" },
+ { 0x01E3, "abreve" },
+ { 0x00E2, "acircumflex" },
+ { 0x00B4, "acute" },
+ { 0x00E4, "adiaeresis" },
+ { 0x00E6, "ae" },
+ { 0x00E0, "agrave" },
+ { 0x03E0, "amacron" },
+ { 0x0026, "ampersand" },
+ { 0x01B1, "aogonek" },
+ { 0x0027, "apostrophe" },
+ { 0x08C8, "approximate" },
+ { 0x00E5, "aring" },
+ { 0x005E, "asciicircum" },
+ { 0x007E, "asciitilde" },
+ { 0x002A, "asterisk" },
+ { 0x0040, "at" },
+ { 0x00E3, "atilde" },
+ { 0x0062, "b" },
+ { 0x005C, "backslash" },
+ { 0x0AF4, "ballotcross" },
+ { 0x007C, "bar" },
+ { 0x09DF, "blank" },
+ { 0x08A5, "botintegral" },
+ { 0x08AC, "botleftparens" },
+ { 0x08A8, "botleftsqbracket" },
+ { 0x08B2, "botleftsummation" },
+ { 0x08AE, "botrightparens" },
+ { 0x08AA, "botrightsqbracket" },
+ { 0x08B6, "botrightsummation" },
+ { 0x09F6, "bott" },
+ { 0x08B4, "botvertsummationconnector" },
+ { 0x007B, "braceleft" },
+ { 0x007D, "braceright" },
+ { 0x005B, "bracketleft" },
+ { 0x005D, "bracketright" },
+ { 0x01A2, "breve" },
+ { 0x00A6, "brokenbar" },
+ { 0x0063, "c" },
+ { 0x02E5, "cabovedot" },
+ { 0x01E6, "cacute" },
+ { 0x0AB8, "careof" },
+ { 0x0AFC, "caret" },
+ { 0x01B7, "caron" },
+ { 0x01E8, "ccaron" },
+ { 0x00E7, "ccedilla" },
+ { 0x02E6, "ccircumflex" },
+ { 0x00B8, "cedilla" },
+ { 0x00A2, "cent" },
+ { 0x09E1, "checkerboard" },
+ { 0x0AF3, "checkmark" },
+ { 0x0BCF, "circle" },
+ { 0x0AEC, "club" },
+ { 0x003A, "colon" },
+ { 0x1EF3, "combining_acute" },
+ { 0x1EFF, "combining_belowdot" },
+ { 0x1EF2, "combining_grave" },
+ { 0x1EFE, "combining_hook" },
+ { 0x1E9F, "combining_tilde" },
+ { 0x002C, "comma" },
+ { 0x00A9, "copyright" },
+ { 0x09E4, "cr" },
+ { 0x09EE, "crossinglines" },
+ { 0x00A4, "currency" },
+ { 0x0AFF, "cursor" },
+ { 0x0064, "d" },
+ { 0x0AF1, "dagger" },
+ { 0x01EF, "dcaron" },
+ { 0xFE56, "dead_abovedot" },
+ { 0xFE58, "dead_abovering" },
+ { 0xFE51, "dead_acute" },
+ { 0xFE60, "dead_belowdot" },
+ { 0xFE55, "dead_breve" },
+ { 0xFE5A, "dead_caron" },
+ { 0xFE5B, "dead_cedilla" },
+ { 0xFE52, "dead_circumflex" },
+ { 0xFE57, "dead_diaeresis" },
+ { 0xFE59, "dead_doubleacute" },
+ { 0xFE50, "dead_grave" },
+ { 0xFE61, "dead_hook" },
+ { 0xFE62, "dead_horn" },
+ { 0xFE5D, "dead_iota" },
+ { 0xFE54, "dead_macron" },
+ { 0xFE5C, "dead_ogonek" },
+ { 0xFE5F, "dead_semivoiced_sound" },
+ { 0xFE53, "dead_tilde" },
+ { 0xFE5E, "dead_voiced_sound" },
+ { 0x0ABD, "decimalpoint" },
+ { 0x00B0, "degree" },
+ { 0x00A8, "diaeresis" },
+ { 0x0AED, "diamond" },
+ { 0x0AA5, "digitspace" },
+ { 0x00F7, "division" },
+ { 0x0024, "dollar" },
+ { 0x0AAF, "doubbaselinedot" },
+ { 0x01BD, "doubleacute" },
+ { 0x0AF2, "doubledagger" },
+ { 0x0AFE, "doublelowquotemark" },
+ { 0x08FE, "downarrow" },
+ { 0x0BA8, "downcaret" },
+ { 0x0BD6, "downshoe" },
+ { 0x0BC4, "downstile" },
+ { 0x0BC2, "downtack" },
+ { 0x01F0, "dstroke" },
+ { 0x0065, "e" },
+ { 0x03EC, "eabovedot" },
+ { 0x00E9, "eacute" },
+ { 0x01EC, "ecaron" },
+ { 0x00EA, "ecircumflex" },
+ { 0x00EB, "ediaeresis" },
+ { 0x00E8, "egrave" },
+ { 0x0AAE, "ellipsis" },
+ { 0x0AA3, "em3space" },
+ { 0x0AA4, "em4space" },
+ { 0x03BA, "emacron" },
+ { 0x0AA9, "emdash" },
+ { 0x0ADE, "emfilledcircle" },
+ { 0x0ADF, "emfilledrect" },
+ { 0x0ACE, "emopencircle" },
+ { 0x0ACF, "emopenrectangle" },
+ { 0x0AA1, "emspace" },
+ { 0x0AAA, "endash" },
+ { 0x0AE6, "enfilledcircbullet" },
+ { 0x0AE7, "enfilledsqbullet" },
+ { 0x03BF, "eng" },
+ { 0x0AE0, "enopencircbullet" },
+ { 0x0AE1, "enopensquarebullet" },
+ { 0x0AA2, "enspace" },
+ { 0x01EA, "eogonek" },
+ { 0x003D, "equal" },
+ { 0x00F0, "eth" },
+ { 0x0021, "exclam" },
+ { 0x00A1, "exclamdown" },
+ { 0x0066, "f" },
+ { 0x0AF8, "femalesymbol" },
+ { 0x09E3, "ff" },
+ { 0x0ABB, "figdash" },
+ { 0x0ADC, "filledlefttribullet" },
+ { 0x0ADB, "filledrectbullet" },
+ { 0x0ADD, "filledrighttribullet" },
+ { 0x0AE9, "filledtribulletdown" },
+ { 0x0AE8, "filledtribulletup" },
+ { 0x0AC5, "fiveeighths" },
+ { 0x0AB7, "fivesixths" },
+ { 0x0AB5, "fourfifths" },
+ { 0x08F6, "function" },
+ { 0x0067, "g" },
+ { 0x02F5, "gabovedot" },
+ { 0x02BB, "gbreve" },
+ { 0x03BB, "gcedilla" },
+ { 0x02F8, "gcircumflex" },
+ { 0x0060, "grave" },
+ { 0x003E, "greater" },
+ { 0x08BE, "greaterthanequal" },
+ { 0x00AB, "guillemotleft" },
+ { 0x00BB, "guillemotright" },
+ { 0x0068, "h" },
+ { 0x0AA8, "hairspace" },
+ { 0x02B6, "hcircumflex" },
+ { 0x0AEE, "heart" },
+ { 0x0CE0, "hebrew_aleph" },
+ { 0x0CF2, "hebrew_ayin" },
+ { 0x0CE1, "hebrew_bet" },
+ { 0x0CE1, "hebrew_beth" },
+ { 0x0CE7, "hebrew_chet" },
+ { 0x0CE3, "hebrew_dalet" },
+ { 0x0CE3, "hebrew_daleth" },
+ { 0x0CDF, "hebrew_doublelowline" },
+ { 0x0CEA, "hebrew_finalkaph" },
+ { 0x0CED, "hebrew_finalmem" },
+ { 0x0CEF, "hebrew_finalnun" },
+ { 0x0CF3, "hebrew_finalpe" },
+ { 0x0CF5, "hebrew_finalzade" },
+ { 0x0CF5, "hebrew_finalzadi" },
+ { 0x0CE2, "hebrew_gimel" },
+ { 0x0CE2, "hebrew_gimmel" },
+ { 0x0CE4, "hebrew_he" },
+ { 0x0CE7, "hebrew_het" },
+ { 0x0CEB, "hebrew_kaph" },
+ { 0x0CF7, "hebrew_kuf" },
+ { 0x0CEC, "hebrew_lamed" },
+ { 0x0CEE, "hebrew_mem" },
+ { 0x0CF0, "hebrew_nun" },
+ { 0x0CF4, "hebrew_pe" },
+ { 0x0CF7, "hebrew_qoph" },
+ { 0x0CF8, "hebrew_resh" },
+ { 0x0CF1, "hebrew_samech" },
+ { 0x0CF1, "hebrew_samekh" },
+ { 0x0CF9, "hebrew_shin" },
+ { 0x0CFA, "hebrew_taf" },
+ { 0x0CFA, "hebrew_taw" },
+ { 0x0CE8, "hebrew_tet" },
+ { 0x0CE8, "hebrew_teth" },
+ { 0x0CE5, "hebrew_waw" },
+ { 0x0CE9, "hebrew_yod" },
+ { 0x0CF6, "hebrew_zade" },
+ { 0x0CF6, "hebrew_zadi" },
+ { 0x0CE6, "hebrew_zain" },
+ { 0x0CE6, "hebrew_zayin" },
+ { 0x0ADA, "hexagram" },
+ { 0x08A3, "horizconnector" },
+ { 0x09EF, "horizlinescan1" },
+ { 0x09F0, "horizlinescan3" },
+ { 0x09F1, "horizlinescan5" },
+ { 0x09F2, "horizlinescan7" },
+ { 0x09F3, "horizlinescan9" },
+ { 0x02B1, "hstroke" },
+ { 0x09E2, "ht" },
+ { 0x00AD, "hyphen" },
+ { 0x0069, "i" },
+ { 0x00ED, "iacute" },
+ { 0x00EE, "icircumflex" },
+ { 0x08CF, "identical" },
+ { 0x00EF, "idiaeresis" },
+ { 0x02B9, "idotless" },
+ { 0x08CD, "ifonlyif" },
+ { 0x00EC, "igrave" },
+ { 0x03EF, "imacron" },
+ { 0x08CE, "implies" },
+ { 0x08DA, "includedin" },
+ { 0x08DB, "includes" },
+ { 0x08C2, "infinity" },
+ { 0x08BF, "integral" },
+ { 0x08DC, "intersection" },
+ { 0x03E7, "iogonek" },
+ { 0x03B5, "itilde" },
+ { 0x006A, "j" },
+ { 0x02BC, "jcircumflex" },
+ { 0x0BCA, "jot" },
+ { 0x006B, "k" },
+ { 0x04B1, "kana_A" },
+ { 0x04C1, "kana_CHI" },
+ { 0x04B4, "kana_E" },
+ { 0x04CC, "kana_FU" },
+ { 0x04CA, "kana_HA" },
+ { 0x04CD, "kana_HE" },
+ { 0x04CB, "kana_HI" },
+ { 0x04CE, "kana_HO" },
+ { 0x04CC, "kana_HU" },
+ { 0x04B2, "kana_I" },
+ { 0x04B6, "kana_KA" },
+ { 0x04B9, "kana_KE" },
+ { 0x04B7, "kana_KI" },
+ { 0x04BA, "kana_KO" },
+ { 0x04B8, "kana_KU" },
+ { 0x04CF, "kana_MA" },
+ { 0x04D2, "kana_ME" },
+ { 0x04D0, "kana_MI" },
+ { 0x04D3, "kana_MO" },
+ { 0x04D1, "kana_MU" },
+ { 0x04DD, "kana_N" },
+ { 0x04C5, "kana_NA" },
+ { 0x04C8, "kana_NE" },
+ { 0x04C6, "kana_NI" },
+ { 0x04C9, "kana_NO" },
+ { 0x04C7, "kana_NU" },
+ { 0x04B5, "kana_O" },
+ { 0x04D7, "kana_RA" },
+ { 0x04DA, "kana_RE" },
+ { 0x04D8, "kana_RI" },
+ { 0x04DB, "kana_RO" },
+ { 0x04D9, "kana_RU" },
+ { 0x04BB, "kana_SA" },
+ { 0x04BE, "kana_SE" },
+ { 0x04BC, "kana_SHI" },
+ { 0x04BF, "kana_SO" },
+ { 0x04BD, "kana_SU" },
+ { 0x04C0, "kana_TA" },
+ { 0x04C3, "kana_TE" },
+ { 0x04C1, "kana_TI" },
+ { 0x04C4, "kana_TO" },
+ { 0x04C2, "kana_TSU" },
+ { 0x04C2, "kana_TU" },
+ { 0x04B3, "kana_U" },
+ { 0x04DC, "kana_WA" },
+ { 0x04A6, "kana_WO" },
+ { 0x04D4, "kana_YA" },
+ { 0x04D6, "kana_YO" },
+ { 0x04D5, "kana_YU" },
+ { 0x04A7, "kana_a" },
+ { 0x04A3, "kana_closingbracket" },
+ { 0x04A4, "kana_comma" },
+ { 0x04A5, "kana_conjunctive" },
+ { 0x04AA, "kana_e" },
+ { 0x04A1, "kana_fullstop" },
+ { 0x04A8, "kana_i" },
+ { 0x04A5, "kana_middledot" },
+ { 0x04AB, "kana_o" },
+ { 0x04A2, "kana_openingbracket" },
+ { 0xFF7E, "kana_switch" },
+ { 0x04AF, "kana_tsu" },
+ { 0x04AF, "kana_tu" },
+ { 0x04A9, "kana_u" },
+ { 0x04AC, "kana_ya" },
+ { 0x04AE, "kana_yo" },
+ { 0x04AD, "kana_yu" },
+ { 0x03A2, "kappa" },
+ { 0x03F3, "kcedilla" },
+ { 0x03A2, "kra" },
+ { 0x006C, "l" },
+ { 0x01E5, "lacute" },
+ { 0x0AD9, "latincross" },
+ { 0x01B5, "lcaron" },
+ { 0x03B6, "lcedilla" },
+ { 0x0ABC, "leftanglebracket" },
+ { 0x08FB, "leftarrow" },
+ { 0x0BA3, "leftcaret" },
+ { 0x0AD2, "leftdoublequotemark" },
+ { 0x08AF, "leftmiddlecurlybrace" },
+ { 0x0ACC, "leftopentriangle" },
+ { 0x0AEA, "leftpointer" },
+ { 0x08A1, "leftradical" },
+ { 0x0BDA, "leftshoe" },
+ { 0x0AD0, "leftsinglequotemark" },
+ { 0x09F4, "leftt" },
+ { 0x0BDC, "lefttack" },
+ { 0x003C, "less" },
+ { 0x08BC, "lessthanequal" },
+ { 0x09E5, "lf" },
+ { 0x08DE, "logicaland" },
+ { 0x08DF, "logicalor" },
+ { 0x09ED, "lowleftcorner" },
+ { 0x09EA, "lowrightcorner" },
+ { 0x01B3, "lstroke" },
+ { 0x006D, "m" },
+ { 0x00AF, "macron" },
+ { 0x0AF7, "malesymbol" },
+ { 0x0AF0, "maltesecross" },
+ { 0x0ABF, "marker" },
+ { 0x00BA, "masculine" },
+ { 0x002D, "minus" },
+ { 0x0AD6, "minutes" },
+ { 0x00B5, "mu" },
+ { 0x00D7, "multiply" },
+ { 0x0AF6, "musicalflat" },
+ { 0x0AF5, "musicalsharp" },
+ { 0x006E, "n" },
+ { 0x08C5, "nabla" },
+ { 0x01F1, "nacute" },
+ { 0x01F2, "ncaron" },
+ { 0x03F1, "ncedilla" },
+ { 0x09E8, "nl" },
+ { 0x00A0, "nobreakspace" },
+ { 0x08BD, "notequal" },
+ { 0x00AC, "notsign" },
+ { 0x00F1, "ntilde" },
+ { 0x0023, "numbersign" },
+ { 0x06B0, "numerosign" },
+ { 0x006F, "o" },
+ { 0x00F3, "oacute" },
+ { 0x00F4, "ocircumflex" },
+ { 0x00F6, "odiaeresis" },
+ { 0x01F5, "odoubleacute" },
+ { 0x13BD, "oe" },
+ { 0x01B2, "ogonek" },
+ { 0x00F2, "ograve" },
+ { 0x1EFB, "ohorn" },
+ { 0x03F2, "omacron" },
+ { 0x0AC3, "oneeighth" },
+ { 0x0AB2, "onefifth" },
+ { 0x00BD, "onehalf" },
+ { 0x00BC, "onequarter" },
+ { 0x0AB6, "onesixth" },
+ { 0x00B9, "onesuperior" },
+ { 0x0AB0, "onethird" },
+ { 0x0AE2, "openrectbullet" },
+ { 0x0AE5, "openstar" },
+ { 0x0AE4, "opentribulletdown" },
+ { 0x0AE3, "opentribulletup" },
+ { 0x00AA, "ordfeminine" },
+ { 0x00F8, "oslash" },
+ { 0x00F5, "otilde" },
+ { 0x0BC0, "overbar" },
+ { 0x047E, "overline" },
+ { 0x0070, "p" },
+ { 0x00B6, "paragraph" },
+ { 0x0028, "parenleft" },
+ { 0x0029, "parenright" },
+ { 0x08EF, "partialderivative" },
+ { 0x0025, "percent" },
+ { 0x002E, "period" },
+ { 0x00B7, "periodcentered" },
+ { 0x0AFB, "phonographcopyright" },
+ { 0x002B, "plus" },
+ { 0x00B1, "plusminus" },
+ { 0x0AD4, "prescription" },
+ { 0x04B0, "prolongedsound" },
+ { 0x0AA6, "punctspace" },
+ { 0x0071, "q" },
+ { 0x0BCC, "quad" },
+ { 0x003F, "question" },
+ { 0x00BF, "questiondown" },
+ { 0x0022, "quotedbl" },
+ { 0x0060, "quoteleft" },
+ { 0x0027, "quoteright" },
+ { 0x0072, "r" },
+ { 0x01E0, "racute" },
+ { 0x08D6, "radical" },
+ { 0x01F8, "rcaron" },
+ { 0x03B3, "rcedilla" },
+ { 0x00AE, "registered" },
+ { 0x0ABE, "rightanglebracket" },
+ { 0x08FD, "rightarrow" },
+ { 0x0BA6, "rightcaret" },
+ { 0x0AD3, "rightdoublequotemark" },
+ { 0x08B0, "rightmiddlecurlybrace" },
+ { 0x08B7, "rightmiddlesummation" },
+ { 0x0ACD, "rightopentriangle" },
+ { 0x0AEB, "rightpointer" },
+ { 0x0BD8, "rightshoe" },
+ { 0x0AD1, "rightsinglequotemark" },
+ { 0x09F5, "rightt" },
+ { 0x0BFC, "righttack" },
+ { 0x0073, "s" },
+ { 0x01B6, "sacute" },
+ { 0x01B9, "scaron" },
+ { 0x01BA, "scedilla" },
+ { 0x02FE, "scircumflex" },
+ { 0xFF7E, "script_switch" },
+ { 0x0AD7, "seconds" },
+ { 0x00A7, "section" },
+ { 0x003B, "semicolon" },
+ { 0x04DF, "semivoicedsound" },
+ { 0x0AC6, "seveneighths" },
+ { 0x0ACA, "signaturemark" },
+ { 0x0AAC, "signifblank" },
+ { 0x08C9, "similarequal" },
+ { 0x0AFD, "singlelowquotemark" },
+ { 0x002F, "slash" },
+ { 0x09E0, "soliddiamond" },
+ { 0x0020, "space" },
+ { 0x00DF, "ssharp" },
+ { 0x00A3, "sterling" },
+ { 0x0074, "t" },
+ { 0x01BB, "tcaron" },
+ { 0x01FE, "tcedilla" },
+ { 0x0AF9, "telephone" },
+ { 0x0AFA, "telephonerecorder" },
+ { 0x08C0, "therefore" },
+ { 0x0AA7, "thinspace" },
+ { 0x00FE, "thorn" },
+ { 0x0AC4, "threeeighths" },
+ { 0x0AB4, "threefifths" },
+ { 0x00BE, "threequarters" },
+ { 0x00B3, "threesuperior" },
+ { 0x08A4, "topintegral" },
+ { 0x08AB, "topleftparens" },
+ { 0x08A2, "topleftradical" },
+ { 0x08A7, "topleftsqbracket" },
+ { 0x08B1, "topleftsummation" },
+ { 0x08AD, "toprightparens" },
+ { 0x08A9, "toprightsqbracket" },
+ { 0x08B5, "toprightsummation" },
+ { 0x09F7, "topt" },
+ { 0x08B3, "topvertsummationconnector" },
+ { 0x0AC9, "trademark" },
+ { 0x0ACB, "trademarkincircle" },
+ { 0x03BC, "tslash" },
+ { 0x0AB3, "twofifths" },
+ { 0x00B2, "twosuperior" },
+ { 0x0AB1, "twothirds" },
+ { 0x0075, "u" },
+ { 0x00FA, "uacute" },
+ { 0x02FD, "ubreve" },
+ { 0x00FB, "ucircumflex" },
+ { 0x00FC, "udiaeresis" },
+ { 0x01FB, "udoubleacute" },
+ { 0x00F9, "ugrave" },
+ { 0x1EFD, "uhorn" },
+ { 0x03FE, "umacron" },
+ { 0x0BC6, "underbar" },
+ { 0x005F, "underscore" },
+ { 0x08DD, "union" },
+ { 0x03F9, "uogonek" },
+ { 0x08FC, "uparrow" },
+ { 0x0BA9, "upcaret" },
+ { 0x09EC, "upleftcorner" },
+ { 0x09EB, "uprightcorner" },
+ { 0x0BC3, "upshoe" },
+ { 0x0BD3, "upstile" },
+ { 0x0BCE, "uptack" },
+ { 0x01F9, "uring" },
+ { 0x03FD, "utilde" },
+ { 0x0076, "v" },
+ { 0x08C1, "variation" },
+ { 0x09F8, "vertbar" },
+ { 0x08A6, "vertconnector" },
+ { 0x04DE, "voicedsound" },
+ { 0x09E9, "vt" },
+ { 0x0077, "w" },
+ { 0x0078, "x" },
+ { 0x0079, "y" },
+ { 0x00FD, "yacute" },
+ { 0x00FF, "ydiaeresis" },
+ { 0x00A5, "yen" },
+ { 0x007A, "z" },
+ { 0x01BF, "zabovedot" },
+ { 0x01BC, "zacute" },
+ { 0x01BE, "zcaron" }
+};
+
+static __KeyName __scim_key_mask_names [] =
+{
+ {SCIM_KEY_ShiftMask, "Shift"},
+ {SCIM_KEY_CapsLockMask, "CapsLock"},
+ {SCIM_KEY_ControlMask, "Control"},
+ {SCIM_KEY_AltMask, "Alt"},
+ {SCIM_KEY_MetaMask, "Meta"},
+ {SCIM_KEY_SuperMask, "Super"},
+ {SCIM_KEY_HyperMask, "Hyper"},
+ {SCIM_KEY_NumLockMask, "NumLock"},
+ {SCIM_KEY_QuirkKanaRoMask, "QuirkKanaRo"},
+ {SCIM_KEY_ReleaseMask, "KeyRelease"}
+};
+
+#define SCIM_NUM_KEY_UNICODES (sizeof (__scim_key_to_unicode_tab) / sizeof (__scim_key_to_unicode_tab[0]))
+
+#define SCIM_NUM_KEY_NAMES (sizeof (__scim_keys_by_code) / sizeof (__scim_keys_by_code [0]))
+
+#define SCIM_NUM_KEY_MASKS (sizeof (__scim_key_mask_names) / sizeof (__scim_key_mask_names[0]))
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_launcher.cpp,v 1.9 2005/06/15 00:19:08 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_FRONTEND_MODULE
+#define Uses_SCIM_IMENGINE_MODULE
+#define Uses_SCIM_BACKEND
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_SCIM_CONFIG
+#define Uses_C_LOCALE
+#define Uses_SCIM_UTILITY
+#include "scim_private.h"
+#include "scim.h"
+#include <sys/types.h>
+#include <sys/times.h>
+#include <unistd.h>
+#include <signal.h>
+
+using namespace scim;
+
+static FrontEndModule *frontend_module = 0;
+static ConfigModule *config_module = 0;
+static ConfigPointer config;
+
+void signalhandler (int sig)
+{
+ if (!config.null ())
+ {
+ config->flush ();
+ config.reset ();
+ }
+
+ if (frontend_module)
+ {
+ delete frontend_module;
+ frontend_module = 0;
+ }
+
+ if (config_module)
+ {
+ delete config_module;
+ config_module = 0;
+ }
+
+ std::cerr << "Successfully exited.\n";
+
+ exit (0);
+}
+
+int main (int argc, char *argv [])
+{
+ struct tms tiks_buf;
+ clock_t clock_start = times (&tiks_buf);
+
+ BackEndPointer backend;
+
+ std::vector<String> engine_list;
+
+ String config_name ("simple");
+ String frontend_name ("socket");
+
+ int new_argc = 0;
+ char *new_argv [40];
+
+ int i = 0;
+ bool daemon = false;
+
+ new_argv [new_argc ++] = argv [0];
+
+ while (i < argc) {
+ if (++i >= argc) break;
+
+ if (String ("-f") == argv [i] ||
+ String ("--frontend") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "No argument for option " << argv [i-1] << "\n";
+ return -1;
+ }
+ frontend_name = argv [i];
+ continue;
+ }
+
+ if (String ("-c") == argv [i] ||
+ String ("--config") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "No argument for option " << argv [i-1] << "\n";
+ return -1;
+ }
+ config_name = argv [i];
+ continue;
+ }
+
+ if (String ("-d") == argv [i] ||
+ String ("--daemon") == argv [i]) {
+ daemon = true;
+ continue;
+ }
+
+ if (String ("-e") == argv [i] ||
+ String ("--engines") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "No argument for option " << argv [i-1] << "\n";
+ return -1;
+ }
+ if (String (argv [i]) == "all") {
+ scim_get_imengine_module_list (engine_list);
+ for (size_t j = 0; j < engine_list.size (); ++j) {
+ if (engine_list [j] == "socket") {
+ engine_list.erase (engine_list.begin () + j);
+ break;
+ }
+ }
+ } else if (String (argv [i]) != "none") {
+ scim_split_string_list (engine_list, String (argv [i]), ',');
+ }
+ new_argv [new_argc ++] = const_cast <char *> ("-e");
+ new_argv [new_argc ++] = argv [i];
+ continue;
+ }
+
+ if (String ("-v") == argv [i] ||
+ String ("--verbose") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "No argument for option " << argv [i-1] << "\n";
+ return -1;
+ }
+ DebugOutput::set_verbose_level (atoi (argv [i]));
+ continue;
+ }
+
+ if (String ("-m") == argv [i] ||
+ String ("--mask") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "No argument for option " << argv [i-1] << "\n";
+ return -1;
+ }
+ if (String (argv [i]) != "none") {
+ std::vector<String> debug_mask_list;
+ scim_split_string_list (debug_mask_list, argv [i], ',');
+ DebugOutput::disable_debug (SCIM_DEBUG_AllMask);
+ for (size_t j=0; j<debug_mask_list.size (); j++)
+ DebugOutput::enable_debug_by_name (debug_mask_list [j]);
+ }
+ continue;
+ }
+
+ if (String ("-o") == argv [i] ||
+ String ("--output") == argv [i]) {
+ if (++i >= argc) {
+ std::cerr << "No argument for option " << argv [i-1] << "\n";
+ return -1;
+ }
+ DebugOutput::set_output (String (argv [i]));
+ continue;
+ }
+
+ if (String ("--") == argv [i])
+ break;
+
+ new_argv [new_argc ++] = argv [i];
+ } /* End of command line parsing. */
+
+ /* Construct new argv array for FrontEnd. */
+ new_argv [new_argc ++] = const_cast <char *> ("-c");
+ new_argv [new_argc ++] = const_cast <char *> (config_name.c_str ());
+
+ /* Store the rest argvs into new_argv. */
+ for (++i; i < argc && new_argc < 39; ++i) {
+ new_argv [new_argc ++] = argv [i];
+ }
+
+ new_argv [new_argc] = 0;
+
+ try {
+ /* Try to load config module */
+ if (config_name != "dummy") {
+ /* load config module */
+ config_module = new ConfigModule (config_name);
+
+ if (!config_module->valid ()) {
+ std::cerr << "Can not load " << config_name << " Config module. Using dummy module instead.\n";
+ delete config_module;
+ config_module = 0;
+ }
+ }
+
+ if (config_module) {
+ config = config_module->create_config ();
+ } else {
+ config = new DummyConfig ();
+ }
+
+ if (config.null ()) {
+ std::cerr << "Can not create Config Object!\n";
+ return 1;
+ }
+ gettime (clock_start, "Create Config");
+
+ /* create backend */
+ backend = new CommonBackEnd (config, engine_list);
+ gettime (clock_start, "Create backend");
+
+ /* load FrontEnd module */
+ frontend_module = new FrontEndModule (frontend_name, backend, config, new_argc, new_argv);
+ gettime (clock_start, "Create frontend");
+
+ if (!frontend_module || !frontend_module->valid ()) {
+ std::cerr << "Failed to load " << frontend_name << " FrontEnd module.\n";
+ return 1;
+ }
+
+ signal (SIGQUIT, signalhandler);
+ signal (SIGTERM, signalhandler);
+ signal (SIGINT, signalhandler);
+ signal (SIGHUP, signalhandler);
+
+ if (daemon) {
+ gettime (clock_start, "Starting as daemon ...");
+ scim_daemon ();
+ } else {
+ std::cerr << "Starting ...\n";
+ }
+
+ backend->initialize (config, engine_list, true, true);
+ gettime (clock_start, "backend->initialize");
+
+ /* reset backend pointer, in order to destroy backend automatically. */
+ backend.reset ();
+
+ frontend_module->run ();
+ } catch (const std::exception & err) {
+ std::cerr << err.what () << "\n";
+ return 1;
+ }
+
+ return 0;
+}
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_lookup_table.cpp,v 1.32 2005/05/13 04:21:29 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_LOOKUP_TABLE
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+struct LookupTable::LookupTableImpl
+{
+ std::vector<int> m_page_history;
+ int m_page_size;
+ int m_current_page_start;
+ int m_cursor_pos;
+ bool m_cursor_visible;
+ bool m_page_size_fixed;
+
+ std::vector<WideString> m_candidate_labels;
+
+ LookupTableImpl (int page_size)
+ : m_page_size (page_size),
+ m_current_page_start (0),
+ m_cursor_pos (0),
+ m_cursor_visible (false),
+ m_page_size_fixed (false) {
+ if (m_page_size <= 0 || m_page_size > SCIM_LOOKUP_TABLE_MAX_PAGESIZE)
+ m_page_size = SCIM_LOOKUP_TABLE_MAX_PAGESIZE;
+ }
+};
+
+
+//implementation of class LookupTable
+LookupTable::LookupTable (int page_size)
+ : m_impl (new LookupTableImpl (page_size))
+{
+}
+
+LookupTable::~LookupTable ()
+{
+ delete m_impl;
+}
+
+void
+LookupTable::set_candidate_labels (const std::vector<WideString> &labels)
+{
+ if (labels.size ())
+ m_impl->m_candidate_labels = labels;
+}
+
+void
+LookupTable::set_page_size (int page_size)
+{
+ if (page_size > 0 && page_size <= SCIM_LOOKUP_TABLE_MAX_PAGESIZE) {
+ m_impl->m_page_size = page_size;
+ if (m_impl->m_cursor_pos >= m_impl->m_current_page_start + get_current_page_size ())
+ m_impl->m_cursor_pos = m_impl->m_current_page_start + get_current_page_size () - 1;
+ if (m_impl->m_cursor_pos < 0)
+ m_impl->m_cursor_pos = 0;
+ }
+}
+
+int
+LookupTable::get_page_size () const
+{
+ return m_impl->m_page_size;
+}
+
+int
+LookupTable::get_current_page_start () const
+{
+ return m_impl->m_current_page_start;
+}
+
+int
+LookupTable::get_cursor_pos() const
+{
+ return m_impl->m_cursor_pos;
+}
+
+int
+LookupTable::get_cursor_pos_in_current_page () const
+{
+ return m_impl->m_cursor_pos - m_impl->m_current_page_start;
+}
+
+int
+LookupTable::get_current_page_size () const
+{
+ return std::min ((uint32) m_impl->m_page_size, (uint32)(number_of_candidates () - m_impl->m_current_page_start));
+}
+
+bool
+LookupTable::page_up ()
+{
+ if (m_impl->m_current_page_start <= 0)
+ return false;
+
+ if (m_impl->m_page_history.size ()) {
+ m_impl->m_page_size = m_impl->m_page_history.back ();
+ m_impl->m_page_history.pop_back ();
+ }
+
+ if (m_impl->m_current_page_start >= m_impl->m_page_size)
+ m_impl->m_current_page_start -= m_impl->m_page_size;
+ else
+ m_impl->m_current_page_start = 0;
+
+ if (m_impl->m_cursor_pos >= m_impl->m_page_size)
+ m_impl->m_cursor_pos -= m_impl->m_page_size;
+ else
+ m_impl->m_cursor_pos = 0;
+
+ if (m_impl->m_cursor_pos < m_impl->m_current_page_start)
+ m_impl->m_cursor_pos = m_impl->m_current_page_start;
+ else if (m_impl->m_cursor_pos >= m_impl->m_current_page_start + get_current_page_size ())
+ m_impl->m_cursor_pos = m_impl->m_current_page_start + get_current_page_size () - 1;
+
+ return true;
+}
+
+bool
+LookupTable::page_down ()
+{
+ if (((uint32)m_impl->m_current_page_start + m_impl->m_page_size) >= number_of_candidates ())
+ return false;
+
+ m_impl->m_current_page_start += m_impl->m_page_size;
+ m_impl->m_page_history.push_back (m_impl->m_page_size);
+
+ m_impl->m_cursor_pos += m_impl->m_page_size;
+
+ if (m_impl->m_cursor_pos < m_impl->m_current_page_start)
+ m_impl->m_cursor_pos = m_impl->m_current_page_start;
+ else if (m_impl->m_cursor_pos >= m_impl->m_current_page_start + get_current_page_size ())
+ m_impl->m_cursor_pos = m_impl->m_current_page_start + get_current_page_size () - 1;
+
+ return true;
+}
+
+bool
+LookupTable::cursor_up ()
+{
+ if (m_impl->m_cursor_pos <= 0) return false;
+
+ if (!m_impl->m_cursor_visible)
+ m_impl->m_cursor_visible = true;
+
+ m_impl->m_cursor_pos --;
+
+ if (m_impl->m_cursor_pos < m_impl->m_current_page_start) {
+ page_up ();
+ m_impl->m_cursor_pos = m_impl->m_current_page_start + get_current_page_size () - 1;
+ }
+ return true;
+}
+
+bool
+LookupTable::cursor_down ()
+{
+ if (((uint32)m_impl->m_cursor_pos + 1) >= number_of_candidates ())
+ return false;
+
+ if (!m_impl->m_cursor_visible)
+ m_impl->m_cursor_visible = true;
+
+ ++m_impl->m_cursor_pos;
+
+ if (m_impl->m_cursor_pos >= m_impl->m_current_page_start + get_current_page_size ()) {
+ page_down ();
+ m_impl->m_cursor_pos = m_impl->m_current_page_start;
+ }
+ return true;
+}
+
+void
+LookupTable::show_cursor (bool show)
+{
+ m_impl->m_cursor_visible = show;
+}
+
+bool
+LookupTable::is_cursor_visible () const
+{
+ return m_impl->m_cursor_visible;
+}
+
+void
+LookupTable::fix_page_size (bool fixed)
+{
+ m_impl->m_page_size_fixed = fixed;
+}
+
+bool
+LookupTable::is_page_size_fixed () const
+{
+ return m_impl->m_page_size_fixed;
+}
+
+void
+LookupTable::set_cursor_pos (int pos)
+{
+ if (pos < 0 || (uint32)pos >= number_of_candidates ()) return;
+
+ if (!m_impl->m_cursor_visible)
+ m_impl->m_cursor_visible = true;
+
+ if (pos >= get_current_page_start () && pos < get_current_page_start () + get_current_page_size ()) {
+ m_impl->m_cursor_pos = pos;
+ } else if (pos < get_cursor_pos ()) {
+ while (pos < get_cursor_pos ())
+ cursor_up ();
+ } else if (pos > get_cursor_pos ()) {
+ while (pos > get_cursor_pos ())
+ cursor_down ();
+ }
+}
+
+void
+LookupTable::set_cursor_pos_in_current_page (int pos)
+{
+ if (pos < 0 || pos >= get_current_page_size ()) return;
+
+ if (!m_impl->m_cursor_visible)
+ m_impl->m_cursor_visible = true;
+
+ m_impl->m_cursor_pos = pos + get_current_page_start ();
+}
+
+WideString
+LookupTable::get_candidate_label (int page_index) const
+{
+ if (page_index >= 0 && page_index < get_current_page_size () && (uint32)page_index < m_impl->m_candidate_labels.size ())
+ return m_impl->m_candidate_labels [page_index];
+ return WideString ();
+}
+
+WideString
+LookupTable::get_candidate_in_current_page (int page_index) const
+{
+ if (page_index >= 0 && page_index < get_current_page_size ())
+ return get_candidate (page_index + m_impl->m_current_page_start);
+ return WideString ();
+}
+
+AttributeList
+LookupTable::get_attributes_in_current_page (int page_index) const
+{
+ if (page_index >= 0 && page_index < get_current_page_size ())
+ return get_attributes (page_index + m_impl->m_current_page_start);
+ return AttributeList ();
+}
+
+void
+LookupTable::clear ()
+{
+ m_impl->m_current_page_start = 0;
+ m_impl->m_cursor_pos = 0;
+ std::vector <int> ().swap (m_impl->m_page_history);
+}
+
+class CommonLookupTable::CommonLookupTableImpl
+{
+public:
+ std::vector <ucs4_t> m_buffer;
+ std::vector <uint32> m_index;
+
+ AttributeList m_attributes;
+ std::vector <uint32> m_attrs_index;
+};
+
+//implementation of CommonLookupTable
+CommonLookupTable::CommonLookupTable (int page_size)
+ : LookupTable (page_size), m_impl (new CommonLookupTableImpl ())
+{
+ std::vector <WideString> labels;
+ char buf [2] = { 0, 0 };
+ for (int i = 0; i < 9; ++i) {
+ buf [0] = '1' + i;
+ labels.push_back (utf8_mbstowcs (buf));
+ }
+
+ labels.push_back (utf8_mbstowcs ("0"));
+
+ set_candidate_labels (labels);
+}
+
+CommonLookupTable::CommonLookupTable (int page_size,
+ const std::vector<WideString> &labels)
+ : LookupTable (page_size), m_impl (new CommonLookupTableImpl ())
+{
+ set_candidate_labels (labels);
+}
+
+CommonLookupTable::~CommonLookupTable ()
+{
+ delete m_impl;
+}
+
+uint32
+CommonLookupTable::number_of_candidates () const
+{
+ return m_impl->m_index.size ();
+}
+
+bool
+CommonLookupTable::append_candidate (const WideString &cand,
+ const AttributeList &attrs)
+{
+ if (cand.length () == 0)
+ return false;
+
+ m_impl->m_index.push_back (m_impl->m_buffer.size ());
+ m_impl->m_buffer.insert (m_impl->m_buffer.end (), cand.begin (), cand.end ());
+
+ m_impl->m_attrs_index.push_back (m_impl->m_attributes.size ());
+
+ if (attrs.size ())
+ m_impl->m_attributes.insert (m_impl->m_attributes.end (), attrs.begin (), attrs.end ());
+
+ return true;
+}
+
+bool
+CommonLookupTable::append_candidate (ucs4_t cand,
+ const AttributeList &attrs)
+{
+ if (cand == 0)
+ return false;
+
+ m_impl->m_index.push_back (m_impl->m_buffer.size ());
+ m_impl->m_buffer.push_back (cand);
+
+ m_impl->m_attrs_index.push_back (m_impl->m_attributes.size ());
+
+ if (attrs.size ())
+ m_impl->m_attributes.insert (m_impl->m_attributes.end (), attrs.begin (), attrs.end ());
+
+ return true;
+}
+
+WideString
+CommonLookupTable::get_candidate (int index) const
+{
+ if (index < 0 || (uint32)index >= number_of_candidates ())
+ return WideString ();
+
+ std::vector <ucs4_t>::const_iterator start, end;
+
+ start = m_impl->m_buffer.begin () + m_impl->m_index [index];
+
+ if ((uint32)index < number_of_candidates () - 1)
+ end = m_impl->m_buffer.begin () + m_impl->m_index [index+1];
+ else
+ end = m_impl->m_buffer.end ();
+
+ return WideString (start, end);
+}
+
+AttributeList
+CommonLookupTable::get_attributes (int index) const
+{
+ if (index < 0 || (uint32)index >= number_of_candidates ())
+ return AttributeList ();
+
+ AttributeList::const_iterator start, end;
+
+ start = m_impl->m_attributes.begin () + m_impl->m_attrs_index [index];
+
+ if ((uint32)index < number_of_candidates () - 1)
+ end = m_impl->m_attributes.begin () + m_impl->m_attrs_index [index+1];
+ else
+ end = m_impl->m_attributes.end ();
+
+ if (start < end)
+ return AttributeList (start, end);
+
+ return AttributeList ();
+}
+
+void
+CommonLookupTable::clear ()
+{
+ LookupTable::clear ();
+
+ std::vector <ucs4_t> ().swap (m_impl->m_buffer);
+ std::vector <uint32> ().swap (m_impl->m_index);
+
+ AttributeList ().swap (m_impl->m_attributes);
+ std::vector <uint32> ().swap (m_impl->m_attrs_index);
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_lookup_table.h
+ * @brief definition of LookupTable classes.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_lookup_table.h,v 1.32 2005/05/13 04:21:29 suzhe Exp $
+ */
+
+#ifndef __SCIM_LOOKUP_TABLE_H
+#define __SCIM_LOOKUP_TABLE_H
+
+namespace scim {
+/**
+ * @addtogroup Accessories
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+#define SCIM_LOOKUP_TABLE_MAX_PAGESIZE 128
+
+/**
+ * @brief The base class of lookup table.
+ *
+ * LookupTable is used to store the candidate phrases, it provides a easy way
+ * to manage the content of candidates and flip between multiple pages.
+ *
+ * It also can manage the attributes for each candidate string.
+ *
+ * This is abstract class and cannot store data.
+ * IMEngine should use its derivation class.
+ * This class is the interface that uses within FrontEnd class.
+ */
+class LookupTable
+{
+ class LookupTableImpl;
+
+ LookupTableImpl * m_impl;
+
+ LookupTable (const LookupTable &);
+ const LookupTable & operator= (const LookupTable &);
+
+public:
+ /**
+ * @brief Constructor
+ * @param page_size - the maximum page size, can be set by set_page_size() later.
+ */
+ LookupTable (int page_size = 10);
+
+ /**
+ * @brief Virtual destructor.
+ */
+ virtual ~LookupTable ();
+
+ /**
+ * @brief Set the strings to label the candidates in one page.
+ * @param labels - the strings to label the candidates in one page.
+ */
+ void set_candidate_labels (const std::vector<WideString> &labels);
+
+ /**
+ * @brief Get the label string of a candidate in a page.
+ * @param page_index - the index in a page, 0 to (max page size - 1).
+ * @return the corresponding label of the index.
+ */
+ WideString get_candidate_label (int page_index) const;
+
+ /**
+ * @brief Set the maximum page size.
+ * @param page_size - the max page size of the table.
+ */
+ void set_page_size (int page_size);
+
+ /**
+ * @brief Get the maximum page size.
+ * @return the max page size of the table.
+ */
+ int get_page_size () const;
+
+ /**
+ * @brief Get current page size,
+ * @return the page size of current page.It can be less than the max page size.
+ */
+ int get_current_page_size () const;
+
+ /**
+ * @brief Get the start index of current page.
+ * @return the start item index of current page, starting from 0.
+ */
+ int get_current_page_start () const;
+
+ /**
+ * @brief Check if the cursor is visible.
+ * @return true if the cursor should be shown.
+ */
+ bool is_cursor_visible () const;
+
+ /**
+ * @brief Check if the page size is fixed, aka. couldn't reduced by FrontEnd.
+ * @return true if the page size shouldn't be reduced by FrontEnd.
+ */
+ bool is_page_size_fixed () const;
+
+ /**
+ * @brief Get current cursor position.
+ * @return the cursor position in the table, starting from 0.
+ */
+ int get_cursor_pos () const;
+
+ /**
+ * @brief Get the cursor position in current page.
+ * @return the cursor position in current page,
+ * equals to get_cursor_pos () - get_current_page_start ().
+ */
+ int get_cursor_pos_in_current_page () const;
+
+ /**
+ * @brief Flip to the previous page.
+ * @return true if success, false if it's already in the first page.
+ */
+ bool page_up ();
+
+ /**
+ * @brief Flip to the next page.
+ * @return true if success, false if it's already in the last page.
+ */
+ bool page_down ();
+
+ /**
+ * @brief Move cursor position to the previous entry.
+ * @return true if success, false if it's already at the first entry.
+ */
+ bool cursor_up ();
+
+ /**
+ * @brief Move cursor position to the next entry.
+ * @return true if success. false if it's already at the last entry.
+ */
+ bool cursor_down ();
+
+ /**
+ * @brief Set the cursor visibility.
+ * @param show - true to show the cursor.
+ */
+ void show_cursor (bool show=true);
+
+ /**
+ * @brief Set the page size to be fixed, aka. prevent from being changed by FrontEnd.
+ */
+ void fix_page_size (bool fixed=true);
+
+ /**
+ * @brief Set the cursor position.
+ * @param pos - the absolute position of the cursor.
+ */
+ void set_cursor_pos (int pos);
+
+ /**
+ * @brief Set the cursor position in current page.
+ * @param pos - the relative position of the cursor in current page.
+ */
+ void set_cursor_pos_in_current_page (int pos);
+
+ /**
+ * @brief Get a candidate in current page.
+ *
+ * @param page_index - the candidate index in current page.
+ * @return the content of this candidate.
+ *
+ * @sa get_candidate
+ */
+ WideString get_candidate_in_current_page (int page_index) const;
+
+ /**
+ * @brief Get the display attributes of a candidate in current page.
+ *
+ * @param page_index - the index in current page.
+ * @return the AttributeList object holding the attributes of this candidate.
+ *
+ * @sa get_attributes
+ */
+ AttributeList get_attributes_in_current_page (int page_index) const;
+
+public:
+ /**
+ * @name Pure Virtual functions.
+ * These functions should be implemented in derivation classes.
+ *
+ * @{
+ */
+
+ /**
+ * @brief Get a candidate.
+ * @param index - the candidate index in the lookup table.
+ * @return the content of this candidate.
+ */
+ virtual WideString get_candidate (int index) const = 0;
+
+ /**
+ * @brief Get the attributes of a candidate.
+ * @param index - the index in the lookup table.
+ * @return the AttributeList object holding the attributes of this candidate.
+ */
+ virtual AttributeList get_attributes (int index) const = 0;
+
+ /**
+ * @brief Return the number of candidates in this table.
+ * @return the number of entries currently in this table.
+ */
+ virtual uint32 number_of_candidates () const = 0;
+
+ /**
+ * @brief Clear the table.
+ */
+ virtual void clear () = 0;
+
+ /**
+ * @}
+ */
+};
+
+
+/**
+ * @brief A common lookup table class.
+ *
+ * This class implements the LookupTable interface in a common way.
+ *
+ */
+class CommonLookupTable : public LookupTable
+{
+ class CommonLookupTableImpl;
+
+ CommonLookupTableImpl *m_impl;
+
+ CommonLookupTable (const CommonLookupTable &);
+ const CommonLookupTable & operator= (const CommonLookupTable &);
+
+public:
+ CommonLookupTable (int page_size = 10);
+
+ /**
+ * @brief Constructor
+ *
+ * @param page_size - the maximum page size, can be set by set_page_size () later.
+ * @param labels - the strings to label the candidates in one page.
+ */
+ CommonLookupTable (int page_size,
+ const std::vector<WideString> &labels);
+
+ ~CommonLookupTable ();
+
+ virtual WideString get_candidate (int index) const;
+
+ virtual AttributeList get_attributes (int index) const;
+
+ virtual uint32 number_of_candidates () const;
+
+ virtual void clear ();
+
+public:
+ /**
+ * @brief Append a candidate string into the table.
+ *
+ * @param cand - a candidate string to be added into the table.
+ * @param attrs - the attributes to control the display effect of this entry.
+ * It can be omitted if no attribute.
+ *
+ * @return true if success.
+ */
+ bool append_candidate (const WideString &cand,
+ const AttributeList &attrs = AttributeList ());
+
+ /**
+ * @brief Append a candidate char into the table.
+ *
+ * @param cand - a candidate char to be added into the table.
+ * @param attrs - the attributes to control the display effect of this entry.
+ * It can be omitted if no attribute.
+ *
+ * @return true if success.
+ */
+ bool append_candidate (ucs4_t cand,
+ const AttributeList &attrs = AttributeList ());
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_LOOKUP_TABLE_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_module.cpp,v 1.26 2005/05/24 12:22:51 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_MODULE
+#define Uses_STL_ALGORITHM
+#include "scim_private.h"
+#include "scim.h"
+#include "ltdl.h"
+#include <dirent.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+namespace scim {
+
+typedef void (*ModuleInitFunc) (void);
+typedef void (*ModuleExitFunc) (void);
+
+struct Module::ModuleImpl
+{
+ lt_dlhandle handle;
+ ModuleInitFunc init;
+ ModuleExitFunc exit;
+ String path;
+ String name;
+
+ ModuleImpl () : handle (0), init (0), exit (0) { }
+};
+
+static std::vector <ModuleInitFunc> _scim_modules;
+
+static void
+_scim_get_module_paths (std::vector <String> &paths, const String &type)
+{
+ const char *module_path_env;
+
+ std::vector <String> module_paths;
+ std::vector <String>::iterator it;
+
+ paths.clear ();
+
+ module_path_env = getenv ("SCIM_MODULE_PATH");
+
+ if (module_path_env)
+ {
+ struct stat buf;
+ if (stat("/opt/etc/.hib_capturing", &buf) != 0)
+ module_paths.push_back (String (module_path_env));
+ }
+
+ module_paths.push_back (String (SCIM_MODULE_PATH));
+
+ // append version to the end of the paths
+ for (it = module_paths.begin (); it != module_paths.end (); ++it) {
+ String tmp_dir;
+
+ tmp_dir = *it + String (SCIM_PATH_DELIM_STRING) +
+ String (SCIM_BINARY_VERSION) +
+ String (SCIM_PATH_DELIM_STRING) + type;
+
+ paths.push_back (tmp_dir);
+
+ tmp_dir = *it + String (SCIM_PATH_DELIM_STRING) + type;
+ paths.push_back (tmp_dir);
+ }
+}
+
+int
+scim_get_module_list (std::vector <String>& mod_list, const String& type)
+{
+ std::vector<String> paths;
+ _scim_get_module_paths (paths, type);
+
+ mod_list.clear ();
+
+ for (std::vector<String>::iterator i = paths.begin (); i!= paths.end (); ++i) {
+ DIR *dir = opendir (i->c_str ());
+ if (dir) {
+ struct dirent *file = readdir (dir);
+ while (file) {
+ struct stat filestat;
+ String absfn = *i + String (SCIM_PATH_DELIM_STRING) + file->d_name;
+ stat (absfn.c_str (), &filestat);
+ if (S_ISREG (filestat.st_mode)) {
+ std::vector<String> vec;
+ scim_split_string_list (vec, String (file->d_name), '.');
+ mod_list.push_back (vec [0]);
+ }
+ file = readdir (dir);
+ }
+ closedir (dir);
+ }
+ }
+ std::sort (mod_list.begin (), mod_list.end ());
+ mod_list.erase (std::unique (mod_list.begin(), mod_list.end()), mod_list.end());
+ return mod_list.size ();
+}
+
+Module::Module ()
+ : m_impl (new ModuleImpl)
+{
+ lt_dlinit ();
+}
+
+Module::Module (const String &name, const String &type)
+ : m_impl (new ModuleImpl)
+{
+ lt_dlinit ();
+ if (!load (name, type))
+ std::cerr << "Load name:" << name << " type:" << type << " is failed!!!";
+}
+
+Module::~Module ()
+{
+ unload ();
+ lt_dlexit ();
+ delete m_impl;
+}
+
+static String
+_concatenate_ltdl_prefix (const String &name, const String &symbol)
+{
+ String prefix (name);
+
+ for (size_t i=0; i<prefix.length (); i++)
+ if (!isalnum ((int)prefix[i]))
+ prefix[i] = '_';
+
+ return prefix + String ("_LTX_") + symbol;
+}
+
+bool
+Module::load (const String &name, const String &type)
+{
+ // If cannot unload original module (it's resident), then return false.
+ if (is_resident ())
+ return false;
+
+ std::vector <String> paths;
+ std::vector <String>::iterator it;
+
+ String module_path;
+
+ lt_dlhandle new_handle = 0;
+
+ ModuleInitFunc new_init;
+ ModuleExitFunc new_exit;
+
+ _scim_get_module_paths (paths, type);
+
+ for (it = paths.begin (); it != paths.end (); ++it) {
+ module_path = *it + String (SCIM_PATH_DELIM_STRING) + name;
+ new_handle = lt_dlopenext (module_path.c_str ());
+ if (new_handle)
+ break;
+ }
+
+ if (!new_handle) {
+ new_handle = lt_dlopenext (name.c_str ());
+ }
+
+ if (!new_handle)
+ return false;
+
+ String symbol;
+
+ // Try to load the symbol scim_module_init
+ symbol = "scim_module_init";
+ new_init = (ModuleInitFunc) lt_dlsym (new_handle, symbol.c_str ());
+
+ // If symbol load failed, try to add LTX prefix and load again.
+ // This will occurred when name.la is missing.
+ if (!new_init) {
+ symbol = _concatenate_ltdl_prefix (name, symbol);
+ new_init = (ModuleInitFunc) lt_dlsym (new_handle, symbol.c_str ());
+
+ // Failed again? Try to prepend a under score to the symbol name.
+ if (!new_init) {
+ symbol.insert (symbol.begin (),'_');
+ new_init = (ModuleInitFunc) lt_dlsym (new_handle, symbol.c_str ());
+ }
+ }
+
+ // Could not load the module!
+ if (!new_init) {
+ lt_dlclose (new_handle);
+ return false;
+ }
+
+ // Try to load the symbol scim_module_exit
+ symbol = "scim_module_exit";
+ new_exit = (ModuleExitFunc) lt_dlsym (new_handle, symbol.c_str ());
+
+ // If symbol load failed, try to add LTX prefix and load again.
+ // This will occurred when name.la is missing.
+ if (!new_exit) {
+ symbol = _concatenate_ltdl_prefix (name, symbol);
+ new_exit = (ModuleExitFunc) lt_dlsym (new_handle, symbol.c_str ());
+
+ // Failed again? Try to prepend a under score to the symbol name.
+ if (!new_exit) {
+ symbol.insert (symbol.begin (),'_');
+ new_exit = (ModuleExitFunc) lt_dlsym (new_handle, symbol.c_str ());
+ }
+ }
+
+ //Check if the module is already loaded.
+ if (std::find (_scim_modules.begin (), _scim_modules.end (), new_init)
+ != _scim_modules.end ()) {
+ lt_dlclose (new_handle);
+ return false;
+ }
+
+ if (unload ()) {
+ _scim_modules.push_back (new_init);
+
+ const lt_dlinfo *info = lt_dlgetinfo (new_handle);
+
+ m_impl->handle = new_handle;
+ m_impl->init = new_init;
+ m_impl->exit = new_exit;
+ m_impl->path = String (info->filename);
+ m_impl->name = name;
+
+ try {
+ m_impl->init ();
+ return true;
+ } catch (...) {
+ unload ();
+ }
+ } else {
+ lt_dlclose (new_handle);
+ }
+
+ return false;
+}
+
+bool
+Module::unload ()
+{
+ if (!m_impl->handle)
+ return true;
+
+ if (is_resident ())
+ return false;
+
+ if (m_impl->exit) {
+ try { m_impl->exit (); } catch (...) { }
+ }
+
+ lt_dlclose (m_impl->handle);
+
+ std::vector <ModuleInitFunc>::iterator it =
+ std::find (_scim_modules.begin (), _scim_modules.end (), m_impl->init);
+
+ if (it != _scim_modules.end ())
+ _scim_modules.erase (it);
+
+ m_impl->handle = 0;
+ m_impl->init = 0;
+ m_impl->exit = 0;
+ m_impl->path = String ();
+ m_impl->name = String ();
+
+ return true;
+}
+
+bool
+Module::make_resident () const
+{
+ if (m_impl->handle) {
+ return lt_dlmakeresident (m_impl->handle) == 0;
+ }
+ return false;
+}
+
+bool
+Module::is_resident () const
+{
+ if (m_impl->handle) {
+ return lt_dlisresident (m_impl->handle) == 1;
+ }
+ return false;
+}
+
+bool
+Module::valid () const
+{
+ return (m_impl->handle && m_impl->init);
+}
+
+String
+Module::get_path () const
+{
+ return m_impl->path;
+}
+
+void *
+Module::symbol (const String & sym) const
+{
+ void * func = 0;
+
+ if (m_impl->handle) {
+ String symbol = sym;
+ func = lt_dlsym (m_impl->handle, symbol.c_str ());
+ if (!func) {
+ symbol = _concatenate_ltdl_prefix (m_impl->name, symbol);
+ func = lt_dlsym (m_impl->handle, symbol.c_str ());
+ if (!func) {
+ symbol.insert (symbol.begin (), '_');
+ func = lt_dlsym (m_impl->handle, symbol.c_str ());
+ }
+ }
+ }
+ return func;
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_module.h
+ * @brief definition of Module related classes.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_module.h,v 1.19 2005/01/10 08:30:54 suzhe Exp $
+ */
+
+#ifndef __SCIM_MODULE_H
+#define __SCIM_MODULE_H
+
+namespace scim {
+
+/**
+ * @addtogroup Accessories
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+class ModuleError: public Exception
+{
+public:
+ ModuleError (const String& what_arg)
+ : Exception (String("scim::Module: ") + what_arg) { }
+};
+
+class Module
+{
+ class ModuleImpl;
+ ModuleImpl *m_impl;
+
+ Module (const Module &);
+ Module & operator= (const Module &);
+
+public:
+ Module ();
+ Module (const String &name, const String &type);
+ ~Module ();
+
+ bool load (const String &name, const String &type);
+ bool unload ();
+
+ bool valid () const;
+
+ bool is_resident () const;
+ bool make_resident () const;
+
+ String get_path () const;
+
+ void * symbol (const String & sym) const;
+};
+
+int scim_get_module_list (std::vector <String>& mod_list, const String& type = "");
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_MODULE_H
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
+
--- /dev/null
+/*
+ * Most code of this file are came from Inti project.
+ */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ * Copyright (c) 2002 The Inti Development Team.
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_object.cpp,v 1.9 2005/01/10 08:30:54 suzhe Exp $
+ */
+
+#define Uses_SCIM_OBJECT
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+/* ReferencedObject
+ */
+
+ReferencedObject::ReferencedObject ()
+ : m_referenced (true), m_ref_count (1)
+{
+}
+
+ReferencedObject::~ReferencedObject ()
+{
+}
+
+void
+ReferencedObject::set_referenced (bool reference)
+{
+ m_referenced = reference;
+}
+
+bool
+ReferencedObject::is_referenced() const
+{
+ return m_referenced;
+}
+
+void
+ReferencedObject::ref()
+{
+ ++m_ref_count;
+}
+
+void
+ReferencedObject::unref()
+{
+ if (--m_ref_count == 0)
+ delete this;
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_object.h
+ * @brief Reference counted base class interface.
+ *
+ * Provides a reference counted base class
+ * for dynamic objects handled the scim smart pointer.
+ *
+ * Most code of this file are came from Inti project.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ * Copyright (c) 2002 The Inti Development Team.
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_object.h,v 1.9 2005/01/10 08:30:54 suzhe Exp $
+ */
+
+#ifndef __SCIM_OBJECT_H
+#define __SCIM_OBJECT_H
+
+namespace scim {
+
+/**
+ * @addtogroup Accessories
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+/**
+ * @class ReferencedObject
+ * @brief Reference counted base class.
+ *
+ * ReferencedObject is a reference counting base class.
+ * it has an integer reference counter so that dynamic objects
+ * can have their memory allocation handled by the scim
+ * smart pointer: Pointer<>. This keeps the memory management
+ * in scim consistent across all classes.
+ * If you derive a class from ReferencedObject and allocate it
+ * on the heap, you free the memory and destroy the object by
+ * calling unref(), not delete.
+ */
+class ReferencedObject
+{
+ template<typename T> friend class Pointer;
+
+ ReferencedObject(const ReferencedObject&);
+ ReferencedObject& operator=(const ReferencedObject&);
+
+ bool m_referenced;
+ int m_ref_count;
+
+protected:
+ ReferencedObject();
+ //!< Constructor.
+
+ virtual ~ReferencedObject() = 0;
+ //!< Destructor.
+
+ void set_referenced(bool reference);
+ //!< Set the internal referenced flag.
+ //!< @param reference - <EM>true</EM> if the initial reference count must be removed by owner.
+ //!<
+ //!< <BR>Called by derived classes to set the referenced flag. A object sets this flag
+ //!< to true , indicating that it owns the initial reference count and unref() must be called.
+public:
+ bool is_referenced() const;
+ //!< The referenced flag setting.
+ //!< @return <EM>true</EM> if unref() must be explicitly called on this object.
+
+ void ref();
+ //!< Increase an object's reference count by one.
+
+ void unref();
+ //!< Decrease an object's reference count by one.
+ //!< When the reference count becomes zero delete is called. Remember, with ReferencedObject
+ //!< you must call unref() on dynmaically allocated objects, not delete.
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_OBJECT_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_panel.cpp
+ * @brief Implementation of class PanelAgent.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_panel_agent.cpp,v 1.8.2.1 2006/01/09 14:32:18 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_TRANSACTION
+#define Uses_SCIM_TRANS_COMMANDS
+#define Uses_SCIM_PANEL_AGENT
+#define Uses_SCIM_HELPER
+#define Uses_SCIM_SOCKET
+#define Uses_SCIM_EVENT
+#define Uses_SCIM_CONFIG
+#define Uses_SCIM_CONFIG_MODULE
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_SCIM_UTILITY
+
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include "scim_private.h"
+#include "scim.h"
+#include "scim_stl_map.h"
+
+
+scim::CommonLookupTable g_isf_candidate_table;
+
+
+namespace scim {
+
+typedef Signal0<void>
+ PanelAgentSignalVoid;
+
+typedef Signal1<void, int>
+ PanelAgentSignalInt;
+
+typedef Signal1<void, const String &>
+ PanelAgentSignalString;
+
+typedef Signal2<void, const String &, bool>
+ PanelAgentSignalStringBool;
+
+typedef Signal2<void, String &, String &>
+ PanelAgentSignalString2;
+
+typedef Signal2<void, int, const String &>
+ PanelAgentSignalIntString;
+
+typedef Signal1<void, const PanelFactoryInfo &>
+ PanelAgentSignalFactoryInfo;
+
+typedef Signal1<void, const std::vector <PanelFactoryInfo> &>
+ PanelAgentSignalFactoryInfoVector;
+
+typedef Signal1<void, const LookupTable &>
+ PanelAgentSignalLookupTable;
+
+typedef Signal1<void, const Property &>
+ PanelAgentSignalProperty;
+
+typedef Signal1<void, const PropertyList &>
+ PanelAgentSignalPropertyList;
+
+typedef Signal2<void, int, int>
+ PanelAgentSignalIntInt;
+
+typedef Signal2<void, int &, int &>
+ PanelAgentSignalIntInt2;
+
+typedef Signal3<void, int, int, int>
+ PanelAgentSignalIntIntInt;
+
+typedef Signal2<void, int, const Property &>
+ PanelAgentSignalIntProperty;
+
+typedef Signal2<void, int, const PropertyList &>
+ PanelAgentSignalIntPropertyList;
+
+typedef Signal2<void, int, const HelperInfo &>
+ PanelAgentSignalIntHelperInfo;
+
+typedef Signal2<void, const String &, const AttributeList &>
+ PanelAgentSignalAttributeString;
+
+typedef Signal1<void, std::vector <String> &>
+ PanelAgentSignalStringVector;
+
+typedef Signal1<bool, std::vector <String> &>
+ PanelAgentSignalBoolStringVector;
+
+typedef Signal2<void, char *, std::vector <String> &>
+ PanelAgentSignalStrStringVector;
+
+typedef Signal2<bool, const String &, ISE_INFO &>
+ PanelAgentSignalStringISEINFO;
+
+typedef Signal1<void, const KeyEvent &>
+ PanelAgentSignalKeyEvent;
+
+typedef Signal1<void, struct rectinfo &>
+ PanelAgentSignalRect;
+
+enum ClientType {
+ UNKNOWN_CLIENT,
+ FRONTEND_CLIENT,
+ HELPER_CLIENT,
+ HELPER_ACT_CLIENT,
+ IMCONTROL_ACT_CLIENT,
+ IMCONTROL_CLIENT
+};
+
+struct ClientInfo {
+ uint32 key;
+ ClientType type;
+};
+
+struct HelperClientStub {
+ int id;
+ int ref;
+
+ HelperClientStub (int i = 0, int r = 0) : id (i), ref (r) { }
+};
+
+struct IMControlStub {
+ std::vector<ISE_INFO> info;
+ std::vector<int> count;
+};
+
+static int _id_count = -4;
+
+#define DEFAULT_CONTEXT_VALUE 0xfff
+
+#if SCIM_USE_STL_EXT_HASH_MAP
+typedef __gnu_cxx::hash_map <int, ClientInfo, __gnu_cxx::hash <int> > ClientRepository;
+typedef __gnu_cxx::hash_map <int, HelperInfo, __gnu_cxx::hash <int> > HelperInfoRepository;
+typedef __gnu_cxx::hash_map <uint32, String, __gnu_cxx::hash <unsigned int> > ClientContextUUIDRepository;
+typedef __gnu_cxx::hash_map <String, HelperClientStub, scim_hash_string> HelperClientIndex;
+typedef __gnu_cxx::hash_map <String, std::vector < std::pair <uint32, String> >, scim_hash_string> StartHelperICIndex;
+#elif SCIM_USE_STL_HASH_MAP
+typedef std::hash_map <int, ClientInfo, std::hash <int> > ClientRepository;
+typedef std::hash_map <int, HelperInfo, std::hash <int> > HelperInfoRepository;
+typedef std::hash_map <uint32, String, std::hash <unsigned int> > ClientContextUUIDRepository;
+typedef std::hash_map <String, HelperClientStub, scim_hash_string> HelperClientIndex;
+typedef std::hash_map <String, std::vector < std::pair <uint32, String> >, scim_hash_string> StartHelperICIndex;
+#else
+typedef std::map <int, ClientInfo> ClientRepository;
+typedef std::map <int, HelperInfo> HelperInfoRepository;
+typedef std::map <uint32, String> ClientContextUUIDRepository;
+typedef std::map <String, HelperClientStub> HelperClientIndex;
+typedef std::map <String, std::vector < std::pair <uint32, String> > > StartHelperICIndex;
+#endif
+
+typedef std::map <String, uint32> UUIDCountRepository;
+typedef std::map <String, enum HelperState> UUIDStateRepository;
+typedef std::map <String, int> StringIntRepository;
+typedef std::map <int, struct IMControlStub> IMControlRepository;
+typedef std::map <int, int> IntIntRepository;
+
+static uint32
+get_helper_ic (int client, uint32 context)
+{
+ return (uint32) (client & 0xFFFF) | ((context & 0x7FFF) << 16);
+}
+
+static void
+get_imengine_client_context (uint32 helper_ic, int &client, uint32 &context)
+{
+ client = (int) (helper_ic & 0xFFFF);
+ context = ((helper_ic >> 16) & 0x7FFF);
+}
+
+//==================================== PanelAgent ===========================
+class PanelAgent::PanelAgentImpl
+{
+ bool m_should_exit;
+ bool m_should_resident;
+
+ int m_current_screen;
+
+ String m_config_name;
+ String m_display_name;
+
+ int m_socket_timeout;
+ String m_socket_address;
+ SocketServer m_socket_server;
+
+ Transaction m_send_trans;
+ Transaction m_recv_trans;
+ Transaction m_nest_trans;
+
+ int m_current_socket_client;
+ uint32 m_current_client_context;
+ String m_current_context_uuid;
+ TOOLBAR_MODE_T m_current_toolbar_mode;
+ String m_current_factory_icon;
+ String m_current_helper_uuid;
+ String m_last_helper_uuid;
+ String m_current_ise_name;
+ uint32 m_current_ise_style;
+ int m_current_active_imcontrol_id;
+ int m_pending_active_imcontrol_id;
+ IntIntRepository m_imcontrol_map;
+ DEFAULT_ISE_T m_default_ise;
+ bool m_should_shared_ise;
+ char * m_ise_settings;
+ size_t m_ise_settings_len;
+ bool m_ise_changing;
+ bool m_ise_exiting;
+
+ int m_last_socket_client;
+ uint32 m_last_client_context;
+ String m_last_context_uuid;
+
+ ClientRepository m_client_repository;
+ /*
+ * Each Helper ISE has two socket connect between PanelAgent and HelperAgent.
+ * m_helper_info_repository records the active connection.
+ * m_helper_active_info_repository records the passive connection.
+ */
+ HelperInfoRepository m_helper_info_repository;
+ HelperInfoRepository m_helper_active_info_repository;
+ HelperClientIndex m_helper_client_index;
+
+ /* when helper register, notify imcontrol client */
+ StringIntRepository m_ise_pending_repository;
+ IMControlRepository m_imcontrol_repository;
+
+ StartHelperICIndex m_start_helper_ic_index;
+
+ /* Keyboard ISE */
+ ClientContextUUIDRepository m_client_context_uuids;
+
+ /* Helper ISE */
+ ClientContextUUIDRepository m_client_context_helper;
+ UUIDCountRepository m_helper_uuid_count;
+ UUIDStateRepository m_helper_uuid_state;
+
+ HelperManager m_helper_manager;
+
+ PanelAgentSignalVoid m_signal_reload_config;
+ PanelAgentSignalVoid m_signal_turn_on;
+ PanelAgentSignalVoid m_signal_turn_off;
+ PanelAgentSignalVoid m_signal_show_panel;
+ PanelAgentSignalVoid m_signal_hide_panel;
+ PanelAgentSignalInt m_signal_update_screen;
+ PanelAgentSignalIntIntInt m_signal_update_spot_location;
+ PanelAgentSignalFactoryInfo m_signal_update_factory_info;
+ PanelAgentSignalVoid m_signal_start_default_ise;
+ PanelAgentSignalIntInt m_signal_set_candidate_ui;
+ PanelAgentSignalIntInt2 m_signal_get_candidate_ui;
+ PanelAgentSignalIntInt m_signal_set_candidate_position;
+ PanelAgentSignalRect m_signal_get_candidate_rect;
+ PanelAgentSignalIntString m_signal_set_keyboard_ise;
+ PanelAgentSignalString2 m_signal_get_keyboard_ise;
+ PanelAgentSignalString m_signal_show_help;
+ PanelAgentSignalFactoryInfoVector m_signal_show_factory_menu;
+ PanelAgentSignalVoid m_signal_show_preedit_string;
+ PanelAgentSignalVoid m_signal_show_aux_string;
+ PanelAgentSignalVoid m_signal_show_lookup_table;
+ PanelAgentSignalVoid m_signal_show_associate_table;
+ PanelAgentSignalVoid m_signal_hide_preedit_string;
+ PanelAgentSignalVoid m_signal_hide_aux_string;
+ PanelAgentSignalVoid m_signal_hide_lookup_table;
+ PanelAgentSignalVoid m_signal_hide_associate_table;
+ PanelAgentSignalAttributeString m_signal_update_preedit_string;
+ PanelAgentSignalInt m_signal_update_preedit_caret;
+ PanelAgentSignalAttributeString m_signal_update_aux_string;
+ PanelAgentSignalLookupTable m_signal_update_lookup_table;
+ PanelAgentSignalLookupTable m_signal_update_associate_table;
+ PanelAgentSignalPropertyList m_signal_register_properties;
+ PanelAgentSignalProperty m_signal_update_property;
+ PanelAgentSignalIntPropertyList m_signal_register_helper_properties;
+ PanelAgentSignalIntProperty m_signal_update_helper_property;
+ PanelAgentSignalIntHelperInfo m_signal_register_helper;
+ PanelAgentSignalInt m_signal_remove_helper;
+ PanelAgentSignalStringBool m_signal_set_active_ise_by_uuid;
+ PanelAgentSignalString m_signal_set_active_ise_by_name;
+ PanelAgentSignalVoid m_signal_focus_in;
+ PanelAgentSignalVoid m_signal_focus_out;
+ PanelAgentSignalBoolStringVector m_signal_get_ise_list;
+ PanelAgentSignalBoolStringVector m_signal_get_keyboard_ise_list;
+ PanelAgentSignalInt m_signal_launch_helper_ise_list_selection;
+ PanelAgentSignalStringVector m_signal_get_language_list;
+ PanelAgentSignalStringVector m_signal_get_all_language;
+ PanelAgentSignalStrStringVector m_signal_get_ise_language;
+ PanelAgentSignalString m_signal_set_isf_language;
+ PanelAgentSignalStringISEINFO m_signal_get_ise_info_by_uuid;
+ PanelAgentSignalStringISEINFO m_signal_get_ise_info_by_name;
+ PanelAgentSignalKeyEvent m_signal_send_key_event;
+
+ PanelAgentSignalInt m_signal_accept_connection;
+ PanelAgentSignalInt m_signal_close_connection;
+ PanelAgentSignalVoid m_signal_exit;
+
+ PanelAgentSignalVoid m_signal_transaction_start;
+ PanelAgentSignalVoid m_signal_transaction_end;
+
+ PanelAgentSignalVoid m_signal_lock;
+ PanelAgentSignalVoid m_signal_unlock;
+
+public:
+ PanelAgentImpl ()
+ : m_should_exit (false),
+ m_should_resident (false),
+ m_current_screen (0),
+ m_socket_timeout (scim_get_default_socket_timeout ()),
+ m_current_socket_client (-1), m_current_client_context (0),
+ m_current_toolbar_mode (TOOLBAR_KEYBOARD_MODE),
+ m_current_ise_style (0),
+ m_current_active_imcontrol_id (-1), m_pending_active_imcontrol_id (-1),
+ m_should_shared_ise (false),
+ m_ise_settings (NULL), m_ise_settings_len (0),
+ m_ise_changing (false), m_ise_exiting (false),
+ m_last_socket_client (-1), m_last_client_context (0)
+ {
+ m_current_ise_name = String (_("English/Keyboard"));
+ m_imcontrol_repository.clear ();
+ m_imcontrol_map.clear ();
+ m_socket_server.signal_connect_accept (slot (this, &PanelAgentImpl::socket_accept_callback));
+ m_socket_server.signal_connect_receive (slot (this, &PanelAgentImpl::socket_receive_callback));
+ m_socket_server.signal_connect_exception (slot (this, &PanelAgentImpl::socket_exception_callback));
+ }
+
+ bool initialize (const String &config, const String &display, bool resident)
+ {
+ m_config_name = config;
+ m_display_name = display;
+ m_should_resident = resident;
+
+ m_socket_address = scim_get_default_panel_socket_address (display);
+
+ m_socket_server.shutdown ();
+
+ return m_socket_server.create (SocketAddress (m_socket_address));
+ }
+
+ bool valid (void) const
+ {
+ return m_socket_server.valid ();
+ }
+
+public:
+ bool run (void)
+ {
+ SCIM_DEBUG_MAIN (1) << "PanelAgent::run ()\n";
+
+ return m_socket_server.run ();
+ }
+
+ void stop (void)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::stop ()\n";
+
+ lock ();
+ m_should_exit = true;
+ unlock ();
+
+ SocketClient client;
+
+ if (client.connect (SocketAddress (m_socket_address))) {
+ client.close ();
+ }
+ }
+
+ int get_helper_list (std::vector <HelperInfo> & helpers) const
+ {
+ SCIM_DEBUG_MAIN (1) << "PanelAgent::get_helper_list ()\n";
+
+ helpers.clear ();
+
+ m_helper_manager.get_helper_list ();
+ unsigned int num = m_helper_manager.number_of_helpers ();
+ HelperInfo info;
+
+ SCIM_DEBUG_MAIN (2) << "Found " << num << " Helper objects\n";
+
+ for (unsigned int i = 0; i < num; ++i) {
+ if (m_helper_manager.get_helper_info (i, info) && info.uuid.length ()
+ && (info.option & SCIM_HELPER_STAND_ALONE))
+ helpers.push_back (info);
+
+ SCIM_DEBUG_MAIN (3) << "Helper " << i << " : " << info.uuid << " : " << info.name << " : "
+ << ((info.option & SCIM_HELPER_STAND_ALONE) ? "SA " : "")
+ << ((info.option & SCIM_HELPER_AUTO_START) ? "AS " : "")
+ << ((info.option & SCIM_HELPER_AUTO_RESTART) ? "AR " : "") << "\n";
+ }
+
+ return (int)(helpers.size ());
+ }
+
+ TOOLBAR_MODE_T get_current_toolbar_mode () const
+ {
+ return m_current_toolbar_mode;
+ }
+
+ String get_current_ise_name () const
+ {
+ return m_current_ise_name;
+ }
+
+ String get_current_factory_icon () const
+ {
+ return m_current_factory_icon;
+ }
+
+ String get_current_helper_uuid () const
+ {
+ return m_current_helper_uuid;
+ }
+
+ String get_current_helper_name () const
+ {
+ std::vector<HelperInfo> helpers;
+
+ get_helper_list (helpers);
+
+ std::vector<HelperInfo>::iterator iter;
+
+ for (iter = helpers.begin (); iter != helpers.end (); iter++) {
+ if (iter->uuid == m_current_helper_uuid)
+ return iter->name;
+ }
+
+ return String ("");
+ }
+
+ void set_current_ise_name (String &name)
+ {
+ m_current_ise_name = name;
+ }
+
+ void set_current_ise_style (uint32 &style)
+ {
+ m_current_ise_style = style;
+ }
+
+ void set_current_toolbar_mode (TOOLBAR_MODE_T mode)
+ {
+ m_current_toolbar_mode = mode;
+ }
+
+ void update_ise_name (String &name)
+ {
+ ClientRepository::iterator iter = m_client_repository.begin ();
+
+ for (; iter != m_client_repository.end (); iter++)
+ {
+ if (IMCONTROL_CLIENT == iter->second.type
+ && iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
+ {
+ Socket client_socket (iter->first);
+ Transaction trans;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_command (ISM_TRANS_CMD_ISE_CHANGED);
+ trans.put_data (name);
+
+ trans.write_to_socket (client_socket);
+ break;
+ }
+ }
+ }
+
+ void update_ise_style (uint32 &style)
+ {
+ ClientRepository::iterator iter = m_client_repository.begin ();
+
+ for (; iter != m_client_repository.end (); iter++)
+ {
+ if (IMCONTROL_CLIENT == iter->second.type &&
+ iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
+ {
+ Socket client_socket (iter->first);
+ Transaction trans;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_command (ISM_TRANS_CMD_UPDATE_ISE_STYLE);
+ trans.put_data (style);
+
+ trans.write_to_socket (client_socket);
+ break;
+ }
+ }
+ }
+
+ void set_current_factory_icon (String &icon)
+ {
+ m_current_factory_icon = icon;
+ }
+
+ bool move_preedit_caret (uint32 position)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::move_preedit_caret (" << position << ")\n";
+
+ int client;
+ uint32 context;
+
+ lock ();
+
+ get_focused_context (client, context);
+
+ if (client >= 0) {
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32) context);
+ m_send_trans.put_command (SCIM_TRANS_CMD_MOVE_PREEDIT_CARET);
+ m_send_trans.put_data ((uint32) position);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ return client >= 0;
+ }
+
+ bool request_help (void)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::request_help ()\n";
+
+ int client;
+ uint32 context;
+
+ lock ();
+
+ get_focused_context (client, context);
+
+ if (client >= 0) {
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32) context);
+ m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_REQUEST_HELP);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ return client >= 0;
+ }
+
+ bool request_factory_menu (void)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::request_factory_menu ()\n";
+
+ int client;
+ uint32 context;
+
+ lock ();
+
+ get_focused_context (client, context);
+
+ if (client >= 0) {
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32) context);
+ m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_REQUEST_FACTORY_MENU);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ return client >= 0;
+ }
+
+ bool reset_keyboard_ise (void)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::reset_keyboard_ise ()\n";
+ int client = -1;
+ uint32 context = 0;
+
+ lock ();
+
+ get_focused_context (client, context);
+ if (client >= 0) {
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32) context);
+ m_send_trans.put_command (ISM_TRANS_CMD_PANEL_REQUEST_RESET_ISE);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ return client >= 0;
+ }
+
+ bool update_keyboard_ise_list (void)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::update_keyboard_ise_list ()\n";
+ int client = -1;
+ uint32 context = 0;
+
+ lock ();
+
+ get_focused_context (client, context);
+ if (client >= 0) {
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32) context);
+ m_send_trans.put_command (ISM_TRANS_CMD_PANEL_UPDATE_KEYBOARD_ISE);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ return client >= 0;
+ }
+
+ bool change_factory (const String &uuid)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::change_factory (" << uuid << ")\n";
+
+ int client;
+ uint32 context;
+
+ lock ();
+
+ get_focused_context (client, context);
+
+ if (client >= 0) {
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32) context);
+ m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_CHANGE_FACTORY);
+ m_send_trans.put_data (uuid);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ return client >= 0;
+ }
+
+ bool candidate_more_window_show (void)
+ {
+ SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
+
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (m_current_helper_uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_SHOW);
+ m_send_trans.write_to_socket (client_socket);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ bool candidate_more_window_hide (void)
+ {
+ SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
+
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (m_current_helper_uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_HIDE);
+ m_send_trans.write_to_socket (client_socket);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ bool select_aux (uint32 item)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::select_aux (" << item << ")\n";
+
+ int client;
+ uint32 context;
+
+ lock ();
+
+ get_focused_context (client, context);
+
+ if (client >= 0) {
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32) context);
+ m_send_trans.put_command (ISM_TRANS_CMD_SELECT_AUX);
+ m_send_trans.put_data ((uint32)item);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ return client >= 0;
+ }
+
+ bool select_candidate (uint32 item)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::select_candidate (" << item << ")\n";
+
+ int client;
+ uint32 context;
+
+ lock ();
+
+ get_focused_context (client, context);
+
+ if (client >= 0) {
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32) context);
+ m_send_trans.put_command (SCIM_TRANS_CMD_SELECT_CANDIDATE);
+ m_send_trans.put_data ((uint32)item);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ helper_select_candidate (item);
+
+ return client >= 0;
+ }
+
+ bool lookup_table_page_up (void)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::lookup_table_page_up ()\n";
+
+ int client;
+ uint32 context;
+
+ lock ();
+
+ get_focused_context (client, context);
+
+ if (client >= 0) {
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32) context);
+ m_send_trans.put_command (SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ helper_lookup_table_page_up ();
+
+ return client >= 0;
+ }
+
+ bool lookup_table_page_down (void)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::lookup_table_page_down ()\n";
+
+ int client;
+ uint32 context;
+
+ lock ();
+
+ get_focused_context (client, context);
+
+ if (client >= 0) {
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32) context);
+ m_send_trans.put_command (SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ helper_lookup_table_page_down ();
+
+ return client >= 0;
+ }
+
+ bool update_lookup_table_page_size (uint32 size)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::update_lookup_table_page_size (" << size << ")\n";
+
+ int client;
+ uint32 context;
+
+ lock ();
+
+ get_focused_context (client, context);
+
+ if (client >= 0) {
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32) context);
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE);
+ m_send_trans.put_data (size);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ helper_update_lookup_table_page_size (size);
+
+ return client >= 0;
+ }
+
+ bool select_associate (uint32 item)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::select_associate (" << item << ")\n";
+
+ int client;
+ uint32 context;
+
+ lock ();
+
+ get_focused_context (client, context);
+
+ if (client >= 0) {
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32) context);
+ m_send_trans.put_command (ISM_TRANS_CMD_SELECT_ASSOCIATE);
+ m_send_trans.put_data ((uint32)item);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ helper_select_associate (item);
+
+ return client >= 0;
+ }
+
+ bool associate_table_page_up (void)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::associate_table_page_up ()\n";
+
+ int client;
+ uint32 context;
+
+ lock ();
+
+ get_focused_context (client, context);
+
+ if (client >= 0) {
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32) context);
+ m_send_trans.put_command (ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_UP);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ helper_associate_table_page_up ();
+
+ return client >= 0;
+ }
+
+ bool associate_table_page_down (void)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::associate_table_page_down ()\n";
+
+ int client;
+ uint32 context;
+
+ lock ();
+
+ get_focused_context (client, context);
+
+ if (client >= 0) {
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32) context);
+ m_send_trans.put_command (ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_DOWN);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ helper_associate_table_page_down ();
+
+ return client >= 0;
+ }
+
+ bool update_associate_table_page_size (uint32 size)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::update_associate_table_page_size (" << size << ")\n";
+
+ int client;
+ uint32 context;
+
+ lock ();
+
+ get_focused_context (client, context);
+
+ if (client >= 0) {
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32) context);
+ m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE_PAGE_SIZE);
+ m_send_trans.put_data (size);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ helper_update_associate_table_page_size (size);
+
+ return client >= 0;
+ }
+
+ bool trigger_property (const String &property)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::trigger_property (" << property << ")\n";
+
+ int client;
+ uint32 context;
+
+ lock ();
+
+ get_focused_context (client, context);
+
+ if (client >= 0) {
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32) context);
+ m_send_trans.put_command (SCIM_TRANS_CMD_TRIGGER_PROPERTY);
+ m_send_trans.put_data (property);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ return client >= 0;
+ }
+
+ bool trigger_helper_property (int client,
+ const String &property)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::trigger_helper_property (" << client << "," << property << ")\n";
+
+ lock ();
+
+ ClientInfo info = socket_get_client_info (client);
+
+ if (client >= 0 && info.type == HELPER_CLIENT) {
+ int fe_client;
+ uint32 fe_context;
+ String fe_uuid;
+
+ fe_uuid = get_focused_context (fe_client, fe_context);
+
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+
+ /* FIXME: We presume that client and context are both less than 65536.
+ * Hopefully, it should be true in any UNIXs.
+ * So it's ok to combine client and context into one uint32.*/
+ m_send_trans.put_data (get_helper_ic (fe_client, fe_context));
+ m_send_trans.put_data (fe_uuid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_TRIGGER_PROPERTY);
+ m_send_trans.put_data (property);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ return client >= 0 && info.type == HELPER_CLIENT;
+ }
+
+ bool start_helper (const String &uuid, int client, uint32 context)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::start_helper (" << uuid << ")\n";
+ if (uuid.length () <= 0)
+ return false;
+
+ lock ();
+
+ if (m_current_toolbar_mode != TOOLBAR_HELPER_MODE || m_current_helper_uuid.compare (uuid) != 0)
+ {
+ SCIM_DEBUG_MAIN(1) << uuid.c_str () << ".....enter run_helper ..............\n";
+ m_helper_manager.run_helper (uuid, m_config_name, m_display_name);
+ }
+ m_current_helper_uuid = uuid;
+#ifdef ONE_HELPER_ISE_PROCESS
+ if (client == -2)
+ get_focused_context (client, context);
+
+ SCIM_DEBUG_MAIN(1) << "[start helper] client : " << client << " context : " << context << "\n";
+ uint32 ctx = get_helper_ic (client, context);
+
+ /*HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
+ if (it == m_helper_client_index.end ())*/
+ if (m_helper_uuid_count.find (uuid) == m_helper_uuid_count.end ())
+ {
+ m_client_context_helper[ctx] = uuid;
+ m_current_helper_uuid = uuid;
+ m_helper_uuid_count[uuid] = 1;
+ m_helper_uuid_state[uuid] = HELPER_HIDED;
+
+ m_helper_manager.run_helper (uuid, m_config_name, m_display_name);
+ SCIM_DEBUG_MAIN(1) << "Start HelperISE " << uuid << " ...\n";
+ }
+ else
+ {
+ ClientContextUUIDRepository::iterator it2 = m_client_context_helper.find (ctx);
+ if (it2 == m_client_context_helper.end ())
+ {
+ m_client_context_helper[ctx] = uuid;
+ m_current_helper_uuid = uuid;
+ m_helper_uuid_count[uuid] = m_helper_uuid_count[uuid] + 1;
+ }
+
+ if (m_current_active_imcontrol_id != -1
+ && m_ise_settings != NULL && m_ise_changing)
+ {
+ show_helper (uuid, m_ise_settings, m_ise_settings_len);
+ m_ise_changing = false;
+ }
+
+ SCIM_DEBUG_MAIN(1) << "Increment usage count of HelperISE " << uuid << " to "
+ << m_helper_uuid_count[uuid] << "\n";
+ }
+#endif
+ unlock ();
+
+ return true;
+ }
+
+ bool stop_helper (const String &helper_uuid, int client, uint32 context)
+ {
+ String uuid = helper_uuid;
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::stop_helper (" << uuid << ")\n";
+ if (uuid.length () <= 0)
+ return false;
+
+ lock ();
+
+ uint32 ctx = get_helper_ic (client, context);
+ HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
+ if (it != m_helper_client_index.end ())
+ {
+ Socket client_socket (it->second.id);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+
+ m_ise_exiting = true;
+ m_send_trans.put_command (SCIM_TRANS_CMD_EXIT);
+ m_send_trans.write_to_socket (client_socket);
+ SCIM_DEBUG_MAIN(1) << "Stop HelperISE " << uuid << " ...\n";
+ }
+#ifdef ONE_HELPER_ISE_PROCESS
+ if (client == -2)
+ get_focused_context (client, context);
+
+ SCIM_DEBUG_MAIN(1) << "[stop helper] client : " << client << " context : " << context << "\n";
+ uint32 ctx = get_helper_ic (client, context);
+
+ HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
+ /*if (it != m_helper_client_index.end ())*/
+ if (m_helper_uuid_count.find (uuid) != m_helper_uuid_count.end ())
+ {
+ m_client_context_helper.erase (ctx);
+
+ uint32 count = m_helper_uuid_count[uuid];
+ if (1 == count)
+ {
+ m_helper_uuid_count.erase (uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ Socket client_socket (it->second.id);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_EXIT);
+ m_send_trans.write_to_socket (client_socket);
+ SCIM_DEBUG_MAIN(1) << "Stop HelperISE " << uuid << " ...\n";
+ }
+ }
+ else
+ {
+ m_helper_uuid_count[uuid] = count - 1;
+ SCIM_DEBUG_MAIN(1) << "Decrement usage count of HelperISE " << uuid
+ << " to " << m_helper_uuid_count[uuid] << "\n";
+ }
+ }
+#endif
+ unlock ();
+
+ return true;
+ }
+
+ void focus_out_helper (const String &uuid, int client, uint32 context)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ Socket client_socket (it->second.id);
+ uint32 ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_FOCUS_OUT);
+ m_send_trans.write_to_socket (client_socket);
+ }
+ }
+
+ void focus_in_helper (const String &uuid, int client, uint32 context)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ Socket client_socket (it->second.id);
+ uint32 ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_FOCUS_IN);
+ m_send_trans.write_to_socket (client_socket);
+ }
+ }
+
+ void show_helper (const String &uuid, char *data, size_t &len)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ m_helper_uuid_state[uuid] = HELPER_SHOWED;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_SHOW_ISE);
+ m_send_trans.put_data (data, len);
+ m_send_trans.write_to_socket (client_socket);
+ }
+ return;
+ }
+
+ void hide_helper (const String &uuid)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ m_helper_uuid_state[uuid] = HELPER_HIDED;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_HIDE_ISE);
+ m_send_trans.write_to_socket (client_socket);
+ }
+ }
+
+ bool set_helper_mode (const String &uuid, uint32 &mode)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_SET_ISE_MODE);
+ m_send_trans.put_data (mode);
+ m_send_trans.write_to_socket (client_socket);
+ return true;
+ }
+
+ return false;
+ }
+
+ bool set_helper_language (const String &uuid, uint32 &language)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client = -1;
+ uint32 context = 0;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_SET_ISE_LANGUAGE);
+ m_send_trans.put_data (language);
+ m_send_trans.write_to_socket (client_socket);
+ return true;
+ }
+ return false;
+ }
+
+ bool set_helper_imdata (const String &uuid, char *imdata, size_t &len)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client = -1;
+ uint32 context = 0;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_SET_ISE_IMDATA);
+ m_send_trans.put_data (imdata, len);
+ m_send_trans.write_to_socket (client_socket);
+ return true;
+ }
+ return false;
+ }
+
+ bool set_helper_private_key (const String &uuid,
+ uint32 layout_idx,
+ uint32 key_idx,
+ char *buf, size_t len1,
+ char *value, size_t len2,
+ bool is_image)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client = -1;
+ uint32 context = 0;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ if (is_image)
+ m_send_trans.put_command (ISM_TRANS_CMD_SET_PRIVATE_KEY_BY_IMG);
+ else
+ m_send_trans.put_command (ISM_TRANS_CMD_SET_PRIVATE_KEY);
+ m_send_trans.put_data (layout_idx);
+ m_send_trans.put_data (key_idx);
+ m_send_trans.put_data (buf, len1);
+ m_send_trans.put_data (value, len2);
+ m_send_trans.write_to_socket (client_socket);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ bool set_helper_disable_key (const String &uuid,
+ uint32 layout_idx,
+ uint32 key_idx,
+ bool disabled)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client = -1;
+ uint32 context = 0;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_SET_DISABLE_KEY);
+ m_send_trans.put_data (layout_idx);
+ m_send_trans.put_data (key_idx);
+ m_send_trans.put_data (disabled);
+ m_send_trans.write_to_socket (client_socket);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ bool set_helper_layout (const String &uuid, uint32 &layout)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_SET_LAYOUT);
+ m_send_trans.put_data (layout);
+ m_send_trans.write_to_socket (client_socket);
+ return true;
+ }
+
+ return false;
+ }
+
+ bool set_helper_caps_mode (const String &uuid, uint32 &mode)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_SET_CAPS_MODE);
+ m_send_trans.put_data (mode);
+ m_send_trans.write_to_socket (client_socket);
+ return true;
+ }
+
+ return false;
+ }
+
+ bool set_helper_im_embedded_editor_im_button_set_label (const String &uuid, char *data, size_t &len)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client = -1;
+ uint32 context = 0;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_IM_BUTTON_SET_LABEL);
+ m_send_trans.put_data (data, len);
+ m_send_trans.write_to_socket (client_socket);
+ return true;
+ }
+ return false;
+ }
+
+ bool set_helper_im_embedded_editor_set_preset_text (const String &uuid, char *data, size_t &len)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client = -1;
+ uint32 context = 0;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_PRESET_TEXT);
+ m_send_trans.put_data (data, len);
+ m_send_trans.write_to_socket (client_socket);
+ return true;
+ }
+ return false;
+ }
+
+ bool set_helper_im_embedded_editor_set_text (const String &uuid, char *data, size_t &len)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client = -1;
+ uint32 context = 0;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_TEXT);
+ m_send_trans.put_data (data, len);
+ m_send_trans.write_to_socket (client_socket);
+ return true;
+ }
+ return false;
+ }
+
+ bool set_helper_im_embedded_editor_set_max_length (const String &uuid, uint32 &length)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_MAX_LENGTH);
+ m_send_trans.put_data (length);
+ m_send_trans.write_to_socket (client_socket);
+ return true;
+ }
+
+ return false;
+ }
+
+ bool set_helper_im_embedded_editor_set_button_senstivity(const String &uuid, uint32 &senstivity)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_BUTTON_SENSTIVITY);
+ m_send_trans.put_data (senstivity);
+ m_send_trans.write_to_socket (client_socket);
+ return true;
+ }
+
+ return false;
+ }
+
+ bool set_helper_im_embedded_editor_set_progress_bar(const String &uuid, uint32 &timeout,uint32 &is_showing)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_PROGRESS_BAR);
+ m_send_trans.put_data (timeout);
+ m_send_trans.put_data (is_showing);
+ m_send_trans.write_to_socket (client_socket);
+ return true;
+ }
+
+ return false;
+ }
+
+ bool set_helper_im_indicator_count_label (const String &uuid, char *data, size_t &len)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client = -1;
+ uint32 context = 0;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_IM_INDICATOR_SET_COUNT_LABEL);
+ m_send_trans.put_data (data, len);
+ m_send_trans.write_to_socket (client_socket);
+ return true;
+ }
+ return false;
+ }
+
+ void show_isf_panel (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::show_isf_panel ()\n";
+ Transaction trans;
+ Socket client_socket (client_id);
+
+ m_signal_show_panel ();
+ }
+
+ void hide_isf_panel (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::hide_isf_panel ()\n";
+ Transaction trans;
+ Socket client_socket (client_id);
+
+ m_signal_hide_panel ();
+ }
+
+ void show_ise_panel (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::show_ise_panel ()\n";
+ char *data = NULL;
+ size_t len;
+
+ m_current_active_imcontrol_id = client_id;
+
+ if (m_recv_trans.get_data (&data, len))
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ show_helper (m_current_helper_uuid, data, len);
+ }
+
+ if (data != NULL)
+ {
+ if (m_ise_settings != NULL)
+ delete [] m_ise_settings;
+ m_ise_settings = data;
+ m_ise_settings_len = len;
+ }
+ }
+
+ void hide_ise_panel (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::hide_ise_panel ()\n";
+ TOOLBAR_MODE_T mode;
+
+ mode = m_current_toolbar_mode;
+
+ if (client_id == m_current_active_imcontrol_id &&
+ TOOLBAR_HELPER_MODE == mode)
+ {
+ hide_helper (m_current_helper_uuid);
+ }
+ }
+
+ void set_default_ise (const DEFAULT_ISE_T &ise)
+ {
+ m_default_ise.type = ise.type;
+ m_default_ise.uuid = ise.uuid;
+ m_default_ise.name = ise.name;
+
+ scim_global_config_write (String (SCIM_GLOBAL_CONFIG_DEFAULT_ISE_TYPE), (int)m_default_ise.type);
+ scim_global_config_write (String (SCIM_GLOBAL_CONFIG_DEFAULT_ISE_UUID), m_default_ise.uuid);
+ scim_global_config_write (String (SCIM_GLOBAL_CONFIG_DEFAULT_ISE_NAME), m_default_ise.name);
+ scim_global_config_flush ();
+ }
+
+ void set_should_shared_ise (const bool should_shared_ise)
+ {
+ m_should_shared_ise = should_shared_ise;
+ }
+
+ bool get_helper_size (String &uuid, struct rectinfo &info)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ()) {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+ Transaction trans;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ trans.put_data (ctx);
+ trans.put_data (uuid);
+ trans.put_command (ISM_TRANS_CMD_GET_ACTIVE_ISE_SIZE);
+
+ if (trans.write_to_socket (client_socket)) {
+ int cmd;
+
+ trans.clear ();
+ if (trans.read_from_socket (client_socket)
+ && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
+ && trans.get_data (info.pos_x)
+ && trans.get_data (info.pos_y)
+ && trans.get_data (info.width)
+ && trans.get_data (info.height)) {
+ SCIM_DEBUG_MAIN (1) << "get_helper_size success\n";
+ return true;
+ } else {
+ std::cerr << "get_helper_size failed\n";
+ return false;
+ }
+ }
+ }
+ return false;
+ }
+
+ bool get_helper_imdata (String &uuid, char **imdata, size_t &len)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ()) {
+
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+ Transaction trans;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ trans.put_data (ctx);
+ trans.put_data (uuid);
+ trans.put_command (ISM_TRANS_CMD_GET_ISE_IMDATA);
+
+ int cmd;
+ if (trans.write_to_socket (client_socket)
+ && trans.read_from_socket (client_socket)
+ && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
+ && trans.get_data (imdata, len))
+ {
+ SCIM_DEBUG_MAIN (1) << "get_helper_imdata success\n";
+ return true;
+ }
+ else
+ {
+ std::cerr << "get_helper_imdata failed\n";
+ }
+ }
+ return false;
+ }
+
+ bool get_helper_im_embedded_editor_text (String &uuid, char **buf, size_t &len)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ()) {
+
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+ Transaction trans;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ trans.put_data (ctx);
+ trans.put_data (uuid);
+ trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_GET_TEXT);
+
+ int cmd;
+ if (trans.write_to_socket (client_socket)
+ && trans.read_from_socket (client_socket)
+ && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
+ && trans.get_data (buf, len))
+ {
+ SCIM_DEBUG_MAIN (1) << "get_helper_im_embedded_editor_text success\n";
+ return true;
+ }
+ else
+ {
+ std::cerr << "get_helper_im_embedded_editor_text failed\n";
+ }
+ }
+ return false;
+ }
+
+ bool get_helper_layout (String &uuid, uint32 &layout)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ()) {
+
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+ Transaction trans;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ trans.put_data (ctx);
+ trans.put_data (uuid);
+ trans.put_command (ISM_TRANS_CMD_GET_LAYOUT);
+
+ int cmd;
+ if (trans.write_to_socket (client_socket)
+ && trans.read_from_socket (client_socket)
+ && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
+ && trans.get_data (layout))
+ {
+ SCIM_DEBUG_MAIN (1) << "get_helper_layout success\n";
+ return true;
+ }
+ else
+ {
+ std::cerr << "get_helper_layout failed\n";
+ }
+ }
+ return false;
+ }
+
+ bool get_helper_layout_list (String &uuid, std::vector<uint32> &list)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
+
+ if (it != m_helper_client_index.end ()) {
+
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+ Transaction trans;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ trans.put_data (ctx);
+ trans.put_data (uuid);
+ trans.put_command (ISM_TRANS_CMD_GET_LAYOUT_LIST);
+
+ int cmd;
+ if (trans.write_to_socket (client_socket)
+ && trans.read_from_socket (client_socket, 500)
+ && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
+ && trans.get_data (list))
+ {
+ SCIM_DEBUG_MAIN (1) << "get_helper_layout_list success\n";
+ return true;
+ }
+ else
+ {
+ std::cerr << "get_helper_layout_list failed\n";
+ }
+ }
+ return false;
+ }
+
+ void get_ise_size (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::get_ise_size ()\n";
+ struct rectinfo info;
+ bool ret = false;
+
+ TOOLBAR_MODE_T mode;
+
+ mode = m_current_toolbar_mode;
+
+ if (TOOLBAR_HELPER_MODE == mode)
+ ret = get_helper_size (m_current_helper_uuid, info);
+
+ Transaction trans;
+ Socket client_socket (client_id);
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+
+ if (ret)
+ {
+ trans.put_command (SCIM_TRANS_CMD_OK);
+ trans.put_data (info.pos_x);
+ trans.put_data (info.pos_y);
+ trans.put_data (info.width);
+ trans.put_data (info.height);
+ }
+ else
+ {
+ std::cerr << "get_ise_size failed\n";
+ trans.put_command (SCIM_TRANS_CMD_FAIL);
+ }
+
+ trans.write_to_socket (client_socket);
+ }
+
+ void get_current_ise_rect (rectinfo &ise_rect)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::get_current_ise_rect ()\n";
+ TOOLBAR_MODE_T mode = m_current_toolbar_mode;
+ bool ret = false;
+
+ if (TOOLBAR_HELPER_MODE == mode)
+ ret = get_helper_size (m_current_helper_uuid, ise_rect);
+
+ if (!ret)
+ {
+ ise_rect.pos_x = 0;
+ ise_rect.pos_y = 0;
+ ise_rect.width = 0;
+ ise_rect.height = 0;
+ }
+ }
+
+ void set_ise_mode (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_mode ()\n";
+ uint32 mode;
+
+ if (m_recv_trans.get_data (mode))
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ set_helper_mode (m_current_helper_uuid, mode);
+ }
+ }
+
+ void set_ise_layout (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_layout ()\n";
+ uint32 layout;
+
+ if (m_recv_trans.get_data (layout))
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ set_helper_layout (m_current_helper_uuid, layout);
+ }
+ }
+
+ void set_ise_language (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_language ()\n";
+ uint32 language;
+
+ if (m_recv_trans.get_data (language))
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ set_helper_language (m_current_helper_uuid, language);
+ }
+ }
+
+ void set_isf_language (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_isf_language ()\n";
+ char *buf = NULL;
+ size_t len;
+
+ if (m_recv_trans.get_data (&buf, len))
+ {
+ String lang (buf);
+ m_signal_set_isf_language (lang);
+ }
+
+ if (NULL != buf)
+ delete[] buf;
+ }
+
+ void set_ise_imdata (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_imdata ()\n";
+ char *imdata = NULL;
+ size_t len;
+
+ if (m_recv_trans.get_data (&imdata, len))
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ set_helper_imdata (m_current_helper_uuid, imdata, len);
+ }
+
+ if (NULL != imdata)
+ delete [] imdata;
+ }
+
+ void set_ise_im_embedded_editor_im_button_set_label (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_im_embedded_editor_im_button_set_label ()\n";
+ char *data = NULL;
+ size_t len;
+
+ if (m_recv_trans.get_data (&data, len))
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ set_helper_im_embedded_editor_im_button_set_label (m_current_helper_uuid, data, len);
+ }
+
+ if (NULL != data)
+ delete [] data;
+ }
+
+ void set_ise_im_embedded_editor_set_preset_text (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_im_embedded_editor_set_preset_text ()\n";
+ char *data = NULL;
+ size_t len;
+
+ if (m_recv_trans.get_data (&data, len))
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ set_helper_im_embedded_editor_set_preset_text (m_current_helper_uuid, data, len);
+ }
+
+ if (NULL != data)
+ delete [] data;
+ }
+
+ void set_ise_im_embedded_editor_set_text (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_im_embedded_editor_set_text ()\n";
+ char *data = NULL;
+ size_t len;
+
+ if (m_recv_trans.get_data (&data, len))
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ set_helper_im_embedded_editor_set_text (m_current_helper_uuid, data, len);
+ }
+
+ if (NULL != data)
+ delete [] data;
+ }
+
+ void set_ise_im_embedded_editor_set_max_length (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_im_embedded_editor_set_max_length ()\n";
+ uint32 length;
+
+ if (m_recv_trans.get_data (length))
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ set_helper_im_embedded_editor_set_max_length (m_current_helper_uuid, length);
+ }
+ }
+
+ void set_ise_im_embedded_editor_set_button_senstivity (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_im_embedded_editor_set_button_senstivity ()\n";
+ uint32 senstivity;
+ if (m_recv_trans.get_data (senstivity))
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ set_helper_im_embedded_editor_set_button_senstivity (m_current_helper_uuid, senstivity);
+ }
+ }
+
+ void set_ise_im_embedded_editor_set_progress_bar (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_im_embedded_editor_set_progress_bar ()\n";
+ uint32 timeout,is_showing;
+ if (m_recv_trans.get_data (timeout) && m_recv_trans.get_data (is_showing))
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ set_helper_im_embedded_editor_set_progress_bar (m_current_helper_uuid, timeout,is_showing);
+ }
+ }
+
+ void get_ise_im_embedded_editor_text (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::get_ise_im_embedded_editor_text ()\n";
+ char *buf = NULL;
+ size_t len;
+ bool ret = false;
+
+ TOOLBAR_MODE_T mode;
+
+ mode = m_current_toolbar_mode;
+
+ if (TOOLBAR_HELPER_MODE == mode)
+ {
+ ret = get_helper_im_embedded_editor_text (m_current_helper_uuid, &buf, len);
+ }
+
+ Transaction trans;
+ Socket client_socket (client_id);
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ if (ret)
+ {
+ trans.put_command (SCIM_TRANS_CMD_OK);
+ trans.put_data (buf, len);
+ }
+ else
+ trans.put_command (SCIM_TRANS_CMD_FAIL);
+
+ trans.write_to_socket (client_socket);
+
+ if (NULL != buf)
+ delete [] buf;
+ }
+
+ void set_ise_im_indicator_count_label (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_im_indicator_count_label ()\n";
+ char *data = NULL;
+ size_t len;
+
+ if (m_recv_trans.get_data (&data, len))
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ set_helper_im_indicator_count_label (m_current_helper_uuid, data, len);
+ }
+
+ if (NULL != data)
+ delete [] data;
+ }
+
+ void get_ise_imdata (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::get_ise_imdata ()\n";
+ char *imdata = NULL;
+ size_t len;
+ bool ret = false;
+
+ TOOLBAR_MODE_T mode;
+
+ mode = m_current_toolbar_mode;
+
+ if (TOOLBAR_HELPER_MODE == mode)
+ {
+ ret = get_helper_imdata (m_current_helper_uuid, &imdata, len);
+ }
+
+ Transaction trans;
+ Socket client_socket (client_id);
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ if (ret)
+ {
+ trans.put_command (SCIM_TRANS_CMD_OK);
+ trans.put_data (imdata, len);
+ }
+ else
+ trans.put_command (SCIM_TRANS_CMD_FAIL);
+
+ trans.write_to_socket (client_socket);
+
+ if (NULL != imdata)
+ delete [] imdata;
+ }
+
+ void get_ise_layout (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::get_ise_layout ()\n";
+ uint32 layout;
+ bool ret = false;
+
+ TOOLBAR_MODE_T mode = m_current_toolbar_mode;
+
+ if (TOOLBAR_HELPER_MODE == mode)
+ ret = get_helper_layout (m_current_helper_uuid, layout);
+
+ Transaction trans;
+ Socket client_socket (client_id);
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ if (ret) {
+ trans.put_command (SCIM_TRANS_CMD_OK);
+ trans.put_data (layout);
+ } else {
+ trans.put_command (SCIM_TRANS_CMD_FAIL);
+ }
+
+ trans.write_to_socket (client_socket);
+ }
+
+ bool get_ise_layout_list (std::vector<uint32> &list)
+ {
+ bool ret = false;
+
+ TOOLBAR_MODE_T mode = m_current_toolbar_mode;
+
+ if (TOOLBAR_HELPER_MODE == mode)
+ ret = get_helper_layout_list (m_current_helper_uuid, list);
+
+ return ret;
+ }
+
+ void get_active_ise_name (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::get_active_ise_name ()\n";
+ Transaction trans;
+ Socket client_socket (client_id);
+ char *name = const_cast<char *> (m_current_ise_name.c_str ());
+ size_t len = strlen (name) + 1;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ trans.put_command (SCIM_TRANS_CMD_OK);
+ trans.put_data (name, len);
+ trans.write_to_socket (client_socket);
+ }
+
+ void get_ise_list (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::get_ise_list ()\n";
+ std::vector<String> strlist;
+ m_signal_get_ise_list (strlist);
+
+ Transaction trans;
+ Socket client_socket (client_id);
+ char *buf = NULL;
+ size_t len;
+ uint32 num;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ trans.put_command (SCIM_TRANS_CMD_OK);
+
+ num = strlist.size ();
+ trans.put_data (num);
+ for (unsigned int i = 0; i < num; i++)
+ {
+ buf = const_cast<char *>(strlist[i].c_str ());
+ len = strlen (buf) + 1;
+ trans.put_data (buf, len);
+ }
+
+ trans.write_to_socket (client_socket);
+ }
+
+ void get_language_list (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::get_language_list ()\n";
+ std::vector<String> strlist;
+
+ m_signal_get_language_list (strlist);
+
+ Transaction trans;
+ Socket client_socket (client_id);
+ char *buf = NULL;
+ size_t len;
+ uint32 num;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ trans.put_command (SCIM_TRANS_CMD_OK);
+
+ num = strlist.size ();
+ trans.put_data (num);
+ for (unsigned int i = 0; i < num; i++)
+ {
+ buf = const_cast<char *>(strlist[i].c_str ());
+ len = strlen (buf) + 1;
+ trans.put_data (buf, len);
+ }
+
+ trans.write_to_socket (client_socket);
+ }
+
+ void get_all_language (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::get_all_language ()\n";
+ std::vector<String> strlist;
+
+ m_signal_get_all_language (strlist);
+
+ Transaction trans;
+ Socket client_socket (client_id);
+ char *buf = NULL;
+ size_t len;
+ uint32 num;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ trans.put_command (SCIM_TRANS_CMD_OK);
+
+ num = strlist.size ();
+ trans.put_data (num);
+ for (unsigned int i = 0; i < num; i++)
+ {
+ buf = const_cast<char *>(strlist[i].c_str ());
+ len = strlen (buf) + 1;
+ trans.put_data (buf, len);
+ }
+
+ trans.write_to_socket (client_socket);
+ }
+
+ void get_ise_language (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::get_ise_language ()\n";
+ std::vector<String> strlist;
+ char *buf = NULL;
+ size_t len;
+ Transaction trans;
+ Socket client_socket (client_id);
+
+ if (!(m_recv_trans.get_data (&buf, len)))
+ {
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ trans.put_command (SCIM_TRANS_CMD_FAIL);
+ trans.write_to_socket (client_socket);
+ if (NULL != buf)
+ delete[] buf;
+ return;
+ }
+
+ m_signal_get_ise_language (buf, strlist);
+
+ if (buf)
+ {
+ delete [] buf;
+ buf = NULL;
+ }
+
+ uint32 num;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ trans.put_command (SCIM_TRANS_CMD_OK);
+
+ num = strlist.size ();
+ trans.put_data (num);
+ for (unsigned int i = 0; i < num; i++)
+ {
+ buf = const_cast<char *>(strlist[i].c_str ());
+ len = strlen (buf) + 1;
+ trans.put_data (buf, len);
+ }
+
+ trans.write_to_socket (client_socket);
+ }
+
+ bool reset_ise_option (int client_id)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::resect_ise_option ()\n";
+
+ int client = -1;
+ uint32 context;
+
+ lock ();
+
+ ClientContextUUIDRepository::iterator it = m_client_context_uuids.begin ();
+ if (it != m_client_context_uuids.end ()) {
+ get_imengine_client_context (it->first, client, context);
+ }
+
+ if (client >= 0) {
+ Socket client_socket (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data ((uint32) context);
+ m_send_trans.put_command (ISM_TRANS_CMD_RESET_ISE_OPTION);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ Transaction trans;
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ trans.put_command (SCIM_TRANS_CMD_OK);
+ Socket client_socket (client_id);
+ trans.write_to_socket (client_socket);
+
+ return client >= 0;
+ }
+
+ bool set_helper_char_count (const String &uuid, char *buf, size_t &len)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client = -1;
+ uint32 context = 0;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_SET_INDICATOR_CHAR_COUNT);
+ m_send_trans.put_data (buf, len);
+ m_send_trans.write_to_socket (client_socket);
+ return true;
+ }
+ return false;
+ }
+
+ void set_ise_char_count (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_char_count ()\n";
+ char *buf = NULL;
+ size_t len;
+
+ if (m_recv_trans.get_data (&buf, len))
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ set_helper_char_count (m_current_helper_uuid, buf, len);
+ }
+
+ if (NULL != buf)
+ delete [] buf;
+ }
+
+ bool find_active_ise_by_uuid (String uuid)
+ {
+ HelperInfoRepository::iterator iter = m_helper_info_repository.begin ();
+ for (; iter != m_helper_info_repository.end (); iter++)
+ {
+ if (!uuid.compare (iter->second.uuid))
+ return true;
+ }
+
+ return false;
+ }
+
+ void set_active_ise_by_uuid (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_active_ise_by_uuid ()\n";
+ char *buf = NULL;
+ size_t len;
+ Transaction trans;
+ Socket client_socket (client_id);
+ m_current_active_imcontrol_id = client_id;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ if (!(m_recv_trans.get_data (&buf, len)))
+ {
+ trans.put_command (SCIM_TRANS_CMD_FAIL);
+ trans.write_to_socket (client_socket);
+ if (NULL != buf)
+ delete[] buf;
+ return;
+ }
+
+ String uuid (buf);
+ ISE_INFO info;
+
+ if (!m_signal_get_ise_info_by_uuid (uuid, info))
+ {
+ trans.put_command (SCIM_TRANS_CMD_FAIL);
+ trans.write_to_socket (client_socket);
+ if (NULL != buf)
+ delete[] buf;
+ return;
+ }
+
+ if (info.type == TOOLBAR_KEYBOARD_MODE)
+ {
+ m_signal_set_active_ise_by_uuid (uuid, 1);
+ trans.put_command (SCIM_TRANS_CMD_OK);
+ trans.write_to_socket (client_socket);
+ if (NULL != buf)
+ delete[] buf;
+ return;
+ }
+ else if (info.option & ISM_ISE_HIDE_IN_CONTROL_PANEL)
+ {
+ int count = _id_count--;
+ if (info.type == TOOLBAR_HELPER_MODE)
+ {
+ m_current_toolbar_mode = TOOLBAR_HELPER_MODE;
+ if (uuid != m_current_helper_uuid)
+ m_last_helper_uuid = m_current_helper_uuid;
+ start_helper (uuid, count, DEFAULT_CONTEXT_VALUE);
+ IMControlRepository::iterator iter = m_imcontrol_repository.find (client_id);
+ if (iter == m_imcontrol_repository.end ())
+ {
+ struct IMControlStub stub;
+ stub.count.clear ();
+ stub.info.clear ();
+ stub.info.push_back (info);
+ stub.count.push_back (count);
+ m_imcontrol_repository[client_id] = stub;
+ }
+ else
+ {
+ iter->second.info.push_back (info);
+ iter->second.count.push_back (count);
+ }
+ }
+ }
+ else
+ m_signal_set_active_ise_by_uuid (uuid, 1);
+
+ if (find_active_ise_by_uuid (uuid))
+ {
+ trans.put_command (SCIM_TRANS_CMD_OK);
+ trans.write_to_socket (client_socket);
+ }
+ else
+ m_ise_pending_repository[uuid] = client_id;
+
+ if (NULL != buf)
+ delete[] buf;
+ }
+
+ bool find_active_ise_by_name (String name)
+ {
+ HelperInfoRepository::iterator iter = m_helper_info_repository.begin ();
+ for (; iter != m_helper_info_repository.end (); iter++)
+ {
+ if (!name.compare (iter->second.name))
+ return true;
+ }
+
+ return false;
+ }
+
+ void set_active_ise_by_name (int client_id)
+ {
+ char *buf = NULL;
+ size_t len;
+ Transaction trans;
+ Socket client_socket (client_id);
+ m_current_active_imcontrol_id = client_id;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ if (!(m_recv_trans.get_data (&buf, len)))
+ {
+ trans.put_command (SCIM_TRANS_CMD_FAIL);
+ trans.write_to_socket (client_socket);
+ if (NULL != buf)
+ delete[] buf;
+ return;
+ }
+
+ String name (buf);
+ ISE_INFO info;
+
+ if (!m_signal_get_ise_info_by_name (name, info))
+ {
+ trans.put_command (SCIM_TRANS_CMD_FAIL);
+ trans.write_to_socket (client_socket);
+ if (NULL != buf)
+ delete[] buf;
+ return;
+ }
+
+ if (info.type == TOOLBAR_KEYBOARD_MODE)
+ {
+ m_signal_set_keyboard_ise (ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_NAME, name);
+ trans.put_command (SCIM_TRANS_CMD_OK);
+ trans.write_to_socket (client_socket);
+ if (NULL != buf)
+ delete[] buf;
+ return;
+ }
+ else if (info.option & ISM_ISE_HIDE_IN_CONTROL_PANEL)
+ {
+ int count = _id_count--;
+ if (info.type == TOOLBAR_HELPER_MODE)
+ {
+ m_current_toolbar_mode = TOOLBAR_HELPER_MODE;
+ if (info.uuid != m_current_helper_uuid)
+ m_last_helper_uuid = m_current_helper_uuid;
+ start_helper (info.uuid, count, DEFAULT_CONTEXT_VALUE);
+ IMControlRepository::iterator iter = m_imcontrol_repository.find (client_id);
+ if (iter == m_imcontrol_repository.end ())
+ {
+ struct IMControlStub stub;
+ stub.count.clear ();
+ stub.info.clear ();
+ stub.info.push_back (info);
+ stub.count.push_back (count);
+ m_imcontrol_repository[client_id] = stub;
+ }
+ else
+ {
+ iter->second.info.push_back (info);
+ iter->second.count.push_back (count);
+ }
+ }
+ }
+ else
+ m_signal_set_active_ise_by_name (name);
+
+ if (find_active_ise_by_name (name))
+ {
+ trans.put_command (SCIM_TRANS_CMD_OK);
+ trans.write_to_socket (client_socket);
+ }
+ else
+ m_ise_pending_repository[name] = client_id;
+
+ if (NULL != buf)
+ delete[] buf;
+ }
+
+ void update_isf_control_status (const bool showed)
+ {
+ for (ClientRepository::iterator iter = m_client_repository.begin ();
+ iter != m_client_repository.end (); ++iter)
+ {
+ if (IMCONTROL_CLIENT == iter->second.type
+ && iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
+ {
+ Socket client_socket (iter->first);
+ Transaction trans;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ if (showed)
+ trans.put_command (ISM_TRANS_CMD_ISF_CONTROL_SHOWED);
+ else
+ trans.put_command (ISM_TRANS_CMD_ISF_CONTROL_HIDED);
+ trans.write_to_socket (client_socket);
+ break;
+ }
+ }
+ return;
+ }
+
+ void set_ise_private_key (int client_id, bool is_image)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_private_key ()\n";
+ uint32 layout_idx, key_idx;
+ char *label = NULL, *value = NULL;
+ size_t len1, len2;
+
+ if (m_recv_trans.get_data (layout_idx)
+ && m_recv_trans.get_data (key_idx)
+ && m_recv_trans.get_data (&label, len1)
+ && m_recv_trans.get_data (&value, len2))
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ set_helper_private_key (m_current_helper_uuid,
+ layout_idx,
+ key_idx,
+ label,
+ len1,
+ value,
+ len2,
+ is_image);
+ }
+
+ if (NULL != label)
+ delete[] label;
+ if (NULL != value)
+ delete[] value;
+ }
+
+ void set_ise_disable_key (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_disable_key ()\n";
+ uint32 layout_idx, key_idx, disabled;
+
+ if (m_recv_trans.get_data (layout_idx)
+ && m_recv_trans.get_data (key_idx)
+ && m_recv_trans.get_data (disabled))
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ set_helper_disable_key (m_current_helper_uuid,
+ layout_idx,
+ key_idx,
+ disabled);
+ }
+ }
+
+ int get_active_ise_list (std::vector<String> &strlist)
+ {
+ strlist.clear ();
+ m_helper_manager.get_active_ise_list (strlist);
+ return (int)(strlist.size ());
+ }
+
+ void reset_helper_context (const String &uuid)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_RESET_ISE_CONTEXT);
+ m_send_trans.write_to_socket (client_socket);
+ }
+ }
+
+ void reset_ise_context (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::reset_ise_context ()\n";
+ TOOLBAR_MODE_T mode;
+
+ mode = m_current_toolbar_mode;
+
+ if (TOOLBAR_HELPER_MODE == mode)
+ {
+ reset_helper_context (m_current_helper_uuid);
+ }
+ }
+
+ bool set_helper_screen_direction (const String &uuid, uint32 &direction)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_SET_ISE_SCREEN_DIRECTION);
+ m_send_trans.put_data (direction);
+ m_send_trans.write_to_socket (client_socket);
+ return true;
+ }
+
+ return false;
+ }
+
+ void set_ise_screen_direction (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_screen_direction ()\n";
+ uint32 direction;
+
+ if (m_recv_trans.get_data (direction))
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ set_helper_screen_direction (m_current_helper_uuid, direction);
+ }
+ }
+
+ void set_ise_caps_mode (int client_id)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_caps_mode ()\n";
+ uint32 mode;
+
+ if (m_recv_trans.get_data (mode))
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ set_helper_caps_mode (m_current_helper_uuid, mode);
+ }
+ }
+
+ int send_display_name (String &name)
+ {
+ return m_helper_manager.send_display_name (name);
+ }
+
+ bool reload_config (void)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::reload_config ()\n";
+
+ lock ();
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_command (SCIM_TRANS_CMD_RELOAD_CONFIG);
+
+ for (ClientRepository::iterator it = m_client_repository.begin ();
+ it != m_client_repository.end (); ++it) {
+
+ if (it->second.type == IMCONTROL_ACT_CLIENT
+ || it->second.type == IMCONTROL_CLIENT
+ || it->second.type == HELPER_ACT_CLIENT)
+ continue;
+
+ Socket client_socket (it->first);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+ return true;
+ }
+
+ bool exit (void)
+ {
+ SCIM_DEBUG_MAIN(1) << "PanelAgent::exit ()\n";
+
+ lock ();
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_command (SCIM_TRANS_CMD_EXIT);
+
+ for (ClientRepository::iterator it = m_client_repository.begin ();
+ it != m_client_repository.end (); ++it) {
+ Socket client_socket (it->first);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+
+ stop ();
+
+ return true;
+ }
+
+ bool filter_event (int fd)
+ {
+ SCIM_DEBUG_MAIN (1) << "PanelAgent::filter_event ()\n";
+
+ return m_socket_server.filter_event (fd);
+ }
+
+ bool filter_exception_event (int fd)
+ {
+ SCIM_DEBUG_MAIN (1) << "PanelAgent::filter_exception_event ()\n";
+
+ return m_socket_server.filter_exception_event (fd);
+ }
+
+ int get_server_id ()
+ {
+ SCIM_DEBUG_MAIN (1) << "PanelAgent::get_server_id ()\n";
+
+ return m_socket_server.get_id ();
+ }
+
+ void set_ise_changing (bool changing)
+ {
+ SCIM_DEBUG_MAIN (1) << "PanelAgent::set_ise_changing ()\n";
+ m_ise_changing = changing;
+ }
+
+ void update_ise_list (std::vector<String> &strList)
+ {
+ /* send ise list to frontend */
+ String dst_str = scim_combine_string_list (strList);
+ m_helper_manager.send_ise_list (dst_str);
+
+ /* request PanelClient to update keyboard ise list */
+ update_keyboard_ise_list ();
+ }
+
+ Connection signal_connect_reload_config (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_reload_config.connect (slot);
+ }
+
+ Connection signal_connect_turn_on (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_turn_on.connect (slot);
+ }
+
+ Connection signal_connect_turn_off (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_turn_off.connect (slot);
+ }
+
+ Connection signal_connect_show_panel (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_show_panel.connect (slot);
+ }
+
+ Connection signal_connect_hide_panel (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_hide_panel.connect (slot);
+ }
+
+ Connection signal_connect_update_screen (PanelAgentSlotInt *slot)
+ {
+ return m_signal_update_screen.connect (slot);
+ }
+
+ Connection signal_connect_update_spot_location (PanelAgentSlotIntIntInt *slot)
+ {
+ return m_signal_update_spot_location.connect (slot);
+ }
+
+ Connection signal_connect_update_factory_info (PanelAgentSlotFactoryInfo *slot)
+ {
+ return m_signal_update_factory_info.connect (slot);
+ }
+
+ Connection signal_connect_start_default_ise (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_start_default_ise.connect (slot);
+ }
+
+ Connection signal_connect_set_candidate_ui (PanelAgentSlotIntInt *slot)
+ {
+ return m_signal_set_candidate_ui.connect (slot);
+ }
+
+ Connection signal_connect_get_candidate_ui (PanelAgentSlotIntInt2 *slot)
+ {
+ return m_signal_get_candidate_ui.connect (slot);
+ }
+
+ Connection signal_connect_set_candidate_position (PanelAgentSlotIntInt *slot)
+ {
+ return m_signal_set_candidate_position.connect (slot);
+ }
+
+ Connection signal_connect_get_candidate_rect (PanelAgentSlotRect *slot)
+ {
+ return m_signal_get_candidate_rect.connect (slot);
+ }
+
+ Connection signal_connect_set_keyboard_ise (PanelAgentSlotIntString *slot)
+ {
+ return m_signal_set_keyboard_ise.connect (slot);
+ }
+
+ Connection signal_connect_get_keyboard_ise (PanelAgentSlotString2 *slot)
+ {
+ return m_signal_get_keyboard_ise.connect (slot);
+ }
+
+ Connection signal_connect_show_help (PanelAgentSlotString *slot)
+ {
+ return m_signal_show_help.connect (slot);
+ }
+
+ Connection signal_connect_show_factory_menu (PanelAgentSlotFactoryInfoVector *slot)
+ {
+ return m_signal_show_factory_menu.connect (slot);
+ }
+
+ Connection signal_connect_show_preedit_string (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_show_preedit_string.connect (slot);
+ }
+
+ Connection signal_connect_show_aux_string (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_show_aux_string.connect (slot);
+ }
+
+ Connection signal_connect_show_lookup_table (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_show_lookup_table.connect (slot);
+ }
+
+ Connection signal_connect_show_associate_table (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_show_associate_table.connect (slot);
+ }
+
+ Connection signal_connect_hide_preedit_string (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_hide_preedit_string.connect (slot);
+ }
+
+ Connection signal_connect_hide_aux_string (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_hide_aux_string.connect (slot);
+ }
+
+ Connection signal_connect_hide_lookup_table (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_hide_lookup_table.connect (slot);
+ }
+
+ Connection signal_connect_hide_associate_table (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_hide_associate_table.connect (slot);
+ }
+
+ Connection signal_connect_update_preedit_string (PanelAgentSlotAttributeString *slot)
+ {
+ return m_signal_update_preedit_string.connect (slot);
+ }
+
+ Connection signal_connect_update_preedit_caret (PanelAgentSlotInt *slot)
+ {
+ return m_signal_update_preedit_caret.connect (slot);
+ }
+
+ Connection signal_connect_update_aux_string (PanelAgentSlotAttributeString *slot)
+ {
+ return m_signal_update_aux_string.connect (slot);
+ }
+
+ Connection signal_connect_update_lookup_table (PanelAgentSlotLookupTable *slot)
+ {
+ return m_signal_update_lookup_table.connect (slot);
+ }
+
+ Connection signal_connect_update_associate_table (PanelAgentSlotLookupTable *slot)
+ {
+ return m_signal_update_associate_table.connect (slot);
+ }
+
+ Connection signal_connect_register_properties (PanelAgentSlotPropertyList *slot)
+ {
+ return m_signal_register_properties.connect (slot);
+ }
+
+ Connection signal_connect_update_property (PanelAgentSlotProperty *slot)
+ {
+ return m_signal_update_property.connect (slot);
+ }
+
+ Connection signal_connect_register_helper_properties (PanelAgentSlotIntPropertyList *slot)
+ {
+ return m_signal_register_helper_properties.connect (slot);
+ }
+
+ Connection signal_connect_update_helper_property (PanelAgentSlotIntProperty *slot)
+ {
+ return m_signal_update_helper_property.connect (slot);
+ }
+
+ Connection signal_connect_register_helper (PanelAgentSlotIntHelperInfo *slot)
+ {
+ return m_signal_register_helper.connect (slot);
+ }
+
+ Connection signal_connect_remove_helper (PanelAgentSlotInt *slot)
+ {
+ return m_signal_remove_helper.connect (slot);
+ }
+
+ Connection signal_connect_set_active_ise_by_uuid (PanelAgentSlotStringBool *slot)
+ {
+ return m_signal_set_active_ise_by_uuid.connect (slot);
+ }
+
+ Connection signal_connect_set_active_ise_by_name (PanelAgentSlotString *slot)
+ {
+ return m_signal_set_active_ise_by_name.connect (slot);
+ }
+
+ Connection signal_connect_focus_in (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_focus_in.connect (slot);
+ }
+
+ Connection signal_connect_focus_out (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_focus_out.connect (slot);
+ }
+
+ Connection signal_connect_get_ise_list (PanelAgentSlotBoolStringVector *slot)
+ {
+ return m_signal_get_ise_list.connect (slot);
+ }
+
+ Connection signal_connect_get_keyboard_ise_list (PanelAgentSlotBoolStringVector *slot)
+ {
+ return m_signal_get_keyboard_ise_list.connect (slot);
+ }
+ Connection signal_connect_launch_helper_ise_list_selection (PanelAgentSlotInt *slot)
+ {
+ return m_signal_launch_helper_ise_list_selection.connect (slot);
+ }
+
+ Connection signal_connect_get_language_list (PanelAgentSlotStringVector *slot)
+ {
+ return m_signal_get_language_list.connect (slot);
+ }
+
+ Connection signal_connect_get_all_language (PanelAgentSlotStringVector *slot)
+ {
+ return m_signal_get_all_language.connect (slot);
+ }
+
+ Connection signal_connect_get_ise_language (PanelAgentSlotStrStringVector *slot)
+ {
+ return m_signal_get_ise_language.connect (slot);
+ }
+
+ Connection signal_connect_set_isf_language (PanelAgentSlotString *slot)
+ {
+ return m_signal_set_isf_language.connect (slot);
+ }
+
+ Connection signal_connect_get_ise_info_by_uuid (PanelAgentSlotStringISEINFO *slot)
+ {
+ return m_signal_get_ise_info_by_uuid.connect (slot);
+ }
+
+ Connection signal_connect_get_ise_info_by_name (PanelAgentSlotStringISEINFO *slot)
+ {
+ return m_signal_get_ise_info_by_name.connect (slot);
+ }
+
+ Connection signal_connect_send_key_event (PanelAgentSlotKeyEvent *slot)
+ {
+ return m_signal_send_key_event.connect (slot);
+ }
+
+ Connection signal_connect_accept_connection (PanelAgentSlotInt *slot)
+ {
+ return m_signal_accept_connection.connect (slot);
+ }
+
+ Connection signal_connect_close_connection (PanelAgentSlotInt *slot)
+ {
+ return m_signal_close_connection.connect (slot);
+ }
+
+ Connection signal_connect_exit (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_exit.connect (slot);
+ }
+
+ Connection signal_connect_transaction_start (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_transaction_start.connect (slot);
+ }
+
+ Connection signal_connect_transaction_end (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_transaction_end.connect (slot);
+ }
+
+ Connection signal_connect_lock (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_lock.connect (slot);
+ }
+
+ Connection signal_connect_unlock (PanelAgentSlotVoid *slot)
+ {
+ return m_signal_unlock.connect (slot);
+ }
+
+private:
+ bool socket_check_client_connection (const Socket &client)
+ {
+ SCIM_DEBUG_MAIN (3) << "PanelAgent::socket_check_client_connection (" << client.get_id () << ")\n";
+
+ unsigned char buf [sizeof(uint32)];
+
+ int nbytes = client.read_with_timeout (buf, sizeof(uint32), m_socket_timeout);
+
+ if (nbytes == sizeof (uint32))
+ return true;
+
+ if (nbytes < 0) {
+ SCIM_DEBUG_MAIN (4) << "Error occurred when reading socket: " << client.get_error_message () << ".\n";
+ } else {
+ SCIM_DEBUG_MAIN (4) << "Timeout when reading socket.\n";
+ }
+
+ return false;
+ }
+
+ void socket_accept_callback (SocketServer *server,
+ const Socket &client)
+ {
+ SCIM_DEBUG_MAIN (2) << "PanelAgent::socket_accept_callback (" << client.get_id () << ")\n";
+
+ lock ();
+ if (m_should_exit) {
+ SCIM_DEBUG_MAIN (3) << "Exit Socket Server Thread.\n";
+ server->shutdown ();
+ } else
+ m_signal_accept_connection (client.get_id ());
+ unlock ();
+ }
+
+ void socket_receive_callback (SocketServer *server,
+ const Socket &client)
+ {
+ int client_id = client.get_id ();
+ int cmd = 0;
+ uint32 key = 0;
+ uint32 context = 0;
+ String uuid;
+ bool current = false;
+ bool last = false;
+
+ ClientInfo client_info;
+
+ SCIM_DEBUG_MAIN (1) << "PanelAgent::socket_receive_callback (" << client_id << ")\n";
+
+ /* If the connection is closed then close this client. */
+ if (!socket_check_client_connection (client)) {
+ socket_close_connection (server, client);
+ return;
+ }
+
+ client_info = socket_get_client_info (client_id);
+
+ /* If it's a new client, then request to open the connection first. */
+ if (client_info.type == UNKNOWN_CLIENT) {
+ socket_open_connection (server, client);
+ return;
+ }
+
+ /* If can not read the transaction,
+ * or the transaction is not started with SCIM_TRANS_CMD_REQUEST,
+ * or the key is mismatch,
+ * just return. */
+ if (!m_recv_trans.read_from_socket (client, m_socket_timeout) ||
+ !m_recv_trans.get_command (cmd) || cmd != SCIM_TRANS_CMD_REQUEST ||
+ !m_recv_trans.get_data (key) || key != (uint32) client_info.key)
+ return;
+
+ if (client_info.type == FRONTEND_CLIENT) {
+ if (m_recv_trans.get_data (context)) {
+ SCIM_DEBUG_MAIN (1) << "PanelAgent::FrontEnd Client, context = " << context << "\n";
+ socket_transaction_start();
+ while (m_recv_trans.get_command (cmd)) {
+ SCIM_DEBUG_MAIN (3) << "PanelAgent::cmd = " << cmd << "\n";
+
+ if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_INPUT_CONTEXT) {
+ if (m_recv_trans.get_data (uuid)) {
+ SCIM_DEBUG_MAIN (2) << "PanelAgent::register_input_context (" << client_id << "," << "," << context << "," << uuid << ")\n";
+ uint32 ctx = get_helper_ic (client_id, context);
+ m_client_context_uuids [ctx] = uuid;
+ }
+ continue;
+ }
+
+ if (cmd == ISM_TRANS_CMD_PANEL_START_DEFAULT_ISE) {
+ if ((m_default_ise.type == TOOLBAR_HELPER_MODE) && (m_default_ise.uuid.length () > 0))
+ {
+ m_current_toolbar_mode = TOOLBAR_HELPER_MODE;
+ start_helper (m_default_ise.uuid, client_id, context);
+ }
+ else if (m_default_ise.type == TOOLBAR_KEYBOARD_MODE)
+ {
+ m_current_toolbar_mode = TOOLBAR_KEYBOARD_MODE;
+ }
+ continue;
+ }
+
+ if (cmd == SCIM_TRANS_CMD_PANEL_REMOVE_INPUT_CONTEXT) {
+ uint32 ctx = get_helper_ic (client_id, context);
+ m_client_context_uuids.erase (ctx);
+#ifdef ONE_HELPER_ISE_PROCESS
+ if (m_client_context_helper.find (ctx) != m_client_context_helper.end ())
+ stop_helper (m_client_context_helper[ctx], client_id, context);
+#endif
+ if (ctx == get_helper_ic (m_current_socket_client, m_current_client_context))
+ {
+ lock ();
+ m_current_socket_client = m_last_socket_client;
+ m_current_client_context = m_last_client_context;
+ m_current_context_uuid = m_last_context_uuid;
+ m_last_socket_client = -1;
+ m_last_client_context = 0;
+ m_last_context_uuid = String ("");
+ if (m_current_socket_client == -1)
+ {
+ unlock ();
+ socket_update_control_panel ();
+ }
+ else
+ unlock ();
+ }
+ else if (ctx == get_helper_ic (m_last_socket_client, m_last_client_context))
+ {
+ lock ();
+ m_last_socket_client = -1;
+ m_last_client_context = 0;
+ m_last_context_uuid = String ("");
+ unlock ();
+ }
+ continue;
+ }
+
+ if (cmd == SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT) {
+ socket_reset_input_context (client_id, context);
+ continue;
+ }
+
+ if (cmd == SCIM_TRANS_CMD_FOCUS_IN) {
+ get_helper_ic (client_id, context);
+ m_signal_focus_in ();
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ focus_in_helper (m_current_helper_uuid, client_id, context);
+#ifdef ONE_HELPER_ISE_PROCESS
+ uint32 ctx = get_helper_ic (client_id, context);
+ ClientContextUUIDRepository::iterator it = m_client_context_helper.find (ctx);
+ if (it != m_client_context_helper.end ())
+ {
+ if (m_should_shared_ise)
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ {
+ if (m_current_helper_uuid != it->second)
+ {
+ stop_helper (it->second, client_id, context);
+ start_helper (m_current_helper_uuid, client_id, context);
+ }
+ focus_in_helper (m_current_helper_uuid, client_id, context);
+ }
+ else if (TOOLBAR_KEYBOARD_MODE == m_current_toolbar_mode)
+ stop_helper (it->second, client_id, context);
+ }
+ else
+ {
+ /* focus in the helper if the context is associated with some helper */
+ m_current_toolbar_mode = TOOLBAR_HELPER_MODE;
+ m_current_helper_uuid = it->second;
+ focus_in_helper (m_current_helper_uuid, client_id, context);
+ }
+ }
+ else
+ {
+ if (m_should_shared_ise)
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ {
+ start_helper (m_current_helper_uuid, client_id, context);
+ focus_in_helper (m_current_helper_uuid, client_id, context);
+ }
+ }
+ else
+ {
+ /* come here if the context is associated with some imengine */
+ m_current_toolbar_mode = TOOLBAR_KEYBOARD_MODE;
+ }
+ }
+#endif
+ if (m_recv_trans.get_data (uuid)) {
+ SCIM_DEBUG_MAIN (2) << "PanelAgent::focus_in (" << client_id << "," << "," << context << "," << uuid << ")\n";
+ lock ();
+ if (m_current_socket_client >= 0) {
+ m_last_socket_client = m_current_socket_client;
+ m_last_client_context = m_current_client_context;
+ m_last_context_uuid = m_current_context_uuid;
+ }
+ m_current_socket_client = client_id;
+ m_current_client_context = context;
+ m_current_context_uuid = uuid;
+ unlock ();
+ }
+ continue;
+ }
+
+ if (cmd == ISM_TRANS_CMD_TURN_ON_LOG) {
+ socket_turn_on_log ();
+ continue;
+ }
+
+ current = last = false;
+ uuid.clear ();
+
+ /* Get the context uuid from the client context registration table. */
+ {
+ ClientContextUUIDRepository::iterator it = m_client_context_uuids.find (get_helper_ic (client_id, context));
+ if (it != m_client_context_uuids.end ())
+ uuid = it->second;
+ }
+
+ if (m_current_socket_client == client_id && m_current_client_context == context) {
+ current = true;
+ if (!uuid.length ()) uuid = m_current_context_uuid;
+ } else if (m_last_socket_client == client_id && m_last_client_context == context) {
+ last = true;
+ if (!uuid.length ()) uuid = m_last_context_uuid;
+ }
+
+ /* Skip to the next command and continue, if it's not current or last focused. */
+ if (!uuid.length ()) {
+ SCIM_DEBUG_MAIN (3) << "PanelAgent:: Couldn't find context uuid.\n";
+ while (m_recv_trans.get_data_type () != SCIM_TRANS_DATA_COMMAND && m_recv_trans.get_data_type () != SCIM_TRANS_DATA_UNKNOWN)
+ m_recv_trans.skip_data ();
+ continue;
+ }
+
+ if (cmd == SCIM_TRANS_CMD_START_HELPER) {
+ socket_start_helper (client_id, context, uuid);
+ continue;
+ }
+ else if (cmd == SCIM_TRANS_CMD_SEND_HELPER_EVENT) {
+ socket_send_helper_event (client_id, context, uuid);
+ continue;
+ }
+ else if (cmd == SCIM_TRANS_CMD_STOP_HELPER) {
+ socket_stop_helper (client_id, context, uuid);
+ continue;
+ }
+
+ /* If it's not focused, just continue. */
+ if ((!current && !last) || (last && m_current_socket_client >= 0)) {
+ SCIM_DEBUG_MAIN (3) << "PanelAgent::Not current focused.\n";
+ while (m_recv_trans.get_data_type () != SCIM_TRANS_DATA_COMMAND && m_recv_trans.get_data_type () != SCIM_TRANS_DATA_UNKNOWN)
+ m_recv_trans.skip_data ();
+ continue;
+ }
+
+ /* Client must focus in before do any other things. */
+ if (cmd == SCIM_TRANS_CMD_PANEL_TURN_ON)
+ socket_turn_on ();
+ else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_OFF)
+ socket_turn_off ();
+ else if (cmd == SCIM_TRANS_CMD_UPDATE_SCREEN)
+ socket_update_screen ();
+ else if (cmd == SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION)
+ socket_update_spot_location ();
+ else if (cmd == ISM_TRANS_CMD_UPDATE_CURSOR_POSITION)
+ socket_update_cursor_position ();
+ else if (cmd == SCIM_TRANS_CMD_PANEL_UPDATE_FACTORY_INFO)
+ socket_update_factory_info ();
+ else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING)
+ socket_show_preedit_string ();
+ else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING)
+ socket_show_aux_string ();
+ else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE)
+ socket_show_lookup_table ();
+ else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE)
+ socket_show_associate_table ();
+ else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING)
+ socket_hide_preedit_string ();
+ else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING)
+ socket_hide_aux_string ();
+ else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE)
+ socket_hide_lookup_table ();
+ else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE)
+ socket_hide_associate_table ();
+ else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING)
+ socket_update_preedit_string ();
+ else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET)
+ socket_update_preedit_caret ();
+ else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING)
+ socket_update_aux_string ();
+ else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE)
+ socket_update_lookup_table ();
+ else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE)
+ socket_update_associate_table ();
+ else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES)
+ socket_register_properties ();
+ else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY)
+ socket_update_property ();
+ else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_HELP)
+ socket_show_help ();
+ else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_FACTORY_MENU)
+ socket_show_factory_menu ();
+ else if (cmd == SCIM_TRANS_CMD_FOCUS_OUT) {
+ m_signal_focus_out ();
+ lock ();
+ TOOLBAR_MODE_T mode = m_current_toolbar_mode;
+
+ if (TOOLBAR_HELPER_MODE == mode)
+ focus_out_helper (m_current_helper_uuid, client_id, context);
+
+ if (m_current_socket_client >= 0) {
+ m_last_socket_client = m_current_socket_client;
+ m_last_client_context = m_current_client_context;
+ m_last_context_uuid = m_current_context_uuid;
+ }
+ m_current_socket_client = -1;
+ m_current_client_context = 0;
+ m_current_context_uuid = String ("");
+ unlock ();
+ }
+ }
+ socket_transaction_end ();
+ }
+ } else if (client_info.type == HELPER_CLIENT) {
+ socket_transaction_start ();
+ while (m_recv_trans.get_command (cmd)) {
+ if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_HELPER) {
+ socket_helper_register_helper (client_id);
+ }
+ }
+ socket_transaction_end ();
+ }else if (client_info.type == HELPER_ACT_CLIENT) {
+ socket_transaction_start ();
+ while (m_recv_trans.get_command (cmd)) {
+ if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_ACTIVE_HELPER) {
+ socket_helper_register_helper_passive (client_id);
+ } else if (cmd == SCIM_TRANS_CMD_COMMIT_STRING) {
+ socket_helper_commit_string (client_id);
+ } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING) {
+ socket_helper_show_preedit_string (client_id);
+ } else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING) {
+ socket_show_aux_string ();
+ } else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE) {
+ socket_show_lookup_table ();
+ } else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE) {
+ socket_show_associate_table ();
+ } else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING) {
+ socket_helper_hide_preedit_string (client_id);
+ } else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING) {
+ socket_hide_aux_string ();
+ } else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE) {
+ socket_hide_lookup_table ();
+ } else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE) {
+ socket_hide_associate_table ();
+ } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
+ socket_helper_update_preedit_string (client_id);
+ } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
+ socket_update_aux_string ();
+ } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
+ socket_update_lookup_table ();
+ } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
+ socket_update_associate_table ();
+ } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT ||
+ cmd == SCIM_TRANS_CMD_PANEL_SEND_KEY_EVENT) {
+ socket_helper_send_key_event (client_id);
+ } else if (cmd == SCIM_TRANS_CMD_FORWARD_KEY_EVENT) {
+ socket_helper_forward_key_event (client_id);
+ } else if (cmd == SCIM_TRANS_CMD_PANEL_SEND_IMENGINE_EVENT) {
+ socket_helper_send_imengine_event (client_id);
+ } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
+ socket_helper_register_properties (client_id);
+ } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
+ socket_helper_update_property (client_id);
+ } else if (cmd == SCIM_TRANS_CMD_RELOAD_CONFIG) {
+ reload_config ();
+ m_signal_reload_config ();
+ } else if (cmd == ISM_TRANS_CMD_ISE_PANEL_HIDED) {
+ socket_helper_update_state_hided (client_id);
+ } else if (cmd == ISM_TRANS_CMD_ISE_PANEL_SHOWED) {
+ socket_helper_update_state_showed (client_id);
+ } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT) {
+ socket_helper_update_input_context (client_id);
+ } else if (cmd == ISM_TRANS_CMD_ISE_RESULT_TO_IMCONTROL) {
+ socket_helper_commit_ise_result_to_imcontrol (client_id);
+ } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE_LIST) {
+ socket_get_keyboard_ise_list ();
+ } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
+ socket_set_candidate_ui ();
+ } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_UI) {
+ socket_get_candidate_ui ();
+ } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_POSITION) {
+ socket_set_candidate_position ();
+ } else if (cmd == ISM_TRANS_CMD_HIDE_CANDIDATE) {
+ socket_hide_candidate ();
+ } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_RECT) {
+ socket_get_candidate_rect ();
+ } else if (cmd == ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_NAME) {
+ socket_set_keyboard_ise (ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_NAME);
+ } else if (cmd == ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID) {
+ socket_set_keyboard_ise (ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID);
+ } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE) {
+ socket_get_keyboard_ise ();
+ } else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_STRING) {
+ socket_helper_commit_im_embedded_editor_string (client_id);
+ } else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_CHANGED) {
+ socket_helper_im_embedded_editor_changed (client_id);
+ } else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_PREEDIT_CHANGED) {
+ socket_helper_im_embedded_editor_preedit_changed (client_id);
+ } else if(cmd == ISM_TRANS_CMD_LAUNCH_HELPER_ISE_LIST_SELECTION){
+ socket_helper_launch_helper_ise_list_selection();
+ }
+ }
+ socket_transaction_end ();
+ }
+ else if (client_info.type == IMCONTROL_ACT_CLIENT)
+ {
+ socket_transaction_start ();
+
+ while (m_recv_trans.get_command (cmd))
+ {
+ if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL)
+ show_isf_panel (client_id);
+ else if (cmd == ISM_TRANS_CMD_HIDE_ISF_CONTROL)
+ hide_isf_panel (client_id);
+ else if (cmd == ISM_TRANS_CMD_SHOW_ISE_PANEL)
+ show_ise_panel (client_id);
+ else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL)
+ hide_ise_panel (client_id);
+ else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_SIZE)
+ get_ise_size (client_id);
+ else if (cmd == ISM_TRANS_CMD_SET_ISE_MODE)
+ set_ise_mode (client_id);
+ else if (cmd == ISM_TRANS_CMD_SET_ISE_LANGUAGE)
+ set_ise_language (client_id);
+ else if (cmd == ISM_TRANS_CMD_SET_ISE_IMDATA)
+ set_ise_imdata (client_id);
+ else if (cmd == ISM_TRANS_CMD_GET_ISE_IMDATA)
+ get_ise_imdata (client_id);
+ else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_NAME)
+ get_active_ise_name (client_id);
+ else if (cmd == ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_NAME)
+ set_active_ise_by_name (client_id);
+ else if (cmd == ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID)
+ set_active_ise_by_uuid (client_id);
+ else if (cmd == ISM_TRANS_CMD_SET_PRIVATE_KEY)
+ set_ise_private_key (client_id, false);
+ else if (cmd == ISM_TRANS_CMD_SET_PRIVATE_KEY_BY_IMG)
+ set_ise_private_key (client_id, true);
+ else if (cmd == ISM_TRANS_CMD_SET_DISABLE_KEY)
+ set_ise_disable_key (client_id);
+ else if (cmd == ISM_TRANS_CMD_GET_LAYOUT)
+ get_ise_layout (client_id);
+ else if (cmd == ISM_TRANS_CMD_SET_LAYOUT)
+ set_ise_layout (client_id);
+ else if (cmd == ISM_TRANS_CMD_SET_CAPS_MODE)
+ set_ise_caps_mode (client_id);
+ else if (cmd == ISM_TRANS_CMD_GET_ISE_LIST)
+ get_ise_list (client_id);
+ else if (cmd == ISM_TRANS_CMD_RESET_ISE_OPTION)
+ reset_ise_option (client_id);
+ else if (cmd == ISM_TRANS_CMD_GET_LANGUAGE_LIST)
+ get_language_list (client_id);
+ else if (cmd == ISM_TRANS_CMD_GET_ALL_LANGUAGE_LIST)
+ get_all_language (client_id);
+ else if (cmd == ISM_TRANS_CMD_GET_ISE_LANGUAGE)
+ get_ise_language (client_id);
+ else if (cmd == ISM_TRANS_CMD_SET_ISF_LANGUAGE)
+ set_isf_language (client_id);
+ else if (cmd == ISM_TRANS_CMD_RESET_ISE_CONTEXT)
+ reset_ise_context (client_id);
+ else if (cmd == ISM_TRANS_CMD_SET_ISE_SCREEN_DIRECTION)
+ set_ise_screen_direction (client_id);
+ else if (cmd == ISM_TRANS_CMD_SET_INDICATOR_CHAR_COUNT)
+ set_ise_char_count (client_id);
+ else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_IM_BUTTON_SET_LABEL)
+ set_ise_im_embedded_editor_im_button_set_label (client_id);
+ else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_PRESET_TEXT)
+ set_ise_im_embedded_editor_set_preset_text (client_id);
+ else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_TEXT)
+ set_ise_im_embedded_editor_set_text (client_id);
+ else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_MAX_LENGTH)
+ set_ise_im_embedded_editor_set_max_length (client_id);
+ else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_BUTTON_SENSTIVITY)
+ set_ise_im_embedded_editor_set_button_senstivity (client_id);
+ else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_PROGRESS_BAR)
+ set_ise_im_embedded_editor_set_progress_bar (client_id);
+ else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_GET_TEXT)
+ get_ise_im_embedded_editor_text (client_id);
+ else if (cmd == ISM_TRANS_CMD_IM_INDICATOR_SET_COUNT_LABEL)
+ set_ise_im_indicator_count_label (client_id);
+ }
+
+ socket_transaction_end ();
+ }
+ }
+
+ void socket_exception_callback (SocketServer *server,
+ const Socket &client)
+ {
+ SCIM_DEBUG_MAIN (2) << "PanelAgent::socket_exception_callback (" << client.get_id () << ")\n";
+
+ socket_close_connection (server, client);
+ }
+
+ bool socket_open_connection (SocketServer *server,
+ const Socket &client)
+ {
+ SCIM_DEBUG_MAIN (3) << "PanelAgent::socket_open_connection (" << client.get_id () << ")\n";
+
+ uint32 key;
+ String type = scim_socket_accept_connection (key,
+ String ("Panel"),
+ String ("FrontEnd,Helper,Helper_Active,IMControl_Active,IMControl_Passive"),
+ client,
+ m_socket_timeout);
+
+ if (type.length ()) {
+ ClientInfo info;
+ info.key = key;
+ info.type = ((type == "FrontEnd") ? FRONTEND_CLIENT :
+ ((type == "IMControl_Active") ? IMCONTROL_ACT_CLIENT :
+ ((type == "Helper_Active") ? HELPER_ACT_CLIENT :
+ ((type == "IMControl_Passive") ? IMCONTROL_CLIENT : HELPER_CLIENT))));
+
+ SCIM_DEBUG_MAIN (4) << "Add client to repository. Type=" << type << " key=" << key << "\n";
+ lock ();
+ m_client_repository [client.get_id ()] = info;
+
+ if (info.type == IMCONTROL_ACT_CLIENT)
+ {
+ m_pending_active_imcontrol_id = client.get_id ();
+ }
+ else if (info.type == IMCONTROL_CLIENT)
+ {
+ m_imcontrol_map [m_pending_active_imcontrol_id] = client.get_id();
+ m_pending_active_imcontrol_id = -1;
+ }
+
+ const_cast<Socket &>(client).set_nonblock_mode ();
+
+ unlock ();
+ return true;
+ }
+
+ SCIM_DEBUG_MAIN (4) << "Close client connection " << client.get_id () << "\n";
+ server->close_connection (client);
+ return false;
+ }
+
+ void socket_close_connection (SocketServer *server,
+ const Socket &client)
+ {
+ SCIM_DEBUG_MAIN (3) << "PanelAgent::socket_close_connection (" << client.get_id () << ")\n";
+
+ lock ();
+
+ m_signal_close_connection (client.get_id ());
+
+ ClientInfo client_info = socket_get_client_info (client.get_id ());
+
+ m_client_repository.erase (client.get_id ());
+
+ server->close_connection (client);
+
+ /* Exit panel if there is no connected client anymore. */
+ if (client_info.type != UNKNOWN_CLIENT && m_client_repository.size () == 0 && !m_should_resident) {
+ SCIM_DEBUG_MAIN (4) << "Exit Socket Server Thread.\n";
+ server->shutdown ();
+ m_signal_exit.emit ();
+ }
+
+ unlock ();
+
+ if (client_info.type == FRONTEND_CLIENT) {
+ SCIM_DEBUG_MAIN(4) << "It's a FrontEnd client.\n";
+ /* The focused client is closed. */
+ if (m_current_socket_client == client.get_id ()) {
+ lock ();
+ m_current_socket_client = -1;
+ m_current_client_context = 0;
+ m_current_context_uuid = String ("");
+ unlock ();
+
+ socket_transaction_start ();
+ socket_turn_off ();
+ socket_transaction_end ();
+ }
+
+ if (m_last_socket_client == client.get_id ()) {
+ lock ();
+ m_last_socket_client = -1;
+ m_last_client_context = 0;
+ m_last_context_uuid = String ("");
+ unlock ();
+ }
+
+ /* Erase all associated Client Context UUIDs. */
+ std::vector <uint32> ctx_list;
+ ClientContextUUIDRepository::iterator it = m_client_context_uuids.begin ();
+ for (; it != m_client_context_uuids.end (); ++it) {
+ if ((it->first & 0xFFFF) == (client.get_id () & 0xFFFF))
+ ctx_list.push_back (it->first);
+ }
+
+ for (size_t i = 0; i < ctx_list.size (); ++i)
+ m_client_context_uuids.erase (ctx_list [i]);
+
+ int client_id = client.get_id ();
+
+ /* Erase all helperise info associated with the client */
+ ctx_list.clear ();
+ it = m_client_context_helper.begin ();
+ for (; it != m_client_context_helper.end (); ++it) {
+ if ((it->first & 0xFFFF) == (client_id & 0xFFFF)) {
+ ctx_list.push_back (it->first);
+
+ /* similar to stop_helper except that it will not call get_focused_context() */
+ String uuid = it->second;
+ if (m_helper_uuid_count.find (uuid) != m_helper_uuid_count.end ()) {
+ uint32 count = m_helper_uuid_count[uuid];
+ if (1 == count) {
+ m_helper_uuid_count.erase (uuid);
+
+ HelperClientIndex::iterator pise = m_helper_client_index.find (uuid);
+ if (pise != m_helper_client_index.end ())
+ {
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (it->first);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_EXIT);
+ m_send_trans.write_to_socket (pise->second.id);
+ }
+ SCIM_DEBUG_MAIN(1) << "Stop HelperISE " << uuid << " ...\n";
+ }
+ else
+ {
+ m_helper_uuid_count[uuid] = count - 1;
+ focus_out_helper (uuid, (it->first & 0xFFFF), ((it->first >> 16) & 0x7FFF));
+ SCIM_DEBUG_MAIN(1) << "Decrement usage count of HelperISE " << uuid
+ << " to " << m_helper_uuid_count[uuid] << "\n";
+ }
+ }
+ }
+ }
+
+ for (size_t i = 0; i < ctx_list.size (); ++i)
+ m_client_context_helper.erase (ctx_list [i]);
+
+ HelperInfoRepository::iterator iter = m_helper_info_repository.begin ();
+ for (; iter != m_helper_info_repository.end (); iter++)
+ {
+ if (!m_current_helper_uuid.compare (iter->second.uuid))
+ if (!(iter->second.option & ISM_ISE_HIDE_IN_CONTROL_PANEL))
+ socket_update_control_panel ();
+ }
+ } else if (client_info.type == HELPER_CLIENT) {
+ SCIM_DEBUG_MAIN(4) << "It's a Helper client.\n";
+
+ lock ();
+
+ HelperInfoRepository::iterator hiit = m_helper_info_repository.find (client.get_id ());
+
+ if (hiit != m_helper_info_repository.end ()) {
+ bool restart = false;
+ String uuid = hiit->second.uuid;
+
+ HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
+ if ((hiit->second.option & SCIM_HELPER_AUTO_RESTART) &&
+ (it != m_helper_client_index.end () && it->second.ref > 0))
+ restart = true;
+
+ m_helper_manager.stop_helper (hiit->second.name);
+
+ m_helper_client_index.erase (uuid);
+ m_helper_info_repository.erase (hiit);
+
+ if (restart && !m_ise_exiting)
+ m_helper_manager.run_helper (uuid, m_config_name, m_display_name);
+ }
+
+ m_ise_exiting = false;
+ unlock ();
+
+ socket_transaction_start ();
+ m_signal_remove_helper (client.get_id ());
+ socket_transaction_end ();
+ } else if (client_info.type == HELPER_ACT_CLIENT) {
+ SCIM_DEBUG_MAIN(4) << "It's a Helper passive client.\n";
+
+ lock ();
+
+ HelperInfoRepository::iterator hiit = m_helper_active_info_repository.find (client.get_id ());
+ if (hiit != m_helper_active_info_repository.end ())
+ m_helper_active_info_repository.erase (hiit);
+
+ unlock ();
+ } else if (client_info.type == IMCONTROL_ACT_CLIENT) {
+ SCIM_DEBUG_MAIN(4) << "It's a IMCONTROL_ACT_CLIENT client.\n";
+ int client_id = client.get_id ();
+
+ if (client_id == m_current_active_imcontrol_id
+ && TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ hide_helper (m_current_helper_uuid);
+
+ IMControlRepository::iterator iter = m_imcontrol_repository.find (client_id);
+ if (iter != m_imcontrol_repository.end ())
+ {
+ int size = iter->second.info.size ();
+ int i = 0;
+ while (i < size) {
+ stop_helper ((iter->second.info)[i].uuid, (iter->second.count)[i], DEFAULT_CONTEXT_VALUE);
+ if ((iter->second.info)[i].option & ISM_ISE_HIDE_IN_CONTROL_PANEL)
+ m_current_helper_uuid = m_last_helper_uuid;
+ i++;
+ }
+ m_imcontrol_repository.erase (iter);
+ }
+
+ IntIntRepository::iterator iter2 = m_imcontrol_map.find (client_id);
+ if (iter2 != m_imcontrol_map.end ())
+ m_imcontrol_map.erase (iter2);
+ }
+ }
+
+ const ClientInfo & socket_get_client_info (int client)
+ {
+ static ClientInfo null_client = { 0, UNKNOWN_CLIENT };
+
+ ClientRepository::iterator it = m_client_repository.find (client);
+
+ if (it != m_client_repository.end ())
+ return it->second;
+
+ return null_client;
+ }
+
+private:
+ void socket_turn_on (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_turn_on ()\n";
+
+ m_signal_turn_on ();
+ }
+
+ void socket_turn_off (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_turn_off ()\n";
+
+ m_signal_turn_off ();
+ }
+
+ void socket_update_screen (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_screen ()\n";
+
+ uint32 num;
+ if (m_recv_trans.get_data (num) && ((int) num) != m_current_screen) {
+ SCIM_DEBUG_MAIN(4) << "New Screen number = " << num << "\n";
+ m_signal_update_screen ((int) num);
+ helper_all_update_screen ((int) num);
+ m_current_screen = (num);
+ }
+ }
+
+ void socket_update_spot_location (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_spot_location ()\n";
+
+ uint32 x, y, top_y;
+ if (m_recv_trans.get_data (x) && m_recv_trans.get_data (y) && m_recv_trans.get_data (top_y)) {
+ SCIM_DEBUG_MAIN(4) << "New Spot location x=" << x << " y=" << y << "\n";
+ m_signal_update_spot_location ((int)x, (int)y, (int)top_y);
+ helper_all_update_spot_location ((int)x, (int)y);
+ }
+ }
+
+ void socket_update_cursor_position (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_cursor_position ()\n";
+
+ uint32 cursor_pos;
+ if (m_recv_trans.get_data (cursor_pos)) {
+ SCIM_DEBUG_MAIN(4) << "New cursor position pos=" << cursor_pos << "\n";
+ helper_all_update_cursor_position ((int)cursor_pos);
+ }
+ }
+
+ void socket_update_factory_info (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_factory_info ()\n";
+
+ PanelFactoryInfo info;
+ if (m_recv_trans.get_data (info.uuid) && m_recv_trans.get_data (info.name) &&
+ m_recv_trans.get_data (info.lang) && m_recv_trans.get_data (info.icon)) {
+ SCIM_DEBUG_MAIN(4) << "New Factory info uuid=" << info.uuid << " name=" << info.name << "\n";
+ info.lang = scim_get_normalized_language (info.lang);
+ m_signal_update_factory_info (info);
+ }
+ }
+
+ void socket_show_help (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_help ()\n";
+
+ String help;
+ if (m_recv_trans.get_data (help))
+ m_signal_show_help (help);
+ }
+
+ void socket_show_factory_menu (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_factory_menu ()\n";
+
+ PanelFactoryInfo info;
+ std::vector <PanelFactoryInfo> vec;
+
+ while (m_recv_trans.get_data (info.uuid) && m_recv_trans.get_data (info.name) &&
+ m_recv_trans.get_data (info.lang) && m_recv_trans.get_data (info.icon)) {
+ info.lang = scim_get_normalized_language (info.lang);
+ vec.push_back (info);
+ }
+
+ if (vec.size ())
+ m_signal_show_factory_menu (vec);
+ }
+
+ void socket_turn_on_log (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_turn_on_log ()\n";
+
+ uint32 isOn;
+ if (m_recv_trans.get_data (isOn)) {
+ if (isOn) {
+ DebugOutput::enable_debug (SCIM_DEBUG_AllMask);
+ DebugOutput::set_verbose_level (7);
+ } else {
+ DebugOutput::disable_debug (SCIM_DEBUG_AllMask);
+ DebugOutput::set_verbose_level (0);
+ }
+
+ int focused_client;
+ uint32 focused_context;
+
+ get_focused_context (focused_client, focused_context);
+
+ if (focused_client == -1 || focused_context == 0)
+ return;
+
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ ctx = get_helper_ic (focused_client, focused_context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (m_current_helper_uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_TURN_ON_LOG);
+ m_send_trans.put_data (isOn);
+ m_send_trans.write_to_socket (client_socket);
+ }
+ }
+
+ ClientInfo client_info = socket_get_client_info (focused_client);
+ if (client_info.type == FRONTEND_CLIENT) {
+ Socket socket_client (focused_client);
+ lock ();
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (focused_context);
+ m_send_trans.put_command (ISM_TRANS_CMD_TURN_ON_LOG);
+ m_send_trans.put_data (isOn);
+ m_send_trans.write_to_socket (socket_client);
+ unlock ();
+ }
+ }
+ }
+
+ void socket_show_preedit_string (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_preedit_string ()\n";
+ m_signal_show_preedit_string ();
+ }
+
+ void socket_show_aux_string (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_aux_string ()\n";
+ m_signal_show_aux_string ();
+ }
+
+ void socket_show_lookup_table (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_lookup_table ()\n";
+ m_signal_show_lookup_table ();
+ }
+
+ void socket_show_associate_table (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_associate_table ()\n";
+ m_signal_show_associate_table ();
+ }
+
+ void socket_hide_preedit_string (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_hide_preedit_string ()\n";
+ m_signal_hide_preedit_string ();
+ }
+
+ void socket_hide_aux_string (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_hide_aux_string ()\n";
+ m_signal_hide_aux_string ();
+ }
+
+ void socket_hide_lookup_table (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_hide_lookup_table ()\n";
+ m_signal_hide_lookup_table ();
+ }
+
+ void socket_hide_associate_table (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_hide_associate_table ()\n";
+ m_signal_hide_associate_table ();
+ }
+
+ void socket_update_preedit_string (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_preedit_string ()\n";
+
+ String str;
+ AttributeList attrs;
+ if (m_recv_trans.get_data (str) && m_recv_trans.get_data (attrs))
+ m_signal_update_preedit_string (str, attrs);
+ }
+
+ void socket_update_preedit_caret (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_preedit_caret ()\n";
+
+ uint32 caret;
+ if (m_recv_trans.get_data (caret))
+ m_signal_update_preedit_caret ((int) caret);
+ }
+
+ void socket_update_aux_string (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_aux_string ()\n";
+
+ String str;
+ AttributeList attrs;
+ if (m_recv_trans.get_data (str) && m_recv_trans.get_data (attrs))
+ m_signal_update_aux_string (str, attrs);
+ }
+
+ void socket_update_lookup_table (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_lookup_table ()\n";
+
+ lock ();
+ if (m_recv_trans.get_data (g_isf_candidate_table))
+ {
+ unlock ();
+ m_signal_update_lookup_table (g_isf_candidate_table);
+ }
+ else
+ {
+ unlock ();
+ }
+ }
+
+ void socket_update_associate_table (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_associate_table ()\n";
+
+ CommonLookupTable table;
+ if (m_recv_trans.get_data (table))
+ m_signal_update_associate_table (table);
+ }
+
+ void socket_update_control_panel (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_control_panel ()\n";
+ /* Check default ISE for no context app */
+#ifdef ONE_HELPER_ISE_PROCESS
+ uint32 ctx = get_helper_ic (-1, 0);
+ ClientContextUUIDRepository::iterator it = m_client_context_helper.find (ctx);
+ if (it != m_client_context_helper.end ())
+ {
+ if (m_should_shared_ise)
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ {
+ if (m_current_helper_uuid != it->second)
+ {
+ stop_helper (it->second, -1, 0);
+ start_helper (m_current_helper_uuid, -1, 0);
+ }
+ }
+ else if (TOOLBAR_KEYBOARD_MODE == m_current_toolbar_mode)
+ stop_helper (it->second, -1, 0);
+ }
+ else
+ {
+ m_current_toolbar_mode = TOOLBAR_HELPER_MODE;
+ m_current_helper_uuid = it->second;
+ }
+ }
+ else
+ {
+ if (m_should_shared_ise)
+ {
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ start_helper (m_current_helper_uuid, -1, 0);
+ }
+ else
+ {
+ m_current_toolbar_mode = TOOLBAR_KEYBOARD_MODE;
+ }
+ }
+
+#endif
+ String name, uuid;
+ m_signal_get_keyboard_ise (name, uuid);
+
+ PanelFactoryInfo info;
+ if (name.length () > 0)
+ info = PanelFactoryInfo (uuid, name, String (""), String (""));
+ else
+ info = PanelFactoryInfo (String (""), String (_("English/Keyboard")), String ("C"), String (SCIM_KEYBOARD_ICON_FILE));
+ m_signal_update_factory_info (info);
+ }
+
+ void socket_register_properties (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_register_properties ()\n";
+
+ PropertyList properties;
+
+ if (m_recv_trans.get_data (properties))
+ m_signal_register_properties (properties);
+ }
+
+ void socket_update_property (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_property ()\n";
+
+ Property property;
+ if (m_recv_trans.get_data (property))
+ m_signal_update_property (property);
+ }
+
+ void socket_get_keyboard_ise_list (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_keyboard_ise_list ()\n";
+
+ std::vector<String> list;
+ list.clear ();
+ m_signal_get_keyboard_ise_list (list);
+
+ String uuid;
+ if (m_recv_trans.get_data (uuid))
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ get_focused_context (client, context);
+ uint32 ctx = get_helper_ic (client, context);
+ Socket socket_client (it->second.id);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE_LIST);
+ m_send_trans.put_data (list.size ());
+ for (unsigned int i = 0; i < list.size (); i++)
+ m_send_trans.put_data (list[i]);
+ m_send_trans.write_to_socket (socket_client);
+ }
+ }
+ }
+
+ void socket_set_candidate_ui (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_set_candidate_ui ()\n";
+
+ uint32 style, mode;
+ if (m_recv_trans.get_data (style) && m_recv_trans.get_data (mode))
+ {
+ m_signal_set_candidate_ui (style, mode);
+ }
+ }
+
+ void socket_get_candidate_ui (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_candidate_ui ()\n";
+
+ int style = 0, mode = 0;
+ m_signal_get_candidate_ui (style, mode);
+
+ String uuid;
+ if (m_recv_trans.get_data (uuid))
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ get_focused_context (client, context);
+ uint32 ctx = get_helper_ic (client, context);
+ Socket socket_client (it->second.id);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_CANDIDATE_UI);
+ m_send_trans.put_data (style);
+ m_send_trans.put_data (mode);
+ m_send_trans.write_to_socket (socket_client);
+ }
+ }
+ }
+
+ void socket_set_candidate_position (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_set_candidate_position ()\n";
+
+ uint32 left, top;
+ if (m_recv_trans.get_data (left) && m_recv_trans.get_data (top))
+ {
+ m_signal_set_candidate_position (left, top);
+ }
+ }
+
+ void socket_hide_candidate (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_hide_candidate ()\n";
+
+ m_signal_hide_preedit_string ();
+ m_signal_hide_aux_string ();
+ m_signal_hide_lookup_table ();
+ m_signal_hide_associate_table ();
+ }
+
+ void socket_get_candidate_rect (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_candidate_rect ()\n";
+
+ struct rectinfo info;
+ info.pos_x = 0;
+ info.pos_y = 0;
+ info.width = 0;
+ info.height = 0;
+ m_signal_get_candidate_rect (info);
+
+ String uuid;
+ if (m_recv_trans.get_data (uuid))
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ get_focused_context (client, context);
+ uint32 ctx = get_helper_ic (client, context);
+ Socket socket_client (it->second.id);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_CANDIDATE_RECT);
+ m_send_trans.put_data (info.pos_x);
+ m_send_trans.put_data (info.pos_y);
+ m_send_trans.put_data (info.width);
+ m_send_trans.put_data (info.height);
+ m_send_trans.write_to_socket (socket_client);
+ }
+ }
+ }
+
+ void socket_set_keyboard_ise (int type)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_set_keyboard_ise ()\n";
+
+ String ise;
+ if (m_recv_trans.get_data (ise))
+ m_signal_set_keyboard_ise (type, ise);
+ }
+
+ void socket_helper_launch_helper_ise_list_selection (void)
+ {
+ uint32 withUI;
+ if (m_recv_trans.get_data (withUI))
+ m_signal_launch_helper_ise_list_selection (withUI);
+ }
+
+ void socket_get_keyboard_ise (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_keyboard_ise ()\n";
+
+ String ise_name, ise_uuid;
+ int client = -1;
+ uint32 context = 0;
+ uint32 ctx = 0;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ if (m_client_context_uuids.find (ctx) != m_client_context_uuids.end ())
+ ise_uuid = m_client_context_uuids[ctx];
+ m_signal_get_keyboard_ise (ise_name, ise_uuid);
+
+ String uuid;
+ if (m_recv_trans.get_data (uuid))
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ get_focused_context (client, context);
+ uint32 ctx = get_helper_ic (client, context);
+ Socket socket_client (it->second.id);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE);
+ m_send_trans.put_data (ise_name);
+ m_send_trans.put_data (ise_uuid);
+ m_send_trans.write_to_socket (socket_client);
+ }
+ }
+ }
+
+ void socket_start_helper (int client, uint32 context, const String &ic_uuid)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_start_helper ()\n";
+
+ String uuid;
+ if (m_recv_trans.get_data (uuid) && uuid.length ()) {
+ HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
+
+ lock ();
+
+ uint32 ic = get_helper_ic (client, context);
+
+ SCIM_DEBUG_MAIN(5) << "Helper UUID =" << uuid << " IC UUID =" << ic_uuid <<"\n";
+
+ if (it == m_helper_client_index.end ()) {
+ SCIM_DEBUG_MAIN(5) << "Run this Helper.\n";
+ m_start_helper_ic_index [uuid].push_back (std::make_pair (ic, ic_uuid));
+ m_helper_manager.run_helper (uuid, m_config_name, m_display_name);
+ } else {
+ SCIM_DEBUG_MAIN(5) << "Increase the Reference count.\n";
+ Socket client_socket (it->second.id);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ic);
+ m_send_trans.put_data (ic_uuid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
+ m_send_trans.write_to_socket (client_socket);
+ ++ it->second.ref;
+ }
+
+ unlock ();
+ }
+ }
+
+ void socket_stop_helper (int client, uint32 context, const String &ic_uuid)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_stop_helper ()\n";
+
+ String uuid;
+ if (m_recv_trans.get_data (uuid) && uuid.length ()) {
+ HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
+
+ lock ();
+
+ uint32 ic = get_helper_ic (client, context);
+
+ SCIM_DEBUG_MAIN(5) << "Helper UUID =" << uuid << " IC UUID =" << ic_uuid <<"\n";
+
+ if (it != m_helper_client_index.end ()) {
+ SCIM_DEBUG_MAIN(5) << "Decrase the Reference count.\n";
+ -- it->second.ref;
+ Socket client_socket (it->second.id);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ic);
+ m_send_trans.put_data (ic_uuid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_HELPER_DETACH_INPUT_CONTEXT);
+ if (it->second.ref <= 0)
+ m_send_trans.put_command (SCIM_TRANS_CMD_EXIT);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+ }
+ }
+
+ void socket_send_helper_event (int client, uint32 context, const String &ic_uuid)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_send_helper_event ()\n";
+
+ String uuid;
+ if (m_recv_trans.get_data (uuid) && m_recv_trans.get_data (m_nest_trans) &&
+ uuid.length () && m_nest_trans.valid ()) {
+ HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
+ if (it != m_helper_client_index.end ()) {
+ Socket client_socket (it->second.id);
+
+ lock ();
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+
+ /* FIXME: We presume that client and context are both less than 65536.
+ * Hopefully, it should be true in any UNIXs.
+ * So it's ok to combine client and context into one uint32. */
+ m_send_trans.put_data (get_helper_ic (client, context));
+ m_send_trans.put_data (ic_uuid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_HELPER_PROCESS_IMENGINE_EVENT);
+ m_send_trans.put_data (m_nest_trans);
+ m_send_trans.write_to_socket (client_socket);
+
+ unlock ();
+ }
+ }
+ }
+
+ void socket_helper_register_properties (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_register_properties (" << client << ")\n";
+
+ PropertyList properties;
+ if (m_recv_trans.get_data (properties))
+ m_signal_register_helper_properties (client, properties);
+ }
+
+ void socket_helper_update_property (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_property (" << client << ")\n";
+
+ Property property;
+ if (m_recv_trans.get_data (property))
+ m_signal_update_helper_property (client, property);
+ }
+
+ void socket_helper_send_imengine_event (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_send_imengine_event (" << client << ")\n";
+
+ uint32 target_ic;
+ String target_uuid;
+
+ HelperInfoRepository::iterator hiit = m_helper_active_info_repository.find (client);
+
+ if (m_recv_trans.get_data (target_ic) &&
+ m_recv_trans.get_data (target_uuid) &&
+ m_recv_trans.get_data (m_nest_trans) &&
+ m_nest_trans.valid () &&
+ hiit != m_helper_active_info_repository.end ()) {
+
+ int target_client;
+ uint32 target_context;
+
+ get_imengine_client_context (target_ic, target_client, target_context);
+
+ int focused_client;
+ uint32 focused_context;
+ String focused_uuid;
+
+ focused_uuid = get_focused_context (focused_client, focused_context);
+
+ if (target_ic == (uint32) (-1)) {
+ target_client = focused_client;
+ target_context = focused_context;
+ }
+
+ if (target_uuid.length () == 0)
+ target_uuid = focused_uuid;
+
+ ClientInfo client_info = socket_get_client_info (target_client);
+
+ SCIM_DEBUG_MAIN(5) << "Target UUID = " << target_uuid << " Focused UUId = " << focused_uuid << "\nTarget Client = " << target_client << "\n";
+
+ if (client_info.type == FRONTEND_CLIENT) {
+ Socket socket_client (target_client);
+ lock ();
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (target_context);
+ m_send_trans.put_command (SCIM_TRANS_CMD_PROCESS_HELPER_EVENT);
+ m_send_trans.put_data (target_uuid);
+ m_send_trans.put_data (hiit->second.uuid);
+ m_send_trans.put_data (m_nest_trans);
+ m_send_trans.write_to_socket (socket_client);
+ unlock ();
+ }
+ }
+ }
+
+ void socket_helper_key_event_op (int client, int cmd)
+ {
+ uint32 target_ic;
+ String target_uuid;
+ KeyEvent key;
+
+ if (m_recv_trans.get_data (target_ic) &&
+ m_recv_trans.get_data (target_uuid) &&
+ m_recv_trans.get_data (key) &&
+ !key.empty ()) {
+
+ int target_client;
+ uint32 target_context;
+
+ get_imengine_client_context (target_ic, target_client, target_context);
+
+ int focused_client;
+ uint32 focused_context;
+ String focused_uuid;
+
+ focused_uuid = get_focused_context (focused_client, focused_context);
+
+ if (target_ic == (uint32) (-1)) {
+ target_client = focused_client;
+ target_context = focused_context;
+ }
+
+ if (target_uuid.length () == 0)
+ target_uuid = focused_uuid;
+
+ if (target_client == -1)
+ {
+ /* FIXUP: monitor 'Invalid Window' error */
+ std::cerr << "focused target client is NULL" << "\n";
+ }
+ else if (target_client == focused_client &&
+ target_context == focused_context &&
+ target_uuid == focused_uuid)
+ {
+ ClientInfo client_info = socket_get_client_info (target_client);
+ if (client_info.type == FRONTEND_CLIENT) {
+ Socket socket_client (target_client);
+ lock ();
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (target_context);
+ m_send_trans.put_command (cmd);
+ m_send_trans.put_data (key);
+ m_send_trans.write_to_socket (socket_client);
+ unlock ();
+ }
+ }
+ }
+ }
+
+ void socket_helper_send_key_event (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_send_key_event (" << client << ")\n";
+ ISF_PROF_DEBUG("first message")
+
+ socket_helper_key_event_op (client, SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
+ }
+
+ void socket_helper_forward_key_event (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_forward_key_event (" << client << ")\n";
+
+ socket_helper_key_event_op (client, SCIM_TRANS_CMD_FORWARD_KEY_EVENT);
+ }
+
+ void socket_helper_commit_string (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_commit_string (" << client << ")\n";
+
+ uint32 target_ic;
+ String target_uuid;
+ WideString wstr;
+
+ if (m_recv_trans.get_data (target_ic) &&
+ m_recv_trans.get_data (target_uuid) &&
+ m_recv_trans.get_data (wstr) &&
+ wstr.length ()) {
+
+ int target_client;
+ uint32 target_context;
+
+ get_imengine_client_context (target_ic, target_client, target_context);
+
+ int focused_client;
+ uint32 focused_context;
+ String focused_uuid;
+
+ focused_uuid = get_focused_context (focused_client, focused_context);
+
+ if (target_ic == (uint32) (-1)) {
+ target_client = focused_client;
+ target_context = focused_context;
+ }
+
+ if (target_uuid.length () == 0)
+ target_uuid = focused_uuid;
+
+ if (target_client == focused_client &&
+ target_context == focused_context &&
+ target_uuid == focused_uuid) {
+ ClientInfo client_info = socket_get_client_info (target_client);
+ if (client_info.type == FRONTEND_CLIENT) {
+ Socket socket_client (target_client);
+ lock ();
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (target_context);
+ m_send_trans.put_command (SCIM_TRANS_CMD_COMMIT_STRING);
+ m_send_trans.put_data (wstr);
+ m_send_trans.write_to_socket (socket_client);
+ unlock ();
+ }
+ }
+ }
+ }
+
+ void socket_helper_show_preedit_string (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_show_preedit_string (" << client << ")\n";
+
+ uint32 target_ic;
+ String target_uuid;
+
+ if (m_recv_trans.get_data (target_ic) && m_recv_trans.get_data (target_uuid)) {
+ int target_client;
+ uint32 target_context;
+
+ get_imengine_client_context (target_ic, target_client, target_context);
+
+ int focused_client;
+ uint32 focused_context;
+ String focused_uuid;
+
+ focused_uuid = get_focused_context (focused_client, focused_context);
+
+ if (target_ic == (uint32) (-1)) {
+ target_client = focused_client;
+ target_context = focused_context;
+ }
+
+ if (target_uuid.length () == 0)
+ target_uuid = focused_uuid;
+
+ if (target_client == focused_client &&
+ target_context == focused_context &&
+ target_uuid == focused_uuid) {
+ ClientInfo client_info = socket_get_client_info (target_client);
+ if (client_info.type == FRONTEND_CLIENT) {
+ Socket socket_client (target_client);
+ lock ();
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (target_context);
+ m_send_trans.put_command (SCIM_TRANS_CMD_SHOW_PREEDIT_STRING);
+ m_send_trans.write_to_socket (socket_client);
+ unlock ();
+ }
+ }
+ }
+ }
+
+ void socket_helper_hide_preedit_string (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_hide_preedit_string (" << client << ")\n";
+
+ uint32 target_ic;
+ String target_uuid;
+
+ if (m_recv_trans.get_data (target_ic) && m_recv_trans.get_data (target_uuid)) {
+ int target_client;
+ uint32 target_context;
+
+ get_imengine_client_context (target_ic, target_client, target_context);
+
+ int focused_client;
+ uint32 focused_context;
+ String focused_uuid;
+
+ focused_uuid = get_focused_context (focused_client, focused_context);
+
+ if (target_ic == (uint32) (-1)) {
+ target_client = focused_client;
+ target_context = focused_context;
+ }
+
+ if (target_uuid.length () == 0)
+ target_uuid = focused_uuid;
+
+ if (target_client == focused_client &&
+ target_context == focused_context &&
+ target_uuid == focused_uuid) {
+ ClientInfo client_info = socket_get_client_info (target_client);
+ if (client_info.type == FRONTEND_CLIENT) {
+ Socket socket_client (target_client);
+ lock ();
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (target_context);
+ m_send_trans.put_command (SCIM_TRANS_CMD_HIDE_PREEDIT_STRING);
+ m_send_trans.write_to_socket (socket_client);
+ unlock ();
+ }
+ }
+ }
+ }
+
+ void socket_helper_update_preedit_string (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_preedit_string (" << client << ")\n";
+
+ uint32 target_ic;
+ String target_uuid;
+ WideString wstr;
+ AttributeList attrs;
+
+ if (m_recv_trans.get_data (target_ic) &&
+ m_recv_trans.get_data (target_uuid) &&
+ m_recv_trans.get_data (wstr) && wstr.length () &&
+ m_recv_trans.get_data (attrs)) {
+
+ int target_client;
+ uint32 target_context;
+
+ get_imengine_client_context (target_ic, target_client, target_context);
+
+ int focused_client;
+ uint32 focused_context;
+ String focused_uuid;
+
+ focused_uuid = get_focused_context (focused_client, focused_context);
+
+ if (target_ic == (uint32) (-1)) {
+ target_client = focused_client;
+ target_context = focused_context;
+ }
+
+ if (target_uuid.length () == 0)
+ target_uuid = focused_uuid;
+
+ if (target_client == focused_client &&
+ target_context == focused_context &&
+ target_uuid == focused_uuid) {
+ ClientInfo client_info = socket_get_client_info (target_client);
+ if (client_info.type == FRONTEND_CLIENT) {
+ Socket socket_client (target_client);
+ lock ();
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (target_context);
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
+ m_send_trans.put_data (wstr);
+ m_send_trans.put_data (attrs);
+ m_send_trans.write_to_socket (socket_client);
+ unlock ();
+ }
+ }
+ }
+ }
+
+
+ void socket_helper_register_helper (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_register_helper (" << client << ")\n";
+
+ HelperInfo info;
+
+ bool result = false;
+
+ lock ();
+
+ Socket socket_client (client);
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+
+ if (m_recv_trans.get_data (info.uuid) &&
+ m_recv_trans.get_data (info.name) &&
+ m_recv_trans.get_data (info.icon) &&
+ m_recv_trans.get_data (info.description) &&
+ m_recv_trans.get_data (info.option) &&
+ info.uuid.length () &&
+ info.name.length ()) {
+
+ SCIM_DEBUG_MAIN(4) << "New Helper uuid=" << info.uuid << " name=" << info.name << "\n";
+
+ HelperClientIndex::iterator it = m_helper_client_index.find (info.uuid);
+
+ if (it == m_helper_client_index.end ()) {
+ m_helper_info_repository [client] = info;
+ m_helper_client_index [info.uuid] = HelperClientStub (client, 1);
+ m_send_trans.put_command (SCIM_TRANS_CMD_OK);
+
+ StartHelperICIndex::iterator icit = m_start_helper_ic_index.find (info.uuid);
+
+ if (icit != m_start_helper_ic_index.end ()) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
+ for (size_t i = 0; i < icit->second.size (); ++i) {
+ m_send_trans.put_data (icit->second [i].first);
+ m_send_trans.put_data (icit->second [i].second);
+ }
+ m_start_helper_ic_index.erase (icit);
+ }
+
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_SCREEN);
+ m_send_trans.put_data ((uint32)m_current_screen);
+
+ result = true;
+ } else {
+ m_send_trans.put_command (SCIM_TRANS_CMD_FAIL);
+ }
+ }
+
+ m_send_trans.write_to_socket (socket_client);
+
+ unlock ();
+
+ if (result)
+ m_signal_register_helper (client, info);
+ }
+
+ void socket_helper_register_helper_passive (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_register_helper_passive (" << client << ")\n";
+
+ HelperInfo info;
+
+ lock ();
+
+ if (m_recv_trans.get_data (info.uuid) &&
+ m_recv_trans.get_data (info.name) &&
+ m_recv_trans.get_data (info.icon) &&
+ m_recv_trans.get_data (info.description) &&
+ m_recv_trans.get_data (info.option) &&
+ info.uuid.length () &&
+ info.name.length ()) {
+
+ SCIM_DEBUG_MAIN(4) << "New Helper Passive uuid=" << info.uuid << " name=" << info.name << "\n";
+
+ HelperInfoRepository::iterator it = m_helper_active_info_repository.find (client);
+ if (it == m_helper_active_info_repository.end ()) {
+ m_helper_active_info_repository[client] = info;
+ }
+
+ StringIntRepository::iterator iter = m_ise_pending_repository.find (info.uuid);
+ if (iter != m_ise_pending_repository.end ())
+ {
+ Transaction trans;
+ Socket client_socket (iter->second);
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ trans.put_command (SCIM_TRANS_CMD_OK);
+ trans.write_to_socket (client_socket);
+ m_ise_pending_repository.erase (iter);
+ }
+
+ iter = m_ise_pending_repository.find (info.name);
+ if (iter != m_ise_pending_repository.end ())
+ {
+ Transaction trans;
+ Socket client_socket (iter->second);
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ trans.put_command (SCIM_TRANS_CMD_OK);
+ trans.write_to_socket (client_socket);
+ m_ise_pending_repository.erase (iter);
+ }
+
+ if (m_current_active_imcontrol_id != -1 &&
+ m_ise_settings != NULL && m_ise_changing)
+ {
+ show_helper (info.uuid, m_ise_settings, m_ise_settings_len);
+ m_ise_changing = false;
+ }
+ }
+
+ unlock ();
+ }
+
+ void socket_helper_update_state_hided (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_state_hided (" << client << ")\n";
+
+ ClientRepository::iterator iter = m_client_repository.begin ();
+
+ for (; iter != m_client_repository.end (); iter++)
+ {
+ if (IMCONTROL_CLIENT == iter->second.type
+ && iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
+ {
+ Socket client_socket (iter->first);
+ Transaction trans;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_command (ISM_TRANS_CMD_ISE_PANEL_HIDED);
+
+ trans.write_to_socket (client_socket);
+ break;
+ }
+ }
+ }
+
+ void socket_helper_update_state_showed (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_state_showed (" << client << ")\n";
+
+ ClientRepository::iterator iter = m_client_repository.begin ();
+
+ for (; iter != m_client_repository.end (); iter++)
+ {
+ if (IMCONTROL_CLIENT == iter->second.type &&
+ iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
+ {
+ Socket client_socket (iter->first);
+ Transaction trans;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_command (ISM_TRANS_CMD_ISE_PANEL_SHOWED);
+
+ trans.write_to_socket (client_socket);
+ break;
+ }
+ }
+ }
+
+ void socket_helper_update_input_context (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_input_context (" << client << ")\n";
+
+ uint32 type;
+ uint32 value;
+
+ if (m_recv_trans.get_data (type) && m_recv_trans.get_data (value))
+ {
+ ClientRepository::iterator iter = m_client_repository.begin ();
+
+ for (; iter != m_client_repository.end (); iter++)
+ {
+ if (IMCONTROL_CLIENT == iter->second.type &&
+ iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
+ {
+ Socket client_socket (iter->first);
+ Transaction trans;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_command (ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT);
+ trans.put_data (type);
+ trans.put_data (value);
+
+ trans.write_to_socket (client_socket);
+ break;
+ }
+ }
+ }
+ }
+
+ void socket_helper_commit_ise_result_to_imcontrol (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_commit_ise_result_to_imcontrol (" << client << ")\n";
+
+ char * buf = NULL;
+ size_t len;
+
+ if (m_recv_trans.get_data (&buf, len))
+ {
+ ClientRepository::iterator iter = m_client_repository.begin ();
+
+ for (; iter != m_client_repository.end (); iter++)
+ {
+ if (IMCONTROL_CLIENT == iter->second.type &&
+ iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
+ {
+ Socket client_socket (iter->first);
+ Transaction trans;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_command (ISM_TRANS_CMD_ISE_RESULT_TO_IMCONTROL);
+ trans.put_data (buf, len);
+ trans.write_to_socket (client_socket);
+ break;
+ }
+ }
+
+ if (buf)
+ delete [] buf;
+ }
+ }
+
+ void socket_reset_helper_input_context (const String &uuid, int client, uint32 context)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ Socket client_socket (it->second.id);
+ uint32 ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT);
+ m_send_trans.write_to_socket (client_socket);
+ }
+ }
+
+ void socket_reset_input_context (int client, uint32 context)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_reset_input_context \n";
+
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ socket_reset_helper_input_context (m_current_helper_uuid, client, context);
+ }
+
+ void socket_helper_commit_im_embedded_editor_string (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_commit_ise_result_to_imcontrol (" << client << ")\n";
+
+ char * buf = NULL;
+ size_t len;
+
+ if (m_recv_trans.get_data (&buf, len))
+ {
+ ClientRepository::iterator iter = m_client_repository.begin ();
+
+ for (; iter != m_client_repository.end (); iter++)
+ {
+ if (IMCONTROL_CLIENT == iter->second.type
+ && iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
+ {
+ Socket client_socket (iter->first);
+ Transaction trans;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_STRING);
+ trans.put_data (buf, len);
+ trans.write_to_socket (client_socket);
+ break;
+ }
+ }
+
+ if (buf)
+ delete [] buf;
+ }
+ }
+
+ void socket_helper_im_embedded_editor_changed (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_im_embedded_editor_changed (" << client << ")\n";
+
+ ClientRepository::iterator iter = m_client_repository.begin ();
+
+ for (; iter != m_client_repository.end (); iter++)
+ {
+ if (IMCONTROL_CLIENT == iter->second.type
+ && iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
+ {
+ Socket client_socket (iter->first);
+ Transaction trans;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_CHANGED);
+
+ trans.write_to_socket (client_socket);
+ break;
+ }
+ }
+ }
+
+ void socket_helper_im_embedded_editor_preedit_changed (int client)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_im_embedded_editor_preedit_changed (" << client << ")\n";
+
+ char * buf = NULL;
+ size_t len;
+
+ if (m_recv_trans.get_data (&buf, len))
+ {
+ ClientRepository::iterator iter = m_client_repository.begin ();
+
+ for (; iter != m_client_repository.end (); iter++)
+ {
+ if (IMCONTROL_CLIENT == iter->second.type &&
+ iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
+ {
+ Socket client_socket (iter->first);
+ Transaction trans;
+
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_PREEDIT_CHANGED);
+ trans.put_data (buf, len);
+ trans.write_to_socket (client_socket);
+ break;
+ }
+ }
+
+ if (buf)
+ delete [] buf;
+ }
+ }
+
+
+ bool helper_select_candidate (uint32 item)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_select_candidate \n";
+
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (m_current_helper_uuid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_SELECT_CANDIDATE);
+ m_send_trans.put_data ((uint32)item);
+ m_send_trans.write_to_socket (client_socket);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ bool helper_lookup_table_page_up (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_lookup_table_page_up \n";
+
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (m_current_helper_uuid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP);
+ m_send_trans.write_to_socket (client_socket);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ bool helper_lookup_table_page_down (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_lookup_table_page_down \n";
+
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (m_current_helper_uuid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN);
+ m_send_trans.write_to_socket (client_socket);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ bool helper_update_lookup_table_page_size (uint32 size)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_update_lookup_table_page_size \n";
+
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (m_current_helper_uuid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE);
+ m_send_trans.put_data (size);
+ m_send_trans.write_to_socket (client_socket);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ bool helper_select_associate (uint32 item)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_select_associate \n";
+
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (m_current_helper_uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_SELECT_ASSOCIATE);
+ m_send_trans.put_data ((uint32)item);
+ m_send_trans.write_to_socket (client_socket);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ bool helper_associate_table_page_up (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_associate_table_page_up \n";
+
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (m_current_helper_uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_UP);
+ m_send_trans.write_to_socket (client_socket);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ bool helper_associate_table_page_down (void)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_associate_table_page_down \n";
+
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (m_current_helper_uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_DOWN);
+ m_send_trans.write_to_socket (client_socket);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ bool helper_update_associate_table_page_size (uint32 size)
+ {
+ SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_update_associate_table_page_size \n";
+
+ if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+ {
+ HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
+
+ if (it != m_helper_client_index.end ())
+ {
+ int client;
+ uint32 context;
+ Socket client_socket (it->second.id);
+ uint32 ctx;
+
+ get_focused_context (client, context);
+ ctx = get_helper_ic (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (ctx);
+ m_send_trans.put_data (m_current_helper_uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE_PAGE_SIZE);
+ m_send_trans.put_data (size);
+ m_send_trans.write_to_socket (client_socket);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ void helper_all_update_spot_location (int x, int y)
+ {
+ SCIM_DEBUG_MAIN (5) << "PanelAgent::helper_all_update_spot_location (" << x << "," << y << ")\n";
+
+ HelperInfoRepository::iterator hiit = m_helper_info_repository.begin ();
+
+ int client;
+ uint32 context;
+ String uuid = get_focused_context (client, context);
+
+ lock ();
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+
+ /* FIXME: We presume that client and context are both less than 65536.
+ * Hopefully, it should be true in any UNIXs.
+ * So it's ok to combine client and context into one uint32. */
+ m_send_trans.put_data (get_helper_ic (client, context));
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION);
+ m_send_trans.put_data ((uint32) x);
+ m_send_trans.put_data ((uint32) y);
+
+ for (; hiit != m_helper_info_repository.end (); ++ hiit) {
+ if (hiit->second.option & SCIM_HELPER_NEED_SPOT_LOCATION_INFO) {
+ Socket client_socket (hiit->first);
+ m_send_trans.write_to_socket (client_socket);
+ }
+ }
+
+ unlock ();
+ }
+
+ void helper_all_update_cursor_position (int cursor_pos)
+ {
+ SCIM_DEBUG_MAIN (5) << "PanelAgent::helper_all_update_cursor_position (" << cursor_pos << ")\n";
+
+ HelperInfoRepository::iterator hiit = m_helper_info_repository.begin ();
+
+ int client;
+ uint32 context;
+ String uuid = get_focused_context (client, context);
+
+ lock ();
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+ m_send_trans.put_data (get_helper_ic (client, context));
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_CURSOR_POSITION);
+ m_send_trans.put_data ((uint32) cursor_pos);
+
+ for (; hiit != m_helper_info_repository.end (); ++ hiit) {
+ Socket client_socket (hiit->first);
+ m_send_trans.write_to_socket (client_socket);
+ }
+
+ unlock ();
+ }
+
+ void helper_all_update_screen (int screen)
+ {
+ SCIM_DEBUG_MAIN (5) << "PanelAgent::helper_all_update_screen (" << screen << ")\n";
+
+ HelperInfoRepository::iterator hiit = m_helper_info_repository.begin ();
+
+ int client;
+ uint32 context;
+ String uuid;
+
+ lock ();
+
+ uuid = get_focused_context (client, context);
+
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+
+ /* FIXME: We presume that client and context are both less than 65536.
+ * Hopefully, it should be true in any UNIXs.
+ * So it's ok to combine client and context into one uint32. */
+ m_send_trans.put_data (get_helper_ic (client, context));
+ m_send_trans.put_data (uuid);
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_SCREEN);
+ m_send_trans.put_data ((uint32) screen);
+
+ for (; hiit != m_helper_info_repository.end (); ++ hiit) {
+ if (hiit->second.option & SCIM_HELPER_NEED_SCREEN_INFO) {
+ Socket client_socket (hiit->first);
+ m_send_trans.write_to_socket (client_socket);
+ }
+ }
+
+ unlock ();
+ }
+
+ const String & get_focused_context (int &client, uint32 &context, bool force_last_context = false) const
+ {
+ if (m_current_socket_client >= 0) {
+ client = m_current_socket_client;
+ context = m_current_client_context;
+ return m_current_context_uuid;
+ } else {
+ client = m_last_socket_client;
+ context = m_last_client_context;
+ return m_last_context_uuid;
+ }
+ }
+
+private:
+ void socket_transaction_start (void)
+ {
+ m_signal_transaction_start ();
+ }
+
+ void socket_transaction_end (void)
+ {
+ m_signal_transaction_end ();
+ }
+
+ void lock (void)
+ {
+ m_signal_lock ();
+ }
+ void unlock (void)
+ {
+ m_signal_unlock ();
+ }
+};
+
+PanelAgent::PanelAgent ()
+ : m_impl (new PanelAgentImpl ())
+{
+}
+
+PanelAgent::~PanelAgent ()
+{
+ delete m_impl;
+}
+
+bool
+PanelAgent::initialize (const String &config, const String &display, bool resident)
+{
+ return m_impl->initialize (config, display, resident);
+}
+
+bool
+PanelAgent::valid (void) const
+{
+ return m_impl->valid ();
+}
+
+bool
+PanelAgent::run (void)
+{
+ return m_impl->run ();
+}
+
+void
+PanelAgent::stop (void)
+{
+ if (m_impl != NULL)
+ m_impl->stop ();
+}
+
+int
+PanelAgent::get_helper_list (std::vector <HelperInfo> & helpers) const
+{
+ return m_impl->get_helper_list (helpers);
+}
+
+void PanelAgent::hide_helper (const String &uuid)
+{
+ m_impl->hide_helper (uuid);
+}
+TOOLBAR_MODE_T
+PanelAgent::get_current_toolbar_mode () const
+{
+ return m_impl->get_current_toolbar_mode ();
+}
+
+void
+PanelAgent::get_current_ise_rect (rectinfo &ise_rect)
+{
+ m_impl->get_current_ise_rect (ise_rect);
+}
+
+String
+PanelAgent::get_current_helper_uuid () const
+{
+ return m_impl->get_current_helper_uuid ();
+}
+
+String
+PanelAgent::get_current_helper_name () const
+{
+ return m_impl->get_current_helper_name ();
+}
+
+String
+PanelAgent::get_current_factory_icon () const
+{
+ return m_impl->get_current_factory_icon ();
+}
+
+String
+PanelAgent::get_current_ise_name () const
+{
+ return m_impl->get_current_ise_name ();
+}
+
+void
+PanelAgent::set_current_toolbar_mode (TOOLBAR_MODE_T mode)
+{
+ m_impl->set_current_toolbar_mode (mode);
+}
+
+void
+PanelAgent::set_current_ise_name (String &name)
+{
+ m_impl->set_current_ise_name (name);
+}
+
+void
+PanelAgent::set_current_ise_style (uint32 &style)
+{
+ m_impl->set_current_ise_style (style);
+}
+
+void
+PanelAgent::update_ise_name (String &name)
+{
+ m_impl->update_ise_name (name);
+}
+
+void
+PanelAgent::update_ise_style (uint32 &style)
+{
+ m_impl->update_ise_style (style);
+}
+
+void
+PanelAgent::set_current_factory_icon (String &icon)
+{
+ m_impl->set_current_factory_icon (icon);
+}
+
+bool
+PanelAgent::move_preedit_caret (uint32 position)
+{
+ return m_impl->move_preedit_caret (position);
+}
+
+bool
+PanelAgent::request_help (void)
+{
+ return m_impl->request_help ();
+}
+
+bool
+PanelAgent::request_factory_menu (void)
+{
+ return m_impl->request_factory_menu ();
+}
+
+bool
+PanelAgent::change_factory (const String &uuid)
+{
+ return m_impl->change_factory (uuid);
+}
+
+bool
+PanelAgent::candidate_more_window_show (void)
+{
+ return m_impl->candidate_more_window_show ();
+}
+
+bool
+PanelAgent::candidate_more_window_hide (void)
+{
+ return m_impl->candidate_more_window_hide ();
+}
+
+bool
+PanelAgent::select_aux (uint32 item)
+{
+ return m_impl->select_aux (item);
+}
+
+bool
+PanelAgent::select_candidate (uint32 item)
+{
+ return m_impl->select_candidate (item);
+}
+
+bool
+PanelAgent::lookup_table_page_up (void)
+{
+ return m_impl->lookup_table_page_up ();
+}
+
+bool
+PanelAgent::lookup_table_page_down (void)
+{
+ return m_impl->lookup_table_page_down ();
+}
+
+bool
+PanelAgent::update_lookup_table_page_size (uint32 size)
+{
+ return m_impl->update_lookup_table_page_size (size);
+}
+
+bool
+PanelAgent::select_associate (uint32 item)
+{
+ return m_impl->select_associate (item);
+}
+
+bool
+PanelAgent::associate_table_page_up (void)
+{
+ return m_impl->associate_table_page_up ();
+}
+
+bool
+PanelAgent::associate_table_page_down (void)
+{
+ return m_impl->associate_table_page_down ();
+}
+
+bool
+PanelAgent::update_associate_table_page_size (uint32 size)
+{
+ return m_impl->update_associate_table_page_size (size);
+}
+
+bool
+PanelAgent::trigger_property (const String &property)
+{
+ return m_impl->trigger_property (property);
+}
+
+bool
+PanelAgent::trigger_helper_property (int client,
+ const String &property)
+{
+ return m_impl->trigger_helper_property (client, property);
+}
+
+bool
+PanelAgent::start_helper (const String &uuid)
+{
+ return m_impl->start_helper (uuid, -2, 0);
+}
+
+bool
+PanelAgent::stop_helper (const String &uuid)
+{
+ return m_impl->stop_helper (uuid, -2, 0);
+}
+
+void
+PanelAgent::set_default_ise (const DEFAULT_ISE_T &ise)
+{
+ m_impl->set_default_ise (ise);
+}
+
+void
+PanelAgent::set_should_shared_ise (const bool should_shared_ise)
+{
+ m_impl->set_should_shared_ise (should_shared_ise);
+}
+
+bool
+PanelAgent::reset_keyboard_ise () const
+{
+ return m_impl->reset_keyboard_ise ();
+}
+
+int
+PanelAgent::get_active_ise_list (std::vector<String> &strlist)
+{
+ return m_impl->get_active_ise_list (strlist);
+}
+
+void
+PanelAgent::update_isf_control_status (const bool showed)
+{
+ m_impl->update_isf_control_status (showed);
+}
+
+int
+PanelAgent::send_display_name (String &name)
+{
+ return m_impl->send_display_name (name);
+}
+
+bool
+PanelAgent::reload_config (void)
+{
+ return m_impl->reload_config ();
+}
+
+bool
+PanelAgent::exit (void)
+{
+ return m_impl->exit ();
+}
+
+bool
+PanelAgent::filter_event (int fd)
+{
+ return m_impl->filter_event (fd);
+}
+
+bool
+PanelAgent::filter_exception_event (int fd)
+{
+ return m_impl->filter_exception_event (fd);
+}
+
+int
+PanelAgent::get_server_id (void)
+{
+ return m_impl->get_server_id ();
+}
+
+void
+PanelAgent::update_ise_list (std::vector<String> &strList)
+{
+ m_impl->update_ise_list (strList);
+}
+
+void
+PanelAgent::set_ise_changing (bool changing)
+{
+ m_impl->set_ise_changing (changing);
+}
+
+Connection
+PanelAgent::signal_connect_reload_config (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_reload_config (slot);
+}
+
+Connection
+PanelAgent::signal_connect_turn_on (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_turn_on (slot);
+}
+
+Connection
+PanelAgent::signal_connect_turn_off (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_turn_off (slot);
+}
+
+Connection
+PanelAgent::signal_connect_show_panel (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_show_panel (slot);
+}
+
+Connection
+PanelAgent::signal_connect_hide_panel (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_hide_panel (slot);
+}
+
+Connection
+PanelAgent::signal_connect_update_screen (PanelAgentSlotInt *slot)
+{
+ return m_impl->signal_connect_update_screen (slot);
+}
+
+Connection
+PanelAgent::signal_connect_update_spot_location (PanelAgentSlotIntIntInt *slot)
+{
+ return m_impl->signal_connect_update_spot_location (slot);
+}
+
+Connection
+PanelAgent::signal_connect_update_factory_info (PanelAgentSlotFactoryInfo *slot)
+{
+ return m_impl->signal_connect_update_factory_info (slot);
+}
+
+Connection
+PanelAgent::signal_connect_start_default_ise (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_start_default_ise (slot);
+}
+
+Connection
+PanelAgent::signal_connect_set_candidate_ui (PanelAgentSlotIntInt *slot)
+{
+ return m_impl->signal_connect_set_candidate_ui (slot);
+}
+
+Connection
+PanelAgent::signal_connect_get_candidate_ui (PanelAgentSlotIntInt2 *slot)
+{
+ return m_impl->signal_connect_get_candidate_ui (slot);
+}
+
+Connection
+PanelAgent::signal_connect_set_candidate_position (PanelAgentSlotIntInt *slot)
+{
+ return m_impl->signal_connect_set_candidate_position (slot);
+}
+
+Connection
+PanelAgent::signal_connect_get_candidate_rect (PanelAgentSlotRect *slot)
+{
+ return m_impl->signal_connect_get_candidate_rect (slot);
+}
+
+Connection
+PanelAgent::signal_connect_set_keyboard_ise (PanelAgentSlotIntString *slot)
+{
+ return m_impl->signal_connect_set_keyboard_ise (slot);
+}
+
+Connection
+PanelAgent::signal_connect_get_keyboard_ise (PanelAgentSlotString2 *slot)
+{
+ return m_impl->signal_connect_get_keyboard_ise (slot);
+}
+
+Connection
+PanelAgent::signal_connect_show_help (PanelAgentSlotString *slot)
+{
+ return m_impl->signal_connect_show_help (slot);
+}
+
+Connection
+PanelAgent::signal_connect_show_factory_menu (PanelAgentSlotFactoryInfoVector *slot)
+{
+ return m_impl->signal_connect_show_factory_menu (slot);
+}
+
+Connection
+PanelAgent::signal_connect_show_preedit_string (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_show_preedit_string (slot);
+}
+
+Connection
+PanelAgent::signal_connect_show_aux_string (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_show_aux_string (slot);
+}
+
+Connection
+PanelAgent::signal_connect_show_lookup_table (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_show_lookup_table (slot);
+}
+
+Connection
+PanelAgent::signal_connect_show_associate_table (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_show_associate_table (slot);
+}
+
+Connection
+PanelAgent::signal_connect_hide_preedit_string (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_hide_preedit_string (slot);
+}
+
+Connection
+PanelAgent::signal_connect_hide_aux_string (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_hide_aux_string (slot);
+}
+
+Connection
+PanelAgent::signal_connect_hide_lookup_table (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_hide_lookup_table (slot);
+}
+
+Connection
+PanelAgent::signal_connect_hide_associate_table (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_hide_associate_table (slot);
+}
+
+Connection
+PanelAgent::signal_connect_update_preedit_string (PanelAgentSlotAttributeString *slot)
+{
+ return m_impl->signal_connect_update_preedit_string (slot);
+}
+
+Connection
+PanelAgent::signal_connect_update_preedit_caret (PanelAgentSlotInt *slot)
+{
+ return m_impl->signal_connect_update_preedit_caret (slot);
+}
+
+Connection
+PanelAgent::signal_connect_update_aux_string (PanelAgentSlotAttributeString *slot)
+{
+ return m_impl->signal_connect_update_aux_string (slot);
+}
+
+Connection
+PanelAgent::signal_connect_update_lookup_table (PanelAgentSlotLookupTable *slot)
+{
+ return m_impl->signal_connect_update_lookup_table (slot);
+}
+
+Connection
+PanelAgent::signal_connect_update_associate_table (PanelAgentSlotLookupTable *slot)
+{
+ return m_impl->signal_connect_update_associate_table (slot);
+}
+
+Connection
+PanelAgent::signal_connect_register_properties (PanelAgentSlotPropertyList *slot)
+{
+ return m_impl->signal_connect_register_properties (slot);
+}
+
+Connection
+PanelAgent::signal_connect_update_property (PanelAgentSlotProperty *slot)
+{
+ return m_impl->signal_connect_update_property (slot);
+}
+
+Connection
+PanelAgent::signal_connect_register_helper_properties (PanelAgentSlotIntPropertyList *slot)
+{
+ return m_impl->signal_connect_register_helper_properties (slot);
+}
+
+Connection
+PanelAgent::signal_connect_update_helper_property (PanelAgentSlotIntProperty *slot)
+{
+ return m_impl->signal_connect_update_helper_property (slot);
+}
+
+Connection
+PanelAgent::signal_connect_register_helper (PanelAgentSlotIntHelperInfo *slot)
+{
+ return m_impl->signal_connect_register_helper (slot);
+}
+
+Connection
+PanelAgent::signal_connect_remove_helper (PanelAgentSlotInt *slot)
+{
+ return m_impl->signal_connect_remove_helper (slot);
+}
+
+Connection
+PanelAgent::signal_connect_set_active_ise_by_uuid (PanelAgentSlotStringBool *slot)
+{
+ return m_impl->signal_connect_set_active_ise_by_uuid (slot);
+}
+
+Connection
+PanelAgent::signal_connect_set_active_ise_by_name (PanelAgentSlotString *slot)
+{
+ return m_impl->signal_connect_set_active_ise_by_name (slot);
+}
+
+Connection
+PanelAgent::signal_connect_focus_in (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_focus_in (slot);
+}
+
+Connection
+PanelAgent::signal_connect_focus_out (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_focus_out (slot);
+}
+
+Connection
+PanelAgent::signal_connect_get_ise_list (PanelAgentSlotBoolStringVector *slot)
+{
+ return m_impl->signal_connect_get_ise_list (slot);
+}
+
+Connection
+PanelAgent::signal_connect_get_keyboard_ise_list (PanelAgentSlotBoolStringVector *slot)
+{
+ return m_impl->signal_connect_get_keyboard_ise_list (slot);
+}
+
+Connection
+PanelAgent::signal_connect_launch_helper_ise_list_selection(PanelAgentSlotInt * slot)
+{
+ return m_impl->signal_connect_launch_helper_ise_list_selection (slot);
+}
+
+Connection
+PanelAgent::signal_connect_get_language_list (PanelAgentSlotStringVector *slot)
+{
+ return m_impl->signal_connect_get_language_list (slot);
+}
+
+Connection
+PanelAgent::signal_connect_get_all_language (PanelAgentSlotStringVector *slot)
+{
+ return m_impl->signal_connect_get_all_language (slot);
+}
+
+Connection
+PanelAgent::signal_connect_get_ise_language (PanelAgentSlotStrStringVector *slot)
+{
+ return m_impl->signal_connect_get_ise_language (slot);
+}
+
+Connection
+PanelAgent::signal_connect_set_isf_language (PanelAgentSlotString *slot)
+{
+ return m_impl->signal_connect_set_isf_language (slot);
+}
+
+Connection
+PanelAgent::signal_connect_get_ise_info_by_uuid (PanelAgentSlotStringISEINFO *slot)
+{
+ return m_impl->signal_connect_get_ise_info_by_uuid (slot);
+}
+
+Connection
+PanelAgent::signal_connect_get_ise_info_by_name (PanelAgentSlotStringISEINFO *slot)
+{
+ return m_impl->signal_connect_get_ise_info_by_name (slot);
+}
+
+Connection
+PanelAgent::signal_connect_send_key_event (PanelAgentSlotKeyEvent *slot)
+{
+ return m_impl->signal_connect_send_key_event (slot);
+}
+
+Connection
+PanelAgent::signal_connect_accept_connection (PanelAgentSlotInt *slot)
+{
+ return m_impl->signal_connect_accept_connection (slot);
+}
+
+Connection
+PanelAgent::signal_connect_close_connection (PanelAgentSlotInt *slot)
+{
+ return m_impl->signal_connect_close_connection (slot);
+}
+
+Connection
+PanelAgent::signal_connect_exit (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_exit (slot);
+}
+
+Connection
+PanelAgent::signal_connect_transaction_start (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_transaction_start (slot);
+}
+
+Connection
+PanelAgent::signal_connect_transaction_end (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_transaction_end (slot);
+}
+
+Connection
+PanelAgent::signal_connect_lock (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_lock (slot);
+}
+
+Connection
+PanelAgent::signal_connect_unlock (PanelAgentSlotVoid *slot)
+{
+ return m_impl->signal_connect_unlock (slot);
+}
+
+} /* namespace scim */
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/**
+ * @file scim_panel_agent.h
+ * @brief Defines scim::PanelAgent and their related types.
+ *
+ * scim::PanelAgent is a class used to write Panel daemons.
+ * It acts like a Socket Server and handles all socket clients
+ * issues.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2004-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_panel_agent.h,v 1.2 2005/06/11 14:50:31 suzhe Exp $
+ */
+
+#ifndef __SCIM_PANEL_AGENT_H
+#define __SCIM_PANEL_AGENT_H
+
+#include <scim_panel_common.h>
+
+namespace scim {
+
+/**
+ * @addtogroup Panel
+ * @ingroup InputServiceFramework
+ * The accessory classes to help develop Panel daemons and FrontEnds
+ * which need to communicate with Panel daemons.
+ * @{
+ */
+
+typedef enum
+{
+ TOOLBAR_KEYBOARD_MODE = 0, /* Hardware keyboard ISE */
+ TOOLBAR_HELPER_MODE /* Software keyboard ISE */
+} TOOLBAR_MODE_T;
+
+typedef struct _ISE_INFO
+{
+ String uuid;
+ String name;
+ String lang;
+ String icon;
+ uint32 option;
+ TOOLBAR_MODE_T type;
+} ISE_INFO;
+
+typedef Slot0<void>
+ PanelAgentSlotVoid;
+
+typedef Slot1<void, int>
+ PanelAgentSlotInt;
+
+typedef Slot1<void, const String &>
+ PanelAgentSlotString;
+
+typedef Slot2<void, String &, String &>
+ PanelAgentSlotString2;
+
+typedef Slot2<void, int, const String &>
+ PanelAgentSlotIntString;
+
+typedef Slot1<void, const PanelFactoryInfo &>
+ PanelAgentSlotFactoryInfo;
+
+typedef Slot1<void, const std::vector <PanelFactoryInfo> &>
+ PanelAgentSlotFactoryInfoVector;
+
+typedef Slot1<void, const LookupTable &>
+ PanelAgentSlotLookupTable;
+
+typedef Slot1<void, const Property &>
+ PanelAgentSlotProperty;
+
+typedef Slot1<void, const PropertyList &>
+ PanelAgentSlotPropertyList;
+
+typedef Slot2<void, int, int>
+ PanelAgentSlotIntInt;
+
+typedef Slot2<void, int &, int &>
+ PanelAgentSlotIntInt2;
+
+typedef Slot3<void, int, int, int>
+ PanelAgentSlotIntIntInt;
+
+typedef Slot2<void, int, const Property &>
+ PanelAgentSlotIntProperty;
+
+typedef Slot2<void, int, const PropertyList &>
+ PanelAgentSlotIntPropertyList;
+
+typedef Slot2<void, int, const HelperInfo &>
+ PanelAgentSlotIntHelperInfo;
+
+typedef Slot2<void, const String &, const AttributeList &>
+ PanelAgentSlotAttributeString;
+
+typedef Slot1<void, std::vector<String> &>
+ PanelAgentSlotStringVector;
+
+typedef Slot1<bool, std::vector<String> &>
+ PanelAgentSlotBoolStringVector;
+
+typedef Slot2<void, char *, std::vector<String> &>
+ PanelAgentSlotStrStringVector;
+
+typedef Slot2<bool, const String &, ISE_INFO &>
+ PanelAgentSlotStringISEINFO;
+
+typedef Slot1<void, const KeyEvent &>
+ PanelAgentSlotKeyEvent;
+
+typedef Slot1<void, struct rectinfo &>
+ PanelAgentSlotRect;
+
+typedef Slot2<void, const String &, bool>
+ PanelAgentSlotStringBool;
+
+typedef struct DefaultIse
+{
+ TOOLBAR_MODE_T type;
+ String uuid;
+ String name;
+ DefaultIse () : type (TOOLBAR_KEYBOARD_MODE), uuid (""), name ("") { }
+} DEFAULT_ISE_T;
+
+/**
+ * @brief The class to implement all socket protocol in Panel.
+ *
+ * This class acts like a stand alone SocketServer.
+ * It has its own dedicated main loop, and will be blocked when run () is called.
+ * So run () must be called within a separated thread, in order to not block
+ * the main loop of the Panel program itself.
+ *
+ * Before calling run (), the panel must hook the callback functions to the
+ * corresponding signals.
+ *
+ * Note that, there are two special signals: lock(void) and unlock(void). These
+ * two signals are used to provide a thread lock to PanelAgent, so that PanelAgent
+ * can run correctly within a multi-threading Panel program.
+ */
+class PanelAgent
+{
+ class PanelAgentImpl;
+ PanelAgentImpl *m_impl;
+
+ PanelAgent (const HelperAgent &);
+ const PanelAgent & operator = (const HelperAgent &);
+
+public:
+ PanelAgent ();
+ ~PanelAgent ();
+
+ /**
+ * @brief Initialize this PanelAgent.
+ *
+ * @param config The name of the config module to be used by Helpers.
+ * @param display The name of display, on which the Panel should run.
+ * @param resident If this is true then this PanelAgent will keep running
+ * even if there is no more client connected.
+ *
+ * @return true if the PanelAgent is initialized correctly and ready to run.
+ */
+ bool initialize (const String &config, const String &display, bool resident = false);
+
+ /**
+ * @brief Check if this PanelAgent is initialized correctly and ready to run.
+ *
+ * @return true if this PanelAgent is ready to run.
+ */
+ bool valid (void) const;
+
+ /**
+ * @brief Run this PanelAgent.
+ *
+ * This method has its own dedicated main loop,
+ * so it should be run in a separated thread.
+ *
+ * @return false if the Panel SocketServer encountered an error when running.
+ * Otherwise, it won't return until the server exits.
+ */
+ bool run (void);
+
+ /**
+ * @brief Stop this PanelAgent.
+ */
+ void stop (void);
+
+public:
+
+ /**
+ * @brief Get the list of all helpers.
+ *
+ * Panel program should provide a menu which contains
+ * all stand alone but not auto start Helpers, so that users can activate
+ * the Helpers by clicking in the menu.
+ *
+ * All auto start Helpers should be started by Panel after running PanelAgent
+ * by calling PanelAgent::start_helper().
+ *
+ * @param helpers A list contains information of all Helpers.
+ */
+ int get_helper_list (std::vector <HelperInfo> & helpers) const;
+
+ /**
+ * @brief Get the list of active ISEs.
+ *
+ * @param strlist A list contains information of active ISEs.
+ *
+ * @return the list size.
+ */
+ int get_active_ise_list (std::vector<String> &strlist);
+
+ /**
+ * @brief Send display name to FrontEnd.
+ *
+ * @param name The display name.
+ *
+ * @return zero if this operation is successful, otherwise return -1.
+ */
+ int send_display_name (String &name);
+
+
+ /**
+ * @brief Get current ISE type.
+ *
+ * @return the current ISE type.
+ */
+ TOOLBAR_MODE_T get_current_toolbar_mode (void) const;
+
+ /**
+ * @brief Get current ISE icon.
+ *
+ * @return the current ISE icon.
+ */
+ String get_current_factory_icon (void) const;
+
+ /**
+ * @brief Get current helper ISE uuid.
+ *
+ * @return the current helper ISE uuid.
+ */
+ String get_current_helper_uuid (void) const;
+
+ /**
+ * @brief Get current helper ISE name.
+ *
+ * @return the current helper ISE name.
+ */
+ String get_current_helper_name (void) const;
+
+ /**
+ * @brief Get current ISE name.
+ *
+ * @return the current ISE name.
+ */
+ String get_current_ise_name (void) const;
+
+ /**
+ * @brief Set current ISE style.
+ *
+ * @param style The current ISE style.
+ */
+ void set_current_ise_style (uint32 &style);
+
+ /**
+ * @brief Set current ISE name.
+ *
+ * @param name The current ISE name.
+ */
+ void set_current_ise_name (String &name);
+
+ /**
+ * @brief Set current ISE icon.
+ *
+ * @param icon The current ISE icon filepath.
+ */
+ void set_current_factory_icon (String &icon);
+
+ /**
+ * @brief Set current ISE type.
+ *
+ * @param mode The current ISE type.
+ */
+ void set_current_toolbar_mode (TOOLBAR_MODE_T mode);
+
+ /**
+ * @brief Get current ISE size and position.
+ *
+ * @param ise_rect A rect contains ISE size and position.
+ */
+ void get_current_ise_rect (rectinfo &ise_rect);
+
+ /**
+ * @brief Update ISE name to IM Control.
+ *
+ * @param name The ISE name.
+ */
+ void update_ise_name (String &name);
+
+ /**
+ * @brief Update ISE style to IM Control.
+ *
+ * @param style The ISE style.
+ */
+ void update_ise_style (uint32 &style);
+
+ /**
+ * @brief Update ISE control panel status to IM Control.
+ *
+ * @param showed The control panel status.
+ */
+ void update_isf_control_status (const bool showed);
+
+ /**
+ * @brief Notice helper ISE to focus out.
+ *
+ * @param uuid The helper ISE uuid.
+ */
+ void focus_out_helper (const String &uuid);
+
+ /**
+ * @brief Notice helper ISE to focus in.
+ *
+ * @param uuid The helper ISE uuid.
+ */
+ void focus_in_helper (const String &uuid);
+
+ /**
+ * @brief Notice helper ISE to show window.
+ *
+ * @param uuid The helper ISE uuid.
+ */
+ void show_helper (const String &uuid);
+
+ /**
+ * @brief Notice helper ISE to hide window.
+ *
+ * @param uuid The helper ISE uuid.
+ */
+ void hide_helper (const String &uuid);
+
+
+ /**
+ * @brief Set default ISE.
+ *
+ * @param ise The variable contains the information of default ISE.
+ */
+ void set_default_ise (const DEFAULT_ISE_T &ise);
+
+ /**
+ * @brief Set whether shared ISE is for all applications.
+ *
+ * @param should_shared_ise The indicator for shared ISE.
+ */
+ void set_should_shared_ise (const bool should_shared_ise);
+
+ /**
+ * @brief Reset keyboard ISE.
+ *
+ * @return true if this operation is successful, otherwise return false.
+ */
+ bool reset_keyboard_ise (void) const;
+
+ /**
+ * @brief Set whether ISE is changed.
+ *
+ * @param changing The indicator for ISE changing.
+ */
+ void set_ise_changing (bool changing);
+
+public:
+ /**
+ * @brief Let the focused IMEngineInstance object move the preedit caret.
+ *
+ * @param position The new preedit caret position.
+ * @return true if the command was sent correctly.
+ */
+ bool move_preedit_caret (uint32 position);
+
+ /**
+ * @brief Request help information from the focused IMEngineInstance object.
+ * @return true if the command was sent correctly.
+ */
+ bool request_help (void);
+
+ /**
+ * @brief Request factory menu from the focused FrontEnd.
+ * @return true if the command was sent correctly.
+ */
+ bool request_factory_menu (void);
+
+ /**
+ * @brief Change the factory used by the focused IMEngineInstance object.
+ *
+ * @param uuid The uuid of the new factory.
+ * @return true if the command was sent correctly.
+ */
+ bool change_factory (const String &uuid);
+
+ /**
+ * @brief Notice Helper ISE that candidate more window is showed.
+ * @return true if the command was sent correctly.
+ */
+ bool candidate_more_window_show (void);
+
+ /**
+ * @brief Notice Helper ISE that candidate more window is hidden.
+ * @return true if the command was sent correctly.
+ */
+ bool candidate_more_window_hide (void);
+
+ /**
+ * @brief Let the focused IMEngineInstance object
+ * select a aux in current aux string.
+ *
+ * @param item The index of the selected aux.
+ * @return true if the command was sent correctly.
+ */
+ bool select_aux (uint32 item);
+
+ /**
+ * @brief Let the focused IMEngineInstance object
+ * select a candidate in current lookup table.
+ *
+ * @param item The index of the selected candidate.
+ * @return true if the command was sent correctly.
+ */
+ bool select_candidate (uint32 item);
+
+ /**
+ * @brief Let the focused IMEngineInstance object
+ * flip the LookupTable to previous page.
+ * @return true if the command was sent correctly.
+ */
+ bool lookup_table_page_up (void);
+
+ /**
+ * @brief Let the focused IMEngineInstance object
+ * flip the LookupTable to next page.
+ * @return true if the command was sent correctly.
+ */
+ bool lookup_table_page_down (void);
+
+ /**
+ * @brief Let the focused IMEngineInstance object
+ * update the page size of the LookupTable.
+ *
+ * @param size The new page size.
+ * @return true if the command was sent correctly.
+ */
+ bool update_lookup_table_page_size (uint32 size);
+
+ /**
+ * @brief Let the focused IMEngineInstance object
+ * select a associate in current associate table.
+ *
+ * @param item The index of the selected associate.
+ * @return true if the command was sent correctly.
+ */
+ bool select_associate (uint32 item);
+
+ /**
+ * @brief Let the focused IMEngineInstance object
+ * flip the AssociateTable to previous page.
+ * @return true if the command was sent correctly.
+ */
+ bool associate_table_page_up (void);
+
+ /**
+ * @brief Let the focused IMEngineInstance object
+ * flip the AssociateTable to next page.
+ * @return true if the command was sent correctly.
+ */
+ bool associate_table_page_down (void);
+
+ /**
+ * @brief Let the focused IMEngineInstance object
+ * update the page size of the AssociateTable.
+ *
+ * @param size The new page size.
+ * @return true if the command was sent correctly.
+ */
+ bool update_associate_table_page_size (uint32 size);
+
+ /**
+ * @brief Trigger a property of the focused IMEngineInstance object.
+ *
+ * @param property The property key to be triggered.
+ * @return true if the command was sent correctly.
+ */
+ bool trigger_property (const String &property);
+
+ /**
+ * @brief Trigger a property of a Helper object.
+ *
+ * @param client The client id of the Helper object.
+ * @param property The property key to be triggered.
+ * @return true if the command was sent correctly.
+ */
+ bool trigger_helper_property (int client,
+ const String &property);
+
+ /**
+ * @brief Start a stand alone helper.
+ *
+ * @param uuid The uuid of the Helper object to be started.
+ * @return true if the command was sent correctly.
+ */
+ bool start_helper (const String &uuid);
+
+ /**
+ * @brief Stop a stand alone helper.
+ *
+ * @param uuid The uuid of the Helper object to be stopped.
+ * @return true if the command was sent correctly.
+ */
+ bool stop_helper (const String &uuid);
+
+ /**
+ * @brief Let all FrontEnds and Helpers reload configuration.
+ * @return true if the command was sent correctly.
+ */
+ bool reload_config (void);
+
+ /**
+ * @brief Let all FrontEnds, Helpers and this Panel exit.
+ * @return true if the command was sent correctly.
+ */
+ bool exit (void);
+
+ /**
+ * @brief Filter the events received from panel client.
+ *
+ * Corresponding signal will be emitted in this method.
+ *
+ * @param fd The file description for connection.
+ *
+ * @return true if the command was sent correctly, otherwise return false.
+ */
+ bool filter_event (int fd);
+
+ /**
+ * @brief Filter the exception events received from panel client.
+ *
+ * Corresponding signal will be emitted in this method.
+ *
+ * @param fd The file description for connection.
+ *
+ * @return true if the command was sent correctly, otherwise return false.
+ */
+ bool filter_exception_event (int fd);
+
+ /**
+ * @brief Get PanelAgent server fd.
+ *
+ * @return the PanelAgent server fd.
+ */
+ int get_server_id (void);
+
+ /**
+ * @brief Set the common ISE uuid.
+ *
+ * @return none.
+ */
+ void set_common_ise_uuid (String &uuid);
+
+ /**
+ * @brief Request to update ISE list.
+ *
+ * @return none.
+ */
+ void update_ise_list (std::vector<String> &strList);
+
+public:
+ /**
+ * @brief Signal: Reload configuration.
+ *
+ * When a Helper object send a RELOAD_CONFIG event to this Panel,
+ * this signal will be emitted. Panel should reload all configuration here.
+ */
+ Connection signal_connect_reload_config (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Turn on.
+ *
+ * slot prototype: void turn_on (void);
+ */
+ Connection signal_connect_turn_on (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Turn off.
+ *
+ * slot prototype: void turn_off (void);
+ */
+ Connection signal_connect_turn_off (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Show panel.
+ *
+ * slot prototype: void show_panel (void);
+ */
+ Connection signal_connect_show_panel (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Hide panel.
+ *
+ * slot prototype: void hide_panel (void);
+ */
+ Connection signal_connect_hide_panel (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Update screen.
+ *
+ * slot prototype: void update_screen (int screen);
+ */
+ Connection signal_connect_update_screen (PanelAgentSlotInt *slot);
+
+ /**
+ * @brief Signal: Update spot location.
+ *
+ * slot prototype: void update_spot_location (int x, int y, int top_y);
+ */
+ Connection signal_connect_update_spot_location (PanelAgentSlotIntIntInt *slot);
+
+ /**
+ * @brief Signal: Update factory information.
+ *
+ * slot prototype: void update_factory_info (const PanelFactoryInfo &info);
+ */
+ Connection signal_connect_update_factory_info (PanelAgentSlotFactoryInfo *slot);
+
+ /**
+ * @brief Signal: start default ise.
+ *
+ * slot prototype: void start_default_ise (void);
+ */
+ Connection signal_connect_start_default_ise (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Get the list of keyboard ise name.
+ *
+ * slot prototype: bool get_keyboard_ise_list (std::vector<String> &);
+ */
+ Connection signal_connect_get_keyboard_ise_list (PanelAgentSlotBoolStringVector *slot);
+
+ /**
+ * @brief Signal: set candidate ui.
+ *
+ * slot prototype: void set_candidate_ui (int style, int mode);
+ */
+ Connection signal_connect_set_candidate_ui (PanelAgentSlotIntInt *slot);
+
+ /**
+ * @brief Signal: get candidate ui.
+ *
+ * slot prototype: void get_candidate_ui (int &style, int &mode);
+ */
+ Connection signal_connect_get_candidate_ui (PanelAgentSlotIntInt2 *slot);
+
+ /**
+ * @brief Signal: get candidate window rect.
+ *
+ * slot prototype: void get_candidate_rect (rectinfo &info);
+ */
+ Connection signal_connect_get_candidate_rect (PanelAgentSlotRect *slot);
+
+ /**
+ * @brief Signal: set candidate position.
+ *
+ * slot prototype: void set_candidate_position (int left, int top);
+ */
+ Connection signal_connect_set_candidate_position (PanelAgentSlotIntInt *slot);
+
+ /**
+ * @brief Signal: set keyboard ise.
+ *
+ * slot prototype: void set_keyboard_ise (int type, const String &ise);
+ */
+ Connection signal_connect_set_keyboard_ise (PanelAgentSlotIntString *slot);
+
+ /**
+ * @brief Signal: get keyboard ise.
+ *
+ * slot prototype: void get_keyboard_ise (String &ise_name);
+ */
+ Connection signal_connect_get_keyboard_ise (PanelAgentSlotString2 *slot);
+ /**
+ * @brief Signal: launch helper ise list selection.
+ *
+ * slot prototype: void launch_helper_ise_list_selecton (int withUI);
+ */
+ Connection signal_connect_launch_helper_ise_list_selection (PanelAgentSlotInt *slot);
+
+ /**
+ * @brief Signal: Show help.
+ *
+ * slot prototype: void show_help (const String &help);
+ */
+ Connection signal_connect_show_help (PanelAgentSlotString *slot);
+
+ /**
+ * @brief Signal: Show factory menu.
+ *
+ * slot prototype: void show_factory_menu (const std::vector <PanelFactoryInfo> &menu);
+ */
+ Connection signal_connect_show_factory_menu (PanelAgentSlotFactoryInfoVector *slot);
+
+ /**
+ * @brief Signal: Show preedit string.
+ *
+ * slot prototype: void show_preedit_string (void):
+ */
+ Connection signal_connect_show_preedit_string (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Show aux string.
+ *
+ * slot prototype: void show_aux_string (void):
+ */
+ Connection signal_connect_show_aux_string (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Show lookup table.
+ *
+ * slot prototype: void show_lookup_table (void):
+ */
+ Connection signal_connect_show_lookup_table (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Show associate table.
+ *
+ * slot prototype: void show_associate_table (void):
+ */
+ Connection signal_connect_show_associate_table (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Hide preedit string.
+ *
+ * slot prototype: void hide_preedit_string (void);
+ */
+ Connection signal_connect_hide_preedit_string (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Hide aux string.
+ *
+ * slot prototype: void hide_aux_string (void);
+ */
+ Connection signal_connect_hide_aux_string (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Hide lookup table.
+ *
+ * slot prototype: void hide_lookup_table (void);
+ */
+ Connection signal_connect_hide_lookup_table (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Hide associate table.
+ *
+ * slot prototype: void hide_associate_table (void);
+ */
+ Connection signal_connect_hide_associate_table (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Update preedit string.
+ *
+ * slot prototype: void update_preedit_string (const String &str, const AttributeList &attrs);
+ * - str -- The UTF-8 encoded string to be displayed in preedit area.
+ * - attrs -- The attributes of the string.
+ */
+ Connection signal_connect_update_preedit_string (PanelAgentSlotAttributeString *slot);
+
+ /**
+ * @brief Signal: Update preedit caret.
+ *
+ * slot prototype: void update_preedit_caret (int caret);
+ */
+ Connection signal_connect_update_preedit_caret (PanelAgentSlotInt *slot);
+
+ /**
+ * @brief Signal: Update aux string.
+ *
+ * slot prototype: void update_aux_string (const String &str, const AttributeList &attrs);
+ * - str -- The UTF-8 encoded string to be displayed in aux area.
+ * - attrs -- The attributes of the string.
+ */
+ Connection signal_connect_update_aux_string (PanelAgentSlotAttributeString *slot);
+
+ /**
+ * @brief Signal: Update lookup table.
+ *
+ * slot prototype: void update_lookup_table (const LookupTable &table);
+ * - table -- The new LookupTable object.
+ */
+ Connection signal_connect_update_lookup_table (PanelAgentSlotLookupTable *slot);
+
+ /**
+ * @brief Signal: Update associate table.
+ *
+ * slot prototype: void update_associate_table (const LookupTable &table);
+ * - table -- The new LookupTable object.
+ */
+ Connection signal_connect_update_associate_table (PanelAgentSlotLookupTable *slot);
+
+ /**
+ * @brief Signal: Register properties.
+ *
+ * Register properties of the focused instance.
+ *
+ * slot prototype: void register_properties (const PropertyList &props);
+ * - props -- The properties to be registered.
+ */
+ Connection signal_connect_register_properties (PanelAgentSlotPropertyList *slot);
+
+ /**
+ * @brief Signal: Update property.
+ *
+ * Update a property of the focused instance.
+ *
+ * slot prototype: void update_property (const Property &prop);
+ * - prop -- The property to be updated.
+ */
+ Connection signal_connect_update_property (PanelAgentSlotProperty *slot);
+
+ /**
+ * @brief Signal: Register properties of a helper.
+ *
+ * slot prototype: void register_helper_properties (int id, const PropertyList &props);
+ * - id -- The client id of the helper object.
+ * - props -- The properties to be registered.
+ */
+ Connection signal_connect_register_helper_properties (PanelAgentSlotIntPropertyList *slot);
+
+ /**
+ * @brief Signal: Update helper property.
+ *
+ * slot prototype: void update_helper_property (int id, const Property &prop);
+ * - id -- The client id of the helper object.
+ * - prop -- The property to be updated.
+ */
+ Connection signal_connect_update_helper_property (PanelAgentSlotIntProperty *slot);
+
+ /**
+ * @brief Signal: Register a helper object.
+ *
+ * A newly started helper object will send this event to Panel.
+ *
+ * slot prototype: register_helper (int id, const HelperInfo &helper);
+ * - id -- The client id of the helper object.
+ * - helper -- The information of the helper object.
+ */
+ Connection signal_connect_register_helper (PanelAgentSlotIntHelperInfo *slot);
+
+ /**
+ * @brief Signal: Remove a helper object.
+ *
+ * If a running helper close its connection to Panel, then this signal will be triggered to
+ * tell Panel to remove all data associated to this helper.
+ *
+ * slot prototype: void remove_helper (int id);
+ * - id -- The client id of the helper object to be removed.
+ */
+ Connection signal_connect_remove_helper (PanelAgentSlotInt *slot);
+
+ /**
+ * @brief Signal: Start an ise with the speficied uuid
+ *
+ * slot prototype: void set_active_ise_by_uuid (const String& uuid);
+ * - uuid -- the uuid of the ise object
+ */
+ Connection signal_connect_set_active_ise_by_uuid (PanelAgentSlotStringBool *slot);
+
+ /**
+ * @brief Signal: Start an ise with the speficied name
+ *
+ * slot prototype: void set_active_ise_by_name (const String& name);
+ * - name -- the name of the ise object
+ */
+ Connection signal_connect_set_active_ise_by_name (PanelAgentSlotString *slot);
+
+ /**
+ * @brief Signal: Focus in panel.
+ *
+ * slot prototype: void focus_in (void);
+ */
+ Connection signal_connect_focus_in (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Focus out panel.
+ *
+ * slot prototype: void focus_out (void);
+ */
+ Connection signal_connect_focus_out (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Get the list of ise name.
+ *
+ * slot prototype: bool get_ise_list (std::vector<String> &);
+ */
+ Connection signal_connect_get_ise_list (PanelAgentSlotBoolStringVector *slot);
+
+ /**
+ * @brief Signal: Get the list of selected language name.
+ *
+ * slot prototype: void get_language_list (std::vector<String> &);
+ */
+ Connection signal_connect_get_language_list (PanelAgentSlotStringVector *slot);
+
+ /**
+ * @brief Signal: Get the all languages name.
+ *
+ * slot prototype: void get_all_language (std::vector<String> &);
+ */
+ Connection signal_connect_get_all_language (PanelAgentSlotStringVector *slot);
+ /**
+ * @brief Signal: Get the language list of a specified ise.
+ *
+ * slot prototype: void get_ise_language (char *, std::vector<String> &);
+ */
+ Connection signal_connect_get_ise_language (PanelAgentSlotStrStringVector *slot);
+
+ /**
+ * @brief Signal: Set the isf language.
+ *
+ * slot prototype: void get_ise_language (char *, std::vector<String> &);
+ */
+ Connection signal_connect_set_isf_language (PanelAgentSlotString *slot);
+
+ /**
+ * @brief Signal: Get the ise information by uuid.
+ *
+ * slot prototype: bool get_ise_info_by_uuid (const String &, ISE_INFO &);
+ */
+ Connection signal_connect_get_ise_info_by_uuid (PanelAgentSlotStringISEINFO *slot);
+
+ /**
+ * @brief Signal: Get the ise information by name.
+ *
+ * slot prototype: bool get_ise_info_by_name (const String &, ISE_INFO &);
+ */
+ Connection signal_connect_get_ise_info_by_name (PanelAgentSlotStringISEINFO *slot);
+
+ /**
+ * @brief Signal: send key event in panel.
+ *
+ * slot prototype: void send_key_event (const KeyEvent &);
+ */
+ Connection signal_connect_send_key_event (PanelAgentSlotKeyEvent *slot);
+
+ /**
+ * @brief Signal: A transaction is started.
+ *
+ * This signal infers that the Panel should disable update before this transaction finishes.
+ *
+ * slot prototype: void signal_connect_transaction_start (void);
+ */
+ Connection signal_connect_transaction_start (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Accept connection for this PanelAgent.
+ *
+ * slot prototype: void accept_connection (int fd);
+ * - fd -- the file description for connection
+ */
+ Connection signal_connect_accept_connection (PanelAgentSlotInt *slot);
+
+ /**
+ * @brief Signal: Close connection for this PanelAgent.
+ *
+ * slot prototype: void close_connection (int fd);
+ * - fd -- the file description for connection
+ */
+ Connection signal_connect_close_connection (PanelAgentSlotInt *slot);
+
+ /**
+ * @brief Signal: Exit application for this PanelAgent.
+ *
+ * slot prototype: void app_exit (void);
+ */
+ Connection signal_connect_exit (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: A transaction is finished.
+ *
+ * This signal will get emitted when a transaction is finished. This implys to re-enable
+ * panel GUI update
+ *
+ * slot prototype: void signal_connect_transaction_end (void);
+ */
+ Connection signal_connect_transaction_end (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Lock the exclusive lock for this PanelAgent.
+ *
+ * The panel program should provide a thread lock and hook a slot into this signal to lock it.
+ * PanelAgent will use this lock to ensure the data integrity.
+ *
+ * slot prototype: void lock (void);
+ */
+ Connection signal_connect_lock (PanelAgentSlotVoid *slot);
+
+ /**
+ * @brief Signal: Unlock the exclusive lock for this PanelAgent.
+ *
+ * slot prototype: void unlock (void);
+ */
+ Connection signal_connect_unlock (PanelAgentSlotVoid *slot);
+};
+
+/** @} */
+
+} /* namespace scim */
+
+#endif /* __SCIM_PANEL_AGENT_H */
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/** @file scim_panel_client.cpp
+ * @brief Implementation of class PanelClient.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_panel_client.cpp,v 1.6 2005/06/26 16:35:33 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_TRANSACTION
+#define Uses_SCIM_TRANS_COMMANDS
+#define Uses_SCIM_PANEL_CLIENT
+#define Uses_SCIM_SOCKET
+#define Uses_SCIM_EVENT
+
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+typedef Signal1<void, int>
+ PanelClientSignalVoid;
+
+typedef Signal2<void, int, int>
+ PanelClientSignalInt;
+
+typedef Signal2<void, int, const String &>
+ PanelClientSignalString;
+
+typedef Signal2<void, int, const WideString &>
+ PanelClientSignalWideString;
+
+typedef Signal4<void, int, const String &, const String &, const Transaction &>
+ PanelClientSignalStringStringTransaction;
+
+typedef Signal2<void, int, const KeyEvent &>
+ PanelClientSignalKeyEvent;
+
+typedef Signal3<void, int, const WideString &, const AttributeList &>
+ PanelClientSignalStringAttrs;
+
+class PanelClient::PanelClientImpl
+{
+ SocketClient m_socket;
+ int m_socket_timeout;
+ uint32 m_socket_magic_key;
+ Transaction m_send_trans;
+ int m_current_icid;
+ int m_send_refcount;
+
+ PanelClientSignalVoid m_signal_reload_config;
+ PanelClientSignalVoid m_signal_exit;
+ PanelClientSignalInt m_signal_update_lookup_table_page_size;
+ PanelClientSignalVoid m_signal_lookup_table_page_up;
+ PanelClientSignalVoid m_signal_lookup_table_page_down;
+ PanelClientSignalVoid m_signal_reset_option;
+ PanelClientSignalString m_signal_trigger_property;
+ PanelClientSignalStringStringTransaction m_signal_process_helper_event;
+ PanelClientSignalInt m_signal_move_preedit_caret;
+ PanelClientSignalInt m_signal_select_aux;
+ PanelClientSignalInt m_signal_select_candidate;
+ PanelClientSignalKeyEvent m_signal_process_key_event;
+ PanelClientSignalWideString m_signal_commit_string;
+ PanelClientSignalKeyEvent m_signal_forward_key_event;
+ PanelClientSignalVoid m_signal_request_help;
+ PanelClientSignalVoid m_signal_request_factory_menu;
+ PanelClientSignalString m_signal_change_factory;
+ PanelClientSignalVoid m_signal_reset_keyboard_ise;
+ PanelClientSignalVoid m_signal_update_keyboard_ise;
+ PanelClientSignalVoid m_signal_show_preedit_string;
+ PanelClientSignalVoid m_signal_hide_preedit_string;
+ PanelClientSignalStringAttrs m_signal_update_preedit_string;
+
+public:
+ PanelClientImpl ()
+ : m_socket_timeout (scim_get_default_socket_timeout ()),
+ m_socket_magic_key (0),
+ m_current_icid (-1),
+ m_send_refcount (0)
+ {
+ }
+
+ int open_connection (const String &config, const String &display)
+ {
+ String panel_address = scim_get_default_panel_socket_address (display);
+ SocketAddress addr (panel_address);
+
+ if (m_socket.is_connected ()) close_connection ();
+
+ bool ret;
+ int i, count = 0;
+
+ /* Try three times. */
+ while (1) {
+ ret = m_socket.connect (addr);
+ if (ret == false) {
+ scim_usleep (100000);
+ launch_panel (config, display);
+ std::cerr << " Re-connecting to PanelAgent server.";
+ ISF_SYSLOG (" Re-connecting to PanelAgent server.\n");
+ for (i = 0; i < 200; ++i) {
+ if (m_socket.connect (addr)) {
+ ret = true;
+ break;
+ }
+ std::cerr << ".";
+ scim_usleep (200000);
+ }
+ std::cerr << " Connected :" << i << "\n";
+ ISF_SYSLOG (" Connected :%d\n", i);
+ if (m_socket.connect (addr) == false && count >= 2)
+ break;
+ }
+
+ if (ret && scim_socket_open_connection (m_socket_magic_key, String ("FrontEnd"), String ("Panel"), m_socket, m_socket_timeout)) {
+ ISF_SYSLOG (" PID=%d connect to PanelAgent (%s), connected:%d.\n", getpid (), panel_address.c_str (), count);
+ break;
+ } else {
+ std::cerr << " PID=" << getpid () << " cannot connect to PanelAgent (" << panel_address << "), connected:" << count << ".\n";
+ ISF_SYSLOG (" PID=%d cannot connect to PanelAgent (%s), connected:%d.\n", getpid (), panel_address.c_str (), count);
+ }
+
+ m_socket.close ();
+
+ if (count++ >= 400) break;
+
+ scim_usleep (300000);
+ }
+
+ return m_socket.get_id ();
+ }
+
+ void close_connection ()
+ {
+ m_socket.close ();
+ m_socket_magic_key = 0;
+ }
+
+ int get_connection_number () const
+ {
+ return m_socket.get_id ();
+ }
+
+ bool is_connected () const
+ {
+ return m_socket.is_connected ();
+ }
+
+ bool has_pending_event () const
+ {
+ return m_socket.is_connected () && m_socket.wait_for_data (0) > 0;
+ }
+
+ bool filter_event ()
+ {
+ Transaction recv;
+
+ if (!m_socket.is_connected () || !recv.read_from_socket (m_socket, m_socket_timeout))
+ return false;
+
+ int cmd;
+ uint32 context = (uint32)(-1);
+
+ if (!recv.get_command (cmd) || cmd != SCIM_TRANS_CMD_REPLY)
+ return true;
+
+ /* No context id available, so there will be some global command. */
+ if (recv.get_data_type () == SCIM_TRANS_DATA_COMMAND) {
+ while (recv.get_command (cmd)) {
+ switch (cmd) {
+ case SCIM_TRANS_CMD_RELOAD_CONFIG:
+ m_signal_reload_config ((int)context);
+ break;
+ case SCIM_TRANS_CMD_EXIT:
+ m_signal_exit ((int)context);
+ break;
+ default:
+ break;
+ }
+ }
+ return true;
+ }
+
+ /* Now for context related command. */
+ if (!recv.get_data (context))
+ return true;
+
+ while (recv.get_command (cmd)) {
+ switch (cmd) {
+ case SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE:
+ {
+ uint32 size;
+ if (recv.get_data (size))
+ m_signal_update_lookup_table_page_size ((int) context, (int) size);
+ }
+ break;
+ case SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP:
+ {
+ m_signal_lookup_table_page_up ((int) context);
+ }
+ break;
+ case SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN:
+ {
+ m_signal_lookup_table_page_down ((int) context);
+ }
+ break;
+ case ISM_TRANS_CMD_RESET_ISE_OPTION:
+ {
+ m_signal_reset_option ((int) context);
+ }
+ break;
+ case SCIM_TRANS_CMD_TRIGGER_PROPERTY:
+ {
+ String property;
+ if (recv.get_data (property))
+ m_signal_trigger_property ((int) context, property);
+ }
+ break;
+ case SCIM_TRANS_CMD_PROCESS_HELPER_EVENT:
+ {
+ String target_uuid;
+ String helper_uuid;
+ Transaction trans;
+ if (recv.get_data (target_uuid) && recv.get_data (helper_uuid) && recv.get_data (trans))
+ m_signal_process_helper_event ((int) context, target_uuid, helper_uuid, trans);
+ }
+ break;
+ case SCIM_TRANS_CMD_MOVE_PREEDIT_CARET:
+ {
+ uint32 caret;
+ if (recv.get_data (caret))
+ m_signal_move_preedit_caret ((int) context, (int) caret);
+ }
+ break;
+ case ISM_TRANS_CMD_SELECT_AUX:
+ {
+ uint32 item;
+ if (recv.get_data (item))
+ m_signal_select_aux ((int) context, (int) item);
+ }
+ break;
+ case SCIM_TRANS_CMD_SELECT_CANDIDATE:
+ {
+ uint32 item;
+ if (recv.get_data (item))
+ m_signal_select_candidate ((int) context, (int) item);
+ }
+ break;
+ case SCIM_TRANS_CMD_PROCESS_KEY_EVENT:
+ {
+ KeyEvent key;
+ if (recv.get_data (key))
+ m_signal_process_key_event ((int) context, key);
+ }
+ break;
+ case SCIM_TRANS_CMD_COMMIT_STRING:
+ {
+ WideString wstr;
+ if (recv.get_data (wstr))
+ m_signal_commit_string ((int) context, wstr);
+ }
+ break;
+ case SCIM_TRANS_CMD_FORWARD_KEY_EVENT:
+ {
+ KeyEvent key;
+ if (recv.get_data (key))
+ m_signal_forward_key_event ((int) context, key);
+ }
+ break;
+ case SCIM_TRANS_CMD_PANEL_REQUEST_HELP:
+ {
+ m_signal_request_help ((int) context);
+ }
+ break;
+ case SCIM_TRANS_CMD_PANEL_REQUEST_FACTORY_MENU:
+ {
+ m_signal_request_factory_menu ((int) context);
+ }
+ break;
+ case SCIM_TRANS_CMD_PANEL_CHANGE_FACTORY:
+ {
+ String sfid;
+ if (recv.get_data (sfid))
+ m_signal_change_factory ((int) context, sfid);
+ }
+ break;
+ case ISM_TRANS_CMD_PANEL_REQUEST_RESET_ISE:
+ {
+ m_signal_reset_keyboard_ise ((int) context);
+ }
+ break;
+ case ISM_TRANS_CMD_PANEL_UPDATE_KEYBOARD_ISE:
+ {
+ m_signal_update_keyboard_ise ((int) context);
+ }
+ break;
+ case SCIM_TRANS_CMD_SHOW_PREEDIT_STRING:
+ {
+ m_signal_show_preedit_string ((int) context);
+ }
+ break;
+ case SCIM_TRANS_CMD_HIDE_PREEDIT_STRING:
+ {
+ m_signal_hide_preedit_string ((int) context);
+ }
+ break;
+ case SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING:
+ {
+ WideString wstr;
+ AttributeList attrs;
+ if (recv.get_data (wstr) && recv.get_data (attrs))
+ m_signal_update_preedit_string ((int) context, wstr, attrs);
+ }
+ break;
+ case ISM_TRANS_CMD_TURN_ON_LOG:
+ {
+ printf ("<%s:%d>receive ISM_TRANS_CMD_TURN_ON_LOG\n", __FUNCTION__, __LINE__);
+ uint32 isOn;
+ if (recv.get_data (isOn)) {
+ if (isOn) {
+ printf ("<%s:%d>turn on log\n", __FUNCTION__, __LINE__);
+ DebugOutput::enable_debug (SCIM_DEBUG_AllMask);
+ DebugOutput::set_verbose_level (7);
+ } else {
+ printf ("<%s:%d>turn off log\n", __FUNCTION__, __LINE__);
+ DebugOutput::disable_debug (SCIM_DEBUG_AllMask);
+ DebugOutput::set_verbose_level (0);
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ return true;
+ }
+
+ bool prepare (int icid)
+ {
+ if (!m_socket.is_connected ()) return false;
+
+ int cmd;
+ uint32 data;
+
+ if (m_send_refcount <= 0) {
+ m_current_icid = icid;
+ m_send_trans.clear ();
+ m_send_trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ m_send_trans.put_data (m_socket_magic_key);
+ m_send_trans.put_data ((uint32) icid);
+
+ if (m_send_trans.get_command (cmd) &&
+ m_send_trans.get_data (data) &&
+ m_send_trans.get_data (data))
+ m_send_refcount = 0;
+ else
+ return false;
+ }
+
+ if (m_current_icid == icid) {
+ m_send_refcount ++;
+ return true;
+ }
+ return false;
+ }
+
+ bool send ()
+ {
+ if (!m_socket.is_connected ()) return false;
+
+ if (m_send_refcount <= 0) return false;
+
+ m_send_refcount --;
+
+ if (m_send_refcount > 0) return false;
+
+ if (m_send_trans.get_data_type () != SCIM_TRANS_DATA_UNKNOWN)
+ return m_send_trans.write_to_socket (m_socket, 0x4d494353);
+
+ return false;
+ }
+
+public:
+ void turn_on (int icid)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid)
+ m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_TURN_ON);
+ }
+ void turn_off (int icid)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid)
+ m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_TURN_OFF);
+ }
+ void update_screen (int icid, int screen)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_SCREEN);
+ m_send_trans.put_data ((uint32) screen);
+ }
+ }
+ void show_help (int icid, const String &help)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_SHOW_HELP);
+ m_send_trans.put_data (help);
+ }
+ }
+ void show_factory_menu (int icid, const std::vector <PanelFactoryInfo> &menu)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_SHOW_FACTORY_MENU);
+ for (size_t i = 0; i < menu.size (); ++ i) {
+ m_send_trans.put_data (menu [i].uuid);
+ m_send_trans.put_data (menu [i].name);
+ m_send_trans.put_data (menu [i].lang);
+ m_send_trans.put_data (menu [i].icon);
+ }
+ }
+ }
+ void focus_in (int icid, const String &uuid)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_FOCUS_IN);
+ m_send_trans.put_data (uuid);
+ }
+ }
+ void focus_out (int icid)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid)
+ m_send_trans.put_command (SCIM_TRANS_CMD_FOCUS_OUT);
+ }
+ void update_factory_info (int icid, const PanelFactoryInfo &info)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_UPDATE_FACTORY_INFO);
+ m_send_trans.put_data (info.uuid);
+ m_send_trans.put_data (info.name);
+ m_send_trans.put_data (info.lang);
+ m_send_trans.put_data (info.icon);
+ }
+ }
+ void update_spot_location (int icid, int x, int y, int top_y)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION);
+ m_send_trans.put_data ((uint32) x);
+ m_send_trans.put_data ((uint32) y);
+ m_send_trans.put_data ((uint32) top_y);
+ }
+ }
+ void update_cursor_position (int icid, int cursor_pos)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_CURSOR_POSITION);
+ m_send_trans.put_data ((uint32) cursor_pos);
+ }
+ }
+ void show_preedit_string (int icid)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid)
+ m_send_trans.put_command (SCIM_TRANS_CMD_SHOW_PREEDIT_STRING);
+ }
+ void show_aux_string (int icid)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid)
+ m_send_trans.put_command (SCIM_TRANS_CMD_SHOW_AUX_STRING);
+ }
+ void show_lookup_table (int icid)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid)
+ m_send_trans.put_command (SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE);
+ }
+ void hide_preedit_string (int icid)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid)
+ m_send_trans.put_command (SCIM_TRANS_CMD_HIDE_PREEDIT_STRING);
+ }
+ void hide_aux_string (int icid)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid)
+ m_send_trans.put_command (SCIM_TRANS_CMD_HIDE_AUX_STRING);
+ }
+ void hide_lookup_table (int icid)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid)
+ m_send_trans.put_command (SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE);
+ }
+ void update_preedit_string (int icid, const WideString &str, const AttributeList &attrs)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
+ m_send_trans.put_data (utf8_wcstombs (str));
+ m_send_trans.put_data (attrs);
+ }
+ }
+ void update_preedit_caret (int icid, int caret)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET);
+ m_send_trans.put_data ((uint32) caret);
+ }
+ }
+ void update_aux_string (int icid, const WideString &str, const AttributeList &attrs)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_AUX_STRING);
+ m_send_trans.put_data (utf8_wcstombs (str));
+ m_send_trans.put_data (attrs);
+ }
+ }
+ void update_lookup_table (int icid, const LookupTable &table)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE);
+ m_send_trans.put_data (table);
+ }
+ }
+ void register_properties (int icid, const PropertyList &properties)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_REGISTER_PROPERTIES);
+ m_send_trans.put_data (properties);
+ }
+ }
+ void update_property (int icid, const Property &property)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_PROPERTY);
+ m_send_trans.put_data (property);
+ }
+ }
+ void start_default_ise (int icid)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (ISM_TRANS_CMD_PANEL_START_DEFAULT_ISE);
+ }
+ }
+ void start_helper (int icid, const String &helper_uuid)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_START_HELPER);
+ m_send_trans.put_data (helper_uuid);
+ }
+ }
+
+ void stop_helper (int icid, const String &helper_uuid)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_STOP_HELPER);
+ m_send_trans.put_data (helper_uuid);
+ }
+ }
+ void send_helper_event (int icid, const String &helper_uuid, const Transaction &trans)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_SEND_HELPER_EVENT);
+ m_send_trans.put_data (helper_uuid);
+ m_send_trans.put_data (trans);
+ }
+ }
+ void register_input_context (int icid, const String &uuid)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid) {
+ m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_REGISTER_INPUT_CONTEXT);
+ m_send_trans.put_data (uuid);
+ }
+ }
+ void remove_input_context (int icid)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid)
+ m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_REMOVE_INPUT_CONTEXT);
+ }
+ void reset_input_context (int icid)
+ {
+ if (m_send_refcount > 0 && m_current_icid == icid)
+ m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT);
+ }
+ void turn_on_log (int icid, uint32 isOn)
+ {
+ m_send_trans.put_command (ISM_TRANS_CMD_TURN_ON_LOG);
+ m_send_trans.put_data (isOn);
+ }
+
+public:
+ void reset_signal_handler (void)
+ {
+ m_signal_reload_config.reset();
+ m_signal_exit.reset();
+ m_signal_update_lookup_table_page_size.reset();
+ m_signal_lookup_table_page_up.reset();
+ m_signal_lookup_table_page_down.reset();
+ m_signal_reset_option.reset();
+ m_signal_trigger_property.reset();
+ m_signal_process_helper_event.reset();
+ m_signal_move_preedit_caret.reset();
+ m_signal_select_aux.reset();
+ m_signal_select_candidate.reset();
+ m_signal_process_key_event.reset();
+ m_signal_commit_string.reset();
+ m_signal_forward_key_event.reset();
+ m_signal_request_help.reset();
+ m_signal_request_factory_menu.reset();
+ m_signal_change_factory.reset();
+ m_signal_reset_keyboard_ise.reset();
+ m_signal_update_keyboard_ise.reset();
+ m_signal_show_preedit_string.reset();
+ m_signal_hide_preedit_string.reset();
+ m_signal_update_preedit_string.reset();
+ }
+
+ Connection signal_connect_reload_config (PanelClientSlotVoid *slot)
+ {
+ return m_signal_reload_config.connect (slot);
+ }
+ Connection signal_connect_exit (PanelClientSlotVoid *slot)
+ {
+ return m_signal_exit.connect (slot);
+ }
+ Connection signal_connect_update_lookup_table_page_size (PanelClientSlotInt *slot)
+ {
+ return m_signal_update_lookup_table_page_size.connect (slot);
+ }
+ Connection signal_connect_lookup_table_page_up (PanelClientSlotVoid *slot)
+ {
+ return m_signal_lookup_table_page_up.connect (slot);
+ }
+ Connection signal_connect_lookup_table_page_down (PanelClientSlotVoid *slot)
+ {
+ return m_signal_lookup_table_page_down.connect (slot);
+ }
+ Connection signal_connect_reset_option (PanelClientSlotVoid *slot)
+ {
+ return m_signal_reset_option.connect (slot);
+ }
+ Connection signal_connect_trigger_property (PanelClientSlotString *slot)
+ {
+ return m_signal_trigger_property.connect (slot);
+ }
+ Connection signal_connect_process_helper_event (PanelClientSlotStringStringTransaction *slot)
+ {
+ return m_signal_process_helper_event.connect (slot);
+ }
+ Connection signal_connect_move_preedit_caret (PanelClientSlotInt *slot)
+ {
+ return m_signal_move_preedit_caret.connect (slot);
+ }
+ Connection signal_connect_select_aux (PanelClientSlotInt *slot)
+ {
+ return m_signal_select_aux.connect (slot);
+ }
+ Connection signal_connect_select_candidate (PanelClientSlotInt *slot)
+ {
+ return m_signal_select_candidate.connect (slot);
+ }
+ Connection signal_connect_process_key_event (PanelClientSlotKeyEvent *slot)
+ {
+ return m_signal_process_key_event.connect (slot);
+ }
+ Connection signal_connect_commit_string (PanelClientSlotWideString *slot)
+ {
+ return m_signal_commit_string.connect (slot);
+ }
+ Connection signal_connect_forward_key_event (PanelClientSlotKeyEvent *slot)
+ {
+ return m_signal_forward_key_event.connect (slot);
+ }
+ Connection signal_connect_request_help (PanelClientSlotVoid *slot)
+ {
+ return m_signal_request_help.connect (slot);
+ }
+ Connection signal_connect_request_factory_menu (PanelClientSlotVoid *slot)
+ {
+ return m_signal_request_factory_menu.connect (slot);
+ }
+ Connection signal_connect_change_factory (PanelClientSlotString *slot)
+ {
+ return m_signal_change_factory.connect (slot);
+ }
+
+ Connection signal_connect_reset_keyboard_ise (PanelClientSlotVoid *slot)
+ {
+ return m_signal_reset_keyboard_ise.connect (slot);
+ }
+
+ Connection signal_connect_update_keyboard_ise (PanelClientSlotVoid *slot)
+ {
+ return m_signal_update_keyboard_ise.connect (slot);
+ }
+
+ Connection signal_connect_show_preedit_string (PanelClientSlotVoid *slot)
+ {
+ return m_signal_show_preedit_string.connect (slot);
+ }
+
+ Connection signal_connect_hide_preedit_string (PanelClientSlotVoid *slot)
+ {
+ return m_signal_hide_preedit_string.connect (slot);
+ }
+
+ Connection signal_connect_update_preedit_string (PanelClientSlotStringAttrs *slot)
+ {
+ return m_signal_update_preedit_string.connect (slot);
+ }
+private:
+ void launch_panel (const String &config, const String &display) const
+ {
+ scim_launch_panel (true, config, display, NULL);
+ }
+};
+
+PanelClient::PanelClient ()
+ : m_impl (new PanelClientImpl ())
+{
+}
+
+PanelClient::~PanelClient ()
+{
+ delete m_impl;
+}
+
+int
+PanelClient::open_connection (const String &config, const String &display)
+{
+ return m_impl->open_connection (config, display);
+}
+
+void
+PanelClient::close_connection ()
+{
+ m_impl->close_connection ();
+}
+
+int
+PanelClient::get_connection_number () const
+{
+ return m_impl->get_connection_number ();
+}
+
+bool
+PanelClient::is_connected () const
+{
+ return m_impl->is_connected ();
+}
+
+bool
+PanelClient::has_pending_event () const
+{
+ return m_impl->has_pending_event ();
+}
+
+bool
+PanelClient::filter_event ()
+{
+ return m_impl->filter_event ();
+}
+
+bool
+PanelClient::prepare (int icid)
+{
+ return m_impl->prepare (icid);
+}
+
+bool
+PanelClient::send ()
+{
+ return m_impl->send ();
+}
+
+void
+PanelClient::turn_on (int icid)
+{
+ m_impl->turn_on (icid);
+}
+void
+PanelClient::turn_off (int icid)
+{
+ m_impl->turn_off (icid);
+}
+void
+PanelClient::update_screen (int icid, int screen)
+{
+ m_impl->update_screen (icid, screen);
+}
+void
+PanelClient::show_help (int icid, const String &help)
+{
+ m_impl->show_help (icid, help);
+}
+void
+PanelClient::show_factory_menu (int icid, const std::vector <PanelFactoryInfo> &menu)
+{
+ m_impl->show_factory_menu (icid, menu);
+}
+void
+PanelClient::focus_in (int icid, const String &uuid)
+{
+ m_impl->focus_in (icid, uuid);
+}
+void
+PanelClient::focus_out (int icid)
+{
+ m_impl->focus_out (icid);
+}
+void
+PanelClient::update_factory_info (int icid, const PanelFactoryInfo &info)
+{
+ m_impl->update_factory_info (icid, info);
+}
+void
+PanelClient::update_spot_location (int icid, int x, int y, int top_y)
+{
+ m_impl->update_spot_location (icid, x, y, top_y);
+}
+void
+PanelClient::update_cursor_position (int icid, int cursor_pos)
+{
+ m_impl->update_cursor_position (icid, cursor_pos);
+}
+void
+PanelClient::show_preedit_string (int icid)
+{
+ m_impl->show_preedit_string (icid);
+}
+void
+PanelClient::show_aux_string (int icid)
+{
+ m_impl->show_aux_string (icid);
+}
+void
+PanelClient::show_lookup_table (int icid)
+{
+ m_impl->show_lookup_table (icid);
+}
+void
+PanelClient::hide_preedit_string (int icid)
+{
+ m_impl->hide_preedit_string (icid);
+}
+void
+PanelClient::hide_aux_string (int icid)
+{
+ m_impl->hide_aux_string (icid);
+}
+void
+PanelClient::hide_lookup_table (int icid)
+{
+ m_impl->hide_lookup_table (icid);
+}
+void
+PanelClient::update_preedit_string (int icid, const WideString &str, const AttributeList &attrs)
+{
+ m_impl->update_preedit_string (icid, str, attrs);
+}
+void
+PanelClient::update_preedit_caret (int icid, int caret)
+{
+ m_impl->update_preedit_caret (icid, caret);
+}
+void
+PanelClient::update_aux_string (int icid, const WideString &str, const AttributeList &attrs)
+{
+ m_impl->update_aux_string (icid, str, attrs);
+}
+void
+PanelClient::update_lookup_table (int icid, const LookupTable &table)
+{
+ m_impl->update_lookup_table (icid, table);
+}
+void
+PanelClient::register_properties (int icid, const PropertyList &properties)
+{
+ m_impl->register_properties (icid, properties);
+}
+void
+PanelClient::update_property (int icid, const Property &property)
+{
+ m_impl->update_property (icid, property);
+}
+void
+PanelClient::start_default_ise (int icid)
+{
+ m_impl->start_default_ise (icid);
+}
+void
+PanelClient::start_helper (int icid, const String &helper_uuid)
+{
+ m_impl->start_helper (icid, helper_uuid);
+}
+
+void
+PanelClient::stop_helper (int icid, const String &helper_uuid)
+{
+ m_impl->stop_helper (icid, helper_uuid);
+}
+void
+PanelClient::send_helper_event (int icid, const String &helper_uuid, const Transaction &trans)
+{
+ m_impl->send_helper_event (icid, helper_uuid, trans);
+}
+void
+PanelClient::register_input_context (int icid, const String &uuid)
+{
+ m_impl->register_input_context (icid, uuid);
+}
+void
+PanelClient::remove_input_context (int icid)
+{
+ m_impl->remove_input_context (icid);
+}
+void
+PanelClient::reset_input_context (int icid)
+{
+ m_impl->reset_input_context (icid);
+}
+
+void
+PanelClient::turn_on_log (int icid, uint32 isOn)
+{
+ m_impl->turn_on_log (icid, isOn);
+}
+
+void
+PanelClient::reset_signal_handler (void)
+{
+ m_impl->reset_signal_handler ();
+}
+
+Connection
+PanelClient::signal_connect_reload_config (PanelClientSlotVoid *slot)
+{
+ return m_impl->signal_connect_reload_config (slot);
+}
+Connection
+PanelClient::signal_connect_exit (PanelClientSlotVoid *slot)
+{
+ return m_impl->signal_connect_exit (slot);
+}
+Connection
+PanelClient::signal_connect_update_lookup_table_page_size (PanelClientSlotInt *slot)
+{
+ return m_impl->signal_connect_update_lookup_table_page_size (slot);
+}
+Connection
+PanelClient::signal_connect_lookup_table_page_up (PanelClientSlotVoid *slot)
+{
+ return m_impl->signal_connect_lookup_table_page_up (slot);
+}
+Connection
+PanelClient::signal_connect_lookup_table_page_down (PanelClientSlotVoid *slot)
+{
+ return m_impl->signal_connect_lookup_table_page_down (slot);
+}
+Connection
+PanelClient::signal_connect_reset_option (PanelClientSlotVoid *slot)
+{
+ return m_impl->signal_connect_reset_option (slot);
+}
+Connection
+PanelClient::signal_connect_trigger_property (PanelClientSlotString *slot)
+{
+ return m_impl->signal_connect_trigger_property (slot);
+}
+Connection
+PanelClient::signal_connect_process_helper_event (PanelClientSlotStringStringTransaction *slot)
+{
+ return m_impl->signal_connect_process_helper_event (slot);
+}
+Connection
+PanelClient::signal_connect_move_preedit_caret (PanelClientSlotInt *slot)
+{
+ return m_impl->signal_connect_move_preedit_caret (slot);
+}
+Connection
+PanelClient::signal_connect_select_aux (PanelClientSlotInt *slot)
+{
+ return m_impl->signal_connect_select_aux (slot);
+}
+Connection
+PanelClient::signal_connect_select_candidate (PanelClientSlotInt *slot)
+{
+ return m_impl->signal_connect_select_candidate (slot);
+}
+Connection
+PanelClient::signal_connect_process_key_event (PanelClientSlotKeyEvent *slot)
+{
+ return m_impl->signal_connect_process_key_event (slot);
+}
+Connection
+PanelClient::signal_connect_commit_string (PanelClientSlotWideString *slot)
+{
+ return m_impl->signal_connect_commit_string (slot);
+}
+Connection
+PanelClient::signal_connect_forward_key_event (PanelClientSlotKeyEvent *slot)
+{
+ return m_impl->signal_connect_forward_key_event (slot);
+}
+Connection
+PanelClient::signal_connect_request_help (PanelClientSlotVoid *slot)
+{
+ return m_impl->signal_connect_request_help (slot);
+}
+Connection
+PanelClient::signal_connect_request_factory_menu (PanelClientSlotVoid *slot)
+{
+ return m_impl->signal_connect_request_factory_menu (slot);
+}
+Connection
+PanelClient::signal_connect_change_factory (PanelClientSlotString *slot)
+{
+ return m_impl->signal_connect_change_factory (slot);
+}
+
+Connection
+PanelClient::signal_connect_reset_keyboard_ise (PanelClientSlotVoid *slot)
+{
+ return m_impl->signal_connect_reset_keyboard_ise (slot);
+}
+
+Connection
+PanelClient::signal_connect_update_keyboard_ise (PanelClientSlotVoid *slot)
+{
+ return m_impl->signal_connect_update_keyboard_ise (slot);
+}
+
+Connection
+PanelClient::signal_connect_show_preedit_string (PanelClientSlotVoid *slot)
+{
+ return m_impl->signal_connect_show_preedit_string (slot);
+}
+
+Connection
+PanelClient::signal_connect_hide_preedit_string (PanelClientSlotVoid *slot)
+{
+ return m_impl->signal_connect_hide_preedit_string (slot);
+}
+
+Connection
+PanelClient::signal_connect_update_preedit_string (PanelClientSlotStringAttrs *slot)
+{
+ return m_impl->signal_connect_update_preedit_string (slot);
+}
+
+
+} /* namespace scim */
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/**
+ * @file scim_panel_client.h
+ * @brief Defines scim::PanelClient and it's related types.
+ *
+ * scim::PanelClient is a class used to connect with a Panel daemon.
+ * It acts like a Socket Client and handles all socket communication
+ * issues.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_panel_client.h,v 1.4 2005/06/26 16:35:33 suzhe Exp $
+ */
+
+#ifndef __SCIM_PANEL_CLIENT_H
+#define __SCIM_PANEL_CLIENT_H
+
+#include <scim_panel_common.h>
+
+namespace scim {
+
+/**
+ * @addtogroup Panel
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+typedef Slot1<void, int>
+ PanelClientSlotVoid;
+
+typedef Slot2<void, int, int>
+ PanelClientSlotInt;
+
+typedef Slot2<void, int, const String &>
+ PanelClientSlotString;
+
+typedef Slot2<void, int, const WideString &>
+ PanelClientSlotWideString;
+
+typedef Slot4<void, int, const String &, const String &, const Transaction &>
+ PanelClientSlotStringStringTransaction;
+
+typedef Slot2<void, int, const KeyEvent &>
+ PanelClientSlotKeyEvent;
+
+typedef Slot3<void, int, const WideString &, const AttributeList &>
+ PanelClientSlotStringAttrs;
+
+/**
+ * @brief PanelClient is used by FrontEnd to communicate with Panel daemon.
+ *
+ * All socket communication between FrontEnd and Panel is handled by this class.
+ * FrontEnd may just register some slots to the corresponding signals to handle
+ * the events sent from Panel.
+ */
+class PanelClient
+{
+ class PanelClientImpl;
+ PanelClientImpl *m_impl;
+
+ PanelClient (const PanelClient &);
+ const PanelClient & operator = (const PanelClient &);
+
+public:
+ PanelClient ();
+ ~PanelClient ();
+
+ /**
+ * @brief Open socket connection to the Panel.
+ *
+ * FrontEnd and Panel communicate with each other via the Socket created by Panel.
+ *
+ * FrontEnd can select/poll on the connection id returned by this method to see
+ * if there are any data available to be read. If any data are available,
+ * PanelClient::filter_event() should be called to process the data.
+ *
+ * If PanelClient::filter_event() returns false, then it means that the connection
+ * is broken and should be re-established by calling PanelClient::close_connection()
+ * and PanelClient::open_connection() again.
+ *
+ * This method would try to launch the panel daemon and make connection again,
+ * if the connection could not be established successfully.
+ * So this method should always success, unless the panel could not be started on
+ * the certain display.
+ *
+ * @param config The config module name which should be used by launching the panel daemon.
+ * @param display The display name which the panel daemon should run on.
+ * @return The id of the socket connection, -1 means connection is failed.
+ */
+ int open_connection (const String &config, const String &display);
+
+ /**
+ * @brief Close the connection to Panel.
+ */
+ void close_connection ();
+
+ /**
+ * @brief Return the connection id, which was returned by PanelClient::open_connection().
+ */
+ int get_connection_number () const;
+
+ /**
+ * @brief Return whether this PanelClient has been connected to a Panel.
+ */
+ bool is_connected () const;
+
+ /**
+ * @brief Check if there are any events available to be processed.
+ *
+ * If it returns true then FrontEnd should call
+ * PanelClient::filter_event() to process them.
+ *
+ * @return true if there are any events available.
+ */
+ bool has_pending_event () const;
+
+ /**
+ * @brief Filter the events sent from Panel daemon.
+ *
+ * Corresponding signal will be emitted in this method.
+ *
+ * @return false if the connection is broken, otherwise return true.
+ */
+ bool filter_event ();
+
+ /**
+ * @brief Prepare the send transation for an IC.
+ *
+ * This method should be called before any events would be sent to Panel.
+ *
+ * @param icid The id of the IC which has events to be sent to Panel.
+ * @return true if the preparation is ok.
+ */
+ bool prepare (int icid);
+
+ /**
+ * @brief Send the transaction to Panel.
+ * @return true if sent successfully.
+ */
+ bool send ();
+
+public:
+ /**
+ * @name Action methods to send events to Panel.
+ * @{
+ */
+ void turn_on (int icid);
+ void turn_off (int icid);
+ void update_screen (int icid, int screen);
+ void show_help (int icid, const String &help);
+ void show_factory_menu (int icid, const std::vector <PanelFactoryInfo> &menu);
+ void focus_in (int icid, const String &uuid);
+ void focus_out (int icid);
+ void update_factory_info (int icid, const PanelFactoryInfo &info);
+ void update_spot_location (int icid, int x, int y, int top_y);
+ void update_cursor_position (int icid, int cursor_pos);
+ void show_preedit_string (int icid);
+ void show_aux_string (int icid);
+ void show_lookup_table (int icid);
+ void hide_preedit_string (int icid);
+ void hide_aux_string (int icid);
+ void hide_lookup_table (int icid);
+ void update_preedit_string (int icid, const WideString &str, const AttributeList &attrs);
+ void update_preedit_caret (int icid, int caret);
+ void update_aux_string (int icid, const WideString &str, const AttributeList &attrs);
+ void update_lookup_table (int icid, const LookupTable &table);
+ void register_properties (int icid, const PropertyList &properties);
+ void update_property (int icid, const Property &property);
+ void start_default_ise (int icid);
+ void start_helper (int icid, const String &helper_uuid);
+ void stop_helper (int icid, const String &helper_uuid);
+ void send_helper_event (int icid, const String &helper_uuid, const Transaction &trans);
+ void register_input_context (int icid, const String &uuid);
+ void remove_input_context (int icid);
+ void reset_input_context (int icid);
+ void turn_on_log (int icid, uint32 isOn);
+ /** @} */
+
+public:
+ /**
+ * @name Signal connection functions.
+ *
+ * These functions are used by FrontEnds to connect their corresponding slots to
+ * this PanelClient's signals.
+ *
+ * The first parameter of each slot method is always "int context", which is the
+ * id of the input method context.
+ *
+ * @{
+ */
+
+ void reset_signal_handler (void);
+
+ /**
+ * @brief Signal: reload configuration.
+ *
+ * slot prototype: void reload_config (int context);
+ *
+ * The context parameter is useless here.
+ */
+ Connection signal_connect_reload_config (PanelClientSlotVoid *slot);
+
+ /**
+ * @brief Signal: exit the FrontEnd
+ *
+ * slot prototype: void exit (int context);
+ *
+ * The context parameter is useless here.
+ */
+ Connection signal_connect_exit (PanelClientSlotVoid *slot);
+
+ /**
+ * @brief Signal: update lookup table page size
+ *
+ * slot prototype: void update_lookup_table_page_size (int context, int page_size);
+ */
+ Connection signal_connect_update_lookup_table_page_size (PanelClientSlotInt *slot);
+
+ /**
+ * @brief Signal: lookup table page up
+ *
+ * slot prototype: void lookup_table_page_up (int context);
+ */
+ Connection signal_connect_lookup_table_page_up (PanelClientSlotVoid *slot);
+
+ /**
+ * @brief Signal: lookup table page down
+ *
+ * slot prototype: void lookup_table_page_down (int context);
+ */
+ Connection signal_connect_lookup_table_page_down (PanelClientSlotVoid *slot);
+
+ /**
+ * @brief Signal: reset imengine option
+ *
+ * slot prototype: void reset_option (int context);
+ */
+ Connection signal_connect_reset_option (PanelClientSlotVoid *slot);
+
+ /**
+ * @brief Signal: trigger property
+ *
+ * slot prototype: void trigger_property (int context, const String &property);
+ */
+ Connection signal_connect_trigger_property (PanelClientSlotString *slot);
+
+ /**
+ * @brief Signal: process helper event
+ *
+ * slot prototype: void process_helper_event (int context, const String &target_uuid, const String &helper_uuid, const Transaction &trans);
+ *
+ * - target_uuid is UUID of the IMEngineInstance object which should handle the events.
+ * - helper_uuid is UUID of the Helper which sent the events.
+ * - trans contains the events.
+ */
+ Connection signal_connect_process_helper_event (PanelClientSlotStringStringTransaction *slot);
+
+ /**
+ * @brief Signal: move preedit caret
+ *
+ * slot prototype: void move_preedit_caret (int context, int caret_pos);
+ */
+ Connection signal_connect_move_preedit_caret (PanelClientSlotInt *slot);
+
+ /**
+ * @brief Signal: select aux
+ *
+ * slot prototype: void select_aux (int context, int aux_index);
+ */
+ Connection signal_connect_select_aux (PanelClientSlotInt *slot);
+
+ /**
+ * @brief Signal: select candidate
+ *
+ * slot prototype: void select_candidate (int context, int cand_index);
+ */
+ Connection signal_connect_select_candidate (PanelClientSlotInt *slot);
+
+ /**
+ * @brief Signal: process key event
+ *
+ * slot prototype: void process_key_event (int context, const KeyEvent &key);
+ */
+ Connection signal_connect_process_key_event (PanelClientSlotKeyEvent *slot);
+
+ /**
+ * @brief Signal: commit string
+ *
+ * slot prototype: void commit_string (int context, const WideString &wstr);
+ */
+ Connection signal_connect_commit_string (PanelClientSlotWideString *slot);
+
+ /**
+ * @brief Signal: forward key event
+ *
+ * slot prototype: void forward_key_event (int context, const KeyEvent &key);
+ */
+ Connection signal_connect_forward_key_event (PanelClientSlotKeyEvent *slot);
+
+ /**
+ * @brief Signal: request help
+ *
+ * slot prototype: void request_help (int context);
+ */
+ Connection signal_connect_request_help (PanelClientSlotVoid *slot);
+
+ /**
+ * @brief Signal: request factory menu
+ *
+ * slot prototype: void request_factory_menu (int context);
+ */
+ Connection signal_connect_request_factory_menu (PanelClientSlotVoid *slot);
+
+ /**
+ * @brief Signal: change factory
+ *
+ * slot prototype: void change_factory (int context, const String &uuid);
+ */
+ Connection signal_connect_change_factory (PanelClientSlotString *slot);
+
+ /**
+ * @brief Signal: reset keyboard ise
+ *
+ * slot prototype: void reset_keyboard_ise (int context);
+ */
+ Connection signal_connect_reset_keyboard_ise (PanelClientSlotVoid *slot);
+
+ /**
+ * @brief Signal: update keyboard ise
+ *
+ * slot prototype: void update_keyboard_ise (int context);
+ */
+ Connection signal_connect_update_keyboard_ise (PanelClientSlotVoid *slot);
+
+ Connection signal_connect_show_preedit_string (PanelClientSlotVoid *slot);
+ Connection signal_connect_hide_preedit_string (PanelClientSlotVoid *slot);
+ Connection signal_connect_update_preedit_string (PanelClientSlotStringAttrs *slot);
+ /** @} */
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_PANEL_CLIENT_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/**
+ * @file scim_panel_common.h
+ * @brief Defines some structures and types which are used by both scim::PanelAgent and scim::PanelClient.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_panel_common.h,v 1.4 2005/05/13 04:21:29 suzhe Exp $
+ */
+
+#ifndef __SCIM_PANEL_COMMON_H
+#define __SCIM_PANEL_COMMON_H
+
+namespace scim {
+
+/**
+ * @addtogroup Panel
+ * @ingroup InputServiceFramework
+ * The accessory classes to help develop Panel daemons and FrontEnds
+ * which need to communicate with Panel daemons.
+ * @{
+ */
+
+class PanelError: public Exception
+{
+public:
+ PanelError (const String& what_arg)
+ : Exception (String("scim::Panel: ") + what_arg) { }
+};
+
+/**
+ * @brief Structure to hold factory information. It's used by PanelAgent and PanelClient classes.
+ */
+struct PanelFactoryInfo
+{
+ String uuid;
+ String name;
+ String lang;
+ String icon;
+
+ PanelFactoryInfo () { }
+ PanelFactoryInfo (const String &u, const String &n, const String &l, const String &i)
+ : uuid (u), name (n), lang (l), icon (i) { }
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_PANEL_COMMON_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/** @file scim_pointer.h
+ * @brief Smart pointer class interface.
+ *
+ * Provides a reference-counted-object aware smart pointer class.
+ *
+ * Most code of this file are came from Inti project.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ * Copyright (c) 2002 The Inti Development Team.
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_pointer.h,v 1.11 2005/01/10 08:30:54 suzhe Exp $
+ */
+
+#ifndef __SCIM_POINTER_H
+#define __SCIM_POINTER_H
+
+namespace scim {
+
+/**
+ * @addtogroup Accessories
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+/**
+ * @class Pointer
+ * @brief Smart pointer template class.
+ *
+ * Pointer is a standard auto_ptr-like smart pointer for managing heap
+ * allocated reference counted objects. T must be a class derived from
+ * scim::ReferencedObject.
+ */
+
+template <typename T>
+class Pointer
+{
+ T *t;
+
+ void set(T *object)
+ {
+ if (object)
+ {
+ if (!object->is_referenced())
+ object->ref();
+ object->set_referenced(false);
+ }
+ if (t)
+ t->unref();
+ t = object;
+ }
+
+ template<typename T1, typename T2>
+ friend bool operator == (const Pointer<T1>& t1, const Pointer<T2>& t2);
+
+public:
+//! @name Constructors
+//! @{
+
+ Pointer(T *object = 0) : t(0)
+ {
+ set(object);
+ }
+ //!< Construct a new smart pointer.
+ //!< @param object - a pointer to an object allocated on the heap.
+ //!<
+ //!< <BR>Initialize a new Pointer with any dumb pointer.
+
+ Pointer(Pointer& src) : t(0)
+ {
+ set(src.get());
+ }
+ //!< Copy constructor.
+ //!< @param src - a reference to a smart pointer.
+ //!<
+ //!< <BR>Initialize a new Pointer with any compatible Pointer.
+
+ template <typename T1>
+ Pointer(const Pointer<T1>& src) : t(0)
+ {
+ set(src.get());
+ }
+ //!< Copy constructor.
+ //!< @param src - a Pointer to type T1 where T1 is derived from T.
+ //!<
+ //!< <BR>Initialize a new Pointer of type T from a Pointer of type T1,
+ //!< only if T1 is derived from T.
+
+ ~Pointer()
+ {
+ set(0);
+ }
+ //!< Destructor.
+ //!< Decreases the object reference count.
+
+ Pointer& operator=(T *object)
+ {
+ set(object);
+ return *this;
+ }
+ //!< Assignment operator.
+ //!< @param object - a pointer to an object allocated on the heap.
+ //!<
+ //!< <BR>Releases the current dumb pointer, if any and assigns <EM>object</EM>
+ //!< to this Pointer, incrementing its reference count.
+
+ Pointer& operator=(const Pointer& src)
+ {
+ set(src.get());
+ return *this;
+ }
+ //!< Assignment operator.
+ //!< @param src - a reference to a smart pointer.
+ //!<
+ //!< <BR>Releases the current dumb pointer, if any and assigns the dumb pointer
+ //!< managed by <EM>src</EM> to this Pointer, incrementing its reference count.
+
+ template <typename T1>
+ Pointer& operator=(const Pointer<T1>& src)
+ {
+ set(src.get());
+ return *this;
+ }
+ //!< Assignment operator.
+ //!< @param src - a Pointer to type T1 where T1 is derived from T.
+ //!<
+ //!< <BR>Releases the current dumb pointer, if any and assigns the dumb pointer
+ //!< of type T1 managed by <EM>src</EM> to this Pointer as a dumb pointer of type T,
+ //!< only if T1 is derived from T. The reference count is incremented.
+
+//! @}
+//! @name Accessors
+//! @{
+
+ T& operator*() const
+ {
+ return *get();
+ }
+ //!< Dereference operator.
+ //!< @return a reference to the object pointed to by the dumb pointer.
+
+ T* operator->() const
+ {
+ return get();
+ }
+ //!< Member selection operator.
+ //!< @return the dumb pointer.
+
+ operator T*() const
+ {
+ return get();
+ }
+ //!< Conversion operator.
+ //!< Converts a Pointer into its dumb pointer: the C pointer it manages.
+ //!< Normally it is considered pretty evil to mix smart and regular pointers.
+ //!< In scim you can safely if you just follow the reference counting rules
+ //!< for each of them. You can never call delete on Pointer either because
+ //!< you don't call delete on scim objects; you call unref().
+
+ T* get() const
+ {
+ return t;
+ }
+ //!< Returns the dumb pointer; the regular C pointer managed by the Pointer.
+ //!< @return the dumb pointer.
+
+ bool null() const
+ {
+ return t == 0;
+ }
+ //!< Returns true if the Pointer has no dumb pointer.
+
+//! @}
+//! @name Methods
+//! @{
+
+ T* release()
+ {
+ T *tmp = t;
+ if (tmp)
+ tmp->ref();
+ set(0);
+ return tmp;
+ }
+ //!< Releases the dumb pointer.
+ //!< @return the regular C pointer previously managed by the Pointer.
+ //!<
+ //!< <BR>Before releasing the dumb pointer its reference count is incremented
+ //!< to prevent it being destroyed. You must call unref() on the pointer to
+ //!< prevent a memory leak.
+
+ void reset(T *object = 0)
+ {
+ set(object);
+ }
+ //!< Sets a new dumb pointer for the Pointer to manage.
+ //!< @param object - the new dumb pointer.
+ //!<
+ //!< <BR>Releases the current dumb pointer, if any, and assigns <EM>object</EM>
+ //!< to the Pointer, incrementing its reference count.
+
+//! @}
+};
+
+//! @name Equality operators
+//! @{
+
+template<typename T1, typename T2>
+inline bool operator == (const Pointer<T1>& t1, const Pointer<T2>& t2)
+{
+ return t1.t == t2.t;
+}
+//!< Compares two Pointers.
+//!< @return <EM>true</EM> if both Pointers manage to same dumb pointer.
+
+template<typename T1, typename T2>
+inline bool operator != (const Pointer<T1>& t1, const Pointer<T2>& t2)
+{
+ return !(t1 == t2);
+}
+//!< Compares two Pointers.
+//!< @return <EM>true</EM> if both Pointers manage a different dumb pointer.
+
+//! @}
+//! @name C++-style casting functions
+//! @{
+
+template <typename To, typename From>
+inline Pointer<To>
+cast_const(const Pointer<From>& from)
+{
+ return Pointer<To>(from ? const_cast<To*>(from.get()) : 0);
+}
+//!< Removes the <EM>const</EM> qualifier from a managed const dumb pointer.
+//!< @param from - a Pointer that manages a const dumb pointer.
+//!< @return a new Pointer that manages the non-const dumb pointer.
+//!<
+//!< <BR>Calls <EM>const_cast</EM> on the dumb pointer and returns the non-const
+//!< pointer as a new Pointer.
+
+template <typename To, typename From>
+inline Pointer<To>
+cast_dynamic(const Pointer<From>& from)
+{
+ return Pointer<To>(dynamic_cast<To*>(from.get()));
+}
+//!< Casts a managed polymophic dumb pointer down or across its inheritance heirarchy.
+//!< @param from - a Pointer managing a polymophic dumb pointer of type From.
+//!< @return a new Pointer managing the dumb pointer as a base or sibling pointer of type <EM>To</EM>.
+//!<
+//!< <BR>Calls <EM>dynmaic_cast</EM> to safely cast a managed polymophic dumb pointer
+//!< of type <EM>From</EM> to a base, derived or sibling class pointer of type <EM>To</EM>.
+
+template <typename To, typename From>
+inline Pointer<To>
+cast_static(const Pointer<From>& from)
+{
+ return Pointer<To>(from ? static_cast<To*>(from.get()) : 0);
+}
+//!< Casts a managed dumb pointer to a pointer to a related type.
+//!< @param from - a Pointer managing a dumb pointer of type From.
+//!< @return a new Pointer managing the dumb pointer as a pointer of type <EM>To</EM>.
+//!<
+//!< <BR>Calls <EM>static_cast</EM> to cast a dumb pointer of type <EM>From</EM> to a
+//!< pointer of type <EM>To</EM>.
+
+//! @}
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_POINTER_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_private.cpp
+ * @brief Do some library initialize work here.
+ */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_private.cpp,v 1.6.4.1 2007/03/11 12:35:10 suzhe Exp $
+ *
+ */
+
+#include "scim_private.h"
+#include "scim.h"
+
+#ifdef HAVE_LOCALE_H
+ #include <locale.h>
+#endif
+
+#include <sys/time.h>
+
+#ifdef TIME_WITH_SYS_TIME
+ #include <time.h>
+#endif
+
+#include <stdlib.h>
+
+namespace scim {
+
+class TextdomainInitializer {
+public:
+ TextdomainInitializer () {
+
+#ifdef HAVE_SETLOCALE
+ char *locale = setlocale (LC_MESSAGES, 0);
+ if (!locale || *locale == 'C')
+ setlocale (LC_MESSAGES, "");
+#endif
+
+ bindtextdomain (GETTEXT_PACKAGE, SCIM_LOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ }
+};
+
+class RandSeedInitializer {
+public:
+ RandSeedInitializer () {
+#ifdef HAVE_GETTIMEOFDAY
+ timeval cur_time;
+ if (gettimeofday (&cur_time, 0) == 0) {
+ srand (cur_time.tv_sec);
+ }
+#else
+ srand (time (0));
+#endif
+ }
+};
+
+static TextdomainInitializer __textdomain_initializer;
+static RandSeedInitializer __rand_seed_initializer;
+
+} // namespace scim
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/** @file scim_private.h
+ * private used headers are included in this header.
+ */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_private.h,v 1.11 2005/01/10 08:30:54 suzhe Exp $
+ */
+
+#ifndef __SCIM_PRIVATE_H
+#define __SCIM_PRIVATE_H
+
+// Include scim configuration header
+#ifdef HAVE_CONFIG_H
+ #include <config.h>
+#endif
+
+#if defined(HAVE_LIBINTL_H) && defined(ENABLE_NLS)
+ #include <libintl.h>
+ #define _(String) dgettext(GETTEXT_PACKAGE,String)
+ #define N_(String) (String)
+#else
+ #define _(String) (String)
+ #define N_(String) (String)
+ #define bindtextdomain(Package,Directory)
+ #define textdomain(domain)
+ #define bind_textdomain_codeset(domain,codeset)
+#endif
+
+#endif //__SCIM_PRIVATE_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_properties.h
+ * @brief Definition of scim::Property and scim::PropertyList
+ *
+ * Provide class scim::Property to hold of a property
+ * of a IMEngineInstance or a Panel GUI client.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_property.h,v 1.7 2005/01/10 08:30:54 suzhe Exp $
+ */
+
+#ifndef __SCIM_PROPERTY_H
+#define __SCIM_PROPERTY_H
+
+namespace scim {
+
+#define SCIM_PROPERTY_ACTIVE 0x01
+#define SCIM_PROPERTY_VISIBLE 0x02
+
+/**
+ * @addtogroup Accessories
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+/**
+ * @brief Class to hold a property of a IMEngineInstance object or a Panel GUI client.
+ *
+ * A property has four elements:
+ * - key
+ * An unique identify key of the property, for example:
+ * - /TableInstance
+ * - /TableInstance/FullWidthLetter
+ * In this case, the second property will be a leaf (maybe a submenu item) of the first property.
+ * - label
+ * A label of the property which should be displayed.
+ * - icon
+ * An icon file of the property which should be displayed along with label.
+ * - tip
+ * A string to descript what the property means.
+ *
+ * With path like keys, the properties can form a cascade structure, which may be displayed
+ * like a cascading menu.
+ *
+ * But only the leaf properties can act as trigger commands
+ * and give feedback to IMEngineInstance.
+ *
+ * All strings should be encoded into UTF-8.
+ */
+class Property
+{
+ String m_key;
+ String m_label;
+ String m_icon;
+ String m_tip;
+ uint16 m_state;
+
+public:
+ /**
+ * @brief Default constructor
+ */
+ Property () : m_state (0) { }
+
+ /**
+ * @brief Constructor
+ */
+ Property (const String &key,
+ const String &label,
+ const String &icon = String (""),
+ const String &tip = String (""))
+ : m_key (key), m_label (label), m_icon (icon),
+ m_tip (tip), m_state (SCIM_PROPERTY_VISIBLE | SCIM_PROPERTY_ACTIVE) { }
+
+ /**
+ * @brief Test if this property is valid.
+ *
+ * @return true if this property is valid.
+ */
+ bool valid () const { return m_key.length (); }
+
+ /**
+ * @brief If this property is visible.
+ *
+ * @return true if this property is visible.
+ */
+ bool visible () const { return m_state & SCIM_PROPERTY_VISIBLE; }
+
+ /**
+ * @brief If this property is active.
+ *
+ * A active property can be clicked by users.
+ *
+ * @return true if this property is active.
+ */
+ bool active () const { return m_state & SCIM_PROPERTY_ACTIVE; }
+
+ /**
+ * @brief Get the key of this property.
+ */
+ const String & get_key () const { return m_key; }
+
+ /**
+ * @brief Get the label of this property.
+ */
+ const String & get_label () const { return m_label; }
+
+ /**
+ * @brief Get the icon file of this property.
+ */
+ const String & get_icon () const { return m_icon; }
+
+ /**
+ * @brief Get the tip of this property.
+ */
+ const String & get_tip () const { return m_tip; }
+
+ /**
+ * @brief Set a new key for this property.
+ */
+ void set_key (const String & key) { m_key = key; }
+
+ /**
+ * @brief Set a new label for this property.
+ */
+ void set_label (const String & label) { m_label = label; }
+
+ /**
+ * @brief Set a new icon file for this property.
+ */
+ void set_icon (const String & icon) { m_icon = icon; }
+
+ /**
+ * @brief Set a new tip for this property.
+ */
+ void set_tip (const String & tip) { m_tip = tip; }
+
+ /**
+ * @brief Set if this property is active.
+ *
+ * @param active If this property is active.
+ */
+ void set_active (bool active) {
+ if (active) m_state |= SCIM_PROPERTY_ACTIVE;
+ else m_state &= (~ SCIM_PROPERTY_ACTIVE);
+ }
+
+ void show (bool visible = true) {
+ if (visible) m_state |= SCIM_PROPERTY_VISIBLE;
+ else m_state &= ~SCIM_PROPERTY_VISIBLE;
+ }
+
+ void hide (bool hidden = true) { show (!hidden); }
+
+ /**
+ * @brief Test if this property is a leaf of another one.
+ *
+ * @return true if this property is a leaf of the node.
+ */
+ bool is_a_leaf_of (const Property &node) const {
+ if (m_key.length () > node.m_key.length () &&
+ m_key.substr (0, node.m_key.length ()) == node.m_key &&
+ m_key [node.m_key.length ()] == '/')
+ return true;
+ return false;
+ }
+};
+
+inline bool
+operator < (const Property &lhs, const Property &rhs) {
+ return lhs.get_key () < rhs.get_key ();
+}
+
+inline bool
+operator < (const Property &lhs, const String &rhs) {
+ return lhs.get_key () < rhs;
+}
+
+inline bool
+operator < (const String &lhs, const Property &rhs) {
+ return lhs < rhs.get_key ();
+}
+
+inline bool
+operator == (const Property &lhs, const Property &rhs) {
+ return lhs.get_key () == rhs.get_key ();
+}
+
+inline bool
+operator == (const Property &lhs, const String &rhs) {
+ return lhs.get_key () == rhs;
+}
+
+inline bool
+operator == (const String &lhs, const Property &rhs) {
+ return lhs == rhs.get_key ();
+}
+
+inline bool
+operator != (const Property &lhs, const Property &rhs) {
+ return lhs.get_key () != rhs.get_key ();
+}
+
+inline bool
+operator != (const Property &lhs, const String &rhs) {
+ return lhs.get_key () != rhs;
+}
+
+inline bool
+operator != (const String &lhs, const Property &rhs) {
+ return lhs != rhs.get_key ();
+}
+
+/**
+ * @typedef std::vector<Property> PropertyList;
+ * @brief The container to store a set of Properties.
+ *
+ * You should use the STL container methods to manipulate its objects.
+ */
+typedef std::vector<Property> PropertyList;
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_PROPERTY_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/*
+ * Most code of this file are came from Inti project.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ * Copyright (c) 2002 The Inti Development Team.
+ * Copyright (c) 2000 Red Hat, Inc.
+ * Copyright 1999, Karl Einar Nelson
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_signals.cpp,v 1.7 2005/01/10 08:30:54 suzhe Exp $
+ */
+
+#define Uses_SCIM_OBJECT
+#define Uses_SCIM_SIGNALS
+#define Uses_SCIM_SLOT
+#define Uses_SCIM_CONNECTION
+
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+/* SlotNode
+ */
+
+SlotNode::SlotNode(Slot *slot)
+: Node(slot), is_blocked(false)
+{
+}
+
+SlotNode::~SlotNode()
+{
+}
+
+void
+SlotNode::block()
+{
+ is_blocked = true;
+}
+
+void
+SlotNode::unblock()
+{
+ is_blocked = false;
+}
+
+void
+SlotNode::disconnect()
+{
+ Node::disconnect ();
+ is_blocked = true;
+}
+
+/* Signal;
+ */
+
+Signal::Signal()
+{
+}
+
+Signal::~Signal()
+{
+}
+
+SlotNode*
+Signal::connect(Slot *slot)
+{
+ SlotNode *node = new SlotNode(slot);
+ connection_list.push_back(node);
+ return node;
+}
+
+void
+Signal::reset()
+{
+ connection_list.clear ();
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/**
+ * @file scim_signals.h
+ * @brief C++ signal interface.
+ *
+ * Provides a set of signal class templates you can use to create signals
+ * that can pass up to 6 arguments to signal handlers connected via the
+ * slot interface (see scim_slot.h). The signal classes are named Signal0
+ * to Signal6, where 0 to 6 specifies the number of arguments that can be
+ * passed to a slot.
+ *
+ * Most code of this file are came from Inti project.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ * Copyright (c) 2002 The Inti Development Team.
+ * Copyright (c) 2000 Red Hat, Inc.
+ * Copyright 1999, Karl Einar Nelson
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_signals.h,v 1.12 2005/01/30 13:24:13 suzhe Exp $
+ */
+
+#ifndef __SCIM_SIGNALS_H
+#define __SCIM_SIGNALS_H
+
+namespace scim {
+
+/**
+ * @addtogroup SignalSlot
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+class Signal;
+
+//! @class SlotNode
+//! @brief A node class for managing slots connected to scim::Signal's.
+
+class SlotNode : public Node
+{
+ friend class Signal;
+
+ SlotNode(Slot *slot);
+ ~SlotNode();
+
+ bool is_blocked;
+
+public:
+ bool blocked() const { return is_blocked; }
+ //!< Returns true if the slot is blocked.
+
+ virtual void block();
+ //!< Block signal emission to the slot until unblock is called.
+
+ virtual void unblock();
+ //!< Unblock the slot so signal emmissions can be received.
+
+ virtual void disconnect();
+ //!< Disconnect the slot. The slot will no longer recieve signal emissions.
+};
+
+// DefaultMarshal class (from marshal.h, libsigc++)
+
+template <typename R>
+class DefaultMarshal
+{
+public:
+ typedef R OutType;
+ typedef R InType;
+
+private:
+ OutType value_;
+
+public:
+ DefaultMarshal() :value_() {}
+
+ OutType& value() { return value_; }
+
+ // Return true to stop emission.
+ bool marshal(const InType & newval)
+ {
+ value_ = newval;
+ return false;
+ }
+};
+
+// Marshal specialization
+template <>
+class DefaultMarshal <bool>
+{
+public:
+ typedef bool OutType;
+ typedef bool InType;
+
+private:
+ OutType value_;
+
+public:
+ DefaultMarshal() :value_(false) {}
+
+ OutType& value() { return value_; }
+
+ // Return true to stop emission.
+ bool marshal(const InType & newval)
+ {
+ value_ = newval;
+ return false;
+ }
+};
+
+//! @class Signal
+//! @brief Base class for the C++ signal interface.
+
+class Signal
+{
+ Signal(const Signal&);
+ Signal& operator=(const Signal&);
+
+protected:
+ typedef std::vector< Pointer<SlotNode> > ConnectionList;
+ //!< ConnectionList type.
+
+ ConnectionList connection_list;
+ //!< A list of all the slots connected to the signal.
+
+public:
+ Signal();
+ //!< Constructor.
+
+ virtual ~Signal();
+ //!< Destructor.
+
+ SlotNode* connect(Slot *slot);
+ void reset ();
+ //!< Creates a new SlotNode for slot and adds it to the <EM>connection_list</EM>.
+};
+
+//! @class Signal0
+//! @brief A template for a signal passing no arguments and returning a value of type R.
+
+template<typename R, typename Marshal = class DefaultMarshal<R> >
+class Signal0 : public Signal
+{
+ typedef Signal0<R> Self;
+
+ static R callback(void *data)
+ {
+ Self *s = static_cast<Self*>(data);
+ return s->emit();
+ }
+
+public:
+ typedef Slot0<R> SlotType;
+ //!< Function signature for handlers connecting the signal.
+
+ Connection connect(SlotType *slot)
+ {
+ return Signal::connect(slot);
+ }
+ //!< Connect a slot to the signal.
+ //!< @param slot - a slot of type Slot0<R>.
+ //!< @return a connection object.
+ //!<
+ //!< <BR>The returned connection object can be used alter or change the connection.
+
+ SlotType* slot()
+ {
+ return new SignalSlot0<Self, R>(this, &callback);
+ }
+ //!< Returns a slot for this signal.
+ //!< @return a new slot of type Slot0<R>.
+ //!<
+ //!< <BR>The returned slot can be passed to another signal allowing the
+ //!< other signal to call this signal when it gets emitted.
+
+ R emit()
+ {
+ Marshal m;
+ ConnectionList::iterator i = connection_list.begin();
+ while (i != connection_list.end())
+ {
+ if (!(*i)->blocked())
+ {
+ SlotType *slot = static_cast<SlotType*>((*i)->slot());
+ if (slot && m.marshal(slot->call()))
+ break;
+ }
+ ++i;
+ }
+ return m.value();
+ }
+ //!< Emit the signal.
+ //!< @return the value returned by the signal handler.
+ //!<
+ //!< <BR>Calls every slot connected to this signal, in order of connection.
+
+ R operator()()
+ {
+ return emit();
+ }
+ //!< Function operator; calls emit().
+};
+
+// Signal0 partially specialized for void return
+
+template<typename IgnoreMarshal>
+class Signal0<void, IgnoreMarshal> : public Signal
+{
+ typedef Signal0<void, IgnoreMarshal> Self;
+
+ static void callback(void *data)
+ {
+ Self *s = static_cast<Self*>(data);
+ s->emit();
+ }
+
+public:
+ typedef Slot0<void> SlotType;
+
+ Connection connect(SlotType *slot)
+ {
+ return Signal::connect(slot);
+ }
+
+ void reset ()
+ {
+ Signal::reset ();
+ }
+
+ SlotType* slot()
+ {
+ return new SignalSlot0<Self, void>(this, &callback);
+ }
+
+ void emit()
+ {
+ ConnectionList::iterator i = connection_list.begin();
+ while (i != connection_list.end())
+ {
+ if (!(*i)->blocked())
+ {
+ SlotType *slot = static_cast<SlotType*>((*i)->slot());
+ if (slot) slot->call();
+ }
+ ++i;
+ }
+ }
+
+ void operator()()
+ {
+ emit();
+ }
+};
+
+//! @class Signal1
+//! @brief A template for a signal passing one argument of type P1 and returning a value of type R.
+
+template<typename R, typename P1, typename Marshal = class DefaultMarshal<R> >
+class Signal1 : public Signal
+{
+ typedef Signal1<R, P1> Self;
+
+ static R callback(void *data, P1 p1)
+ {
+ Self *s = static_cast<Self*>(data);
+ return s->emit(p1);
+ }
+
+public:
+ typedef Slot1<R, P1> SlotType;
+ //!< Function signature for handlers connecting to the signal.
+
+ Connection connect(SlotType *slot)
+ {
+ return Signal::connect(slot);
+ }
+
+ void reset ()
+ {
+ Signal::reset ();
+ }
+ //!< Connect a slot to the signal.
+ //!< @param slot - a slot of type Slot1<R, P1>.
+ //!< @return a connection object.
+ //!<
+ //!< <BR>The returned connection object can be used alter or change the connection.
+
+ SlotType* slot()
+ {
+ return new SignalSlot1<Self, R, P1>(this, &callback);
+ }
+ //!< Returns a slot for this signal.
+ //!< @return a new slot of type Slot1<R, P1>.
+ //!<
+ //!< <BR>The returned slot can be passed to another signal allowing the
+ //!< other signal to call this signal when it gets emitted.
+
+ R emit(P1 p1)
+ {
+ Marshal m;
+ ConnectionList::iterator i = connection_list.begin();
+ while (i != connection_list.end())
+ {
+ if (!(*i)->blocked())
+ {
+ SlotType *slot = static_cast<SlotType*>((*i)->slot());
+ if (slot && m.marshal(slot->call(p1)))
+ break;
+ }
+ ++i;
+ }
+ return m.value();
+ }
+ //!< Emit the signal.
+ //!< @param p1 - passes p1 to the signal handler.
+ //!< @return the value returned by the signal handler.
+ //!<
+ //!< <BR>Calls every slot connected to this signal, in order of connection.
+
+ R operator()(P1 p1)
+ {
+ return emit(p1);
+ }
+ //!< Function operator; calls emit().
+};
+
+// Signal1 partially specialized for void return
+
+template<typename P1, typename IgnoreMarshal>
+class Signal1<void, P1, IgnoreMarshal> : public Signal
+{
+ typedef Signal1<void, P1, IgnoreMarshal> Self;
+
+ static void callback(void *data, P1 p1)
+ {
+ Self *s = static_cast<Self*>(data);
+ s->emit(p1);
+ }
+
+public:
+ typedef Slot1<void, P1> SlotType;
+
+ Connection connect(SlotType *slot)
+ {
+ return Signal::connect(slot);
+ }
+
+ void reset ()
+ {
+ Signal::reset ();
+ }
+
+ SlotType* slot()
+ {
+ return new SignalSlot1<Self, void, P1>(this, &callback);
+ }
+
+ void emit(P1 p1)
+ {
+ ConnectionList::iterator i = connection_list.begin();
+ while (i != connection_list.end())
+ {
+ if (!(*i)->blocked())
+ {
+ SlotType *slot = static_cast<SlotType*>((*i)->slot());
+ if (slot) slot->call(p1);
+ }
+ ++i;
+ }
+ }
+
+ void operator()(P1 p1)
+ {
+ emit(p1);
+ }
+};
+
+//! @class Signal2
+//! @brief A template for a signal passing two arguments of type P1 and P2,
+//! and returning a value of type R.
+
+template<typename R, typename P1, typename P2, typename Marshal = class DefaultMarshal<R> >
+class Signal2 : public Signal
+{
+ typedef Signal2<R, P1, P2> Self;
+
+ static R callback(void *data, P1 p1, P2 p2)
+ {
+ Self *s = static_cast<Self*>(data);
+ return s->emit(p1, p2);
+ }
+
+public:
+ typedef Slot2<R, P1, P2> SlotType;
+ //!< Function signature for handlers connecting to the signal.
+
+ Connection connect(SlotType *slot)
+ {
+ return Signal::connect(slot);
+ }
+
+ void reset ()
+ {
+ Signal::reset ();
+ }
+
+ //!< Connect a slot to the signal.
+ //!< @param slot - a slot of type Slot2<R, P1, P2>.
+ //!< @return a connection object.
+ //!<
+ //!< <BR>The returned connection object can be used alter or change the connection.
+
+ SlotType* slot()
+ {
+ return new SignalSlot2<Self, R, P1, P2>(this, &callback);
+ }
+ //!< Returns a slot for this signal.
+ //!< @return a new slot of type Slot2<R, P1, P2>.
+ //!<
+ //!< <BR>The returned slot can be passed to another signal allowing the
+ //!< other signal to call this signal when it gets emitted.
+
+ R emit(P1 p1, P2 p2)
+ {
+ Marshal m;
+ ConnectionList::iterator i = connection_list.begin();
+ while (i != connection_list.end())
+ {
+ if (!(*i)->blocked())
+ {
+ SlotType *slot = static_cast<SlotType*>((*i)->slot());
+ if (slot && m.marshal(slot->call(p1, p2)))
+ break;
+ }
+ ++i;
+ }
+ return m.value();
+ }
+ //!< Emit the signal.
+ //!< @param p1 - passes p1 to the signal handler.
+ //!< @param p2 - passes p2 to the signal handler.
+ //!< @return the value returned by the signal handler.
+ //!<
+ //!< <BR>Calls every slot connected to this signal, in order of connection.
+
+ R operator()(P1 p1, P2 p2)
+ {
+ return emit(p1, p2);
+ }
+ //!< Function operator; calls emit().
+};
+
+// Signal2 partially specialized for void return
+
+template<typename P1, typename P2, typename IgnoreMarshal>
+class Signal2<void, P1, P2, IgnoreMarshal> : public Signal
+{
+ typedef Signal2<void, P1, P2, IgnoreMarshal> Self;
+
+ static void callback(void *data, P1 p1, P2 p2)
+ {
+ Self *s = static_cast<Self*>(data);
+ s->emit(p1, p2);
+ }
+
+public:
+ typedef Slot2<void, P1, P2> SlotType;
+
+ Connection connect(SlotType *slot)
+ {
+ return Signal::connect(slot);
+ }
+
+ void reset ()
+ {
+ Signal::reset ();
+ }
+
+ SlotType* slot()
+ {
+ return new SignalSlot2<Self, void, P1, P2>(this, &callback);
+ }
+
+ void emit(P1 p1, P2 p2)
+ {
+ ConnectionList::iterator i = connection_list.begin();
+ while (i != connection_list.end())
+ {
+ if (!(*i)->blocked())
+ {
+ SlotType *slot = static_cast<SlotType*>((*i)->slot());
+ if (slot) slot->call(p1, p2);
+ }
+ ++i;
+ }
+ }
+
+ void operator()(P1 p1, P2 p2)
+ {
+ emit(p1, p2);
+ }
+};
+
+//! @class Signal3
+//! @brief A template for a signal passing three arguments of type P1, P2 and P3,
+//! and returning a value of type R.
+
+template<typename R, typename P1, typename P2, typename P3, typename Marshal = class DefaultMarshal<R> >
+class Signal3 : public Signal
+{
+ typedef Signal3<R, P1, P2, P3> Self;
+
+ static R callback(void *data, P1 p1, P2 p2, P3 p3)
+ {
+ Self *s = static_cast<Self*>(data);
+ return s->emit(p1, p2, p3);
+ }
+
+public:
+ typedef Slot3<R, P1, P2, P3> SlotType;
+ //!< Function signature for handlers connecting to the signal.
+
+ Connection connect(SlotType *slot)
+ {
+ return Signal::connect(slot);
+ }
+
+ void reset ()
+ {
+ Signal::reset ();
+ }
+ //!< Connect a slot to the signal.
+ //!< @param slot - a slot of type Slot3<R, P1, P2, P3>.
+ //!< @return a connection object.
+ //!<
+ //!< <BR>The returned connection object can be used alter or change the connection.
+
+ SlotType* slot()
+ {
+ return new SignalSlot3<Self, R, P1, P2, P3>(this, &callback);
+ }
+ //!< Returns a slot for this signal.
+ //!< @return a new slot of type Slot3<R, P1, P2, P3>.
+ //!<
+ //!< <BR>The returned slot can be passed to another signal allowing the
+ //!< other signal to call this signal when it gets emitted.
+
+ R emit(P1 p1, P2 p2, P3 p3)
+ {
+ Marshal m;
+ ConnectionList::iterator i = connection_list.begin();
+ while (i != connection_list.end())
+ {
+ if (!(*i)->blocked())
+ {
+ SlotType *slot = static_cast<SlotType*>((*i)->slot());
+ if (slot && m.marshal(slot->call(p1, p2, p3)))
+ break;
+ }
+ ++i;
+ }
+ return m.value();
+ }
+ //!< Emit the signal.
+ //!< @param p1 - passes p1 to the signal handler.
+ //!< @param p2 - passes p2 to the signal handler.
+ //!< @param p3 - passes p3 to the signal handler.
+ //!< @return the value returned by the signal handler.
+ //!<
+ //!< <BR>Calls every slot connected to this signal, in order of connection.
+
+ R operator()(P1 p1, P2 p2, P3 p3)
+ {
+ return emit(p1, p2, p3);
+ }
+ //!< Function operator; calls emit().
+};
+
+// Signal3 partially specialized for void return
+
+template<typename P1, typename P2, typename P3, typename IgnoreMarshal>
+class Signal3<void, P1, P2, P3, IgnoreMarshal> : public Signal
+{
+ typedef Signal3<void, P1, P2, P3, IgnoreMarshal> Self;
+
+ static void callback(void *data, P1 p1, P2 p2, P3 p3)
+ {
+ Self *s = static_cast<Self*>(data);
+ s->emit(p1, p2, p3);
+ }
+
+public:
+ typedef Slot3<void, P1, P2, P3> SlotType;
+
+ Connection connect(SlotType *slot)
+ {
+ return Signal::connect(slot);
+ }
+
+ void reset ()
+ {
+ Signal::reset ();
+ }
+
+ SlotType* slot()
+ {
+ return new SignalSlot3<Self, void, P1, P2, P3>(this, &callback);
+ }
+
+ void emit(P1 p1, P2 p2, P3 p3)
+ {
+ ConnectionList::iterator i = connection_list.begin();
+ while (i != connection_list.end())
+ {
+ if (!(*i)->blocked())
+ {
+ SlotType *slot = static_cast<SlotType*>((*i)->slot());
+ if (slot) slot->call(p1, p2, p3);
+ }
+ ++i;
+ }
+ }
+
+ void operator()(P1 p1, P2 p2, P3 p3)
+ {
+ emit(p1, p2, p3);
+ }
+};
+
+//! @class Signal4
+//! @brief A template for a signal passing four arguments of type P1, P2, P3 and P4,
+//! and returning a value of type R.
+
+template<typename R, typename P1, typename P2, typename P3, typename P4, typename Marshal = class DefaultMarshal<R> >
+class Signal4 : public Signal
+{
+ typedef Signal4<R, P1, P2, P3, P4> Self;
+
+ static R callback(void *data, P1 p1, P2 p2, P3 p3, P4 p4)
+ {
+ Self *s = static_cast<Self*>(data);
+ return s->emit(p1, p2, p3, p4);
+ }
+
+public:
+ typedef Slot4<R, P1, P2, P3, P4> SlotType;
+ //!< Function signature for handlers connecting to the signal.
+
+ Connection connect(SlotType *slot)
+ {
+ return Signal::connect(slot);
+ }
+
+ void reset ()
+ {
+ Signal::reset ();
+ }
+ //!< Connect a slot to the signal.
+ //!< @param slot - a slot of type Slot4<R, P1, P2, P3, P4>.
+ //!< @return a connection object.
+ //!<
+ //!< <BR>The returned connection object can be used alter or change the connection.
+
+ SlotType* slot()
+ {
+ return new SignalSlot4<Self, R, P1, P2, P3, P4>(this, &callback);
+ }
+ //!< Returns a slot for this signal.
+ //!< @return a new slot of type Slot4<R, P1, P2, P3, P4>.
+ //!<
+ //!< <BR>The returned slot can be passed to another signal allowing the
+ //!< other signal to call this signal when it gets emitted.
+
+ R emit(P1 p1, P2 p2, P3 p3, P4 p4)
+ {
+ Marshal m;
+ ConnectionList::iterator i = connection_list.begin();
+ while (i != connection_list.end())
+ {
+ if (!(*i)->blocked())
+ {
+ SlotType *slot = static_cast<SlotType*>((*i)->slot());
+ if (slot && m.marshal(slot->call(p1, p2, p3, p4)))
+ break;
+ }
+ ++i;
+ }
+ return m.value();
+ }
+ //!< Emit the signal.
+ //!< @param p1 - passes p1 to the signal handler.
+ //!< @param p2 - passes p2 to the signal handler.
+ //!< @param p3 - passes p3 to the signal handler.
+ //!< @param p4 - passes p4 to the signal handler.
+ //!< @return the value returned by the signal handler.
+ //!<
+ //!< <BR>Calls every slot connected to this signal, in order of connection.
+
+ R operator()(P1 p1, P2 p2, P3 p3, P4 p4)
+ {
+ return emit(p1, p2, p3, p4);
+ }
+ //!< Function operator; calls emit().
+};
+
+// Signal4 partially specialized for void return
+
+template<typename P1, typename P2, typename P3, typename P4, typename IgnoreMarshal>
+class Signal4<void, P1, P2, P3, P4, IgnoreMarshal> : public Signal
+{
+ typedef Signal4<void, P1, P2, P3, P4, IgnoreMarshal> Self;
+
+ static void callback(void *data, P1 p1, P2 p2, P3 p3, P4 p4)
+ {
+ Self *s = static_cast<Self*>(data);
+ s->emit(p1, p2, p3, p4);
+ }
+
+public:
+ typedef Slot4<void, P1, P2, P3, P4> SlotType;
+
+ Connection connect(SlotType *slot)
+ {
+ return Signal::connect(slot);
+ }
+
+ void reset ()
+ {
+ Signal::reset ();
+ }
+
+ SlotType* slot()
+ {
+ return new SignalSlot4<Self, void, P1, P2, P3, P4>(this, &callback);
+ }
+
+ void emit(P1 p1, P2 p2, P3 p3, P4 p4)
+ {
+ ConnectionList::iterator i = connection_list.begin();
+ while (i != connection_list.end())
+ {
+ if (!(*i)->blocked())
+ {
+ SlotType *slot = static_cast<SlotType*>((*i)->slot());
+ if (slot) slot->call(p1, p2, p3, p4);
+ }
+ ++i;
+ }
+ }
+
+ void operator()(P1 p1, P2 p2, P3 p3, P4 p4)
+ {
+ emit(p1, p2, p3, p4);
+ }
+};
+
+//! @class Signal5
+//! @brief A template for a signal passing five arguments of type P1, P2, P3, P4 and P5,
+//! and returning a value of type R.
+
+template<typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename Marshal = class DefaultMarshal<R> >
+class Signal5 : public Signal
+{
+ typedef Signal5<R, P1, P2, P3, P4, P5> Self;
+
+ static R callback(void *data, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
+ {
+ Self *s = static_cast<Self*>(data);
+ return s->emit(p1, p2, p3, p4, p5);
+ }
+
+public:
+ typedef Slot5<R, P1, P2, P3, P4, P5> SlotType;
+ //!< Function signature for handlers connecting to the signal.
+
+ Connection connect(SlotType *slot)
+ {
+ return Signal::connect(slot);
+ }
+
+ void reset ()
+ {
+ Signal::reset ();
+ }
+ //!< Connect a slot to the signal.
+ //!< @param slot - a slot of type Slot5<R, P1, P2, P3, P4, P5>.
+ //!< @return a connection object.
+ //!<
+ //!< <BR>The returned connection object can be used alter or change the connection.
+
+ SlotType* slot()
+ {
+ return new SignalSlot5<Self, R, P1, P2, P3, P4, P5>(this, &callback);
+ }
+ //!< Returns a slot for this signal.
+ //!< @return a new slot of type Slot5<R, P1, P2, P3, P4, P5>.
+ //!<
+ //!< <BR>The returned slot can be passed to another signal allowing the
+ //!< other signal to call this signal when it gets emitted.
+
+ R emit(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
+ {
+ Marshal m;
+ ConnectionList::iterator i = connection_list.begin();
+ while (i != connection_list.end())
+ {
+ if (!(*i)->blocked())
+ {
+ SlotType *slot = static_cast<SlotType*>((*i)->slot());
+ if (slot && m.marshal(slot->call(p1, p2, p3, p4, p5)))
+ break;
+ }
+ ++i;
+ }
+ return m.value();
+ }
+ //!< Emit the signal.
+ //!< @param p1 - passes p1 to the signal handler.
+ //!< @param p2 - passes p2 to the signal handler.
+ //!< @param p3 - passes p3 to the signal handler.
+ //!< @param p4 - passes p4 to the signal handler.
+ //!< @param p5 - passes p5 to the signal handler.
+ //!< @return the value returned by the signal handler.
+ //!<
+ //!< <BR>Calls every slot connected to this signal, in order of connection.
+
+ R operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
+ {
+ return emit(p1, p2, p3, p4, p5);
+ }
+ //!< Function operator; calls emit().
+};
+
+// Signal5 partially specialized for void return
+
+template<typename P1, typename P2, typename P3, typename P4, typename P5, typename IgnoreMarshal>
+class Signal5<void, P1, P2, P3, P4, P5, IgnoreMarshal> : public Signal
+{
+ typedef Signal5<void, P1, P2, P3, P4, P5, IgnoreMarshal> Self;
+
+ static void callback(void *data, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
+ {
+ Self *s = static_cast<Self*>(data);
+ s->emit(p1, p2, p3, p4, p5);
+ }
+
+public:
+ typedef Slot5<void, P1, P2, P3, P4, P5> SlotType;
+
+ Connection connect(SlotType *slot)
+ {
+ return Signal::connect(slot);
+ }
+
+ void reset ()
+ {
+ Signal::reset ();
+ }
+
+ SlotType* slot()
+ {
+ return new SignalSlot5<Self, void, P1, P2, P3, P4, P5>(this, &callback);
+ }
+
+ void emit(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
+ {
+ ConnectionList::iterator i = connection_list.begin();
+ while (i != connection_list.end())
+ {
+ if (!(*i)->blocked())
+ {
+ SlotType *slot = static_cast<SlotType*>((*i)->slot());
+ if (slot) slot->call(p1, p2, p3, p4, p5);
+ }
+ ++i;
+ }
+ }
+
+ void operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
+ {
+ emit(p1, p2, p3, p4, p5);
+ }
+};
+
+//! @class Signal6
+//! @brief A template for a signal passing six arguments of type P1, P2, P3, P4, P5 and P6,
+//! and returning a value of type R.
+
+template<typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename Marshal = class DefaultMarshal<R> >
+class Signal6 : public Signal
+{
+ typedef Signal6<R, P1, P2, P3, P4, P5, P6> Self;
+
+ static R callback(void *data, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
+ {
+ Self *s = static_cast<Self*>(data);
+ return s->emit(p1, p2, p3, p4, p5, p6);
+ }
+
+public:
+ typedef Slot6<R, P1, P2, P3, P4, P5, P6> SlotType;
+ //!< Function signature for handlers connecting to the signal.
+
+ Connection connect(SlotType *slot)
+ {
+ return Signal::connect(slot);
+ }
+
+ void reset ()
+ {
+ Signal::reset ();
+ }
+
+ //!< Connect a slot to the signal.
+ //!< @param slot - a slot of type Slot6<R, P1, P2, P3, P4, P5, P6>.
+ //!< @return a connection object.
+ //!<
+ //!< <BR>The returned connection object can be used alter or change the connection.
+
+ SlotType* slot()
+ {
+ return new SignalSlot6<Self, R, P1, P2, P3, P4, P5, P6>(this, &callback);
+ }
+ //!< Returns a slot for this signal.
+ //!< @return a new slot of type Slot6<R, P1, P2, P3, P4, P5, P6>.
+ //!<
+ //!< <BR>The returned slot can be passed to another signal allowing the
+ //!< other signal to call this signal when it gets emitted.
+
+ R emit(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
+ {
+ Marshal m;
+ ConnectionList::iterator i = connection_list.begin();
+ while (i != connection_list.end())
+ {
+ if (!(*i)->blocked())
+ {
+ SlotType *slot = static_cast<SlotType*>((*i)->slot());
+ if (slot && m.marshal(slot->call(p1, p2, p3, p4, p5, p6)))
+ break;
+ }
+ ++i;
+ }
+ return m.value();
+ }
+ //!< Emit the signal.
+ //!< @param p1 - passes p1 to the signal handler.
+ //!< @param p2 - passes p2 to the signal handler.
+ //!< @param p3 - passes p3 to the signal handler.
+ //!< @param p4 - passes p4 to the signal handler.
+ //!< @param p5 - passes p5 to the signal handler.
+ //!< @param p6 - passes p6 to the signal handler.
+ //!< @return the value returned by the signal handler.
+ //!<
+ //!< <BR>Calls every slot connected to this signal, in order of connection.
+
+ R operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
+ {
+ return emit(p1, p2, p3, p4, p5, p6);
+ }
+ //!< Function operator; calls emit().
+};
+
+/* Signal6 partially specialized for void return
+ */
+
+template<typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename IgnoreMarshal>
+class Signal6<void, P1, P2, P3, P4, P5, P6, IgnoreMarshal> : public Signal
+{
+ typedef Signal6<void, P1, P2, P3, P4, P5, P6, IgnoreMarshal> Self;
+
+ static void callback(void *data, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
+ {
+ Self *s = static_cast<Self*>(data);
+ s->emit(p1, p2, p3, p4, p5, p6);
+ }
+
+public:
+ typedef Slot6<void, P1, P2, P3, P4, P5, P6> SlotType;
+
+ Connection connect(SlotType *slot)
+ {
+ return Signal::connect(slot);
+ }
+
+ void reset ()
+ {
+ Signal::reset ();
+ }
+
+ SlotType* slot()
+ {
+ return new SignalSlot6<Self, void, P1, P2, P3, P4, P5, P6>(this, &callback);
+ }
+
+ void emit(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
+ {
+ ConnectionList::iterator i = connection_list.begin();
+ while (i != connection_list.end())
+ {
+ if (!(*i)->blocked())
+ {
+ SlotType *slot = static_cast<SlotType*>((*i)->slot());
+ if (slot) slot->call(p1, p2, p3, p4, p5, p6);
+ }
+ ++i;
+ }
+ }
+
+ void operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
+ {
+ emit(p1, p2, p3, p4, p5, p6);
+ }
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_SIGNALS_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/*
+ * Most code of this file are came from Inti project.
+ */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ * Copyright (c) 2002 The Inti Development Team.
+ * Copyright (c) 2000 Red Hat, Inc.
+ * Copyright 1999, Karl Einar Nelson
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_slot.cpp,v 1.5 2005/01/10 08:30:54 suzhe Exp $
+ */
+
+#define Uses_SCIM_SLOT
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+Slot::Slot()
+{
+}
+
+Slot::~Slot()
+{
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_slot.h
+ * @brief C++ slot interface.
+ *
+ * Provides a set of slot class templates. Slots are callable objects that
+ * can be used to connect functions, class methods and function objects to
+ * scim::Signals.
+ *
+ * Most code of this file are came from Inti project.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ * Copyright (c) 2002 The Inti Development Team.
+ * Copyright (c) 2000 Red Hat, Inc.
+ * Copyright 1999, Karl Einar Nelson
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_slot.h,v 1.8 2005/01/10 08:30:54 suzhe Exp $
+ */
+
+#ifndef __SCIM_SLOT_H
+#define __SCIM_SLOT_H
+
+namespace scim {
+
+/**
+ * @addtogroup SignalSlot
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+//! @name Slot functions returning a new slot
+//! @{
+
+//! @class Slot
+//! @brief Base class for slots that can connect to scim::Signals.
+
+class Slot : public ReferencedObject
+{
+ Slot(const Slot&);
+ Slot& operator=(const Slot&);
+
+protected:
+ Slot();
+ //!< Constructor.
+
+ virtual ~Slot() = 0;
+ //!< Destructor.
+};
+
+//! @class Slot0
+//! @brief Base class template for slots passing no arguments and returning a value of type R.
+
+template <typename R>
+class Slot0 : public Slot
+{
+protected:
+ Slot0() {}
+ //!< Constructor.
+
+public:
+ virtual R call() const = 0;
+ //!< Calls the signal handler connected to this slot.
+
+ R operator()() const { return call(); }
+ //!< Function operator; Calls call().
+};
+
+//! @class FunctionSlot0
+//! @brief A slot template for static functions taking no arguments and returning a value of type R.
+
+template <typename R>
+class FunctionSlot0 : public Slot0<R>
+{
+ typedef R (*PF)();
+ PF pf;
+
+public:
+ FunctionSlot0(PF function) : pf(function) {}
+ //!< Construct a new function slot for a static function.
+ //!< @param function - static function with the signature R (*PF)().
+
+ virtual R call() const { return (*pf)(); }
+ //!< Calls the function connected to this slot.
+ //!< @return a value of type R returned by the called function.
+};
+
+//! Overloaded slot factory function.
+//! @param function - a static function with the signature R (*function)().
+//! @return a new slot passing no arguments and returning a value of type R.
+//!
+//! <BR>If the returned slot is connected to a signal it doesn't have to be
+//! unreferenced. The signal it's connected to will unreference the slot when
+//! it is destroyed. Otherwise the slot must be unreferenced by calling unref().
+
+template <typename R>
+inline Slot0<R>*
+slot(R (*function)())
+{
+ return new FunctionSlot0<R>(function);
+}
+
+//! @class MethodSlot0
+//! @brief A slot template for methods in a class of type T taking no arguments and returning a value of type R.
+
+template <typename T, typename R>
+class MethodSlot0 : public Slot0<R>
+{
+ typedef R (T::*PMF)();
+ PMF pmf;
+ T *t;
+
+public:
+ MethodSlot0(T *object, PMF function) : pmf(function), t(object) {}
+ //!< Construct a new method slot for a class member function.
+ //!< @param object - a pointer to an object of type T.
+ //!< @param function - a class method with the signature R (T::*PMF)().
+
+ virtual R call() const { return (t->*pmf)(); }
+ //!< Calls the class method connected to this slot.
+ //!< @return a value of type R returned by the called method.
+};
+
+//! Overloaded slot factory function.
+//! @param object - a reference to a pointer to an object of type T1.
+//! @param function - a class method with the signature R (T2::*function)().
+//! @return a new slot passing no arguments and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R>
+inline Slot0<R>*
+slot(T1* &object, R (T2::*function)())
+{
+ return new MethodSlot0<T2, R>(object, function);
+}
+
+//! Overloaded slot factory function.
+//! @param object - a reference to a const pointer to an object of type T1 (e.g. this).
+//! @param function - a class method with the signature R (T2::*function)().
+//! @return a new slot passing no arguments and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R>
+inline Slot0<R>*
+slot(T1* const &object, R (T2::*function)())
+{
+ return new MethodSlot0<T2, R>(object, function);
+}
+
+//! Overloaded slot factory function.
+//! @param object - a reference to an object of type T1.
+//! @param function - a class method with the signature R (T2::*function)().
+//! @return a new slot passing no arguments and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R>
+inline Slot0<R>*
+slot(T1& object, R (T2::*function)())
+{
+ return new MethodSlot0<T2, R>(&object, function);
+}
+
+/* SignalSlot0
+ */
+
+template <typename T, typename R>
+class SignalSlot0 : public Slot0<R>
+{
+ typedef R (*PF)(void*);
+ PF pf;
+ T *t;
+
+public:
+ SignalSlot0(T *signal, PF function) : pf(function), t(signal) {}
+
+ virtual R call() const { return (*pf)(t); }
+};
+
+//! @class Slot1
+//! @brief Base class template for slots passing one argument of type P1 and returning a value of type R.
+
+template <typename R, typename P1>
+class Slot1 : public Slot
+{
+protected:
+ Slot1() {}
+ //!< Constructor.
+
+public:
+ virtual R call(P1 p1) const = 0;
+ //!< Calls the signal handler connected to this slot.
+
+ R operator()(P1 p1) const { return call(p1); }
+ //!< Function operator; Calls call().
+};
+
+//! @class FunctionSlot1
+//! @brief A slot template for static functions taking one argument of type P1
+//! and returning a value of type R.
+
+template <typename R, typename P1>
+class FunctionSlot1 : public Slot1<R, P1>
+{
+ typedef R (*PF)(P1);
+ PF pf;
+
+public:
+ FunctionSlot1(PF function) : pf(function) {}
+ //!< Construct a new function slot for a static function.
+ //!< @param function - static function with the signature R (*PF)(P1).
+
+ virtual R call(P1 p1) const { return (*pf)(p1); }
+ //!< Calls the function connected to this slot passing it argument p1.
+ //!< @return a value of type R returned by the called function.
+};
+
+//! Overloaded slot factory function.
+//! @param function - a static function with the signature R (*function)(P1).
+//! @return a new slot passing one argument of type P1 and returning a value of type R.
+//!
+//! <BR>If the returned slot is connected to a signal it doesn't have to be
+//! unreferenced. The signal it's connected to will unreference the slot when
+//! it is destroyed. Otherwise the slot must be unreferenced by calling unref().
+
+template <typename R, typename P1>
+inline Slot1<R, P1>*
+slot(R (*function)(P1))
+{
+ return new FunctionSlot1<R, P1>(function);
+}
+
+//! @class MethodSlot1
+//! @brief A slot template for methods in a class of type T taking one argument of type P1
+//! and returning a value of type R.
+
+template <typename T, typename R, typename P1>
+class MethodSlot1 : public Slot1<R, P1>
+{
+ typedef R (T::*PMF)(P1);
+ PMF pmf;
+ T *t;
+
+public:
+ MethodSlot1(T *object, PMF function) : pmf(function), t(object) {}
+ //!< Construct a new method slot for a class member function.
+ //!< @param object - a pointer to an object of type T.
+ //!< @param function - a class method with the signature R (T::*PMF)(P1).
+
+ virtual R call(P1 p1) const { return (t->*pmf)(p1); }
+ //!< Calls the class method connected to this slot passing it argument p1.
+ //!< @return a value of type R returned by the called method.
+};
+
+//! Overloaded slot factory function.
+//! @param object - a reference to a pointer to an object of type T1.
+//! @param function - a class method with the signature R (T2::*function)(P1).
+//! @return a new slot passing one argument of type P1 and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1>
+inline Slot1<R, P1>*
+slot(T1* &object, R (T2::*function)(P1))
+{
+ return new MethodSlot1<T2, R, P1>(object, function);
+}
+
+//! Overloaded slot factory function.
+//! @param object - a reference to a const pointer to an object of type T1 (e.g. this).
+//! @param function - a class method with the signature R (T2::*function)(P1).
+//! @return a new slot passing one argument of type P1 and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1>
+inline Slot1<R, P1>*
+slot(T1* const &object, R (T2::*function)(P1))
+{
+ return new MethodSlot1<T2, R, P1>(object, function);
+}
+
+//! Overloaded slot factory function.
+//! @param object - a reference to an object of type T1.
+//! @param function - a class method with the signature R (T2::*function)(P1).
+//! @return a new slot passing one argument of type P1 and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1>
+inline Slot1<R, P1>*
+slot(T1& object, R (T2::*function)(P1))
+{
+ return new MethodSlot1<T2, R, P1>(&object, function);
+}
+
+/* SignalSlot1
+ */
+
+template <typename T, typename R, typename P1>
+class SignalSlot1 : public Slot1<R, P1>
+{
+ typedef R (*PF)(void*, P1);
+ PF pf;
+ T *t;
+
+public:
+ SignalSlot1(T *signal, PF function) : pf(function), t(signal) {}
+
+ virtual R call(P1 p1) const { return (*pf)(t, p1); }
+};
+
+//! @class Slot2
+//! @brief Base class template for slots passing two arguments of type P1 and P2,
+//! and returning a value of type R.
+
+template <typename R, typename P1, typename P2>
+class Slot2 : public Slot
+{
+protected:
+ Slot2() {}
+ //!< Constructor.
+
+public:
+ virtual R call(P1 p1, P2 p2) const = 0;
+ //!< Calls the signal handler connected to this slot.
+
+ R operator()(P1 p1, P2 p2) const { return call(p1, p2); }
+ //!< Function operator; Calls call().
+};
+
+//! @class FunctionSlot2
+//! @brief A slot template for static functions taking two arguments of type P1 and P2,
+//! and returning a value of type R.
+
+template <typename R, typename P1, typename P2>
+class FunctionSlot2 : public Slot2<R, P1, P2>
+{
+ typedef R (*PF)(P1, P2);
+ PF pf;
+
+public:
+ FunctionSlot2(PF function) : pf(function) {}
+ //!< Construct a new function slot for a static function.
+ //!< @param function - static function with the signature R (*PF)(P1, P2).
+
+ virtual R call(P1 p1, P2 p2) const { return (*pf)(p1, p2); }
+ //!< Calls the function connected to this slot passing it arguments p1 and p2.
+ //!< @return a value of type R returned by the called function.
+};
+
+//! Overloaded slot factory function.
+//! @param function - a static function with the signature R (*function)(P1, P2).
+//! @return a new slot passing two arguments of type P1 and P2, and returning a value of type R.
+//!
+//! <BR>If the returned slot is connected to a signal it doesn't have to be
+//! unreferenced. The signal it's connected to will unreference the slot when
+//! it is destroyed. Otherwise the slot must be unreferenced by calling unref().
+
+template <typename R, typename P1, typename P2>
+inline Slot2<R, P1, P2>*
+slot(R (*function)(P1, P2))
+{
+ return new FunctionSlot2<R, P1, P2>(function);
+}
+
+//! @class MethodSlot2
+//! @brief A slot template for methods in a class of type T taking two arguments of type P1 and P2,
+//! and returning a value of type R.
+
+template <typename T, typename R, typename P1, typename P2>
+class MethodSlot2 : public Slot2<R, P1, P2>
+{
+ typedef R (T::*PMF)(P1, P2);
+ PMF pmf;
+ T *t;
+
+public:
+ MethodSlot2(T *object, PMF function) : pmf(function), t(object) {}
+ //!< Construct a new method slot for a class member function.
+ //!< @param object - a pointer to an object of type T.
+ //!< @param function - a class method with the signature R (T::*PMF)(P1, P2).
+
+ virtual R call(P1 p1, P2 p2) const { return (t->*pmf)(p1, p2); }
+ //!< Calls the class method connected to this slot passing it arguments p1 and p2.
+ //!< @return a value of type R returned by the called method.
+};
+
+//! Overloaded slot factory function.
+//! @param object - a reference to a pointer to an object of type T1.
+//! @param function - a class method with the signature R (T2::*function)(P1, P2).
+//! @return a new slot passing two arguments of type P1 and P2, and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1, typename P2>
+inline Slot2<R, P1, P2>*
+slot(T1* &object, R (T2::*function)(P1, P2))
+{
+ return new MethodSlot2<T2, R, P1, P2>(object, function);
+}
+
+//! Overloaded slot factory function.
+//! @param object - a reference to a const pointer to an object of type T1 (e.g. this).
+//! @param function - a class method with the signature R (T2::*function)(P1, P2).
+//! @return a new slot passing two arguments of type P1 and P2, and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1, typename P2>
+inline Slot2<R, P1, P2>*
+slot(T1* const &object, R (T2::*function)(P1, P2))
+{
+ return new MethodSlot2<T2, R, P1, P2>(object, function);
+}
+
+//! Overloaded slot factory function.
+//! @param object - a reference to an object of type T1.
+//! @param function - a class method with the signature R (T2::*function)(P1, P2).
+//! @return a new slot passing two arguments of type P1 and P2, and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1, typename P2>
+inline Slot2<R, P1, P2>*
+slot(T1& object, R (T2::*function)(P1, P2))
+{
+ return new MethodSlot2<T2, R, P1, P2>(&object, function);
+}
+
+/* SignalSlot2
+ */
+
+template <typename T, typename R, typename P1, typename P2>
+class SignalSlot2 : public Slot2<R, P1, P2>
+{
+ typedef R (*PF)(void*, P1, P2);
+ PF pf;
+ T *t;
+
+public:
+ SignalSlot2(T *signal, PF function) : pf(function), t(signal) {}
+
+ virtual R call(P1 p1, P2 p2) const { return (*pf)(t, p1, p2); }
+};
+
+//! @class Slot3
+//! @brief Base class template for slots passing three arguments of type P1, P2 and P3,
+//! and returning a value of type R.
+
+template <typename R, typename P1, typename P2, typename P3>
+class Slot3 : public Slot
+{
+protected:
+ Slot3() {}
+ //!< Constructor.
+
+public:
+ virtual R call(P1 p1, P2 p2, P3 p3) const = 0;
+ //!< Calls the signal handler connected to this slot.
+
+ R operator()(P1 p1, P2 p2, P3 p3) const { return call(p1, p2, p3); }
+ //!< Function operator; Calls call().
+};
+
+//! @class FunctionSlot3
+//! @brief A slot template for static functions taking three arguments of type P1, P2 and P3,
+//! and returning a value of type R.
+
+template <typename R, typename P1, typename P2, typename P3>
+class FunctionSlot3 : public Slot3<R, P1, P2, P3>
+{
+ typedef R (*PF)(P1, P2, P3);
+ PF pf;
+
+public:
+ FunctionSlot3(PF function) : pf(function) {}
+ //!< Construct a new function slot for a static function.
+ //!< @param function - static function with the signature R (*PF)(P1, P2, P3).
+
+ virtual R call(P1 p1, P2 p2, P3 p3) const { return (*pf)(p1, p2, p3); }
+ //!< Calls the function connected to this slot passing it arguments p1, p2 and p3.
+ //!< @return a value of type R returned by the called function.
+};
+
+//! Overloaded slot factory function.
+//! @param function - a static function with the signature R (*function)(P1, P2, P3).
+//! @return a new slot passing three arguments of type P1, P2 and P3, and returning a value of type R.
+//!
+//! <BR>If the returned slot is connected to a signal it doesn't have to be
+//! unreferenced. The signal it's connected to will unreference the slot when
+//! it is destroyed. Otherwise the slot must be unreferenced by calling unref().
+
+template <typename R, typename P1, typename P2, typename P3>
+inline Slot3<R, P1, P2, P3>*
+slot(R (*function)(P1, P2, P3))
+{
+ return new FunctionSlot3<R, P1, P2, P3>(function);
+}
+
+//! @class MethodSlot3
+//! @brief A slot template for methods in a class of type T taking three arguments of type P1, P2 and P3,
+//! and returning a value of type R.
+
+template <typename T, typename R, typename P1, typename P2, typename P3>
+class MethodSlot3 : public Slot3<R, P1, P2, P3>
+{
+ typedef R (T::*PMF)(P1, P2, P3);
+ PMF pmf;
+ T *t;
+
+public:
+ MethodSlot3(T *object, PMF function) : pmf(function), t(object) {}
+ //!< Construct a new method slot for a class member function.
+ //!< @param object - a pointer to an object of type T.
+ //!< @param function - a class method with the signature R (T::*PMF)(P1, P2, P3).
+
+ virtual R call(P1 p1, P2 p2, P3 p3) const { return (t->*pmf)(p1, p2, p3); }
+ //!< Calls the class method connected to this slot passing it arguments p1, p2 and p3.
+ //!< @return a value of type R returned by the called method.
+};
+
+//! Overloaded slot factory function.
+//! @param object - a reference to a pointer to an object of type T1.
+//! @param function - a class method with the signature R (T2::*function)(P1, P2, P3).
+//! @return a new slot passing three arguments of type P1, P2 and P3, and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1, typename P2, typename P3>
+inline Slot3<R, P1, P2, P3>*
+slot(T1* &object, R (T2::*function)(P1, P2, P3))
+{
+ return new MethodSlot3<T2, R, P1, P2, P3>(object, function);
+}
+
+//! Overloaded slot factory function.
+//! @param object - a reference to a const pointer to an object of type T1 (e.g. this).
+//! @param function - a class method with the signature R (T2::*function)(P1, P2, P3).
+//! @return a new slot passing three arguments of type P1, P2 and P3, and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1, typename P2, typename P3>
+inline Slot3<R, P1, P2, P3>*
+slot(T1* const &object, R (T2::*function)(P1, P2, P3))
+{
+ return new MethodSlot3<T2, R, P1, P2, P3>(object, function);
+}
+
+//! Overloaded slot factory function.
+//! @param object - a reference to an object of type T1.
+//! @param function - a class method with the signature R (T2::*function)(P1, P2, P3).
+//! @return a new slot passing three arguments of type P1, P2 and P3, and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1, typename P2, typename P3>
+inline Slot3<R, P1, P2, P3>*
+slot(T1& object, R (T2::*function)(P1, P2, P3))
+{
+ return new MethodSlot3<T2, R, P1, P2, P3>(&object, function);
+}
+
+/* SignalSlot3
+ */
+
+template <typename T, typename R, typename P1, typename P2, typename P3>
+class SignalSlot3 : public Slot3<R, P1, P2, P3>
+{
+ typedef R (*PF)(void*, P1, P2, P3);
+ PF pf;
+ T *t;
+
+public:
+ SignalSlot3(T *signal, PF function) : pf(function), t(signal) {}
+
+ virtual R call(P1 p1, P2 p2, P3 p3) const { return (*pf)(t, p1, p2, p3); }
+};
+
+//! @class Slot4
+//! @brief Base class template for slots passing four arguments of type P1, P2, P3 and P4,
+//! and returning a value of type R.
+
+template <typename R, typename P1, typename P2, typename P3, typename P4>
+class Slot4 : public Slot
+{
+protected:
+ Slot4() {}
+ //!< Constructor.
+
+public:
+ virtual R call(P1 p1, P2 p2, P3 p3, P4 p4) const = 0;
+ //!< Calls the signal handler connected to this slot.
+
+ R operator()(P1 p1, P2 p2, P3 p3, P4 p4) const { return call(p1, p2, p3, p4); }
+ //!< Function operator; Calls call().
+};
+
+//! @class FunctionSlot4
+//! @brief A slot template for static functions taking four arguments of type P1, P2, P3 and P4,
+//! and returning a value of type R.
+
+template <typename R, typename P1, typename P2, typename P3, typename P4>
+class FunctionSlot4 : public Slot4<R, P1, P2, P3, P4>
+{
+ typedef R (*PF)(P1, P2, P3, P4);
+ PF pf;
+
+public:
+ FunctionSlot4(PF function) : pf(function) {}
+ //!< Construct a new function slot for a static function.
+ //!< @param function - static function with the signature R (*PF)(P1, P2, P3, P4).
+
+ virtual R call(P1 p1, P2 p2, P3 p3, P4 p4) const { return (*pf)(p1, p2, p3, p4); }
+ //!< Calls the function connected to this slot passing it arguments p1, p2, p3 and p4.
+ //!< @return a value of type R returned by the called function.
+};
+
+//! Overloaded slot factory function.
+//! @param function - a static function with the signature R (*function)(P1, P2, P3, P4).
+//! @return a new slot passing four arguments of type P1, P2, P3 and P4, and returning a value of type R.
+//!
+//! <BR>If the returned slot is connected to a signal it doesn't have to be
+//! unreferenced. The signal it's connected to will unreference the slot when
+//! it is destroyed. Otherwise the slot must be unreferenced by calling unref().
+
+template <typename R, typename P1, typename P2, typename P3, typename P4>
+inline Slot4<R, P1, P2, P3, P4>*
+slot(R (*function)(P1, P2, P3, P4))
+{
+ return new FunctionSlot4<R, P1, P2, P3, P4>(function);
+}
+
+//! @class MethodSlot4
+//! @brief A slot template for methods in a class of type T taking four arguments of type P1, P2, P3 and P4,
+//! and returning a value of type R.
+
+template <typename T, typename R, typename P1, typename P2, typename P3, typename P4>
+class MethodSlot4 : public Slot4<R, P1, P2, P3, P4>
+{
+ typedef R (T::*PMF)(P1, P2, P3, P4);
+ PMF pmf;
+ T *t;
+
+public:
+ MethodSlot4(T *object, PMF function) : pmf(function), t(object) {}
+ //!< Construct a new method slot for a class member function.
+ //!< @param object - a pointer to an object of type T.
+ //!< @param function - a class method with the signature R (T::*PMF)(P1, P2, P3, P4).
+
+ virtual R call(P1 p1, P2 p2, P3 p3, P4 p4) const { return (t->*pmf)(p1, p2, p3, p4); }
+ //!< Calls the class method connected to this slot passing it arguments p1, p2, p3 and p4.
+ //!< @return a value of type R returned by the called method.
+};
+
+//! Overloaded slot factory function.
+//! @param object - a reference to a pointer to an object of type T1.
+//! @param function - a class method with the signature R (T2::*function)(P1, P2, P3, P4).
+//! @return a new slot passing four arguments of type P1, P2, P3 and P4, and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1, typename P2, typename P3, typename P4>
+inline Slot4<R, P1, P2, P3, P4>*
+slot(T1* &object, R (T2::*function)(P1, P2, P3, P4))
+{
+ return new MethodSlot4<T2, R, P1, P2, P3, P4>(object, function);
+}
+
+//! Overloaded slot factory function.
+//! @param object - a reference to a const pointer to an object of type T1 (e.g. this).
+//! @param function - a class method with the signature R (T2::*function)(P1, P2, P3, P4).
+//! @return a new slot passing four arguments of type P1, P2, P3 and P4, and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1, typename P2, typename P3, typename P4>
+inline Slot4<R, P1, P2, P3, P4>*
+slot(T1* const &object, R (T2::*function)(P1, P2, P3, P4))
+{
+ return new MethodSlot4<T2, R, P1, P2, P3, P4>(object, function);
+}
+
+//! Overloaded slot factory function.
+//! @param object - a reference to an object of type T1.
+//! @param function - a class method with the signature R (T2::*function)(P1, P2, P3, P4).
+//! @return a new slot passing four arguments of type P1, P2, P3 and P4, and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1, typename P2, typename P3, typename P4>
+inline Slot4<R, P1, P2, P3, P4>*
+slot(T1& object, R (T2::*function)(P1, P2, P3, P4))
+{
+ return new MethodSlot4<T2, R, P1, P2, P3, P4>(&object, function);
+}
+
+/* SignalSlot4
+ */
+
+template <typename T, typename R, typename P1, typename P2, typename P3, typename P4>
+class SignalSlot4 : public Slot4<R, P1, P2, P3, P4>
+{
+ typedef R (*PF)(void*, P1, P2, P3, P4);
+ PF pf;
+ T *t;
+
+public:
+ SignalSlot4(T *signal, PF function) : pf(function), t(signal) {}
+
+ virtual R call(P1 p1, P2 p2, P3 p3, P4 p4) const { return (*pf)(t, p1, p2, p3, p4); }
+};
+
+//! @class Slot5
+//! @brief Base class template for slots passing five arguments of type P1, P2, P3, P4 and P5,
+//! and returning a value of type R.
+
+template <typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
+class Slot5 : public Slot
+{
+protected:
+ Slot5() {}
+
+public:
+ virtual R call(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) const = 0;
+ //!< Calls the signal handler connected to this slot.
+
+ R operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) const { return call(p1, p2, p3, p4, p5); }
+ //!< Function operator; Calls call().
+};
+
+//! @class FunctionSlot5
+//! @brief A slot template for static functions taking five arguments of type P1, P2, P3, P4 and P5,
+//! and returning a value of type R.
+
+template <typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
+class FunctionSlot5 : public Slot5<R, P1, P2, P3, P4, P5>
+{
+ typedef R (*PF)(P1, P2, P3, P4, P5);
+ PF pf;
+
+public:
+ FunctionSlot5(PF function) : pf(function) {}
+ //!< Construct a new function slot for a static function.
+ //!< @param function - static function with the signature R (*PF)(P1, P2, P3, P4, P5).
+
+ virtual R call(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) const { return (*pf)(p1, p2, p3, p4, p5); }
+ //!< Calls the function connected to this slot passing it arguments p1, p2, p3, p4 and p5.
+ //!< @return a value of type R returned by the called function.
+};
+
+//! Overloaded slot factory function.
+//! @param function - a static function with the signature R (*function)(P1, P2, P3, P4, P5).
+//! @return a new slot passing five arguments of type P1, P2, P3, P4 and P5, and returning a value of type R.
+//!
+//! <BR>If the returned slot is connected to a signal it doesn't have to be
+//! unreferenced. The signal it's connected to will unreference the slot when
+//! it is destroyed. Otherwise the slot must be unreferenced by calling unref().
+
+template <typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
+inline Slot5<R, P1, P2, P3, P4, P5>*
+slot(R (*function)(P1, P2, P3, P4, P5))
+{
+ return new FunctionSlot5<R, P1, P2, P3, P4, P5>(function);
+}
+
+//! @class MethodSlot5
+//! @brief A slot template for methods in a class of type T taking five arguments of type P1, P2, P3, P4 and P5,
+//! and returning a value of type R.
+
+template <typename T, typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
+class MethodSlot5 : public Slot5<R, P1, P2, P3, P4, P5>
+{
+ typedef R (T::*PMF)(P1, P2, P3, P4, P5);
+ PMF pmf;
+ T *t;
+
+public:
+ MethodSlot5(T *object, PMF function) : pmf(function), t(object) {}
+ //!< Construct a new method slot for a class member function.
+ //!< @param object - a pointer to an object of type T.
+ //!< @param function - a class method with the signature R (T::*PMF)(P1, P2, P3, P4, P5).
+
+ virtual R call(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) const { return (t->*pmf)(p1, p2, p3, p4, p5); }
+ //!< Calls the class method connected to this slot passing it arguments p1, p2, p3, p4 and p5.
+ //!< @return a value of type R returned by the called method.
+};
+
+//! Overloaded slot factory function.
+//! @param object - a reference to a pointer to an object of type T1.
+//! @param function - a class method with the signature R (T2::*function)(P1, P2, P3, P4, P5).
+//! @return a new slot passing five arguments of type P1, P2, P3, P4 and P5, and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
+inline Slot5<R, P1, P2, P3, P4, P5>*
+slot(T1* &object, R (T2::*function)(P1, P2, P3, P4, P5))
+{
+ return new MethodSlot5<T2, R, P1, P2, P3, P4, P5>(object, function);
+}
+
+//! Overloaded slot factory function.
+//! @param object - a reference to a const pointer to an object of type T1 (e.g. this).
+//! @param function - a class method with the signature R (T2::*function)(P1, P2, P3, P4, P5).
+//! @return a new slot passing five arguments of type P1, P2, P3, P4 and P5, and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
+inline Slot5<R, P1, P2, P3, P4, P5>*
+slot(T1* const &object, R (T2::*function)(P1, P2, P3, P4, P5))
+{
+ return new MethodSlot5<T2, R, P1, P2, P3, P4, P5>(object, function);
+}
+
+//! Overloaded slot factory function.
+//! @param object - a reference to an object of type T1.
+//! @param function - a class method with the signature R (T2::*function)(P1, P2, P3, P4, P5).
+//! @return a new slot passing five arguments of type P1, P2, P3, P4 and P5, and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
+inline Slot5<R, P1, P2, P3, P4, P5>*
+slot(T1& object, R (T2::*function)(P1, P2, P3, P4, P5))
+{
+ return new MethodSlot5<T2, R, P1, P2, P3, P4, P5>(&object, function);
+}
+
+/* SignalSlot5
+ */
+
+template <typename T, typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
+class SignalSlot5 : public Slot5<R, P1, P2, P3, P4, P5>
+{
+ typedef R (*PF)(void*, P1, P2, P3, P4, P5);
+ PF pf;
+ T *t;
+
+public:
+ SignalSlot5(T *signal, PF function) : pf(function), t(signal) {}
+
+ virtual R call(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) const { return (*pf)(t, p1, p2, p3, p4, p5); }
+};
+
+//! @class Slot6
+//! @brief Base class template for slots passing six arguments of type P1, P2, P3, P4, P5 and P6,
+//! and returning a value of type R.
+
+template <typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
+class Slot6 : public Slot
+{
+protected:
+ Slot6() {}
+ //!< Constructor.
+
+public:
+ virtual R call(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) const = 0;
+ //!< Calls the signal handler connected to this slot.
+
+ R operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) const { return call(p1, p2, p3, p4, p5, p6); }
+ //!< Function operator; Calls call().
+};
+
+//! @class FunctionSlot6
+//! @brief A slot template for static functions taking six arguments of type P1, P2, P3, P4, P5 and P6,
+//! and returning a value of type R.
+
+template <typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
+class FunctionSlot6 : public Slot6<R, P1, P2, P3, P4, P5, P6>
+{
+ typedef R (*PF)(P1, P2, P3, P4, P5, P6);
+ PF pf;
+
+public:
+ FunctionSlot6(PF function) : pf(function) {}
+ //!< Construct a new function slot for a static function.
+ //!< @param function - static function with the signature R (*PF)(P1, P2, P3, P4, P5).
+
+ virtual R call(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) const { return (*pf)(p1, p2, p3, p4, p5, p6); }
+ //!< Calls the function connected to this slot passing it arguments p1, p2, p3, p4, p5 and p6.
+ //!< @return a value of type R returned by the called function.
+};
+
+//! Overloaded slot factory function.
+//! @param function - a static function with the signature R (*function)(P1, P2, P3, P4, P5, P6).
+//! @return a new slot passing six arguments of type P1, P2, P3, P4, P5 and P6, and returning a value of type R.
+//!
+//! <BR>If the returned slot is connected to a signal it doesn't have to be
+//! unreferenced. The signal it's connected to will unreference the slot when
+//! it is destroyed. Otherwise the slot must be unreferenced by calling unref().
+
+template <typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
+inline Slot6<R, P1, P2, P3, P4, P5, P6>*
+slot(R (*function)(P1, P2, P3, P4, P5, P6))
+{
+ return new FunctionSlot6<R, P1, P2, P3, P4, P5, P6>(function);
+}
+
+//! @class MethodSlot6
+//! @brief A slot template for methods in a class of type T taking six arguments of type P1, P2, P3, P4, P5 and P6,
+//! and returning a value of type R.
+
+template <typename T, typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
+class MethodSlot6 : public Slot6<R, P1, P2, P3, P4, P5, P6>
+{
+ typedef R (T::*PMF)(P1, P2, P3, P4, P5, P6);
+ PMF pmf;
+ T *t;
+
+public:
+ MethodSlot6(T *object, PMF function) : pmf(function), t(object) {}
+ //!< Construct a new method slot for a class member function.
+ //!< @param object - a pointer to an object of type T.
+ //!< @param function - a class method with the signature R (T::*PMF)(P1, P2, P3, P4, P5, P6).
+
+ virtual R call(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) const { return (t->*pmf)(p1, p2, p3, p4, p5, p6); }
+ //!< Calls the class method connected to this slot passing it arguments p1, p2, p3, p4, p5 and p6.
+ //!< @return a value of type R returned by the called method.
+};
+
+//! Overloaded slot factory function.
+//! @param object - a reference to a pointer to an object of type T1.
+//! @param function - a class method with the signature R (T2::*function)(P1, P2, P3, P4, P5, P6).
+//! @return a new slot passing six arguments of type P1, P2, P3, P4, P5 and P6, and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
+inline Slot6<R, P1, P2, P3, P4, P5, P6>*
+slot(T1* &object, R (T2::*function)(P1, P2, P3, P4, P5, P6))
+{
+ return new MethodSlot6<T2, R, P1, P2, P3, P4, P5, P6>(object, function);
+}
+
+//! Overloaded slot factory function.
+//! @param object - a reference to a const pointer to an object of type T1 (e.g. this).
+//! @param function - a class method with the signature R (T2::*function)(P1, P2, P3, P4, P5, P6).
+//! @return a new slot passing six arguments of type P1, P2, P3, P4, P5 and P6, and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
+inline Slot6<R, P1, P2, P3, P4, P5, P6>*
+slot(T1* const &object, R (T2::*function)(P1, P2, P3, P4, P5, P6))
+{
+ return new MethodSlot6<T2, R, P1, P2, P3, P4, P5, P6>(object, function);
+}
+
+//! Overloaded slot factory function.
+//! @param object - a reference to an object of type T1.
+//! @param function - a class method with the signature R (T2::*function)(P1, P2, P3, P4, P5, P6).
+//! @return a new slot passing six arguments of type P1, P2, P3, P4, P5 and P6, and returning a value of type R.
+//!
+//! <BR>T1 can be the same object type as T2. If the returned slot is connected
+//! to a signal it doesn't have to be unreferenced. The signal it's connected to
+//! will unreference the slot when it is destroyed. Otherwise the slot must be
+//! unreferenced by calling unref().
+
+template <typename T1, typename T2, typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
+inline Slot6<R, P1, P2, P3, P4, P5, P6>*
+slot(T1& object, R (T2::*function)(P1, P2, P3, P4, P5, P6))
+{
+ return new MethodSlot6<T2, R, P1, P2, P3, P4, P5, P6>(&object, function);
+}
+
+/* SignalSlot6
+ */
+
+template <typename T, typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
+class SignalSlot6 : public Slot6<R, P1, P2, P3, P4, P5, P6>
+{
+ typedef R (*PF)(void*, P1, P2, P3, P4, P5, P6);
+ PF pf;
+ T *t;
+
+public:
+ SignalSlot6(T *signal, PF function) : pf(function), t(signal) {}
+
+ virtual R call(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) const { return (*pf)(t, p1, p2, p3, p4, p5, p6); }
+};
+
+//! @}
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_SLOT_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/** @file scim_socket.cpp
+ * @brief Implementation of Socket related classes.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_socket.cpp,v 1.44 2005/12/01 08:27:36 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_SOCKET
+#define Uses_SCIM_TRANSACTION
+#define Uses_SCIM_CONFIG_PATH
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/un.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <errno.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+#include <errno.h>
+#include <signal.h>
+#include <sys/time.h>
+#include <fcntl.h>
+
+#include "scim_private.h"
+#include "scim.h"
+
+/* Experimental modification for avoiding multiple scim process problem */
+#define DISABLE_MULTIPLE_SOCKETS
+
+#define SCIM_SOCKET_SERVER_MAX_CLIENTS 256
+
+namespace scim {
+
+static struct in_addr
+__gethostname (const char *host)
+{
+ struct in_addr addr = { 0 };
+
+#if HAVE_GETHOSTBYNAME_R
+ struct hostent hostbuf, *hp;
+ size_t hstbuflen;
+ char *tmphstbuf;
+ int res;
+ int herr;
+
+ hstbuflen = 1024;
+ /* Allocate buffer, remember to free it to avoid memory leakage. */
+ tmphstbuf = (char*) malloc (hstbuflen);
+
+ while ((res = gethostbyname_r (host, &hostbuf, tmphstbuf, hstbuflen, &hp, &herr)) == ERANGE) {
+ /* Enlarge the buffer. */
+ hstbuflen *= 2;
+ tmphstbuf = (char*) realloc (tmphstbuf, hstbuflen);
+ }
+
+ /* Found the host */
+ if (!res && hp) {
+ addr = * ((struct in_addr *)hp->h_addr_list [0]);
+ }
+
+ free (tmphstbuf);
+#else
+ struct hostent *hostinfo;
+
+ hostinfo = gethostbyname (host);
+
+ if (hostinfo)
+ addr = * ((struct in_addr *) hostinfo->h_addr_list [0]);
+#endif
+ return addr;
+}
+
+class SocketAddress::SocketAddressImpl
+{
+ struct sockaddr *m_data;
+ SocketFamily m_family;
+ String m_address;
+
+public:
+ SocketAddressImpl (const String &addr = String ())
+ : m_data (0), m_family (SCIM_SOCKET_UNKNOWN) {
+ if (addr.length ()) set_address (addr);
+ }
+
+ SocketAddressImpl (const SocketAddressImpl &other)
+ : m_data (0), m_family (other.m_family), m_address (other.m_address) {
+ if (other.m_data) {
+ size_t len = 0;
+ switch (m_family) {
+ case SCIM_SOCKET_LOCAL:
+ m_data = (struct sockaddr*) new struct sockaddr_un;
+ len = sizeof (sockaddr_un);
+ break;
+ case SCIM_SOCKET_INET:
+ m_data = (struct sockaddr*) new struct sockaddr_in;
+ len = sizeof (sockaddr_in);
+ break;
+ case SCIM_SOCKET_UNKNOWN:
+ break;
+ }
+
+ if (len && m_data) memcpy (m_data, other.m_data, len);
+ }
+ }
+
+ ~SocketAddressImpl () {
+ if (m_data) delete m_data;
+ }
+
+ void swap (SocketAddressImpl &other) {
+ std::swap (m_data, other.m_data);
+ std::swap (m_family, other.m_family);
+ std::swap (m_address, other.m_address);
+ }
+
+ bool valid () const {
+ if (m_address.length () && m_data &&
+ (m_family == SCIM_SOCKET_LOCAL || m_family == SCIM_SOCKET_INET))
+ return true;
+ return false;
+ }
+
+ SocketFamily get_family () const {
+ return m_family;
+ }
+
+ bool set_address (const String &addr);
+
+ const String & get_address () const {
+ return m_address;
+ }
+
+ const void * get_data () const {
+ return (void *)m_data;
+ }
+
+ int get_data_length () const {
+ if (m_data) {
+ if (m_family == SCIM_SOCKET_LOCAL)
+ return SUN_LEN ((struct sockaddr_un*)(m_data));
+ else if (m_family == SCIM_SOCKET_INET)
+ return sizeof (struct sockaddr_in);
+ }
+ return 0;
+ }
+};
+
+bool
+SocketAddress::SocketAddressImpl::set_address (const String &addr)
+{
+ std::vector <String> varlist;
+
+ struct sockaddr *new_data = 0;
+ SocketFamily new_family = SCIM_SOCKET_UNKNOWN;
+
+ scim_split_string_list (varlist, addr, ':');
+
+ if (varlist.size () < 2)
+ return false;
+
+ if (varlist [0] == "local" || varlist [0] == "unix" || varlist [0] == "file") {
+#ifdef DISABLE_MULTIPLE_SOCKETS
+ String real_addr = addr.substr (varlist [0].length ()+1);
+#else
+ String real_addr = addr.substr (varlist [0].length ()+1) +
+ String ("-") +
+ scim_get_user_name ();
+#endif
+ struct sockaddr_un *un = new struct sockaddr_un;
+
+ un->sun_family = AF_UNIX;
+
+ memset (un->sun_path, 0, sizeof (un->sun_path));
+
+ strncpy (un->sun_path, real_addr.c_str (), sizeof (un->sun_path));
+
+ un->sun_path[sizeof (un->sun_path) - 1] = '\0';
+
+ SCIM_DEBUG_SOCKET(3) << " local:" << un->sun_path << "\n";
+
+ new_family = SCIM_SOCKET_LOCAL;
+ new_data = (struct sockaddr *) un;
+
+ } else if ((varlist [0] == "tcp" || varlist [0] == "inet") &&
+ varlist.size () == 3) {
+
+ struct sockaddr_in *in = new struct sockaddr_in;
+
+ in->sin_addr = __gethostname (varlist [1].c_str ());
+
+ if (in->sin_addr.s_addr) {
+ in->sin_family = AF_INET;
+ in->sin_port = htons (atoi (varlist [2].c_str ()));
+
+ SCIM_DEBUG_SOCKET(3) << " inet:"
+ << inet_ntoa (in->sin_addr) << ":"
+ << ntohs (in->sin_port) << "\n";
+
+ new_family = SCIM_SOCKET_INET;
+ new_data = (struct sockaddr *) in;
+ } else {
+ delete in;
+ }
+ }
+
+ if (new_data) {
+ if (m_data) delete m_data;
+
+ m_data = new_data;
+ m_family = new_family;
+ m_address = addr;
+ return valid ();
+ }
+
+ return false;
+}
+
+// Implementation of SocketAddress
+SocketAddress::SocketAddress (const String &addr)
+ : m_impl (new SocketAddressImpl (addr))
+{
+}
+
+SocketAddress::SocketAddress (const SocketAddress &addr)
+ : m_impl (new SocketAddressImpl (*addr.m_impl))
+{
+}
+
+SocketAddress::~SocketAddress ()
+{
+ delete m_impl;
+}
+
+const SocketAddress&
+SocketAddress::operator = (const SocketAddress &addr)
+{
+ if (this != &addr) {
+ SocketAddressImpl new_impl (*addr.m_impl);
+ m_impl->swap (new_impl);
+ }
+ return *this;
+}
+
+bool
+SocketAddress::valid () const
+{
+ return m_impl->valid ();
+}
+
+SocketFamily
+SocketAddress::get_family () const
+{
+ return m_impl->get_family ();
+}
+
+bool
+SocketAddress::set_address (const String &addr)
+{
+ SCIM_DEBUG_SOCKET(2) << " SocketAddress::set_address (" << addr << ")\n";
+ return m_impl->set_address (addr);
+}
+
+String
+SocketAddress::get_address () const
+{
+ return m_impl->get_address ();
+}
+
+const void *
+SocketAddress::get_data () const
+{
+ return m_impl->get_data ();
+}
+
+int
+SocketAddress::get_data_length () const
+{
+ return m_impl->get_data_length ();
+}
+
+// Implementation of Socket
+class Socket::SocketImpl
+{
+ int m_id;
+ int m_err;
+ bool m_binded;
+ bool m_no_close;
+ SocketFamily m_family;
+ SocketAddress m_address;
+
+public:
+
+ SocketImpl (int id = -1)
+ : m_id (id), m_err (0), m_binded (false), m_no_close (true),
+ m_family (SCIM_SOCKET_UNKNOWN) {
+ }
+
+ ~SocketImpl () {
+ close ();
+ }
+
+ bool valid () const {
+ return m_id >= 0;
+ }
+
+ int read (void *buf, size_t size) {
+ if (!buf || !size) { m_err = EINVAL; return -1; }
+ if (m_id < 0) { m_err = EBADF; return -1; }
+
+ m_err = 0;
+ int ret;
+ while (1) {
+ ret = ::read (m_id, buf, size);
+ if (ret >= 0)
+ break;
+ if (errno == EINTR)
+ continue;
+ m_err = errno;
+ }
+ return ret;
+ }
+
+ int read_with_timeout (void *buf, size_t size, int timeout) {
+ if (!buf || !size) { m_err = EINVAL; return -1; }
+ if (m_id < 0) { m_err = EBADF; return -1; }
+
+ if (timeout < 0)
+ return read (buf, size);
+
+ int ret;
+ int nbytes = 0;
+ char *cbuf = static_cast<char *> (buf);
+
+ while (size > 0) {
+ ret = wait_for_data_internal (&timeout);
+
+ if (ret < 0) return ret;
+ if (ret == 0) return nbytes;
+
+ ret = read (cbuf, size);
+
+ if (ret < 0) return ret;
+ if (ret == 0) return nbytes;
+
+ cbuf += ret;
+ nbytes += ret;
+ size -= ret;
+ }
+ return nbytes;
+ }
+
+ int write (const void *buf, size_t size) {
+ if (!buf || !size) { m_err = EINVAL; return -1; }
+ if (m_id < 0) { m_err = EBADF; return -1; }
+
+ int ret = -1;
+
+ typedef void (*_scim_sighandler_t)(int);
+ _scim_sighandler_t orig_handler = signal (SIGPIPE, SIG_IGN);
+
+ m_err = 0;
+
+ const char *cbuf = static_cast<const char*> (buf);
+
+ while (size > 0) {
+ ret = ::write (m_id, cbuf, size);
+ if (ret > 0) {
+ size -= (size_t) ret;
+ cbuf += ret;
+ continue;
+ }
+ if (errno == EINTR)
+ continue;
+ break;
+ }
+
+ m_err = errno;
+
+ if (orig_handler != SIG_ERR)
+ signal (SIGPIPE, orig_handler);
+ else
+ signal (SIGPIPE, SIG_DFL);
+
+ return ret;
+ }
+
+ int wait_for_data (int timeout = -1) {
+ if (m_id < 0) { m_err = EBADF; return -1; }
+ return wait_for_data_internal (&timeout);
+ }
+
+ int get_error_number () const {
+ return m_err;
+ }
+
+ String get_error_message () const {
+ if (m_err > 0)
+ return String (strerror (m_err));
+ return String ();
+ }
+
+ int get_id () const {
+ return m_id;
+ }
+
+ int set_nonblock_mode () {
+ if (m_id < 0) { m_err = EBADF; return -1; }
+
+ int ret;
+
+ ret = ::fcntl(m_id, F_SETFL, O_NONBLOCK);
+ return ret;
+ }
+
+ bool connect (const SocketAddress &addr) {
+ SCIM_DEBUG_SOCKET(1) << "Socket: Connect to server: "
+ << addr.get_address () << " ...\n";
+
+ m_err = EBADF;
+
+ if (m_binded) return false;
+
+ if (addr.valid () && m_id >= 0 && m_family == addr.get_family ()) {
+ struct sockaddr * data = (sockaddr *) addr.get_data ();
+ int len = addr.get_data_length ();
+
+ if (::connect (m_id, data, len) == 0) {
+ m_address = addr;
+ m_err = 0;
+ return true;
+ }
+ m_err = errno;
+ }
+ return false;
+ }
+
+ bool bind (const SocketAddress &addr) {
+ SCIM_DEBUG_SOCKET(1) << "Socket: Bind to address: "
+ << addr.get_address () << " ...\n";
+
+ m_err = EBADF;
+
+ if (m_binded) return false;
+
+ if (addr.valid () && m_id >= 0 && m_family == addr.get_family ()) {
+ const struct sockaddr_un * data_un = 0;
+ const struct sockaddr * data = static_cast <const struct sockaddr *>(addr.get_data ());
+ int len = addr.get_data_length ();
+
+ // Unlink the broken socket file.
+ if (m_family == SCIM_SOCKET_LOCAL) {
+ data_un = static_cast <const struct sockaddr_un *>(addr.get_data ());
+ // The file is already exist, check if it's broken
+ // by connecting to it.
+ SCIM_DEBUG_SOCKET(2) << "Try to remove the broken socket file: " << data_un->sun_path << "\n";
+
+ if (::access (data_un->sun_path, F_OK) == 0) {
+ SocketClient tmp_socket (addr);
+
+ if (!tmp_socket.is_connected ()) {
+ struct stat statbuf;
+
+ // If it's a socket file, then
+ // delete it.
+ if (::stat (data_un->sun_path, &statbuf) == 0 && S_ISSOCK (statbuf.st_mode))
+ ::unlink (data_un->sun_path);
+ }
+
+ tmp_socket.close ();
+ }
+ }
+
+ if (::bind (m_id, data, len) == 0) {
+ m_address = addr;
+ m_binded = true;
+ m_err = 0;
+
+ // Set correct permission for the socket file
+#ifdef DISABLE_MULTIPLE_SOCKETS
+ if (m_family == SCIM_SOCKET_LOCAL) {
+ ::chmod (data_un->sun_path, S_IRUSR | S_IWUSR | S_IROTH | S_IWOTH);
+ }
+#else
+ if (m_family == SCIM_SOCKET_LOCAL) {
+ ::chmod (data_un->sun_path, S_IRUSR | S_IWUSR);
+ }
+#endif
+
+ return true;
+ }
+
+ m_err = errno;
+ }
+ return false;
+ }
+
+ bool listen (int queue_length = 5) {
+ if (m_id < 0) { m_err = EBADF; return -1; }
+
+ SCIM_DEBUG_SOCKET(1) << "Socket: Listen: "
+ << queue_length << " ...\n";
+
+ m_err = 0;
+
+ int ret = ::listen (m_id, queue_length);
+
+ if (ret < 0) m_err = errno;
+
+ return ret >= 0;
+ }
+
+ int accept () {
+ if (m_id < 0) { m_err = EBADF; return -1; }
+
+ int ret = -1;
+ int addrlen = 0;
+
+ m_err = 0;
+
+ if (m_family == SCIM_SOCKET_LOCAL) {
+ struct sockaddr_un addr;
+ addrlen = sizeof (addr);
+ ret = ::accept (m_id, (struct sockaddr*) &addr, (socklen_t*) &addrlen);
+ } else if (m_family == SCIM_SOCKET_INET) {
+ struct sockaddr_in addr;
+ addrlen = sizeof (addr);
+ ret = ::accept (m_id, (struct sockaddr*) &addr, (socklen_t*) &addrlen);
+ }
+
+ if (ret < 0 && addrlen > 0)
+ m_err = errno;
+
+ SCIM_DEBUG_SOCKET(1) << "Socket: Accept connection, ret: " << ret << "\n";
+
+ return ret;
+ }
+
+ bool create (SocketFamily family) {
+ int ret = -1;
+
+ if (family == SCIM_SOCKET_LOCAL)
+ ret = ::socket (PF_UNIX, SOCK_STREAM, 0);
+ else if (family == SCIM_SOCKET_INET)
+ ret = ::socket (PF_INET, SOCK_STREAM, 0);
+ else {
+ m_err = EINVAL;
+ return false;
+ }
+
+ if (ret > 0) {
+ if (m_id >= 0) close ();
+ m_no_close = false;
+ m_binded = false;
+ m_err = 0;
+ m_family = family;
+ m_id = ret;
+ } else {
+ m_err = errno;
+ }
+
+ SCIM_DEBUG_SOCKET(1) << "Socket: Socket created, family: "
+ << family << " ret: " << ret << "\n";
+
+ return ret >= 0;
+ }
+
+ void close () {
+ if (m_id < 0) return;
+
+ if (!m_no_close) {
+ SCIM_DEBUG_SOCKET(2) << " Closing the socket: " << m_id << " ...\n";
+ ::close (m_id);
+
+ // Unlink the socket file.
+ #if 0
+ if (m_binded && m_family == SCIM_SOCKET_LOCAL) {
+ const struct sockaddr_un * data = static_cast <const struct sockaddr_un *>(m_address.get_data ());
+ // FIXME: Don't unlink the socket file, because if the process is forked and child process exits
+ // the socket file will be unlinked by child process.
+ //SCIM_DEBUG_SOCKET(3) << " Unlinking socket file " << data->sun_path << "...\n";
+ ::unlink (data->sun_path);
+ }
+ #endif
+ }
+
+ m_id = -1;
+ m_err = 0;
+ m_binded = false;
+ m_no_close = false;
+ m_family = SCIM_SOCKET_UNKNOWN;
+ m_address = SocketAddress ();
+ }
+
+private:
+ int wait_for_data_internal (int *timeout) {
+ fd_set fds;
+ struct timeval tv;
+ struct timeval begin_tv;
+ int ret;
+
+ if (*timeout >= 0) {
+ gettimeofday(&begin_tv, 0);
+ tv.tv_sec = *timeout / 1000;
+ tv.tv_usec = (*timeout % 1000) * 1000;
+ }
+
+ m_err = 0;
+
+ while (1) {
+ FD_ZERO(&fds);
+ FD_SET(m_id, &fds);
+
+ ret = select(m_id + 1, &fds, NULL, NULL, (*timeout >= 0) ? &tv : NULL);
+ if (*timeout > 0) {
+ int elapsed;
+ struct timeval cur_tv;
+ gettimeofday (&cur_tv, 0);
+ elapsed = (cur_tv.tv_sec - begin_tv.tv_sec) * 1000 +
+ (cur_tv.tv_usec - begin_tv.tv_usec) / 1000;
+ *timeout = *timeout - elapsed;
+ if (*timeout > 0) {
+ tv.tv_sec = *timeout / 1000;
+ tv.tv_usec = (*timeout % 1000) * 1000;
+ } else {
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ *timeout = 0;
+ }
+ }
+ if (ret > 0) {
+ return ret;
+ } else if (ret == 0) {
+ if (*timeout == 0)
+ return ret;
+ else
+ continue;
+ }
+
+ if (errno == EINTR)
+ continue;
+
+ m_err = errno;
+ return ret;
+ }
+ }
+};
+
+Socket::Socket (int id)
+ : m_impl (new SocketImpl (id))
+{
+}
+
+Socket::~Socket ()
+{
+ m_impl->close ();
+ delete m_impl;
+}
+
+bool
+Socket::valid () const
+{
+ return m_impl->valid ();
+}
+
+int
+Socket::read (void *buf, size_t size) const
+{
+ return m_impl->read (buf, size);
+}
+
+int
+Socket::read_with_timeout (void *buf, size_t size, int timeout) const
+{
+ return m_impl->read_with_timeout (buf, size, timeout);
+}
+
+int
+Socket::write (const void *buf, size_t size) const
+{
+ return m_impl->write (buf, size);
+}
+
+int
+Socket::wait_for_data (int timeout) const
+{
+ return m_impl->wait_for_data (timeout);
+}
+
+int
+Socket::get_error_number () const
+{
+ return m_impl->get_error_number ();
+}
+
+String
+Socket::get_error_message () const
+{
+ return m_impl->get_error_message ();
+}
+
+bool
+Socket::connect (const SocketAddress &addr) const
+{
+ return m_impl->connect (addr);
+}
+
+bool
+Socket::bind (const SocketAddress &addr) const
+{
+ return m_impl->bind (addr);
+}
+
+bool
+Socket::listen (int queue_length) const
+{
+ return m_impl->listen (queue_length);
+}
+
+int
+Socket::accept () const
+{
+ return m_impl->accept ();
+}
+
+int
+Socket::get_id () const
+{
+ return m_impl->get_id ();
+}
+
+int
+Socket::set_nonblock_mode ()
+{
+ return m_impl->set_nonblock_mode ();
+}
+
+bool
+Socket::create (SocketFamily family)
+{
+ return m_impl->create (family);
+}
+
+void
+Socket::close ()
+{
+ m_impl->close ();
+}
+
+// Implementation of SocketServer
+struct SocketServer::SocketServerImpl
+{
+ fd_set active_fds;
+ int max_fd;
+ int err;
+ bool running;
+ bool created;
+ int num_clients;
+ int max_clients;
+
+ std::vector <int> ext_fds;
+
+ SocketServerSignalSocket accept_signal;
+ SocketServerSignalSocket receive_signal;
+ SocketServerSignalSocket exception_signal;
+
+ SocketServerImpl (int mc)
+ : max_fd (0), err (0), running (false), created (false),
+ num_clients (0), max_clients (std::min (mc, SCIM_SOCKET_SERVER_MAX_CLIENTS)) {
+ FD_ZERO (&active_fds);
+ }
+};
+
+SocketServer::SocketServer (int max_clients)
+ : Socket (-1), m_impl (new SocketServerImpl (max_clients))
+{
+}
+
+SocketServer::SocketServer (const SocketAddress &address, int max_clients)
+ : Socket (-1), m_impl (new SocketServerImpl (max_clients))
+{
+ create (address);
+}
+
+SocketServer::~SocketServer ()
+{
+ delete m_impl;
+}
+
+bool
+SocketServer::valid () const
+{
+ return m_impl->created;
+}
+
+bool
+SocketServer::create (const SocketAddress &address)
+{
+ m_impl->err = EBUSY;
+ if (!m_impl->created) {
+ SocketFamily family = address.get_family ();
+
+ SCIM_DEBUG_SOCKET (1) << "Creating Socket Server, family: " << family << "\n";
+
+ if (family != SCIM_SOCKET_UNKNOWN) {
+ if (Socket::create (family) &&
+ Socket::bind (address) &&
+ Socket::listen ()) {
+ m_impl->created = true;
+ m_impl->max_fd = Socket::get_id ();
+ FD_ZERO (&(m_impl->active_fds));
+ FD_SET (m_impl->max_fd, &(m_impl->active_fds));
+ m_impl->err = 0;
+ return true;
+ }
+ m_impl->err = Socket::get_error_number ();
+ Socket::close ();
+ } else {
+ m_impl->err = EBADF;
+ }
+ }
+ return false;
+}
+
+bool
+SocketServer::run ()
+{
+ if (m_impl->created && !m_impl->running) {
+ fd_set read_fds, exception_fds;
+ int client;
+ int i;
+
+ m_impl->running = true;
+ m_impl->err = 0;
+ while (1) {
+ read_fds = m_impl->active_fds;
+ exception_fds = m_impl->active_fds;
+
+ SCIM_DEBUG_SOCKET (2) << " SocketServer: Watching socket...\n";
+
+ if (select (m_impl->max_fd + 1, &read_fds, NULL, &exception_fds, NULL) < 0) {
+ if (errno == EINTR)
+ continue;
+
+ m_impl->err = errno;
+ m_impl->running = false;
+ SCIM_DEBUG_SOCKET (3) << " SocketServer: Error: "
+ << get_error_message () << "\n";
+ return false;
+ }
+
+ //The server has been shut down.
+ if (!m_impl->running)
+ return true;
+
+ for (i = 0; i<m_impl->max_fd + 1; i++) {
+ if (FD_ISSET (i, &read_fds)) {
+
+ //New connection
+ if (i == Socket::get_id ()) {
+ client = Socket::accept ();
+
+ SCIM_DEBUG_SOCKET (3) << " SocketServer: Accept new connection:"
+ << client << "\n";
+
+ if (client < 0) {
+ m_impl->err = Socket::get_error_number ();
+ m_impl->running = false;
+
+ SCIM_DEBUG_SOCKET (4) << " SocketServer: Error occurred: "
+ << Socket::get_error_message () << "\n";
+
+ return false;
+ }
+
+ if (m_impl->max_clients > 0 &&
+ m_impl->num_clients >= m_impl->max_clients) {
+ SCIM_DEBUG_SOCKET (4) << " SocketServer: Too many clients.\n";
+ ::close (client);
+ } else {
+ m_impl->num_clients ++;
+
+ //Store the new client
+ FD_SET (client, &(m_impl->active_fds));
+ if (m_impl->max_fd < client)
+ m_impl->max_fd = client;
+
+ Socket client_socket (client);
+ //emit the signal.
+ m_impl->accept_signal.emit (this, client_socket);
+ }
+
+ //Client reading
+ } else {
+ SCIM_DEBUG_SOCKET (3) << " SocketServer: Accept client reading...\n";
+
+ Socket client_socket (i);
+ //emit the signal.
+ m_impl->receive_signal.emit (this, client_socket);
+ }
+ }
+
+ if (FD_ISSET (i, &exception_fds)) {
+
+ //The server got an exception, return.
+ if (i == Socket::get_id ()) {
+
+ SCIM_DEBUG_SOCKET (3) << " SocketServer: Server got an exception, exiting...\n";
+
+ shutdown ();
+ return true;
+
+ } else {
+ SCIM_DEBUG_SOCKET (3) << " SocketServer: Client "
+ << i
+ << "got an exception, callbacking...\n";
+
+ Socket client_socket (i);
+ m_impl->exception_signal.emit (this, client_socket);
+ }
+ }
+
+ if (!m_impl->running)
+ break;
+ }
+
+ //The server has been shut down.
+ if (!m_impl->running)
+ return true;
+ }
+ }
+
+ m_impl->err = EBADF;
+ return false;
+}
+
+bool
+SocketServer::filter_event (int fd)
+{
+ int client;
+ static bool first_call = true;
+
+ if (first_call) {
+ m_impl->running = true;
+ first_call = false;
+ }
+
+ if (fd == Socket::get_id ()) {
+ client = Socket::accept ();
+
+ SCIM_DEBUG_SOCKET (3) << " SocketServer: Accept new connection:"
+ << client << "\n";
+
+ if (client < 0) {
+ m_impl->err = Socket::get_error_number ();
+ m_impl->running = false;
+
+ SCIM_DEBUG_SOCKET (4) << " SocketServer: Error occurred: "
+ << Socket::get_error_message () << "\n";
+
+ return false;
+ }
+
+ if (m_impl->max_clients > 0 &&
+ m_impl->num_clients >= m_impl->max_clients) {
+ SCIM_DEBUG_SOCKET (4) << " SocketServer: Too many clients.\n";
+ ::close (client);
+ } else {
+ m_impl->num_clients ++;
+
+ //Store the new client
+ FD_SET (client, &(m_impl->active_fds));
+ if (m_impl->max_fd < client)
+ m_impl->max_fd = client;
+
+ Socket client_socket (client);
+ //emit the signal.
+ m_impl->accept_signal.emit (this, client_socket);
+ }
+ }else {
+ SCIM_DEBUG_SOCKET (3) << " SocketServer: Accept client reading...\n";
+ Socket client_socket (fd);
+ m_impl->receive_signal.emit (this, client_socket);
+ }
+
+ return true;
+}
+
+bool
+SocketServer::filter_exception_event (int fd)
+{
+ //The server got an exception, return.
+ if (fd == Socket::get_id ()) {
+
+ SCIM_DEBUG_SOCKET (3) << " SocketServer: Server got an exception, exiting...\n";
+
+ shutdown ();
+ } else {
+ SCIM_DEBUG_SOCKET (3) << " SocketServer: Client "
+ << fd
+ << "got an exception, callbacking...\n";
+
+ Socket client_socket (fd);
+ m_impl->exception_signal.emit (this, client_socket);
+ }
+
+ return true;
+}
+
+bool
+SocketServer::is_running () const
+{
+ return m_impl->running;
+}
+
+void
+SocketServer::shutdown ()
+{
+ if (m_impl->created) {
+ SCIM_DEBUG_SOCKET (2) << " SocketServer: Shutting down the server...\n";
+
+ m_impl->running = false;
+
+ for (int i = 0; ((unsigned int)i) < m_impl->ext_fds.size (); i++)
+ FD_CLR (m_impl->ext_fds [i], &m_impl->active_fds);
+
+ for (int i = 0; i<m_impl->max_fd + 1; i++) {
+ //Close all client
+ if (FD_ISSET (i, &(m_impl->active_fds)) && i != Socket::get_id ()) {
+ SCIM_DEBUG_SOCKET (3) << " SocketServer: Closing client: "
+ << i << "\n";
+ ::close (i);
+ }
+ }
+ m_impl->max_fd = 0;
+ m_impl->created = false;
+ m_impl->err = 0;
+ m_impl->num_clients = 0;
+ m_impl->ext_fds.clear ();
+ FD_ZERO (&(m_impl->active_fds));
+
+ Socket::close ();
+ }
+}
+
+bool
+SocketServer::close_connection (const Socket &socket)
+{
+ int id = socket.get_id ();
+ if (m_impl->created && m_impl->running && id > 0 && FD_ISSET (id, &(m_impl->active_fds))) {
+
+ SCIM_DEBUG_SOCKET (2) << " SocketServer: Closing the connection: " << id << "\n";
+
+ m_impl->num_clients --;
+
+ FD_CLR (id, &(m_impl->active_fds));
+
+ std::vector <int>::iterator it = std::find (m_impl->ext_fds.begin (), m_impl->ext_fds.end (), id);
+ if (it != m_impl->ext_fds.end ()) m_impl->ext_fds.erase (it);
+
+ ::close (id);
+ return true;
+ }
+ return false;
+}
+
+int
+SocketServer::get_error_number () const
+{
+ if (m_impl->err)
+ return m_impl->err;
+
+ return Socket::get_error_number ();
+}
+
+String
+SocketServer::get_error_message () const
+{
+ if (m_impl->err)
+ return String (strerror (m_impl->err));
+
+ return Socket::get_error_message ();
+}
+
+int
+SocketServer::get_max_clients () const
+{
+ return m_impl->max_clients;
+}
+
+void
+SocketServer::set_max_clients (int max_clients)
+{
+ if (max_clients < SCIM_SOCKET_SERVER_MAX_CLIENTS)
+ m_impl->max_clients = max_clients;
+}
+
+bool
+SocketServer::insert_external_socket (const Socket &sock)
+{
+ int fd = sock.get_id ();
+
+ if (valid () && sock.valid () && sock.wait_for_data (0) >= 0 &&
+ m_impl->num_clients < m_impl->max_clients &&
+ !FD_ISSET (fd, &m_impl->active_fds)) {
+ m_impl->ext_fds.push_back (fd);
+ FD_SET (fd, &m_impl->active_fds);
+ if (m_impl->max_fd < fd) m_impl->max_fd = fd;
+ m_impl->num_clients ++;
+ return true;
+ }
+ return false;
+}
+
+bool
+SocketServer::remove_external_socket (const Socket &sock)
+{
+ int fd = sock.get_id ();
+
+ if (valid () && FD_ISSET (fd, &m_impl->active_fds)) {
+ FD_CLR (fd, &m_impl->active_fds);
+ std::vector <int>::iterator it = std::find (m_impl->ext_fds.begin (), m_impl->ext_fds.end (), fd);
+ if (it != m_impl->ext_fds.end ()) m_impl->ext_fds.erase (it);
+ m_impl->num_clients --;
+ return true;
+ }
+ return false;
+}
+
+Connection
+SocketServer::signal_connect_accept (SocketServerSlotSocket *slot)
+{
+ return m_impl->accept_signal.connect (slot);
+}
+
+Connection
+SocketServer::signal_connect_receive (SocketServerSlotSocket *slot)
+{
+ return m_impl->receive_signal.connect (slot);
+}
+
+Connection
+SocketServer::signal_connect_exception (SocketServerSlotSocket *slot)
+{
+ return m_impl->exception_signal.connect (slot);
+}
+
+//Implementation of SocketClient
+SocketClient::SocketClient ()
+ : Socket (-1), m_connected (false)
+{
+}
+
+SocketClient::SocketClient (const SocketAddress &address)
+ : Socket (-1), m_connected (false)
+{
+ connect (address);
+}
+
+SocketClient::~SocketClient ()
+{
+}
+
+bool
+SocketClient::is_connected () const
+{
+ return Socket::valid () && m_connected;
+}
+
+bool
+SocketClient::connect (const SocketAddress &address)
+{
+ if (m_connected) close ();
+
+ if (Socket::create (address.get_family ()) && Socket::connect (address)) {
+ m_connected = true;
+ return true;
+ } else {
+ close ();
+ }
+
+ return false;
+}
+
+void
+SocketClient::close ()
+{
+ Socket::close ();
+ m_connected = false;
+}
+
+#define SCIM_DEFAULT_SOCKET_FRONTEND_ADDRESS "local:/tmp/scim-socket-frontend"
+#define SCIM_DEFAULT_PANEL_SOCKET_ADDRESS "local:/tmp/scim-panel-socket"
+#define SCIM_DEFAULT_HELPER_MANAGER_SOCKET_ADDRESS "local:/tmp/scim-socket-frontend"
+
+String scim_get_default_socket_frontend_address ()
+{
+ String address (SCIM_DEFAULT_SOCKET_FRONTEND_ADDRESS);
+
+ address = scim_global_config_read (SCIM_GLOBAL_CONFIG_DEFAULT_SOCKET_FRONTEND_ADDRESS, address);
+
+ const char *env = getenv ("SCIM_SOCKET_ADDRESS");
+ if (env && strlen (env) > 0) {
+ address = String (env);
+ } else {
+ env = getenv ("SCIM_FRONTEND_SOCKET_ADDRESS");
+ if (env && strlen (env))
+ address = String (env);
+ }
+
+ if (address == "default")
+ address = SCIM_DEFAULT_SOCKET_FRONTEND_ADDRESS;
+
+ return address;
+}
+
+String scim_get_default_socket_imengine_address ()
+{
+ String address (SCIM_DEFAULT_SOCKET_FRONTEND_ADDRESS);
+
+ address = scim_global_config_read (SCIM_GLOBAL_CONFIG_DEFAULT_SOCKET_IMENGINE_ADDRESS, address);
+
+ const char *env = getenv ("SCIM_SOCKET_ADDRESS");
+ if (env && strlen (env) > 0) {
+ address = String (env);
+ } else {
+ env = getenv ("SCIM_IMENGINE_SOCKET_ADDRESS");
+ if (env && strlen (env))
+ address = String (env);
+ }
+
+ if (address == "default")
+ address = SCIM_DEFAULT_SOCKET_FRONTEND_ADDRESS;
+
+ return address;
+}
+
+String scim_get_default_socket_config_address ()
+{
+ String address (SCIM_DEFAULT_SOCKET_FRONTEND_ADDRESS);
+
+ address = scim_global_config_read (SCIM_GLOBAL_CONFIG_DEFAULT_SOCKET_CONFIG_ADDRESS, address);
+
+ const char *env = getenv ("SCIM_SOCKET_ADDRESS");
+ if (env && strlen (env) > 0) {
+ address = String (env);
+ } else {
+ env = getenv ("SCIM_CONFIG_SOCKET_ADDRESS");
+ if (env && strlen (env))
+ address = String (env);
+ }
+
+ if (address == "default")
+ address = SCIM_DEFAULT_SOCKET_FRONTEND_ADDRESS;
+
+ return address;
+}
+
+String scim_get_default_panel_socket_address (const String &display)
+{
+ String address (SCIM_DEFAULT_PANEL_SOCKET_ADDRESS);
+
+ address = scim_global_config_read (SCIM_GLOBAL_CONFIG_DEFAULT_PANEL_SOCKET_ADDRESS, address);
+
+ const char *env = getenv ("SCIM_PANEL_SOCKET_ADDRESS");
+
+ if (env && strlen (env) > 0) {
+ address = String (env);
+ }
+
+ if (address == "default")
+ address = SCIM_DEFAULT_PANEL_SOCKET_ADDRESS;
+
+ SocketAddress sockaddr (address);
+
+ if (!sockaddr.valid ())
+ return String ();
+
+ String::size_type colon_pos = display.rfind (':');
+ String disp_name = display;
+ int disp_num = 0;
+
+ // Maybe It's a X11 DISPLAY name
+ if (colon_pos != String::npos) {
+ String::size_type dot_pos = display.find ('.', colon_pos+1);
+ // It has screen number
+ if (dot_pos != String::npos) {
+ disp_name = display.substr (0, dot_pos);
+ }
+ // FIXME: ignore remote X Server name.
+ disp_num = atoi (display.substr (colon_pos + 1, dot_pos - colon_pos - 1).c_str ());
+ }
+
+ if (sockaddr.get_family () == SCIM_SOCKET_LOCAL) {
+ address = address + disp_name;
+ } else if (sockaddr.get_family () == SCIM_SOCKET_INET) {
+ std::vector <String> varlist;
+ scim_split_string_list (varlist, address, ':');
+ if (varlist.size () == 3) {
+ int port = atoi (varlist [2].c_str ()) + disp_num;
+ char buf [10];
+ snprintf (buf, 10, "%d", port);
+ varlist [2] = String (buf);
+ address = scim_combine_string_list (varlist, ':');
+ }
+ }
+
+ sockaddr.set_address (address);
+
+ if (sockaddr.valid ())
+ return address;
+
+ return String ();
+}
+
+String scim_get_default_helper_manager_socket_address ()
+{
+ String address (SCIM_DEFAULT_HELPER_MANAGER_SOCKET_ADDRESS);
+
+ address = scim_global_config_read (SCIM_GLOBAL_CONFIG_DEFAULT_HELPER_MANAGER_SOCKET_ADDRESS, address);
+
+ const char *env = getenv ("SCIM_HELPER_MANAGER_SOCKET_ADDRESS");
+ if (env && strlen (env) > 0) {
+ address = String (env);
+ }
+
+ if (address == "default")
+ address = SCIM_DEFAULT_HELPER_MANAGER_SOCKET_ADDRESS;
+
+ return address;
+}
+
+int scim_get_default_socket_timeout ()
+{
+ int timeout = 5000;
+
+ timeout = scim_global_config_read (SCIM_GLOBAL_CONFIG_DEFAULT_SOCKET_TIMEOUT, timeout);
+
+ const char *env = getenv ("SCIM_SOCKET_TIMEOUT");
+
+ if (env && strlen (env))
+ timeout = atoi (env);
+
+ if (timeout <= 0) timeout = -1;
+
+ return timeout;
+}
+
+static bool
+scim_socket_check_type (const String &types,
+ const String &atype)
+{
+ std::vector <String> type_list;
+ scim_split_string_list (type_list, types, ',');
+
+ return std::find (type_list.begin (), type_list.end (), atype) != type_list.end ();
+}
+
+bool
+scim_socket_open_connection (uint32 &key,
+ const String &client_type,
+ const String &server_type,
+ const Socket &socket,
+ int timeout)
+{
+ if (!socket.valid () || !client_type.length () || !server_type.length ())
+ return false;
+
+ Transaction trans;
+
+ trans.put_command (SCIM_TRANS_CMD_REQUEST);
+ trans.put_command (SCIM_TRANS_CMD_OPEN_CONNECTION);
+ trans.put_data (String (SCIM_BINARY_VERSION));
+ trans.put_data (client_type);
+
+ if (trans.write_to_socket (socket)) {
+ int cmd;
+ String server_types;
+ if (trans.read_from_socket (socket, timeout) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_data (server_types) && scim_socket_check_type (server_types, server_type) &&
+ trans.get_data (key)) {
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ trans.put_command (SCIM_TRANS_CMD_OK);
+ if (trans.write_to_socket (socket))
+ return true;
+ } else {
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ trans.put_command (SCIM_TRANS_CMD_FAIL);
+ trans.write_to_socket (socket);
+ }
+ }
+
+ return false;
+}
+
+String
+scim_socket_accept_connection (uint32 &key,
+ const String &server_types,
+ const String &client_types,
+ const Socket &socket,
+ int timeout)
+{
+ if (!socket.valid () || !client_types.length () || !server_types.length ())
+ return String ("");
+
+ Transaction trans;
+
+ if (trans.read_from_socket (socket, timeout)) {
+ int cmd;
+ String version;
+ String client_type;
+ if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REQUEST &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OPEN_CONNECTION &&
+ trans.get_data (version) && version == String (SCIM_BINARY_VERSION) &&
+ trans.get_data (client_type) &&
+ (scim_socket_check_type (client_types, client_type) || client_type == "ConnectionTester")) {
+ key = (uint32) rand ();
+ trans.clear ();
+ trans.put_command (SCIM_TRANS_CMD_REPLY);
+ trans.put_data (server_types);
+ trans.put_data (key);
+
+ if (trans.write_to_socket (socket) &&
+ trans.read_from_socket (socket, timeout) &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+ trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) {
+
+ // Client is ok, return the client type.
+ return (client_type == "ConnectionTester") ? String ("") : client_type;
+ }
+ }
+ }
+ return String ("");
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/**
+ * @file scim_socket.h
+ * @brief Socket interfaces.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_socket.h,v 1.25 2005/01/25 15:13:15 suzhe Exp $
+ */
+
+#ifndef __SCIM_SOCKET_H
+#define __SCIM_SOCKET_H
+
+namespace scim {
+
+/**
+ * @addtogroup SocketCommunication
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+class Socket;
+class SocketAddress;
+class SocketServer;
+class SocketClient;
+
+typedef Slot2<void, SocketServer *, const Socket &>
+ SocketServerSlotSocket;
+
+typedef Signal2<void, SocketServer *, const Socket &>
+ SocketServerSignalSocket;
+
+/**
+ * @brief An exception class to hold Socket related errors.
+ *
+ * scim::Socket and its derived classes must throw
+ * scim::SocketError object when error.
+ */
+class SocketError: public Exception
+{
+public:
+ SocketError (const String& what_arg)
+ : Exception (String("scim::Socket: ") + what_arg) { }
+};
+
+/**
+ * @brief The vaild socket address/protocol family,
+ *
+ * Corresponding to libc PF_LOCAL/AF_LOCAL and PF_INET/AF_INET
+ */
+enum SocketFamily
+{
+ SCIM_SOCKET_UNKNOWN, /**< Unknown or invalid socket address/protocol */
+ SCIM_SOCKET_LOCAL, /**< Unix local socket address/protocol */
+ SCIM_SOCKET_INET /**< Internet (ipv4) socket address/protocol */
+};
+
+/**
+ * @brief The class to hold a socket address.
+ *
+ * Class SocketAddress encapsulates the details of
+ * socket address, like socketaddr_un and socketaddr_in.
+ *
+ * A SocketAddress object can be constructed from an
+ * address string, which must start with one of the
+ * following prefixes:
+ * - inet: or tcp:
+ * A internet address (ipv4). This kind of address must
+ * include two parts, separated by a colon. The first part
+ * is the ip address, the second part is the port. For example:
+ * inet:127.0.0.1:12345
+ * - local: or unix: or file:
+ * A unix or local socket address. It's a full path of a socket file.
+ * For example: local:/tmp/scim-socket-frontend
+ */
+class SocketAddress
+{
+ class SocketAddressImpl;
+ SocketAddressImpl *m_impl;
+
+public:
+ /**
+ * @brief Constructor.
+ *
+ * @param addr the address string.
+ */
+ SocketAddress (const String &addr = String ());
+
+ /**
+ * @brief Copy constructor.
+ */
+ SocketAddress (const SocketAddress &addr);
+
+ /**
+ * @brief Destructor.
+ */
+ ~SocketAddress ();
+
+ /**
+ * @brief Copy operator.
+ */
+ const SocketAddress& operator = (const SocketAddress &addr);
+
+ /**
+ * @brief Check if this address is valid.
+ *
+ * @return true if this address is valid.
+ */
+ bool valid () const;
+
+ /**
+ * @brief Get the family of this socket address.
+ *
+ * @return the family enum value of this address.
+ *
+ * @sa SocketFamily
+ */
+ SocketFamily get_family () const;
+
+ /**
+ * @brief Set a new address.
+ *
+ * @param addr the new address string.
+ */
+ bool set_address (const String &addr);
+
+ /**
+ * @brief Get the address string.
+ *
+ * @return the address string.
+ */
+ String get_address () const;
+
+ /**
+ * @brief Get the internal data of this socket address,
+ * used by class Socket.
+ *
+ * @return the pointer to the data, usually a sockaddr struct.
+ */
+ const void * get_data () const;
+
+ /**
+ * @brief Get the size of the internall data.
+ *
+ * @return the size of the internall data returned by get_data ();
+ */
+ int get_data_length () const;
+};
+
+/**
+ * @brief Socket communication class.
+ *
+ * Class Socket provides basic operation of socket,
+ * such as bind connect, read, write etc.
+ *
+ * This class object cannot be created directly by user.
+ * Only the object of its derived classes SocketServer and SocketClient
+ * can be created directly.
+ */
+class Socket
+{
+ class SocketImpl;
+
+ SocketImpl *m_impl;
+
+ Socket (const Socket&);
+ const Socket& operator = (const Socket&);
+
+public:
+ /**
+ * @brief Create a Socket object from an already created socket_id.
+ *
+ * @param id an file id of an existing socket.
+ */
+ Socket (int id = -1);
+
+ /**
+ * @brief Destructor
+ */
+ ~Socket ();
+
+ /**
+ * @brief Check if the socket is valid.
+ *
+ * @return true if the socket is ready to read and write.
+ */
+ bool valid () const;
+
+ /**
+ * @brief Read data from socket.
+ *
+ * @param buf the buffer to store the data.
+ * @param size size of the buffer.
+ *
+ * @return the amount of data actually read, -1 means error occurred.
+ */
+ int read (void *buf, size_t size) const;
+
+ /**
+ * @brief read data from socket with a timeout.
+ *
+ * @param buf the buffer to store the data.
+ * @param size size of the buffer, and the amount of data to be read.
+ * @param timeout time out in millisecond (1/1000 second), -1 means infinity.
+ *
+ * @return the amount of data actually read,
+ * 0 means the connection is closed,
+ * -1 means error occurred.
+ */
+ int read_with_timeout (void *buf, size_t size, int timeout) const;
+
+ /**
+ * @brief Write data to socket.
+ *
+ * @param buf the buffer stores the data.
+ * @param size size of the data to be sent.
+ *
+ * @return the amount of data acutally sent, or -1 if an error occurred.
+ */
+ int write (const void *buf, size_t size) const;
+
+ /**
+ * @brief Wait until there are some data ready to read.
+ *
+ * @param timeout time out in millisecond (1/1000 second), -1 means infinity.
+ *
+ * @return > 0 if data is OK, == 0 if time is out, < 0 if an error occurred.
+ */
+ int wait_for_data (int timeout = -1) const;
+
+ /**
+ * @brief Get the number of the last occurred error.
+ *
+ * @return the standard errno value.
+ */
+ int get_error_number () const;
+
+ /**
+ * @brief Get the message of the last occurred error.
+ *
+ * @return the error message of the last occurred error.
+ */
+ String get_error_message () const;
+
+ /**
+ * @brief Get the socket id.
+ *
+ * @return the file id of this socket object.
+ */
+ int get_id () const;
+
+ /**
+ * @brief Change the nonblock property of the socket.
+ *
+ * @return
+ */
+ int set_nonblock_mode ();
+
+protected:
+
+ /**
+ * @brief Initiate a connection on a socket.
+ *
+ * @param addr the address to be connected to.
+ *
+ * @return true if success.
+ */
+ bool connect (const SocketAddress &addr) const;
+
+ /**
+ * @brief Bind a socket to an address, used by SocketServer.
+ *
+ * @param addr the address to be binded to.
+ *
+ * @return true if success.
+ */
+ bool bind (const SocketAddress &addr) const;
+
+ /**
+ * @brief Listen for connections on a socket.
+ *
+ * @param queue_length the length of the waiting queue.
+ *
+ * @return true if success.
+ */
+ bool listen (int queue_length = 5) const;
+
+ /**
+ * @brief Accept a connection on the socket, used by SocketServer.
+ *
+ * @return the id of the accepted client socket, or -1 if an error is occurred.
+ */
+ int accept () const;
+
+ /**
+ * @brief Create a socket for specific family.
+ *
+ * @param family the family type.
+ *
+ * @return true if success.
+ */
+ bool create (SocketFamily family);
+
+ /**
+ * @brief Close the socket.
+ */
+ void close ();
+};
+
+/**
+ * @brief Socket Server class.
+ *
+ * Class SocketServer provides basic operations to create a Socket Server,
+ * such as create, run etc.
+ */
+class SocketServer : public Socket
+{
+ class SocketServerImpl;
+
+ SocketServerImpl *m_impl;
+
+public:
+ /**
+ * @brief Default constructor, do nothing.
+ */
+ SocketServer (int max_clients = -1);
+
+ /**
+ * @brief Constructor.
+ *
+ * @param address create a server on this address.
+ * @param max_clients the max number of socket clients, -1 means unlimited.
+ */
+ SocketServer (const SocketAddress &address, int max_clients = -1);
+
+ /**
+ * @brief Destructor.
+ */
+ ~SocketServer ();
+
+ /**
+ * @brief Test if the server is valid.
+ *
+ * @return true if the socket server is valid and ready to run.
+ */
+ bool valid () const;
+
+ /**
+ * @brief Create a socket on an address.
+ *
+ * @param address the address to be listen.
+ *
+ * @return true if OK.
+ */
+ bool create (const SocketAddress &address);
+
+ /**
+ * @brief Run the server.
+ *
+ * @return true if it ran successfully.
+ */
+ bool run ();
+
+ bool filter_event (int fd);
+
+ bool filter_exception_event (int fd);
+
+ /**
+ * @brief Check if the server is running.
+ *
+ * @return true if it's running.
+ */
+ bool is_running () const;
+
+ /**
+ * @brief Shutdown the server.
+ */
+ void shutdown ();
+
+ /**
+ * @brief Close a client connection.
+ *
+ * @param socket the client socket object to be closed.
+ * @return true if the socket was closed successfully.
+ */
+ bool close_connection (const Socket &socket);
+
+ /**
+ * @brief Get the number of the last occurred error.
+ *
+ * @return the standard errno value.
+ */
+ int get_error_number () const;
+
+ /**
+ * @brief Get the message of the last occurred error.
+ *
+ * @return the error message corresponding to the errno.
+ */
+ String get_error_message () const;
+
+ /**
+ * @brief Get the max number of socket clients.
+ *
+ * @return the max number of socket clients allowed to connect this server.
+ */
+ int get_max_clients () const;
+
+ /**
+ * @brief Set the max number of clients.
+ *
+ * @param max_clients the max number of socket clients allowed to connect this server.
+ */
+ void set_max_clients (int max_clients);
+
+ /**
+ * @brief Insert an external socket into the main loop.
+ *
+ * If data is available on this socket, then the receive signal will be emitted.
+ *
+ * @param sock The external socket to be inserted.
+ * @return true if the socket is valid.
+ */
+ bool insert_external_socket (const Socket &sock);
+
+ /**
+ * @brief Remove an external socket which was inserted by insert_external_socket ().
+ *
+ * @param sock The external socket to be removed.
+ * @return true if the socket is valid and has been removed successfully.
+ */
+ bool remove_external_socket (const Socket &sock);
+
+public:
+ /**
+ * @brief Connect a slot to socket accept signal.
+ *
+ * Connect a slot to socket accept signal, if a client connection is accepted,
+ * this signal will be emitted.
+ *
+ * @param slot the slot to be connected to this signal.
+ *
+ * @return the Connection object of this slot-signal connection, can be used
+ * to disconnect the slot later.
+ */
+ Connection signal_connect_accept (SocketServerSlotSocket *slot);
+
+ /**
+ * @brief Connect a slot to socket receive signal.
+ *
+ * Connect a slot to socket receive signal, if a client send data to this server,
+ * this signal will be emitted.
+ *
+ * @param slot the slot to be connected to this signal.
+ *
+ * @return the Connection object of this slot-signal connection, can be used
+ * to disconnect the slot later.
+ */
+ Connection signal_connect_receive (SocketServerSlotSocket *slot);
+
+ /**
+ * @brief Connect a slot to socket exception signal.
+ *
+ * Connect a slot to socket exception signal, if an exception was occurred
+ * to a client connection, this signal will be emitted.
+ *
+ * @param slot the slot to be connected to this signal.
+ *
+ * @return the Connection object of this slot-signal connection, can be used
+ * to disconnect the slot later.
+ */
+ Connection signal_connect_exception (SocketServerSlotSocket *slot);
+};
+
+/**
+ * @brief Socket client class.
+ *
+ * Class SocketClient provides basic operations to create a Socket Client,
+ * such as connect, read, write, etc.
+ */
+class SocketClient : public Socket
+{
+ bool m_connected;
+
+public:
+ /**
+ * @brief Constructor.
+ */
+ SocketClient ();
+
+ /**
+ * @brief Constructor.
+ *
+ * @param address the server address to be connected.
+ */
+ SocketClient (const SocketAddress &address);
+
+ /**
+ * @brief Destructor.
+ */
+ ~SocketClient ();
+
+ /**
+ * @brief Check if the socket is connected.
+ *
+ * @return true if the socket client is connected to a server.
+ */
+ bool is_connected () const;
+
+ /**
+ * @brief Connect to a server.
+ *
+ * @param address the server socket address to be connected to.
+ *
+ * @return true if connected successfully.
+ */
+ bool connect (const SocketAddress &address);
+
+ /**
+ * @brief Close the client.
+ */
+ void close ();
+};
+
+/**
+ * @brief Get the default socket address of SocketFrontEnd
+ *
+ * SocketFrontEnd should listen on this address by default.
+ */
+String scim_get_default_socket_frontend_address ();
+
+/**
+ * @brief Get the default socket address of SocketIMEngine
+ *
+ * SocketIMEngine should connect to this address by default.
+ */
+String scim_get_default_socket_imengine_address ();
+
+/**
+ * @brief Get the default socket address of SocketConfig
+ *
+ * SocketConfig should connect to this address by default.
+ */
+String scim_get_default_socket_config_address ();
+
+/**
+ * @brief Get the default socket address of the Panel running on localhost.
+ *
+ * The panel running on local host should listen on this address by default.
+ * All FrontEnds which need panel should connect to this address by default.
+ */
+String scim_get_default_panel_socket_address (const String &display);
+
+/**
+ * @brief Get the default socket address of Helper Manager Server running on localhost.
+ */
+String scim_get_default_helper_manager_socket_address ();
+
+/**
+ * @brief Get the default socket timeout value.
+ *
+ * All socket connection should use this timeout value.
+ */
+int scim_get_default_socket_timeout ();
+
+/**
+ * @brief Helper function to open a connection to a socket server
+ * with a standard hand shake protocol.
+ *
+ * This function is used by a socket client to establish a connection
+ * between a socket server with a standard hand shake protocol.
+ *
+ * The communication between Panel and FrontEnd, SocketFrontEnd and SocketIMEngine,
+ * SocketFrontEnd and SocketConfig all uses this hand shake protocol.
+ *
+ * @param key A random magic key sent from the socket server
+ * to identify this client in later communications.
+ * @param client_type The type of this socket client, for example:
+ * "FrontEnd", "GUI", "SocketIMEngine", "SocketConfig" etc.
+ * If the type is "ConnectionTester" then this call just
+ * test if the connection can be established. The client
+ * should close this socket just after the call.
+ * @param server_type The request socket server type, for example:
+ * "Panel", "SocketFrontEnd" etc.
+ * @param socket The reference to the client socket which has been
+ * connected to the socket server.
+ * @param timeout The socket read timeout in millisecond, -1 means unlimited.
+ *
+ * @return true if the connection was established successfully, otherwise
+ * return false, and the client should close the socket.
+ */
+bool scim_socket_open_connection (uint32 &key,
+ const String &client_type,
+ const String &server_type,
+ const Socket &socket,
+ int timeout = -1);
+
+/**
+ * @brief Helper function to accept a connection request from a socket client
+ * with a standard hand shake protocol.
+ *
+ * This function is used by a socket server to accept a connection request
+ * from a socket client which is calling scim_socket_open_connection ().
+ *
+ * If a client with type "ConnectionTester" connected to this socket server, then
+ * this function will return an empty string, but tell the client the connection
+ * was established successfully.
+ *
+ * @param key A random magic key to identify the socket client in later
+ * communications.
+ * @param server_types The type of this server, for example:
+ * "SocketFrontEnd", "Panel" etc.
+ * One server can have multiple types, separated by comma.
+ * @param client_types A list of acceptable client types, separated by comma.
+ * The client type maybe: "FrontEnd", "GUI", "SocketIMEngine" etc.
+ * @param socket The socket connected to the client.
+ * @param timeout the socket read timeout in millisecond, -1 means unlimited.
+ *
+ * @return The type of the accepted socket client, or an empty string if the
+ * connection could not be established.
+ */
+String scim_socket_accept_connection (uint32 &key,
+ const String &server_types,
+ const String &client_types,
+ const Socket &socket,
+ int timeout = -1);
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_SOCKET_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/** @file scim_stl_map.h
+ */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_stl_map.h,v 1.1 2005/01/07 15:28:21 suzhe Exp $
+ */
+
+#ifndef __SCIM_STL_MAP_H
+#define __SCIM_STL_MAP_H
+
+#if ENABLE_HASH_MAP
+ #if defined (HAVE_EXT_HASH_MAP)
+ #define SCIM_USE_STL_EXT_HASH_MAP 1
+ #include <ext/hash_map>
+ #elif defined (HAVE_HASH_MAP)
+ #define SCIM_USE_STL_HASH_MAP 1
+ #include <hash_map>
+ #endif
+#endif
+
+#if !defined (SCIM_USE_STL_HASH_MAP) && !defined (SCIM_USE_STL_EXT_HASH_MAP)
+#define SCIM_USE_STL_MAP 1
+#include <map>
+#endif
+
+namespace scim {
+
+#if SCIM_USE_STL_EXT_HASH_MAP
+class scim_hash_string {
+ __gnu_cxx::hash <const char *> _h;
+public:
+ size_t operator ()(const String &str) const {
+ return _h (str.c_str ());
+ }
+};
+#elif SCIM_USE_STL_HASH_MAP
+class scim_hash_string {
+ std::hash <const char *> _h;
+public:
+ size_t operator ()(const String &str) const {
+ return _h (str.c_str ());
+ }
+};
+#endif
+
+} // Namespace
+
+#endif //__SCIM_STL_MAP_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/**
+ * @file scim_trans_commands.h
+ * @brief Transaction commands.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_trans_commands.h,v 1.9 2005/06/26 16:35:33 suzhe Exp $
+ */
+
+#ifndef __SCIM_TRANS_COMMANDS_H
+#define __SCIM_TRANS_COMMANDS_H
+
+namespace scim {
+
+/**
+ * @brief Transaction command types used by Socket Frontend/IMEngine/Config, Helper and Panel.
+ *
+ * This commands are used in communication protocols of SocketFrontEnd, SocketIMEngine, SocketConfig, Helper and Panel.
+ *
+ * There are mainly four major protocols used in the communications among each part of SCIM:
+ * - between SocketFrontEnd and SocketIMEngine (SocketFrontEnd is server)
+ * - between SocketFrontEnd and SocketConfig (SocketFrontEnd is server)
+ * - between Panel and FrontEnds (eg. X11 FrontEnd, Gtk IMModule and QT IMModule. Panel is server)
+ * - between Panel and Helper (Panel is server).
+ *
+ * As soon as the socket to the server is established, the client must call function
+ * scim_socket_open_connection() to create the connection and get the magic key for later communication.
+ *
+ * At the same time, the server must call function scim_socket_accept_connection() to
+ * accept the connection and get the same magic key for later client verification.
+ *
+ * The valid types of servers are:
+ * - "SocketFrontEnd"\n
+ * The socket FrontEnd server provides remote IMEngine and Config services.
+ * It accepts "SocketIMEngine" and "SocketConfig" clients.
+ * - "Panel"\n
+ * The Panel server provides GUI and Helper management services.
+ * It accepts "FrontEnd" and "Helper" clients.
+ *
+ * The valid types of clients are:
+ * - "SocketIMEngine"\n
+ * The socket IMEngine client acts as a proxy IMEngine forwarding all requests to SocketFrontEnd.
+ * It can only connect to "SocketFrontEnd" server.
+ * - "SocketConfig"\n
+ * The socket Config client acts as a proxy Config forwarding all request to SocketFrontEnd.
+ * It can only connect to "SocketFrontEnd" server.
+ * - "FrontEnd"\n
+ * If a FrontEnd needs a Panel GUI services, it'll be a "FrontEnd" client of the Panel.
+ * It can only connect to "Panel" server.
+ * - "Helper"\n
+ * All Helper objects should be "Helper" clients of a Panel.
+ * It can only connect to "Panel" server.
+ *
+ * Then the client and the server can communicate with each other via the socket by sending transactions.
+ *
+ * Multiple commands and their data may be put into one transaction with a restricted order.
+ * The data of a command must be put into the transaction just follow the command itself.
+ *
+ * A transaction sent from a socket client to a socket server (eg. SocketIMEngine to SocketFrontEnd)
+ * must be started with a SCIM_TRANS_CMD_REQUEST command followed by an uint32 magic key of the client
+ * (returned by scim_socket_open_connection() function.
+ *
+ * A transaction sent back to a socket client from a socket server must be started with a
+ * SCIM_TRANS_CMD_REPLY command.
+ *
+ * So for example, the layout of a transaction sent from SocketIMEngine to SocketFrontEnd may look like:
+ * - #SCIM_TRANS_CMD_REQUEST
+ * - an uint32 data (the magic key of a client)
+ * - #SCIM_TRANS_CMD_PROCESS_KEY_EVENT
+ * - an uint32 data (the id of the IMEngineInstance object used to process the KeyEvent)
+ * - a scim::KeyEvent data (the KeyEvent to be processed)
+ *
+ * Some commands may be used in more than one protocols for similar purpose, but they may have different
+ * data in different protocol.
+ *
+ * <b>Brief introduction of communication protocols used in SCIM:</b>
+ *
+ * Please refer to the descriptions of each Transaction commands for details.
+ *
+ * -# <b>Protocol used between SocketIMEngine and SocketFrontEnd</b>\n
+ * In this protocol, SocketFrontEnd is socket server, SocketIMEngine is client.
+ * - <b>from SocketIMEngine to SocketFrontEnd:</b>\n
+ * The Transaction sent from SocketIMEngine to SocketFrontEnd must
+ * start with #SCIM_TRANS_CMD_REQUEST and followed by an uint32 magic
+ * key which was returned by scim_socket_open_connection() and
+ * scim_socket_accept_connection().\n
+ * Before parsing the Transaction,
+ * SocketFrontEnd must verify if the magic key is matched.
+ * If the magic key is not matched, then SocketFrontEnd should just
+ * discard this transaction.\n
+ * There can be one or more commands and corresponding data right after the
+ * magic key.\n
+ * The valid commands which can be used here are:
+ * - #SCIM_TRANS_CMD_NEW_INSTANCE
+ * - #SCIM_TRANS_CMD_DELETE_INSTANCE
+ * - #SCIM_TRANS_CMD_DELETE_ALL_INSTANCES
+ * - #SCIM_TRANS_CMD_GET_FACTORY_LIST
+ * - #SCIM_TRANS_CMD_GET_FACTORY_NAME
+ * - #SCIM_TRANS_CMD_GET_FACTORY_AUTHORS
+ * - #SCIM_TRANS_CMD_GET_FACTORY_CREDITS
+ * - #SCIM_TRANS_CMD_GET_FACTORY_HELP
+ * - #SCIM_TRANS_CMD_GET_FACTORY_LOCALES
+ * - #SCIM_TRANS_CMD_GET_FACTORY_ICON_FILE
+ * - #SCIM_TRANS_CMD_GET_FACTORY_LANGUAGE
+ * - #SCIM_TRANS_CMD_PROCESS_KEY_EVENT
+ * - #SCIM_TRANS_CMD_MOVE_PREEDIT_CARET
+ * - #SCIM_TRANS_CMD_SELECT_CANDIDATE
+ * - #SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE
+ * - #SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP
+ * - #SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN
+ * - #SCIM_TRANS_CMD_RESET
+ * - #SCIM_TRANS_CMD_FOCUS_IN
+ * - #SCIM_TRANS_CMD_FOCUS_OUT
+ * - #SCIM_TRANS_CMD_TRIGGER_PROPERTY
+ * - #SCIM_TRANS_CMD_PROCESS_HELPER_EVENT
+ * - #SCIM_TRANS_CMD_UPDATE_CLIENT_CAPABILITIES
+ * - #SCIM_TRANS_CMD_LOAD_FILE
+ * - #SCIM_TRANS_CMD_CLOSE_CONNECTION
+ * - <b>from SocketFrontEnd to SocketIMEngine:</b>\n
+ * The Transaction sent back from SocketFrontEnd to SocketIMEngine must
+ * start with #SCIM_TRANS_CMD_REPLY and end with #SCIM_TRANS_CMD_OK or
+ * #SCIM_TRANS_CMD_FAIL to indicate if the request previously sent by
+ * SocketIMEngine was executed successfully.\n
+ * For some requests, like SCIM_TRANS_CMD_GET_FACTORY_LIST, etc.
+ * only some result data will be returned between #SCIM_TRANS_CMD_REPLY and #SCIM_TRANS_CMD_OK.\n
+ * For some requests, like SCIM_TRANS_CMD_PROCESS_KEY_EVENT, etc.
+ * one or more following commands and corresponding data may be returned between
+ * #SCIM_TRANS_CMD_REPLY and #SCIM_TRANS_CMD_OK commands.\n
+ * The valid commands can be used here are:
+ * - #SCIM_TRANS_CMD_SHOW_PREEDIT_STRING
+ * - #SCIM_TRANS_CMD_SHOW_AUX_STRING
+ * - #SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE
+ * - #SCIM_TRANS_CMD_HIDE_PREEDIT_STRING
+ * - #SCIM_TRANS_CMD_HIDE_AUX_STRING
+ * - #SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE
+ * - #SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET
+ * - #SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING
+ * - #SCIM_TRANS_CMD_UPDATE_AUX_STRING
+ * - #SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE
+ * - #SCIM_TRANS_CMD_COMMIT_STRING
+ * - #SCIM_TRANS_CMD_FORWARD_KEY_EVENT
+ * - #SCIM_TRANS_CMD_REGISTER_PROPERTIES
+ * - #SCIM_TRANS_CMD_UPDATE_PROPERTY
+ * - #SCIM_TRANS_CMD_BEEP
+ * - #SCIM_TRANS_CMD_START_HELPER
+ * - #SCIM_TRANS_CMD_STOP_HELPER
+ * - #SCIM_TRANS_CMD_SEND_HELPER_EVENT
+ * -# <b>Protocol used between SocketConfig and SocketFrontEnd</b>\n
+ * In this protocol, SocketFrontEnd is socket server, SocketConfig is client.
+ * - <b>from SocketConfig to SocketFrontEnd:</b>\n
+ * The Transaction sent from SocketConfig to SocketFrontEnd must
+ * start with #SCIM_TRANS_CMD_REQUEST and followed by an uint32 magic
+ * key which was returned by scim_socket_open_connection() and
+ * scim_socket_accept_connection().\n
+ * Before parsing the Transaction,
+ * SocketFrontEnd must verify if the magic key is matched.
+ * If the magic key is not matched, then SocketFrontEnd should just
+ * discard this transaction.\n
+ * There can be one or more commands and corresponding data right after the
+ * magic key.\n
+ * The valid commands which can be used here are:
+ * - #SCIM_TRANS_CMD_FLUSH_CONFIG
+ * - #SCIM_TRANS_CMD_ERASE_CONFIG
+ * - #SCIM_TRANS_CMD_GET_CONFIG_STRING
+ * - #SCIM_TRANS_CMD_SET_CONFIG_STRING
+ * - #SCIM_TRANS_CMD_GET_CONFIG_INT
+ * - #SCIM_TRANS_CMD_SET_CONFIG_INT
+ * - #SCIM_TRANS_CMD_GET_CONFIG_BOOL
+ * - #SCIM_TRANS_CMD_SET_CONFIG_BOOL
+ * - #SCIM_TRANS_CMD_GET_CONFIG_DOUBLE
+ * - #SCIM_TRANS_CMD_SET_CONFIG_DOUBLE
+ * - #SCIM_TRANS_CMD_GET_CONFIG_VECTOR_STRING
+ * - #SCIM_TRANS_CMD_SET_CONFIG_VECTOR_STRING
+ * - #SCIM_TRANS_CMD_GET_CONFIG_VECTOR_INT
+ * - #SCIM_TRANS_CMD_SET_CONFIG_VECTOR_INT
+ * - #SCIM_TRANS_CMD_RELOAD_CONFIG
+ * - #SCIM_TRANS_CMD_LOAD_FILE
+ * - #SCIM_TRANS_CMD_CLOSE_CONNECTION
+ * - <b>from SocketFrontEnd to SocketConfig:</b>\n
+ * The Transaction sent back from SocketFrontEnd to SocketConfig must
+ * start with #SCIM_TRANS_CMD_REPLY and end with #SCIM_TRANS_CMD_OK or
+ * #SCIM_TRANS_CMD_FAIL to indicate if the request previously sent by
+ * SocketConfig was executed successfully.\n
+ * For some requests, like SCIM_TRANS_CMD_FLUSH_CONFIG, etc.
+ * no result data will be returned.\n
+ * For some requests, like SCIM_TRANS_CMD_GET_CONFIG_STRING, etc.
+ * the corresponding data will be returned between
+ * #SCIM_TRANS_CMD_REPLY and #SCIM_TRANS_CMD_OK commands.\n
+ * -# <b>Protocol used between FrontEnds and Panel</b>\n
+ * In this protocol, Panel (eg. scim-panel-gtk or scim-panel-kde) is socket server, FrontEnds are clients.
+ * - <b>from FrontEnds to Panel:</b>\n
+ * The Transaction sent from FrontEnds to Panel must
+ * start with #SCIM_TRANS_CMD_REQUEST and followed by an uint32 magic
+ * key which was returned by scim_socket_open_connection() and
+ * scim_socket_accept_connection(). Then there must be an uint32 id
+ * for current focused input context right after the magic key.\n
+ * Before parsing the Transaction,
+ * Panel must verify if the magic key is matched.
+ * If the magic key is not matched, then Panel should just
+ * discard this transaction.\n
+ * There can be one or more commands and corresponding data right after the
+ * magic key.\n
+ * The valid commands which can be used here are:
+ * - #SCIM_TRANS_CMD_UPDATE_SCREEN
+ * - #SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION
+ * - #SCIM_TRANS_CMD_PANEL_TURN_ON
+ * - #SCIM_TRANS_CMD_PANEL_TURN_OFF
+ * - #SCIM_TRANS_CMD_PANEL_UPDATE_FACTORY_INFO
+ * - #SCIM_TRANS_CMD_PANEL_SHOW_HELP
+ * - #SCIM_TRANS_CMD_PANEL_SHOW_FACTORY_MENU
+ * - #SCIM_TRANS_CMD_SHOW_PREEDIT_STRING
+ * - #SCIM_TRANS_CMD_SHOW_AUX_STRING
+ * - #SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE
+ * - #SCIM_TRANS_CMD_HIDE_PREEDIT_STRING
+ * - #SCIM_TRANS_CMD_HIDE_AUX_STRING
+ * - #SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE
+ * - #SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET
+ * - #SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING
+ * - #SCIM_TRANS_CMD_UPDATE_AUX_STRING
+ * - #SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE
+ * - #SCIM_TRANS_CMD_REGISTER_PROPERTIES
+ * - #SCIM_TRANS_CMD_UPDATE_PROPERTY
+ * - #SCIM_TRANS_CMD_START_HELPER
+ * - #SCIM_TRANS_CMD_STOP_HELPER
+ * - #SCIM_TRANS_CMD_SEND_HELPER_EVENT
+ * - <b>from Panel to FrontEnds:</b>\n
+ * The Transaction sent from Panel to FrontEnds must
+ * start with #SCIM_TRANS_CMD_REPLY.
+ * For the following commands except
+ * #SCIM_TRANS_CMD_RELOAD_CONFIG and #SCIM_TRANS_CMD_EXIT,
+ * there must be an uint32 id of the currently focused input context
+ * right after the #SCIM_TRANS_CMD_REPLY command.
+ * Then there can be one or more commands and corresponding data following.\n
+ * The valid commands which can be used here are:
+ * - #SCIM_TRANS_CMD_RELOAD_CONFIG
+ * - #SCIM_TRANS_CMD_EXIT
+ * - #SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE
+ * - #SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP
+ * - #SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN
+ * - #SCIM_TRANS_CMD_PROCESS_KEY_EVENT
+ * - #SCIM_TRANS_CMD_MOVE_PREEDIT_CARET
+ * - #SCIM_TRANS_CMD_SELECT_CANDIDATE
+ * - #SCIM_TRANS_CMD_TRIGGER_PROPERTY
+ * - #SCIM_TRANS_CMD_PROCESS_HELPER_EVENT
+ * - #SCIM_TRANS_CMD_COMMIT_STRING
+ * - #SCIM_TRANS_CMD_FORWARD_KEY_EVENT
+ * - #SCIM_TRANS_CMD_PANEL_REQUEST_HELP
+ * - #SCIM_TRANS_CMD_PANEL_REQUEST_FACTORY_MENU
+ * - #SCIM_TRANS_CMD_PANEL_CHANGE_FACTORY
+ * -# <b>Protocol used between Helper and Panel</b>\n
+ * In this protocol, Panel (eg. scim-panel-gtk or scim-panel-kde) is socket server, Helper is client.
+ * - <b>from Helper to Panel:</b>\n
+ * The Transaction sent from Helper to Panel must
+ * start with #SCIM_TRANS_CMD_REQUEST and followed by an uint32 magic
+ * key which was returned by scim_socket_open_connection() and
+ * scim_socket_accept_connection().
+ * Before parsing the Transaction,
+ * Panel must verify if the magic key is matched.
+ * If the magic key is not matched, then Panel should just
+ * discard this transaction.\n
+ * There can be one or more commands and corresponding data right after the
+ * magic key.\n
+ * The valid commands which can be used here are:
+ * - #SCIM_TRANS_CMD_PANEL_REGISTER_HELPER
+ * - #SCIM_TRANS_CMD_PANEL_SEND_IMENGINE_EVENT
+ * - #SCIM_TRANS_CMD_PANEL_SEND_KEY_EVENT
+ * - #SCIM_TRANS_CMD_REGISTER_PROPERTIES
+ * - #SCIM_TRANS_CMD_UPDATE_PROPERTY
+ * - #SCIM_TRANS_CMD_FORWARD_KEY_EVENT
+ * - #SCIM_TRANS_CMD_COMMIT_STRING
+ * - <b>from Panel to Helper:</b>\n
+ * The Transaction sent from Panel to Helper must
+ * start with #SCIM_TRANS_CMD_REPLY and followed by an
+ * uint32 input context id and a scim::String input context UUID.
+ * Then there can be one or more commands and corresponding data just after the UUID.\n
+ * The valid commands which can be used here are:
+ * - #SCIM_TRANS_CMD_EXIT
+ * - #SCIM_TRANS_CMD_UPDATE_SCREEN
+ * - #SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION
+ * - #SCIM_TRANS_CMD_TRIGGER_PROPERTY
+ * - #SCIM_TRANS_CMD_HELPER_PROCESS_IMENGINE_EVENT
+ *
+ * @addtogroup TransactionCommands
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+/// Unknown command. No use.
+#ifndef SCIM_TRANS_CMD_UNKNOWN
+ #define SCIM_TRANS_CMD_UNKNOWN 0
+#endif
+
+// Common Commands
+
+/**
+ * @brief It's the first command which should be put into the Transaction
+ * sending from a socket client to a socket server.
+ *
+ * The corresponding data for this command is an uint32 magic key
+ * which is returned by scim_socket_open_connection() function.
+ *
+ */
+#ifndef SCIM_TRANS_CMD_REQUEST
+ #define SCIM_TRANS_CMD_REQUEST 1
+#endif
+
+/**
+ * @brief It's the first command which should be put into the Transaction
+ * sending from a socket server to a socket client.
+ *
+ * The corresponding data for this command is different in
+ * each protocol. Please refer to the previous protocol notes for details.
+ *
+ */
+#ifndef SCIM_TRANS_CMD_REPLY
+ #define SCIM_TRANS_CMD_REPLY 2
+#endif
+
+/**
+ * @brief This command is usually used in the Transaction sending from
+ * a socket server to a socket client to indicate that the request
+ * previously sent from the client was executed successfully.
+ *
+ * There is no data for this command.
+ *
+ */
+#ifndef SCIM_TRANS_CMD_OK
+ #define SCIM_TRANS_CMD_OK 3
+#endif
+
+/**
+ * @brief This command is usually used in the Transaction sending from
+ * a socket server to a socket client to indicate that the request
+ * previously sent from the client was failed to be executed.
+ *
+ * There is no data for this command.
+ *
+ */
+#ifndef SCIM_TRANS_CMD_FAIL
+ #define SCIM_TRANS_CMD_FAIL 4
+#endif
+
+/**
+ * @brief This command is used internally by scim_socket_open_connection() and
+ * scim_socket_accept_connection().
+ *
+ * It's sent from a socket client to a socket server to
+ * request the server to create the connection.
+ *
+ * The corresponding data are:
+ * - (scim::String) a version string (the binary version of SCIM).
+ * - (scim::String) type of the client, eg. "SocketIMEngine", "FrontEnd", "Helper" etc.
+ *
+ * If the socket server accept the connection request, it must send back a Transaction with
+ * following content:
+ * - #SCIM_TRANS_CMD_REPLY
+ * - (scim::String) a comma separated server types which are supported by the server, eg. "SocketFrontEnd" etc.
+ * - (uint32) a magic key used to validate the communication later.
+ *
+ * Then if the client accept the result too, it must send the following content back to the
+ * socket server:
+ * - #SCIM_TRANS_CMD_REPLY
+ * - #SCIM_TRANS_CMD_OK
+ *
+ * Otherwise, the client must return:
+ * - #SCIM_TRANS_CMD_REPLY
+ * - #SCIM_TRANS_CMD_FAIL
+ *
+ * If the socket server do not accept the connection in the first stage, it should discard the request and send
+ * nothing back.
+ *
+ */
+#ifndef SCIM_TRANS_CMD_OPEN_CONNECTION
+ #define SCIM_TRANS_CMD_OPEN_CONNECTION 5
+#endif
+
+/**
+ * @brief It's used to request the socket server to close the connection forcedly.
+ *
+ * It's currently not used at all.
+ *
+ */
+#ifndef SCIM_TRANS_CMD_CLOSE_CONNECTION
+ #define SCIM_TRANS_CMD_CLOSE_CONNECTION 6
+#endif
+
+/**
+ * @brief Request the socket server to load and send a file to the client.
+ *
+ * The corresponding data is:
+ * - (scim::String) the full file path to be loaded.
+ *
+ * If the file is loaded successfully, then the server should send back:
+ * - #SCIM_TRANS_CMD_REPLY
+ * - (raw buffer) the buffer which holds the file content.
+ * - #SCIM_TRANS_CMD_OK
+ *
+ * Otherwise it should send back:
+ * - #SCIM_TRANS_CMD_REPLY
+ * - #SCIM_TRANS_CMD_FAIL
+ *
+ * This command is only supported by SocketFrontEnd.
+ *
+ */
+#ifndef SCIM_TRANS_CMD_LOAD_FILE
+ #define SCIM_TRANS_CMD_LOAD_FILE 7
+#endif
+
+/**
+ * @brief Request the socket server to save a buffer into a file.
+ *
+ * The corresponding data is:
+ * - (scim::String) the full file path to be used to save the buffer.
+ * - (raw buffer) the buffer to be saved.
+ *
+ * If the file is saved successfully, then the server should return:
+ * - #SCIM_TRANS_CMD_REPLY
+ * - #SCIM_TRANS_CMD_OK
+ *
+ * Otherwise it should return:
+ * - #SCIM_TRANS_CMD_REPLY
+ * - #SCIM_TRANS_CMD_FAIL
+ *
+ * This command is currently not supported by any servers.
+ *
+ */
+#ifndef SCIM_TRANS_CMD_SAVE_FILE
+ #define SCIM_TRANS_CMD_SAVE_FILE 8
+#endif
+
+/**
+ * @brief This command should be sent from a socket server to its clients to let them exit.
+ *
+ * No data is associated to this command.
+ *
+ * This command is currently only used by Panel server.
+ *
+ */
+#ifndef SCIM_TRANS_CMD_EXIT
+ #define SCIM_TRANS_CMD_EXIT 99
+#endif
+
+// Socket IMEngine to Socket FrontEnd
+
+/**
+ * @brief This command is used in SocketIMEngine to SocketFrontEnd and
+ * Panel to FrontEnd protocols to send a KeyEvent to an IMEngineInstance.
+ *
+ * When used in SocketIMEngine to SocketFrontEnd protocol,
+ * the corresponding data is:
+ * - (uint32) the id of the IMEngineInstance to process the KeyEvent.
+ * - (KeyEvent) the KeyEvent object to be processed.
+ *
+ * The Transaction returned from SocketFrontEnd should contain:
+ * - #SCIM_TRANS_CMD_REPLY
+ * - (any valid commands and their corresponding data)
+ * - #SCIM_TRANS_CMD_OK or #SCIM_TRANS_CMD_FAIL to indicate
+ * that if the KeyEvent was processed successfully.
+ *
+ * When used in Panel to FrontEnds protocol, the corresponding data is:
+ * - (KeyEvent) the KeyEvent object to be processed.
+ */
+const int SCIM_TRANS_CMD_PROCESS_KEY_EVENT = 100;
+const int SCIM_TRANS_CMD_MOVE_PREEDIT_CARET = 101;
+const int SCIM_TRANS_CMD_SELECT_CANDIDATE = 102;
+const int SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE = 103;
+const int SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP = 104;
+const int SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN = 105;
+const int SCIM_TRANS_CMD_RESET = 106;
+const int SCIM_TRANS_CMD_FOCUS_IN = 107;
+const int SCIM_TRANS_CMD_FOCUS_OUT = 108;
+const int SCIM_TRANS_CMD_TRIGGER_PROPERTY = 109;
+const int SCIM_TRANS_CMD_PROCESS_HELPER_EVENT = 110;
+const int SCIM_TRANS_CMD_UPDATE_CLIENT_CAPABILITIES = 111;
+const int ISM_TRANS_CMD_SHOW_ISE = 112;
+const int ISM_TRANS_CMD_HIDE_ISE = 113;
+const int ISM_TRANS_CMD_SELECT_ASSOCIATE = 114;
+const int ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE_PAGE_SIZE = 115;
+const int ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_UP = 116;
+const int ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_DOWN = 117;
+const int ISM_TRANS_CMD_SELECT_AUX = 118;
+
+// Socket FrontEnd to Socket IMEngine
+// FrontEnds to Panel
+const int SCIM_TRANS_CMD_SHOW_PREEDIT_STRING = 150;
+const int SCIM_TRANS_CMD_SHOW_AUX_STRING = 151;
+const int SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE = 152;
+const int SCIM_TRANS_CMD_HIDE_PREEDIT_STRING = 153;
+const int SCIM_TRANS_CMD_HIDE_AUX_STRING = 154;
+const int SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE = 155;
+const int SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET = 156;
+const int SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING = 157;
+const int SCIM_TRANS_CMD_UPDATE_AUX_STRING = 158;
+const int SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE = 159;
+const int SCIM_TRANS_CMD_COMMIT_STRING = 160;
+const int SCIM_TRANS_CMD_FORWARD_KEY_EVENT = 161;
+const int SCIM_TRANS_CMD_REGISTER_PROPERTIES = 162;
+const int SCIM_TRANS_CMD_UPDATE_PROPERTY = 163;
+const int SCIM_TRANS_CMD_BEEP = 164;
+const int SCIM_TRANS_CMD_START_HELPER = 165;
+const int SCIM_TRANS_CMD_STOP_HELPER = 166;
+const int SCIM_TRANS_CMD_SEND_HELPER_EVENT = 167;
+const int SCIM_TRANS_CMD_GET_SURROUNDING_TEXT = 168;
+const int SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT = 169;
+const int ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE = 170;
+const int ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE = 171;
+const int ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE = 172;
+
+// Socket IMEngine to Socket FrontEnd
+const int SCIM_TRANS_CMD_NEW_INSTANCE = 200;
+const int SCIM_TRANS_CMD_DELETE_INSTANCE = 201;
+const int SCIM_TRANS_CMD_DELETE_ALL_INSTANCES = 202;
+
+const int SCIM_TRANS_CMD_GET_FACTORY_LIST = 203;
+const int SCIM_TRANS_CMD_GET_FACTORY_NAME = 204;
+const int SCIM_TRANS_CMD_GET_FACTORY_AUTHORS = 205;
+const int SCIM_TRANS_CMD_GET_FACTORY_CREDITS = 206;
+const int SCIM_TRANS_CMD_GET_FACTORY_HELP = 207;
+const int SCIM_TRANS_CMD_GET_FACTORY_LOCALES = 208;
+const int SCIM_TRANS_CMD_GET_FACTORY_ICON_FILE = 209;
+const int SCIM_TRANS_CMD_GET_FACTORY_LANGUAGE = 210;
+
+// Socket Config to Socket FrontEnd
+const int SCIM_TRANS_CMD_FLUSH_CONFIG = 300;
+const int SCIM_TRANS_CMD_ERASE_CONFIG = 301;
+const int SCIM_TRANS_CMD_GET_CONFIG_STRING = 302;
+const int SCIM_TRANS_CMD_SET_CONFIG_STRING = 303;
+const int SCIM_TRANS_CMD_GET_CONFIG_INT = 304;
+const int SCIM_TRANS_CMD_SET_CONFIG_INT = 305;
+const int SCIM_TRANS_CMD_GET_CONFIG_BOOL = 306;
+const int SCIM_TRANS_CMD_SET_CONFIG_BOOL = 307;
+const int SCIM_TRANS_CMD_GET_CONFIG_DOUBLE = 308;
+const int SCIM_TRANS_CMD_SET_CONFIG_DOUBLE = 309;
+const int SCIM_TRANS_CMD_GET_CONFIG_VECTOR_STRING = 310;
+const int SCIM_TRANS_CMD_SET_CONFIG_VECTOR_STRING = 311;
+const int SCIM_TRANS_CMD_GET_CONFIG_VECTOR_INT = 312;
+const int SCIM_TRANS_CMD_SET_CONFIG_VECTOR_INT = 313;
+const int SCIM_TRANS_CMD_RELOAD_CONFIG = 314;
+
+// Used by Panel and Helper
+const int SCIM_TRANS_CMD_UPDATE_SCREEN = 400;
+const int SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION = 401;
+const int ISM_TRANS_CMD_UPDATE_CURSOR_POSITION = 402;
+
+//Privately used by panel.
+const int SCIM_TRANS_CMD_PANEL_EXIT = 500;
+
+//FrontEnd Client to Panel
+const int SCIM_TRANS_CMD_PANEL_TURN_ON = 501;
+const int SCIM_TRANS_CMD_PANEL_TURN_OFF = 502;
+const int SCIM_TRANS_CMD_PANEL_UPDATE_FACTORY_INFO = 503;
+const int SCIM_TRANS_CMD_PANEL_SHOW_HELP = 504;
+const int SCIM_TRANS_CMD_PANEL_SHOW_FACTORY_MENU = 505;
+const int SCIM_TRANS_CMD_PANEL_REGISTER_INPUT_CONTEXT = 506;
+const int SCIM_TRANS_CMD_PANEL_REMOVE_INPUT_CONTEXT = 507;
+const int SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT = 508;
+const int ISM_TRANS_CMD_PANEL_START_DEFAULT_ISE = 509;
+
+//Panel to FrontEnd Client
+const int SCIM_TRANS_CMD_PANEL_REQUEST_HELP = 520;
+const int SCIM_TRANS_CMD_PANEL_REQUEST_FACTORY_MENU = 521;
+const int SCIM_TRANS_CMD_PANEL_CHANGE_FACTORY = 522;
+const int ISM_TRANS_CMD_PANEL_REQUEST_RESET_ISE = 523;
+const int ISM_TRANS_CMD_PANEL_UPDATE_KEYBOARD_ISE = 524;
+
+//Helper Client To Panel
+const int SCIM_TRANS_CMD_PANEL_REGISTER_HELPER = 540;
+const int SCIM_TRANS_CMD_PANEL_SEND_IMENGINE_EVENT = 541;
+const int SCIM_TRANS_CMD_PANEL_SEND_KEY_EVENT = 542;
+const int SCIM_TRANS_CMD_PANEL_REGISTER_ACTIVE_HELPER = 543;
+
+//Panel to Helper Client
+const int SCIM_TRANS_CMD_HELPER_PROCESS_IMENGINE_EVENT = 602;
+const int SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT = 603;
+const int SCIM_TRANS_CMD_HELPER_DETACH_INPUT_CONTEXT = 604;
+
+//HelperManager Commands
+const int SCIM_TRANS_CMD_HELPER_MANAGER_GET_HELPER_LIST = 700;
+const int SCIM_TRANS_CMD_HELPER_MANAGER_RUN_HELPER = 701;
+const int SCIM_TRANS_CMD_HELPER_MANAGER_STOP_HELPER = 702;
+const int SCIM_TRANS_CMD_HELPER_MANAGER_SEND_DISPLAY = 703;
+const int SCIM_TRANS_CMD_HELPER_MANAGER_SEND_ISE_LIST = 704;
+
+const int ISM_TRANS_CMD_GET_ACTIVE_ISE_LIST = 950;
+
+
+/* commands to send from IMControl to Control Panel*/
+#define ISM_TRANS_CMD_SHOW_ISE_PANEL 1100
+#define ISM_TRANS_CMD_HIDE_ISE_PANEL 1101
+#define ISM_TRANS_CMD_SHOW_ISF_CONTROL 1102
+#define ISM_TRANS_CMD_HIDE_ISF_CONTROL 1103
+
+/*command that ISE sends to IMControl*/
+#define ISM_TRANS_CMD_UPDATE_ISE_STYLE 1106
+
+/* commands to communicate between IMControl and Control Panel*/
+#define ISM_TRANS_CMD_SET_ISE_MODE 1107
+#define ISM_TRANS_CMD_SET_ISE_LANGUAGE 1108
+#define ISM_TRANS_CMD_SET_ISE_IMDATA 1109
+#define ISM_TRANS_CMD_GET_ISE_IMDATA 1110
+#define ISM_TRANS_CMD_GET_ACTIVE_ISE_NAME 1111
+#define ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_NAME 1112
+#define ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID 1113
+#define ISM_TRANS_CMD_GET_ACTIVE_ISE_SIZE 1114
+#define ISM_TRANS_CMD_ISE_CHANGED 1115
+#define ISM_TRANS_CMD_SET_PRIVATE_KEY 1116
+#define ISM_TRANS_CMD_SET_PRIVATE_KEY_BY_IMG 1117
+#define ISM_TRANS_CMD_SET_LAYOUT 1118
+#define ISM_TRANS_CMD_GET_LAYOUT 1119
+#define ISM_TRANS_CMD_SET_CAPS_MODE 1120
+
+/* commands that ISE sends info to IMControl*/
+#define ISM_TRANS_CMD_UPDATE_ISE_HIDED 1122
+#define ISM_TRANS_CMD_GET_ISE_LIST 1123
+#define ISM_TRANS_CMD_GET_LANGUAGE_LIST 1124
+#define ISM_TRANS_CMD_GET_ISE_LANGUAGE 1125
+#define ISM_TRANS_CMD_SET_ISF_LANGUAGE 1126
+#define ISM_TRANS_CMD_GET_ALL_LANGUAGE_LIST 1127
+#define ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT 1128
+#define ISM_TRANS_CMD_RESET_ISE_OPTION 1129
+
+/* commands to send from Control Panel to IMControl*/
+#define ISM_TRANS_CMD_ISE_PANEL_SHOWED 1130
+#define ISM_TRANS_CMD_ISE_PANEL_HIDED 1131
+#define ISM_TRANS_CMD_ISF_CONTROL_SHOWED 1132
+#define ISM_TRANS_CMD_ISF_CONTROL_HIDED 1133
+
+#define ISM_TRANS_CMD_RESET_ISE_CONTEXT 1134
+#define ISM_TRANS_CMD_SET_ISE_SCREEN_DIRECTION 1135
+#define ISM_TRANS_CMD_ISE_RESULT_TO_IMCONTROL 1136
+#define ISM_TRANS_CMD_SET_INDICATOR_CHAR_COUNT 1137
+#define ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_STRING 1138
+#define ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_IM_BUTTON_SET_LABEL 1139
+#define ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_PRESET_TEXT 1140
+#define ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_TEXT 1141
+#define ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_MAX_LENGTH 1142
+#define ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_CHANGED 1143
+#define ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_GET_TEXT 1144
+#define ISM_TRANS_CMD_IM_INDICATOR_SET_COUNT_LABEL 1145
+#define ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_BUTTON_SENSTIVITY 1146
+#define ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_PROGRESS_BAR 1147
+#define ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_PREEDIT_CHANGED 1148
+#define ISM_TRANS_CMD_SET_DISABLE_KEY 1149
+#define ISM_TRANS_CMD_GET_LAYOUT_LIST 1150
+
+
+// ISE to Control Panel
+const int ISM_TRANS_CMD_SET_CANDIDATE_UI = 1201;
+const int ISM_TRANS_CMD_GET_CANDIDATE_UI = 1202;
+const int ISM_TRANS_CMD_UPDATE_CANDIDATE_UI = 1203;
+const int ISM_TRANS_CMD_GET_KEYBOARD_ISE_LIST = 1204;
+const int ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE_LIST = 1205;
+const int ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_NAME = 1206;
+const int ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID = 1207;
+const int ISM_TRANS_CMD_GET_KEYBOARD_ISE = 1208;
+const int ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE = 1209;
+const int ISM_TRANS_CMD_SET_CANDIDATE_POSITION = 1210;
+const int ISM_TRANS_CMD_HIDE_CANDIDATE = 1211;
+const int ISM_TRANS_CMD_GET_CANDIDATE_RECT = 1212;
+const int ISM_TRANS_CMD_UPDATE_CANDIDATE_RECT = 1213;
+const int ISM_TRANS_CMD_LAUNCH_HELPER_ISE_LIST_SELECTION = 1214;
+// Candidate to Helper ISE
+const int ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_SHOW = 1251;
+const int ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_HIDE = 1252;
+
+const int ISM_TRANS_CMD_TURN_ON_LOG = 1301;
+
+const int SCIM_TRANS_CMD_USER_DEFINED = 10000;
+/**
+ * @}
+ */
+
+} // namespace scim
+
+#endif //__SCIM_TRANS_COMMANDS_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/** @file scim_transaction.cpp
+ * @brief Implementation of Transaction related classes.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_transaction.cpp,v 1.13.2.1 2006/06/07 09:27:57 suzhe Exp $
+ *
+ */
+
+#define Uses_SCIM_TRANSACTION
+#define Uses_STL_ALGORITHM
+#define Uses_C_STDLIB
+#define Uses_C_STRING
+
+#include "scim_private.h"
+#include "scim.h"
+#include <iomanip>
+
+namespace scim {
+
+#define SCIM_TRANS_MIN_BUFSIZE 512
+#define SCIM_TRANS_MAX_BUFSIZE (1048576*16)
+#define SCIM_TRANS_MAGIC 0x4d494353
+#define SCIM_TRANS_HEADER_SIZE (sizeof (uint32) * 4)
+
+class TransactionHolder
+{
+ mutable int m_ref;
+
+public:
+ size_t m_buffer_size;
+ size_t m_write_pos;
+ unsigned char *m_buffer;
+
+public:
+ TransactionHolder (size_t bufsize)
+ : m_ref (0),
+ m_buffer_size (std::max ((size_t)SCIM_TRANS_MIN_BUFSIZE, bufsize)),
+ m_write_pos (SCIM_TRANS_HEADER_SIZE),
+ m_buffer ((unsigned char*) malloc (std::max ((size_t)SCIM_TRANS_MIN_BUFSIZE, bufsize))) {
+ if (!m_buffer)
+ throw Exception ("TransactionHolder::TransactionHolder() Out of memory");
+ }
+
+ ~TransactionHolder () {
+ free (m_buffer);
+ }
+
+ bool valid () const {
+ return m_buffer && m_buffer_size;
+ }
+
+ void ref () const {
+ ++m_ref;
+ }
+
+ void unref () const {
+ if ((--m_ref) <= 0) delete this;
+ }
+
+ void request_buffer_size (size_t request) {
+ if (m_write_pos + request >= m_buffer_size) {
+ size_t bufsize = std::max ((size_t) SCIM_TRANS_MIN_BUFSIZE, request + 1) + m_buffer_size;
+ unsigned char *tmp = (unsigned char*) realloc (m_buffer, bufsize);
+
+ if (!tmp)
+ throw Exception ("TransactionHolder::request_buffer_size() Out of memory");
+
+ m_buffer = tmp;
+ m_buffer_size = bufsize;
+ }
+ }
+
+ uint32 calc_checksum () const {
+ uint32 sum = 0;
+
+ unsigned char *ptr = m_buffer + SCIM_TRANS_HEADER_SIZE;
+ unsigned char *ptr_end = m_buffer + m_write_pos;
+
+ while (ptr < ptr_end) {
+ sum += (uint32) (*ptr);
+ sum = (sum << 1) | (sum >> 31);
+ ++ ptr;
+ }
+
+ return sum;
+ }
+
+ void dump () const {
+#ifdef ISF_PROF
+ std::cout << "write position:" << m_write_pos << "\n";
+ std::cout << "buffer content:";
+ size_t i = 0;
+ while (i < m_buffer_size) {
+ if (!(i % 16))
+ std::cout << "\n";
+ std::cout << std::hex << std::setw(4) << (unsigned short)(m_buffer[i++]);
+ }
+ std::cout << "\n";
+#endif
+ }
+};
+
+Transaction::Transaction (size_t bufsize)
+ : m_holder (new TransactionHolder (bufsize)),
+ m_reader (new TransactionReader ())
+{
+ m_holder->ref ();
+ m_reader->attach (*this);
+}
+
+Transaction::~Transaction ()
+{
+ delete m_reader;
+ m_holder->unref ();
+}
+
+bool
+Transaction::valid () const
+{
+ return m_holder->valid ();
+}
+
+bool
+Transaction::write_to_socket (const Socket &socket, uint32 signature) const
+{
+ if (socket.valid () && valid ()) {
+ scim_uint32tobytes (m_holder->m_buffer, signature);
+ scim_uint32tobytes (m_holder->m_buffer + sizeof (uint32), SCIM_TRANS_MAGIC);
+ scim_uint32tobytes (m_holder->m_buffer + sizeof (uint32) * 2, m_holder->m_write_pos - SCIM_TRANS_HEADER_SIZE);
+ scim_uint32tobytes (m_holder->m_buffer + sizeof (uint32) * 3, m_holder->calc_checksum ());
+ return socket.write (m_holder->m_buffer, m_holder->m_write_pos) == (int) m_holder->m_write_pos;
+ }
+ return false;
+}
+
+bool
+Transaction::read_from_socket (const Socket &socket, int timeout)
+{
+ if (socket.valid () && valid ()) {
+ unsigned char buf [sizeof (uint32) * 2];
+ uint32 sign1, sign2;
+ uint32 checksum;
+ int size;
+ int nbytes;
+
+ nbytes = socket.read_with_timeout (buf, sizeof (uint32) * 2, timeout);
+ if (((uint32)nbytes) < sizeof (uint32) * 2)
+ return false;
+
+ sign1 = scim_bytestouint32 (buf);
+ sign2 = scim_bytestouint32 (buf + sizeof (uint32));
+
+ if (sign1 != SCIM_TRANS_MAGIC && sign2 != SCIM_TRANS_MAGIC)
+ return false;
+
+ if (sign2 == SCIM_TRANS_MAGIC) {
+ nbytes = socket.read_with_timeout (buf, sizeof (uint32), timeout);
+ if (((uint32)nbytes) < sizeof (uint32))
+ return false;
+ size = scim_bytestouint32 (buf);
+ } else {
+ size = (int) sign2;
+ }
+
+ nbytes = socket.read_with_timeout (buf, sizeof (uint32), timeout);
+ if (((uint32)nbytes) < sizeof (uint32))
+ return false;
+
+ checksum = scim_bytestouint32 (buf);
+
+ if (size <= 0 || size > SCIM_TRANS_MAX_BUFSIZE)
+ return false;
+
+ clear ();
+
+ m_holder->request_buffer_size (size);
+
+ while (size != 0) {
+ nbytes = socket.read_with_timeout (m_holder->m_buffer + m_holder->m_write_pos, size, timeout);
+ if (nbytes <= 0) {
+ m_holder->m_write_pos = SCIM_TRANS_HEADER_SIZE;
+ return false;
+ }
+
+ size -= nbytes;
+ m_holder->m_write_pos += nbytes;
+ }
+
+ if (checksum != m_holder->calc_checksum ()) {
+ m_holder->m_write_pos = SCIM_TRANS_HEADER_SIZE;
+ return false;
+ }
+
+ return true;
+ }
+ return false;
+}
+
+size_t
+Transaction::get_size () const
+{
+ return m_holder->m_write_pos;
+}
+
+bool
+Transaction::write_to_buffer (void *buf, size_t bufsize) const
+{
+ if (valid () && buf && bufsize >= m_holder->m_write_pos) {
+ unsigned char *cbuf = static_cast <unsigned char *> (buf);
+
+ memcpy (buf, m_holder->m_buffer, m_holder->m_write_pos);
+
+ scim_uint32tobytes (cbuf, 0);
+ scim_uint32tobytes (cbuf + sizeof (uint32), SCIM_TRANS_MAGIC);
+ scim_uint32tobytes (cbuf + sizeof (uint32) * 2, m_holder->m_write_pos - SCIM_TRANS_HEADER_SIZE);
+ scim_uint32tobytes (cbuf + sizeof (uint32) * 3, m_holder->calc_checksum ());
+
+ return true;
+ }
+ return false;
+}
+
+bool
+Transaction::read_from_buffer (const void *buf, size_t bufsize)
+{
+ const unsigned char * cbuf = static_cast <const unsigned char *> (buf);
+
+ if (valid () && buf &&
+ scim_bytestouint32 (cbuf) == 0 &&
+ scim_bytestouint32 (cbuf + sizeof (uint32)) == SCIM_TRANS_MAGIC &&
+ scim_bytestouint32 (cbuf + sizeof (uint32) * 2) <= bufsize - SCIM_TRANS_HEADER_SIZE) {
+
+ uint32 size = scim_bytestouint32 (cbuf + sizeof (uint32) * 2) + SCIM_TRANS_HEADER_SIZE;
+ uint32 checksum = scim_bytestouint32 (cbuf + sizeof (uint32) * 3);
+
+ if (m_holder->m_buffer_size < size)
+ m_holder->request_buffer_size (size - m_holder->m_buffer_size);
+
+ memcpy (m_holder->m_buffer, buf, size);
+
+ m_holder->m_write_pos = SCIM_TRANS_HEADER_SIZE;
+
+ if (checksum == m_holder->calc_checksum ())
+ return true;
+ }
+ return false;
+}
+
+void
+Transaction::put_command (int type)
+{
+ m_holder->request_buffer_size (1 + sizeof (uint32));
+
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) SCIM_TRANS_DATA_COMMAND;
+
+ scim_uint32tobytes (m_holder->m_buffer + m_holder->m_write_pos, (uint32) type);
+ m_holder->m_write_pos += sizeof (uint32);
+}
+
+void
+Transaction::put_data (uint32 val)
+{
+ m_holder->request_buffer_size (1 + sizeof (val));
+
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) SCIM_TRANS_DATA_UINT32;
+
+ scim_uint32tobytes (m_holder->m_buffer + m_holder->m_write_pos, val);
+
+ m_holder->m_write_pos += sizeof (uint32);
+}
+
+void
+Transaction::put_data (const String &str)
+{
+ m_holder->request_buffer_size (1 + str.length () + sizeof (uint32));
+
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) SCIM_TRANS_DATA_STRING;
+
+ scim_uint32tobytes (m_holder->m_buffer + m_holder->m_write_pos, str.length ());
+
+ m_holder->m_write_pos += sizeof (uint32);
+
+ if (str.length ())
+ memcpy (m_holder->m_buffer + m_holder->m_write_pos, str.c_str (), str.length ());
+
+ m_holder->m_write_pos += str.length ();
+}
+
+void
+Transaction::put_data (const WideString &str)
+{
+ String mbs = utf8_wcstombs (str);
+
+ m_holder->request_buffer_size (1 + mbs.length () + sizeof (uint32));
+
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) SCIM_TRANS_DATA_WSTRING;
+
+ scim_uint32tobytes (m_holder->m_buffer + m_holder->m_write_pos, mbs.length ());
+
+ m_holder->m_write_pos += sizeof (uint32);
+
+ if (mbs.length ())
+ memcpy (m_holder->m_buffer + m_holder->m_write_pos, mbs.c_str (), mbs.length ());
+
+ m_holder->m_write_pos += mbs.length ();
+}
+
+void
+Transaction::put_data (const KeyEvent &key)
+{
+ m_holder->request_buffer_size (1 + sizeof (uint32) + sizeof (uint16) * 2);
+
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) SCIM_TRANS_DATA_KEYEVENT;
+
+ scim_uint32tobytes (m_holder->m_buffer + m_holder->m_write_pos, key.code);
+
+ m_holder->m_write_pos += sizeof (uint32);
+
+ scim_uint16tobytes (m_holder->m_buffer + m_holder->m_write_pos, key.mask);
+
+ m_holder->m_write_pos += sizeof (uint16);
+
+ scim_uint16tobytes (m_holder->m_buffer + m_holder->m_write_pos, key.layout);
+
+ m_holder->m_write_pos += sizeof (uint16);
+}
+
+void
+Transaction::put_data (const AttributeList &attrs)
+{
+ size_t size = attrs.size () * (sizeof (uint32) * 3 + 1) + sizeof (uint32) + 1;
+
+ m_holder->request_buffer_size (size);
+
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) SCIM_TRANS_DATA_ATTRIBUTE_LIST;
+
+ scim_uint32tobytes (m_holder->m_buffer + m_holder->m_write_pos, attrs.size ());
+
+ m_holder->m_write_pos += sizeof (uint32);
+
+ for (size_t i=0; i<attrs.size (); ++i) {
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) attrs[i].get_type ();
+ scim_uint32tobytes (m_holder->m_buffer + m_holder->m_write_pos, attrs[i].get_value ());
+ m_holder->m_write_pos += sizeof (uint32);
+ scim_uint32tobytes (m_holder->m_buffer + m_holder->m_write_pos, attrs[i].get_start ());
+ m_holder->m_write_pos += sizeof (uint32);
+ scim_uint32tobytes (m_holder->m_buffer + m_holder->m_write_pos, attrs[i].get_length ());
+ m_holder->m_write_pos += sizeof (uint32);
+ }
+}
+
+void
+Transaction::put_data (const Property &property)
+{
+ size_t request = property.get_key ().length () +
+ property.get_label ().length () +
+ property.get_icon ().length () +
+ property.get_tip ().length () +
+ (sizeof (uint32) + 1) * 4 + 3;
+
+ m_holder->request_buffer_size (request);
+
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) SCIM_TRANS_DATA_PROPERTY;
+
+ put_data (property.get_key ());
+ put_data (property.get_label ());
+ put_data (property.get_icon ());
+ put_data (property.get_tip ());
+
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) property.visible ();
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) property.active();
+}
+
+void
+Transaction::put_data (const PropertyList &properties)
+{
+ m_holder->request_buffer_size (1 + sizeof(uint32));
+
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) SCIM_TRANS_DATA_PROPERTY_LIST;
+
+ scim_uint32tobytes (m_holder->m_buffer + m_holder->m_write_pos, properties.size ());
+
+ m_holder->m_write_pos += sizeof (uint32);
+
+ for (PropertyList::const_iterator it = properties.begin (); it != properties.end (); ++ it)
+ put_data (*it);
+}
+
+void
+Transaction::put_data (const LookupTable &table)
+{
+ unsigned char stat = 0;
+ size_t i;
+
+ m_holder->request_buffer_size (4);
+
+ //Can be page up.
+ if (table.get_current_page_start ())
+ stat |= 1;
+
+ //Can be page down.
+ if (((uint32)table.get_current_page_start () + table.get_current_page_size ()) <
+ table.number_of_candidates ())
+ stat |= 2;
+
+ //Cursor is visible.
+ if (table.is_cursor_visible ())
+ stat |= 4;
+
+ //Pagesize is fixed.
+ if (table.is_page_size_fixed ())
+ stat |= 8;
+
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) SCIM_TRANS_DATA_LOOKUP_TABLE;
+ m_holder->m_buffer [m_holder->m_write_pos++] = stat;
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) table.get_current_page_size ();
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) table.get_cursor_pos_in_current_page ();
+
+ // Store page labels.
+ for (i = 0; i < ((uint32)table.get_current_page_size ()); ++i)
+ put_data (table.get_candidate_label (i));
+
+ // Store page candidates, attributes.
+ for (i = 0; i < ((uint32)table.get_current_page_size ()); ++i) {
+ put_data (table.get_candidate_in_current_page (i));
+ put_data (table.get_attributes_in_current_page (i));
+ }
+}
+
+void
+Transaction::put_data (const std::vector<uint32> &vec)
+{
+ size_t size = vec.size () * sizeof (uint32) + sizeof (uint32) + 1;
+
+ m_holder->request_buffer_size (size);
+
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) SCIM_TRANS_DATA_VECTOR_UINT32;
+
+ scim_uint32tobytes (m_holder->m_buffer + m_holder->m_write_pos, vec.size ());
+
+ m_holder->m_write_pos += sizeof (uint32);
+
+ for (size_t i=0; i<vec.size ();i++) {
+ scim_uint32tobytes (m_holder->m_buffer + m_holder->m_write_pos, vec[i]);
+ m_holder->m_write_pos += sizeof (uint32);
+ }
+}
+
+void
+Transaction::put_data (const std::vector<String> &vec)
+{
+ m_holder->request_buffer_size (sizeof(uint32) + 1);
+
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) SCIM_TRANS_DATA_VECTOR_STRING;
+
+ scim_uint32tobytes (m_holder->m_buffer + m_holder->m_write_pos, vec.size ());
+
+ m_holder->m_write_pos += sizeof (uint32);
+
+ for (size_t i=0; i<vec.size ();i++) {
+ put_data (vec[i]);
+ }
+}
+
+void
+Transaction::put_data (const std::vector<WideString> &vec)
+{
+ m_holder->request_buffer_size (sizeof(uint32) + 1);
+
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) SCIM_TRANS_DATA_VECTOR_WSTRING;
+
+ scim_uint32tobytes (m_holder->m_buffer + m_holder->m_write_pos, vec.size ());
+
+ m_holder->m_write_pos += sizeof (uint32);
+
+ for (size_t i=0; i<vec.size ();i++) {
+ put_data (vec[i]);
+ }
+}
+
+void
+Transaction::put_data (const char *raw, size_t bufsize)
+{
+ if (!raw || !bufsize)
+ return;
+
+ m_holder->request_buffer_size (bufsize + sizeof (uint32) + 1);
+
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) SCIM_TRANS_DATA_RAW;
+
+ scim_uint32tobytes (m_holder->m_buffer + m_holder->m_write_pos, (uint32) bufsize);
+
+ m_holder->m_write_pos += sizeof (uint32);
+
+ memcpy (m_holder->m_buffer + m_holder->m_write_pos, raw, bufsize);
+
+ m_holder->m_write_pos += bufsize;
+}
+
+void
+Transaction::put_data (const Transaction &trans)
+{
+ if (!trans.valid ())
+ return;
+
+ m_holder->request_buffer_size (trans.m_holder->m_write_pos + sizeof (uint32) + 1);
+
+ m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) SCIM_TRANS_DATA_TRANSACTION;
+
+ scim_uint32tobytes (m_holder->m_buffer + m_holder->m_write_pos, (uint32) trans.m_holder->m_write_pos);
+
+ m_holder->m_write_pos += sizeof (uint32);
+
+ memcpy (m_holder->m_buffer + m_holder->m_write_pos, trans.m_holder->m_buffer, trans.m_holder->m_write_pos);
+
+ m_holder->m_write_pos += trans.m_holder->m_write_pos;
+}
+
+void
+Transaction::clear ()
+{
+ m_holder->m_write_pos = SCIM_TRANS_HEADER_SIZE;
+ m_reader->rewind ();
+}
+
+TransactionDataType
+Transaction::get_data_type () const
+{
+ return m_reader->get_data_type ();
+}
+
+bool
+Transaction::get_command (int &type)
+{
+ return m_reader->get_command (type);
+}
+
+bool
+Transaction::get_data (uint32 &val)
+{
+ return m_reader->get_data (val);
+}
+
+bool
+Transaction::get_data (String &str)
+{
+ return m_reader->get_data (str);
+}
+
+bool
+Transaction::get_data (WideString &str)
+{
+ return m_reader->get_data (str);
+}
+
+bool
+Transaction::get_data (KeyEvent &key)
+{
+ return m_reader->get_data (key);
+}
+
+bool
+Transaction::get_data (AttributeList &attrs)
+{
+ return m_reader->get_data (attrs);
+}
+
+bool
+Transaction::get_data (Property &property)
+{
+ return m_reader->get_data (property);
+}
+
+bool
+Transaction::get_data (PropertyList &properties)
+{
+ return m_reader->get_data (properties);
+}
+
+bool
+Transaction::get_data (CommonLookupTable &table)
+{
+ return m_reader->get_data (table);
+}
+
+bool
+Transaction::get_data (std::vector<uint32> &vec)
+{
+ return m_reader->get_data (vec);
+}
+
+bool
+Transaction::get_data (std::vector<String> &vec)
+{
+ return m_reader->get_data (vec);
+}
+
+bool
+Transaction::get_data (std::vector<WideString> &vec)
+{
+ return m_reader->get_data (vec);
+}
+
+bool
+Transaction::get_data (char **raw, size_t &bufsize)
+{
+ return m_reader->get_data (raw, bufsize);
+}
+
+bool
+Transaction::get_data (Transaction &trans)
+{
+ return m_reader->get_data (trans);
+}
+
+bool
+Transaction::skip_data ()
+{
+ return m_reader->skip_data ();
+}
+
+void
+Transaction::rewind ()
+{
+ m_reader->rewind ();
+}
+
+void
+Transaction::dump ()
+{
+ m_reader->dump ();
+ m_holder->dump ();
+ return;
+}
+
+// TransactionReader implementation.
+class TransactionReader::TransactionReaderImpl
+{
+public:
+ const TransactionHolder *m_holder;
+ size_t m_read_pos;
+
+public:
+ TransactionReaderImpl (const TransactionHolder *holder = 0)
+ : m_holder (holder),
+ m_read_pos (SCIM_TRANS_HEADER_SIZE) {
+ if (m_holder) m_holder->ref ();
+ }
+
+ ~TransactionReaderImpl () {
+ if (m_holder) m_holder->unref ();
+ }
+
+ bool valid () const {
+ return m_holder && m_holder->valid ();
+ }
+
+ void attach (const TransactionHolder *holder) {
+ if (m_holder) m_holder->unref ();
+ m_holder = holder;
+ if (m_holder) m_holder->ref ();
+ m_read_pos = SCIM_TRANS_HEADER_SIZE;
+ }
+
+ void detach () {
+ if (m_holder) m_holder->unref ();
+ m_holder = 0;
+ m_read_pos = SCIM_TRANS_HEADER_SIZE;
+ }
+
+ void rewind () {
+ m_read_pos = SCIM_TRANS_HEADER_SIZE;
+ }
+
+ void dump () {
+ std::cout << "read position:" << m_read_pos << "\n";
+ }
+};
+
+TransactionReader::TransactionReader ()
+ : m_impl (new TransactionReaderImpl ())
+{
+}
+
+TransactionReader::TransactionReader (const Transaction &trans)
+ : m_impl (new TransactionReaderImpl (trans.m_holder))
+{
+}
+
+TransactionReader::TransactionReader (const TransactionReader &reader)
+ : m_impl (new TransactionReaderImpl (reader.m_impl->m_holder))
+{
+}
+
+const TransactionReader &
+TransactionReader::operator = (const TransactionReader &reader)
+{
+ m_impl->attach (reader.m_impl->m_holder);
+ m_impl->m_read_pos = reader.m_impl->m_read_pos;
+ return *this;
+}
+
+TransactionReader::~TransactionReader ()
+{
+ delete m_impl;
+}
+
+void
+TransactionReader::attach (const Transaction &trans)
+{
+ m_impl->attach (trans.m_holder);
+}
+
+void
+TransactionReader::detach ()
+{
+ m_impl->detach ();
+}
+
+bool
+TransactionReader::valid () const
+{
+ return m_impl->valid ();
+}
+
+TransactionDataType
+TransactionReader::get_data_type () const
+{
+ if (!valid () || m_impl->m_holder->m_write_pos <= m_impl->m_read_pos)
+ return SCIM_TRANS_DATA_UNKNOWN;
+
+ return (TransactionDataType) m_impl->m_holder->m_buffer [m_impl->m_read_pos];
+}
+
+bool
+TransactionReader::get_command (int &type)
+{
+ if (valid () &&
+ m_impl->m_holder->m_write_pos > m_impl->m_read_pos &&
+ m_impl->m_holder->m_buffer [m_impl->m_read_pos] == SCIM_TRANS_DATA_COMMAND) {
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + sizeof (uint32) + 1))
+ return false;
+
+ m_impl->m_read_pos ++;
+
+ type = (int) scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+
+ m_impl->m_read_pos += sizeof (uint32);
+
+ return true;
+ }
+ return false;
+}
+
+bool
+TransactionReader::get_data (uint32 &val)
+{
+ if (valid () &&
+ m_impl->m_holder->m_write_pos > m_impl->m_read_pos &&
+ m_impl->m_holder->m_buffer [m_impl->m_read_pos] == SCIM_TRANS_DATA_UINT32) {
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + sizeof (uint32) + 1))
+ return false;
+
+ m_impl->m_read_pos ++;
+
+ val = scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+
+ m_impl->m_read_pos += sizeof (uint32);
+
+ return true;
+ }
+ return false;
+}
+
+bool
+TransactionReader::get_data (String &str)
+{
+ if (valid () &&
+ m_impl->m_holder->m_write_pos > m_impl->m_read_pos &&
+ m_impl->m_holder->m_buffer [m_impl->m_read_pos] == SCIM_TRANS_DATA_STRING) {
+
+ size_t len;
+ size_t old_read_pos = m_impl->m_read_pos;
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + sizeof (uint32) + 1))
+ return false;
+
+ m_impl->m_read_pos ++;
+
+ len = scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+ m_impl->m_read_pos += sizeof (uint32);
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + len)) {
+ m_impl->m_read_pos = old_read_pos;
+ return false;
+ }
+
+ if (len)
+ str = String (m_impl->m_holder->m_buffer + m_impl->m_read_pos, m_impl->m_holder->m_buffer + m_impl->m_read_pos + len);
+ else
+ str = String ("");
+
+ m_impl->m_read_pos += len;
+
+ return true;
+ }
+ return false;
+}
+
+bool
+TransactionReader::get_data (WideString &str)
+{
+ if (valid () &&
+ m_impl->m_holder->m_write_pos > m_impl->m_read_pos &&
+ m_impl->m_holder->m_buffer [m_impl->m_read_pos] == SCIM_TRANS_DATA_WSTRING) {
+
+ String mbs;
+ size_t len;
+ size_t old_read_pos = m_impl->m_read_pos;
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + sizeof (uint32) + 1))
+ return false;
+
+ m_impl->m_read_pos ++;
+
+ len = scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+ m_impl->m_read_pos += sizeof (uint32);
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + len)) {
+ m_impl->m_read_pos = old_read_pos;
+ return false;
+ }
+
+ if (len)
+ mbs = String (m_impl->m_holder->m_buffer + m_impl->m_read_pos, m_impl->m_holder->m_buffer + m_impl->m_read_pos + len);
+ else
+ mbs = String ("");
+
+ m_impl->m_read_pos += len;
+
+ str = utf8_mbstowcs (mbs);
+ return true;
+ }
+ return false;
+}
+
+bool
+TransactionReader::get_data (KeyEvent &key)
+{
+ if (valid () &&
+ m_impl->m_holder->m_write_pos > m_impl->m_read_pos &&
+ m_impl->m_holder->m_buffer [m_impl->m_read_pos] == SCIM_TRANS_DATA_KEYEVENT) {
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + sizeof (uint32) * 2 + 1))
+ return false;
+
+ m_impl->m_read_pos ++;
+
+ key.code = scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+ m_impl->m_read_pos += sizeof (uint32);
+
+ key.mask = scim_bytestouint16 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+ m_impl->m_read_pos += sizeof (uint16);
+
+ key.layout = scim_bytestouint16 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+ m_impl->m_read_pos += sizeof (uint16);
+
+ return true;
+ }
+ return false;
+}
+
+bool
+TransactionReader::get_data (AttributeList &attrs)
+{
+ if (valid () &&
+ m_impl->m_holder->m_write_pos > m_impl->m_read_pos &&
+ m_impl->m_holder->m_buffer [m_impl->m_read_pos] == SCIM_TRANS_DATA_ATTRIBUTE_LIST) {
+
+ AttributeType type;
+ size_t num;
+ uint32 value;
+ uint32 start;
+ uint32 length;
+
+ attrs.clear ();
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + sizeof (uint32) + 1))
+ return false;
+
+ m_impl->m_read_pos ++;
+
+ num = scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+ m_impl->m_read_pos += sizeof (uint32);
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + (sizeof (uint32) * 3 + 1) * num)) {
+ m_impl->m_read_pos -= (sizeof (uint32) + 1);
+ return false;
+ }
+
+ for (size_t i=0; i<num; i++) {
+ type = (AttributeType) m_impl->m_holder->m_buffer [m_impl->m_read_pos];
+ m_impl->m_read_pos ++;
+ value = scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+ m_impl->m_read_pos += sizeof (uint32);
+ start = scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+ m_impl->m_read_pos += sizeof (uint32);
+ length = scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+ m_impl->m_read_pos += sizeof (uint32);
+
+ attrs.push_back (Attribute (start, length, type, value));
+ }
+ return true;
+ }
+ return false;
+}
+
+bool
+TransactionReader::get_data (Property &property)
+{
+ if (valid () &&
+ m_impl->m_holder->m_write_pos > m_impl->m_read_pos &&
+ m_impl->m_holder->m_buffer [m_impl->m_read_pos] == SCIM_TRANS_DATA_PROPERTY) {
+
+ size_t old_read_pos = m_impl->m_read_pos;
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + sizeof (uint32) * 4 + 3))
+ return false;
+
+ m_impl->m_read_pos ++;
+
+ String str;
+
+ if (! get_data (str)) {
+ m_impl->m_read_pos = old_read_pos;
+ return false;
+ }
+ property.set_key (str);
+
+ if (! get_data (str)) {
+ m_impl->m_read_pos = old_read_pos;
+ return false;
+ }
+ property.set_label (str);
+
+ if (! get_data (str)) {
+ m_impl->m_read_pos = old_read_pos;
+ return false;
+ }
+ property.set_icon (str);
+
+ if (! get_data (str)) {
+ m_impl->m_read_pos = old_read_pos;
+ return false;
+ }
+ property.set_tip (str);
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + 2)) {
+ m_impl->m_read_pos = old_read_pos;
+ return false;
+ }
+
+ property.show ((bool) m_impl->m_holder->m_buffer [m_impl->m_read_pos]);
+ m_impl->m_read_pos ++;
+
+ property.set_active ((bool) m_impl->m_holder->m_buffer [m_impl->m_read_pos]);
+ m_impl->m_read_pos ++;
+
+ return true;
+ }
+ return false;
+}
+
+bool
+TransactionReader::get_data (PropertyList &properties)
+{
+ if (valid () &&
+ m_impl->m_holder->m_write_pos > m_impl->m_read_pos &&
+ m_impl->m_holder->m_buffer [m_impl->m_read_pos] == SCIM_TRANS_DATA_PROPERTY_LIST) {
+
+ size_t old_read_pos = m_impl->m_read_pos;
+ size_t num;
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + sizeof (uint32) + 1))
+ return false;
+
+ m_impl->m_read_pos ++;
+
+ num = scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+ m_impl->m_read_pos += sizeof (uint32);
+
+ properties.clear ();
+ Property prop;
+
+ for (size_t i = 0; i < num; ++ i) {
+ if (!get_data (prop)) {
+ m_impl->m_read_pos = old_read_pos;
+ return false;
+ }
+ properties.push_back (prop);
+ }
+
+ return true;
+ }
+ return false;
+}
+
+bool
+TransactionReader::get_data (CommonLookupTable &table)
+{
+ if (valid () &&
+ m_impl->m_holder->m_write_pos > m_impl->m_read_pos &&
+ m_impl->m_holder->m_buffer [m_impl->m_read_pos] == SCIM_TRANS_DATA_LOOKUP_TABLE) {
+
+ size_t i;
+
+ size_t old_read_pos = m_impl->m_read_pos;
+
+ unsigned char stat;
+ uint32 page_size;
+ uint32 cursor_pos;
+
+ WideString wstr;
+ AttributeList attrs;
+
+ std::vector<WideString> labels;
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + 4))
+ return false;
+
+ table.clear ();
+
+ m_impl->m_read_pos ++;
+
+ stat = m_impl->m_holder->m_buffer [m_impl->m_read_pos];
+ m_impl->m_read_pos ++;
+
+ page_size = (uint32) m_impl->m_holder->m_buffer [m_impl->m_read_pos];
+ m_impl->m_read_pos ++;
+
+ cursor_pos = (uint32) m_impl->m_holder->m_buffer [m_impl->m_read_pos];
+ m_impl->m_read_pos ++;
+
+ if (page_size > SCIM_LOOKUP_TABLE_MAX_PAGESIZE ||
+ (cursor_pos >= page_size && page_size > 0)) {
+ m_impl->m_read_pos = old_read_pos;
+ return false;
+ }
+
+ table.set_page_size (page_size);
+
+ for (i = 0; i < page_size; ++i) {
+ if (!get_data (wstr)) {
+ m_impl->m_read_pos = old_read_pos;
+ return false;
+ }
+ labels.push_back (wstr);
+ }
+
+ table.set_candidate_labels (labels);
+
+ //Can be paged up.
+ if (stat & 1)
+ table.append_candidate (0x3400);
+
+ for (i = 0; i < page_size; ++i) {
+ if (get_data (wstr) && get_data (attrs)) {
+ table.append_candidate (wstr, attrs);
+ } else {
+ m_impl->m_read_pos = old_read_pos;
+ return false;
+ }
+ }
+
+ // Can be paged down.
+ if (stat & 2)
+ table.append_candidate (0x3400);
+
+ if (stat & 1) {
+ table.set_page_size (1);
+ table.page_down ();
+ table.set_page_size (page_size);
+ }
+
+ table.set_cursor_pos_in_current_page (cursor_pos);
+
+ if (stat & 4)
+ table.show_cursor (true);
+ else
+ table.show_cursor (false);
+
+ if (stat & 8)
+ table.fix_page_size (true);
+ else
+ table.fix_page_size (false);
+
+ return true;
+ }
+ return false;
+}
+
+bool
+TransactionReader::get_data (std::vector<uint32> &vec)
+{
+ if (valid () &&
+ m_impl->m_holder->m_write_pos > m_impl->m_read_pos &&
+ m_impl->m_holder->m_buffer [m_impl->m_read_pos] == SCIM_TRANS_DATA_VECTOR_UINT32) {
+
+ size_t old_read_pos = m_impl->m_read_pos;
+ size_t num;
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + sizeof (uint32) + 1))
+ return false;
+
+ m_impl->m_read_pos ++;
+
+ num = scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+ m_impl->m_read_pos += sizeof (uint32);
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + sizeof (uint32) * num)) {
+ m_impl->m_read_pos = old_read_pos;
+ return false;
+ }
+
+ vec.clear ();
+
+ for (size_t i=0; i<num; i++) {
+ vec.push_back (scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos));
+ m_impl->m_read_pos += sizeof (uint32);
+ }
+
+ return true;
+ }
+ return false;
+}
+
+bool
+TransactionReader::get_data (std::vector<String> &vec)
+{
+ if (valid () &&
+ m_impl->m_holder->m_write_pos > m_impl->m_read_pos &&
+ m_impl->m_holder->m_buffer [m_impl->m_read_pos] == SCIM_TRANS_DATA_VECTOR_STRING) {
+
+ size_t old_read_pos = m_impl->m_read_pos;
+ size_t num;
+ String str;
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + sizeof (uint32) + 1))
+ return false;
+
+ m_impl->m_read_pos ++;
+
+ num = scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+ m_impl->m_read_pos += sizeof (uint32);
+
+ vec.clear ();
+
+ for (size_t i=0; i<num; i++) {
+ if (!get_data (str)) {
+ m_impl->m_read_pos = old_read_pos;
+ return false;
+ }
+ vec.push_back (str);
+ }
+
+ return true;
+ }
+ return false;
+}
+
+bool
+TransactionReader::get_data (std::vector<WideString> &vec)
+{
+ if (valid () &&
+ m_impl->m_holder->m_write_pos > m_impl->m_read_pos &&
+ m_impl->m_holder->m_buffer [m_impl->m_read_pos] == SCIM_TRANS_DATA_VECTOR_WSTRING) {
+
+ size_t old_read_pos = m_impl->m_read_pos;
+ size_t num;
+ WideString str;
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + sizeof (uint32) + 1))
+ return false;
+
+ m_impl->m_read_pos ++;
+
+ num = scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+ m_impl->m_read_pos += sizeof (uint32);
+
+ vec.clear ();
+
+ for (size_t i=0; i<num; i++) {
+ if (!get_data (str)) {
+ m_impl->m_read_pos = old_read_pos;
+ return false;
+ }
+ vec.push_back (str);
+ }
+
+ return true;
+ }
+ return false;
+}
+
+bool
+TransactionReader::get_data (char **raw, size_t &bufsize)
+{
+ if (valid () &&
+ m_impl->m_holder->m_write_pos > m_impl->m_read_pos &&
+ m_impl->m_holder->m_buffer [m_impl->m_read_pos] == SCIM_TRANS_DATA_RAW) {
+
+ size_t old_read_pos = m_impl->m_read_pos;
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + sizeof (uint32) + 1))
+ return false;
+
+ m_impl->m_read_pos ++;
+
+ bufsize = scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+ m_impl->m_read_pos += sizeof (uint32);
+
+ if (!bufsize || m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + bufsize)) {
+ m_impl->m_read_pos = old_read_pos;
+ return false;
+ }
+
+ if (raw) {
+ *raw = new char [bufsize];
+ if (! (*raw)) {
+ m_impl->m_read_pos = old_read_pos;
+ return false;
+ }
+
+ memcpy (*raw, m_impl->m_holder->m_buffer + m_impl->m_read_pos, bufsize);
+ }
+
+ m_impl->m_read_pos += bufsize;
+ return true;
+ }
+ return false;
+}
+
+bool
+TransactionReader::get_data (Transaction &trans)
+{
+ if (valid () && trans.valid () &&
+ m_impl->m_holder->m_write_pos > m_impl->m_read_pos &&
+ m_impl->m_holder->m_buffer [m_impl->m_read_pos] == SCIM_TRANS_DATA_TRANSACTION) {
+
+ size_t len;
+ size_t old_read_pos = m_impl->m_read_pos;
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + sizeof (uint32) + 1))
+ return false;
+
+ m_impl->m_read_pos ++;
+
+ len = scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+ m_impl->m_read_pos += sizeof (uint32);
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + len)) {
+ m_impl->m_read_pos = old_read_pos;
+ return false;
+ }
+
+ trans.m_holder->request_buffer_size (len);
+
+ memcpy (trans.m_holder->m_buffer, m_impl->m_holder->m_buffer + m_impl->m_read_pos, len);
+
+ trans.m_holder->m_write_pos = len;
+ trans.m_reader->rewind ();
+
+ m_impl->m_read_pos += len;
+
+ return true;
+ }
+ return false;
+}
+
+bool
+TransactionReader::skip_data ()
+{
+ if (valid () && m_impl->m_holder->m_write_pos > m_impl->m_read_pos) {
+ switch (m_impl->m_holder->m_buffer [m_impl->m_read_pos]) {
+ case SCIM_TRANS_DATA_COMMAND:
+ {
+ int cmd;
+ return get_command (cmd);
+ }
+ case SCIM_TRANS_DATA_UINT32:
+ {
+ uint32 val;
+ return get_data (val);
+ }
+ case SCIM_TRANS_DATA_STRING:
+ {
+ String str;
+ return get_data (str);
+ }
+ case SCIM_TRANS_DATA_WSTRING:
+ {
+ WideString wstr;
+ return get_data (wstr);
+ }
+ case SCIM_TRANS_DATA_KEYEVENT:
+ {
+ KeyEvent key;
+ return get_data (key);
+ }
+ case SCIM_TRANS_DATA_ATTRIBUTE_LIST:
+ {
+ AttributeList attrs;
+ return get_data (attrs);
+ }
+ case SCIM_TRANS_DATA_PROPERTY:
+ {
+ Property prop;
+ return get_data (prop);
+ }
+ case SCIM_TRANS_DATA_PROPERTY_LIST:
+ {
+ PropertyList proplist;
+ return get_data (proplist);
+ }
+ case SCIM_TRANS_DATA_LOOKUP_TABLE:
+ {
+ CommonLookupTable table;
+ return get_data (table);
+ }
+ case SCIM_TRANS_DATA_VECTOR_UINT32:
+ {
+ std::vector <uint32> vec;
+ return get_data (vec);
+ }
+ case SCIM_TRANS_DATA_VECTOR_STRING:
+ {
+ std::vector <String> vec;
+ return get_data (vec);
+ }
+ case SCIM_TRANS_DATA_VECTOR_WSTRING:
+ {
+ std::vector <WideString> vec;
+ return get_data (vec);
+ }
+ case SCIM_TRANS_DATA_RAW:
+ {
+ size_t bufsize;
+ return get_data (NULL, bufsize);
+ }
+ case SCIM_TRANS_DATA_TRANSACTION:
+ {
+ size_t len;
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + sizeof (uint32) + 1))
+ return false;
+
+ len = scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos + 1);
+
+ if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + len + sizeof (uint32) + 1))
+ return false;
+
+ m_impl->m_read_pos += (len + sizeof (uint32) + 1);
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+void
+TransactionReader::rewind ()
+{
+ m_impl->rewind ();
+}
+
+void
+TransactionReader::dump ()
+{
+ m_impl->dump ();
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/**
+ * @file scim_transaction.h
+ * @brief Transaction class.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_transaction.h,v 1.10 2005/05/24 12:22:51 suzhe Exp $
+ */
+
+#ifndef __SCIM_TRANSACTION_H
+#define __SCIM_TRANSACTION_H
+
+namespace scim {
+
+/**
+ * @addtogroup SocketCommunication
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+/**
+ * @brief Signature of all valid data types which can be store into transaction.
+ */
+enum TransactionDataType
+{
+ SCIM_TRANS_DATA_UNKNOWN, //!< Unknown transaction data type.
+ SCIM_TRANS_DATA_COMMAND, //!< Send/Receive command.
+ SCIM_TRANS_DATA_RAW, //!< Send/Receive raw buffer.
+ SCIM_TRANS_DATA_UINT32, //!< Send/Receive uint32.
+ SCIM_TRANS_DATA_STRING, //!< Send/Receive String.
+ SCIM_TRANS_DATA_WSTRING, //!< Send/Receive WideString.
+ SCIM_TRANS_DATA_KEYEVENT, //!< Send/Receive KeyEvent.
+ SCIM_TRANS_DATA_ATTRIBUTE_LIST, //!< Send/Receive AttributeList.
+ SCIM_TRANS_DATA_LOOKUP_TABLE, //!< Send/Receive LookupTable.
+ SCIM_TRANS_DATA_PROPERTY, //!< Send/Receive Property.
+ SCIM_TRANS_DATA_PROPERTY_LIST, //!< Send/Receive PropertyList.
+ SCIM_TRANS_DATA_VECTOR_UINT32, //!< Send/Receive vector<uint32>.
+ SCIM_TRANS_DATA_VECTOR_STRING, //!< Send/Receive vector<String>.
+ SCIM_TRANS_DATA_VECTOR_WSTRING, //!< Send/Receive vector<WideString>.
+ SCIM_TRANS_DATA_TRANSACTION //!< Send/Receive another Transaction.
+};
+
+/**
+ * @brief An exception class to hold Transaction related errors.
+ *
+ * scim::Transaction and its related classes must throw
+ * scim::TransactionError object when error.
+ */
+class TransactionError: public Exception
+{
+public:
+ TransactionError (const String& what_arg)
+ : Exception (String("scim::Transaction: ") + what_arg) { }
+};
+
+class TransactionHolder;
+class TransactionReader;
+
+/**
+ * @brief This class is used to pack up many data and commands into one package
+ * and send them via socket.
+ */
+class Transaction
+{
+ friend class TransactionReader;
+
+ TransactionHolder * m_holder;
+ TransactionReader * m_reader;
+
+ Transaction (const Transaction &);
+ const Transaction & operator = (const Transaction &);
+public:
+ /**
+ * @brief Constructor.
+ *
+ * @param bufsize the initial buffer size, maybe grow afterwards.
+ */
+ Transaction (size_t bufsize = 512);
+
+ /**
+ * @brief Destructor.
+ */
+ ~Transaction ();
+
+ /**
+ * @brief Check if the transaction is valid.
+ *
+ * @return true if this Transaction object is valid and ready to use.
+ */
+ bool valid () const;
+
+ /**
+ * @brief Get the size of this transaction.
+ */
+ size_t get_size () const;
+
+ /**
+ * @brief Write the transaction to a socket.
+ *
+ * @param socket the socket to be written to.
+ * @param signature the leading signature to be written
+ * into the socket before the transaction itself,
+ * this signature maybe missing when receive the transaction.
+ * It's useful to check the connection before receiving
+ * a transaction by reading this signature.
+ *
+ * @return true if success.
+ */
+ bool write_to_socket (const Socket &socket, uint32 signature = 0) const;
+
+ /**
+ * @brief Read a transaction from a socket.
+ *
+ * @param socket the socket to be read from.
+ * @param timeout time out in millisecond (1/1000 second), -1 means infinity.
+ *
+ * @return true if success.
+ */
+ bool read_from_socket (const Socket &socket, int timeout = 3000);
+
+ /**
+ * @brief Write the transaction into a buffer.
+ *
+ * @param buf A buffer to store the transaction data.
+ * @param bufsize The size of this buffer.
+ * @return true if success (the buf is large enough).
+ */
+ bool write_to_buffer (void *buf, size_t bufsize) const;
+
+ /**
+ * @brief Read a transaction from a buffer.
+ *
+ * @param buf A buffer contains the transaction.
+ * @param bufsize The size of this buffer.
+ * @return true if success.
+ */
+ bool read_from_buffer (const void *buf, size_t bufsize);
+
+ /**
+ * @brief Store a command into this transaction.
+ *
+ * @param cmd the command code, like SCIM_TRANS_CMD_FOCUS_IN etc.
+ */
+ void put_command (int cmd);
+
+ /**
+ * @brief Store a uint32 value into this transaction.
+ */
+ void put_data (uint32 val);
+
+ /**
+ * @brief Store a String object into this transaction.
+ */
+ void put_data (const String &str);
+
+ /**
+ * @brief Store a WideString object into this transaction.
+ */
+ void put_data (const WideString &str);
+
+ /**
+ * @brief Store a KeyEvent object into this transaction.
+ */
+ void put_data (const KeyEvent &key);
+
+ /**
+ * @brief Store an AttributeList object into this transaction.
+ */
+ void put_data (const AttributeList &attrs);
+
+ /**
+ * @brief Store a Property object into this transaction.
+ */
+ void put_data (const Property &property);
+
+ /**
+ * @brief Store a PropertyList object into this transaction.
+ */
+ void put_data (const PropertyList &properties);
+
+ /**
+ * @brief Store a LookupTable object into this transaction.
+ */
+ void put_data (const LookupTable &table);
+
+ /**
+ * @brief Store a std::vector<uint32> object into this transaction.
+ */
+ void put_data (const std::vector<uint32> &vec);
+
+ /**
+ * @brief Store a std::vector<String> object into this transaction.
+ */
+ void put_data (const std::vector<String> &vec);
+
+ /**
+ * @brief Store a std::vector<WideString> object into this transaction.
+ */
+ void put_data (const std::vector<WideString> &vec);
+
+ /**
+ * @brief Store a raw buffer into this transaction.
+ */
+ void put_data (const char *raw, size_t bufsize);
+
+ /**
+ * @brief Store another Transaction object into this transaction.
+ */
+ void put_data (const Transaction &trans);
+
+ /**
+ * @brief Get the type of the data at current read position.
+ *
+ * @return The type of the data can be read currently.
+ */
+ TransactionDataType get_data_type () const;
+
+ /**
+ * @brief Get a command from current read position.
+ */
+ bool get_command (int &cmd);
+
+ /**
+ * @brief Get an uint32 value from current read position.
+ */
+ bool get_data (uint32 &val);
+
+ /**
+ * @brief Get a String from current read position.
+ */
+ bool get_data (String &str);
+
+ /**
+ * @brief Get a WideString from current read position.
+ */
+ bool get_data (WideString &str);
+
+ /**
+ * @brief Get a KeyEvent from current read position.
+ */
+ bool get_data (KeyEvent &key);
+
+ /**
+ * @brief Get an AttributeList from current read position.
+ */
+ bool get_data (AttributeList &attrs);
+
+ /**
+ * @brief Get a Property from current read position.
+ */
+ bool get_data (Property &property);
+
+ /**
+ * @brief Get a PropertyList from current read position.
+ */
+ bool get_data (PropertyList &properties);
+
+ /**
+ * @brief Get a CommonLookupTable from current read position.
+ */
+ bool get_data (CommonLookupTable &table);
+
+ /**
+ * @brief Get a std::vector<uint32> from current read position.
+ */
+ bool get_data (std::vector<uint32> &vec);
+
+ /**
+ * @brief Get a std::vector<String> from current read position.
+ */
+ bool get_data (std::vector<String> &vec);
+
+ /**
+ * @brief Get a std::vector<WideString> from current read position.
+ */
+ bool get_data (std::vector<WideString> &vec);
+
+ /**
+ * @brief Get a raw buffer from current read position.
+ *
+ * if raw == NULL then return the bufsize and skip this data.
+ * *raw should be deleted afterwards (do not use free!).
+ */
+ bool get_data (char **raw, size_t &bufsize);
+
+ /**
+ * @brief Get a Transaction object from current read position.
+ */
+ bool get_data (Transaction &trans);
+
+ /**
+ * @brief Skip one data from current read position.
+ */
+ bool skip_data ();
+
+ /**
+ * @brief Rewind the current read position, then the data can be read again.
+ */
+ void rewind ();
+
+ /**
+ * @brief Clear the transaction, all data in this transaction will be freed.
+ */
+ void clear ();
+
+ /**
+ * @brief Dump the buffer content of the transaction, the read and write position.
+ */
+ void dump ();
+};
+
+/**
+ * @brief This class is used to read data from a transaction without changing it.
+ */
+class TransactionReader
+{
+ class TransactionReaderImpl;
+
+ TransactionReaderImpl *m_impl;
+
+public:
+ /**
+ * @brief Default constructor.
+ *
+ * Construct an empty TransactionReader object.
+ */
+ TransactionReader ();
+
+ /**
+ * @brief Constructor.
+ *
+ * Construct a TransactionReader object and attach to a Transaction object.
+ *
+ * @param trans The Transaction to be read.
+ */
+ TransactionReader (const Transaction &trans);
+
+ /**
+ * @brief Destructor.
+ */
+ ~TransactionReader ();
+
+ /**
+ * @brief Copy constructor.
+ */
+ TransactionReader (const TransactionReader &);
+
+ /**
+ * @brief Copy operator.
+ */
+ const TransactionReader & operator = (const TransactionReader &);
+
+ /**
+ * @brief Attach this TransactionReader object to a Transaction.
+ *
+ * An empty TransactionReader object must be attached to a
+ * Transaction object before reading.
+ *
+ * @param trans The Transaction object to be read.
+ */
+ void attach (const Transaction &trans);
+
+ /**
+ * @brief Detach this TransactionReader object from
+ * currently attached Transaction object.
+ */
+ void detach ();
+
+ /**
+ * @brief Check if the transaction reader is valid.
+ *
+ * @return true if this TransactionReader object
+ * is attached to a Transaction object and ready to be read.
+ */
+ bool valid () const;
+
+ /**
+ * @brief Get the type of the data at current read position.
+ *
+ * @return The type of the data can be read currently.
+ */
+ TransactionDataType get_data_type () const;
+
+ /**
+ * @brief Get a command from current read position.
+ */
+ bool get_command (int &cmd);
+
+ /**
+ * @brief Get an uint32 value from current read position.
+ */
+ bool get_data (uint32 &val);
+
+ /**
+ * @brief Get a String from current read position.
+ */
+ bool get_data (String &str);
+
+ /**
+ * @brief Get a WideString from current read position.
+ */
+ bool get_data (WideString &str);
+
+ /**
+ * @brief Get a KeyEvent from current read position.
+ */
+ bool get_data (KeyEvent &key);
+
+ /**
+ * @brief Get an AttributeList from current read position.
+ */
+ bool get_data (AttributeList &attrs);
+
+ /**
+ * @brief Get a Property from current read position.
+ */
+ bool get_data (Property &property);
+
+ /**
+ * @brief Get a PropertyList from current read position.
+ */
+ bool get_data (PropertyList &properties);
+
+ /**
+ * @brief Get a CommonLookupTable from current read position.
+ */
+ bool get_data (CommonLookupTable &table);
+
+ /**
+ * @brief Get a std::vector<uint32> from current read position.
+ */
+ bool get_data (std::vector<uint32> &vec);
+
+ /**
+ * @brief Get a std::vector<String> from current read position.
+ */
+ bool get_data (std::vector<String> &vec);
+
+ /**
+ * @brief Get a std::vector<WideString> from current read position.
+ */
+ bool get_data (std::vector<WideString> &vec);
+
+ /**
+ * @brief Get a raw buffer from current read position.
+ *
+ * if raw == NULL then return the bufsize and skip this data.
+ * *raw should be deleted afterwards (do not use free!).
+ */
+ bool get_data (char **raw, size_t &bufsize);
+
+ /**
+ * @brief Get a Transaction object from current read position.
+ */
+ bool get_data (Transaction &trans);
+
+ /**
+ * @brief Skip one data from current read position.
+ */
+ bool skip_data ();
+
+ /**
+ * @brief Rewind the current read position, then the data can be read again.
+ */
+ void rewind ();
+
+ /**
+ * @brief Print the read pos.
+ */
+ void dump ();
+};
+
+/** @} */
+
+} // namespace scim
+
+#endif //__SCIM_TRANSACTION_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
+
--- /dev/null
+/** @file scim_types.h
+ * @brief defines some basic data types.
+ */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2004 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_types.h.in,v 1.2.4.1 2007/04/10 09:18:27 suzhe Exp $
+ */
+
+
+#ifndef __SCIM_TYPES_H
+#define __SCIM_TYPES_H
+
+@INCLUDE_STDINT@
+
+#ifdef __FreeBSD__
+# include <osreldate.h>
+# if __FreeBSD_version > 500035
+# define __STDC_ISO_10646__
+# endif
+#endif
+
+namespace scim {
+
+typedef @UINT16@ uint16;
+typedef @UINT32@ uint32;
+typedef @UINT64@ uint64;
+
+#ifdef __STDC_ISO_10646__
+ typedef wchar_t ucs4_t;
+#else
+ typedef uint32 ucs4_t;
+#endif
+
+typedef std::basic_string<char> String;
+typedef std::basic_string<ucs4_t> WideString;
+
+} // namespace scim
+
+#endif //__SCIM_TYPES_H
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_utility.cpp,v 1.48.2.5 2006/11/02 04:11:51 suzhe Exp $
+ */
+
+#define Uses_SCIM_UTILITY
+#define Uses_SCIM_CONFIG_PATH
+#define Uses_C_LOCALE
+#define Uses_C_ICONV
+#define Uses_C_STDLIB
+#define Uses_C_STRING
+
+#include <langinfo.h>
+#include <pwd.h>
+#include <dirent.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <time.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/times.h>
+
+#include "scim_private.h"
+#include "scim.h"
+
+namespace scim {
+
+int
+utf8_mbtowc (ucs4_t *pwc, const unsigned char *src, int src_len)
+{
+ if (!pwc)
+ return 0;
+
+ unsigned char c = src [0];
+
+ if (c < 0x80) {
+ *pwc = c;
+ return 1;
+ } else if (c < 0xc2) {
+ return RET_ILSEQ;
+ } else if (c < 0xe0) {
+ if (src_len < 2)
+ return RET_TOOFEW(0);
+ if (!((src [1] ^ 0x80) < 0x40))
+ return RET_ILSEQ;
+ *pwc = ((ucs4_t) (c & 0x1f) << 6)
+ | (ucs4_t) (src [1] ^ 0x80);
+ return 2;
+ } else if (c < 0xf0) {
+ if (src_len < 3)
+ return RET_TOOFEW(0);
+ if (!((src [1] ^ 0x80) < 0x40 && (src [2] ^ 0x80) < 0x40
+ && (c >= 0xe1 || src [1] >= 0xa0)))
+ return RET_ILSEQ;
+ *pwc = ((ucs4_t) (c & 0x0f) << 12)
+ | ((ucs4_t) (src [1] ^ 0x80) << 6)
+ | (ucs4_t) (src [2] ^ 0x80);
+ return 3;
+ } else if (c < 0xf8) {
+ if (src_len < 4)
+ return RET_TOOFEW(0);
+ if (!((src [1] ^ 0x80) < 0x40 && (src [2] ^ 0x80) < 0x40
+ && (src [3] ^ 0x80) < 0x40
+ && (c >= 0xf1 || src [1] >= 0x90)))
+ return RET_ILSEQ;
+ *pwc = ((ucs4_t) (c & 0x07) << 18)
+ | ((ucs4_t) (src [1] ^ 0x80) << 12)
+ | ((ucs4_t) (src [2] ^ 0x80) << 6)
+ | (ucs4_t) (src [3] ^ 0x80);
+ return 4;
+ } else if (c < 0xfc) {
+ if (src_len < 5)
+ return RET_TOOFEW(0);
+ if (!((src [1] ^ 0x80) < 0x40 && (src [2] ^ 0x80) < 0x40
+ && (src [3] ^ 0x80) < 0x40 && (src [4] ^ 0x80) < 0x40
+ && (c >= 0xf9 || src [1] >= 0x88)))
+ return RET_ILSEQ;
+ *pwc = ((ucs4_t) (c & 0x03) << 24)
+ | ((ucs4_t) (src [1] ^ 0x80) << 18)
+ | ((ucs4_t) (src [2] ^ 0x80) << 12)
+ | ((ucs4_t) (src [3] ^ 0x80) << 6)
+ | (ucs4_t) (src [4] ^ 0x80);
+ return 5;
+ } else if (c < 0xfe) {
+ if (src_len < 6)
+ return RET_TOOFEW(0);
+ if (!((src [1] ^ 0x80) < 0x40 && (src [2] ^ 0x80) < 0x40
+ && (src [3] ^ 0x80) < 0x40 && (src [4] ^ 0x80) < 0x40
+ && (src [5] ^ 0x80) < 0x40
+ && (c >= 0xfd || src [1] >= 0x84)))
+ return RET_ILSEQ;
+ *pwc = ((ucs4_t) (c & 0x01) << 30)
+ | ((ucs4_t) (src [1] ^ 0x80) << 24)
+ | ((ucs4_t) (src [2] ^ 0x80) << 18)
+ | ((ucs4_t) (src [3] ^ 0x80) << 12)
+ | ((ucs4_t) (src [4] ^ 0x80) << 6)
+ | (ucs4_t) (src [5] ^ 0x80);
+ return 6;
+ } else
+ return RET_ILSEQ;
+}
+
+int
+utf8_wctomb (unsigned char *dest, ucs4_t wc, int dest_size)
+{
+ if (!dest)
+ return 0;
+
+ int count;
+ if (wc < 0x80)
+ count = 1;
+ else if (wc < 0x800)
+ count = 2;
+ else if (wc < 0x10000)
+ count = 3;
+ else if (wc < 0x200000)
+ count = 4;
+ else if (wc < 0x4000000)
+ count = 5;
+ else if (wc <= 0x7fffffff)
+ count = 6;
+ else
+ return RET_ILSEQ;
+ if (dest_size < count)
+ return RET_TOOSMALL;
+ switch (count) { /* note: code falls through cases! */
+ case 6: dest [5] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x4000000;
+ case 5: dest [4] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x200000;
+ case 4: dest [3] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x10000;
+ case 3: dest [2] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x800;
+ case 2: dest [1] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0xc0;
+ case 1: dest [0] = wc;
+ }
+ return count;
+}
+
+ucs4_t
+utf8_read_wchar (std::istream &is)
+{
+ unsigned char utf8[6];
+ ucs4_t wc;
+ int count;
+
+ memset (utf8, 0, sizeof(unsigned char) * 6);
+ for (int i=0; i<6; ++i) {
+ is.read ((char*)(utf8+i), sizeof(unsigned char));
+ if ((count=utf8_mbtowc (&wc, utf8, i+1)) > 0)
+ return wc;
+ if (count == RET_ILSEQ)
+ return 0;
+ }
+ return 0;
+}
+
+WideString
+utf8_read_wstring (std::istream &is, ucs4_t delim, bool rm_delim)
+{
+ WideString str;
+ ucs4_t wc;
+ while ((wc = utf8_read_wchar (is)) > 0) {
+ if (wc != delim)
+ str.push_back (wc);
+ else {
+ if (!rm_delim)
+ str.push_back (wc);
+ break;
+ }
+ }
+ return str;
+}
+
+std::ostream &
+utf8_write_wchar (std::ostream &os, ucs4_t wc)
+{
+ unsigned char utf8[6];
+ int count = 0;
+
+ if ((count=utf8_wctomb (utf8, wc, 6)) > 0)
+ os.write ((char*)utf8, count * sizeof (unsigned char));
+
+ return os;
+}
+
+std::ostream &
+utf8_write_wstring (std::ostream &os, const WideString & wstr)
+{
+ for (unsigned int i=0; i<wstr.size (); ++i)
+ utf8_write_wchar (os, wstr [i]);
+
+ return os;
+}
+
+WideString
+utf8_mbstowcs (const String & str)
+{
+ WideString wstr;
+ ucs4_t wc;
+ unsigned int sn = 0;
+ int un = 0;
+
+ const unsigned char *s = (const unsigned char *) str.c_str ();
+
+ while (sn < str.length () && *s != 0 &&
+ (un=utf8_mbtowc (&wc, s, str.length () - sn)) > 0) {
+ wstr.push_back (wc);
+ s += un;
+ sn += un;
+ }
+ return wstr;
+}
+
+WideString
+utf8_mbstowcs (const char *str, int len)
+{
+ WideString wstr;
+
+ if (str) {
+ ucs4_t wc;
+ unsigned int sn = 0;
+ int un = 0;
+
+ if (len < 0) len = strlen (str);
+
+ while (sn < ((unsigned int)len) && *str != 0 && (un=utf8_mbtowc (&wc, (const unsigned char *)str, len - sn)) > 0) {
+ wstr.push_back (wc);
+ str += un;
+ sn += un;
+
+ }
+ }
+ return wstr;
+}
+
+String
+utf8_wcstombs (const WideString & wstr)
+{
+ String str;
+ char utf8 [6];
+ int un = 0;
+
+ for (unsigned int i = 0; i<wstr.size (); ++i) {
+ un = utf8_wctomb ((unsigned char*)utf8, wstr [i], 6);
+ if (un > 0)
+ str.append (utf8, un);
+ }
+ return str;
+}
+
+String
+utf8_wcstombs (const ucs4_t *wstr, int len)
+{
+ String str;
+ char utf8 [6];
+ int un = 0;
+
+ if (wstr) {
+ if (len < 0) {
+ len = 0;
+ while (wstr [len])
+ ++len;
+ }
+
+ for (int i = 0; i < len; ++i) {
+ un = utf8_wctomb ((unsigned char*)utf8, wstr [i], 6);
+ if (un > 0)
+ str.append (utf8, un);
+ }
+ }
+ return str;
+}
+
+String
+scim_validate_locale (const String& locale)
+{
+ String good;
+
+ String last = String (setlocale (LC_CTYPE, 0));
+
+ if (setlocale (LC_CTYPE, locale.c_str ())) {
+ good = locale;
+ } else {
+ std::vector<String> vec;
+ if (scim_split_string_list (vec, locale, '.') == 2) {
+ if (isupper (vec[1][0])) {
+ for (String::iterator i=vec[1].begin (); i!=vec[1].end (); ++i)
+ *i = (char) tolower (*i);
+ } else {
+ for (String::iterator i=vec[1].begin (); i!=vec[1].end (); ++i)
+ *i = (char) toupper (*i);
+ }
+ if (setlocale (LC_CTYPE, (vec[0] + "." + vec[1]).c_str ())) {
+ good = vec [0] + "." + vec[1];
+ }
+ }
+ }
+
+ setlocale (LC_CTYPE, last.c_str ());
+
+ return good;
+}
+
+String
+scim_get_locale_encoding (const String& locale)
+{
+ String last = String (setlocale (LC_CTYPE, 0));
+ String encoding;
+
+ if (setlocale (LC_CTYPE, locale.c_str ()))
+ encoding = String (nl_langinfo (CODESET));
+ else {
+ std::vector<String> vec;
+ if (scim_split_string_list (vec, locale, '.') == 2) {
+ if (isupper (vec[1][0])) {
+ for (String::iterator i=vec[1].begin (); i!=vec[1].end (); ++i)
+ *i = (char) tolower (*i);
+ } else {
+ for (String::iterator i=vec[1].begin (); i!=vec[1].end (); ++i)
+ *i = (char) toupper (*i);
+ }
+ if (setlocale (LC_CTYPE, (vec[0] + "." + vec[1]).c_str ()))
+ encoding = String (nl_langinfo (CODESET));
+ }
+
+ }
+
+ setlocale (LC_CTYPE, last.c_str ());
+
+ return encoding;
+}
+
+int
+scim_get_locale_maxlen (const String& locale)
+{
+ int maxlen;
+
+ String last = String (setlocale (LC_CTYPE, 0));
+
+ if (setlocale (LC_CTYPE, locale.c_str ()))
+ maxlen = MB_CUR_MAX;
+ else
+ maxlen = 1;
+
+ setlocale (LC_CTYPE, last.c_str ());
+ return maxlen;
+}
+
+int
+scim_split_string_list (std::vector<String>& vec, const String& str, char delim)
+{
+ int count = 0;
+
+ String temp;
+ String::const_iterator bg, ed;
+
+ vec.clear ();
+
+ bg = str.begin ();
+ ed = str.begin ();
+
+ while (bg != str.end () && ed != str.end ()) {
+ for (; ed != str.end (); ++ed) {
+ if (*ed == delim)
+ break;
+ }
+ temp.assign (bg, ed);
+ vec.push_back (temp);
+ ++count;
+
+ if (ed != str.end ())
+ bg = ++ ed;
+ }
+ return count;
+}
+
+String
+scim_combine_string_list (const std::vector<String>& vec, char delim)
+{
+ String result;
+ for (std::vector<String>::const_iterator i = vec.begin (); i!=vec.end (); ++i) {
+ result += *i;
+ if (i+1 != vec.end ())
+ result += delim;
+ }
+ return result;
+}
+
+bool
+scim_if_wchar_ucs4_equal ()
+{
+ if (sizeof (wchar_t) != sizeof (ucs4_t))
+ return false;
+
+ iconv_t cd;
+ wchar_t wcbuf [2] = {0,0};
+ ucs4_t ucsbuf [2] = {0x4E00, 0x0001};
+ size_t wclen = 2 * sizeof (wchar_t);
+ size_t ucslen = 2 * sizeof (ucs4_t);
+
+ char *wcp = (char *) wcbuf;
+ ICONV_CONST char *ucsp = (ICONV_CONST char *) ucsbuf;
+
+ if (scim_is_little_endian ())
+ cd = iconv_open ("UCS-4LE", "wchar_t");
+ else
+ cd = iconv_open ("UCS-4BE", "wchar_t");
+
+ if (cd == (iconv_t) -1)
+ return false;
+
+ iconv (cd, &ucsp, &ucslen, &wcp, &wclen);
+
+ iconv_close (cd);
+
+ if (wcbuf [0] == (wchar_t) ucsbuf [0] &&
+ wcbuf [1] == (wchar_t) ucsbuf [1])
+ return true;
+
+ return false;
+}
+
+static struct {
+ ucs4_t half;
+ ucs4_t full;
+ ucs4_t size;
+} __half_full_table [] = {
+ {0x0020, 0x3000, 1},
+ {0x0021, 0xFF01, 0x5E},
+ {0x00A2, 0xFFE0, 2},
+ {0x00A5, 0xFFE5, 1},
+ {0x00A6, 0xFFE4, 1},
+ {0x00AC, 0xFFE2, 1},
+ {0x00AF, 0xFFE3, 1},
+ {0x20A9, 0xFFE6, 1},
+ {0xFF61, 0x3002, 1},
+ {0xFF62, 0x300C, 2},
+ {0xFF64, 0x3001, 1},
+ {0xFF65, 0x30FB, 1},
+ {0xFF66, 0x30F2, 1},
+ {0xFF67, 0x30A1, 1},
+ {0xFF68, 0x30A3, 1},
+ {0xFF69, 0x30A5, 1},
+ {0xFF6A, 0x30A7, 1},
+ {0xFF6B, 0x30A9, 1},
+ {0xFF6C, 0x30E3, 1},
+ {0xFF6D, 0x30E5, 1},
+ {0xFF6E, 0x30E7, 1},
+ {0xFF6F, 0x30C3, 1},
+ {0xFF70, 0x30FC, 1},
+ {0xFF71, 0x30A2, 1},
+ {0xFF72, 0x30A4, 1},
+ {0xFF73, 0x30A6, 1},
+ {0xFF74, 0x30A8, 1},
+ {0xFF75, 0x30AA, 2},
+ {0xFF77, 0x30AD, 1},
+ {0xFF78, 0x30AF, 1},
+ {0xFF79, 0x30B1, 1},
+ {0xFF7A, 0x30B3, 1},
+ {0xFF7B, 0x30B5, 1},
+ {0xFF7C, 0x30B7, 1},
+ {0xFF7D, 0x30B9, 1},
+ {0xFF7E, 0x30BB, 1},
+ {0xFF7F, 0x30BD, 1},
+ {0xFF80, 0x30BF, 1},
+ {0xFF81, 0x30C1, 1},
+ {0xFF82, 0x30C4, 1},
+ {0xFF83, 0x30C6, 1},
+ {0xFF84, 0x30C8, 1},
+ {0xFF85, 0x30CA, 6},
+ {0xFF8B, 0x30D2, 1},
+ {0xFF8C, 0x30D5, 1},
+ {0xFF8D, 0x30D8, 1},
+ {0xFF8E, 0x30DB, 1},
+ {0xFF8F, 0x30DE, 5},
+ {0xFF94, 0x30E4, 1},
+ {0xFF95, 0x30E6, 1},
+ {0xFF96, 0x30E8, 6},
+ {0xFF9C, 0x30EF, 1},
+ {0xFF9D, 0x30F3, 1},
+ {0xFFA0, 0x3164, 1},
+ {0xFFA1, 0x3131, 30},
+ {0xFFC2, 0x314F, 6},
+ {0xFFCA, 0x3155, 6},
+ {0xFFD2, 0x315B, 9},
+ {0xFFE9, 0x2190, 4},
+ {0xFFED, 0x25A0, 1},
+ {0xFFEE, 0x25CB, 1},
+ {0,0,0}
+};
+
+
+/**
+ * convert a half width unicode char to full width char
+ */
+ucs4_t
+scim_wchar_to_full_width (ucs4_t code)
+{
+ int i=0;
+ while (__half_full_table [i].size) {
+ if (code >= __half_full_table [i].half &&
+ code < __half_full_table [i].half +
+ __half_full_table [i].size)
+ return __half_full_table [i].full +
+ (code - __half_full_table [i].half);
+ ++ i;
+ }
+ return code;
+}
+
+/**
+ * convert a full width unicode char to half width char
+ */
+ucs4_t
+scim_wchar_to_half_width (ucs4_t code)
+{
+ int i=0;
+ while (__half_full_table [i].size) {
+ if (code >= __half_full_table [i].full &&
+ code < __half_full_table [i].full +
+ __half_full_table [i].size)
+ return __half_full_table [i].half +
+ (code - __half_full_table [i].full);
+ ++ i;
+ }
+ return code;
+}
+
+String
+scim_get_home_dir ()
+{
+ const char * home_dir = 0;
+
+ struct passwd *pw;
+
+ setpwent ();
+ pw = getpwuid (getuid ());
+ endpwent ();
+
+ if (pw) {
+ home_dir = pw->pw_dir;
+ }
+
+ if (!home_dir) {
+ home_dir = getenv ("HOME");
+ }
+
+ return String (home_dir);
+}
+
+String
+scim_get_user_name ()
+{
+ struct passwd *pw;
+ const char *user_name;
+
+ setpwent ();
+ pw = getpwuid (getuid ());
+ endpwent ();
+
+ if (pw && pw->pw_name)
+ return String (pw->pw_name);
+ else if ((user_name = getenv ("USER")) != NULL)
+ return String (user_name);
+
+ char uid_str [10];
+
+ snprintf (uid_str, 10, "%u", getuid ());
+
+ return String (uid_str);
+}
+
+String
+scim_get_user_data_dir ()
+{
+ String dir = scim_get_home_dir () + String ("/.scim");
+ scim_make_dir (dir);
+ return dir;
+}
+
+String
+scim_get_current_locale ()
+{
+ char *locale = setlocale (LC_CTYPE, 0);
+
+ if (locale) return String (locale);
+ return String ();
+}
+
+String scim_get_current_language ()
+{
+ return scim_get_locale_language (scim_get_current_locale ());
+}
+
+bool
+scim_is_little_endian ()
+{
+ short endian = 1;
+ return (*((char *)&endian) != 0);
+}
+
+size_t
+scim_load_file (const String &filename, char **bufptr)
+{
+ if (!filename.length ())
+ return 0;
+
+ struct stat statbuf;
+
+ if (stat (filename.c_str (), &statbuf) < 0 ||
+ !S_ISREG (statbuf.st_mode) ||
+ !statbuf.st_size)
+ return 0;
+
+ if (!bufptr)
+ return statbuf.st_size;
+
+ FILE *fp = fopen (filename.c_str (), "r");
+
+ if (fp == NULL) {
+ *bufptr = 0;
+ return 0;
+ }
+
+ try {
+ *bufptr = new char [statbuf.st_size];
+ } catch (...) {
+ fclose (fp);
+ throw;
+ }
+
+ if (! (*bufptr)) {
+ fclose (fp);
+ return 0;
+ }
+
+ size_t size = fread (*bufptr, 1, statbuf.st_size, fp);
+
+ fclose (fp);
+
+ if (!size) {
+ delete [] *bufptr;
+ *bufptr = 0;
+ }
+
+ return size;
+}
+
+bool
+scim_make_dir (const String &dir)
+{
+ std::vector <String> paths;
+ String path;
+
+ scim_split_string_list (paths, dir, SCIM_PATH_DELIM);
+
+ for (size_t i = 0; i < paths.size (); ++i) {
+ path += SCIM_PATH_DELIM_STRING + paths [i];
+
+ //Make the dir if it's not exist.
+ if (access (path.c_str (), R_OK) != 0) {
+ mkdir (path.c_str (), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
+ if (access (path.c_str (), R_OK) != 0)
+ return false;
+ }
+ }
+ return true;
+}
+
+struct __Language {
+ const char *code;
+ const char *normalized;
+ const char *name;
+ const char *untranslated;
+ const char *locale_suffix;
+};
+
+static __Language __languages [] = {
+ { "C", NULL, N_("English/Keyboard"), NULL, NULL},
+ { "am_ET", NULL, N_("Amharic"), NULL, NULL },
+ { "ar", "ar_EG", N_("Arabic"), NULL, NULL },
+ { "ar_EG", NULL, N_("Arabic (Egypt)"), NULL, NULL },
+ { "ar_LB", NULL, N_("Arabic (Lebanon)"), NULL, NULL },
+ { "as_IN", NULL, N_("Assamese"), NULL, NULL},
+ { "az_AZ", NULL, N_("Azerbaijani"), NULL, NULL },
+ { "be_BY", NULL, N_("Belarusian"), "Беларуская мова", NULL },
+ { "bg_BG", NULL, N_("Bulgarian"), "Български", NULL },
+ { "bn", "bn_BD", N_("Bengali"), "বাংলা", NULL },
+ { "bn_BD", NULL, N_("Bengali"), "বাংলা", NULL },
+ { "bn_IN", NULL, N_("Bengali (India)"), "বাংলা", NULL },
+ { "bo", NULL, N_("Tibetan"), NULL, NULL },
+ { "bs_BA", NULL, N_("Bosnian"), NULL, NULL },
+ { "ca_ES", NULL, N_("Catalan"), "Català", "@euro" },
+ { "cs_CZ", NULL, N_("Czech"), "čeština", NULL },
+ { "cy_GB", NULL, N_("Welsh"), "Cymraeg", NULL },
+ { "da_DK", NULL, N_("Danish"), "Dansk", "@euro" },
+ { "de_DE", NULL, N_("German"), "Deutsch", "@euro" },
+ { "dv_MV", NULL, N_("Divehi"), "ދިވެހިބަސް", NULL },
+ { "el_GR", NULL, N_("Greek"), "ελληνικά", NULL },
+ { "en" , NULL, N_("English"), "English", NULL },
+ { "en_AU", NULL, N_("English (Australian)"), "Australian English", NULL },
+ { "en_CA", NULL, N_("English (Canadian)"), "Canadian English", NULL },
+ { "en_GB", NULL, N_("English (British)"), "British English", ".iso885915" },
+ { "en_IE", NULL, N_("English (Ireland)"), "Irish English", NULL },
+ { "en_US", NULL, N_("English (American)"), "American English", ".iso885915" },
+ { "es", "es_ES", N_("Spanish"), "Español", NULL },
+ { "es_ES", NULL, N_("Spanish"), "Español", "@euro" },
+ { "es_MX", NULL, N_("Spanish (Mexico)"), "Español (Mexico)", NULL },
+ { "et_EE", NULL, N_("Estonian"), "Eesti", ".iso885915" },
+ { "eu_ES", NULL, N_("Basque"), "Euskara", "@euro" },
+ { "fa_IR", NULL, N_("Persian"), "فارسی", NULL },
+ { "fi_FI", NULL, N_("Finnish"), "Suomi", "@euro" },
+ { "fr_FR", NULL, N_("French"), "Français", "@euro" },
+ { "ga_IE", NULL, N_("Irish"), "Gaeilge", "@euro" },
+ { "gl_ES", NULL, N_("Galician"), "Galego", "@euro" },
+ { "gu_IN", NULL, N_("Gujarati"), NULL, NULL },
+ { "he_IL", NULL, N_("Hebrew"), "עברית", NULL },
+ { "hi_IN", NULL, N_("Hindi"), "हिंदी", NULL },
+ { "hr_HR", NULL, N_("Croatian"), "Hrvatski", NULL },
+ { "hu_HU", NULL, N_("Hungarian"), "Magyar", NULL },
+ { "hy_AM", NULL, N_("Armenian"), "Հայերէն", NULL },
+ { "ia" , NULL, N_("Interlingua"), NULL },
+ { "id_ID", NULL, N_("Indonesian"), "Bahasa Indonesia", NULL },
+ { "is_IS", NULL, N_("Icelandic"), NULL, NULL },
+ { "it_IT", NULL, N_("Italian"), "Italiano", "@euro" },
+ { "iw_IL", NULL, N_("Hebrew"), "עברית", NULL },
+ { "ja_JP", NULL, N_("Japanese"), "日本語", ".EUC-JP,.SJIS,.eucJP" },
+ { "ka_GE", NULL, N_("Georgian"), "ქართული", NULL },
+ { "kk_KZ", NULL, N_("Kazakh"), NULL, NULL },
+ { "km", NULL, N_("Cambodian"), NULL, NULL },
+ { "kn_IN", NULL, N_("Kannada"), "ಕನ್ನಡ", NULL },
+ { "ko_KR", NULL, N_("Korean"), "한국어", ".EUC-KR,.eucKR" },
+ { "lo_LA", NULL, N_("Laothian"), NULL, NULL },
+ { "lt_LT", NULL, N_("Lithuanian"), "Lietuvių", NULL },
+ { "lv_LV", NULL, N_("Latvian"), "Latviešu", NULL },
+ { "mk_MK", NULL, N_("Macedonian"), NULL, NULL },
+ { "ml_IN", NULL, N_("Malayalam"), "മലയാളം", NULL },
+ { "mn_MN", NULL, N_("Mongolian"), "Монгол", NULL },
+ { "mr_IN", NULL, N_("Marathi"), NULL, NULL },
+ { "ms_MY", NULL, N_("Malay"), "Bahasa Melayu", NULL },
+ { "my_MM", NULL, N_("Burmese"), "", NULL },
+ { "ne_NP", NULL, N_("Nepali"), NULL, NULL },
+ { "nl_NL", NULL, N_("Dutch"), "Nederlands", "@euro" },
+ { "nn_NO", NULL, N_("Norwegian (Nynorsk)"), "Norsk (Nynorsk)", NULL },
+ { "no_NO", NULL, N_("Norwegian (Bokmal)"), "Norsk (Bokmål)", NULL },
+ { "or_IN", NULL, N_("Oriya"), NULL, NULL },
+ { "pa_IN", NULL, N_("Punjabi"), NULL, NULL },
+ { "pl_PL", NULL, N_("Polish"), "Polski", NULL },
+ { "pt", "pt_PT", N_("Portuguese"), "Português", NULL },
+ { "pt_BR", NULL, N_("Portuguese (Brazil)"), "Português do Brasil", NULL },
+ { "pt_PT", NULL, N_("Portuguese"), "Português", "@euro" },
+ { "ro_RO", NULL, N_("Romanian"), "Română", NULL },
+ { "ru_RU", NULL, N_("Russian"), "русский", ".koi8r" },
+ { "si_LK", NULL, N_("Sinhala"), "සිංහල", NULL },
+ { "sk_SK", NULL, N_("Slovak"), "Slovenský", NULL },
+ { "sl_SI", NULL, N_("Slovenian"), "Slovenščina", NULL },
+ { "sq_AL", NULL, N_("Albanian"), "Shqip", NULL },
+ { "sr", "sr_YU", N_("Serbian"), "српски", NULL },
+ { "sr_CS", NULL, N_("Serbian"), "српски", NULL },
+ { "sr_YU", NULL, N_("Serbian"), "српски", "@cyrillic" },
+ { "sv", "sv_SE", N_("Swedish"), "Svenska", NULL },
+ { "sv_FI", NULL, N_("Swedish (Finland)"), "Svenska (Finland)", "@euro" },
+ { "sv_SE", NULL, N_("Swedish"), "Svenska", ".iso885915" },
+ { "ta_IN", NULL, N_("Tamil"), NULL, NULL },
+ { "te_IN", NULL, N_("Telugu"), NULL, NULL },
+ { "th_TH", NULL, N_("Thai"), "ไทย", NULL },
+ { "tr_TR", NULL, N_("Turkish"), "Türkçe", NULL },
+ { "ug", NULL, N_("Uighur"), NULL, NULL },
+ { "uk_UA", NULL, N_("Ukrainian"), "Українська", NULL },
+ { "ur_PK", NULL, N_("Urdu"), NULL, NULL },
+ { "uz_UZ", NULL, N_("Uzbek"), NULL, "@cyrillic" },
+ { "vi_VN", NULL, N_("Vietnamese"), "Việt Nam", ".tcvn" },
+ { "wa_BE", NULL, N_("Walloon"), "Walon", "@euro" },
+ { "yi" , "yi_US", N_("Yiddish"), "ייִדיש", NULL },
+ { "yi_US", NULL, N_("Yiddish"), "ייִדיש", NULL },
+ { "zh", "zh_CN", N_("Chinese"), "中文", NULL },
+ { "zh_CN", NULL, N_("Chinese (Simplified)"), "中文 (简体)", ".GB18030,.GBK,.GB2312,.eucCN" },
+ { "zh_HK", NULL, N_("Chinese (Hongkong)"), "中文 (香港)", NULL },
+ { "zh_SG", "zh_CN", N_("Chinese (Simplified)"), "中文 (简体)", ".GBK" },
+ { "zh_TW", NULL, N_("Chinese (Traditional)"), "中文 (繁體)", ".eucTW" },
+
+ { "nl_NL", NULL, N_("Dutch (Standard)"), "Dutch (Standard)", NULL },
+ { "nl_BE", NULL, N_("Dutch (Belgian)"), "Dutch (Belgian)", NULL },
+ { "en_US", NULL, N_("English (United States)"), "English (United States)", NULL },
+ { "en_GB", NULL, N_("English (United Kingdom)"), "English (United Kingdom)", NULL },
+ { "en_AU", NULL, N_("English (Australian)"), "English (Australian)", NULL },
+ { "en_CA", NULL, N_("English (Canadian)"), "English (Canadian)", NULL },
+ { "en_NZ", NULL, N_("English (New Zealand)"), "English (New Zealand)", NULL },
+ { "en_IE", NULL, N_("English (Irish)"), "English (Irish)", NULL },
+ { "en_ZA", NULL, N_("English (South Africa)"), "English (South Africa)", NULL },
+ { "en_JM", NULL, N_("English (Jamaica)"), "English (Jamaica)", NULL },
+ { "en_BZ", NULL, N_("English (Belize)"), "English (Belize)", NULL },
+ { "en_TT", NULL, N_("English (Trinidad)"), "English (Trinidad)", NULL },
+ { "en_ZW", NULL, N_("English (Zimbabwe)"), "English (Zimbabwe)", NULL },
+ { "en_PH", NULL, N_("English (Philippines)"), "English (Philippines)", NULL },
+ { "fr_FR", NULL, N_("French (Standard)"), "French (Standard)", NULL },
+ { "fr_BE", NULL, N_("French (Belgian)"), "French (Belgian)", NULL },
+ { "fr_CA", NULL, N_("French (Canadian)"), "French (Canadian)", NULL },
+ { "fr_CH", NULL, N_("French (Swiss)"), "French (Swiss)", NULL },
+ { "fr_LU", NULL, N_("French (Luxembourg)"), "French (Luxembourg)", NULL },
+ { "fr_MC", NULL, N_("French (Monaco)"), "French (Monaco)", NULL },
+ { "de_DE", NULL, N_("German (Standard)"), "German (Standard)", NULL },
+ { "de_CH", NULL, N_("German (Swiss)"), "German (Swiss)", NULL },
+ { "de_AT", NULL, N_("German (Austrian)"), "German (Austrian)", NULL },
+ { "de_LU", NULL, N_("German (Luxembourg)"), "German (Luxembourg)", NULL },
+ { "de_LI", NULL, N_("German (Liechtenstein)"), "German (Liechtenstein)", NULL },
+ { "it_IT", NULL, N_("Italian (Standard)"), "Italian (Standard)", NULL },
+ { "it_CH", NULL, N_("Italian (Swiss)"), "Italian (Swiss)", NULL },
+ { "pt_BR", NULL, N_("Portuguese (Brazilian)"), "Portuguese (Brazilian)", NULL },
+ { "pt_PT", NULL, N_("Portuguese (Standard)"), "Portuguese (Standard)", NULL },
+ { "es_ES", NULL, N_("Spanish (Traditional Sort)"), "Spanish (Traditional Sort)", NULL },
+ { "es_MX", NULL, N_("Spanish (Mexican)"), "Spanish (Mexican)", NULL },
+ { "es_GT", NULL, N_("Spanish (Guatemala)"), "Spanish (Guatemala)", NULL },
+ { "es_CR", NULL, N_("Spanish (Costa Rica)"), "Spanish (Costa Rica)", NULL },
+ { "es_PA", NULL, N_("Spanish (Panama)"), "Spanish (Panama)", NULL },
+ { "es_DO", NULL, N_("Spanish (Dominican Republic)"), "Spanish (Dominican Republic)", NULL },
+ { "es_VE", NULL, N_("Spanish (Venezuela)"), "Spanish (Venezuela)", NULL },
+ { "es_CO", NULL, N_("Spanish (Colombia)"), "Spanish (Colombia)", NULL },
+ { "es_PE", NULL, N_("Spanish (Peru)"), "Spanish (Peru)", NULL },
+ { "es_AR", NULL, N_("Spanish (Argentina)"), "Spanish (Argentina)", NULL },
+ { "es_EC", NULL, N_("Spanish (Ecuador)"), "Spanish (Ecuador)", NULL },
+ { "es_CL", NULL, N_("Spanish (Chile)"), "Spanish (Chile)", NULL },
+ { "es_UY", NULL, N_("Spanish (Uruguay)"), "Spanish (Uruguay)", NULL },
+ { "es_PY", NULL, N_("Spanish (Paraguay)"), "Spanish (Paraguay)", NULL },
+ { "es_BO", NULL, N_("Spanish (Bolivia)"), "Spanish (Bolivia)", NULL },
+ { "es_SV", NULL, N_("Spanish (El Salvador)"), "Spanish (El Salvador)", NULL },
+ { "es_HN", NULL, N_("Spanish (Honduras)"), "Spanish (Honduras)", NULL },
+ { "es_NI", NULL, N_("Spanish (Nicaragua)"), "Spanish (Nicaragua)", NULL },
+ { "es_PR", NULL, N_("Spanish (Puerto Rico)"), "Spanish (Puerto Rico)", NULL },
+ { "eu_ES", NULL, N_("Basque"), "Basque", NULL },
+ { "ca_ES", NULL, N_("Catalan"), "Catalan", NULL },
+ { "da_DK", NULL, N_("Danish"), "Danish", NULL },
+ { "af_AF", NULL, N_("Afrikaans"), "Afrikaans", NULL },
+ { "is_IS", NULL, N_("Icelandic"), "Icelandic", NULL },
+ { "fi_FI", NULL, N_("Finnish"), "Finnish", NULL },
+ { "ms_MY", NULL, N_("Malay (Malaysia)"), "Malay (Malaysia)", NULL },
+ { "ms_BN", NULL, N_("Malay (Brunei Darussalam)"), "Malay (Brunei Darussalam)", NULL },
+ { "no_NO", NULL, N_("Norwegian"), "Norwegian", NULL },
+ { "sv_SE", NULL, N_("Swedish"), "Swedish", NULL },
+ { "sv_FI", NULL, N_("Swedish (Finland)"), "Swedish (Finland)", NULL },
+ { "cs_CZ", NULL, N_("Czech"), "Czech", NULL },
+ { "hu_HU", NULL, N_("Hungarian"), "Hungarian", NULL },
+ { "pl_PL", NULL, N_("Polish"), "Polish", NULL },
+ { "ro_RO", NULL, N_("Romanian"), "Romanian", NULL },
+ { "sr_RS", NULL, N_("Serbian (Latin)"), "Serbian (Latin)", NULL },
+ { "sk_SK", NULL, N_("Slovak"), "Slovak", NULL },
+ { "sl_SI", NULL, N_("Slovenian"), "Slovenian", NULL },
+ { "et_EE", NULL, N_("Estonian"), "Estonian", NULL },
+ { "lv_LV", NULL, N_("Latvian"), "Latvian", NULL },
+ { "lt_LT", NULL, N_("Lithuanian"), "Lithuanian", NULL },
+ { "el_GR", NULL, N_("Greek"), "Greek", NULL },
+ { "bg_BG", NULL, N_("Bulgarian"), "Bulgarian", NULL },
+ { "kk_KZ", NULL, N_("Kazakh"), "Kazakh", NULL },
+ { "mk_MK", NULL, N_("Macedonian"), "Macedonian", NULL },
+ { "ru_RU", NULL, N_("Russian"), "Russian", NULL },
+ { "sr_RS", NULL, N_("Serbian (Cyrillic)"), "Serbian (Cyrillic)", NULL },
+ { "uk_UA", NULL, N_("Ukrainian"), "Ukrainian", NULL },
+ { "tr_TR", NULL, N_("Turkish"), "Turkish", NULL },
+ { "uz_UZ", NULL, N_("Uzbek (Latin)"), "Uzbek (Latin)", NULL },
+ { "ja_JP", NULL, N_("Japanese"), "Japanese", NULL },
+ { "ko_KR", NULL, N_("Korean"), "Korean", NULL },
+ { "zh_TW", NULL, N_("Chinese (Taiwan)"), "Chinese (Taiwan)", NULL },
+ { "zh_HK", NULL, N_("Chinese (Hong Kong)"), "Chinese (Hong Kong)", NULL },
+ { "zh_MO", NULL, N_("Chinese (Macau)"), "Chinese (Macau)", NULL },
+ { "zh_CN", NULL, N_("Chinese (PRC)"), "Chinese (PRC)", NULL },
+ { "zh_SG", NULL, N_("Chinese (Singapore)"), "Chinese (Singapore)", NULL },
+ { "th_TH", NULL, N_("Thai"), "Thai", NULL },
+ { "he_IL", NULL, N_("Hebrew"), "Hebrew", NULL },
+ { "ar_SA", NULL, N_("Arabic (Saudi Arabia)"), "Arabic (Saudi Arabia)", NULL },
+ { "ar_IQ", NULL, N_("Arabic (Iraq)"), "Arabic (Iraq)", NULL },
+ { "ar_EG", NULL, N_("Arabic (Egypt)"), "Arabic (Egypt)", NULL },
+ { "ar_LY", NULL, N_("Arabic (Libya)"), "Arabic (Libya)", NULL },
+ { "ar_DZ", NULL, N_("Arabic (Algeria)"), "Arabic (Algeria)", NULL },
+ { "ar_MA", NULL, N_("Arabic (Morocco)"), "Arabic (Morocco)", NULL },
+ { "ar_TN", NULL, N_("Arabic (Tunisia)"), "Arabic (Tunisia)", NULL },
+ { "ar_OM", NULL, N_("Arabic (Oman)"), "Arabic (Oman)", NULL },
+ { "ar_YE", NULL, N_("Arabic (Yemen)"), "Arabic (Yemen)", NULL },
+ { "ar_SY", NULL, N_("Arabic (Syria)"), "Arabic (Syria)", NULL },
+ { "ar_JO", NULL, N_("Arabic (Jordan)"), "Arabic (Jordan)", NULL },
+ { "ar_LB", NULL, N_("Arabic (Lebanon)"), "Arabic (Lebanon)", NULL },
+ { "ar_KW", NULL, N_("Arabic (Kuwait)"), "Arabic (Kuwait)", NULL },
+ { "ar_AE", NULL, N_("Arabic (UAE)"), "Arabic (UAE)", NULL },
+ { "ar_BH", NULL, N_("Arabic (Bahrain)"), "Arabic (Bahrain)", NULL },
+ { "ar_QA", NULL, N_("Arabic (Qatar)"), "Arabic (Qatar)", NULL },
+ { "ur_PK", NULL, N_("Urdu"), "Urdu", NULL },
+ { "vi_VN", NULL, N_("Vietnamese"), "Vietnamese", NULL },
+ { "hi_IN", NULL, N_("Hindi"), "Hindi", NULL },
+ { "te_IN", NULL, N_("Telugu"), "Telugu", NULL },
+ { "mr_IN", NULL, N_("Marathi"), "Marathi", NULL },
+ { "ta_IN", NULL, N_("Tamil"), "Tamil", NULL },
+ { "bn_IN", NULL, N_("Bengali"), "Bengali", NULL },
+ { "gu_IN", NULL, N_("Gujarati"), "Gujarati", NULL },
+ { "ml_IN", NULL, N_("Malayalam"), "Malayalam", NULL },
+ { "pa_IN", NULL, N_("Punjabi"), "Punjabi", NULL },
+ { "ka_GE", NULL, N_("Georgian"), "Georgian", NULL },
+ { "az_IR", NULL, N_("Azerbaijani"), "Azerbaijani", NULL },
+ { "gl_ES", NULL, N_("Galician"), "Galician", NULL },
+ { "ha_BJ", NULL, N_("Hausa"), "Hausa", NULL },
+ { "ga_IE", NULL, N_("Irish"), "Irish", NULL },
+ { "si_LK", NULL, N_("Sinhala"), "Sinhala", NULL },
+ { "cy_UK", NULL, N_("Welsh"), "Welsh", NULL },
+ { "xh_ZA", NULL, N_("Xhosa"), "Xhosa", NULL },
+ { "yo_NG", NULL, N_("Yoruba"), "Yoruba", NULL },
+ { "zu_ZA", NULL, N_("Zulu"), "Zulu", NULL },
+
+ { "", "", "", NULL, NULL }
+};
+
+class __LanguageLess
+{
+public:
+ bool operator () (const __Language &lhs, const __Language &rhs) const {
+ return strcmp (lhs.code, rhs.code) < 0;
+ }
+
+ bool operator () (const __Language &lhs, const String &rhs) const {
+ return strcmp (lhs.code, rhs.c_str ()) < 0;
+ }
+
+ bool operator () (const String &lhs, const __Language &rhs) const {
+ return strcmp (lhs.c_str (), rhs.code) < 0;
+ }
+};
+
+static bool language_sorted = false;
+
+static __Language *
+__find_language (const String &lang)
+{
+ if (!language_sorted) {
+ language_sorted = true;
+ for (int loop = 0; ((unsigned int)loop) < sizeof(__languages) / sizeof(__Language) - 1; loop++) {
+ for (int innerLoop = loop + 1; ((unsigned int)innerLoop) < sizeof(__languages) / sizeof(__Language) - 1; innerLoop++) {
+ if (strcmp (__languages[loop].code, __languages[innerLoop].code) > 0) {
+ __Language temp = __languages[innerLoop];
+ __languages[innerLoop] = __languages[loop];
+ __languages[loop] = temp;
+ }
+ }
+ }
+ }
+
+ static __Language *langs_begin = __languages;
+ static __Language *langs_end = __languages + sizeof (__languages) / sizeof (__Language) - 1;
+
+ String nlang = lang;
+ bool contry_code = false;
+
+ // Normalize the language name.
+ for (String::iterator it = nlang.begin (); it != nlang.end (); ++it) {
+ if (*it == '-' || *it == '_') {
+ *it = '_';
+ contry_code = true;
+ } else if (contry_code) {
+ *it = toupper (*it);
+ } else {
+ *it = tolower (*it);
+ }
+ }
+
+ __Language *result = std::lower_bound (langs_begin, langs_end, nlang, __LanguageLess ());
+
+ if (result != langs_end) {
+ if (strncmp (result->code, nlang.c_str (), strlen (result->code)) == 0 ||
+ (strncmp (result->code, nlang.c_str (), nlang.length ()) == 0 &&
+ strncmp (result->code, (result+1)->code, nlang.length ()) != 0))
+ return result;
+ }
+
+ return NULL;
+}
+
+String
+scim_get_language_name (const String &lang)
+{
+ return String (_(scim_get_language_name_english (lang).c_str ()));
+}
+
+String
+scim_get_language_name_english (const String &lang)
+{
+ __Language *result = __find_language (lang);
+
+ if (result)
+ return String (result->name);
+
+ return String ("Other");
+}
+
+String
+scim_get_language_name_untranslated (const String &lang)
+{
+ __Language *result = __find_language (lang);
+
+ if (result) {
+ if (result->untranslated)
+ return String (result->untranslated);
+ else
+ return String (_(result->name));
+ }
+
+ return String (_("Other"));
+}
+
+String
+scim_get_language_locales (const String &lang)
+{
+ __Language *result = __find_language (lang);
+
+ std::vector<String> locales;
+
+ if (result) {
+ String good;
+
+ if (strlen (result->code) < 5 && result->normalized)
+ result = __find_language (result->normalized);
+
+ if (result)
+ good = scim_validate_locale (String (result->code) + ".UTF-8");
+
+ if (good.length ()) locales.push_back (good);
+
+ if (result && result->locale_suffix) {
+ std::vector<String> suffixes;
+
+ scim_split_string_list (suffixes, result->locale_suffix, ',');
+ for (size_t i = 0; i < suffixes.size (); ++ i) {
+ good = scim_validate_locale (String (result->code) + suffixes [i]);
+ if (good.length ()) locales.push_back (good);
+ }
+ }
+
+ if (result)
+ good = scim_validate_locale (result->code);
+
+ if (good.length ()) locales.push_back (good);
+ }
+
+ return scim_combine_string_list (locales, ',');
+}
+
+String
+scim_get_locale_language (const String &locale)
+{
+ if (locale.length () == 0) return String ();
+
+ String str = locale.substr (0, locale.find ('.'));
+ return scim_validate_language (str.substr (0, str.find ('@')));
+}
+
+String
+scim_validate_language (const String &lang)
+{
+ __Language *result = __find_language (lang);
+
+ if (result)
+ return String (result->code);
+
+ // Add prefix ~ to let other become the last item when sorting.
+ return String ("~other");
+}
+
+String
+scim_get_normalized_language (const String &lang)
+{
+ __Language *result = __find_language (lang);
+
+ if (result) {
+ if (result->normalized) return String (result->normalized);
+ else return String (result->code);
+ }
+
+ // Add prefix ~ to let other become the last item when sorting.
+ //return String ("~other");
+ return String ("en");
+}
+
+#ifndef SCIM_LAUNCHER
+ #define SCIM_LAUNCHER (SCIM_LIBEXECDIR "/scim-launcher")
+#endif
+
+int scim_launch (bool daemon,
+ const String &config,
+ const String &imengines,
+ const String &frontend,
+ char * const argv [])
+{
+ if (!config.length () || !imengines.length () || !frontend.length ())
+ return -1;
+
+ int new_argc = 0;
+ char *new_argv [40];
+
+ new_argv [new_argc ++] = strdup (SCIM_LAUNCHER);
+
+ if (daemon)
+ new_argv [new_argc ++] = strdup ("-d");
+
+ new_argv [new_argc ++] = strdup ("-c");
+ new_argv [new_argc ++] = strdup (config.c_str ());
+ new_argv [new_argc ++] = strdup ("-e");
+ new_argv [new_argc ++] = strdup (imengines.c_str ());
+ new_argv [new_argc ++] = strdup ("-f");
+ new_argv [new_argc ++] = strdup (frontend.c_str ());
+
+ if (argv) {
+ for (int i = 0; argv [i] && new_argc < 39 ; ++i, ++new_argc)
+ new_argv [new_argc] = strdup (argv [i]);
+ }
+
+ new_argv [new_argc] = 0;
+
+ pid_t child_pid;
+
+ child_pid = fork ();
+
+ // Error fork.
+ if (child_pid < 0) return -1;
+
+ // In child process, start scim-launcher.
+ if (child_pid == 0) {
+ return execv (SCIM_LAUNCHER, new_argv);
+ }
+
+ // In parent process, wait the child exit.
+
+ for (int i = 0; i < new_argc; ++i)
+ if (new_argv [i]) free (new_argv [i]);
+
+ int status;
+ pid_t ret_pid;
+
+ ret_pid = waitpid (child_pid, &status, 0);
+
+ if (ret_pid == child_pid && WIFEXITED(status))
+ return WEXITSTATUS(status);
+
+ return -1;
+}
+
+#ifndef SCIM_PANEL_PROGRAM
+ #define SCIM_PANEL_PROGRAM (SCIM_BINDIR "/scim-panel-gtk")
+#endif
+
+int scim_launch_panel (bool daemon,
+ const String &config,
+ const String &display,
+ char * const argv [])
+{
+ if (!config.length ())
+ return -1;
+
+ String panel_program = scim_global_config_read (SCIM_GLOBAL_CONFIG_DEFAULT_PANEL_PROGRAM, String (SCIM_PANEL_PROGRAM));
+
+ if (!panel_program.length ())
+ panel_program = String (SCIM_PANEL_PROGRAM);
+
+ if (panel_program [0] != SCIM_PATH_DELIM) {
+ panel_program = String (SCIM_BINDIR) +
+ String (SCIM_PATH_DELIM_STRING) +
+ panel_program;
+ }
+
+ //if the file is not exist or is not executable, fallback to default
+ if (access (panel_program.c_str (), X_OK) != 0)
+ panel_program = String (SCIM_PANEL_PROGRAM);
+
+ int new_argc = 0;
+ char *new_argv [80];
+
+ new_argv [new_argc ++] = strdup (panel_program.c_str ());
+
+ new_argv [new_argc ++] = strdup ("--display");
+ new_argv [new_argc ++] = strdup (display.c_str ());
+
+ new_argv [new_argc ++] = strdup ("-c");
+ new_argv [new_argc ++] = strdup (config.c_str ());
+
+ if (daemon)
+ new_argv [new_argc ++] = strdup ("-d");
+
+ if (argv) {
+ for (int i = 0; argv [i] && new_argc < 40; ++i, ++new_argc)
+ new_argv [new_argc] = strdup (argv [i]);
+ }
+
+ new_argv [new_argc] = 0;
+
+ pid_t child_pid;
+
+ child_pid = fork ();
+
+ // Error fork.
+ if (child_pid < 0) return -1;
+
+ // In child process, start scim-launcher.
+ if (child_pid == 0) {
+ return execv (panel_program.c_str (), new_argv);
+ }
+
+ // In parent process, wait the child exit.
+
+ for (int i = 0; i < new_argc; ++i)
+ if (new_argv [i]) free (new_argv [i]);
+
+ int status;
+ pid_t ret_pid;
+
+ ret_pid = waitpid (child_pid, &status, 0);
+
+ if (ret_pid == child_pid && WIFEXITED(status))
+ return WEXITSTATUS(status);
+
+ return -1;
+}
+
+void
+scim_usleep (unsigned int usec)
+{
+ if (usec == 0) return;
+
+#if HAVE_NANOSLEEP
+ struct timespec req, rem;
+
+ req.tv_sec = usec / 1000000;
+ req.tv_nsec = (usec % 1000000) * 1000;
+
+ while (nanosleep (&req, &rem) == -1 && errno == EINTR && (rem.tv_sec != 0 || rem.tv_nsec != 0))
+ req = rem;
+#elif HAVE_USLEEP
+ unsigned int sec = usec / 1000000;
+ usec %= 1000000;
+
+ for (unsigned int i = 0; i < sec; ++i)
+ sleep (1);
+
+ usleep (usec);
+#else
+ unsigned int sec = usec / 1000000;
+
+ sleep (sec ? sec : 1);
+#endif
+}
+
+void scim_daemon ()
+{
+#if HAVE_DAEMON
+ if (daemon (0, 0) == -1)
+ std::cerr << "Error to make SCIM into a daemon!\n";
+
+ return;
+#else
+ pid_t id;
+
+ id = fork ();
+ if (id == -1) {
+ std::cerr << "Error to make SCIM into a daemon!\n";
+ return;
+ } else if (id > 0) {
+ _exit (0);
+ }
+
+ id = fork ();
+ if (id == -1) {
+ std::cerr << "Error to make SCIM into a daemon!\n";
+ return;
+ } else if (id > 0) {
+ _exit (0);
+ }
+
+ return;
+#endif
+}
+
+static struct timeval _t0 = {0, 0};
+static struct timeval _t1;
+
+static clock_t _p_t0;
+static clock_t _p_t1;
+
+void ISF_PROF_DEBUG_TIME_BEGIN ()
+{
+ struct tms tms;
+
+ _p_t0 = times (&tms);
+}
+
+/* Measure elapased time */
+void ISF_PROF_DEBUG_TIME_END (char const* format, char const* func, int line)
+{
+ float etime = 0.0;
+ struct tms tms;
+ static long clktck = 0;
+
+ if (clktck == 0)
+ if ((clktck = sysconf (_SC_CLK_TCK)) < 0)
+ return;
+
+ _p_t1 = times (&tms);
+
+ etime = (_p_t1 - _p_t0) / (double) clktck;
+
+ printf (format, func, line);
+ printf (mzc_red "[T:%ld][E:%f]" mzc_normal " ", _p_t1, etime);
+
+ return;
+}
+
+/* Measure elapased time */
+void ISF_PROF_DEBUG_TIME (char const* func, int line, char const* str)
+{
+ float etime = 0.0;
+
+ if (_t0.tv_sec == 0 && _t0.tv_usec == 0) {
+ gettimeofday (&_t0, NULL);
+ return;
+ }
+
+ gettimeofday (&_t1, NULL);
+
+ if (_t0.tv_usec != 0) {
+ etime = ((_t1.tv_sec * 1000000 + _t1.tv_usec) - (_t0.tv_sec * 1000000 + _t0.tv_usec))/1000000.0;
+ }
+
+ printf (mzc_red "[%s:%04d] [T:%ld][E:%f] %s " mzc_normal " \n", func, line, (_t1.tv_sec * 1000000 + _t1.tv_usec), etime, str);
+
+ _t0 = _t1;
+
+ return;
+}
+
+void gettime (clock_t clock_start, const char* str)
+{
+#ifdef ISF_PROF
+ struct tms tiks_buf;
+ double clock_tiks = (double)sysconf (_SC_CLK_TCK);
+ clock_t times_tiks = times (&tiks_buf);
+ double times_secs = (double)(times_tiks - clock_start) / clock_tiks;
+ double utime = (double)tiks_buf.tms_utime / clock_tiks;
+ double stime = (double)tiks_buf.tms_stime / clock_tiks;
+ printf (mzc_red "%s Times: %.3f \t User: %.3f \t System: %.3f " mzc_normal "\n", str, (double)times_secs, (double)utime , (double)stime);
+#endif
+}
+
+} // namespace scim
+
+/*
+vi:ts=4:ai:nowrap:expandtab
+*/
--- /dev/null
+/** @file scim_utility.h
+ * @brief various utility functions.
+ */
+
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+
+/*
+ * Smart Common Input Method
+ *
+ * Copyright (c) 2002-2005 James Su <suzhe@tsinghua.org.cn>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
+ *
+ * $Id: scim_utility.h,v 1.36 2005/04/09 15:38:39 suzhe Exp $
+ */
+
+#ifndef __SCIM_UTILITY_H
+#define __SCIM_UTILITY_H
+
+#include <syslog.h>
+
+namespace scim {
+/**
+ * @addtogroup Accessories
+ * @ingroup InputServiceFramework
+ * @{
+ */
+
+#ifndef SCIM_KEYBOARD_ICON_FILE
+#define SCIM_KEYBOARD_ICON_FILE (SCIM_ICONDIR "/keyboard.png")
+#endif
+
+#define SCIM_PATH_DELIM_STRING "/"
+#define SCIM_PATH_DELIM '/'
+
+// UTF-8 <-> ucs4_t convert
+
+/* Return code if invalid. (xxx_mbtowc, xxx_wctomb) */
+#define RET_ILSEQ 0
+/* Return code if only a shift sequence of n bytes was read. (xxx_mbtowc) */
+#define RET_TOOFEW(n) (-1-(n))
+/* Return code if output buffer is too small. (xxx_wctomb, xxx_reset) */
+#define RET_TOOSMALL -1
+/* Replacement character for invalid multibyte sequence or wide character. */
+#define BAD_WCHAR ((ucs4_t) 0xfffd)
+#define BAD_CHAR '?'
+
+/**
+ * @brief Convert an utf8 char sequence to ucs4.
+ *
+ * @param pwc destination buffer to store the ucs4 code.
+ * @param src source buffer contains the utf8 char sequence.
+ * @param src_len the size of source buffer.
+ *
+ * @return number of chars in s actually converted.
+ */
+int utf8_mbtowc (ucs4_t *pwc, const unsigned char *src, int src_len);
+
+/**
+ * @brief Convert an ucs4 code to utf8 char sequence.
+ *
+ * @param dest destination buffer to store utf8 char sequence.
+ * @param wc the ucs4 code to be converted.
+ * @param dest_size the size of destination buffer.
+ *
+ * @return the number of bytes actually written into dest.
+ */
+int utf8_wctomb (unsigned char *dest, ucs4_t wc, int dest_size);
+
+/**
+ * @brief Convert an utf8 string to an ucs4 string.
+ *
+ * @param str source utf8 string.
+ * @return the destination widestring.
+ */
+WideString utf8_mbstowcs (const String & str);
+
+/**
+ * @brief Convert an utf8 string to an ucs4 string.
+ *
+ * @param str source utf8 string.
+ * @param len length of the source string.
+ * @return the destination widestring.
+ */
+WideString utf8_mbstowcs (const char *str, int len = -1);
+
+/**
+ * @brief Convert an ucs4 string to an utf8 string.
+ *
+ * @param wstr source ucs4 string.
+ *
+ * @return the destination utf8 string.
+ */
+String utf8_wcstombs (const WideString & wstr);
+
+/**
+ * @brief Convert an ucs4 string to an utf8 string.
+ *
+ * @param wstr source ucs4 string.
+ * @param len length of the source string.
+ *
+ * @return the destination utf8 string.
+ */
+String utf8_wcstombs (const ucs4_t *wstr, int len = -1);
+
+/**
+ * @brief Read a wide char from istream.
+ *
+ * The content in the istream are actually in utf-8 encoding.
+ *
+ * @param is the stream to be read.
+ *
+ * @return if equal to 0 then got the end of the stream or error occurred.
+ */
+ucs4_t utf8_read_wchar (std::istream &is);
+
+/**
+ * @brief Write a wide char to ostream.
+ *
+ * The content written into the ostream will be converted into utf-8 encoding.
+ *
+ * @param os the stream to be written.
+ * @param wc the wide char to be written to the stream.
+ * @return the same stream object reference.
+ */
+std::ostream & utf8_write_wchar (std::ostream &os, ucs4_t wc);
+
+/**
+ * @brief Read a wide string from istream.
+ *
+ * The content in the istream are actually in utf-8 encoding.
+ *
+ * @param is the stream to be read.
+ * @param delim the delimiter of the string.
+ * @param rm_delim if the delim should be removed from the destination string.
+ * @return the wide string read from the given stream.
+ */
+WideString utf8_read_wstring (std::istream &is, ucs4_t delim = (ucs4_t) '\n', bool rm_delim = true);
+
+/**
+ * @brief Write a wide string to ostream.
+ *
+ * The content written into the ostream will be converted into utf-8 encoding.
+ *
+ * @param os the stream to be written.
+ * @param wstr the wide string to be written into the stream.
+ * @return the same stream object reference.
+ */
+std::ostream & utf8_write_wstring (std::ostream &os, const WideString & wstr);
+
+/**
+ * @brief Convert an uint32 variable into a sequence of bytes.
+ *
+ * @param bytes the buffer to store the result.
+ * @param n the variable to be converted.
+ */
+inline
+void scim_uint32tobytes (unsigned char *bytes, uint32 n)
+{
+ bytes [0] = (unsigned char) ((n & 0xFF));
+ bytes [1] = (unsigned char) ((n >> 8) & 0xFF);
+ bytes [2] = (unsigned char) ((n >> 16) & 0xFF);
+ bytes [3] = (unsigned char) ((n >> 24) & 0xFF);
+}
+
+/**
+ * @brief Convert a sequence of bytes into an uint32 value.
+ *
+ * @param bytes the buffer contains the bytes to be converted.
+ * @return the result uint32 value.
+ */
+inline
+uint32 scim_bytestouint32 (const unsigned char *bytes)
+{
+ return ((uint32) bytes [0])
+ | (((uint32) bytes [1]) << 8)
+ | (((uint32) bytes [2]) << 16)
+ | (((uint32) bytes [3]) << 24);
+}
+
+/**
+ * @brief Convert an uint16 variable into a sequence of bytes.
+ *
+ * @param bytes the buffer to store the result.
+ * @param n the variable to be converted.
+ */
+inline
+void scim_uint16tobytes (unsigned char *bytes, uint16 n)
+{
+ bytes [0] = (unsigned char) ((n & 0xFF));
+ bytes [1] = (unsigned char) ((n >> 8) & 0xFF);
+}
+
+/**
+ * @brief Convert a sequence of bytes into an uint16 value.
+ *
+ * @param bytes the buffer contains the bytes to be converted.
+ * @return the result uint16 value.
+ */
+inline
+uint16 scim_bytestouint16 (const unsigned char *bytes)
+{
+ return ((uint16) bytes [0]) | (((uint16) bytes [1]) << 8);
+}
+
+/**
+ * @brief Test if the locale is valid, and return the good locale name.
+ *
+ * @param locale the locale to be tested.
+ * @return If the locale is valid, it's the good locale name, otherwise empty.
+ */
+String scim_validate_locale (const String& locale);
+
+/**
+ * @brief Get the encoding for a locale.
+ *
+ * @param locale the name of the locale.
+ * @return The encoding used by the given locale.
+ */
+String scim_get_locale_encoding (const String& locale);
+
+/**
+ * @brief Get current system locale.
+ * @return The current system locale.
+ */
+String scim_get_current_locale ();
+
+/**
+ * @brief Get current system language.
+ * @return The current system language.
+ */
+String scim_get_current_language ();
+
+/**
+ * @brief Get the max length of the multibyte char of a locale.
+ *
+ * @param locale the name of the locale.
+ * @return the maxlen of this locale.
+ */
+int scim_get_locale_maxlen (const String& locale);
+
+/**
+ * @brief Split string list into a string vector according to the delim char.
+ *
+ * @param vec the string vector to store the result.
+ * @param str the string to be splitted.
+ * @param delim the delimiter to split the strings.
+ * @return the number of the strings in the result list.
+ */
+int scim_split_string_list (std::vector<String>& vec, const String& str, char delim = ',');
+
+/**
+ * @brief Combine a string vector into one string list, separated by char delim.
+ *
+ * @param vec the string vector which contains the strings to be combined.
+ * @param delim the delimiter which should be put between two strings.
+ * @return the result string.
+ */
+String scim_combine_string_list (const std::vector<String>& vec, char delim = ',');
+
+/**
+ * @brief Get machine endian type
+ * @return 1 little endian, 0 big endian
+ */
+bool scim_is_little_endian ();
+
+/**
+ * @brief Test if wchar_t is using UCS4 encoding.
+ */
+bool scim_if_wchar_ucs4_equal ();
+
+/**
+ * @brief Convert a half width unicode char to its full width counterpart.
+ */
+ucs4_t scim_wchar_to_full_width (ucs4_t code);
+
+/**
+ * @brief Convert a full width unicode char to its half width counterpart.
+ */
+ucs4_t scim_wchar_to_half_width (ucs4_t code);
+
+/**
+ * @brief Get the home dir of current user.
+ */
+String scim_get_home_dir ();
+
+/**
+ * @brief Get the name of current user.
+ */
+String scim_get_user_name ();
+
+/**
+ * @brief Get SCIM data dir of current user.
+ */
+String scim_get_user_data_dir ();
+
+/**
+ * @brief Load a file into memory.
+ *
+ * @param filename the name of the file to be loaded.
+ * @param bufptr the place to store the newly allocated buffer pointer,
+ * if bufptr == NULL then the file is not actually loaded,
+ * just return the file size.
+ * The pointer *bufptr must be deleted afterwards.
+ * @return the size of the data actually loaded (mostly, it's the file size),
+ * zero means load failed.
+ */
+size_t scim_load_file (const String &filename, char **bufptr);
+
+/**
+ * @brief Make a directory.
+ *
+ * @param dir the dir path to be created.
+ *
+ * @return true if sucess.
+ */
+bool scim_make_dir (const String &dir);
+
+/**
+ * @brief Get the localized name of a language id.
+ * @param lang the language id.
+ * @return the localized name of this language, in utf8 encoding.
+ */
+String scim_get_language_name (const String &lang);
+
+/**
+ * @brief Get the English name of a language id.
+ * @param lang the language id.
+ * @return the English name of this language, in utf8 encoding.
+ */
+String scim_get_language_name_english (const String &lang);
+
+/**
+ * @brief Get the untranslated name of a language id.
+ * @param lang the language id.
+ * @return the untranslated name of this language, in utf8 encoding.
+ */
+String scim_get_language_name_untranslated (const String &lang);
+
+/**
+ * @brief Get the supported locales for a language.
+ *
+ * For example language zh_CN may support zh_CN.UTF-8, zh_CN.GB18030, zh_CN.GBK, zh_CN.GB2312 locales.
+ *
+ * @param lang the language id.
+ * @return the supported locales separated by comma.
+ */
+String scim_get_language_locales (const String &lang);
+
+/**
+ * @brief Get the language id for a locale.
+ * @param locale the locale name
+ * @return the language id for this locale.
+ */
+String scim_get_locale_language (const String &locale);
+
+/**
+ * @brief Test if the language is valid, and return the good language code.
+ * @param lang the language to be tested.
+ * @return If the language is valid, return the good language id, otherwise return "~other".
+ */
+String scim_validate_language (const String &lang);
+
+/**
+ * @brief Get the normalized language id of a language.
+ *
+ * Some short language id will be normalized to it's full id, for example:
+ * "ja" -> "ja_JP"
+ * "ko" -> "ko_KR"
+ * "zh" -> "zh_CN"
+ *
+ * furthermore, zh_HK will be normalized to zh_TW, zh_SG will be normalized to zh_CN.
+ *
+ * @param lang the original language
+ * @return the normalized language code.
+ */
+String scim_get_normalized_language (const String &lang);
+
+/**
+ * @brief Launch a SCIM process with specific options.
+ *
+ * @param daemon If true then launch scim in a daemon process,
+ * otherwise the current process will be stopped until
+ * the newly created process exit.
+ * @param config The Config module to be used.
+ * @param imengines The IMEngines to be loaded, separated by comma.
+ * @param frontend The FrontEnd module to be used.
+ * @param argv Additional arguments passed to the new process's FrontEnd. Must
+ * terminated by a NULL pointer.
+ *
+ * @return Return 0 means the process started/exited without any problem, otherwise
+ * means an error occurred.
+ */
+int scim_launch (bool daemon,
+ const String &config,
+ const String &imengines,
+ const String &frontend,
+ char * const argv [] = 0);
+
+/**
+ * @brief Launch a SCIM Panel process with specific options.
+ *
+ * @param daemon If true then launch scim in a daemon process,
+ * otherwise the current process will be stopped until
+ * the newly created process exit.
+ * @param config The Config module to be used.
+ * @param display The display name on which the panel runs.
+ * eg. for X11 : localhost:0.0
+ * @param argv Additional arguments passed to the new process's FrontEnd. Must
+ * terminated by a NULL pointer.
+ *
+ * @return Return 0 means the process started/exited without any problem, otherwise
+ * means an error occurred.
+ */
+int scim_launch_panel (bool daemon,
+ const String &config,
+ const String &display,
+ char * const argv [] = 0);
+
+/**
+ * @brief Sleep some microseconds.
+ *
+ * @param usec The amount of microseconds to be sleeped.
+ */
+void scim_usleep (unsigned int usec);
+
+/**
+ * @brief Switch process into daemon mode.
+ */
+void scim_daemon ();
+
+#ifdef ISF_PROF
+
+void ISF_PROF_DEBUG_TIME(char const* func, int line, char const* str);
+void ISF_PROF_DEBUG_TIME_BEGIN ();
+void ISF_PROF_DEBUG_TIME_END (char const* format, char const* func, int line);
+
+#define ISF_PROF_DEBUG(str) ISF_PROF_DEBUG_TIME(__FUNCTION__, __LINE__, str );
+#define ISF_PROF_BEGIN() ISF_PROF_DEBUG_TIME_BEGIN ();
+#define ISF_PROF_END(fmt, args...) \
+ do{ \
+ ISF_PROF_DEBUG_TIME_END("[%s:%d]", __FUNCTION__, __LINE__); \
+ printf (fmt, ##args); \
+ }while(0);
+
+#else
+
+#define ISF_PROF_DEBUG(str)
+#define ISF_PROF_BEGIN()
+#define ISF_PROF_END(fmt, ...)
+
+#endif /* ISF_PROF */
+
+#define ENABLE_ISF_SYSLOG 1
+#ifdef ENABLE_ISF_SYSLOG
+ #define ISF_SYSLOG(fmt, args...) \
+ do{ \
+ syslog (LOG_DEBUG, "[%s %d in %s ()]", __FILE__, __LINE__, __FUNCTION__); \
+ syslog (LOG_DEBUG, fmt, ##args); \
+ }while(0);
+#else
+ #define ISF_SYSLOG(fmt, ...)
+#endif
+
+void gettime (clock_t clock_start, const char* str);
+
+typedef struct rectinfo
+{
+ uint32 pos_x;
+ uint32 pos_y;
+ uint32 width;
+ uint32 height;
+} RECT_INFO;
+
+typedef enum
+{
+ SCIM_CANDIDATE_STYLE = 0,
+ PREDICTION_ENGINE_CANDIDATE_STYLE,
+} ISF_CANDIDATE_STYLE_T;
+
+typedef enum
+{
+ PORTRAIT_HORIZONTAL_CANDIDATE_MODE = 0,
+ PORTRAIT_VERTICAL_CANDIDATE_MODE,
+ LANDSCAPE_HORIZONTAL_CANDIDATE_MODE,
+ LANDSCAPE_VERTICAL_CANDIDATE_MODE,
+ PORTRAIT_MORE_CANDIDATE_MODE,
+ LANDSCAPE_MORE_CANDIDATE_MODE,
+} ISF_CANDIDATE_MODE_T;
+
+
+#define PROP_X_EXT_KEYBOARD_EXIST "X External Keyboard Exist"
+
+#define mzsc(m_code) "\x1b[" # m_code
+#define mzc_normal mzsc(0m)
+#define mzc_red mzsc(1;31m)
+
+
+/** @} */
+} /* namespace scim */
+
+#endif /* __SCIM_UTILITY_H */
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+## Makefile.am -- Process this file with automake to produce Makefile.in
+## Copyright (C) 2002 James Su
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+MAINTAINERCLEANFILES = Makefile.in
+
+INCLUDES = -I$(top_builddir) \
+ -I$(top_builddir)/ism/src \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/ism/src \
+ -I$(top_srcdir)/ism/intl \
+ -I$(top_srcdir)/ism/data \
+ -I$(top_srcdir)/ism/utils
+
+if SCIM_BUILD_TRAY_ICON
+TRAY_ICON_HEADER=scimtrayicon.h
+TRAY_ICON_SOURCE=scimtrayicon.c
+endif
+
+if SCIM_BUILD_GTK_UTILS
+libscimgtkutilsincludedir = $(includedir)/scim@SCIM_EPOCH@/gtk
+libscimgtkutilsinclude_HEADERS = scimstringview.h $(TRAY_ICON_HEADER)
+GTK_UTILS = libscim-gtkutils@SCIM_EPOCH@.la
+endif
+
+lib_LTLIBRARIES = $(GTK_UTILS)
+
+libscim_gtkutils@SCIM_EPOCH@_la_SOURCES = scimstringview.c \
+ $(TRAY_ICON_SOURCE)
+
+libscim_gtkutils@SCIM_EPOCH@_la_CFLAGS = @GTK2_CFLAGS@
+libscim_gtkutils@SCIM_EPOCH@_la_CXXFLAGS= @GTK2_CFLAGS@
+
+libscim_gtkutils@SCIM_EPOCH@_la_LDFLAGS= -version-info $(SCIM_CURRENT):$(SCIM_REVISION):$(SCIM_AGE) \
+ -export-dynamic \
+ -rpath $(libdir) \
+ @LIBTOOL_EXPORT_OPTIONS@ \
+ @LTLIBINTL@ \
+ -lgtk-x11-2.0 -lgdk-x11-2.0 -lpango-1.0 -lglib-2.0 -lgobject-2.0
+
+libscim_gtkutils@SCIM_EPOCH@_la_LIBADD= $(top_builddir)/ism/src/libscim@SCIM_EPOCH@.la
+
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+#include <string.h>
+#include <stdio.h>
+
+#include <glib.h>
+#include <gtk/gtk.h>
+#include <gdk/gdk.h>
+#include <gdk/gdkkeysyms.h>
+
+#define Uses_SCIM_EVENT
+
+#include "scim_private.h"
+#include "scim.h"
+#include "scimkeyselection.h"
+
+#undef GDK_WINDOWING_X11
+#ifdef GDK_WINDOWING_X11
+#include <X11/Xlib.h>
+#include <gdk/gdkx.h>
+#include "scim_x11_utils.h"
+#endif
+
+#define WINDOW_WIDTH 320
+#define WINDOW_HEIGHT 320
+#define INDICATOR_HEIGHT 23
+
+using namespace scim;
+
+enum {
+ KEY_SELECTION_CHANGED,
+ LAST_SIGNAL
+};
+
+struct KeyGrabData {
+ KeyEvent key;
+};
+
+/* GObject, GtkObject methods
+ */
+
+static void scim_key_selection_class_init (ScimKeySelectionClass *klass);
+static void scim_key_selection_init (ScimKeySelection *keyselection);
+static void scim_key_selection_finalize (GObject *object);
+
+static void scim_key_selection_add_key_button_callback (GtkButton *button,
+ ScimKeySelection *keyselection);
+
+static void scim_key_selection_del_key_button_callback (GtkButton *button,
+ ScimKeySelection *keyselection);
+
+static void scim_key_selection_list_changed_callback (GtkTreeSelection *selection,
+ ScimKeySelection *keyselection);
+
+static void scim_key_grab_button_callback (GtkButton *button,
+ ScimKeySelection *keyselection);
+
+static gboolean scim_key_grab_press_callback (GtkDialog *dialog,
+ GdkEventKey *event,
+ KeyGrabData *data);
+
+static gboolean scim_key_grab_release_callback (GtkDialog *dialog,
+ GdkEventKey *event,
+ KeyGrabData *data);
+
+static void scim_key_selection_set_key_event (ScimKeySelection *keyselection,
+ KeyEvent event);
+
+static GtkWidgetClass *parent_class = NULL;
+
+static gint key_selection_signals[LAST_SIGNAL] = { 0 };
+
+static GType key_selection_type = 0;
+
+void
+scim_key_selection_register_type (GTypeModule *type_module)
+{
+ static const GTypeInfo key_selection_info =
+ {
+ sizeof (ScimKeySelectionClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) scim_key_selection_class_init,
+ NULL,
+ NULL,
+ sizeof (ScimKeySelection),
+ 0,
+ (GInstanceInitFunc) scim_key_selection_init,
+ };
+
+ if (!key_selection_type) {
+ if (type_module)
+ key_selection_type = g_type_module_register_type (
+ type_module,
+ GTK_TYPE_VBOX,
+ "SCIM_ScimKeySelection",
+ &key_selection_info,
+ (GTypeFlags) 0);
+ else
+ key_selection_type = g_type_register_static (
+ GTK_TYPE_VBOX,
+ "SCIM_ScimKeySelection",
+ &key_selection_info,
+ (GTypeFlags) 0);
+ }
+}
+
+GType
+scim_key_selection_get_type (void)
+{
+ if (!key_selection_type)
+ scim_key_selection_register_type (NULL);
+
+ return key_selection_type;
+}
+
+static void
+scim_key_selection_class_init (ScimKeySelectionClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GtkObjectClass *object_class;
+ GtkWidgetClass *widget_class;
+
+ object_class = (GtkObjectClass*) klass;
+ widget_class = (GtkWidgetClass*) klass;
+ parent_class = (GtkWidgetClass*) g_type_class_peek_parent (klass);
+
+ gobject_class->finalize = scim_key_selection_finalize;
+
+ key_selection_signals[KEY_SELECTION_CHANGED] =
+ g_signal_new ("key-selection-changed",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (ScimKeySelectionClass, changed),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ klass->changed = NULL;
+}
+
+static void
+scim_key_selection_init (ScimKeySelection *keyselection)
+{
+ GtkWidget *table;
+ GtkWidget *hbox;
+ GtkWidget *frame;
+ GtkWidget *label;
+
+ GtkWidget *scrolledwindow;
+ GtkWidget *button;
+
+ GtkCellRenderer *list_cell;
+ GtkTreeViewColumn *list_column;
+
+ frame = gtk_frame_new (NULL);
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (keyselection), frame, TRUE, TRUE, 0);
+
+ label = gtk_label_new (NULL);
+ gtk_label_set_text_with_mnemonic (GTK_LABEL (label), _("Selected _Keys:"));
+ gtk_widget_show (label);
+ gtk_frame_set_label_widget (GTK_FRAME (frame), label);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
+
+ // Create keys list view
+ scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
+ gtk_widget_show (scrolledwindow);
+ gtk_container_add (GTK_CONTAINER(frame), scrolledwindow);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
+ GTK_SHADOW_ETCHED_IN);
+
+ keyselection->list_view = gtk_tree_view_new ();
+ gtk_widget_show (keyselection->list_view);
+ gtk_container_add (GTK_CONTAINER (scrolledwindow), keyselection->list_view);
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (keyselection->list_view), FALSE);
+
+ gtk_label_set_mnemonic_widget (GTK_LABEL (label), keyselection->list_view);
+
+ keyselection->list_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (keyselection->list_view));
+ gtk_tree_selection_set_mode (keyselection->list_selection, GTK_SELECTION_BROWSE);
+
+ g_signal_connect (G_OBJECT (keyselection->list_selection), "changed",
+ G_CALLBACK (scim_key_selection_list_changed_callback),
+ keyselection);
+
+ // Create key list column.
+ list_cell = gtk_cell_renderer_text_new ();
+ list_column = gtk_tree_view_column_new_with_attributes (
+ NULL, list_cell, "text", 0, NULL);
+
+ gtk_tree_view_append_column (GTK_TREE_VIEW (keyselection->list_view), list_column);
+
+ // Create key list model
+ keyselection->list_model = gtk_list_store_new (1, G_TYPE_STRING);
+
+ gtk_tree_view_set_model (GTK_TREE_VIEW (keyselection->list_view),
+ GTK_TREE_MODEL (keyselection->list_model));
+
+ table = gtk_table_new (2, 3, FALSE);
+ gtk_widget_show (table);
+ gtk_box_pack_start (GTK_BOX (keyselection), table, FALSE, FALSE, 0);
+
+ label = gtk_label_new (_("Key Code:"));
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
+ (GtkAttachOptions) (0), 0, 0);
+
+ keyselection->key_code = gtk_entry_new ();
+ gtk_widget_show (keyselection->key_code);
+ gtk_box_pack_start (GTK_BOX (hbox), keyselection->key_code, TRUE, TRUE, 2);
+ gtk_entry_set_editable (GTK_ENTRY (keyselection->key_code), FALSE);
+
+ button = gtk_button_new_with_label (_("....."));
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 2);
+ g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (scim_key_grab_button_callback), keyselection);
+
+ label = gtk_label_new (_("Modifiers:"));
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
+ (GtkAttachOptions) (0), 0, 0);
+
+ keyselection->toggle_ctrl = gtk_check_button_new_with_mnemonic (_("_Ctrl"));
+ gtk_widget_show (keyselection->toggle_ctrl);
+ gtk_box_pack_start (GTK_BOX (hbox), keyselection->toggle_ctrl, TRUE, TRUE, 0);
+
+ keyselection->toggle_alt = gtk_check_button_new_with_mnemonic (_("A_lt"));
+ gtk_widget_show (keyselection->toggle_alt);
+ gtk_box_pack_start (GTK_BOX (hbox), keyselection->toggle_alt, TRUE, TRUE, 0);
+
+ keyselection->toggle_shift = gtk_check_button_new_with_mnemonic (_("_Shift"));
+ gtk_widget_show (keyselection->toggle_shift);
+ gtk_box_pack_start (GTK_BOX (hbox), keyselection->toggle_shift, TRUE, TRUE, 0);
+
+ keyselection->toggle_release = gtk_check_button_new_with_mnemonic (_("_Release"));
+// gtk_widget_show (keyselection->toggle_release);
+ gtk_box_pack_start (GTK_BOX (hbox), keyselection->toggle_release, TRUE, TRUE, 2);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 1, 2, 2, 3,
+ (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
+ (GtkAttachOptions) (0), 0, 0);
+
+ keyselection->toggle_meta = gtk_check_button_new_with_mnemonic (_("_Meta"));
+ gtk_widget_show (keyselection->toggle_meta);
+ gtk_box_pack_start (GTK_BOX (hbox), keyselection->toggle_meta, TRUE, TRUE, 0);
+
+ keyselection->toggle_super = gtk_check_button_new_with_mnemonic (_("S_uper"));
+ gtk_widget_show (keyselection->toggle_super);
+ gtk_box_pack_start (GTK_BOX (hbox), keyselection->toggle_super, TRUE, TRUE, 0);
+
+ keyselection->toggle_hyper = gtk_check_button_new_with_mnemonic (_("_Hyper"));
+ gtk_widget_show (keyselection->toggle_hyper);
+ gtk_box_pack_start (GTK_BOX (hbox), keyselection->toggle_hyper, TRUE, TRUE, 0);
+
+ hbox = gtk_hbox_new (TRUE, 0);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (keyselection), hbox, FALSE, FALSE, 4);
+
+ button = gtk_button_new_from_stock ("gtk-add");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 4);
+ g_signal_connect ((gpointer) button, "clicked",
+ G_CALLBACK (scim_key_selection_add_key_button_callback),
+ keyselection);
+
+ button = gtk_button_new_from_stock ("gtk-delete");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 4);
+ g_signal_connect ((gpointer) button, "clicked",
+ G_CALLBACK (scim_key_selection_del_key_button_callback),
+ keyselection);
+
+ // Create key names list
+ keyselection->keys = NULL;
+}
+
+static void
+scim_key_selection_finalize (GObject *object)
+{
+ ScimKeySelection *keyselection = SCIM_KEY_SELECTION (object);
+ if (keyselection->keys)
+ g_free (keyselection->keys);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+scim_key_selection_add_key_button_callback (GtkButton *button,
+ ScimKeySelection *keyselection)
+{
+ GtkTreeIter iter;
+ String key;
+ String key_code;
+
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (keyselection->toggle_ctrl)))
+ key += String ("Control+");
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (keyselection->toggle_alt)))
+ key += String ("Alt+");
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (keyselection->toggle_shift)))
+ key += String ("Shift+");
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (keyselection->toggle_meta)))
+ key += String ("Meta+");
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (keyselection->toggle_super)))
+ key += String ("Super+");
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (keyselection->toggle_hyper)))
+ key += String ("Hyper+");
+
+ key_code = String (gtk_entry_get_text (GTK_ENTRY (keyselection->key_code)));
+ if (!key_code.length ()){
+ // empty key code is not allowed.
+ GtkWidget *dialog;
+ dialog = gtk_message_dialog_new (NULL,
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_CLOSE,
+ _("Please enter a Key Code first."));
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+ return;
+ }
+ key += key_code;
+
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (keyselection->toggle_release)))
+ key += String ("+KeyRelease");
+
+ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (keyselection->list_model), &iter)) {
+ gchar * keystr;
+
+ do {
+ gtk_tree_model_get (GTK_TREE_MODEL (keyselection->list_model), &iter,
+ 0, &keystr, -1);
+
+ if (keystr && String (keystr) == key)
+ return;
+
+ } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (keyselection->list_model), &iter));
+ }
+
+ gtk_list_store_append (keyselection->list_model, &iter);
+ gtk_list_store_set (keyselection->list_model, &iter,
+ 0, key.c_str (), -1);
+
+ g_signal_emit_by_name (keyselection, "key-selection-changed");
+}
+
+static void
+scim_key_selection_del_key_button_callback (GtkButton *button,
+ ScimKeySelection *keyselection)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+
+ if (gtk_tree_selection_get_selected (keyselection->list_selection, &model, &iter)) {
+ gtk_list_store_remove (keyselection->list_model, &iter);
+ g_signal_emit_by_name (keyselection, "key-selection-changed");
+ }
+}
+
+static void
+scim_key_grab_button_callback (GtkButton *button,
+ ScimKeySelection *keyselection)
+{
+ KeyGrabData key_grab_data;
+ GtkWidget *dialog;
+
+ dialog = gtk_message_dialog_new (NULL,
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_INFO,
+ GTK_BUTTONS_CANCEL,
+ _("Press a key (or a key combination).\n"
+ "This dialog will be closed \n"
+ "when the key is released."));
+
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Grabbing a key."));
+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
+
+ g_signal_connect (G_OBJECT (dialog), "key-press-event",
+ G_CALLBACK (scim_key_grab_press_callback), &key_grab_data);
+
+ g_signal_connect (G_OBJECT (dialog), "key-release-event",
+ G_CALLBACK (scim_key_grab_release_callback), &key_grab_data);
+
+ if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) {
+ scim_key_selection_set_key_event (keyselection, key_grab_data.key);
+ }
+
+ gtk_widget_destroy (dialog);
+}
+
+static KeyEvent
+keyevent_gdk_to_scim (const GdkEventKey &gdkevent)
+{
+ KeyEvent key;
+
+ // Use Key Symbole provided by gtk.
+ key.code = gdkevent.keyval;
+
+#ifdef GDK_WINDOWING_X11
+ key.mask = scim_x11_keymask_x11_to_scim (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), gdkevent.state);
+#else
+ if (gdkevent.state & GDK_SHIFT_MASK) key.mask |=SCIM_KEY_ShiftMask;
+ if (gdkevent.state & GDK_LOCK_MASK) key.mask |=SCIM_KEY_CapsLockMask;
+ if (gdkevent.state & GDK_CONTROL_MASK) key.mask |=SCIM_KEY_ControlMask;
+ if (gdkevent.state & GDK_MOD1_MASK) key.mask |=SCIM_KEY_AltMask;
+ if (gdkevent.state & GDK_MOD2_MASK) key.mask |=SCIM_KEY_NumLockMask;
+#endif
+
+ if (gdkevent.type == GDK_KEY_RELEASE) key.mask |= SCIM_KEY_ReleaseMask;
+
+ return key;
+}
+
+static gboolean
+scim_key_grab_press_callback (GtkDialog *dialog,
+ GdkEventKey *event,
+ KeyGrabData *data)
+{
+ data->key = keyevent_gdk_to_scim (*event);
+
+ return TRUE;
+}
+
+static gboolean
+scim_key_grab_release_callback (GtkDialog *dialog,
+ GdkEventKey *event,
+ KeyGrabData *data)
+{
+ KeyEvent key = keyevent_gdk_to_scim (*event);
+
+ if (key.code == data->key.code) {
+ data->key.mask = key.mask;
+ if (data->key.code >= SCIM_KEY_Shift_L && data->key.code <= SCIM_KEY_Hyper_R)
+ data->key.mask |= SCIM_KEY_ReleaseMask;
+ else
+ data->key.mask &= (~ SCIM_KEY_ReleaseMask);
+
+ gtk_dialog_response (dialog, GTK_RESPONSE_OK);
+ } else {
+ gtk_dialog_response (dialog, GTK_RESPONSE_CANCEL);
+ }
+
+ return TRUE;
+}
+
+/* public api
+ */
+GtkWidget*
+scim_key_selection_new (void)
+{
+ return GTK_WIDGET (gtk_type_new (SCIM_TYPE_KEY_SELECTION));
+}
+
+void
+scim_key_selection_append_keys (ScimKeySelection *keyselection,
+ const gchar *keys)
+{
+ g_return_if_fail (SCIM_IS_KEY_SELECTION (keyselection));
+ g_return_if_fail (keys != NULL);
+
+ KeyEventList keylist;
+
+ if (!scim_string_to_key_list (keylist, keys))
+ return;
+
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+
+ String str;
+
+ for (size_t i = 0; i < keylist.size (); ++ i) {
+ if (scim_key_to_string (str, keylist [i])) {
+ gtk_list_store_append (keyselection->list_model, &iter);
+ gtk_list_store_set (keyselection->list_model, &iter,
+ 0, str.c_str (), -1);
+ }
+ }
+}
+
+void
+scim_key_selection_set_keys (ScimKeySelection *keyselection,
+ const gchar *keys)
+{
+ g_return_if_fail (SCIM_IS_KEY_SELECTION (keyselection));
+
+ gtk_list_store_clear (keyselection->list_model);
+ scim_key_selection_append_keys (keyselection, keys);
+}
+
+G_CONST_RETURN gchar*
+scim_key_selection_get_keys (ScimKeySelection *keyselection)
+{
+ g_return_val_if_fail (SCIM_IS_KEY_SELECTION (keyselection), NULL);
+
+ if (keyselection->keys)
+ g_free (keyselection->keys);
+
+ keyselection->keys = NULL;
+
+ GtkTreeIter iter;
+
+ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (keyselection->list_model), &iter)) {
+ std::vector <String> keylist;
+ gchar * keystr;
+
+ do {
+ gtk_tree_model_get (GTK_TREE_MODEL (keyselection->list_model), &iter,
+ 0, &keystr, -1);
+
+ if (keystr) keylist.push_back (keystr);
+ } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (keyselection->list_model), &iter));
+
+ if (keylist.size ())
+ keyselection->keys = g_strdup (scim_combine_string_list (keylist).c_str ());
+ }
+
+ return keyselection->keys;
+}
+
+static void
+scim_key_selection_list_changed_callback (GtkTreeSelection *selection,
+ ScimKeySelection *keyselection)
+{
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gchar *keystr;
+
+ KeyEvent keyevent;
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
+ gtk_tree_model_get (model, &iter, 0, &keystr, -1);
+
+ if (scim_string_to_key (keyevent, String (keystr)))
+ scim_key_selection_set_key_event (keyselection, keyevent);
+ }
+}
+
+static void
+scim_key_selection_set_key_event (ScimKeySelection *keyselection,
+ KeyEvent event)
+{
+ g_return_if_fail (SCIM_IS_KEY_SELECTION (keyselection));
+
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON (keyselection->toggle_ctrl),
+ event.is_control_down ());
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON (keyselection->toggle_alt),
+ event.is_alt_down ());
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON (keyselection->toggle_shift),
+ event.is_shift_down ());
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON (keyselection->toggle_meta),
+ event.is_meta_down ());
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON (keyselection->toggle_super),
+ event.is_super_down ());
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON (keyselection->toggle_hyper),
+ event.is_hyper_down ());
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON (keyselection->toggle_release),
+ event.is_key_release ());
+
+ event.mask = 0;
+ String str;
+
+ if (scim_key_to_string (str, event)) {
+ gtk_entry_set_text (GTK_ENTRY (keyselection->key_code),
+ str.c_str ());
+ }
+}
+
+/*****************************************************************************
+ * ScimKeySelectionDialog
+ *****************************************************************************/
+static GtkWidgetClass *dialog_parent_class = NULL;
+
+static GType key_selection_dialog_type = 0;
+
+static void scim_key_selection_dialog_class_init (ScimKeySelectionDialogClass *klass);
+static void scim_key_selection_dialog_init (ScimKeySelectionDialog *keyseldialog);
+
+void
+scim_key_selection_dialog_register_type (GTypeModule *type_module)
+{
+ static const GTypeInfo key_selection_dialog_info =
+ {
+ sizeof (ScimKeySelectionDialogClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) scim_key_selection_dialog_class_init,
+ NULL,
+ NULL,
+ sizeof (ScimKeySelectionDialog),
+ 0,
+ (GInstanceInitFunc) scim_key_selection_dialog_init,
+ };
+
+ if (!key_selection_dialog_type) {
+ if (type_module)
+ key_selection_dialog_type = g_type_module_register_type (
+ type_module,
+ GTK_TYPE_DIALOG,
+ "SCIM_ScimKeySelectionDialog",
+ &key_selection_dialog_info,
+ (GTypeFlags) 0);
+ else
+ key_selection_dialog_type = g_type_register_static (
+ GTK_TYPE_DIALOG,
+ "SCIM_ScimKeySelectionDialog",
+ &key_selection_dialog_info,
+ (GTypeFlags) 0);
+ }
+}
+
+GType
+scim_key_selection_dialog_get_type (void)
+{
+ if (!key_selection_dialog_type)
+ scim_key_selection_dialog_register_type (NULL);
+
+ return key_selection_dialog_type;
+}
+
+static void
+scim_key_selection_dialog_class_init (ScimKeySelectionDialogClass *klass)
+{
+ dialog_parent_class = (GtkWidgetClass*) g_type_class_peek_parent (klass);
+}
+
+static void
+scim_key_selection_dialog_init (ScimKeySelectionDialog *keyseldialog)
+{
+ GtkDialog *dialog;
+
+ gtk_widget_push_composite_child ();
+
+ dialog = GTK_DIALOG (keyseldialog);
+
+ gtk_container_set_border_width (GTK_CONTAINER (keyseldialog), 4);
+ gtk_window_set_resizable (GTK_WINDOW (keyseldialog), TRUE);
+
+ keyseldialog->main_vbox = dialog->vbox;
+
+ keyseldialog->keysel = scim_key_selection_new ();
+ gtk_container_set_border_width (GTK_CONTAINER (keyseldialog->keysel), 4);
+ gtk_widget_show (keyseldialog->keysel);
+ gtk_box_pack_start (GTK_BOX (keyseldialog->main_vbox),
+ keyseldialog->keysel, TRUE, TRUE, 0);
+
+ /* Create the action area */
+ keyseldialog->action_area = dialog->action_area;
+
+ keyseldialog->cancel_button = gtk_dialog_add_button (dialog,
+ "_Cancel",
+ GTK_RESPONSE_CANCEL);
+
+ keyseldialog->ok_button = gtk_dialog_add_button (dialog,
+ "_Ok",
+ GTK_RESPONSE_OK);
+ gtk_widget_grab_default (keyseldialog->ok_button);
+
+ gtk_window_set_title (GTK_WINDOW (keyseldialog),
+ _("Key Selection"));
+
+ gtk_dialog_set_has_separator (GTK_DIALOG (dialog), TRUE);
+
+ gtk_widget_pop_composite_child ();
+
+ gint window_width = WINDOW_WIDTH;
+ gint window_height = WINDOW_HEIGHT;
+ gint indicator_height = INDICATOR_HEIGHT;
+#ifndef ENABLE_X86_HOST
+ GtkSettings *settings;
+ settings = gtk_widget_get_settings (GTK_WIDGET (keyseldialog));
+ g_object_get (settings, "gtk-indicator-height", &indicator_height, NULL);
+
+ window_width = gdk_screen_width ();
+ window_height = gdk_screen_height ();
+#endif
+ gtk_widget_set_size_request (GTK_WIDGET (keyseldialog),
+ window_width, window_height - indicator_height);
+ gtk_window_move (GTK_WINDOW (keyseldialog), 0, indicator_height);
+}
+
+GtkWidget*
+scim_key_selection_dialog_new (const gchar *title)
+{
+ ScimKeySelectionDialog *keyseldialog;
+
+ keyseldialog= (ScimKeySelectionDialog *) g_object_new (SCIM_TYPE_KEY_SELECTION_DIALOG, NULL);
+
+ if (title)
+ gtk_window_set_title (GTK_WINDOW (keyseldialog), title);
+
+ return GTK_WIDGET (keyseldialog);
+}
+
+G_CONST_RETURN gchar*
+scim_key_selection_dialog_get_keys (ScimKeySelectionDialog *ksd)
+{
+ return scim_key_selection_get_keys (SCIM_KEY_SELECTION (ksd->keysel));
+}
+
+void
+scim_key_selection_dialog_set_keys (ScimKeySelectionDialog *ksd,
+ const gchar *keys)
+{
+ return scim_key_selection_set_keys (SCIM_KEY_SELECTION (ksd->keysel), keys);
+}
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+#ifndef __SCIM_KEY_SELECTION_H__
+#define __SCIM_KEY_SELECTION_H__
+
+#include <gtk/gtk.h>
+#include <scim.h>
+
+G_BEGIN_DECLS
+
+#define SCIM_TYPE_KEY_SELECTION (scim_key_selection_get_type ())
+#define SCIM_KEY_SELECTION(obj) (GTK_CHECK_CAST ((obj), SCIM_TYPE_KEY_SELECTION, ScimKeySelection))
+#define SCIM_KEY_SELECTION_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), SCIM_TYPE_KEY_SELECTION, ScimKeySelectionClass))
+#define SCIM_IS_KEY_SELECTION(obj) (GTK_CHECK_TYPE ((obj), SCIM_TYPE_KEY_SELECTION))
+#define SCIM_IS_KEY_SELECTION_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), SCIM_TYPE_KEY_SELECTION))
+#define SCIM_KEY_SELECTION_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), SCIM_TYPE_KEY_SELECTION, ScimKeySelectionClass))
+
+#define SCIM_TYPE_KEY_SELECTION_DIALOG (scim_key_selection_dialog_get_type ())
+#define SCIM_KEY_SELECTION_DIALOG(obj) (GTK_CHECK_CAST ((obj), SCIM_TYPE_KEY_SELECTION_DIALOG, ScimKeySelectionDialog))
+#define SCIM_KEY_SELECTION_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), SCIM_TYPE_KEY_SELECTION_DIALOG, ScimKeySelectionDialogClass))
+#define SCIM_IS_KEY_SELECTION_DIALOG(obj) (GTK_CHECK_TYPE ((obj), SCIM_TYPE_KEY_SELECTION_DIALOG))
+#define SCIM_IS_KEY_SELECTION_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), SCIM_TYPE_KEY_SELECTION_DIALOG))
+#define SCIM_KEY_SELECTION_DIALOG_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), SCIM_TYPE_KEY_SELECTION_DIALOG, ScimKeySelectionDialogClass))
+
+typedef struct _ScimKeySelection ScimKeySelection;
+typedef struct _ScimKeySelectionClass ScimKeySelectionClass;
+
+typedef struct _ScimKeySelectionDialog ScimKeySelectionDialog;
+typedef struct _ScimKeySelectionDialogClass ScimKeySelectionDialogClass;
+
+struct _ScimKeySelection
+{
+ GtkVBox vbox;
+
+ GtkWidget *toggle_ctrl;
+ GtkWidget *toggle_alt;
+ GtkWidget *toggle_shift;
+ GtkWidget *toggle_meta;
+ GtkWidget *toggle_super;
+ GtkWidget *toggle_hyper;
+ GtkWidget *toggle_release;
+ GtkWidget *key_code;
+
+ GtkWidget *list_view;
+ GtkTreeSelection *list_selection;
+ GtkListStore *list_model;
+
+ gchar *keys;
+};
+
+struct _ScimKeySelectionClass
+{
+ GtkVBoxClass parent_class;
+
+ void (*changed) (ScimKeySelection *keyselection);
+};
+
+struct _ScimKeySelectionDialog
+{
+ GtkDialog parent_instance;
+
+ GtkWidget *keysel;
+
+ GtkWidget *main_vbox;
+ GtkWidget *action_area;
+
+ GtkWidget *ok_button;
+ GtkWidget *cancel_button;
+};
+
+struct _ScimKeySelectionDialogClass
+{
+ GtkDialogClass parent_class;
+
+ /* Padding for future expansion */
+ void (*_gtk_reserved1) (void);
+ void (*_gtk_reserved2) (void);
+ void (*_gtk_reserved3) (void);
+ void (*_gtk_reserved4) (void);
+};
+
+GType scim_key_selection_get_type (void) G_GNUC_CONST;
+
+GtkWidget* scim_key_selection_new (void);
+
+void scim_key_selection_set_keys (ScimKeySelection *keyselection,
+ const gchar *keys);
+
+void scim_key_selection_append_keys (ScimKeySelection *keyselection,
+ const gchar *keys);
+
+
+G_CONST_RETURN gchar* scim_key_selection_get_keys (ScimKeySelection *keyselection);
+
+
+GType scim_key_selection_dialog_get_type (void) G_GNUC_CONST;
+GtkWidget* scim_key_selection_dialog_new (const gchar *title);
+void scim_key_selection_dialog_set_keys (ScimKeySelectionDialog *ksd,
+ const gchar *keys);
+G_CONST_RETURN gchar* scim_key_selection_dialog_get_keys (ScimKeySelectionDialog *ksd);
+
+G_END_DECLS
+
+#endif /* __GTK_KEY_SELECTION_H__ */
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+#include <string.h>
+#include <stdio.h>
+
+#include <pango/pango.h>
+
+#include <glib.h>
+#include <gtk/gtkmain.h>
+#include <gtk/gtksettings.h>
+#include <gtk/gtksignal.h>
+#include <gtk/gtkwindow.h>
+#include <gtk/gtkgc.h>
+#include <gtk/gtkstyle.h>
+
+#include "scim_private.h"
+#include "scimstringview.h"
+
+#define MIN_STRING_VIEW_WIDTH 64
+#define MAX_STRING_VIEW_WIDTH 400
+#define DRAW_TIMEOUT 20
+#define INNER_BORDER 2
+
+/* Initial size of buffer, in bytes */
+#define MIN_SIZE 16
+
+/* Maximum size of text buffer, in bytes */
+#define MAX_SIZE G_MAXUSHORT
+
+enum {
+ PROP_0,
+ PROP_DRAW_CURSOR,
+ PROP_CURSOR_POSITION,
+ PROP_AUTO_MOVE_CURSOR,
+ PROP_FORWARD_EVENT,
+ PROP_AUTO_RESIZE,
+ PROP_PRESS_MOVE_CURSOR,
+ PROP_MAX_LENGTH,
+ PROP_MAX_WIDTH,
+ PROP_HAS_FRAME,
+ PROP_WIDTH_CHARS,
+ PROP_SCROLL_OFFSET,
+ PROP_TEXT
+};
+
+enum {
+ MOVE_CURSOR,
+ LAST_SIGNAL
+};
+
+/* GObject, GtkObject methods
+ */
+static void scim_string_view_class_init (ScimStringViewClass *klass);
+static void scim_string_view_init (ScimStringView *string_view);
+static void scim_string_view_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void scim_string_view_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void scim_string_view_finalize (GObject *object);
+
+/* GtkWidget methods
+ */
+static void scim_string_view_realize (GtkWidget *widget);
+static void scim_string_view_unrealize (GtkWidget *widget);
+static void scim_string_view_size_request (GtkWidget *widget,
+ GtkRequisition *requisition);
+static void scim_string_view_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation);
+static void scim_string_view_draw_frame (GtkWidget *widget);
+static gint scim_string_view_expose (GtkWidget *widget,
+ GdkEventExpose *event);
+static gint scim_string_view_button_press (GtkWidget *widget,
+ GdkEventButton *event);
+static gint scim_string_view_button_release (GtkWidget *widget,
+ GdkEventButton *event);
+static gint scim_string_view_focus_in (GtkWidget *widget,
+ GdkEventFocus *event);
+static gint scim_string_view_focus_out (GtkWidget *widget,
+ GdkEventFocus *event);
+static void scim_string_view_style_set (GtkWidget *widget,
+ GtkStyle *previous_style);
+static void scim_string_view_direction_changed (GtkWidget *widget,
+ GtkTextDirection previous_dir);
+static void scim_string_view_state_changed (GtkWidget *widget,
+ GtkStateType previous_state);
+
+/* Internal routines
+ */
+static void scim_string_view_draw_text (ScimStringView *view);
+static void scim_string_view_draw_cursor (ScimStringView *view);
+static PangoLayout *scim_string_view_ensure_layout (ScimStringView *view);
+static void scim_string_view_queue_draw (ScimStringView *view);
+static void scim_string_view_recompute (ScimStringView *view);
+static gint scim_string_view_find_position (ScimStringView *view,
+ gint x);
+static void scim_string_view_get_cursor_locations (ScimStringView *view,
+ gint *strong_x,
+ gint *weak_x);
+static void scim_string_view_adjust_scroll (ScimStringView *view);
+static void get_text_area_size (ScimStringView *string_view,
+ gint *x,
+ gint *y,
+ gint *width,
+ gint *height);
+static void get_widget_window_size (ScimStringView *string_view,
+ gint *x,
+ gint *y,
+ gint *width,
+ gint *height);
+
+static void scim_string_view_keymap_direction_changed (GdkKeymap *keymap,
+ ScimStringView *string_view);
+
+static void scim_string_view_check_cursor_blink (ScimStringView *string_view);
+static void scim_string_view_move_cursor (ScimStringView *string_view,
+ guint position);
+
+static GtkWidgetClass *parent_class = NULL;
+
+static gint string_view_signals[LAST_SIGNAL] = { 0 };
+
+static GType string_view_type = 0;
+
+void
+scim_string_view_register_type (GTypeModule *type_module)
+{
+ static const GTypeInfo string_view_info =
+ {
+ sizeof (ScimStringViewClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) scim_string_view_class_init,
+ NULL,
+ NULL,
+ sizeof (ScimStringView),
+ 0,
+ (GInstanceInitFunc) scim_string_view_init,
+ };
+
+ if (!string_view_type)
+ {
+ if (type_module)
+ string_view_type = g_type_module_register_type (type_module,
+ GTK_TYPE_WIDGET,
+ "SCIM_ScimStringView",
+ &string_view_info,
+ (GTypeFlags) 0);
+ else
+ string_view_type = g_type_register_static (GTK_TYPE_WIDGET,
+ "SCIM_ScimStringView",
+ &string_view_info,
+ (GTypeFlags) 0);
+ }
+}
+
+GType
+scim_string_view_get_type (void)
+{
+ if (!string_view_type)
+ scim_string_view_register_type (NULL);
+
+ return string_view_type;
+}
+
+static void
+scim_string_view_class_init (ScimStringViewClass *class)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+ GtkObjectClass *object_class;
+ GtkWidgetClass *widget_class;
+
+ object_class = (GtkObjectClass*) class;
+ widget_class = (GtkWidgetClass*) class;
+ parent_class = gtk_type_class (GTK_TYPE_WIDGET);
+
+ gobject_class->finalize = scim_string_view_finalize;
+ gobject_class->set_property = scim_string_view_set_property;
+ gobject_class->get_property = scim_string_view_get_property;
+
+ widget_class->realize = scim_string_view_realize;
+ widget_class->unrealize = scim_string_view_unrealize;
+ widget_class->size_request = scim_string_view_size_request;
+ widget_class->size_allocate = scim_string_view_size_allocate;
+ widget_class->expose_event = scim_string_view_expose;
+ widget_class->button_press_event = scim_string_view_button_press;
+ widget_class->button_release_event = scim_string_view_button_release;
+ widget_class->focus_in_event = scim_string_view_focus_in;
+ widget_class->focus_out_event = scim_string_view_focus_out;
+ widget_class->style_set = scim_string_view_style_set;
+ widget_class->direction_changed = scim_string_view_direction_changed;
+ widget_class->state_changed = scim_string_view_state_changed;
+
+ class->move_cursor = scim_string_view_move_cursor;
+
+ g_object_class_install_property (gobject_class,
+ PROP_CURSOR_POSITION,
+ g_param_spec_int ("cursor_position",
+ _("Cursor Position"),
+ _("The current position of the insertion cursor in chars."),
+ 0,
+ MAX_SIZE,
+ 0,
+ G_PARAM_READABLE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_MAX_LENGTH,
+ g_param_spec_int ("max_length",
+ _("Maximum length"),
+ _("Maximum number of characters for this string view. Zero if no maximum."),
+ 0,
+ MAX_SIZE,
+ 0,
+ G_PARAM_READABLE | G_PARAM_WRITABLE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_MAX_WIDTH,
+ g_param_spec_int ("max_width",
+ _("Maximum width"),
+ _("Maximum width of this string view."),
+ 0,
+ MAX_STRING_VIEW_WIDTH,
+ 0,
+ G_PARAM_READABLE | G_PARAM_WRITABLE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_HAS_FRAME,
+ g_param_spec_boolean ("has_frame",
+ _("Has Frame"),
+ _("FALSE removes outside bevel from string view."),
+ TRUE,
+ G_PARAM_READABLE | G_PARAM_WRITABLE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_DRAW_CURSOR,
+ g_param_spec_boolean ("draw_cursor",
+ _("Draw cursor"),
+ _("TRUE draw blinking cursor."),
+ TRUE,
+ G_PARAM_READABLE | G_PARAM_WRITABLE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_AUTO_MOVE_CURSOR,
+ g_param_spec_boolean ("auto_move_cursor",
+ _("Auto move cursor"),
+ _("TRUE auto move cursor position when mouse clicking."),
+ FALSE,
+ G_PARAM_READABLE | G_PARAM_WRITABLE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_FORWARD_EVENT,
+ g_param_spec_boolean ("forward_event",
+ _("Forward button press/release event"),
+ _("TRUE forward button press/release event to user program."),
+ FALSE,
+ G_PARAM_READABLE | G_PARAM_WRITABLE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_FORWARD_EVENT,
+ g_param_spec_boolean ("auto_resize",
+ _("Auto resize the widget to fit the string"),
+ _("TRUE Auto resize on."),
+ FALSE,
+ G_PARAM_READABLE | G_PARAM_WRITABLE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_PRESS_MOVE_CURSOR,
+ g_param_spec_boolean ("press_move_cursor",
+ _("Emit move_cursor signal when press/release the string"),
+ _("TRUE Emit move_cursor signal when press the string."),
+ TRUE,
+ G_PARAM_READABLE | G_PARAM_WRITABLE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_WIDTH_CHARS,
+ g_param_spec_int ("width_chars",
+ _("Width in chars"),
+ _("Number of characters to leave space for in the string view."),
+ -1,
+ G_MAXINT,
+ -1,
+ G_PARAM_READABLE | G_PARAM_WRITABLE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_SCROLL_OFFSET,
+ g_param_spec_int ("scroll_offset",
+ _("Scroll offset"),
+ _("Number of pixels of the string view scrolled off the screen to the left"),
+ 0,
+ G_MAXINT,
+ 0,
+ G_PARAM_READABLE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_TEXT,
+ g_param_spec_string ("text",
+ _("Text"),
+ _("The contents of the string view"),
+ "",
+ G_PARAM_READABLE | G_PARAM_WRITABLE));
+
+ string_view_signals[MOVE_CURSOR] = g_signal_new ("move_cursor",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (ScimStringViewClass, move_cursor),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__UINT_POINTER,
+ G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_POINTER);
+
+}
+
+static void
+scim_string_view_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ ScimStringView *view = SCIM_STRING_VIEW (object);
+
+ switch (prop_id)
+ {
+ case PROP_MAX_LENGTH:
+ scim_string_view_set_max_length (view, g_value_get_int (value));
+ break;
+
+ case PROP_MAX_WIDTH:
+ scim_string_view_set_max_width (view, g_value_get_int (value));
+ break;
+
+ case PROP_HAS_FRAME:
+ scim_string_view_set_has_frame (view, g_value_get_boolean (value));
+ break;
+
+ case PROP_DRAW_CURSOR:
+ scim_string_view_set_draw_cursor (view, g_value_get_boolean (value));
+ break;
+
+ case PROP_AUTO_MOVE_CURSOR:
+ scim_string_view_set_auto_move_cursor (view, g_value_get_boolean (value));
+ break;
+
+ case PROP_FORWARD_EVENT:
+ scim_string_view_set_forward_event (view, g_value_get_boolean (value));
+ break;
+
+ case PROP_AUTO_RESIZE:
+ scim_string_view_set_auto_resize (view, g_value_get_boolean (value));
+ break;
+
+ case PROP_PRESS_MOVE_CURSOR:
+ scim_string_view_set_press_move_cursor (view, g_value_get_boolean (value));
+ break;
+
+ case PROP_WIDTH_CHARS:
+ scim_string_view_set_width_chars (view, g_value_get_int (value));
+ break;
+
+ case PROP_TEXT:
+ scim_string_view_set_text (view, g_value_get_string (value));
+ break;
+
+ case PROP_SCROLL_OFFSET:
+ case PROP_CURSOR_POSITION:
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+scim_string_view_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ ScimStringView *view = SCIM_STRING_VIEW (object);
+
+ switch (prop_id)
+ {
+ case PROP_CURSOR_POSITION:
+ g_value_set_int (value, view->current_pos);
+ break;
+ case PROP_MAX_LENGTH:
+ g_value_set_int (value, view->text_max_length);
+ break;
+ case PROP_MAX_WIDTH:
+ g_value_set_int (value, view->max_width);
+ break;
+ case PROP_HAS_FRAME:
+ g_value_set_boolean (value, view->has_frame);
+ break;
+ case PROP_DRAW_CURSOR:
+ g_value_set_boolean (value, view->draw_cursor);
+ break;
+ case PROP_AUTO_MOVE_CURSOR:
+ g_value_set_boolean (value, view->auto_move_cursor);
+ break;
+ case PROP_FORWARD_EVENT:
+ g_value_set_boolean (value, view->forward_event);
+ break;
+ case PROP_AUTO_RESIZE:
+ g_value_set_boolean (value, view->auto_resize);
+ break;
+ case PROP_PRESS_MOVE_CURSOR:
+ g_value_set_boolean (value, view->press_move_cursor);
+ break;
+ case PROP_WIDTH_CHARS:
+ g_value_set_int (value, view->width_chars);
+ break;
+ case PROP_SCROLL_OFFSET:
+ g_value_set_int (value, view->scroll_offset);
+ break;
+ case PROP_TEXT:
+ g_value_set_string (value, scim_string_view_get_text (view));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+scim_string_view_init (ScimStringView *string_view)
+{
+ GTK_WIDGET_SET_FLAGS (string_view, GTK_CAN_FOCUS);
+
+ string_view->text_size = MIN_SIZE;
+ string_view->text = g_malloc (string_view->text_size);
+ string_view->text[0] = '\0';
+
+ string_view->width_chars = -1;
+ string_view->has_frame = TRUE;
+ string_view->draw_cursor = TRUE;
+ string_view->auto_move_cursor = FALSE;
+ string_view->forward_event = FALSE;
+ string_view->press_move_cursor = TRUE;
+ string_view->separator_index = NULL;
+ string_view->divider = NULL;
+ string_view->max_width = -1;
+ string_view->highlight_start = -1;
+ string_view->highlight_end = -1;
+}
+
+static void
+scim_string_view_finalize (GObject *object)
+{
+ ScimStringView *view = SCIM_STRING_VIEW (object);
+
+ if (view->cached_layout)
+ g_object_unref (G_OBJECT (view->cached_layout));
+
+
+ if (view->blink_timeout)
+ g_source_remove (view->blink_timeout);
+
+ if (view->recompute_idle)
+ g_source_remove (view->recompute_idle);
+
+ view->text_size = 0;
+
+ if (view->text)
+ g_free (view->text);
+ view->text = NULL;
+
+ if (view->attrs)
+ pango_attr_list_unref (view->attrs);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+scim_string_view_realize (GtkWidget *widget)
+{
+ ScimStringView *string_view;
+ GdkWindowAttr attributes;
+ gint attributes_mask;
+
+ GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
+ string_view = SCIM_STRING_VIEW (widget);
+
+ attributes.window_type = GDK_WINDOW_CHILD;
+
+ get_widget_window_size (string_view, &attributes.x, &attributes.y, &attributes.width, &attributes.height);
+
+ attributes.wclass = GDK_INPUT_OUTPUT;
+ attributes.visual = gtk_widget_get_visual (widget);
+ attributes.colormap = gtk_widget_get_colormap (widget);
+ attributes.event_mask = gtk_widget_get_events (widget);
+ attributes.event_mask |= (GDK_EXPOSURE_MASK |
+ GDK_BUTTON_PRESS_MASK |
+ GDK_BUTTON_RELEASE_MASK);
+
+ attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+
+ widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask);
+ gdk_window_set_user_data (widget->window, string_view);
+
+ get_text_area_size (string_view, &attributes.x, &attributes.y, &attributes.width, &attributes.height);
+
+#ifdef ENABLE_CHANGE_CURSOR
+ attributes.cursor = gdk_cursor_new (GDK_XTERM);
+ attributes_mask |= GDK_WA_CURSOR;
+#endif
+
+ string_view->text_area = gdk_window_new (widget->window, &attributes, attributes_mask);
+ gdk_window_set_user_data (string_view->text_area, string_view);
+
+#ifdef ENABLE_CHANGE_CURSOR
+ gdk_cursor_unref (attributes.cursor);
+#endif
+
+ widget->style = gtk_style_attach (widget->style, widget->window);
+
+ gdk_window_set_background (widget->window, &widget->style->base[GTK_WIDGET_STATE (widget)]);
+ gdk_window_set_background (string_view->text_area, &widget->style->base[GTK_WIDGET_STATE (widget)]);
+
+ gdk_window_show (string_view->text_area);
+
+ scim_string_view_adjust_scroll (string_view);
+}
+
+static void
+scim_string_view_unrealize (GtkWidget *widget)
+{
+ ScimStringView *string_view = SCIM_STRING_VIEW (widget);
+
+ if (string_view->text_area)
+ {
+ gdk_window_set_user_data (string_view->text_area, NULL);
+ gdk_window_destroy (string_view->text_area);
+ string_view->text_area = NULL;
+ }
+
+ if (GTK_WIDGET_CLASS (parent_class)->unrealize)
+ (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
+}
+
+static void
+get_borders (ScimStringView *string_view,
+ gint *xborder,
+ gint *yborder)
+{
+ GtkWidget *widget = GTK_WIDGET (string_view);
+ gint focus_width;
+ gboolean interior_focus;
+
+ gtk_widget_style_get (widget,
+ "interior-focus", &interior_focus,
+ "focus-line-width", &focus_width,
+ NULL);
+
+ if (string_view->has_frame)
+ {
+ *xborder = widget->style->xthickness;
+ *yborder = widget->style->ythickness;
+ }
+ else
+ {
+ *xborder = 0;
+ *yborder = 0;
+ }
+
+ if (!interior_focus)
+ {
+ *xborder += focus_width;
+ *yborder += focus_width;
+ }
+}
+
+static void
+scim_string_view_size_request (GtkWidget *widget,
+ GtkRequisition *requisition)
+{
+ ScimStringView *string_view = SCIM_STRING_VIEW (widget);
+ PangoFontMetrics *metrics;
+ gint xborder, yborder;
+ PangoContext *context;
+ PangoLayout *layout;
+ int width, height;
+
+ context = gtk_widget_get_pango_context (widget);
+ metrics = pango_context_get_metrics (context,
+ widget->style->font_desc,
+ pango_context_get_language (context));
+
+ string_view->ascent = pango_font_metrics_get_ascent (metrics);
+ string_view->descent = pango_font_metrics_get_descent (metrics);
+
+ get_borders (string_view, &xborder, &yborder);
+
+ xborder += INNER_BORDER;
+ yborder += INNER_BORDER;
+
+ if (string_view->auto_resize) {
+ layout = scim_string_view_ensure_layout (string_view);
+ pango_layout_get_pixel_size (layout, &width, &height);
+ //requisition->width = ((width<MIN_STRING_VIEW_WIDTH)? MIN_STRING_VIEW_WIDTH : width) + 2;
+ requisition->width = width + 2;
+ } else {
+ if (string_view->width_chars < 0)
+ requisition->width = MIN_STRING_VIEW_WIDTH;
+ else
+ {
+ gint char_width = pango_font_metrics_get_approximate_char_width (metrics);
+ requisition->width = PANGO_PIXELS (char_width) * string_view->width_chars;
+ }
+ }
+
+ if (string_view->max_width > 0 && requisition->width > string_view->max_width)
+ requisition->width = string_view->max_width;
+
+ requisition->width += xborder * 2;
+ requisition->height = PANGO_PIXELS (string_view->ascent + string_view->descent) + yborder * 2;
+
+ pango_font_metrics_unref (metrics);
+}
+
+static void
+get_text_area_size (ScimStringView *string_view,
+ gint *x,
+ gint *y,
+ gint *width,
+ gint *height)
+{
+ gint xborder, yborder;
+ GtkRequisition requisition;
+ GtkWidget *widget = GTK_WIDGET (string_view);
+
+ gtk_widget_get_child_requisition (widget, &requisition);
+
+ get_borders (string_view, &xborder, &yborder);
+
+ if (x)
+ *x = xborder;
+
+ if (y)
+ *y = yborder;
+
+ if (width)
+ *width = GTK_WIDGET (string_view)->allocation.width - xborder * 2;
+
+ if (height)
+ *height = requisition.height - yborder * 2;
+}
+
+static void
+get_widget_window_size (ScimStringView *string_view,
+ gint *x,
+ gint *y,
+ gint *width,
+ gint *height)
+{
+ GtkRequisition requisition;
+ GtkWidget *widget = GTK_WIDGET (string_view);
+
+ gtk_widget_get_child_requisition (widget, &requisition);
+
+ if (x)
+ *x = widget->allocation.x;
+
+ if (y)
+ *y = widget->allocation.y + (widget->allocation.height - requisition.height) / 2;
+
+ if (width)
+ *width = widget->allocation.width;
+
+ if (height)
+ *height = requisition.height;
+}
+
+static void
+scim_string_view_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation)
+{
+ ScimStringView *string_view = SCIM_STRING_VIEW (widget);
+
+ widget->allocation = *allocation;
+
+ if (GTK_WIDGET_REALIZED (widget))
+ {
+ /* We call gtk_widget_get_child_requisition, since we want (for
+ * backwards compatibility reasons) the realization here to
+ * be affected by the usize of the string_view, if set
+ */
+ gint x, y, width, height;
+
+ get_widget_window_size (string_view, &x, &y, &width, &height);
+
+ gdk_window_move_resize (widget->window,
+ x, y, width, height);
+
+ get_text_area_size (string_view, &x, &y, &width, &height);
+
+ gdk_window_move_resize (string_view->text_area,
+ x, y, width, height);
+
+ scim_string_view_recompute (string_view);
+ }
+}
+
+static void
+scim_string_view_draw_frame (GtkWidget *widget)
+{
+ gint x = 0, y = 0;
+ gint width, height;
+ gboolean interior_focus;
+ gint focus_width;
+
+ gtk_widget_style_get (widget,
+ "interior-focus", &interior_focus,
+ "focus-line-width", &focus_width,
+ NULL);
+
+ gdk_window_get_size (widget->window, &width, &height);
+
+ if (GTK_WIDGET_HAS_FOCUS (widget) && !interior_focus)
+ {
+ x += focus_width;
+ y += focus_width;
+ width -= 2 * focus_width;
+ height -= 2 * focus_width;
+ }
+
+ gtk_paint_shadow (widget->style, widget->window,
+ GTK_STATE_NORMAL, GTK_SHADOW_IN,
+ NULL, widget, "entry",
+ x, y, width, height);
+
+ if (GTK_WIDGET_HAS_FOCUS (widget) && !interior_focus)
+ {
+ x -= focus_width;
+ y -= focus_width;
+ width += 2 * focus_width;
+ height += 2 * focus_width;
+
+ gtk_paint_focus (widget->style, widget->window, GTK_WIDGET_STATE (widget),
+ NULL, widget, "entry",
+ 0, 0, width, height);
+ }
+}
+
+static gint
+scim_string_view_expose (GtkWidget *widget,
+ GdkEventExpose *event)
+{
+ ScimStringView *string_view = SCIM_STRING_VIEW (widget);
+
+ if (widget->window == event->window)
+ scim_string_view_draw_frame (widget);
+ else if (string_view->text_area == event->window)
+ {
+ gint area_width, area_height;
+
+ get_text_area_size (string_view, NULL, NULL, &area_width, &area_height);
+
+ gtk_paint_flat_box (widget->style, string_view->text_area,
+ GTK_WIDGET_STATE(widget), GTK_SHADOW_NONE,
+ NULL, widget, "entry_bg",
+ 0, 0, area_width, area_height);
+
+ scim_string_view_draw_text (SCIM_STRING_VIEW (widget));
+
+ if (string_view->cursor_visible && string_view->draw_cursor)
+ scim_string_view_draw_cursor (SCIM_STRING_VIEW (widget));
+
+ }
+
+ return FALSE;
+}
+
+static gint
+scim_string_view_button_press (GtkWidget *widget,
+ GdkEventButton *event)
+{
+ ScimStringView *string_view = SCIM_STRING_VIEW (widget);
+
+ gint tmp_pos;
+
+ if (event->window != string_view->text_area)
+ return FALSE;
+
+ tmp_pos = scim_string_view_find_position (string_view, event->x + string_view->scroll_offset);
+
+ if (event->button == 1)
+ {
+ g_signal_emit (G_OBJECT (widget),
+ string_view_signals [MOVE_CURSOR],
+ 0,
+ tmp_pos, GINT_TO_POINTER (0));
+ return !string_view->forward_event;
+ }
+
+ return FALSE;
+}
+
+static gint
+scim_string_view_button_release (GtkWidget *widget,
+ GdkEventButton *event)
+{
+ ScimStringView *string_view = SCIM_STRING_VIEW (widget);
+
+ gint tmp_pos;
+
+ if (event->window != string_view->text_area)
+ return FALSE;
+
+ tmp_pos = scim_string_view_find_position (string_view, event->x + string_view->scroll_offset);
+
+ if (event->button == 1)
+ {
+ g_signal_emit (G_OBJECT (widget),
+ string_view_signals [MOVE_CURSOR],
+ 0,
+ tmp_pos, GINT_TO_POINTER (1));
+ return !string_view->forward_event;
+ }
+
+ return FALSE;
+}
+
+static gint
+scim_string_view_focus_in (GtkWidget *widget,
+ GdkEventFocus *event)
+{
+ ScimStringView *string_view = SCIM_STRING_VIEW (widget);
+
+ gtk_widget_queue_draw (widget);
+
+ g_signal_connect (gdk_keymap_get_default (),
+ "direction_changed",
+ G_CALLBACK (scim_string_view_keymap_direction_changed), string_view);
+
+ scim_string_view_check_cursor_blink (string_view);
+
+ return FALSE;
+}
+
+static gint
+scim_string_view_focus_out (GtkWidget *widget,
+ GdkEventFocus *event)
+{
+ ScimStringView *string_view = SCIM_STRING_VIEW (widget);
+
+ gtk_widget_queue_draw (widget);
+
+ scim_string_view_check_cursor_blink (string_view);
+
+ g_signal_handlers_disconnect_by_func (gdk_keymap_get_default (),
+ (gpointer) scim_string_view_keymap_direction_changed,
+ string_view);
+
+ return FALSE;
+}
+
+static void
+scim_string_view_direction_changed (GtkWidget *widget,
+ GtkTextDirection previous_dir)
+{
+ ScimStringView *string_view = SCIM_STRING_VIEW (widget);
+
+ scim_string_view_recompute (string_view);
+
+ GTK_WIDGET_CLASS (parent_class)->direction_changed (widget, previous_dir);
+}
+
+static void
+scim_string_view_state_changed (GtkWidget *widget,
+ GtkStateType previous_state)
+{
+ ScimStringView *string_view = SCIM_STRING_VIEW (widget);
+
+ if (GTK_WIDGET_REALIZED (widget))
+ {
+ gdk_window_set_background (widget->window, &widget->style->base[GTK_WIDGET_STATE (widget)]);
+ gdk_window_set_background (string_view->text_area, &widget->style->base[GTK_WIDGET_STATE (widget)]);
+ }
+
+ gtk_widget_queue_draw (widget);
+}
+
+
+static void
+scim_string_view_style_set (GtkWidget *widget,
+ GtkStyle *previous_style)
+{
+ ScimStringView *string_view = SCIM_STRING_VIEW (widget);
+
+ if (previous_style && GTK_WIDGET_REALIZED (widget))
+ {
+ scim_string_view_recompute (string_view);
+
+ gdk_window_set_background (widget->window, &widget->style->base[GTK_WIDGET_STATE (widget)]);
+ gdk_window_set_background (string_view->text_area, &widget->style->base[GTK_WIDGET_STATE (widget)]);
+ }
+}
+
+/* Default signal handlers
+ */
+
+static void
+scim_string_view_keymap_direction_changed (GdkKeymap *keymap,
+ ScimStringView *string_view)
+{
+ scim_string_view_queue_draw (string_view);
+}
+
+
+
+/* Internal functions
+ */
+
+
+static void
+scim_string_view_reset_layout (ScimStringView *string_view)
+{
+ if (string_view->cached_layout)
+ {
+ g_object_unref (G_OBJECT (string_view->cached_layout));
+ string_view->cached_layout = NULL;
+ }
+}
+
+static gboolean
+recompute_idle_func (gpointer data)
+{
+ ScimStringView *string_view;
+
+ GDK_THREADS_ENTER ();
+
+ string_view = SCIM_STRING_VIEW (data);
+
+ scim_string_view_adjust_scroll (string_view);
+ scim_string_view_queue_draw (string_view);
+
+ string_view->recompute_idle = 0;
+
+ GDK_THREADS_LEAVE ();
+
+ return FALSE;
+}
+
+static void
+scim_string_view_recompute (ScimStringView *string_view)
+{
+ scim_string_view_reset_layout (string_view);
+ scim_string_view_check_cursor_blink (string_view);
+
+ if (!string_view->recompute_idle)
+ {
+ string_view->recompute_idle = g_idle_add_full (G_PRIORITY_HIGH_IDLE + 15, /* between resize and redraw */
+ recompute_idle_func, string_view, NULL);
+ }
+}
+
+static PangoLayout *
+scim_string_view_create_layout (ScimStringView *string_view)
+{
+ PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET (string_view), NULL);
+
+ if (!string_view->attrs)
+ string_view->attrs = pango_attr_list_new ();
+
+ pango_layout_set_single_paragraph_mode (layout, TRUE);
+
+ pango_layout_set_text (layout, string_view->text, string_view->n_bytes);
+
+ pango_layout_set_attributes (layout, string_view->attrs);
+
+ return layout;
+}
+
+static PangoLayout *
+scim_string_view_ensure_layout (ScimStringView *string_view)
+{
+ if (!string_view->cached_layout)
+ {
+ string_view->cached_layout = scim_string_view_create_layout (string_view);
+ }
+
+ return string_view->cached_layout;
+}
+
+static void
+get_layout_position (ScimStringView *string_view,
+ gint *x,
+ gint *y)
+{
+ PangoLayout *layout;
+ PangoRectangle logical_rect;
+ gint area_width, area_height;
+ gint y_pos;
+ PangoLayoutLine *line;
+
+ layout = scim_string_view_ensure_layout (string_view);
+
+ get_text_area_size (string_view, NULL, NULL, &area_width, &area_height);
+
+ area_height = PANGO_SCALE * (area_height - 2 * INNER_BORDER);
+
+ line = pango_layout_get_lines (layout)->data;
+ pango_layout_line_get_extents (line, NULL, &logical_rect);
+
+ /* Align primarily for locale's ascent/descent */
+ y_pos = ((area_height - string_view->ascent - string_view->descent) / 2 +
+ string_view->ascent + logical_rect.y);
+
+ /* Now see if we need to adjust to fit in actual drawn string */
+ if (logical_rect.height > area_height)
+ y_pos = (area_height - logical_rect.height) / 2;
+ else if (y_pos < 0)
+ y_pos = 0;
+ else if (y_pos + logical_rect.height > area_height)
+ y_pos = area_height - logical_rect.height;
+
+ y_pos = INNER_BORDER + y_pos / PANGO_SCALE;
+
+ if (x)
+ *x = INNER_BORDER - string_view->scroll_offset;
+
+ if (y)
+ *y = y_pos;
+}
+
+static void
+scim_string_view_draw_text (ScimStringView *string_view)
+{
+ GtkWidget *widget;
+
+ if (GTK_WIDGET_DRAWABLE (string_view))
+ {
+ PangoLayout *layout = scim_string_view_ensure_layout (string_view);
+ gint x, y;
+
+ widget = GTK_WIDGET (string_view);
+
+ get_layout_position (string_view, &x, &y);
+
+ gdk_draw_layout (string_view->text_area, widget->style->text_gc [widget->state],
+ x, y,
+ layout);
+
+ gint width = 0;
+ gint height = 0;
+ gdk_drawable_get_size (string_view->text_area, &width, &height);
+
+ // draw separator
+ if (string_view->separator_index != NULL && string_view->divider != NULL)
+ {
+ gint j;
+ for (j = 1; ; j++)
+ {
+ if (string_view->separator_index[j] <= 0 || string_view->separator_index[j] >= string_view->text_length)
+ break;
+
+ gint *ranges;
+ gint n_ranges, i;
+ gint start_pos = string_view->separator_index[j];
+ gint end_pos = string_view->separator_index[j] + 1;
+ const gchar *text = pango_layout_get_text (layout);
+ gint start_index = g_utf8_offset_to_pointer (text, start_pos) - text;
+ gint end_index = g_utf8_offset_to_pointer (text, end_pos) - text;
+ GdkGC *text_gc;
+ GdkGC *selection_gc;
+ PangoLayoutLine *line;
+ PangoRectangle logical_rect;
+
+ line = pango_layout_get_lines (layout)->data;
+
+ pango_layout_line_get_x_ranges (line, start_index, end_index, &ranges, &n_ranges);
+
+ pango_layout_get_extents (layout, NULL, &logical_rect);
+
+ selection_gc = widget->style->base_gc [GTK_STATE_INSENSITIVE];
+ text_gc = widget->style->text_gc [GTK_STATE_INSENSITIVE];
+
+ for (i=0; i < n_ranges; i++)
+ {
+ GdkRectangle rect;
+
+ rect.x = INNER_BORDER - string_view->scroll_offset + ranges[2*i] / PANGO_SCALE;
+ rect.y = y;
+ rect.width = (ranges[2*i + 1] - ranges[2*i]) / PANGO_SCALE;
+ rect.height = logical_rect.height / PANGO_SCALE;
+
+ gdk_draw_drawable (string_view->text_area,
+ text_gc,
+ string_view->divider,
+ 0, 0,
+ rect.x, 3,
+ 2, height - 6);
+ }
+ g_free (ranges);
+ }
+ }
+
+ if (string_view->highlight_start >=0 &&
+ string_view->highlight_start < string_view->highlight_end &&
+ string_view->highlight_start < string_view->text_length)
+ {
+ gint *ranges;
+ gint n_ranges, i;
+ gint start_pos = string_view->highlight_start;
+ gint end_pos = (string_view->text_length > string_view->highlight_end)? string_view->highlight_end : string_view->text_length;
+ PangoRectangle logical_rect;
+ const gchar *text = pango_layout_get_text (layout);
+ gint start_index = g_utf8_offset_to_pointer (text, start_pos) - text;
+ gint end_index = g_utf8_offset_to_pointer (text, end_pos) - text;
+ GdkRegion *clip_region = gdk_region_new ();
+ GdkGC *text_gc;
+ GdkGC *selection_gc;
+ PangoLayoutLine *line;
+
+ line = pango_layout_get_lines (layout)->data;
+
+ pango_layout_line_get_x_ranges (line, start_index, end_index, &ranges, &n_ranges);
+
+ pango_layout_get_extents (layout, NULL, &logical_rect);
+
+ selection_gc = widget->style->base_gc [GTK_STATE_ACTIVE];
+ text_gc = widget->style->text_gc [GTK_STATE_ACTIVE];
+
+ for (i=0; i < n_ranges; ++i)
+ {
+ GdkRectangle rect;
+
+ rect.x = INNER_BORDER - string_view->scroll_offset + ranges[2*i] / PANGO_SCALE;
+ rect.y = y;
+ rect.width = (ranges[2*i + 1] - ranges[2*i]) / PANGO_SCALE;
+ rect.height = logical_rect.height / PANGO_SCALE;
+
+ if (i == n_ranges - 1)
+ gdk_draw_rectangle (string_view->text_area, selection_gc, TRUE,
+ rect.x + 2, 0, rect.width - 2, height);
+ else
+ gdk_draw_rectangle (string_view->text_area, selection_gc, TRUE,
+ rect.x, 0, rect.width, height);
+
+ gdk_region_union_with_rect (clip_region, &rect);
+ }
+
+ gdk_gc_set_clip_region (text_gc, clip_region);
+ gdk_draw_layout (string_view->text_area, text_gc,
+ x, y,
+ layout);
+ gdk_gc_set_clip_region (text_gc, NULL);
+
+ gdk_region_destroy (clip_region);
+ g_free (ranges);
+ }
+ }
+}
+
+#ifndef HAVE_GTK_DRAW_INSERTION_CURSOR
+typedef struct _CursorInfo CursorInfo;
+
+struct _CursorInfo
+{
+ GType for_type;
+ GdkGC *primary_gc;
+ GdkGC *secondary_gc;
+};
+
+static GdkGC *
+make_cursor_gc (GtkWidget *widget,
+ const gchar *property_name,
+ const GdkColor *fallback)
+{
+ GdkGCValues gc_values;
+ GdkGCValuesMask gc_values_mask;
+ GdkColor *cursor_color;
+
+ gtk_widget_style_get (widget, property_name, &cursor_color, NULL);
+
+ gc_values_mask = GDK_GC_FOREGROUND;
+ if (cursor_color)
+ {
+ gc_values.foreground = *cursor_color;
+ gdk_color_free (cursor_color);
+ }
+ else
+ gc_values.foreground = *fallback;
+
+ gdk_rgb_find_color (widget->style->colormap, &gc_values.foreground);
+ return gtk_gc_get (widget->style->depth, widget->style->colormap, &gc_values, gc_values_mask);
+}
+
+static GdkGC *
+get_insertion_cursor_gc (GtkWidget *widget,
+ gboolean is_primary)
+{
+ CursorInfo *cursor_info;
+
+ cursor_info = g_object_get_data (G_OBJECT (widget->style), "gtk-style-cursor-info");
+ if (!cursor_info)
+ {
+ cursor_info = g_new (CursorInfo, 1);
+ g_object_set_data (G_OBJECT (widget->style), "gtk-style-cursor-info", cursor_info);
+ cursor_info->primary_gc = NULL;
+ cursor_info->secondary_gc = NULL;
+ cursor_info->for_type = G_TYPE_INVALID;
+ }
+
+ /* We have to keep track of the type because gtk_widget_style_get()
+ * can return different results when called on the same property and
+ * same style but for different widgets. :-(. That is,
+ * GtkEntry::cursor-color = "red" in a style will modify the cursor
+ * color for entries but not for text view.
+ */
+ if (cursor_info->for_type != G_OBJECT_TYPE (widget))
+ {
+ cursor_info->for_type = G_OBJECT_TYPE (widget);
+ if (cursor_info->primary_gc)
+ {
+ gtk_gc_release (cursor_info->primary_gc);
+ cursor_info->primary_gc = NULL;
+ }
+ if (cursor_info->secondary_gc)
+ {
+ gtk_gc_release (cursor_info->secondary_gc);
+ cursor_info->secondary_gc = NULL;
+ }
+ }
+
+ if (is_primary)
+ {
+ if (!cursor_info->primary_gc)
+ cursor_info->primary_gc = make_cursor_gc (widget,
+ "cursor-color",
+ &widget->style->black);
+
+ return cursor_info->primary_gc;
+ }
+ else
+ {
+ static const GdkColor gray = { 0, 0x8888, 0x8888, 0x8888 };
+
+ if (!cursor_info->secondary_gc)
+ cursor_info->secondary_gc = make_cursor_gc (widget,
+ "secondary-cursor-color",
+ &gray);
+
+ return cursor_info->secondary_gc;
+ }
+}
+
+static void
+draw_insertion_cursor (GtkWidget *widget,
+ GdkDrawable *drawable,
+ GdkGC *gc,
+ GdkRectangle *location,
+ GtkTextDirection direction,
+ gboolean draw_arrow)
+{
+ gint stem_width;
+ gint arrow_width;
+ gint x, y;
+ gint i;
+ gfloat cursor_aspect_ratio;
+ gint offset;
+
+ g_return_if_fail (direction != GTK_TEXT_DIR_NONE);
+
+ gtk_widget_style_get (widget, "cursor-aspect-ratio", &cursor_aspect_ratio, NULL);
+
+ stem_width = location->height * cursor_aspect_ratio + 1;
+ arrow_width = stem_width + 1;
+
+ /* put (stem_width % 2) on the proper side of the cursor */
+ if (direction == GTK_TEXT_DIR_LTR)
+ offset = stem_width / 2;
+ else
+ offset = stem_width - stem_width / 2;
+
+ for (i = 0; i < stem_width; i++)
+ gdk_draw_line (drawable, gc,
+ location->x + i - offset, location->y,
+ location->x + i - offset, location->y + location->height - 1);
+
+ if (draw_arrow)
+ {
+ if (direction == GTK_TEXT_DIR_RTL)
+ {
+ x = location->x - offset - 1;
+ y = location->y + location->height - arrow_width * 2 - arrow_width + 1;
+
+ for (i = 0; i < arrow_width; i++)
+ {
+ gdk_draw_line (drawable, gc,
+ x, y + i + 1,
+ x, y + 2 * arrow_width - i - 1);
+ x --;
+ }
+ }
+ else if (direction == GTK_TEXT_DIR_LTR)
+ {
+ x = location->x + stem_width - offset;
+ y = location->y + location->height - arrow_width * 2 - arrow_width + 1;
+
+ for (i = 0; i < arrow_width; i++)
+ {
+ gdk_draw_line (drawable, gc,
+ x, y + i + 1,
+ x, y + 2 * arrow_width - i - 1);
+ x++;
+ }
+ }
+ }
+}
+
+static void
+scim_string_view_draw_insertion_cursor (GtkWidget *widget,
+ GdkDrawable *drawable,
+ GdkRectangle *area,
+ GdkRectangle *location,
+ gboolean is_primary,
+ GtkTextDirection direction,
+ gboolean draw_arrow)
+{
+ GdkGC *gc;
+
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+ g_return_if_fail (GDK_IS_DRAWABLE (drawable));
+ g_return_if_fail (location != NULL);
+ g_return_if_fail (direction != GTK_TEXT_DIR_NONE);
+
+ gc = get_insertion_cursor_gc (widget, is_primary);
+ if (area)
+ gdk_gc_set_clip_rectangle (gc, area);
+
+ draw_insertion_cursor (widget, drawable, gc,
+ location, direction, draw_arrow);
+
+ if (area)
+ gdk_gc_set_clip_rectangle (gc, NULL);
+}
+#else
+static void
+scim_string_view_draw_insertion_cursor (GtkWidget *widget,
+ GdkDrawable *drawable,
+ GdkRectangle *area,
+ GdkRectangle *location,
+ gboolean is_primary,
+ GtkTextDirection direction,
+ gboolean draw_arrow)
+{
+ gtk_draw_insertion_cursor (widget, drawable, area, location, is_primary, direction, draw_arrow);
+}
+#endif
+
+static void
+scim_string_view_draw_cursor (ScimStringView *string_view)
+{
+ GtkTextDirection keymap_direction =
+ (gdk_keymap_get_direction (gdk_keymap_get_default ()) == PANGO_DIRECTION_LTR) ?
+ GTK_TEXT_DIR_LTR : GTK_TEXT_DIR_RTL;
+ GtkTextDirection widget_direction = gtk_widget_get_direction (GTK_WIDGET (string_view));
+
+ if (GTK_WIDGET_DRAWABLE (string_view))
+ {
+ GtkWidget *widget = GTK_WIDGET (string_view);
+ GdkRectangle cursor_location;
+ GdkRectangle clip_area;
+ gboolean split_cursor;
+
+ gint xoffset = INNER_BORDER - string_view->scroll_offset;
+ gint strong_x, weak_x;
+ gint text_area_height;
+ gint text_area_width;
+ GtkTextDirection dir1 = GTK_TEXT_DIR_NONE;
+ GtkTextDirection dir2 = GTK_TEXT_DIR_NONE;
+ gint x1 = 0;
+ gint x2 = 0;
+
+ gdk_window_get_size (string_view->text_area, &text_area_width, &text_area_height);
+
+ scim_string_view_get_cursor_locations (string_view, &strong_x, &weak_x);
+
+ g_object_get (gtk_widget_get_settings (widget),
+ "gtk-split-cursor", &split_cursor,
+ NULL);
+
+ dir1 = widget_direction;
+
+ if (split_cursor)
+ {
+ x1 = strong_x;
+
+ if (weak_x != strong_x)
+ {
+ dir2 = (widget_direction == GTK_TEXT_DIR_LTR) ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
+ x2 = weak_x;
+ }
+ }
+ else
+ {
+ if (keymap_direction == widget_direction)
+ x1 = strong_x;
+ else
+ x1 = weak_x;
+ }
+
+ cursor_location.x = xoffset + x1;
+ cursor_location.y = INNER_BORDER;
+ cursor_location.width = 0;
+ cursor_location.height = text_area_height - 2 * INNER_BORDER ;
+
+ clip_area.x = 0;
+ clip_area.y = 0;
+ clip_area.width = text_area_width;
+ clip_area.height = text_area_height;
+
+ scim_string_view_draw_insertion_cursor (widget,
+ string_view->text_area,
+ &clip_area,
+ &cursor_location,
+ TRUE,
+ dir1,
+ dir2 != GTK_TEXT_DIR_NONE);
+
+ if (dir2 != GTK_TEXT_DIR_NONE)
+ {
+ cursor_location.x = xoffset + x2;
+ scim_string_view_draw_insertion_cursor (widget,
+ string_view->text_area,
+ &clip_area,
+ &cursor_location,
+ FALSE,
+ dir2,
+ TRUE);
+ }
+ }
+}
+
+static void
+scim_string_view_queue_draw (ScimStringView *string_view)
+{
+ if (GTK_WIDGET_REALIZED (string_view))
+ gdk_window_invalidate_rect (string_view->text_area, NULL, FALSE);
+}
+
+static gint
+scim_string_view_find_position (ScimStringView *string_view,
+ gint x)
+{
+ PangoLayout *layout;
+ PangoLayoutLine *line;
+ gint index;
+ gint pos;
+ gboolean trailing;
+
+ layout = scim_string_view_ensure_layout (string_view);
+
+ line = pango_layout_get_lines (layout)->data;
+ pango_layout_line_x_to_index (line, x * PANGO_SCALE, &index, &trailing);
+
+ pos = g_utf8_pointer_to_offset (string_view->text, string_view->text + index);
+ pos += trailing;
+
+ return pos;
+}
+
+static void
+scim_string_view_get_cursor_locations (ScimStringView *string_view,
+ gint *strong_x,
+ gint *weak_x)
+{
+ PangoLayout *layout = scim_string_view_ensure_layout (string_view);
+ const gchar *text;
+ PangoRectangle strong_pos, weak_pos;
+ gint index;
+
+ text = pango_layout_get_text (layout);
+ index = g_utf8_offset_to_pointer (text, string_view->current_pos) - text;
+
+ pango_layout_get_cursor_pos (layout, index, &strong_pos, &weak_pos);
+
+ if (strong_x)
+ *strong_x = strong_pos.x / PANGO_SCALE;
+
+ if (weak_x)
+ *weak_x = weak_pos.x / PANGO_SCALE;
+}
+
+static void
+scim_string_view_adjust_scroll (ScimStringView *string_view)
+{
+ gint min_offset, max_offset;
+ gint text_area_width;
+ gint strong_x, weak_x;
+ gint strong_xoffset, weak_xoffset;
+ PangoLayout *layout;
+ PangoLayoutLine *line;
+ PangoRectangle logical_rect;
+
+ if (!GTK_WIDGET_REALIZED (string_view))
+ return;
+
+ gdk_window_get_size (string_view->text_area, &text_area_width, NULL);
+ text_area_width -= 2 * INNER_BORDER;
+
+ layout = scim_string_view_ensure_layout (string_view);
+ line = pango_layout_get_lines (layout)->data;
+
+ pango_layout_line_get_extents (line, NULL, &logical_rect);
+
+ /* Display as much text as we can */
+
+ if (gtk_widget_get_direction (GTK_WIDGET (string_view)) == GTK_TEXT_DIR_LTR)
+ {
+ min_offset = 0;
+ max_offset = MAX (min_offset, logical_rect.width / PANGO_SCALE - text_area_width);
+ }
+ else
+ {
+ max_offset = logical_rect.width / PANGO_SCALE - text_area_width;
+ min_offset = MIN (0, max_offset);
+ }
+
+ string_view->scroll_offset = CLAMP (string_view->scroll_offset, min_offset, max_offset);
+
+ /* And make sure cursors are on screen. Note that the cursor is
+ * actually drawn one pixel into the INNER_BORDER space on
+ * the right, when the scroll is at the utmost right. This
+ * looks better to to me than confining the cursor inside the
+ * border entirely, though it means that the cursor gets one
+ * pixel closer to the the edge of the widget on the right than
+ * on the left. This might need changing if one changed
+ * INNER_BORDER from 2 to 1, as one would do on a
+ * small-screen-real-estate display.
+ *
+ * We always make sure that the strong cursor is on screen, and
+ * put the weak cursor on screen if possible.
+ */
+
+ scim_string_view_get_cursor_locations (string_view, &strong_x, &weak_x);
+
+ strong_xoffset = strong_x - string_view->scroll_offset;
+
+ if (strong_xoffset < 0)
+ {
+ string_view->scroll_offset += strong_xoffset;
+ strong_xoffset = 0;
+ }
+ else if (strong_xoffset > text_area_width)
+ {
+ string_view->scroll_offset += strong_xoffset - text_area_width;
+ strong_xoffset = text_area_width;
+ }
+
+ weak_xoffset = weak_x - string_view->scroll_offset;
+
+ if (weak_xoffset < 0 && strong_xoffset - weak_xoffset <= text_area_width)
+ {
+ string_view->scroll_offset += weak_xoffset;
+ }
+ else if (weak_xoffset > text_area_width &&
+ strong_xoffset - (weak_xoffset - text_area_width) >= 0)
+ {
+ string_view->scroll_offset += weak_xoffset - text_area_width;
+ }
+
+ g_object_notify (G_OBJECT (string_view), "scroll_offset");
+}
+
+static void
+scim_string_view_move_cursor (ScimStringView *string_view,
+ guint position)
+{
+ if (string_view->auto_move_cursor)
+ scim_string_view_set_position (string_view, position);
+}
+
+/* Public API
+ */
+
+GtkWidget*
+scim_string_view_new (void)
+{
+ return GTK_WIDGET (gtk_type_new (SCIM_TYPE_STRING_VIEW));
+}
+
+void
+scim_string_view_set_position (ScimStringView *string_view,
+ gint position)
+{
+ gboolean changed = FALSE;
+
+ g_return_if_fail (SCIM_IS_STRING_VIEW (string_view));
+
+ g_object_freeze_notify (G_OBJECT (string_view));
+
+ if (position != -1 &&
+ string_view->current_pos != position)
+ {
+ string_view->current_pos =
+ (position > string_view->text_length)?(string_view->text_length):position;
+
+ changed = TRUE;
+
+ g_object_notify (G_OBJECT (string_view), "cursor_position");
+ }
+
+ g_object_thaw_notify (G_OBJECT (string_view));
+
+ if (changed)
+ scim_string_view_recompute (string_view);
+}
+
+gint
+scim_string_view_get_position (ScimStringView *string_view)
+{
+ g_return_val_if_fail (SCIM_IS_STRING_VIEW (string_view), FALSE);
+
+ return string_view->current_pos;
+}
+
+void
+scim_string_view_set_max_width (ScimStringView *string_view,
+ gint width)
+{
+ g_return_if_fail (SCIM_IS_STRING_VIEW (string_view));
+
+ if (string_view->max_width == width)
+ return;
+
+ if (width > 0 && width < MIN_STRING_VIEW_WIDTH) width = MIN_STRING_VIEW_WIDTH;
+
+ string_view->max_width = width;
+
+ g_object_notify (G_OBJECT (string_view), "cursor_position");
+ scim_string_view_recompute (string_view);
+}
+
+gint
+scim_string_view_get_max_width (ScimStringView *string_view)
+{
+ g_return_val_if_fail (SCIM_IS_STRING_VIEW (string_view), FALSE);
+
+ return string_view->max_width;
+}
+
+void
+scim_string_view_set_draw_cursor (ScimStringView *string_view,
+ gboolean setting)
+{
+ g_return_if_fail (SCIM_IS_STRING_VIEW (string_view));
+
+ setting = (setting != FALSE);
+
+ if (string_view->draw_cursor == setting)
+ return;
+
+ string_view->draw_cursor = setting;
+
+ gtk_widget_queue_draw (GTK_WIDGET (string_view));
+
+ g_object_notify (G_OBJECT (string_view), "draw_cursor");
+}
+
+gboolean
+scim_string_view_get_draw_cursor (ScimStringView *string_view)
+{
+ g_return_val_if_fail (SCIM_IS_STRING_VIEW (string_view), FALSE);
+
+ return string_view->draw_cursor;
+}
+
+void
+scim_string_view_set_auto_move_cursor (ScimStringView *string_view,
+ gboolean setting)
+{
+ g_return_if_fail (SCIM_IS_STRING_VIEW (string_view));
+
+ setting = (setting != FALSE);
+
+ if (string_view->auto_move_cursor == setting)
+ return;
+
+ string_view->auto_move_cursor = setting;
+
+ g_object_notify (G_OBJECT (string_view), "auto_move_cursor");
+}
+
+gboolean
+scim_string_view_get_auto_move_cursor (ScimStringView *string_view)
+{
+ g_return_val_if_fail (SCIM_IS_STRING_VIEW (string_view), FALSE);
+
+ return string_view->auto_move_cursor;
+}
+
+void
+scim_string_view_set_forward_event (ScimStringView *string_view,
+ gboolean setting)
+{
+ g_return_if_fail (SCIM_IS_STRING_VIEW (string_view));
+
+ setting = (setting != FALSE);
+
+ if (string_view->forward_event == setting)
+ return;
+
+ string_view->forward_event = setting;
+
+ g_object_notify (G_OBJECT (string_view), "forward_event");
+}
+
+void
+scim_string_view_set_auto_resize (ScimStringView *string_view,
+ gboolean setting)
+{
+ g_return_if_fail (SCIM_IS_STRING_VIEW (string_view));
+
+ setting = (setting != FALSE);
+
+ if (string_view->auto_resize == setting)
+ return;
+
+ string_view->auto_resize = setting;
+
+ g_object_notify (G_OBJECT (string_view), "auto_resize");
+}
+
+gboolean
+scim_string_view_get_auto_resize (ScimStringView *string_view)
+{
+ g_return_val_if_fail (SCIM_IS_STRING_VIEW (string_view), FALSE);
+
+ return string_view->auto_resize;
+}
+
+void
+scim_string_view_set_press_move_cursor (ScimStringView *string_view,
+ gboolean setting)
+{
+ g_return_if_fail (SCIM_IS_STRING_VIEW (string_view));
+
+ setting = (setting != FALSE);
+
+ if (string_view->press_move_cursor == setting)
+ return;
+
+ string_view->press_move_cursor = setting;
+
+ g_object_notify (G_OBJECT (string_view), "press_move_cursor");
+}
+
+void
+scim_string_view_set_separator_index (ScimStringView *string_view,
+ gint *index)
+{
+ g_return_if_fail (SCIM_IS_STRING_VIEW (string_view) && index != NULL);
+
+ string_view->separator_index = index;
+}
+
+void
+scim_string_view_set_divider (ScimStringView *string_view,
+ GdkPixmap *pixmap)
+{
+ g_return_if_fail (SCIM_IS_STRING_VIEW (string_view) && pixmap != NULL);
+
+ string_view->divider = pixmap;
+}
+
+gboolean
+scim_string_view_get_forward_event (ScimStringView *string_view)
+{
+ g_return_val_if_fail (SCIM_IS_STRING_VIEW (string_view), FALSE);
+
+ return string_view->forward_event;
+}
+
+
+G_CONST_RETURN gchar*
+scim_string_view_get_text (ScimStringView *string_view)
+{
+ g_return_val_if_fail (SCIM_IS_STRING_VIEW (string_view), NULL);
+
+ return string_view->text;
+}
+
+void
+scim_string_view_set_text (ScimStringView *string_view,
+ const gchar *text)
+{
+ gint new_text_length;
+ gint new_nbytes;
+
+ g_return_if_fail (SCIM_IS_STRING_VIEW (string_view));
+ g_return_if_fail (text != NULL);
+
+ /* Actually setting the text will affect the cursor and selection;
+ * if the contents don't actually change, this will look odd to the user.
+ */
+ if (strcmp (string_view->text, text) == 0)
+ return;
+
+ new_nbytes = strlen (text);
+ new_text_length= g_utf8_strlen (text, new_nbytes);
+
+ if (string_view->text_max_length > 0 && new_text_length > string_view->text_max_length)
+ {
+ gdk_beep ();
+ new_text_length = string_view->text_max_length;
+ new_nbytes= g_utf8_offset_to_pointer (text, new_text_length) - text;
+ }
+
+ if (new_nbytes >= string_view->text_size)
+ {
+ string_view->text = g_realloc (string_view->text, new_nbytes + 1);
+ string_view->text_size = new_nbytes + 1;
+ }
+
+ memcpy (string_view->text, text, new_nbytes);
+
+ string_view->n_bytes = new_nbytes;
+ string_view->text_length = new_text_length;
+
+ /* NUL terminate for safety and convenience */
+ string_view->text[string_view->n_bytes] = '\0';
+
+ if (string_view->current_pos > string_view->text_length)
+ string_view->current_pos = string_view->text_length;
+
+ if (string_view->auto_resize)
+ gtk_widget_queue_resize (GTK_WIDGET (string_view));
+
+ scim_string_view_recompute (string_view);
+
+ g_object_notify (G_OBJECT (string_view), "text");
+}
+
+/**
+ * scim_string_view_set_max_length:
+ * @string_view: a #ScimStringView.
+ * @max: the maximum length of the string_view, or 0 for no maximum.
+ * (other than the maximum length of entries.) The value passed in will
+ * be clamped to the range 0-65536.
+ *
+ * Sets the maximum allowed length of the contents of the widget. If
+ * the current contents are longer than the given length, then they
+ * will be truncated to fit.
+ **/
+void
+scim_string_view_set_max_length (ScimStringView *string_view,
+ gint max)
+{
+ gint nbytes;
+
+ g_return_if_fail (SCIM_IS_STRING_VIEW (string_view));
+
+ max = CLAMP (max, 0, MAX_SIZE);
+
+ if (max > 0 && string_view->text_length > max) {
+ string_view->text_length = max;
+ nbytes = g_utf8_offset_to_pointer (string_view->text, max) - string_view->text;
+
+ string_view->text_size = nbytes + 1;
+ string_view->text = g_realloc (string_view->text, string_view->text_size);
+ string_view->text [nbytes] = '\0';
+ string_view->n_bytes = nbytes;
+ string_view->text_length = max;
+
+ if (string_view->current_pos > string_view->text_length)
+ string_view->current_pos = string_view->text_length;
+
+ if (string_view->auto_resize)
+ gtk_widget_queue_resize (GTK_WIDGET (string_view));
+
+ scim_string_view_recompute (string_view);
+ }
+
+ string_view->text_max_length = max;
+ g_object_notify (G_OBJECT (string_view), "max_length");
+}
+
+/**
+ * scim_string_view_get_max_length:
+ * @string_view: a #ScimStringView
+ *
+ * Retrieves the maximum allowed length of the text in
+ * @string_view. See scim_string_view_set_max_length().
+ *
+ * Return value: the maximum allowed number of characters
+ * in #ScimStringView, or 0 if there is no maximum.
+ **/
+gint
+scim_string_view_get_max_length (ScimStringView *string_view)
+{
+ g_return_val_if_fail (SCIM_IS_STRING_VIEW (string_view), 0);
+
+ return string_view->text_max_length;
+}
+
+
+/**
+ * scim_string_view_set_width_chars:
+ * @string_view: a #ScimStringView
+ * @n_chars: width in chars
+ *
+ * Changes the size request of the string_view to be about the right size
+ * for @n_chars characters. Note that it changes the size
+ * <emphasis>request</emphasis>, the size can still be affected by
+ * how you pack the widget into containers. If @n_chars is -1, the
+ * size reverts to the default string_view size.
+ *
+ **/
+void
+scim_string_view_set_width_chars (ScimStringView *string_view,
+ gint n_chars)
+{
+ g_return_if_fail (SCIM_IS_STRING_VIEW (string_view));
+
+ if (string_view->width_chars != n_chars)
+ {
+ string_view->width_chars = n_chars;
+ g_object_notify (G_OBJECT (string_view), "width_chars");
+ gtk_widget_queue_resize (GTK_WIDGET (string_view));
+ }
+}
+
+/**
+ * scim_string_view_get_width_chars:
+ * @string_view: a #ScimStringView
+ *
+ * Gets the value set by scim_string_view_set_width_chars().
+ *
+ * Return value: number of chars to request space for, or negative if unset
+ **/
+gint
+scim_string_view_get_width_chars (ScimStringView *string_view)
+{
+ g_return_val_if_fail (SCIM_IS_STRING_VIEW (string_view), 0);
+
+ return string_view->width_chars;
+}
+
+/**
+ * scim_string_view_set_has_frame:
+ * @string_view: a #ScimStringView
+ * @setting: new value
+ *
+ * Sets whether the string_view has a beveled frame around it.
+ **/
+void
+scim_string_view_set_has_frame (ScimStringView *string_view,
+ gboolean setting)
+{
+ g_return_if_fail (SCIM_IS_STRING_VIEW (string_view));
+
+ setting = (setting != FALSE);
+
+ if (string_view->has_frame == setting)
+ return;
+
+ gtk_widget_queue_resize (GTK_WIDGET (string_view));
+ string_view->has_frame = setting;
+ g_object_notify (G_OBJECT (string_view), "has_frame");
+}
+
+/**
+ * scim_string_view_get_has_frame:
+ * @string_view: a #ScimStringView
+ *
+ * Gets the value set by scim_string_view_set_has_frame().
+ *
+ * Return value: whether the string_view has a beveled frame
+ **/
+gboolean
+scim_string_view_get_has_frame (ScimStringView *string_view)
+{
+ g_return_val_if_fail (SCIM_IS_STRING_VIEW (string_view), FALSE);
+
+ return string_view->has_frame;
+}
+
+
+/**
+ * scim_string_view_get_layout:
+ * @string_view: a #ScimStringView
+ *
+ * Gets the #PangoLayout used to display the string_view.
+ * The layout is useful to e.g. convert text positions to
+ * pixel positions, in combination with scim_string_view_get_layout_offsets().
+ * The returned layout is owned by the string_view so need not be
+ * freed by the caller.
+ *
+ * Keep in mind that the layout text may contain a preedit string, so
+ * scim_string_view_layout_index_to_text_index() and
+ * scim_string_view_text_index_to_layout_index() are needed to convert byte
+ * indices in the layout to byte indices in the string_view contents.
+ *
+ * Return value: the #PangoLayout for this string_view
+ **/
+PangoLayout*
+scim_string_view_get_layout (ScimStringView *string_view)
+{
+ PangoLayout *layout;
+
+ g_return_val_if_fail (SCIM_IS_STRING_VIEW (string_view), NULL);
+
+ layout = scim_string_view_ensure_layout (string_view);
+
+ return layout;
+}
+
+
+/**
+ * scim_string_view_get_layout_offsets:
+ * @string_view: a #ScimStringView
+ * @x: location to store X offset of layout, or %NULL
+ * @y: location to store Y offset of layout, or %NULL
+ *
+ *
+ * Obtains the position of the #PangoLayout used to render text
+ * in the string_view, in widget coordinates. Useful if you want to line
+ * up the text in an string_view with some other text, e.g. when using the
+ * string_view to implement editable cells in a sheet widget.
+ *
+ * Also useful to convert mouse events into coordinates inside the
+ * #PangoLayout, e.g. to take some action if some part of the string_view text
+ * is clicked.
+ *
+ * Note that as the user scrolls around in the string_view the offsets will
+ * change; you'll need to connect to the "notify::scroll_offset"
+ * signal to track this. Remember when using the #PangoLayout
+ * functions you need to convert to and from pixels using
+ * PANGO_PIXELS() or #PANGO_SCALE.
+ *
+ * Keep in mind that the layout text may contain a preedit string, so
+ * scim_string_view_layout_index_to_text_index() and
+ * scim_string_view_text_index_to_layout_index() are needed to convert byte
+ * indices in the layout to byte indices in the string_view contents.
+ *
+ **/
+void
+scim_string_view_get_layout_offsets (ScimStringView *string_view,
+ gint *x,
+ gint *y)
+{
+ gint text_area_x, text_area_y;
+
+ g_return_if_fail (SCIM_IS_STRING_VIEW (string_view));
+
+ /* this gets coords relative to text area */
+ get_layout_position (string_view, x, y);
+
+ /* convert to widget coords */
+ get_text_area_size (string_view, &text_area_x, &text_area_y, NULL, NULL);
+
+ if (x)
+ *x += text_area_x;
+
+ if (y)
+ *y += text_area_y;
+}
+
+void
+scim_string_view_set_highlight (ScimStringView *string_view,
+ gint start,
+ gint end)
+{
+ g_return_if_fail (SCIM_IS_STRING_VIEW (string_view));
+
+ string_view->highlight_start = start;
+ string_view->highlight_end = end;
+
+ gtk_widget_queue_draw (GTK_WIDGET (string_view));
+}
+
+void
+scim_string_view_get_highlight (ScimStringView *string_view,
+ gint *start,
+ gint *end)
+{
+ g_return_if_fail (SCIM_IS_STRING_VIEW (string_view));
+
+ if (start) *start = string_view->highlight_start;
+ if (end) *end = string_view->highlight_end;
+}
+
+void
+scim_string_view_set_attributes (ScimStringView *entry,
+ PangoAttrList *attrs)
+{
+ g_return_if_fail (SCIM_IS_STRING_VIEW (entry));
+
+ if (attrs)
+ pango_attr_list_ref (attrs);
+
+ if (entry->attrs)
+ pango_attr_list_unref (entry->attrs);
+
+ entry->attrs = attrs;
+
+ scim_string_view_recompute (entry);
+}
+
+PangoAttrList *
+scim_string_view_get_attributes (ScimStringView *entry)
+{
+ g_return_val_if_fail (SCIM_IS_STRING_VIEW (entry), NULL);
+
+ return entry->attrs;
+}
+
+#define CURSOR_ON_MULTIPLIER 0.66
+#define CURSOR_OFF_MULTIPLIER 0.34
+#define CURSOR_PEND_MULTIPLIER 1.0
+
+static gboolean
+cursor_blinks (ScimStringView *string_view)
+{
+ GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (string_view));
+ gboolean blink;
+
+ g_object_get (G_OBJECT (settings), "gtk-cursor-blink", &blink, NULL);
+ return blink;
+}
+
+static gint
+get_cursor_time (ScimStringView *string_view)
+{
+ GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (string_view));
+ gint time;
+
+ g_object_get (G_OBJECT (settings), "gtk-cursor-blink-time", &time, NULL);
+
+ return time;
+}
+
+static void
+show_cursor (ScimStringView *string_view)
+{
+ if (!string_view->cursor_visible)
+ {
+ string_view->cursor_visible = TRUE;
+ gtk_widget_queue_draw (GTK_WIDGET (string_view));
+ }
+}
+
+static void
+hide_cursor (ScimStringView *string_view)
+{
+ if (string_view->cursor_visible)
+ {
+ string_view->cursor_visible = FALSE;
+ gtk_widget_queue_draw (GTK_WIDGET (string_view));
+ }
+}
+
+/*
+ * Blink!
+ */
+static gint
+blink_cb (gpointer data)
+{
+ ScimStringView *string_view;
+
+ GDK_THREADS_ENTER ();
+
+ string_view = SCIM_STRING_VIEW (data);
+
+ if (string_view->cursor_visible)
+ {
+ hide_cursor (string_view);
+ string_view->blink_timeout = gtk_timeout_add (get_cursor_time (string_view) * CURSOR_OFF_MULTIPLIER,
+ blink_cb,
+ string_view);
+ }
+ else
+ {
+ show_cursor (string_view);
+ string_view->blink_timeout = gtk_timeout_add (get_cursor_time (string_view) * CURSOR_ON_MULTIPLIER,
+ blink_cb,
+ string_view);
+ }
+
+ GDK_THREADS_LEAVE ();
+
+ return FALSE;
+}
+
+static void
+scim_string_view_check_cursor_blink (ScimStringView *string_view)
+{
+ if (cursor_blinks (string_view))
+ {
+ if (!string_view->blink_timeout)
+ {
+ string_view->blink_timeout = gtk_timeout_add (get_cursor_time (string_view) * CURSOR_ON_MULTIPLIER,
+ blink_cb,
+ string_view);
+ show_cursor (string_view);
+ }
+ }
+ else
+ {
+ if (string_view->blink_timeout)
+ {
+ gtk_timeout_remove (string_view->blink_timeout);
+ string_view->blink_timeout = 0;
+ }
+
+ string_view->cursor_visible = TRUE;
+ }
+}
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
+#ifndef __SCIM_STRING_VIEW_H__
+#define __SCIM_STRING_VIEW_H__
+
+
+#include <gdk/gdk.h>
+#include <pango/pango.h>
+
+G_BEGIN_DECLS
+
+#define SCIM_TYPE_STRING_VIEW (scim_string_view_get_type ())
+#define SCIM_STRING_VIEW(obj) (GTK_CHECK_CAST ((obj), SCIM_TYPE_STRING_VIEW, ScimStringView))
+#define SCIM_STRING_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), SCIM_TYPE_STRING_VIEW, ScimStringViewClass))
+#define SCIM_IS_STRING_VIEW(obj) (GTK_CHECK_TYPE ((obj), SCIM_TYPE_STRING_VIEW))
+#define SCIM_IS_STRING_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), SCIM_TYPE_STRING_VIEW))
+#define SCIM_STRING_VIEW_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), SCIM_TYPE_STRING_VIEW, ScimStringViewClass))
+
+//#define ENABLE_CHANGE_CURSOR
+
+typedef struct _ScimStringView ScimStringView;
+typedef struct _ScimStringViewClass ScimStringViewClass;
+
+struct _ScimStringView
+{
+ GtkWidget widget;
+
+ gchar *text;
+
+ guint16 text_length; /* length in use, in chars */
+ guint16 text_max_length;
+
+ /*< private >*/
+ GdkWindow *text_area;
+
+ gint current_pos;
+
+ PangoLayout *cached_layout;
+ PangoAttrList *attrs;
+ PangoAttrList *effective_attrs;
+
+ guint has_frame : 1;
+ guint draw_cursor : 1;
+ guint cursor_visible : 1;
+ guint auto_move_cursor : 1;
+ guint forward_event : 1;
+ guint auto_resize : 1;
+ guint press_move_cursor : 1;
+
+ guint blink_timeout;
+ guint recompute_idle;
+
+ gint scroll_offset;
+ gint ascent; /* font ascent, in pango units */
+ gint descent; /* font descent, in pango units */
+ gint max_width;
+
+ gint highlight_start;
+ gint highlight_end;
+
+ guint16 text_size; /* allocated size, in bytes */
+ guint16 n_bytes; /* length in use, in bytes */
+
+ gint width_chars;
+
+ gint *separator_index;
+ GdkPixmap *divider;
+};
+
+struct _ScimStringViewClass
+{
+ GtkWidgetClass parent_class;
+
+ void (* move_cursor) (ScimStringView *string_view, guint position);
+};
+
+void scim_string_view_register_type (GTypeModule *type_module);
+GType scim_string_view_get_type (void) G_GNUC_CONST;
+GtkWidget* scim_string_view_new (void);
+void scim_string_view_set_has_frame (ScimStringView *entry,
+ gboolean setting);
+gboolean scim_string_view_get_has_frame (ScimStringView *entry);
+
+/* text is truncated if needed */
+void scim_string_view_set_max_length (ScimStringView *entry,
+ gint max);
+gint scim_string_view_get_max_length (ScimStringView *entry);
+
+void scim_string_view_set_width_chars (ScimStringView *entry,
+ gint n_chars);
+gint scim_string_view_get_width_chars (ScimStringView *entry);
+
+/* Somewhat more convenient than the GtkEditable generic functions
+ */
+void scim_string_view_set_text (ScimStringView *entry,
+ const gchar *text);
+/* returns a reference to the text */
+G_CONST_RETURN gchar* scim_string_view_get_text (ScimStringView *entry);
+
+void scim_string_view_set_position (ScimStringView *entry,
+ gint position);
+gint scim_string_view_get_position (ScimStringView *entry);
+
+void scim_string_view_set_max_width (ScimStringView *entry,
+ gint width);
+gint scim_string_view_get_max_width (ScimStringView *entry);
+
+void scim_string_view_set_draw_cursor (ScimStringView *entry,
+ gboolean width);
+gboolean scim_string_view_get_draw_cursor (ScimStringView *entry);
+
+void scim_string_view_set_auto_move_cursor (ScimStringView *entry,
+ gboolean setting);
+gboolean scim_string_view_get_auto_move_cursor (ScimStringView *entry);
+
+void scim_string_view_set_forward_event (ScimStringView *entry,
+ gboolean setting);
+gboolean scim_string_view_get_forward_event (ScimStringView *entry);
+
+void scim_string_view_set_auto_resize (ScimStringView *entry,
+ gboolean setting);
+gboolean scim_string_view_get_auto_resize (ScimStringView *entry);
+
+void scim_string_view_set_press_move_cursor (ScimStringView *entry,
+ gboolean setting);
+
+void scim_string_view_set_separator_index (ScimStringView *entry,
+ gint *index);
+
+void scim_string_view_set_divider (ScimStringView *entry,
+ GdkPixmap *pixmap);
+
+PangoLayout* scim_string_view_get_layout (ScimStringView *entry);
+void scim_string_view_get_layout_offsets (ScimStringView *entry,
+ gint *x,
+ gint *y);
+
+void scim_string_view_set_highlight (ScimStringView *entry,
+ gint start,
+ gint end);
+
+void scim_string_view_get_highlight (ScimStringView *entry,
+ gint *start,
+ gint *end);
+
+void scim_string_view_set_attributes (ScimStringView *entry,
+ PangoAttrList *attrs);
+
+PangoAttrList *scim_string_view_get_attributes (ScimStringView *entry);
+
+G_END_DECLS
+
+#endif /* __scim_string_view_H__ */
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/* scimtrayicon.c
+ * converted from eggtrayicon.c in libegg.
+ *
+ * Copyright (C) 2002 Anders Carlsson <andersca@gnu.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <string.h>
+#include <libintl.h>
+
+#include "scimtrayicon.h"
+
+#include "scim_private.h"
+
+#include <gdk/gdkx.h>
+#include <X11/Xatom.h>
+
+#define SYSTEM_TRAY_REQUEST_DOCK 0
+#define SYSTEM_TRAY_BEGIN_MESSAGE 1
+#define SYSTEM_TRAY_CANCEL_MESSAGE 2
+
+#define SYSTEM_TRAY_ORIENTATION_HORZ 0
+#define SYSTEM_TRAY_ORIENTATION_VERT 1
+
+enum {
+ PROP_0,
+ PROP_ORIENTATION
+};
+
+static GtkPlugClass *parent_class = NULL;
+
+static void scim_tray_icon_init (ScimTrayIcon *icon);
+static void scim_tray_icon_class_init (ScimTrayIconClass *klass);
+
+static void scim_tray_icon_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec);
+
+static void scim_tray_icon_realize (GtkWidget *widget);
+static void scim_tray_icon_unrealize (GtkWidget *widget);
+
+static void scim_tray_icon_update_manager_window (ScimTrayIcon *icon);
+
+GType
+scim_tray_icon_get_type (void)
+{
+ static GType our_type = 0;
+
+ if (our_type == 0) {
+ static const GTypeInfo our_info = {
+ sizeof (ScimTrayIconClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) scim_tray_icon_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (ScimTrayIcon),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) scim_tray_icon_init
+ };
+ our_type = g_type_register_static (GTK_TYPE_PLUG, "ScimTrayIcon", &our_info, 0);
+ }
+
+ return our_type;
+}
+
+static void
+scim_tray_icon_init (ScimTrayIcon *icon)
+{
+ icon->stamp = 1;
+ icon->orientation = GTK_ORIENTATION_HORIZONTAL;
+
+ gtk_widget_add_events (GTK_WIDGET (icon), GDK_PROPERTY_CHANGE_MASK);
+}
+
+static void
+scim_tray_icon_class_init (ScimTrayIconClass *klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *)klass;
+ GtkWidgetClass *widget_class = (GtkWidgetClass *)klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->get_property = scim_tray_icon_get_property;
+
+ widget_class->realize = scim_tray_icon_realize;
+ widget_class->unrealize = scim_tray_icon_unrealize;
+
+ g_object_class_install_property (gobject_class,
+ PROP_ORIENTATION,
+ g_param_spec_enum ("orientation",
+ _("Orientation"),
+ _("The orientation of the tray."),
+ GTK_TYPE_ORIENTATION,
+ GTK_ORIENTATION_HORIZONTAL,
+ G_PARAM_READABLE));
+}
+
+static void
+scim_tray_icon_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ ScimTrayIcon *icon = SCIM_TRAY_ICON (object);
+
+ switch (prop_id) {
+ case PROP_ORIENTATION:
+ g_value_set_enum (value, icon->orientation);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+scim_tray_icon_get_orientation_property (ScimTrayIcon *icon)
+{
+ Display *xdisplay;
+ Atom type;
+ int format;
+ union {
+ gulong *prop;
+ guchar *prop_ch;
+ } prop = { NULL };
+ gulong nitems;
+ gulong bytes_after;
+ int error, result;
+
+ g_assert (icon->manager_window != None);
+
+ xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
+
+ gdk_error_trap_push ();
+ type = None;
+ result = XGetWindowProperty (xdisplay,
+ icon->manager_window,
+ icon->orientation_atom,
+ 0, G_MAXLONG, FALSE,
+ XA_CARDINAL,
+ &type, &format, &nitems,
+ &bytes_after, &(prop.prop_ch));
+
+ error = gdk_error_trap_pop ();
+
+ if (error || result != Success)
+ return;
+
+ if (type == XA_CARDINAL) {
+ GtkOrientation orientation;
+
+ orientation = (prop.prop [0] == SYSTEM_TRAY_ORIENTATION_HORZ) ?
+ GTK_ORIENTATION_HORIZONTAL :
+ GTK_ORIENTATION_VERTICAL;
+
+ if (icon->orientation != orientation) {
+ icon->orientation = orientation;
+ g_object_notify (G_OBJECT (icon), "orientation");
+ }
+ }
+
+ if (prop.prop)
+ XFree (prop.prop);
+}
+
+static GdkFilterReturn
+scim_tray_icon_manager_filter (GdkXEvent *xevent, GdkEvent *event, gpointer user_data)
+{
+ ScimTrayIcon *icon = user_data;
+ XEvent *xev = (XEvent *)xevent;
+
+ if (xev->xany.type == ClientMessage &&
+ xev->xclient.message_type == icon->manager_atom &&
+ xev->xclient.data.l[1] == icon->selection_atom) {
+ scim_tray_icon_update_manager_window (icon);
+ } else if (xev->xany.window == icon->manager_window) {
+ if (xev->xany.type == PropertyNotify &&
+ xev->xproperty.atom == icon->orientation_atom) {
+ scim_tray_icon_get_orientation_property (icon);
+ }
+ if (xev->xany.type == DestroyNotify) {
+ scim_tray_icon_update_manager_window (icon);
+ }
+ }
+
+ return GDK_FILTER_CONTINUE;
+}
+
+static void
+scim_tray_icon_unrealize (GtkWidget *widget)
+{
+ ScimTrayIcon *icon = SCIM_TRAY_ICON (widget);
+ GdkWindow *root_window;
+
+ if (icon->manager_window != None) {
+ GdkWindow *gdkwin;
+
+ gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (widget),
+ icon->manager_window);
+
+ gdk_window_remove_filter (gdkwin, scim_tray_icon_manager_filter, icon);
+ }
+
+ root_window = gdk_screen_get_root_window (gtk_widget_get_screen (widget));
+
+ gdk_window_remove_filter (root_window, scim_tray_icon_manager_filter, icon);
+
+ if (GTK_WIDGET_CLASS (parent_class)->unrealize)
+ (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
+}
+
+static void
+scim_tray_icon_send_manager_message (ScimTrayIcon *icon,
+ long message,
+ Window window,
+ long data1,
+ long data2,
+ long data3)
+{
+ XClientMessageEvent ev;
+ Display *display;
+
+ ev.type = ClientMessage;
+ ev.window = window;
+ ev.message_type = icon->system_tray_opcode_atom;
+ ev.format = 32;
+ ev.data.l[0] = gdk_x11_get_server_time (GTK_WIDGET (icon)->window);
+ ev.data.l[1] = message;
+ ev.data.l[2] = data1;
+ ev.data.l[3] = data2;
+ ev.data.l[4] = data3;
+
+ display = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
+
+ gdk_error_trap_push ();
+ XSendEvent (display, icon->manager_window, False, NoEventMask, (XEvent *)&ev);
+ XSync (display, False);
+ gdk_error_trap_pop ();
+}
+
+static void
+scim_tray_icon_send_dock_request (ScimTrayIcon *icon)
+{
+ scim_tray_icon_send_manager_message (icon,
+ SYSTEM_TRAY_REQUEST_DOCK,
+ icon->manager_window,
+ gtk_plug_get_id (GTK_PLUG (icon)),
+ 0, 0);
+}
+
+static void
+scim_tray_icon_update_manager_window (ScimTrayIcon *icon)
+{
+ Display *xdisplay;
+
+ xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
+
+ if (icon->manager_window != None) {
+ GdkWindow *gdkwin;
+
+ gdkwin = gdk_window_lookup_for_display (
+ gtk_widget_get_display (GTK_WIDGET (icon)),
+ icon->manager_window);
+
+ gdk_window_remove_filter (gdkwin, scim_tray_icon_manager_filter, icon);
+ }
+
+ XGrabServer (xdisplay);
+
+ icon->manager_window = XGetSelectionOwner (xdisplay, icon->selection_atom);
+
+ if (icon->manager_window != None)
+ XSelectInput (xdisplay,
+ icon->manager_window,
+ StructureNotifyMask|PropertyChangeMask);
+
+ XUngrabServer (xdisplay);
+ XFlush (xdisplay);
+
+ if (icon->manager_window != None) {
+ GdkWindow *gdkwin;
+
+ gdkwin = gdk_window_lookup_for_display (
+ gtk_widget_get_display (GTK_WIDGET (icon)),
+ icon->manager_window);
+
+ gdk_window_add_filter (gdkwin, scim_tray_icon_manager_filter, icon);
+
+ /* Send a request that we'd like to dock */
+ scim_tray_icon_send_dock_request (icon);
+
+ scim_tray_icon_get_orientation_property (icon);
+ }
+}
+
+static gboolean
+transparent_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
+{
+ gdk_window_clear_area (widget->window, event->area.x, event->area.y,
+ event->area.width, event->area.height);
+ return FALSE;
+}
+
+static void
+make_transparent_again (GtkWidget *widget, GtkStyle *previous_style,
+ gpointer user_data)
+{
+ gdk_window_set_back_pixmap (widget->window, NULL, TRUE);
+}
+
+static void
+make_transparent (GtkWidget *widget, gpointer user_data)
+{
+ if (GTK_WIDGET_NO_WINDOW (widget) || GTK_WIDGET_APP_PAINTABLE (widget))
+ return;
+
+ gtk_widget_set_app_paintable (widget, TRUE);
+ gtk_widget_set_double_buffered (widget, FALSE);
+ gdk_window_set_back_pixmap (widget->window, NULL, TRUE);
+ g_signal_connect (widget, "expose_event",
+ G_CALLBACK (transparent_expose_event), NULL);
+ g_signal_connect_after (widget, "style_set",
+ G_CALLBACK (make_transparent_again), NULL);
+}
+
+static void
+scim_tray_icon_realize (GtkWidget *widget)
+{
+ ScimTrayIcon *icon = SCIM_TRAY_ICON (widget);
+ GdkScreen *screen;
+ GdkDisplay *display;
+ Display *xdisplay;
+ char buffer[256];
+ GdkWindow *root_window;
+
+ if (GTK_WIDGET_CLASS (parent_class)->realize)
+ GTK_WIDGET_CLASS (parent_class)->realize (widget);
+
+ make_transparent (widget, NULL);
+
+ screen = gtk_widget_get_screen (widget);
+ display = gdk_screen_get_display (screen);
+ xdisplay = gdk_x11_display_get_xdisplay (display);
+
+ /* Now see if there's a manager window around */
+ g_snprintf (buffer, sizeof (buffer),
+ "_NET_SYSTEM_TRAY_S%d",
+ gdk_screen_get_number (screen));
+
+ icon->selection_atom = XInternAtom (xdisplay, buffer, False);
+
+ icon->manager_atom = XInternAtom (xdisplay, "MANAGER", False);
+
+ icon->system_tray_opcode_atom = XInternAtom (xdisplay,
+ "_NET_SYSTEM_TRAY_OPCODE",
+ False);
+
+ icon->orientation_atom = XInternAtom (xdisplay,
+ "_NET_SYSTEM_TRAY_ORIENTATION",
+ False);
+
+ scim_tray_icon_update_manager_window (icon);
+
+ root_window = gdk_screen_get_root_window (screen);
+
+ /* Add a root window filter so that we get changes on MANAGER */
+ gdk_window_add_filter (root_window, scim_tray_icon_manager_filter, icon);
+}
+
+ScimTrayIcon *
+scim_tray_icon_new_for_xscreen (Screen *xscreen, const char *name)
+{
+ GdkDisplay *display;
+ GdkScreen *screen;
+
+ display = gdk_x11_lookup_xdisplay (DisplayOfScreen (xscreen));
+ screen = gdk_display_get_screen (display, XScreenNumberOfScreen (xscreen));
+
+ return scim_tray_icon_new_for_screen (screen, name);
+}
+
+ScimTrayIcon *
+scim_tray_icon_new_for_screen (GdkScreen *screen, const char *name)
+{
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
+
+ return g_object_new (SCIM_TYPE_TRAY_ICON, "screen", screen, "title", name, NULL);
+}
+
+ScimTrayIcon*
+scim_tray_icon_new (const gchar *name)
+{
+ return g_object_new (SCIM_TYPE_TRAY_ICON, "title", name, NULL);
+}
+
+guint
+scim_tray_icon_send_message (ScimTrayIcon *icon,
+ gint timeout,
+ const gchar *message,
+ gint len)
+{
+ guint stamp;
+
+ g_return_val_if_fail (SCIM_IS_TRAY_ICON (icon), 0);
+ g_return_val_if_fail (timeout >= 0, 0);
+ g_return_val_if_fail (message != NULL, 0);
+
+ if (icon->manager_window == None)
+ return 0;
+
+ if (len < 0)
+ len = strlen (message);
+
+ stamp = icon->stamp++;
+
+ /* Get ready to send the message */
+ scim_tray_icon_send_manager_message (icon,
+ SYSTEM_TRAY_BEGIN_MESSAGE,
+ (Window)gtk_plug_get_id (GTK_PLUG (icon)),
+ timeout, len, stamp);
+
+ /* Now to send the actual message */
+ gdk_error_trap_push ();
+ while (len > 0) {
+ XClientMessageEvent ev;
+ Display *xdisplay;
+
+ xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
+
+ ev.type = ClientMessage;
+ ev.window = (Window)gtk_plug_get_id (GTK_PLUG (icon));
+ ev.format = 8;
+ ev.message_type = XInternAtom (xdisplay,
+ "_NET_SYSTEM_TRAY_MESSAGE_DATA", False);
+ if (len > 20) {
+ memcpy (&ev.data, message, 20);
+ len -= 20;
+ message += 20;
+ } else {
+ memcpy (&ev.data, message, len);
+ len = 0;
+ }
+
+ XSendEvent (xdisplay, icon->manager_window,
+ False, StructureNotifyMask, (XEvent *)&ev);
+
+ XSync (xdisplay, False);
+ }
+ gdk_error_trap_pop ();
+
+ return stamp;
+}
+
+void
+scim_tray_icon_cancel_message (ScimTrayIcon *icon,
+ guint id)
+{
+ g_return_if_fail (SCIM_IS_TRAY_ICON (icon));
+ g_return_if_fail (id > 0);
+
+ scim_tray_icon_send_manager_message (icon,
+ SYSTEM_TRAY_CANCEL_MESSAGE,
+ (Window)gtk_plug_get_id (GTK_PLUG (icon)),
+ id, 0, 0);
+}
+
+GtkOrientation
+scim_tray_icon_get_orientation (ScimTrayIcon *icon)
+{
+ g_return_val_if_fail (SCIM_IS_TRAY_ICON (icon), GTK_ORIENTATION_HORIZONTAL);
+
+ return icon->orientation;
+}
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+/* scimtrayicon.h
+ * converted from eggtrayicon.h in libegg.
+ *
+ * Copyright (C) 2002 Anders Carlsson <andersca@gnu.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __SCIM_TRAY_ICON_H__
+#define __SCIM_TRAY_ICON_H__
+
+#include <gtk/gtkplug.h>
+#include <gdk/gdkx.h>
+
+G_BEGIN_DECLS
+
+#define SCIM_TYPE_TRAY_ICON (scim_tray_icon_get_type ())
+#define SCIM_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SCIM_TYPE_TRAY_ICON, ScimTrayIcon))
+#define SCIM_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SCIM_TYPE_TRAY_ICON, ScimTrayIconClass))
+#define SCIM_IS_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SCIM_TYPE_TRAY_ICON))
+#define SCIM_IS_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SCIM_TYPE_TRAY_ICON))
+#define SCIM_TRAY_ICON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SCIM_TYPE_TRAY_ICON, ScimTrayIconClass))
+
+typedef struct _ScimTrayIcon ScimTrayIcon;
+typedef struct _ScimTrayIconClass ScimTrayIconClass;
+
+struct _ScimTrayIcon
+{
+ GtkPlug parent_instance;
+
+ guint stamp;
+
+ Atom selection_atom;
+ Atom manager_atom;
+ Atom system_tray_opcode_atom;
+ Atom orientation_atom;
+ Window manager_window;
+
+ GtkOrientation orientation;
+};
+
+struct _ScimTrayIconClass
+{
+ GtkPlugClass parent_class;
+};
+
+GType scim_tray_icon_get_type (void);
+
+ScimTrayIcon *scim_tray_icon_new_for_screen (GdkScreen *screen,
+ const gchar *name);
+
+ScimTrayIcon *scim_tray_icon_new (const gchar *name);
+
+guint scim_tray_icon_send_message (ScimTrayIcon *icon,
+ gint timeout,
+ const char *message,
+ gint len);
+
+void scim_tray_icon_cancel_message (ScimTrayIcon *icon,
+ guint id);
+
+GtkOrientation scim_tray_icon_get_orientation (ScimTrayIcon *icon);
+
+G_END_DECLS
+
+#endif /* __SCIM_TRAY_ICON_H__ */
+
+/*
+vi:ts=4:nowrap:ai:expandtab
+*/
--- /dev/null
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2005-06-08.21
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case "$1" in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ # Exit code 63 means version mismatch. This often happens
+ # when the user try to use an ancient version of a tool on
+ # a file that requires a minimum version. In this case we
+ # we should proceed has if the program had been absent, or
+ # if --run hadn't been passed.
+ if test $? = 63; then
+ run=:
+ msg="probably too old"
+ fi
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Send bug reports to <bug-automake@gnu.org>."
+ exit $?
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ exit $?
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+esac
+
+# Now exit if we have it, but it failed. Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case "$1" in
+ lex|yacc)
+ # Not GNU programs, they don't have --version.
+ ;;
+
+ tar)
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ exit 1
+ fi
+ ;;
+
+ *)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ # Could not run --version or --help. This is probably someone
+ # running `$TOOL --version' or `$TOOL --help' to check whether
+ # $TOOL exists and not knowing $TOOL uses missing.
+ exit 1
+ fi
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+ aclocal*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case "$f" in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+ test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' $msg. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+ fi
+ if [ -f "$file" ]; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ # The file to touch is that specified with -o ...
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ # ... or it is the one specified with @setfilename ...
+ infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
+ # ... or it is derived from the source name (dir/f.texi becomes f.info)
+ test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+ fi
+ # If the file does not exist, the user really needs makeinfo;
+ # let's fail without touching anything.
+ test -f $file || exit 1
+ touch $file
+ ;;
+
+ tar)
+ shift
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case "$firstarg" in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case "$firstarg" in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequisites for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
--- /dev/null
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+
+scriptversion=2004-02-15.20
+
+# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain.
+#
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+errstatus=0
+dirmode=""
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
+
+Create each directory DIR (with mode MODE, if specified), including all
+leading file name components.
+
+Report bugs to <bug-automake@gnu.org>."
+
+# process command line arguments
+while test $# -gt 0 ; do
+ case $1 in
+ -h | --help | --h*) # -h for help
+ echo "$usage"
+ exit 0
+ ;;
+ -m) # -m PERM arg
+ shift
+ test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+ dirmode=$1
+ shift
+ ;;
+ --version)
+ echo "$0 $scriptversion"
+ exit 0
+ ;;
+ --) # stop option processing
+ shift
+ break
+ ;;
+ -*) # unknown option
+ echo "$usage" 1>&2
+ exit 1
+ ;;
+ *) # first non-opt arg
+ break
+ ;;
+ esac
+done
+
+for file
+do
+ if test -d "$file"; then
+ shift
+ else
+ break
+ fi
+done
+
+case $# in
+ 0) exit 0 ;;
+esac
+
+# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and
+# mkdir -p a/c at the same time, both will detect that a is missing,
+# one will create a, then the other will try to create a and die with
+# a "File exists" error. This is a problem when calling mkinstalldirs
+# from a parallel make. We use --version in the probe to restrict
+# ourselves to GNU mkdir, which is thread-safe.
+case $dirmode in
+ '')
+ if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ echo "mkdir -p -- $*"
+ exec mkdir -p -- "$@"
+ else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ test -d ./-p && rmdir ./-p
+ test -d ./--version && rmdir ./--version
+ fi
+ ;;
+ *)
+ if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
+ test ! -d ./--version; then
+ echo "mkdir -m $dirmode -p -- $*"
+ exec mkdir -m "$dirmode" -p -- "$@"
+ else
+ # Clean up after NextStep and OpenStep mkdir.
+ for d in ./-m ./-p ./--version "./$dirmode";
+ do
+ test -d $d && rmdir $d
+ done
+ fi
+ ;;
+esac
+
+for file
+do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d
+ do
+ pathcomp="$pathcomp$d"
+ case $pathcomp in
+ -*) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp"
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ else
+ if test ! -z "$dirmode"; then
+ echo "chmod $dirmode $pathcomp"
+ lasterr=""
+ chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+ if test ! -z "$lasterr"; then
+ errstatus=$lasterr
+ fi
+ fi
+ fi
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
--- /dev/null
+%define _optdir /opt
+%define _ugdir %{_optdir}/ug
+
+Name: isf
+Summary: Input Service Framework
+Version: 2.2.4418
+Release: 1
+Group: TO_BE/FILLED_IN
+License: TO_BE/FILLED_IN
+Source0: %{name}-%{version}.tar.bz2
+BuildRequires: edje-bin
+BuildRequires: embryo-bin
+BuildRequires: gettext-tools
+BuildRequires: vconf-keys-devel
+BuildRequires: pkgconfig(appcore-efl)
+BuildRequires: pkgconfig(elementary)
+BuildRequires: pkgconfig(utilX)
+BuildRequires: pkgconfig(vconf)
+BuildRequires: pkgconfig(ui-gadget)
+BuildRequires: pkgconfig(heynoti)
+BuildRequires: pkgconfig(ecore)
+BuildRequires: pkgconfig(edje)
+BuildRequires: pkgconfig(x11)
+Requires(post): /sbin/ldconfig /usr/bin/vconftool
+Requires(postun): /sbin/ldconfig
+
+
+%description
+Input Service Framewok (ISF) is an input method (IM) platform, and it has been derived from SCIM.
+
+
+%package devel
+Summary: ISF header files
+Group: Development/Libraries
+Requires: %{name} = %{version}-%{release}
+
+%description devel
+This package contains ISF header files for ISE development.
+
+
+
+%prep
+%setup -q
+
+%build
+
+./bootstrap
+%configure --disable-static \
+ --disable-tray-icon --disable-filter-sctc
+make %{?jobs:-j%jobs}
+
+%install
+rm -rf %{buildroot}
+%make_install
+
+%post
+/sbin/ldconfig
+
+/usr/bin/vconftool set -t string db/isf/input_lang "Automatic" -g 6514
+/usr/bin/vconftool set -t string db/setting/autocapital_allow 0 -g 6514
+/usr/bin/vconftool set -t string db/setting/autoperiod_allow 0 -g 6514
+
+ln -sf /etc/init.d/isf-panel-efl /etc/rc.d/rc3.d/S42isf-panel-efl
+ln -sf /etc/init.d/isf-panel-efl /etc/rc.d/rc4.d/S81isf-panel-efl
+
+
+%postun -p /sbin/ldconfig
+
+
+
+%files
+%defattr(-,root,root,-)
+%attr(755,root,root) %{_sysconfdir}/init.d/isf-panel-efl
+%attr(755,root,root) %{_sysconfdir}/profile.d/isf.sh
+%{_sysconfdir}/scim/global
+%{_sysconfdir}/scim/config
+%{_datadir}/scim/isf_candidate_theme2.edj
+%{_datadir}/scim/isf_candidate_theme1.edj
+%{_datadir}/scim/icons/*
+%{_datadir}/applications/isf-panel-efl.desktop
+%{_datadir}/locale/*
+%{_bindir}/isf-demo-efl
+%{_bindir}/scim
+%{_bindir}/isf-log
+%{_bindir}/isf-panel-efl
+%{_bindir}/idm_core
+%{_bindir}/isf-query-engines
+%{_libdir}/libidm_context.so.*
+%{_libdir}/libidm_capture.so
+%{_libdir}/ecore/immodules/libisf-imf-module.so
+%{_libdir}/scim-1.0/1.4.0/IMEngine/socket.so
+%{_libdir}/scim-1.0/1.4.0/Config/simple.so
+%{_libdir}/scim-1.0/1.4.0/Config/socket.so
+%{_libdir}/scim-1.0/1.4.0/FrontEnd/socket.so
+%{_libdir}/scim-1.0/scim-launcher
+%{_libdir}/scim-1.0/scim-helper-launcher
+%{_libdir}/libscim-1.0.so.*
+%{_ugdir}/res/locale/*
+%{_ugdir}/lib/libug-keyboard-setting-wizard-efl.so
+%{_ugdir}/lib/libug-isfsetting-efl.so
+
+%files devel
+%defattr(-,root,root,-)
+%{_includedir}/scim-1.0/*
+%{_libdir}/libscim-1.0.so
+%{_libdir}/pkgconfig/isf.pc
+%{_libdir}/pkgconfig/scim.pc
+%{_libdir}/libidm_context.so
--- /dev/null
+# Makefile for program source directory in GNU NLS utilities package.
+# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+#
+# This file file be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU Public License
+# but which still want to provide support for the GNU gettext functionality.
+# Please note that the actual code is *not* freely available.
+#
+# - Modified by Owen Taylor <otaylor@redhat.com> to use GETTEXT_PACKAGE
+# instead of PACKAGE and to look for po2tbl in ./ not in intl/
+#
+# - Modified by jacob berkman <jacob@ximian.com> to install
+# Makefile.in.in and po2tbl.sed.in for use with glib-gettextize
+
+GETTEXT_PACKAGE = isfsetting-efl
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = @top_builddir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datadir = /opt/ug/res
+libdir = @libdir@
+localedir = $(libdir)/locale
+gnulocaledir = $(datadir)/locale
+gettextsrcdir = $(datadir)/glib-2.0/gettext/po
+subdir = po
+install_sh = @install_sh@
+mkdir_p = @mkdir_p@
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+CC = @CC@
+GENCAT = @GENCAT@
+GMSGFMT = @GMSGFMT@
+MSGFMT = @MSGFMT@
+XGETTEXT = @XGETTEXT@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+MSGMERGE = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist
+GENPOT = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot
+
+DEFS = @DEFS@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+
+INCLUDES = -I.. -I$(top_srcdir)/intl
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+SOURCES =
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+DISTFILES = $(srcdir)/ChangeLog $(srcdir)/Makefile.in.in $(srcdir)/POTFILES.in \
+$(POFILES) $(GMOFILES) $(SOURCES)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+INSTOBJEXT = @INSTOBJEXT@
+
+.SUFFIXES:
+.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat
+
+.c.o:
+ $(COMPILE) $<
+
+.po.pox:
+ $(MAKE) $(GETTEXT_PACKAGE).pot
+ $(MSGMERGE) $< $(top_builddir)/po/$(GETTEXT_PACKAGE).pot -o $*pox
+
+.po.mo:
+ $(MSGFMT) -o $@ $<
+
+.po.gmo:
+ file=`echo $* | sed 's,.*/,,'`.gmo \
+ && rm -f $$file && $(GMSGFMT) -o $$file $<
+
+.po.cat:
+ sed -f ../intl/po2msg.sed < $< > $*.msg \
+ && rm -f $@ && $(GENCAT) $@ $*.msg
+
+
+all: all-@USE_NLS@
+
+all-yes: $(CATALOGS)
+all-no:
+
+$(GETTEXT_PACKAGE).pot: $(POTFILES)
+ $(GENPOT)
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+install-data-no: all
+install-data-yes: all
+ if test -n "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $(DESTDIR)$(datadir); \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(datadir); \
+ fi
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ case "$$cat" in \
+ *.gmo) destdir=$(gnulocaledir);; \
+ *) destdir=$(localedir);; \
+ esac; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ dir=$(DESTDIR)$$destdir/$$lang/LC_MESSAGES; \
+ if test -n "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $$dir; \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $$dir; \
+ fi; \
+ if test -r $$cat; then \
+ $(INSTALL_DATA) $$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \
+ echo "installing $$cat as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \
+ else \
+ $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \
+ echo "installing $(srcdir)/$$cat as" \
+ "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \
+ fi; \
+ if test -r $$cat.m; then \
+ $(INSTALL_DATA) $$cat.m $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \
+ echo "installing $$cat.m as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \
+ else \
+ if test -r $(srcdir)/$$cat.m ; then \
+ $(INSTALL_DATA) $(srcdir)/$$cat.m \
+ $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \
+ echo "installing $(srcdir)/$$cat as" \
+ "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \
+ else \
+ true; \
+ fi; \
+ fi; \
+ done
+ if test "$(PACKAGE)" = "glib"; then \
+ if test -n "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $(DESTDIR)$(gettextsrcdir); \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(gettextsrcdir); \
+ fi; \
+ $(INSTALL_DATA) $(srcdir)/Makefile.in.in \
+ $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \
+ else \
+ : ; \
+ fi
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall:
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \
+ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \
+ rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \
+ rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \
+ done
+ if test "$(PACKAGE)" = "glib"; then \
+ rm -f $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \
+ fi
+
+check: all
+
+dvi info tags TAGS ID:
+
+mostlyclean:
+ rm -f core core.* *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp
+ rm -fr *.o *.gmo
+ rm -f .intltool-merge-cache
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ rm -f $(GMOFILES)
+
+distdir = ../$(GETTEXT_PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: $(DISTFILES) $(GETTEXT_PACKAGE).pot
+ dists="$(DISTFILES)"; \
+ for file in $$dists; do \
+ ln $$file $(distdir) 2> /dev/null \
+ || cp -p $$file $(distdir); \
+ done
+
+update-po: Makefile
+ $(MAKE) $(GETTEXT_PACKAGE).pot
+ tmpdir=`pwd`; \
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ echo "$$lang:"; \
+ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \
+ if $$result; then \
+ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+ rm -f $$tmpdir/$$lang.new.po; \
+ else \
+ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+ :; \
+ else \
+ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ exit 1; \
+ fi; \
+ fi; \
+ else \
+ echo "msgmerge for $$cat failed!"; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ fi; \
+ done
+
+# POTFILES is created from POTFILES.in by stripping comments, empty lines
+# and Intltool tags (enclosed in square brackets), and appending a full
+# relative path to them
+POTFILES: POTFILES.in
+ ( if test 'x$(srcdir)' != 'x.'; then \
+ posrcprefix='$(top_srcdir)/'; \
+ else \
+ posrcprefix="../"; \
+ fi; \
+ rm -f $@-t $@ \
+ && (sed -e '/^#/d' \
+ -e "s/^\[.*\] +//" \
+ -e '/^[ ]*$$/d' \
+ -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \
+ | sed -e '$$s/\\$$//') > $@-t \
+ && chmod a-w $@-t \
+ && mv $@-t $@ )
+
+Makefile: Makefile.in.in ../../config.status POTFILES
+ cd ../.. \
+ && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \
+ $(SHELL) ./config.status
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+ism/extras/efl_setting/scim_setup_module_efl.cpp
+ism/extras/efl_setting/isf_setting_efl.cpp
--- /dev/null
+# translation of cs.po to Czech
+# translation of cs.po to cs_CZ
+# translation of scim.po to cs_CZ
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Klara Cihlarova <koty@seznam.cz>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: cs\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 20:17+0900\n"
+"PO-Revision-Date: 2005-12-11 19:55+0100\n"
+"Last-Translator: Klara Cihlarova <koty@seznam.cz>\n"
+"Language-Team: Czech <suse@suse.cz>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.10.2\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "Výběr kláves"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Option"
+msgstr "Volby"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "Němčina"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "Angličtina/klávesnice"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Výběr kláves"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "Výběr kláves"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "Angličtina/klávesnice"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "Volby"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "Angličtina/klávesnice"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "Angličtina/klávesnice"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "Angličtina (americká)"
+
+#~ msgid "Amharic"
+#~ msgstr "Amharština"
+
+#~ msgid "Arabic"
+#~ msgstr "Arabština"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "Arabština (egyptská)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "Arabština (libanonská)"
+
+#~ msgid "Assamese"
+#~ msgstr "Ásámština"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "Azerbajdžánština"
+
+#~ msgid "Belarusian"
+#~ msgstr "Běloruština"
+
+#~ msgid "Bulgarian"
+#~ msgstr "Bulharština"
+
+#~ msgid "Bengali"
+#~ msgstr "Bengálština"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "Bengálština (indická)"
+
+#~ msgid "Tibetan"
+#~ msgstr "Tibetština"
+
+#~ msgid "Bosnian"
+#~ msgstr "Bosenština"
+
+#~ msgid "Catalan"
+#~ msgstr "Katalánština"
+
+#~ msgid "Czech"
+#~ msgstr "Čeština"
+
+#~ msgid "Welsh"
+#~ msgstr "Welština"
+
+#~ msgid "Danish"
+#~ msgstr "Dánština"
+
+#~ msgid "German"
+#~ msgstr "Němčina"
+
+#~ msgid "Greek"
+#~ msgstr "Řečtina"
+
+#~ msgid "English"
+#~ msgstr "Angličtina"
+
+#~ msgid "English (Australian)"
+#~ msgstr "Angličtina (australská)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "Angličtina (kanadská)"
+
+#~ msgid "English (British)"
+#~ msgstr "Angličtina (britská)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "Angličtina (irská)"
+
+#~ msgid "English (American)"
+#~ msgstr "Angličtina (americká)"
+
+#~ msgid "Spanish"
+#~ msgstr "Španělština"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "Španělština (mexická)"
+
+#~ msgid "Estonian"
+#~ msgstr "Estonština"
+
+#~ msgid "Basque"
+#~ msgstr "Baskičtina"
+
+#~ msgid "Persian"
+#~ msgstr "Perština"
+
+#~ msgid "Finnish"
+#~ msgstr "Finština"
+
+#~ msgid "French"
+#~ msgstr "Francouzština"
+
+#~ msgid "Irish"
+#~ msgstr "Irština"
+
+#~ msgid "Galician"
+#~ msgstr "Galština"
+
+#~ msgid "Gujarati"
+#~ msgstr "Gudžarádština"
+
+#~ msgid "Hebrew"
+#~ msgstr "Hebrejština"
+
+#~ msgid "Hindi"
+#~ msgstr "Hindština"
+
+#~ msgid "Croatian"
+#~ msgstr "Chorvatština"
+
+#~ msgid "Hungarian"
+#~ msgstr "Maďarština"
+
+#, fuzzy
+#~ msgid "Armenian"
+#~ msgstr "Rumunština"
+
+#~ msgid "Interlingua"
+#~ msgstr "Interlingua"
+
+#~ msgid "Indonesian"
+#~ msgstr "Indonézština"
+
+#~ msgid "Icelandic"
+#~ msgstr "Islandština"
+
+#~ msgid "Italian"
+#~ msgstr "Italština"
+
+#~ msgid "Japanese"
+#~ msgstr "Japonština"
+
+#, fuzzy
+#~ msgid "Georgian"
+#~ msgstr "Němčina"
+
+#~ msgid "Kazakh"
+#~ msgstr "Kazaština"
+
+#~ msgid "Cambodian"
+#~ msgstr "Khmerština"
+
+#~ msgid "Kannada"
+#~ msgstr "Kannadština"
+
+#~ msgid "Korean"
+#~ msgstr "Korejština"
+
+#~ msgid "Laothian"
+#~ msgstr "Laoština"
+
+#~ msgid "Lithuanian"
+#~ msgstr "Litevština"
+
+#~ msgid "Latvian"
+#~ msgstr "Lotyšština"
+
+#~ msgid "Macedonian"
+#~ msgstr "Makedonština"
+
+#~ msgid "Malayalam"
+#~ msgstr "Malajámština"
+
+#~ msgid "Mongolian"
+#~ msgstr "Mongolština"
+
+#~ msgid "Marathi"
+#~ msgstr "Maráthština"
+
+#~ msgid "Malay"
+#~ msgstr "Malajština"
+
+#~ msgid "Nepali"
+#~ msgstr "Nepálština"
+
+#~ msgid "Dutch"
+#~ msgstr "Nizozemské"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "Norština (nynorsk)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "Norština (bokmal)"
+
+#~ msgid "Oriya"
+#~ msgstr "Orijština"
+
+#~ msgid "Punjabi"
+#~ msgstr "Pandžábština"
+
+#~ msgid "Polish"
+#~ msgstr "Polština"
+
+#~ msgid "Portuguese"
+#~ msgstr "Portugalština"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "Portugalština (brazilská)"
+
+#~ msgid "Romanian"
+#~ msgstr "Rumunština"
+
+#~ msgid "Russian"
+#~ msgstr "Ruština"
+
+#~ msgid "Slovak"
+#~ msgstr "Slovenština"
+
+#~ msgid "Slovenian"
+#~ msgstr "Slovinština"
+
+#~ msgid "Albanian"
+#~ msgstr "Albánština"
+
+#~ msgid "Serbian"
+#~ msgstr "Srbština"
+
+#~ msgid "Swedish"
+#~ msgstr "Švédština"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "Švédština (finská)"
+
+#~ msgid "Tamil"
+#~ msgstr "Tamilština"
+
+#~ msgid "Telugu"
+#~ msgstr "Telugština"
+
+#~ msgid "Thai"
+#~ msgstr "Thajština"
+
+#~ msgid "Turkish"
+#~ msgstr "Turečtina"
+
+#~ msgid "Uighur"
+#~ msgstr "Ujgurština"
+
+#~ msgid "Ukrainian"
+#~ msgstr "Ukrajinština"
+
+#~ msgid "Urdu"
+#~ msgstr "Urdština"
+
+#~ msgid "Uzbek"
+#~ msgstr "Uzbečtina"
+
+#~ msgid "Vietnamese"
+#~ msgstr "Vietnamština"
+
+#~ msgid "Walloon"
+#~ msgstr "Walloon"
+
+#~ msgid "Yiddish"
+#~ msgstr "Jidiš"
+
+#~ msgid "Chinese"
+#~ msgstr "Čínština"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "Čínština (zjednodušená)"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "Čínština (tradiční)"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "Belgičtina"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "Angličtina (US)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "Angličtina (kanadská)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "Angličtina (irská)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "Angličtina (britská)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "Angličtina (americká)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "Angličtina (kanadská)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "Angličtina (britská)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "Angličtina (britská)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "Angličtina (kanadská)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "Angličtina (britská)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "Francouzština (kanadská)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "Francouzština (kanadská)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "Francouzština (kanadská)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "Němčina (švýcarská)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "Francouzština (kanadská)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "Němčina (s mrtvými klávesami)"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "Němčina (švýcarská)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "Angličtina (australská)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "Němčina (švýcarská)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "Němčina (švýcarská)"
+
+#, fuzzy
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "Portugalština (brazilská)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "Portugalština (brazilská)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "Španělština (jihoamerická)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "Španělština (jihoamerická)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "Španělština (jihoamerická)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "Španělština (jihoamerická)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "Španělština (jihoamerická)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "Španělština (CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "Malajámština"
+
+#~ msgid "Norwegian"
+#~ msgstr "Norština"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "Srbština"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "Čínština (tradiční)"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "Čínština (tradiční)"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "Čínština (tradiční)"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "Čínština"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "Čínština (zjednodušená)"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "Arabština (egyptská)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "Arabština (egyptská)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "Arabština (egyptská)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "Arabština (egyptská)"
+
+#~ msgid "Other"
+#~ msgstr "Ostatní"
+
+#~ msgid "Unknown"
+#~ msgstr "Neznámé"
+
+#~ msgid "English (US)"
+#~ msgstr "Angličtina (US)"
+
+#~ msgid "Belgian"
+#~ msgstr "Belgičtina"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "Čeština (qwerty)"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "Francouzština (švýcarská)"
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "Němčina (s mrtvými klávesami)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "Portugalština (brazilská)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "Slovenština (qwerty)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "Španělština (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "Španělština (jihoamerická)"
+
+#~ msgid "English (UK)"
+#~ msgstr "Angličtina (UK)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "Převod zjednodušená - tradiční čínština"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "Převod mezi zjednodušenou čínštinou a tradiční čínštinou"
+
+#~ msgid "SC-TC"
+#~ msgstr "SC-TC"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "Převod zjednodušená - tradiční čínština"
+
+#~ msgid "No Conversion"
+#~ msgstr "Bez převodu"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "Ze zjednodušené do tradiční"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "Převést zjednodušenou čínštinu do tradiční čínštiny"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "Z tradiční do zjednodušené"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "Převést tradiční čínštinu do zjednodušené čínštiny"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "SC->TC"
+
+#~ msgid "TC->SC"
+#~ msgstr "TC->SC"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "SCIM platforma"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "Stav"
+
+#~ msgid "Name"
+#~ msgstr "Název"
+
+#~ msgid "Cursor Position"
+#~ msgstr "Pozice kurzoru"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "Aktuální pozice vkládacího kurzoru mezi znaky."
+
+#~ msgid "Maximum length"
+#~ msgstr "Maximální délka"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr ""
+#~ "Maximální počet znaků při zobrazení řetězce. Nula, pokud není nic "
+#~ "nastaveno."
+
+#~ msgid "Maximum width"
+#~ msgstr "Maximální šířka"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "Maximální šířka pohledu na řetězec."
+
+#~ msgid "Has Frame"
+#~ msgstr "S rámem"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "FALSE odstraní zkosení."
+
+#~ msgid "Draw cursor"
+#~ msgstr "Vykreslit kurzor"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "TRUE vykreslí blikající kurzor."
+
+#~ msgid "Auto move cursor"
+#~ msgstr "Automatické přesunutí kurzoru"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr "TRUE automaticky přemístí kurzor při kliknutí myší."
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "Předání událost stisknutí tlačítka"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr "TRUE předá událost stisknutí tlačítka programu."
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "Automatická změna velikosti widgetu podle řetězce"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "TRUE povolí automatickou změnu velikosti."
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr "TRUE automaticky přemístí kurzor při kliknutí myší."
+
+#~ msgid "Width in chars"
+#~ msgstr "Šířka znaků"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr "Počet znaků, pro které se v řetězci vynechá místo."
+
+#~ msgid "Scroll offset"
+#~ msgstr "Scroll offset"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr "Počet pixelů v zobrazeném řetězci při přesunu vlevo"
+
+#~ msgid "Text"
+#~ msgstr "Text"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "Obsahy zobrazeného řetězce"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "Zvolené _klávesy:"
+
+#~ msgid "Key Code:"
+#~ msgstr "Kód klávesy:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "Modifikátor:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Ctrl"
+
+#~ msgid "A_lt"
+#~ msgstr "A_lt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Shift"
+
+#~ msgid "_Release"
+#~ msgstr "_Uvolnit"
+
+#~ msgid "_Meta"
+#~ msgstr "_Meta"
+
+#~ msgid "S_uper"
+#~ msgstr "S_uper"
+
+#~ msgid "_Hyper"
+#~ msgstr "_Hyper"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "Zadejte prosím nejdřív kód klávesy."
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "Stiskněte klávesu (nebo kombinaci kláves).\n"
+#~ "Dialog se zavře po uvolnění kláves."
+
+#~ msgid "Grabbing a key."
+#~ msgstr "Zachycení klávesy."
+
+#~ msgid "Key Selection"
+#~ msgstr "Výběr kláves"
+
+#~ msgid "Orientation"
+#~ msgstr "Orientace"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "Orientace panelu."
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "Text"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amharština"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Vždy"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Volby"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Angličtina/klávesnice"
+
+#~ msgid "English/European"
+#~ msgstr "Angličtina/Evropa"
+
+#~ msgid "RAW CODE"
+#~ msgstr "RAW KÓD"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Klávesové zkratky:\n"
+#~ "\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " přepnutí mezi Multibyte a Unicode kódováním.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " zrušení vstupní metody.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "Stav aktuální vstupní metody. Změnu provedete kliknutím."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Obecná nastavení"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Nastavení klávesový zkratek používaných moduly včetně X11, GTK, IMModule, "
+#~ "GTK IMModule, QT IMModule atd."
+
+#~ msgid "_Trigger:"
+#~ msgstr "_Spouštění:"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Zvolte spouštěcí klávesy"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Klávesové události zapínající/vypínající SCIM vstupní metodu. Úpravu "
+#~ "provedete kliknutím na tlačítko vpravo."
+
+#~ msgid "Turn _On:"
+#~ msgstr "_Zapnout:"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Zvolte spouštěcí klávesy"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Klávesové události zapínající SCIM vstupní metodu. Úpravu provedete "
+#~ "kliknutím na tlačítko vpravo."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "_Vypnout:"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Zvolte vypínací klávesy"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Klávesové události vypínající SCIM vstupní metodu. Úpravu provedete "
+#~ "kliknutím na tlačítko vpravo."
+
+#~ msgid "_Next input method:"
+#~ msgstr "_Další vstupní metoda:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "Zvolte klávesy další vstupní metody"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Klávesové události přepínající na další vstupní metodu. Úpravu provedete "
+#~ "kliknutím na tlačítko vpravo."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "_Předchozí vstupní metoda:"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Zvolte klávesy předchozí vstupní metody"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Klávesové události přepnutí do předcházející vstupní metody. Úpravu "
+#~ "provedete kliknutím na tlačítko vpravo."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "_Zobrazit nabídku vstupní metody:"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "Zvolte klávesy zobrazení nabídky vstupní metody"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Klávesové události k zobrazení nabídky vstupní metody. Úpravu provedete "
+#~ "kliknutím na tlačítko vpravo."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "_Rozložení klávesnice:"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Zde můžete nastavit své rozložení klávesnice tak, aby zvolené vstupní "
+#~ "metody fungovaly korektně."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "_Vložit předpřipravený řetězec do klientského okna"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, zobrazí se předpřipravený řetězec přímo v "
+#~ "klientském vstupním okně než v nezávislém plovoucím okně."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "_Zdílet vstupní metody u všech aplikací"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Pokud tuto volbu zaškrtnete, bude se u všech aplikací používat pouze "
+#~ "jeden typ vstupní metody. V opačném případě se u každé aplikace může "
+#~ "použije jiná."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Klávesové zkratky"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Zde můžete povolit/zakázat vstupní metody a nastavit jejich klávesové "
+#~ "zkratky."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Služby nainstalované vstupní metody:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "Upravit _klávesové zkratky"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "Úprava klávesových zkratek spojených se zvolenou vstupní metodou."
+
+#~ msgid "Select _Filters"
+#~ msgstr "Zvolit _filtry"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "Zvolte filtry spojené s touto vstupní metodou."
+
+#~ msgid "_Expand"
+#~ msgstr "_Rozbalit"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Zobrazení všech jazykových kategorií."
+
+#~ msgid "_Collapse"
+#~ msgstr "_Zabalit"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Skrytí všech jazykových kategorií."
+
+#~ msgid "E_nable All"
+#~ msgstr "_Povolit vše"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Povolit všechny vstupní metody."
+
+#~ msgid "_Disable All"
+#~ msgstr "_Zakázat vše"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Zakázat všechny vstupní metody."
+
+#~ msgid "Filters"
+#~ msgstr "Filtry"
+
+#~ msgid "Languages"
+#~ msgstr "Jazyky"
+
+#~ msgid "Description"
+#~ msgstr "Popis"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Upravit klávesové zkratky %s"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Zvolte filtry pro %s"
+
+#~ msgid "Move _Up"
+#~ msgstr "Posunout na_horu"
+
+#~ msgid "Move _Down"
+#~ msgstr "Posunout _dolů"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "Démon zapuštěný do panelu založený na knihovně GTK+-2.x."
+
+#~ msgid "On demand"
+#~ msgstr "Na požádání"
+
+#~ msgid "Never"
+#~ msgstr "Nikdy"
+
+#~ msgid "ToolBar"
+#~ msgstr "Nástrojová lišta"
+
+#~ msgid "_Show:"
+#~ msgstr "_Zobrazit:"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Automatické přicvaknutí"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Zobrazit ikonu _vstupní metody"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "Zobrazit _název vstupní metody"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "Délka _zobrazení::"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Zobrazit ikonu _přilepení"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Zobrazit ikonu _nabídky"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Zobrazit ikonu _nápovědy"
+
+#~ msgid "Show _property label"
+#~ msgstr "Zobrazit _vlastnosti"
+
+#~ msgid "Input window"
+#~ msgstr "Vstupní okno"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "_Vložená vyhledávací tabulka"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "V_ertikální vyhledávací tabulka"
+
+#~ msgid "Misc"
+#~ msgstr "Různé"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Pohltit ikonu do panelu"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Přišpendlit _okno"
+
+#~ msgid "_Font:"
+#~ msgstr "_Písmo:"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Pokud jste zvolili \"Vždy\", bude lišta vždy zobrazena. V případě \"Na "
+#~ "požádání\" bude vždy po deaktivaci SCIM skryta. U volby \"Nikdy\" se "
+#~ "nezobrazí nikdy."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, bude nástrojová lišta přichycena k okraji "
+#~ "pracovní plochy."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "Lišta se skryje po uplynutí zadaného času. Tato volba je platná pouze "
+#~ "pokud jste současně zvolili \"Vždy zobrazit'\". Funkci vypnete nastavením "
+#~ "na hodnotu 0."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr "Pokud zvolíte tuto možnost, objeví se na liště ikona metody."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, objeví se na liště název vstupní metody."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr "Pokud zvolíte tuto možnost, objeví se na liště ikona přišpendlení."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr "Pokud zvolíte tuto možnost, objeví se na liště ikona nabídky."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr "Pokud zvolíte tuto možnost, objeví se na liště ikona nápovědy."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, objeví se na liště ikona vlastností vstupní "
+#~ "metody."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, připojí se vstupního okna vyhledávací tabulka."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, zobrazí se vyhledávací tabulka vertikálně."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr "Pokud zvolíte tuto možnost, zapustí se ikona programu do panelu."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, lišta nástrojů, vstupní okno a vyhledávací "
+#~ "tabulka se přišpendlí do původní pozice."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr "Nastavení písma v okně vstupu a ve vyhledávací tabulce."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Zvolte písmo rozhraní"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "Rozhraní"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMEngine"
+
+#~ msgid "Panel"
+#~ msgstr "Panel"
+
+#~ msgid "Extra"
+#~ msgstr "Rozšíření"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Nastavení vstupní metody SCIM"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ "<span size=\"20000\">Smart Common Input Method platforma</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Grafické rozhraní</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Nastavení %s modulů.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Chcete skutečně ukončit nastavení SCIM?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Ne všechna nastavení lze zavést za běhu. Nezapomeňte SCIM restartovat."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Nastavit SCIM"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "Grafické rozhraní založené na knihovně GTK Widget."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "Nástroj pro nastavení Smart Common Input Method platformy"
+
+#~ msgid "SCIM Help"
+#~ msgstr "Nápověda SCIM"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Input Method"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Přišpendlit/odšpendlit vstupní okno a nástrojovou lištu."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "Zobrazí krátkou nápovědu o aktuální vstupní metodě."
+
+#~ msgid "Show command menu."
+#~ msgstr "Zobrazí nabídku příkazů."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Obnovit konfiguraci"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Přišpendlit okno"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Skrýt lištu"
+
+#~ msgid "Help ..."
+#~ msgstr "Nápověda..."
+
+#~ msgid "Exit"
+#~ msgstr "Ukončit"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "En"
--- /dev/null
+# translation of de.po to German
+# This file is distributed under the same license as the scim package.
+# Copyright (C) 2004 THE scim'S COPYRIGHT HOLDER.
+#
+#
+# Jan Hefti <j.hefti@hamburg.de>, 2004.
+# Jan Hefti <j.hefti@chinaboard.de>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: de\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 20:17+0900\n"
+"PO-Revision-Date: 2005-12-16 14:10+0100\n"
+"Last-Translator: Jan Hefti <j.hefti@chinaboard.de>\n"
+"Language-Team: German <scim-devel@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: KBabel 1.11\n"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "Tastenauswahl"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Option"
+msgstr "Optionen"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "Deutsch"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "Deutsch/Tastatur"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Tastenauswahl"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "Tastenauswahl"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "Deutsch/Tastatur"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "Optionen"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "Deutsch/Tastatur"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "Deutsch/Tastatur"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "Englisch (USA)"
+
+#~ msgid "Amharic"
+#~ msgstr "Amharisch"
+
+#~ msgid "Arabic"
+#~ msgstr "Arabisch"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "Arabisch (Ägypten)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "Arabisch (Libanon)"
+
+#~ msgid "Assamese"
+#~ msgstr "Assamesisch"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "Aserbaidschanisch"
+
+#~ msgid "Belarusian"
+#~ msgstr "Weißrussisch"
+
+#~ msgid "Bulgarian"
+#~ msgstr "Bulgarisch"
+
+#~ msgid "Bengali"
+#~ msgstr "Bengalisch"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "Bengalisch (Indien)"
+
+#~ msgid "Tibetan"
+#~ msgstr "Tibetisch"
+
+#~ msgid "Bosnian"
+#~ msgstr "Bosnisch"
+
+#~ msgid "Catalan"
+#~ msgstr "Katalanisch"
+
+#~ msgid "Czech"
+#~ msgstr "Tschechisch"
+
+#~ msgid "Welsh"
+#~ msgstr "Walisisch"
+
+#~ msgid "Danish"
+#~ msgstr "Dänisch"
+
+#~ msgid "German"
+#~ msgstr "Deutsch"
+
+#~ msgid "Greek"
+#~ msgstr "Griechisch"
+
+#~ msgid "English"
+#~ msgstr "Englisch"
+
+#~ msgid "English (Australian)"
+#~ msgstr "Englisch (Australien)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "Englisch (Kanada)"
+
+#~ msgid "English (British)"
+#~ msgstr "Englisch (Großbritannien)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "Englisch (Irland)"
+
+#~ msgid "English (American)"
+#~ msgstr "Englisch (USA)"
+
+#~ msgid "Spanish"
+#~ msgstr "Spanisch"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#~ msgid "Estonian"
+#~ msgstr "Estnisch"
+
+#~ msgid "Basque"
+#~ msgstr "Baskisch"
+
+#~ msgid "Persian"
+#~ msgstr "Persisch"
+
+#~ msgid "Finnish"
+#~ msgstr "Finnisch"
+
+#~ msgid "French"
+#~ msgstr "Französisch"
+
+#~ msgid "Irish"
+#~ msgstr "Irisch"
+
+#~ msgid "Galician"
+#~ msgstr "Galizisch"
+
+#~ msgid "Gujarati"
+#~ msgstr "Gujarati"
+
+#~ msgid "Hebrew"
+#~ msgstr "Hebräisch"
+
+#~ msgid "Hindi"
+#~ msgstr "Hindi"
+
+#~ msgid "Croatian"
+#~ msgstr "Kroatisch"
+
+#~ msgid "Hungarian"
+#~ msgstr "Ungarisch"
+
+#, fuzzy
+#~ msgid "Armenian"
+#~ msgstr "Rumänisch"
+
+#~ msgid "Interlingua"
+#~ msgstr "Interlingua"
+
+#~ msgid "Indonesian"
+#~ msgstr "Indonesisch"
+
+#~ msgid "Icelandic"
+#~ msgstr "Isländisch"
+
+#~ msgid "Italian"
+#~ msgstr "Italienisch"
+
+#~ msgid "Japanese"
+#~ msgstr "Japanisch"
+
+#, fuzzy
+#~ msgid "Georgian"
+#~ msgstr "Deutsch"
+
+#~ msgid "Kazakh"
+#~ msgstr "Kasachisch"
+
+#~ msgid "Cambodian"
+#~ msgstr "Kambodschanisch"
+
+#~ msgid "Kannada"
+#~ msgstr "Kannada"
+
+#~ msgid "Korean"
+#~ msgstr "Koreanisch"
+
+#~ msgid "Laothian"
+#~ msgstr "Laotisch"
+
+#~ msgid "Lithuanian"
+#~ msgstr "Litauisch"
+
+#~ msgid "Latvian"
+#~ msgstr "Lettisch"
+
+#~ msgid "Macedonian"
+#~ msgstr "Mazedonisch"
+
+#~ msgid "Malayalam"
+#~ msgstr "Malajalam"
+
+#~ msgid "Mongolian"
+#~ msgstr "Mongolisch"
+
+#~ msgid "Marathi"
+#~ msgstr "Marathi"
+
+#~ msgid "Malay"
+#~ msgstr "Malaysisch"
+
+#~ msgid "Nepali"
+#~ msgstr "Nepalesisch"
+
+#~ msgid "Dutch"
+#~ msgstr "Niederländisch"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "Norwegisch (Nynorsk)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "Norwegisch (Bokmal)"
+
+#~ msgid "Oriya"
+#~ msgstr "Orija"
+
+#~ msgid "Punjabi"
+#~ msgstr "Pandschabi"
+
+#~ msgid "Polish"
+#~ msgstr "Polnisch"
+
+#~ msgid "Portuguese"
+#~ msgstr "Portugiesisch"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "Portugiesisch (Brasilien)"
+
+#~ msgid "Romanian"
+#~ msgstr "Rumänisch"
+
+#~ msgid "Russian"
+#~ msgstr "Russisch"
+
+#~ msgid "Slovak"
+#~ msgstr "Slowakisch"
+
+#~ msgid "Slovenian"
+#~ msgstr "Slowenisch"
+
+#~ msgid "Albanian"
+#~ msgstr "Albanisch"
+
+#~ msgid "Serbian"
+#~ msgstr "Serbisch"
+
+#~ msgid "Swedish"
+#~ msgstr "Schwedisch"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "Schwedisch (Finnland)"
+
+#~ msgid "Tamil"
+#~ msgstr "Tamilisch"
+
+#~ msgid "Telugu"
+#~ msgstr "Telugu"
+
+#~ msgid "Thai"
+#~ msgstr "Thai"
+
+#~ msgid "Turkish"
+#~ msgstr "Türkisch"
+
+#~ msgid "Uighur"
+#~ msgstr "Uigurisch"
+
+#~ msgid "Ukrainian"
+#~ msgstr "Ukrainisch"
+
+#~ msgid "Urdu"
+#~ msgstr "Urdu"
+
+#~ msgid "Uzbek"
+#~ msgstr "Usbekisch"
+
+#~ msgid "Vietnamese"
+#~ msgstr "Vietnamesisch"
+
+#~ msgid "Walloon"
+#~ msgstr "Wallonisch"
+
+#~ msgid "Yiddish"
+#~ msgstr "Jiddisch"
+
+#~ msgid "Chinese"
+#~ msgstr "Chinesisch"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "Chinesisch (vereinfacht)"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "Chinesisch (traditionell)"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "Belgisch"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "Englisch (US)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "Englisch (Kanada)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "Englisch (Irland)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "Englisch (Großbritannien)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "Englisch (USA)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "Englisch (Kanada)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "Englisch (Großbritannien)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "Englisch (Großbritannien)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "Englisch (Kanada)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "Englisch (Großbritannien)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "Französisch (Kanada)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "Französisch (Kanada)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "Französisch (Kanada)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "Deutsch (Schweiz)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "Französisch (Kanada)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "Deutsch (mit deadkeys)"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "Deutsch (Schweiz)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "Englisch (Australien)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "Deutsch (Schweiz)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "Deutsch (Schweiz)"
+
+#, fuzzy
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "Portugiesisch (Brasilien)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "Portugiesisch (Brasilien)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "Spanisch (Lateinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "Spanisch (Lateinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "Spanisch (Lateinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "Spanisch (Lateinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "Spanisch (Lateinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "Spanisch (CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "Malajalam"
+
+#~ msgid "Norwegian"
+#~ msgstr "Norwegisch"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "Serbisch"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "Chinesisch (traditionell)"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "Chinesisch (traditionell)"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "Chinesisch (traditionell)"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "Chinesisch"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "Chinesisch (vereinfacht)"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "Arabisch (Ägypten)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "Arabisch (Ägypten)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "Arabisch (Ägypten)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "Arabisch (Ägypten)"
+
+#~ msgid "Other"
+#~ msgstr "Sonstige"
+
+#~ msgid "Unknown"
+#~ msgstr "Unbekannt"
+
+#~ msgid "English (US)"
+#~ msgstr "Englisch (US)"
+
+#~ msgid "Belgian"
+#~ msgstr "Belgisch"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "Tschechisch (qwerty)"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "Französisch (Schweiz) "
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "Deutsch (mit deadkeys)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "Portugiesisch (Brasilien, US, Akzente)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "Slovakisch (qwerty)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "Spanisch (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "Spanisch (Lateinamerika)"
+
+#~ msgid "English (UK)"
+#~ msgstr "Englisch (UK)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "Umwandlung vereinfachtes/traditionelles Chinesisch"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "Vereinfachtes in traditionelles Chinesisch umwandeln und umgekehrt"
+
+#~ msgid "SC-TC"
+#~ msgstr "VC-TC"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "Umwandlung vereinfachtes->traditionelles Chinesisch"
+
+#~ msgid "No Conversion"
+#~ msgstr "Keine Umwandlung"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "Vereinfacht zu traditionell"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "Vereinfachtes Chinesisch in traditionelles Chinesisch umwandeln"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "Traditionell zu vereinfacht"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "Traditionelles Chinesisch in vereinfachtes Chinesisch umwandeln"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "VC->TC"
+
+#~ msgid "TC->SC"
+#~ msgstr "TC->VC"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "Smart Common Input Method Plattform "
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(c) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "Aktivieren"
+
+#~ msgid "Name"
+#~ msgstr "Name"
+
+#~ msgid "Cursor Position"
+#~ msgstr "Zeigerposition"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "Die aktuelle Zeigerposition (in Zeichen gerechnet)."
+
+#~ msgid "Maximum length"
+#~ msgstr "Maximale Länge"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr "Maximale Anzahl angezeigter Zeichen. »0« bedeutet unbegrenzt."
+
+#~ msgid "Maximum width"
+#~ msgstr "Maximale Breite"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "Maximale Breite der angezeigten Zeichenkette."
+
+#~ msgid "Has Frame"
+#~ msgstr "Mit Rahmen"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr ""
+#~ "»Nein« entfernt den umgebenden Rahmen von der angezeigten Zeichenkette."
+
+#~ msgid "Draw cursor"
+#~ msgstr "Zeiger anzeigen"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "Wenn »ja«, wird ein blinkender Zeiger angezeigt."
+
+#~ msgid "Auto move cursor"
+#~ msgstr "Zeiger automatisch verschieben"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr ""
+#~ "Wenn »ja«, wird der Zeiger bei einem Mausklick automatisch verschoben."
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "Knopfdruck zum Übertragen"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr ""
+#~ "Wenn »ja«, wird der gewählte Ausdruck beim jeweiligen Knopfdruck zum "
+#~ "Programm übertragen."
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "Anzeigefläche automatisch an Zeichenkette anpassen"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "Bei »ja« ist die automatische Größenanpassung aktiviert."
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr ""
+#~ "Wenn »ja«, wird der Zeiger bei einem Mausklick automatisch verschoben."
+
+#~ msgid "Width in chars"
+#~ msgstr "Breite in Zeichen"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr ""
+#~ "Anzahl der Zeichen, für die in der Anzeige Platz gelassen werden soll."
+
+#~ msgid "Scroll offset"
+#~ msgstr "Verschiebeversatz"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr ""
+#~ "Anzahl der Pixel, um die die Anzeige außerhalb des Bildschirms nach links "
+#~ "verschoben wird"
+
+#~ msgid "Text"
+#~ msgstr "Text"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "Inhalt der Zeichenkettenanzeige"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "Gewählte _Tasten:"
+
+#~ msgid "Key Code:"
+#~ msgstr "Tastencode:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "Sondertasten:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Strg"
+
+#~ msgid "A_lt"
+#~ msgstr "_Alt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Umschalt"
+
+#~ msgid "_Release"
+#~ msgstr "_Loslassen"
+
+#~ msgid "_Meta"
+#~ msgstr "_Meta"
+
+#~ msgid "S_uper"
+#~ msgstr "Su_per"
+
+#~ msgid "_Hyper"
+#~ msgstr "_Hyper"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "Bitte geben Sie zuerst einen Tastencode ein."
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "Drücken Sie eine Taste (oder eine Tastenkombination).\n"
+#~ "Dieser Dialog wird geschlossen, wenn die Tasten gelöst werden."
+
+#~ msgid "Grabbing a key."
+#~ msgstr "Erfassen der Tasten."
+
+#~ msgid "Key Selection"
+#~ msgstr "Tastenauswahl"
+
+#~ msgid "Orientation"
+#~ msgstr "Ausrichtung"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "Die Ausrichtung des Systemabschnitts der Kontrollleiste."
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "Text"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amharisch"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Immer"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Optionen"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Deutsch/Tastatur"
+
+#~ msgid "English/European"
+#~ msgstr "Deutsch/Europäisch"
+
+#~ msgid "RAW CODE"
+#~ msgstr "Unicode Rohdaten"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(c) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Tastenkürzel:\n"
+#~ "\n"
+#~ " Steuerung+u:\n"
+#~ " Umschalten zwischen Multibyte-Codierung und Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " Eingabemethode zurücksetzen.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr ""
+#~ "Der Status der aktuell verwendeten Eingabemethode. Klicken Sie diesen an, "
+#~ "um ihn zu ändern."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Globale Einstellungen"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Stellen Sie die globalen Optionen ein, die von allen FrontEnd-Modulen "
+#~ "beachtet werden, einschließlich dem X11 FrontEnd, GKT IMModule, QT "
+#~ "IMModule, usw."
+
+#~ msgid "_Trigger:"
+#~ msgstr "_Auslöser:"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Tasten zum Auslösen auswählen"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen die Eingabemethode SCIM an- und "
+#~ "ausgeschaltet wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "Turn _On:"
+#~ msgstr "_Einschalten:"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Tasten zum Einschalten auswählen"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen die Eingabemethode SCIM eingeschaltet "
+#~ "wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "A_usschalten"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Tasten zum Ausschalten auswählen"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen die Eingabemethode SCIM ausgeschaltet "
+#~ "wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "_Next input method:"
+#~ msgstr "_Nächste Eingabemethode:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr ""
+#~ "Wählen Sie die Tastenkombinationen, um zur nächsten Eingabemethode zu "
+#~ "wechseln"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen zur nächsten Eingabemethode gewechselt "
+#~ "wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "_Vorherige Eingabemethode:"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr ""
+#~ "Wählen Sie die Tastenkombinationen, um zur vorherigen Eingabemethode zu "
+#~ "wechseln"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen zur vorherigen Eingabemethode gewechselt "
+#~ "wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "Zeige _Auswahlmenü für Eingabemethoden:"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr ""
+#~ "Wählen Sie die Tastenkürzel, um das Auswahlmenü für Eingabemethoden "
+#~ "anzuzeigen"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen das Auswahlmenü für Eingabemethoden "
+#~ "angezeigt wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "_Tastaturlayout"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Sie sollten hier Ihr derzeit verwendetes Tastaturlayout einstellen, so "
+#~ "dass Eingabemethoden, die vom Tastaturlayout abhängig sind, korrekt "
+#~ "funktionieren."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "Roheingabe ins Client-Fenster einbetten"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird die Roheingabe - die bisher "
+#~ "eingegebenen Zeichen vor einer endgültigen Auswahl - ins Client-"
+#~ "Eingabefenster eingebettet und nicht in einem Extrafenster angezeigt."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "Dieselbe Eingabemethode unter _allen Anwendungen verwenden."
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Wenn diese Option aktiviert ist, wird ein und dieselbe Eingabemethode von "
+#~ "allen Anwendungen gleichzeitig verwendet. Andernfalls kann jede Anwendung "
+#~ "eine andere Eingabemethode verwenden."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Tastenkombinationen"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Hier können Sie die installierten Eingabemethoden aktivieren/deaktivieren "
+#~ "und ihnen Tastenkürzel zuordnen."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Installierte Eingabemethoden:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "_Tastenkürzel ändern"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr ""
+#~ "Stellen Sie die mit der gewählten Eingabemethode assoziierten "
+#~ "Tastenkürzel ein."
+
+#~ msgid "Select _Filters"
+#~ msgstr "_Filter auswählen"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr ""
+#~ "Wählen Sie die Filter, die dieser Eingabemethode zugeordnet werden sollen."
+
+#~ msgid "_Expand"
+#~ msgstr "Er_weitern"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Erweitern Sie alle Sprachgruppen."
+
+#~ msgid "_Collapse"
+#~ msgstr "Ein_klappen"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Klappen Sie alle Sprachgruppen ein."
+
+#~ msgid "E_nable All"
+#~ msgstr "Alle _aktivieren"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Alle Eingabemethoden aktivieren."
+
+#~ msgid "_Disable All"
+#~ msgstr "Alle _deaktivieren"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Alle Eingabemethoden deaktivieren."
+
+#~ msgid "Filters"
+#~ msgstr "Filter"
+
+#~ msgid "Languages"
+#~ msgstr "Sprachen"
+
+#~ msgid "Description"
+#~ msgstr "Beschreibung"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Tastenkürzel für %s ändern"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Filter für %s wählen"
+
+#~ msgid "Move _Up"
+#~ msgstr "Nach _oben"
+
+#~ msgid "Move _Down"
+#~ msgstr "Nach _unten"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr ""
+#~ "Ein Kontrollleisten-Hilfsprogramm, das auf der GTK+-2.x-Bibliothek beruht."
+
+#~ msgid "On demand"
+#~ msgstr "Auf Anforderung"
+
+#~ msgid "Never"
+#~ msgstr "Nie"
+
+#~ msgid "ToolBar"
+#~ msgstr "Symbolleiste"
+
+#~ msgid "_Show:"
+#~ msgstr "_Zeige:"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Automatisch ein_rasten"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Symbol für die Eingabe_methode anzeigen"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "_Name der Eingabemethode anzeigen"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "_Ausblenden nach (sek):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Symbol »Immer im _Vordergrund« anzeigen"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Symbol »_Menü« anzeigen"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Symbol »_Hilfe« anzeigen"
+
+#~ msgid "Show _property label"
+#~ msgstr "_Bezeichnung der Eigenschaften anzeigen"
+
+#~ msgid "Input window"
+#~ msgstr "Eingabefenster"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "Ein_gebettete Auswahlliste"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "_Vertikale Auswahlliste"
+
+#~ msgid "Misc"
+#~ msgstr "Verschiedenes"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Symbol im _Benachrichtigungsfeld anzeigen"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Fenster behält _Position"
+
+#~ msgid "_Font:"
+#~ msgstr "_Schriftart:"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Wenn »Immer« gewählt ist, wird die Symbolleiste immer auf dem Bildschirm "
+#~ "angezeigt. Bei »Auf Anforderung« wird sie nur angezeigt, wenn SCIM "
+#~ "aktiviert ist. Bei »Nie« wird sie niemals angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird die Symbolleiste am Bildschirmrand "
+#~ "eingerastet."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "Die Symbolleiste wird versteckt, nachdem die angegebene Zeit vergangen "
+#~ "ist. Diese Option ist nur verfügbar, wenn »Immer anzeigen« gewählt ist. "
+#~ "Geben Sie »0« ein, um dieses Verhalten zu unterdrücken. "
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird das Symbol der aktuellen "
+#~ "Eingabemethode auf der Symbolleiste angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird der Name der aktuellen Eingabemethode "
+#~ "auf der Symbolleiste angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird das Symbol »Immer im Vordergrund "
+#~ "halten« auf der Symbolleiste angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird das Symbol »Menü« auf der Symbolleiste "
+#~ "angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird das Symbol »Hilfe« auf der "
+#~ "Symbolleiste angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, werden die Bezeichnungen der einzelnen "
+#~ "Eigenschaften der Eingabemethode auf der Symbolleiste angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird die Auswahlliste ins Eingabefenster "
+#~ "eingebettet."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird die Auswahlliste senkrecht angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird ein Symbol in der Kontrollleiste "
+#~ "angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, werden Symbolleiste, Eingabefenster und "
+#~ "Auswahlliste immer an ihren jeweiligen Ausgangspositionen gehalten."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "Die eingestellte Schriftart wird in Eingabefenster und Auswahlliste "
+#~ "verwendet."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Schriftart für die Benutzeroberfläche wählen"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "Benutzeroberfläche"
+
+#~ msgid "IMEngine"
+#~ msgstr "Eingabemethoden"
+
+#~ msgid "Panel"
+#~ msgstr "Kontrollleiste"
+
+#~ msgid "Extra"
+#~ msgstr "Extra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Einstellungen der SCIM-Eingabemethoden"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Smart Common Input Method-Plattform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Grafisches Einrichtungswerkzeug</"
+#~ "span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Einstellungen der %s-Module.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Möchten Sie die Einstellung von SCIM wirklich verlassen?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Nicht alle Einstellungen können bei laufendem Programm neu geladen "
+#~ "werden. Starten Sie bitte SCIM neu, damit alle Änderungen übernommen "
+#~ "werden."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Einrichtung von SCIM"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr ""
+#~ "Integriertes Einrichtungswerkzeug, das auf der GTK Widget-Bibliothek "
+#~ "beruht."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "Einrichtungswerkzeug für die Smart Common Input Method-Plattform"
+
+#~ msgid "SCIM Help"
+#~ msgstr "Hilfe zu SCIM"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Input Method"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Eingabefenster und Symbolleiste festsetzen/verschiebbar machen."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "Zeige eine kurze Hilfe zu SCIM und zur gewählten Eingabemethode."
+
+#~ msgid "Show command menu."
+#~ msgstr "Befehlsmenü anzeigen."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(c) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Einstellungen neu laden"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Werkzeugleiste festsetzen"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Symbolleiste verstecken"
+
+#~ msgid "Help ..."
+#~ msgstr "Hilfe ..."
+
+#~ msgid "Exit"
+#~ msgstr "Beenden"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "De"
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 20:17+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+msgid "Selection"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, c-format
+msgid "Option"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+msgid "General"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+msgid "S/W keyboard"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+msgid "Keyboard selection"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+msgid "Keyboard option"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+msgid "H/W keyboard"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+msgid "option"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+msgid "Keyboard"
+msgstr ""
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 20:17+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+msgid "Selection"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, c-format
+msgid "Option"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+msgid "General"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+msgid "S/W keyboard"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+msgid "Keyboard selection"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+msgid "Keyboard option"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+msgid "H/W keyboard"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+msgid "option"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+msgid "Keyboard"
+msgstr ""
--- /dev/null
+# Finnish translation for scim
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the scim package.
+# Timo Jyrinki <timo.jyrinki@iki.fi>, 2006.
+# note: GFTT is at http://www.gnome.fi/
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: scim\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 20:17+0900\n"
+"PO-Revision-Date: 2006-05-24 16:51+0000\n"
+"Last-Translator: Timo Jyrinki <timo.jyrinki@iki.fi>\n"
+"Language-Team: Finnish <gnome-fi-laatu@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "Näppäimen valinta"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Option"
+msgstr "Valinnat"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "saksa"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "englanti/näppäimistö"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Näppäimen valinta"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "Näppäimen valinta"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "englanti/näppäimistö"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "Valinnat"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "englanti/näppäimistö"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "englanti/näppäimistö"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "englanti (amerikanenglanti)"
+
+#~ msgid "Amharic"
+#~ msgstr "amhara"
+
+#~ msgid "Arabic"
+#~ msgstr "arabia"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "arabia (Egypti)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "arabia (Libanon)"
+
+#~ msgid "Assamese"
+#~ msgstr "assami"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "azeri"
+
+#~ msgid "Belarusian"
+#~ msgstr "valkovenäjä"
+
+#~ msgid "Bulgarian"
+#~ msgstr "bulgaria"
+
+#~ msgid "Bengali"
+#~ msgstr "bengali"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "bengali (Intia)"
+
+#~ msgid "Tibetan"
+#~ msgstr "tiibetti"
+
+#~ msgid "Bosnian"
+#~ msgstr "bosnia"
+
+#~ msgid "Catalan"
+#~ msgstr "katalaani"
+
+#~ msgid "Czech"
+#~ msgstr "tšekki"
+
+#~ msgid "Welsh"
+#~ msgstr "wales"
+
+#~ msgid "Danish"
+#~ msgstr "tanska"
+
+#~ msgid "German"
+#~ msgstr "saksa"
+
+#~ msgid "Greek"
+#~ msgstr "kreikka"
+
+#~ msgid "English"
+#~ msgstr "englanti"
+
+#~ msgid "English (Australian)"
+#~ msgstr "englanti (Australia)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "englanti (Kanada)"
+
+#~ msgid "English (British)"
+#~ msgstr "englanti (Iso-Britannia)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "englanti (Irlanti)"
+
+#~ msgid "English (American)"
+#~ msgstr "englanti (amerikanenglanti)"
+
+#~ msgid "Spanish"
+#~ msgstr "espanja"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "espanja (Mexico)"
+
+#~ msgid "Estonian"
+#~ msgstr "viro"
+
+#~ msgid "Basque"
+#~ msgstr "baski"
+
+#~ msgid "Persian"
+#~ msgstr "persia"
+
+#~ msgid "Finnish"
+#~ msgstr "suomi"
+
+#~ msgid "French"
+#~ msgstr "ranska"
+
+#~ msgid "Irish"
+#~ msgstr "irlanti"
+
+#~ msgid "Galician"
+#~ msgstr "galicia"
+
+#~ msgid "Gujarati"
+#~ msgstr "gudžarati"
+
+#~ msgid "Hebrew"
+#~ msgstr "heprea"
+
+#~ msgid "Hindi"
+#~ msgstr "hindi"
+
+#~ msgid "Croatian"
+#~ msgstr "kroatia"
+
+#~ msgid "Hungarian"
+#~ msgstr "unkari"
+
+#, fuzzy
+#~ msgid "Armenian"
+#~ msgstr "romania"
+
+#~ msgid "Interlingua"
+#~ msgstr "interlingua"
+
+#~ msgid "Indonesian"
+#~ msgstr "indonesia"
+
+#~ msgid "Icelandic"
+#~ msgstr "islanti"
+
+#~ msgid "Italian"
+#~ msgstr "italia"
+
+#~ msgid "Japanese"
+#~ msgstr "japani"
+
+#, fuzzy
+#~ msgid "Georgian"
+#~ msgstr "saksa"
+
+#~ msgid "Kazakh"
+#~ msgstr "kazak"
+
+#~ msgid "Cambodian"
+#~ msgstr "kampodia/khmer"
+
+#~ msgid "Kannada"
+#~ msgstr "kannada"
+
+#~ msgid "Korean"
+#~ msgstr "korea"
+
+#~ msgid "Laothian"
+#~ msgstr "laos"
+
+#~ msgid "Lithuanian"
+#~ msgstr "liettua"
+
+#~ msgid "Latvian"
+#~ msgstr "latvia"
+
+#~ msgid "Macedonian"
+#~ msgstr "makedonia"
+
+#~ msgid "Malayalam"
+#~ msgstr "malajalam"
+
+#~ msgid "Mongolian"
+#~ msgstr "mongolia"
+
+#~ msgid "Marathi"
+#~ msgstr "marathi"
+
+#~ msgid "Malay"
+#~ msgstr "malaiji"
+
+#~ msgid "Nepali"
+#~ msgstr "nepali"
+
+#~ msgid "Dutch"
+#~ msgstr "hollanti"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "norja (nykynorja)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "norja (kirjanorja)"
+
+#~ msgid "Oriya"
+#~ msgstr "oriya"
+
+#, fuzzy
+#~ msgid "Punjabi"
+#~ msgstr "panjabi"
+
+#~ msgid "Polish"
+#~ msgstr "puola"
+
+#~ msgid "Portuguese"
+#~ msgstr "portugali"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "portugali (Brasilia)"
+
+#~ msgid "Romanian"
+#~ msgstr "romania"
+
+#~ msgid "Russian"
+#~ msgstr "venäjä"
+
+#~ msgid "Slovak"
+#~ msgstr "slovakki"
+
+#~ msgid "Slovenian"
+#~ msgstr "sloveeni"
+
+#~ msgid "Albanian"
+#~ msgstr "albania"
+
+#~ msgid "Serbian"
+#~ msgstr "serbia"
+
+#~ msgid "Swedish"
+#~ msgstr "ruotsi"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "ruotsi (Suomi)"
+
+#~ msgid "Tamil"
+#~ msgstr "tamili"
+
+#~ msgid "Telugu"
+#~ msgstr "telugu"
+
+#~ msgid "Thai"
+#~ msgstr "thai"
+
+#~ msgid "Turkish"
+#~ msgstr "turkki"
+
+#~ msgid "Uighur"
+#~ msgstr "uiguuri"
+
+#~ msgid "Ukrainian"
+#~ msgstr "ukraina"
+
+#~ msgid "Urdu"
+#~ msgstr "urdu"
+
+#~ msgid "Uzbek"
+#~ msgstr "uzbekki"
+
+#~ msgid "Vietnamese"
+#~ msgstr "vietnam"
+
+#~ msgid "Walloon"
+#~ msgstr "valloni"
+
+#~ msgid "Yiddish"
+#~ msgstr "jiddiš"
+
+#~ msgid "Chinese"
+#~ msgstr "kiina"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "kiina (yksinkertaistettu)"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "kiina (perinteinen)"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "belgia"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "englanti (USA)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "englanti (Kanada)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "englanti (Irlanti)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "englanti (Iso-Britannia)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "englanti (amerikanenglanti)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "englanti (Kanada)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "englanti (Iso-Britannia)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "englanti (Iso-Britannia)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "englanti (Kanada)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "englanti (Iso-Britannia)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "Ranska (Kanada)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "Ranska (Kanada)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "Ranska (Kanada)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "Saksa (sveitsiläinen)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "Ranska (Kanada)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "Saksa (kuolleilla näppäimillä)"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "Saksa (sveitsiläinen)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "englanti (Australia)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "Saksa (sveitsiläinen)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "Saksa (sveitsiläinen)"
+
+#, fuzzy
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "portugali (Brasilia)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "portugali (Brasilia)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "espanja (latinalainen amerikka)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "espanja (latinalainen amerikka)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "espanja (latinalainen amerikka)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "espanja (latinalainen amerikka)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "espanja (latinalainen amerikka)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "espanja (CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "malajalam"
+
+#~ msgid "Norwegian"
+#~ msgstr "norja"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "serbia"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "kiina (perinteinen)"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "kiina (perinteinen)"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "kiina (perinteinen)"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "kiina"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "kiina (yksinkertaistettu)"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "arabia (Egypti)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "arabia (Egypti)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "arabia (Egypti)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "arabia (Egypti)"
+
+#~ msgid "Other"
+#~ msgstr "Muu"
+
+#~ msgid "Unknown"
+#~ msgstr "Tuntematon"
+
+#~ msgid "English (US)"
+#~ msgstr "englanti (USA)"
+
+#~ msgid "Belgian"
+#~ msgstr "belgia"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "tšekki (qwerty)"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "Ranska (Sveitsi)"
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "Saksa (kuolleilla näppäimillä)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "portugali (Brasilia/US-aksenttimerkit)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "slovakia (qwerty)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "espanja (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "espanja (latinalainen amerikka)"
+
+#~ msgid "English (UK)"
+#~ msgstr "englanti (Iso-Britannia)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "Yksinkertaistetun/perinteisen kiinan muunnos"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "Muunna yksinkertaistetun ja perinteisen kiinan välillä"
+
+#~ msgid "SC-TC"
+#~ msgstr "yk-pk"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "Yksinkertaistetun/perinteisen kiinan muunnos"
+
+#~ msgid "No Conversion"
+#~ msgstr "Ei muunnosta"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "Yksinkertaistetusta perinteiseksi"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "Muunna yksinkertaistettu kiina perinteiseksi kiinaksi"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "Perinteisestä yksinkertaistetuksi"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "Muunna perinteisestä kiinasta yksinkertaistetuksi kiinaksi"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "yk->pk"
+
+#~ msgid "TC->SC"
+#~ msgstr "pk->yk"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "Smart Common Input Method -alusta "
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "Ota käyttöön"
+
+#~ msgid "Name"
+#~ msgstr "Nimi"
+
+#~ msgid "Cursor Position"
+#~ msgstr "Kohdistimen paikka"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "Syöttökohdistimen nykyinen paikka merkeissä."
+
+#~ msgid "Maximum length"
+#~ msgstr "Suurin pituus"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr ""
+#~ "Suurin määrä merkkejä tälle merkkijononäytölle. Nolla, jos ei aseteta."
+
+#~ msgid "Maximum width"
+#~ msgstr "Suurin leveys"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "Suurin leveys tälle merkkijononäytölle."
+
+#~ msgid "Has Frame"
+#~ msgstr "Reunus"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "FALSE poistaa ulkopuolisen reunan merkkijononäytöstä."
+
+#~ msgid "Draw cursor"
+#~ msgstr "Piirrä kohdistin"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "TRUE piirtää vilkkuvan kohdistimen."
+
+#~ msgid "Auto move cursor"
+#~ msgstr "Kohdistimen siirto"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr "TRUE siirtää kohdistinta automaattisesti hiiren napsautukseta."
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "Edelleenlähetä painikkeen painallus"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr "TRUE lähettää painikkeen painalluksen edelleen käyttäjäohjelmalle."
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "Muuta elementin kokoa merkkijonon mukaan"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "TRUE Automaattinen koon muuttaminen käytössä."
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr "TRUE siirtää kohdistinta automaattisesti hiiren napsautukseta."
+
+#~ msgid "Width in chars"
+#~ msgstr "Leveys merkeissä"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr "Merkkijononäyttöön jätettävän tyhjän tilan määrä merkeissä."
+
+#~ msgid "Scroll offset"
+#~ msgstr "Vieritysmäärä"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr "Merkkijonon vierityksen määrä pikseleissä"
+
+#~ msgid "Text"
+#~ msgstr "Teksti"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "Merkkijononäytön sisältö"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "Valitus _näppäimet:"
+
+#~ msgid "Key Code:"
+#~ msgstr "Näppäinkoodi:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "Pohjassa olevat näppäimet:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Ctrl"
+
+#~ msgid "A_lt"
+#~ msgstr "A_lt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Shift"
+
+#~ msgid "_Release"
+#~ msgstr "_Release"
+
+#~ msgid "_Meta"
+#~ msgstr "_Meta"
+
+#~ msgid "S_uper"
+#~ msgstr "S_uper"
+
+#~ msgid "_Hyper"
+#~ msgstr "_Hyper"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "Syötä näppäinkoodi ensin."
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "Paina näppäintä (tai näppäinyhdistelmää).\n"
+#~ "Tämä ikkuna sulkeutuu kun näppäin vapautetaan."
+
+#~ msgid "Grabbing a key."
+#~ msgstr "Odotetaan näppäintä."
+
+#~ msgid "Key Selection"
+#~ msgstr "Näppäimen valinta"
+
+#~ msgid "Orientation"
+#~ msgstr "Suunta"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "Ilmoitusalueen suunta."
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "Teksti"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "amhara"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Aina"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Valinnat"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "englanti/näppäimistö"
+
+#~ msgid "English/European"
+#~ msgstr "englanti/eurooppalainen"
+
+#~ msgid "RAW CODE"
+#~ msgstr "RAW CODE"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Pikanäppäimet:\n"
+#~ "\n"
+#~ " Ctrl+u:\n"
+#~ " vaihda monitavukoodauksen ja Unicoden välillä.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " palauta syöttötavan oletusarvot.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "Nykyisen syöttötavan tila. Napsauta vaihtaaksesi."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Globaalit asetukset"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Aseta yleiset kaikkien edustaohjelmien käyttämät asetukset, mukaanlukien "
+#~ "X11-, GTK-, IMModule-, QT IMModule-ohjelmat"
+
+#~ msgid "_Trigger:"
+#~ msgstr "_Liipaisin"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Valitse liipaisinnäppäimet"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat jotka ottavat käyttöön / poistavat käytöstä SCIM-"
+#~ "syöttötavan. Napsauta oikealla olevaa painiketta muokataksesi sitä."
+
+#~ msgid "Turn _On:"
+#~ msgstr "Ota _käyttöön"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Valitse \"ota käyttöön\"-näppäimet"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat jotka ottavat SCIM-syöttötavan käyttöön. Napsauta "
+#~ "oikealla olevaa painiketta muokataksesi sitä."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "_Poista käytöstä:"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Valitse \"poista käytöstä\"-näppäimet"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat jotka poistavat SCIM-syöttötavan käyttöstä. Napsauta "
+#~ "oikealla olevaa painiketta muokataksesi sitä."
+
+#~ msgid "_Next input method:"
+#~ msgstr "_Seuraava syöttötapa:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "Valitse \"seuraava syöttötapa\"-näppäimet"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat joilla vaihdetaan seuraavaan syöttötapaan. Napsauta "
+#~ "painiketta oikealla muokataksesi."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "_Edellinen syöttötapa:"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Valitse \"edellinen syöttötapa\"-näppäimet"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat joilla vaihdetaan edelliseen syöttötapaan. Napsauta "
+#~ "painiketta oikealla muokataksesi."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "Näytä syöttötapa_valikko"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "Valitse näppäimet joilla syöttötapavalikko näytetään"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat joilla syöttötapavalikko näytetään. Napsauta painiketta "
+#~ "oikealla muokataksesi."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "_Näppäimistöasettelu"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Valitse nykyinen näppäimistöasettelu tässä, jotta näppäimistöasettelusta "
+#~ "välittävät syöttötavat toimisivat oikein."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "_Sisällytä \"preedit\"-merkkijono asiakasikkunaan"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Jos tämä on valittu, \"preedit\"-merkkijono näytetään suoraan "
+#~ "asiakasikkunassa erillisen kelluvan ikkunan sijaan."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "_Jaa sama syöttötapa kaikkien ohjelmien kanssa"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Jos tämä on valittu, yhtä syöttötapaa käytetään kaikissa ohjelmissa. "
+#~ "Muutoin eri syöttötapa voidaan valita eri ohjelmille."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Pikanäppäimet"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Voit ottaa käyttöön / pois käytöstä syöttötapoja ja asettaa pikanäppäimiä "
+#~ "syöttötavoille."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Asennetut syöttötapapalvelut:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "Muokkaa _pikanäppäimiä"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "Muokkaa valittuun syöttötapaan liittyviä pikanäppäimiä."
+
+#~ msgid "Select _Filters"
+#~ msgstr "Valitse _suotimet"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "Valitse suotimet jotka liitetään tähän syöttötapaan."
+
+#~ msgid "_Expand"
+#~ msgstr "_Laajenna"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Laajenna kaikki kieliluokat"
+
+#~ msgid "_Collapse"
+#~ msgstr "_Supista"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Supista kaikki kieliluokat"
+
+#~ msgid "E_nable All"
+#~ msgstr "Ota _käyttöön kaikki"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Ottaa kaikki syöttötavat käyttöön."
+
+#~ msgid "_Disable All"
+#~ msgstr "_Poista käytöstä kaikki"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Poistaa kaikki syöttötavat käytöstä."
+
+#~ msgid "Filters"
+#~ msgstr "Suotimet"
+
+#~ msgid "Languages"
+#~ msgstr "Kielet"
+
+#~ msgid "Description"
+#~ msgstr "Kuvaus"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Muokkaa pikanäppäimiä: %s"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Valitse suotimet: %s"
+
+#~ msgid "Move _Up"
+#~ msgstr "Siirrä _ylös"
+
+#~ msgid "Move _Down"
+#~ msgstr "Siirrä _alas"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "GTK+-2.x-kirjastoon perustuva paneelisovellus"
+
+#~ msgid "On demand"
+#~ msgstr "Tarvittaessa"
+
+#~ msgid "Never"
+#~ msgstr "Ei koskaan"
+
+#~ msgid "ToolBar"
+#~ msgstr "Työkalupalkki"
+
+#~ msgid "_Show:"
+#~ msgstr "_Näytä:"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Automaattinen k_ohdistus"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Näytä _syöttötapakuvake"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "Näytä syöttätavan _nimi"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "Piilota aika_katkaisu"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Näytä _tikkukuvake"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Näytä _valikkokuvake"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Näytä o_hjekuvake"
+
+#~ msgid "Show _property label"
+#~ msgstr "Näytä ominaisuusnimi_ö"
+
+#~ msgid "Input window"
+#~ msgstr "Syöttöikkuna"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "S_ulautettu etsintätaulukko"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "_Pystysuuntainen etsintätaulukko"
+
+#~ msgid "Misc"
+#~ msgstr "Muut"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Näytä _ilmoitusalueen kuvake"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Koh_dista ikkunat"
+
+#~ msgid "_Font:"
+#~ msgstr "_Kirjasin:"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Jos valinta \"aina\" on valittu, työkalupalkki näytetään aina ruudulla. "
+#~ "Jos \"tarvittaessa\" on valittu, se näytetään vain SCIMin ollessa "
+#~ "aktiivisena. Valinnalla \"Never\" palkkia ei näytetä koskaan."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr "Jos tämä on valittu, työkalupalkki kohdistetaan ruudun reunaan."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "Työkalupalkki piilotetaan kun määritelty aika on kulunut. Tämä valinta on "
+#~ "kelvollinen vain jos \"Näytä aina\" on valittu. Aseta nollaksi "
+#~ "poistaaksesi piilotuksen käytöstä."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr "Jos tämä on valittu, syöttötapakuvake näytetään työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr "Jos tämä on valittu, syöttötavan nimi näytetään työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr "Jos tämä on valittu, kohdistuskuvake näytetään työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr "Jos tämä on valittu, valikkokuvake näytetään työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr "Jos tämä on valittu, ohjekuvake näytetään työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Jos tämä on valittu, syöttötapa-asetusten teksti näytetään "
+#~ "työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr "Jos tämä on valittu, etsintätaulukko sisällytetään syöttöikkunaan."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr "Jos tämä on valittu, etsintätaulukko näytetään pystysuuntaisesti."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Jos tämä on valittu, ilmoitusalueen kuvake näytetään työpöydän "
+#~ "työkalupalkissa"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Jos tämä on valittu, työkalupalkki, syöttö- ja etsintätaulukkoikkunat "
+#~ "kohdistetaan alkuperäisiin sijainteihinsa."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "Kirjasinasetusta käytetään syöttötapa- ja etsintätaulukkoikkunoihin."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Valitse käyttöliittymän kirjasin"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "Edustaohjelma"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMEngine"
+
+#~ msgid "Panel"
+#~ msgstr "Paneeli"
+
+#~ msgid "Extra"
+#~ msgstr "Ekstra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "SCIM syöttötapojen valinta"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Smart Common Input Method -alusta</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Graafinen asetusohjelma</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Asetukset moduulille \"%s\".</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Haluatko poistua SCIMin asetuksista?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Kaikkia asetuksia ei voida vaihtaa lennossa. Käynnistä SCIM uudelleen "
+#~ "ottaaksesi kaikki uudet asetukset käyttöön."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "SCIM-asetukset"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "GTK-elementtikirjastoon perustuva asetusohjelma."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "Asetusohjelma Smart Common Input Method -alustalle"
+
+#~ msgid "SCIM Help"
+#~ msgstr "SCIM-ohje"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Input Method"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Kohdista tai poista syöttöikkunan ja työkalurivun kohdistus."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "Näytä lyhyt ohje SCIMistä sekä nykyinen syöttötapa."
+
+#~ msgid "Show command menu."
+#~ msgstr "Näytä komentovalikko."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Lataa asetukset uudelleen"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Kohdista ikkunat"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Piilota työkalupalkki"
+
+#~ msgid "Help ..."
+#~ msgstr "Ohje ..."
+
+#~ msgid "Exit"
+#~ msgstr "Poistu"
--- /dev/null
+# translation of fr.po to French
+# This file is distributed under the same license as the scim package.
+# Copyright (C) 2004 James Su <suzhe@tsinghua.org.cn>.
+#
+# Damien Menanteau <MengDaming@nerdshack.com>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: fr\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 20:17+0900\n"
+"PO-Revision-Date: 2005-12-11 13:54+0800\n"
+"Last-Translator: Damien Menanteau <MengDaming@nerdshack.com>\n"
+"Language-Team: French\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "Sélection de Touche"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Option"
+msgstr "Options"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "Allemand"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "Français/Clavier"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Sélection de Touche"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "Sélection de Touche"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "Français/Clavier"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "Options"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "Français/Clavier"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "Français/Clavier"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "Anglais (Etats-Unis)"
+
+#~ msgid "Amharic"
+#~ msgstr "Amharique"
+
+#~ msgid "Arabic"
+#~ msgstr "Arabe"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "Arabe (Egypte)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "Arabe (Liban)"
+
+#~ msgid "Assamese"
+#~ msgstr "Assamais"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "Azerbaïdjanais"
+
+#~ msgid "Belarusian"
+#~ msgstr "Biélorusse"
+
+#~ msgid "Bulgarian"
+#~ msgstr "Bulgare"
+
+#~ msgid "Bengali"
+#~ msgstr "Bengali"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "Bengali (Inde)"
+
+#~ msgid "Tibetan"
+#~ msgstr "Tibétain"
+
+#~ msgid "Bosnian"
+#~ msgstr "Bosniaque"
+
+#~ msgid "Catalan"
+#~ msgstr "Catalan"
+
+#~ msgid "Czech"
+#~ msgstr "Tchèque"
+
+#~ msgid "Welsh"
+#~ msgstr "Gallois"
+
+#~ msgid "Danish"
+#~ msgstr "Danois"
+
+#~ msgid "German"
+#~ msgstr "Allemand"
+
+#~ msgid "Divehi"
+#~ msgstr "Maldivien"
+
+#~ msgid "Greek"
+#~ msgstr "Grec"
+
+#~ msgid "English"
+#~ msgstr "Anglais"
+
+#~ msgid "English (Australian)"
+#~ msgstr "Anglais (Australie)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "Anglais (Canada)"
+
+#~ msgid "English (British)"
+#~ msgstr "Anglais (Royaume Uni)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "Anglais (Irlande)"
+
+#~ msgid "English (American)"
+#~ msgstr "Anglais (Etats-Unis)"
+
+#~ msgid "Spanish"
+#~ msgstr "Espagnol"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "Espagnol (Mexique)"
+
+#~ msgid "Estonian"
+#~ msgstr "Estonien"
+
+#~ msgid "Basque"
+#~ msgstr "Basque"
+
+#~ msgid "Persian"
+#~ msgstr "Perse"
+
+#~ msgid "Finnish"
+#~ msgstr "Finnois"
+
+#~ msgid "French"
+#~ msgstr "Français"
+
+#~ msgid "Irish"
+#~ msgstr "Irlandais"
+
+#~ msgid "Galician"
+#~ msgstr "Galicien"
+
+#~ msgid "Gujarati"
+#~ msgstr "Gujarati"
+
+#~ msgid "Hebrew"
+#~ msgstr "Hébreu"
+
+#~ msgid "Hindi"
+#~ msgstr "Hindou"
+
+#~ msgid "Croatian"
+#~ msgstr "Croate"
+
+#~ msgid "Hungarian"
+#~ msgstr "Hongrois"
+
+#~ msgid "Armenian"
+#~ msgstr "Arménien"
+
+#~ msgid "Interlingua"
+#~ msgstr "Interlingua"
+
+#~ msgid "Indonesian"
+#~ msgstr "Indonésien"
+
+#~ msgid "Icelandic"
+#~ msgstr "Islandais"
+
+#~ msgid "Italian"
+#~ msgstr "Italien"
+
+#~ msgid "Japanese"
+#~ msgstr "Japonais"
+
+#~ msgid "Georgian"
+#~ msgstr "Géorgien"
+
+#~ msgid "Kazakh"
+#~ msgstr "Kazakh"
+
+#~ msgid "Cambodian"
+#~ msgstr "Khmer"
+
+#~ msgid "Kannada"
+#~ msgstr "Kannara"
+
+#~ msgid "Korean"
+#~ msgstr "Coréen"
+
+#~ msgid "Laothian"
+#~ msgstr "Laotien"
+
+#~ msgid "Lithuanian"
+#~ msgstr "Lituanien"
+
+#~ msgid "Latvian"
+#~ msgstr "Letton"
+
+#~ msgid "Macedonian"
+#~ msgstr "Macédonien"
+
+#~ msgid "Malayalam"
+#~ msgstr "Malayalam"
+
+#~ msgid "Mongolian"
+#~ msgstr "Mongol"
+
+#~ msgid "Marathi"
+#~ msgstr "Marathi"
+
+#~ msgid "Malay"
+#~ msgstr "Malais"
+
+#~ msgid "Burmese"
+#~ msgstr "Birman"
+
+#~ msgid "Nepali"
+#~ msgstr "Népalais"
+
+#~ msgid "Dutch"
+#~ msgstr "Néerlandais"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "Norvégien (Nynorsk)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "Norvégien (Bokmal)"
+
+#~ msgid "Oriya"
+#~ msgstr "Oriya"
+
+#~ msgid "Punjabi"
+#~ msgstr "Punjabi"
+
+#~ msgid "Polish"
+#~ msgstr "Polonais"
+
+#~ msgid "Portuguese"
+#~ msgstr "Portugais"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "Portugais (Brésil)"
+
+#~ msgid "Romanian"
+#~ msgstr "Roumain"
+
+#~ msgid "Russian"
+#~ msgstr "Russe"
+
+#~ msgid "Sinhala"
+#~ msgstr "Singhalais"
+
+#~ msgid "Slovak"
+#~ msgstr "Slovaque"
+
+#~ msgid "Slovenian"
+#~ msgstr "Slovène"
+
+#~ msgid "Albanian"
+#~ msgstr "Albanais"
+
+#~ msgid "Serbian"
+#~ msgstr "Serbe"
+
+#~ msgid "Swedish"
+#~ msgstr "Suédois"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "Suédois (Finlande)"
+
+#~ msgid "Tamil"
+#~ msgstr "Tamoul"
+
+#~ msgid "Telugu"
+#~ msgstr "Telugu"
+
+#~ msgid "Thai"
+#~ msgstr "Thaï"
+
+#~ msgid "Turkish"
+#~ msgstr "Turc"
+
+#~ msgid "Uighur"
+#~ msgstr "Uighur"
+
+#~ msgid "Ukrainian"
+#~ msgstr "Ukrainien"
+
+#~ msgid "Urdu"
+#~ msgstr "Ourdou"
+
+#~ msgid "Uzbek"
+#~ msgstr "Ouzbèque"
+
+#~ msgid "Vietnamese"
+#~ msgstr "Vietnamien"
+
+#~ msgid "Walloon"
+#~ msgstr "Wallon"
+
+#~ msgid "Yiddish"
+#~ msgstr "Yiddish"
+
+#~ msgid "Chinese"
+#~ msgstr "Chinois"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "Chinois (simplifié)"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "Chinois (traditionnel)"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "Belge"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "Anglais (US)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "Anglais (Canada)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "Anglais (Irlande)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "Anglais (Royaume Uni)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "Anglais (Etats-Unis)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "Anglais (Canada)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "Anglais (Royaume Uni)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "Anglais (Royaume Uni)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "Anglais (Canada)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "Anglais (Royaume Uni)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "Français (Canada)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "Français (Canada)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "Français (Canada)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "Allemand (Suisse)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "Français (Canada)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "Allemand (avec touches mortes)"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "Allemand (Suisse)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "Anglais (Australie)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "Allemand (Suisse)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "Allemand (Suisse)"
+
+#, fuzzy
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "Portugais (Brésil)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "Portugais (Brésil)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "Espagnol (Amérique latine)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "Espagnol (Amérique latine)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "Espagnol (Amérique latine)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "Espagnol (Amérique latine)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "Espagnol (Amérique latine)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "Espagnol (CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "Malayalam"
+
+#~ msgid "Norwegian"
+#~ msgstr "Norvégien"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "Serbe"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "Chinois (traditionnel)"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "Chinois (traditionnel)"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "Chinois (traditionnel)"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "Chinois"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "Chinois (simplifié)"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "Arabe (Egypte)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "Arabe (Egypte)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "Arabe (Egypte)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "Arabe (Egypte)"
+
+#~ msgid "Other"
+#~ msgstr "Autre"
+
+#~ msgid "Unknown"
+#~ msgstr "Inconnu"
+
+#~ msgid "English (US)"
+#~ msgstr "Anglais (US)"
+
+#~ msgid "Belgian"
+#~ msgstr "Belge"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "Tchèque (qwerty)"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "Français (Suisse)"
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "Allemand (avec touches mortes)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "Portugais (Brésil accents US)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "Slovaque (qwerty)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "Espagnol (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "Espagnol (Amérique latine)"
+
+#~ msgid "English (UK)"
+#~ msgstr "Anglais (GB)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "Conversion Chinois Simplifié-Traditionnel"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "Conversion entre chinois simplifié et chinois traditionnel"
+
+#~ msgid "SC-TC"
+#~ msgstr "CS-CT"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "Conversion Chinois Simplifié-Traditionnel"
+
+#~ msgid "No Conversion"
+#~ msgstr "Pas de conversion"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "Simplifié vers Traditionnel"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "Conversion du chinois simplifié en chinois traditionnel"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "Traditionnel vers Simplifié"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "Conversion du chinois traditionnel en chinois simplifié"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "CS->CT"
+
+#~ msgid "TC->SC"
+#~ msgstr "CT->CS"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "Plateforme Smart Common Input Method"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ " :\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "Activer"
+
+#~ msgid "Name"
+#~ msgstr "Nom"
+
+#~ msgid "Cursor Position"
+#~ msgstr "Position du Curseur"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "Position courante du curseur d'insertion dans les caractères."
+
+#~ msgid "Maximum length"
+#~ msgstr "Longueur maximale"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr ""
+#~ "Nombre maximum de caractères pour cette vue de chaîne de caractères. Zero "
+#~ "si pas de maximum."
+
+#~ msgid "Maximum width"
+#~ msgstr "Largeur maximale"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "Largeur maximale de cette vue de chaîne de caractères."
+
+#~ msgid "Has Frame"
+#~ msgstr "Avec Cadre"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "FAUX supprime le cadre extérieur de la vue de chaîne de caractères."
+
+#~ msgid "Draw cursor"
+#~ msgstr "Affichage du curseur"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "VRAI Affichage d'un curseur clignotant."
+
+#~ msgid "Auto move cursor"
+#~ msgstr "Déplacement automatique du curseur"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr ""
+#~ "VRAI Déplacement automatique de la position du curseur sur clic de souris."
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "Transmission événement d'appui de bouton"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr ""
+#~ "VRAI Fait suivre les événements d'appui de bouton vers le programme "
+#~ "client."
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "Redimensionnement automatique à la taille de la chaîne"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "VRAI Redimensionnement automatique activé."
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr ""
+#~ "VRAI Déplacement automatique de la position du curseur sur clic de souris."
+
+#~ msgid "Width in chars"
+#~ msgstr "Largeur en caractères"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr ""
+#~ "Nombre de caractères à laisser vides dans la vue de chaîne de caractères."
+
+#~ msgid "Scroll offset"
+#~ msgstr "Décalage"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr ""
+#~ "Nombre de pixels de la vue de chaîne de caractères décalés à gauche en "
+#~ "dehors de l'écran"
+
+#~ msgid "Text"
+#~ msgstr "Texte"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "Le contenu de la vue de chaîne de caractères"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "_Touches Sélectionnées :"
+
+#~ msgid "Key Code:"
+#~ msgstr "Code Touche:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "Modificateurs:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Ctrl"
+
+#~ msgid "A_lt"
+#~ msgstr "_Alt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Maj"
+
+#~ msgid "_Release"
+#~ msgstr "_Relâche"
+
+#~ msgid "_Meta"
+#~ msgstr "_Meta"
+
+#~ msgid "S_uper"
+#~ msgstr "S_uper"
+
+#~ msgid "_Hyper"
+#~ msgstr "_Hyper"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "Veuillez d'abord entrer un code de touche."
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "Appuyer sur une touche (ou une combinaison de touches).\n"
+#~ "Cette fenêtre se fermera dès que la touche sera relâchée."
+
+#~ msgid "Grabbing a key."
+#~ msgstr "Capture de touche."
+
+#~ msgid "Key Selection"
+#~ msgstr "Sélection de Touche"
+
+#~ msgid "Orientation"
+#~ msgstr "Orientation"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "Orientation du tiroir."
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "Texte"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amharique"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Toujours"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Options"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Français/Clavier"
+
+#~ msgid "English/European"
+#~ msgstr "Français/Européen"
+
+#~ msgid "RAW CODE"
+#~ msgstr "CODE BRUT"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Racourcis :\n"
+#~ "\n"
+#~ " Ctrl+u :\n"
+#~ " bascule entre encodage Multi-octets et Unicode.\n"
+#~ "\n"
+#~ " Echap :\n"
+#~ " réinitialise la méthode de saisie.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "Etat de la méthode de saisie courante. Cliquer pour la modifier."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Configuration globale"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Configurer des options globales utilisées par tous les modules frontaux, "
+#~ "incluant le frontal X11, GTK IMModule, QT IMModule etc."
+
+#~ msgid "_Trigger:"
+#~ msgstr "_Déclencheur :"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Sélectionner les touches d'activation"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Touches pour activer/désactiver SCIM. Cliquer sur le bouton de droite "
+#~ "pour les modifier."
+
+#~ msgid "Turn _On:"
+#~ msgstr "_Activer:"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Sélectionner les touches d'activation"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Touches pour activer SCIM. Cliquer sur le bouton de droite pour les "
+#~ "modifier."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "Désac_tiver:"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Sélectionner les touches de désactivation"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Touches pour désactiver SCIM. Cliquer sur le bouton de droite pour les "
+#~ "modifier."
+
+#~ msgid "_Next input method:"
+#~ msgstr "Méthode de saisie _Suivante :"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "Sélectionner les touches pour la méthode de saisie suivante"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Touches pour aller à la méthode de saisie suivante. Cliquer sur le bouton "
+#~ "de droite pour les modifier."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "Méthode de saisie _Précédente :"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Sélectionner les touches pour la méthode de saisie précédente"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Touches pour revenir à la méthode de saisie précédente. Cliquer sur le "
+#~ "bouton de droite pour les modifier."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "Accès au _Menu des méthodes de saisie :"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr ""
+#~ "Sélectionner les touches pour accéder au menu des méthodes de saisie"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Touches pour accéder au menu des méthodes de saisie. Cliquer sur le "
+#~ "bouton de droite pour les modifier."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "_Type de Clavier:"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Indiquez ici le type de clavier que vous utilisez afin que les méthodes "
+#~ "de saisie qui dépendent du type de clavier puissent fonctionner "
+#~ "correctement."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "Insérer les chaîne en préédition dans la fenêtre cliente"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, la table de préédition est affichée "
+#~ "directement dans la fenêtre de saisie, et non pas dans une fenêtre "
+#~ "indépendante."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "_Partage de la même méthode de saisie entre toutes les applications"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, la même méthode de saisie peut être "
+#~ "utilisée par toutes les applications en même temps. Dans le cas "
+#~ "contraire, chaque application utilise sa propre méthode de saisie."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Raccourcis"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Ici, vous pouvez activer/désactiver les méthodes de saisie et les jeux de "
+#~ "raccourcis pour les méthodes de saisie."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Services de méthode de saisie installés :"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "Editer les _Raccourcis"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "Editer les raccourcis associés à la méthode de saisie sélectionnée."
+
+#~ msgid "Select _Filters"
+#~ msgstr "Sélectionner les _Filtres"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "Sélectionner les Filtres à associer à cette méthode de saisie."
+
+#~ msgid "_Expand"
+#~ msgstr "_Ouvrir"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Ouvrir toutes les catégories de langage."
+
+#~ msgid "_Collapse"
+#~ msgstr "_Refermer"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Fermer toutes les catégories de langage."
+
+#~ msgid "E_nable All"
+#~ msgstr "Tout Activer"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Activer toutes les méthodes de saisie."
+
+#~ msgid "_Disable All"
+#~ msgstr "Tout Désactiver"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Désactiver toutes les méthodes de saisie."
+
+#~ msgid "Filters"
+#~ msgstr "Filtres"
+
+#~ msgid "Languages"
+#~ msgstr "Langues"
+
+#~ msgid "Description"
+#~ msgstr "Description"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Editer les raccourcis pour %s"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Sélectionner les filtres pour %s"
+
+#~ msgid "Move _Up"
+#~ msgstr "_Monter"
+
+#~ msgid "Move _Down"
+#~ msgstr "_Descendre"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "Un panneau serveur basé sur la librairie GTK+-2.x."
+
+#~ msgid "On demand"
+#~ msgstr "A la demande"
+
+#~ msgid "Never"
+#~ msgstr "Jamais"
+
+#~ msgid "ToolBar"
+#~ msgstr "Barre d'Outils"
+
+#~ msgid "_Show:"
+#~ msgstr "_Afficher"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Aligne_ment automatique"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Affichage icône méthode de _saisie"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "Affichage _nom méthode de saisie"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "_Délai avant masquage :"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Affichage icône d'épin_glage fenêtre"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Afficher l'icône de m_enu"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Affichage icône d'_aide"
+
+#~ msgid "Show _property label"
+#~ msgstr "Affichage label de p_ropriété"
+
+#~ msgid "Input window"
+#~ msgstr "Fenêtre de saisie"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "Table de recherche _embarquée"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "Table de recherche _verticale"
+
+#~ msgid "Misc"
+#~ msgstr "Divers"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Affichage icône barre de _tâches"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Epinglage _fenêtres"
+
+#~ msgid "_Font:"
+#~ msgstr "P_olice :"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Quand l'option \"Toujours\" est sélectionnée, la barre d'outils est "
+#~ "affichée en permanence à l'écran. Quand l'option \"A la demande\" est "
+#~ "sélectionnée, la barre d'outils est affichée uniquement lorsque SCIM est "
+#~ "activé. Quand l'option \"Jamais\" estsélectionnée, la barre d'outils "
+#~ "n'est jamais affichée."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, la barre d'outil s'aligne "
+#~ "automatiquement sur le bord de l'écran."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "La barre d'outils sera masquée automatiquement après l'expiration de ce "
+#~ "délai. Cette option n'est valide que si l'option \"Afficher Toujours\" "
+#~ "est sélectionnée. Une valeur de délai de 0 supprime ce comportement."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, l'icône de la méthode de saisie est "
+#~ "inséré dans la barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, le nom de la méthode de saisie est "
+#~ "inséré dans la barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, l'icône d'épinglage de fenêtre est "
+#~ "inséré dans la barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, l'icône de menu est inséré dans la "
+#~ "barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, l'icône d'aide est inséré dans la "
+#~ "barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, le label des propriétés de la "
+#~ "méthode de saisie est inséré dans la barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, la table de recherche est embarquée "
+#~ "dans la fenêtre de saisie."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, la table de recherche est affichée "
+#~ "verticalement."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, l'icône est inséré dans la barre de "
+#~ "tâches du bureau."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, les fenêtres de saisie et de "
+#~ "recherche sont maintenues à leur position originale."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "La police de caractères configurée est utilisée dans les fenêtres de "
+#~ "saisie et de recherche."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Police de Caractères"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "Interface"
+
+#~ msgid "IMEngine"
+#~ msgstr "Moteur de Saisie"
+
+#~ msgid "Panel"
+#~ msgstr "Panneau"
+
+#~ msgid "Extra"
+#~ msgstr "Extra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Configuration de la Méthode de Saisie SCIM"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Plateforme Smart Common Input Method</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Utilitaire de Configuration</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Configuration des modules %s.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Etes vous sûr de vouloir quitter SCIM Config. ?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Certains des paramètres de configuration ne peuvent pas être pris en "
+#~ "compte automatiquement. N'oubliez pas de redémarrer SCIM afin que toutes "
+#~ "les nouvelles valeurs de configuration soient prises en compte."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Configuration de SCIM"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr ""
+#~ "Utilitaire de configuration intégré basé sur la librairie GTK Widget."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr ""
+#~ "Utilitaire de configuration de la plateforme \"Smart Common Input Method\""
+
+#~ msgid "SCIM Help"
+#~ msgstr "Aide SCIM"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Input Method"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Epingle la fenêtre de saisie et la barre d'outils."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr ""
+#~ "Affiche une aide succincte sur SCIM et la méthode de saisie courante."
+
+#~ msgid "Show command menu."
+#~ msgstr "Afficher le menu des commandes."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Recharger la Configuration"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Epingler les Fenêtres"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Masquer la Barre d'Outils"
+
+#~ msgid "Help ..."
+#~ msgstr "Aide ..."
+
+#~ msgid "Exit"
+#~ msgstr "Quitter"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "Fr"
--- /dev/null
+# translation of it.po to Italian
+# translation of scim.po to Italian
+# translation of scim_1_0-it.po to Italian
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Federico Zenith <zenith@chemeng.ntnu.no>, 2004, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: it\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 20:17+0900\n"
+"PO-Revision-Date: 2005-12-13 00:36+0100\n"
+"Last-Translator: Federico Zenith <zenith@chemeng.ntnu.no>\n"
+"Language-Team: Italian <kde-i18n-it@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.10.2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "Selezione dei tasti"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Option"
+msgstr "Opzioni"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+#, fuzzy
+msgid "Auto capitalization"
+msgstr "Divisione automatica:"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+#, fuzzy
+msgid "Auto period"
+msgstr "Divisione automatica:"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "Generico"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "Inglese/Tastiera"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Selezione dei tasti"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "Selezione dei tasti"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "Inglese/Tastiera"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "Opzioni"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "Inglese/Tastiera"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "Inglese/Tastiera"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "Inglese (americano)"
+
+#~ msgid "Amharic"
+#~ msgstr "Amarico"
+
+#~ msgid "Arabic"
+#~ msgstr "Arabo"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "Arabo (Egitto)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "Arabo (Libano)"
+
+#~ msgid "Assamese"
+#~ msgstr "Assamese"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "Azerbaigiano"
+
+#~ msgid "Belarusian"
+#~ msgstr "Bielorusso"
+
+#~ msgid "Bulgarian"
+#~ msgstr "Bulgaro"
+
+#~ msgid "Bengali"
+#~ msgstr "Bengalese"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "Bengalese (India)"
+
+#~ msgid "Tibetan"
+#~ msgstr "Tibetano"
+
+#~ msgid "Bosnian"
+#~ msgstr "Bosniaco"
+
+#~ msgid "Catalan"
+#~ msgstr "Catalano"
+
+#~ msgid "Czech"
+#~ msgstr "Ceco"
+
+#~ msgid "Welsh"
+#~ msgstr "Gallese"
+
+#~ msgid "Danish"
+#~ msgstr "Danese"
+
+#~ msgid "German"
+#~ msgstr "Tedesco"
+
+#~ msgid "Greek"
+#~ msgstr "Greco"
+
+#~ msgid "English"
+#~ msgstr "Inglese"
+
+#~ msgid "English (Australian)"
+#~ msgstr "Inglese (australiano)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "Inglese (canadese)"
+
+#~ msgid "English (British)"
+#~ msgstr "Inglese (britannico)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "Inglese (Irlanda)"
+
+#~ msgid "English (American)"
+#~ msgstr "Inglese (americano)"
+
+#~ msgid "Spanish"
+#~ msgstr "Spagnolo"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "Spagnolo (Messico)"
+
+#~ msgid "Estonian"
+#~ msgstr "Estone"
+
+#~ msgid "Basque"
+#~ msgstr "Basco"
+
+#~ msgid "Persian"
+#~ msgstr "Persiano"
+
+#~ msgid "Finnish"
+#~ msgstr "Finlandese"
+
+#~ msgid "French"
+#~ msgstr "Francese"
+
+#~ msgid "Irish"
+#~ msgstr "Irlandese"
+
+#~ msgid "Galician"
+#~ msgstr "Galiziano"
+
+#~ msgid "Gujarati"
+#~ msgstr "Gujarati"
+
+#~ msgid "Hebrew"
+#~ msgstr "Ebraico"
+
+#~ msgid "Hindi"
+#~ msgstr "Hindi"
+
+#~ msgid "Croatian"
+#~ msgstr "Croato"
+
+#~ msgid "Hungarian"
+#~ msgstr "Ungherese"
+
+#, fuzzy
+#~ msgid "Armenian"
+#~ msgstr "Romeno"
+
+#~ msgid "Interlingua"
+#~ msgstr "Interlingua"
+
+#~ msgid "Indonesian"
+#~ msgstr "Indonesiano"
+
+#~ msgid "Icelandic"
+#~ msgstr "Islandese"
+
+#~ msgid "Italian"
+#~ msgstr "Italiano"
+
+#~ msgid "Japanese"
+#~ msgstr "Giapponese"
+
+#, fuzzy
+#~ msgid "Georgian"
+#~ msgstr "Tedesco"
+
+#~ msgid "Kazakh"
+#~ msgstr "Kazako"
+
+#~ msgid "Cambodian"
+#~ msgstr "Cambogiano"
+
+#~ msgid "Kannada"
+#~ msgstr "Kannada"
+
+#~ msgid "Korean"
+#~ msgstr "Coreano"
+
+#~ msgid "Laothian"
+#~ msgstr "Laotiano"
+
+#~ msgid "Lithuanian"
+#~ msgstr "Lituano"
+
+#~ msgid "Latvian"
+#~ msgstr "Lettone"
+
+#~ msgid "Macedonian"
+#~ msgstr "Macedone"
+
+#~ msgid "Malayalam"
+#~ msgstr "Malayalam"
+
+#~ msgid "Mongolian"
+#~ msgstr "Mongolo"
+
+#~ msgid "Marathi"
+#~ msgstr "Marathi"
+
+#~ msgid "Malay"
+#~ msgstr "Malese"
+
+#, fuzzy
+#~ msgid "Burmese"
+#~ msgstr "Sfoglia"
+
+#~ msgid "Nepali"
+#~ msgstr "Nepalese"
+
+#~ msgid "Dutch"
+#~ msgstr "Olandese"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "Norvegese (nynorsk)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "Norvegese (bokmål)"
+
+#~ msgid "Oriya"
+#~ msgstr "Oriya"
+
+#~ msgid "Punjabi"
+#~ msgstr "Punjabi"
+
+#~ msgid "Polish"
+#~ msgstr "Polacco"
+
+#~ msgid "Portuguese"
+#~ msgstr "Portoghese"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "Portoghese (Brasile)"
+
+#~ msgid "Romanian"
+#~ msgstr "Romeno"
+
+#~ msgid "Russian"
+#~ msgstr "Russo"
+
+#~ msgid "Slovak"
+#~ msgstr "Slovacco"
+
+#~ msgid "Slovenian"
+#~ msgstr "Sloveno"
+
+#~ msgid "Albanian"
+#~ msgstr "Albanese"
+
+#~ msgid "Serbian"
+#~ msgstr "Serbo"
+
+#~ msgid "Swedish"
+#~ msgstr "Svedese"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "Svedese (Finlandia)"
+
+#~ msgid "Tamil"
+#~ msgstr "Tamil"
+
+#~ msgid "Telugu"
+#~ msgstr "Telugu"
+
+#~ msgid "Thai"
+#~ msgstr "Tailandese"
+
+#~ msgid "Turkish"
+#~ msgstr "Turco"
+
+#~ msgid "Uighur"
+#~ msgstr "Uighur"
+
+#~ msgid "Ukrainian"
+#~ msgstr "Ucraino"
+
+#~ msgid "Urdu"
+#~ msgstr "Urdu"
+
+#~ msgid "Uzbek"
+#~ msgstr "Uzbeko"
+
+#~ msgid "Vietnamese"
+#~ msgstr "Vietnamita"
+
+#~ msgid "Walloon"
+#~ msgstr "Vallone"
+
+#~ msgid "Yiddish"
+#~ msgstr "Yiddish"
+
+#~ msgid "Chinese"
+#~ msgstr "Cinese"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "Cinese (semplificato)"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "Cinese (tradizionale)"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "Belga"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "Inglese (USA)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "Inglese (canadese)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "Inglese (Irlanda)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "Inglese (britannico)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "Inglese (americano)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "Inglese (canadese)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "Inglese (britannico)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "Inglese (britannico)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "Inglese (canadese)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "Inglese (britannico)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "Francese (canadese)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "Francese (canadese)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "Francese (canadese)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "Tedesco (svizzero)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "Francese (canadese)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "Tedesco (con tasti morti)"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "Tedesco (svizzero)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "Inglese (australiano)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "Tedesco (svizzero)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "Tedesco (svizzero)"
+
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "Portoghese (brasiliano)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "Portoghese (Brasile)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "Spagnolo (America latina)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "Spagnolo (America latina)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "Spagnolo (America latina)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "Spagnolo (America latina)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "Spagnolo (America latina)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "Spagnolo (CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "Malayalam"
+
+#~ msgid "Norwegian"
+#~ msgstr "Norvegese"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "Serbo"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "Cinese (tradizionale)"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "Cinese (tradizionale)"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "Cinese (tradizionale)"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "Cinese"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "Cinese (semplificato)"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "Arabo (Egitto)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "Arabo (Egitto)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "Arabo (Egitto)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "Arabo (Egitto)"
+
+#~ msgid "Other"
+#~ msgstr "Altro"
+
+#~ msgid "Unknown"
+#~ msgstr "Sconosciuto"
+
+#~ msgid "English (US)"
+#~ msgstr "Inglese (USA)"
+
+#~ msgid "Belgian"
+#~ msgstr "Belga"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "Ceco (qwerty)"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "Francese (Svizzera)"
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "Tedesco (con tasti morti)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "Portoghese (Brasile con accenti US)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "Slovacco (qwerty)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "Spagnolo (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "Spagnolo (America latina)"
+
+#~ msgid "English (UK)"
+#~ msgstr "Inglese (GB)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "Conversione tra cinese semplificato e tradizionale"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "Converti tra cinese semplificato e cinese tradizionale"
+
+#~ msgid "SC-TC"
+#~ msgstr "CS-CT"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "Conversione tra cinese semplificato e tradizionale"
+
+#~ msgid "No Conversion"
+#~ msgstr "Senza conversione"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "Da semplificato a tradizionale"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "Converti cinese semplificato in cinese tradizionale"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "Da tradizionale a semplificato"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "Converti cinese tradizionale in cinese semplificato"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "CS->CT"
+
+#~ msgid "TC->SC"
+#~ msgstr "CT->CS"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "Piattaforma del metodo intelligente di inserimento comune"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "Abilita"
+
+#~ msgid "Name"
+#~ msgstr "Nome"
+
+#~ msgid "Cursor Position"
+#~ msgstr "Posizione del cursore"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "La posizione attuale del cursore di inserimento in caratteri."
+
+#~ msgid "Maximum length"
+#~ msgstr "Lunghezza massima"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr ""
+#~ "Il numero massimo di caratteri per questa vista stringhe. Zero se non ce "
+#~ "n'è."
+
+#~ msgid "Maximum width"
+#~ msgstr "Larghezza massima"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "Larghezza massima di questa vista stringhe."
+
+#~ msgid "Has Frame"
+#~ msgstr "Ha cornice"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "Se falso, rimuove la cornice esterna dalla vista stringhe."
+
+#~ msgid "Draw cursor"
+#~ msgstr "Disegna cursore"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "Se vero, disegna un cursore lampeggiante."
+
+#~ msgid "Auto move cursor"
+#~ msgstr "Spostamento automatico del cursore"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr ""
+#~ "Se vero, sposta automaticamente la posizione del cursore quando si fa "
+#~ "clic con il mouse."
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "Inoltra evento di pressione di pulsante"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr ""
+#~ "Se vero, inoltra evento di pressione di pulsante al programma utente."
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "Ridimensiona automaticamente l'oggetto per adattarsi alla stringa"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "Se vero, attiva il ridimensionamento automatico."
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr ""
+#~ "Se vero, sposta automaticamente la posizione del cursore quando si fa "
+#~ "clic con il mouse."
+
+#~ msgid "Width in chars"
+#~ msgstr "Larghezza in caratteri"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr "Numero di caratteri per cui lasciare spazio nella vista stringhe."
+
+#~ msgid "Scroll offset"
+#~ msgstr "Scostamento dello scorrimento"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr ""
+#~ "Numero di pixel nella vista stringhe scorsi a sinistra dello schermo"
+
+#~ msgid "Text"
+#~ msgstr "Testo"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "Il contenuti della vista stringhe"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "Tasti sele_zionati:"
+
+#~ msgid "Key Code:"
+#~ msgstr "Codice del tasto:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "Modificatori:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Ctrl"
+
+#~ msgid "A_lt"
+#~ msgstr "A_lt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Shift"
+
+#~ msgid "_Release"
+#~ msgstr "_Rilascio"
+
+#~ msgid "_Meta"
+#~ msgstr "_Meta"
+
+#~ msgid "S_uper"
+#~ msgstr "S_uper"
+
+#~ msgid "_Hyper"
+#~ msgstr "_Hyper"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "Inserisci prima un codice del tasto."
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "Premi un tasto (o una combinazione di tasti).\n"
+#~ "Questa finestra sarà chiusa quando il tasto sarà rilasciato."
+
+#~ msgid "Grabbing a key."
+#~ msgstr "Cattura di un tasto."
+
+#~ msgid "Key Selection"
+#~ msgstr "Selezione dei tasti"
+
+#~ msgid "Orientation"
+#~ msgstr "Orientazione"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "L'orientazione del vassoio."
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "Testo"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amarico"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Sempre"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Opzioni"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Inglese/Tastiera"
+
+#~ msgid "English/European"
+#~ msgstr "Inglese/Europeo"
+
+#~ msgid "RAW CODE"
+#~ msgstr "CODICE GREZZO"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Tasti rapidi:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " passa tra la codifica multibyte e Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reimposta il metodo di inserimento.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "Lo stato del metodo di inserimento attuale. Fai clic per cambiarlo."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Configurazione globale"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Configura le opzioni globali usate da tutti i moduli di interfaccia, "
+#~ "inclusi l'interfaccia X11, i moduli di inserimento di GTK e QT, ecc."
+
+#~ msgid "_Trigger:"
+#~ msgstr "A_ttivatore:"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Seleziona i tasti di attivazione"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per accendere o spegnere il metodo di "
+#~ "inserimento. Fai clic sul pulsante a destra per modificarle."
+
+#~ msgid "Turn _On:"
+#~ msgstr "_Accendi:"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Seleziona i tasti di accensione"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per far partire il metodo di inserimento. Fai "
+#~ "clic sul pulsante a destra per modificarle."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "_Spegni:"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Seleziona i tasti di spegnimento"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per far fermare il metodo di inserimento. Fai "
+#~ "clic sul pulsante a destra per modificarle."
+
+#~ msgid "_Next input method:"
+#~ msgstr "Metodo di i_nserimento successivo:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "Seleziona i tasti del metodo di inserimento successivo"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per passare al metodo di inserimento successivo. "
+#~ "Fai clic sul pulsante a destra per modificarle."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "Metodo di inserimento _precedente:"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Seleziona i tasti del metodo di inserimento precedente"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per passare al metodo di inserimento precedente. "
+#~ "Fai clic sul pulsante a destra per modificarle."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "_Mostra il menu del metodo di inserimento:"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "Seleziona i tasti del menu del metodo di inserimento"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per mostrare il menu del metodo di inserimento. "
+#~ "Fai clic sul pulsante sulla destra per modificarle."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "Schema della _tastiera:"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Dovresti scegliere qui la tastiera che usi adesso, in modo che i metodi "
+#~ "di inserimento, che ne dipendono, funzionino correttamente."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "Incorpora la pr_emodifica delle stringhe nella finestra del client"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la stringa di premodifica sarà visualizzata "
+#~ "direttamente nella finestra di inserimento del client, piuttosto che in "
+#~ "una finestra libera."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "Condividi lo _stesso metodo di inserimento in tutte le applicazioni"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, si potrà usare un solo metodo di inserimento "
+#~ "in tutte le applicazioni allo stesso tempo. Altrimenti, ogni applicazione "
+#~ "potrà usare un metodo di inserimento diverso."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Tasti rapidi"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Qui puoi abilitare o disabilitare i metodi di inserimento e impostare i "
+#~ "loro tasti rapidi."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "I servizi di metodo di inserimento installati:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "Modi_fica tasti rapidi"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr ""
+#~ "Modifica i tasti rapidi associati con il metodo di inserimento "
+#~ "selezionato."
+
+#~ msgid "Select _Filters"
+#~ msgstr "Seleziona _filtri"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr ""
+#~ "Seleziona i filtri che saranno allegati a questo metodo di inserimento."
+
+#~ msgid "_Expand"
+#~ msgstr "_Espandi"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Espandi tutte le categorie delle lingue."
+
+#~ msgid "_Collapse"
+#~ msgstr "_Contrai"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Contrai tutte le categorie delle lingue."
+
+#~ msgid "E_nable All"
+#~ msgstr "A_bilita tutti"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Abilita tutti i metodi di inserimento."
+
+#~ msgid "_Disable All"
+#~ msgstr "_Disabilita tutti"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Disabilita tutti i metodi di inserimento."
+
+#~ msgid "Filters"
+#~ msgstr "Filtri"
+
+#~ msgid "Languages"
+#~ msgstr "Lingue"
+
+#~ msgid "Description"
+#~ msgstr "Descrizione"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Modifica i tasti rapidi per: %s"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Seleziona i filtri per: %s"
+
+#~ msgid "Move _Up"
+#~ msgstr "Sposta in s_u"
+
+#~ msgid "Move _Down"
+#~ msgstr "Sposta in _giù"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "Un demone di pannello basato sulle librerie GTK+-2.x."
+
+#~ msgid "On demand"
+#~ msgstr "A richiesta"
+
+#~ msgid "Never"
+#~ msgstr "Mai"
+
+#~ msgid "ToolBar"
+#~ msgstr "Barra degli strumenti"
+
+#~ msgid "_Show:"
+#~ msgstr "Mo_stra:"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Agga_ncia automaticamente"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Mostra icona del metodo di _inserimento"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "Mostra nome del metodo di ins_erimento"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "Nasc_ondi scadenza:"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Mostra icona dell'agganciamen_to"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Mostra icona del m_enu"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Mostra icona dell'ai_uto"
+
+#~ msgid "Show _property label"
+#~ msgstr "Mostra etichetta delle _proprietà"
+
+#~ msgid "Input window"
+#~ msgstr "Finestra di inserimento"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "Tabella di riferi_mento incorporata"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "Tabella di riferimento _verticale"
+
+#~ msgid "Misc"
+#~ msgstr "Varie"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Mostra icona del vasso_io"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Aggancia _finestre"
+
+#~ msgid "_Font:"
+#~ msgstr "_Carattere:"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Se l'opzione \"Sempre\" è segnata, la barra degli strumenti sarà sempre "
+#~ "visualizzata sullo schermo. Se è segnata l'opzione \"A richiesta\", sarà "
+#~ "mostrata solo quando viene attivato SCIM. Se è segnata l'opzione \"Mai\", "
+#~ "non sarà mai mostrata."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la barra degli strumenti sarà agganciata al "
+#~ "bordo dello schermo."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "La barra degli strumenti sarà nascosta dopo che sarà passato questo "
+#~ "tempo. Questa opzione è valida solo quando \"Visualizza sempre\" è "
+#~ "segnato. Imposta a zero per disabilitare questo comportamento."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'icona del metodo di inserimento sarà "
+#~ "mostrata nella barra degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, il nome del metodo di inserimento sarà "
+#~ "mostrato nella barra degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'icona dell'agganciamento sarà mostrata "
+#~ "sulla barra degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'icona del menu sarà mostrata nella barra "
+#~ "degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'icona dell'aiuto sarà mostrata nella barra "
+#~ "degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'etichetta di testo del metodo di "
+#~ "inserimento sarà mostrata nella barra degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la tabella di riferimento sarà incorporata "
+#~ "nella finestra di inserimento."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la tabella di riferimento sarà mostrata "
+#~ "verticalmente."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'icona del vassoio sarà mostrata nel "
+#~ "pannello del desktop."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la barra degli strumenti, le finestre di "
+#~ "inserimento e della tabella di riferimento saranno agganciate alla loro "
+#~ "posizione originale."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "L'impostazione del carattere sarà usata nelle finestre di inserimento e "
+#~ "della tabella di riferimento."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Seleziona il carattere dell'interfaccia"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "Interfaccia"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMEngine"
+
+#~ msgid "Panel"
+#~ msgstr "Pannello"
+
+#~ msgid "Extra"
+#~ msgstr "Extra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Configurazione del metodo di inserimento SCIM"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ "<span size=\"20000\">Piattaforma del metodo di inserimento comune "
+#~ "intelligente</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Programma di configurazione GUI</"
+#~ "span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">La configurazione per %s moduli.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Sei sicuro di uscire dalla configurazione di SCIM?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Non tutte le configurazioni possono essere ricaricate al volo. Non "
+#~ "dimenticarti di riavviare SCIM per permettere a tutte le nuove "
+#~ "configurazioni di avere effetto."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Configurazione di SCIM"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr ""
+#~ "Strumento di configurazione integrato basato sulla libreria di oggetti "
+#~ "GTK."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr ""
+#~ "Programma di configurazione per il metodo inserimento comune intelligente"
+
+#~ msgid "SCIM Help"
+#~ msgstr "Aiuto di SCIM"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Metodo inserimento comune intelligente"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr ""
+#~ "Aggancia o sgancia la finestra di inserimento e la barra degli strumenti."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr ""
+#~ "Visualizza un breve aiuto su SCIM e il metodo di inserimento attuale."
+
+#~ msgid "Show command menu."
+#~ msgstr "Mostra menu dei comandi."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Ricarica configurazione"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Aggancia finestre"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Nascondi la barra degli strumenti"
+
+#~ msgid "Help ..."
+#~ msgstr "Aiuto..."
+
+#~ msgid "Exit"
+#~ msgstr "Esci"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "En"
+
+#, fuzzy
+#~ msgid "_Switch input method globally"
+#~ msgstr "Mostra icona del metodo di _inserimento"
+
+#~ msgid "Preedit String mode"
+#~ msgstr "Modalità di premodifica delle stringhe"
+
+#~ msgid "X Window"
+#~ msgstr "X Window"
+
+#~ msgid "A FrontEnd module for X11R6 Window System, using XIM Protocol."
+#~ msgstr ""
+#~ "Un modulo di interfaccia per il sistema X11R6 X Window, usando il "
+#~ "protocollo XIM."
+
+#~ msgid "XIM Settings"
+#~ msgstr "Impostazioni XIM"
+
+#~ msgid "_On The Spot"
+#~ msgstr "Al v_olo"
+
+#~ msgid ""
+#~ "If this option is checked, the OnTheSpot input style will be used when "
+#~ "the client supports it."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, sarà usato lo stile di inserimento al volo "
+#~ "quando il client lo supporterà."
+
+#, fuzzy
+#~ msgid "Slovene"
+#~ msgstr "Sloveno"
+
+#~ msgid "Full/Half Letter"
+#~ msgstr "Lettera piena/mezza"
+
+#~ msgid "Full/Half Punct"
+#~ msgstr "Punteggiatura piena/mezza"
+
+#~ msgid ""
+#~ "The input mode of the letters. Click to toggle between half and full."
+#~ msgstr ""
+#~ "La modalità di inserimento delle lettere. Fai clic per passare tra mezza "
+#~ "a piena."
+
+#~ msgid ""
+#~ "The input mode of the puncutations. Click to toggle between half and full."
+#~ msgstr ""
+#~ "La modalità di inserimento della punteggiatura. Fai clic per passare tra "
+#~ "mezza a piena."
+
+#~ msgid ""
+#~ " Switch between full/half width letter mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " Passa tra le modalità delle lettere a larghezza piena/mezza.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Switch between full/half width punctuation mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " Passa tra le modalità della punteggiatura a larghezza piena/mezza\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Switch between Forward/Input mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " Passa tra le modalità di inoltro/inserimento.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Add a new phrase.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " Aggiungi una nuova frase.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Delete the selected phrase.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Elimina la frase selezionata.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Control+Down:\n"
+#~ " Move lookup cursor to next shorter phrase\n"
+#~ " Only available when LongPhraseFirst option is set.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Control+giù:\n"
+#~ " Sposta il cursore di ricerca alla frase più corta successiva\n"
+#~ " Disponibile solo quanto l'opzione FraseLungaPrima è impostata.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Control+Up:\n"
+#~ " Move lookup cursor to previous longer phrase\n"
+#~ " Only available when LongPhraseFirst option is set.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Control+su:\n"
+#~ " Sposta il cursore di ricerca alla frase più lunga precedente\n"
+#~ " Disponibile solo quanto l'opzione FraseLungaPrima è impostata.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Esc:\n"
+#~ " reimposta il metodo di inserimento.\n"
+#~ "\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "How to add a phrase:\n"
+#~ " Input the new phrase as normal, then press the\n"
+#~ " hot key. A hint will be shown to let you input a key\n"
+#~ " for this phrase.\n"
+#~ " Input a key then press the space bar.\n"
+#~ " A hint will be shown to indicate whether\n"
+#~ " the phrase was added sucessfully.\n"
+#~ msgstr ""
+#~ "Come aggiungere una frase:\n"
+#~ " Inserisci la frase come normale, quindi premi il\n"
+#~ " tasto rapido. Sarà mostrato un suggerimento per\n"
+#~ " permetterti di inserire un tasto per questa frase.\n"
+#~ " Inserisci un tasto e premi la barra spaziatrice.\n"
+#~ " Sarà mostrato un suggerimento per indicare se\n"
+#~ " la frase è stata aggiunta correttamente.\n"
+
+#~ msgid "Input a key string for phrase: "
+#~ msgstr "Inserisci una stringa di tasti per la frase: "
+
+#~ msgid "Success."
+#~ msgstr "Riuscito."
+
+#~ msgid "Failed."
+#~ msgstr "Non riuscito."
+
+#~ msgid ""
+#~ "Too few argument!\n"
+#~ "Usage:\n"
+#~ " scim-make-table <table_file> [options]\n"
+#~ "\n"
+#~ " table_file\tthe table file for table module\n"
+#~ " -b\t\tconvert to binary format, otherwise to text format\n"
+#~ " -o output\tsave new table to file output\n"
+#~ " -no\t\tdo not save new phrase table\n"
+#~ " -if ifreq\tload phrase frequencies from this file\n"
+#~ " -of ofreq\tsave phrase frequencies to this file\n"
+#~ " -s file\tspecifiy the source file to count phrase ages.\n"
+#~ msgstr ""
+#~ "Troppi pochi argomenti!\n"
+#~ "Uso:\n"
+#~ " scim-make-table <file_tabella> [opzioni]\n"
+#~ "\n"
+#~ " file_tabella\til file tabella per il modulo tabella\n"
+#~ " -b\t\tconverti a formato binario, altrimenti in formato testuale\n"
+#~ " -o output\tsalva la nuova tabella al file di output\n"
+#~ " -no\t\tnon salvare la nuova tabella delle frasi\n"
+#~ " -if ifreq\tcarica le frequenze delle frasi da questo file\n"
+#~ " -of ofreq\tsalva le frequenze delle frasi in questo file\n"
+#~ " -s file\tspecifica il file sorgente per contare l'età delle frasi.\n"
+
+#~ msgid "option -no cannot be used with -o\n"
+#~ msgstr "l'opzione -no non può essere usata con -o\n"
+
+#~ msgid "option -o cannot be used with -no\n"
+#~ msgstr "l'opzione -o non può essere usata con -no\n"
+
+#~ msgid "No argument for option "
+#~ msgstr "Nessun argomento per l'opzione "
+
+#~ msgid "Invalid option: "
+#~ msgstr "Opzione non valida: "
+
+#~ msgid "Loading table file "
+#~ msgstr "Caricamento del file tabella "
+
+#~ msgid " ...\n"
+#~ msgstr " ...\n"
+
+#~ msgid "table file load failed!"
+#~ msgstr "caricamento del file tabella non riuscito!"
+
+#~ msgid "Saving frequency table file "
+#~ msgstr "Salvataggio della tabella di frequenza "
+
+#~ msgid "frequency table file load failed!"
+#~ msgstr "caricamento del file tabella di frequenza non riuscito!"
+
+#~ msgid "Saving table file "
+#~ msgstr "Salvataggio del file tabella "
+
+#~ msgid "Table file save failed!"
+#~ msgstr "Salvataggio del file tabella non riuscito!"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ "Hot keys:\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ "Tasti rapidi:\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " open/close the input method.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ ":\n"
+#~ " apri/chiudi il metodo di inserimento.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " switch to the next input method.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ ":\n"
+#~ " passa al metodo di inserimento successivo.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " switch to the previous input method.\n"
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ " passa al metodo di inserimento precedente.\n"
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Generic Table"
+#~ msgstr "Tabella generica"
+
+#~ msgid "An IMEngine Module which uses generic table input method file."
+#~ msgstr ""
+#~ "Un modulo IMEngine che usa un file di metodo di inserimento con tabella "
+#~ "generica."
+
+#~ msgid "Full width _punctuation:"
+#~ msgstr "_Punteggiatura a larghezza piena:"
+
+#~ msgid "Select full width puncutation keys"
+#~ msgstr "Seleziona i tasti della punteggiatura a larghezza piena"
+
+#~ msgid ""
+#~ "The key events to switch full/half width punctuation input mode. Click on "
+#~ "the button on the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per passare tra le modalità di inserimento con "
+#~ "punteggiatura a larghezza piena/mezza. Fai clic sul pulsante a destra per "
+#~ "modificarle."
+
+#~ msgid "Full width _letter:"
+#~ msgstr "_Lettera a larghezza piena:"
+
+#~ msgid "Select full width letter keys"
+#~ msgstr "Seleziona i tasti delle lettere a larghezza piena"
+
+#~ msgid ""
+#~ "The key events to switch full/half width letter input mode. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per passare tra le modalità di inserimento con "
+#~ "lettere a larghezza piena/mezza. Fai clic sul pulsante a destra per "
+#~ "modificarle."
+
+#~ msgid "_Mode switch:"
+#~ msgstr "Cambio di _modalità:"
+
+#~ msgid "Select mode switch keys"
+#~ msgstr "Seleziona i tasti per il cambio di modalità"
+
+#~ msgid ""
+#~ "The key events to change current input mode. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per cambiare la modalità di inserimento attuale. "
+#~ "Fai clic sul pulsante a destra per cambiarle."
+
+#~ msgid "_Add phrase:"
+#~ msgstr "_Aggiungi frase:"
+
+#~ msgid "Select add phrase keys."
+#~ msgstr "Seleziona i tasti per aggiungere frasi."
+
+#~ msgid ""
+#~ "The key events to add a new user defined phrase. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per aggiungere una nuova frase definita "
+#~ "dall'utente. Fai clic sul pulsante a destra per cambiarle."
+
+#~ msgid "_Delete phrase:"
+#~ msgstr "_Elimina frase:"
+
+#~ msgid "Select delete phrase keys."
+#~ msgstr "Seleziona i tasti per eliminare frasi."
+
+#~ msgid ""
+#~ "The key events to delete a selected phrase. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per eliminare una frase selezionata. Fai clic "
+#~ "sul pulsante a destra per cambiarle."
+
+#~ msgid "Show _prompt"
+#~ msgstr "Mostra _prompt"
+
+#~ msgid "Show key _hint"
+#~ msgstr "Mostra su_ggerimento del tasto"
+
+#~ msgid "Save _user table in binary format"
+#~ msgstr "Salva la tabella dell'_utente in formato binario"
+
+#~ msgid "Show the u_ser defined phrases first"
+#~ msgstr "Mo_stra prima le frasi definite dall'utente"
+
+#~ msgid "Show the _longer phrases first"
+#~ msgstr "Mostra prima le frasi più _lunghe"
+
+#~ msgid ""
+#~ "If this option is checked, the key prompt of the currently selected "
+#~ "phrase will be shown."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, sarà mostrato il prompt del tasto della "
+#~ "frase attualmente selezionata."
+
+#~ msgid ""
+#~ "If this option is checked, the remaining keystrokes of the phraseswill be "
+#~ "shown on the lookup table."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, i tasti rimanenti della frase saranno "
+#~ "mostrati nella tabella di riferimento."
+
+#~ msgid ""
+#~ "If this option is checked, the user table will be stored with binary "
+#~ "format, this will increase the loading speed."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la tabella dell'utente sarà salvata in "
+#~ "formato binario; ciò aumenterà la velocità di caricamento."
+
+#~ msgid ""
+#~ "If this option is checked, the user defined phrases will be shown in "
+#~ "front of others. "
+#~ msgstr ""
+#~ "Se questa opzione è segnata, le frasi definite dall'utente saranno "
+#~ "mostrate prima delle altre. "
+
+#~ msgid ""
+#~ "If this option is checked, the longer phrase will be shown in front of "
+#~ "others. "
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la frasi più lunghe saranno mostrate prima "
+#~ "delle altre. "
+
+#~ msgid "The installed tables:"
+#~ msgstr "La tabelle installate:"
+
+#~ msgid "_Install"
+#~ msgstr "_Installa"
+
+#~ msgid "Install a new table."
+#~ msgstr "Installa una nuova tabella."
+
+#~ msgid "_Delete"
+#~ msgstr "_Elimina"
+
+#~ msgid "Delete the selected table."
+#~ msgstr "Elimina la tabella selezionata."
+
+#~ msgid "_Properties"
+#~ msgstr "_Proprietà"
+
+#~ msgid "Edit the properties of the selected table."
+#~ msgstr "Modifica le proprietà della tabella selezionata."
+
+#~ msgid "Table Management"
+#~ msgstr "Gestione delle tabelle"
+
+#~ msgid "Select an icon file"
+#~ msgstr "Seleziona un file icone"
+
+#~ msgid "User"
+#~ msgstr "Utente"
+
+#~ msgid "System"
+#~ msgstr "Sistema"
+
+#~ msgid "Please select the table file to be installed."
+#~ msgstr "Per piacere seleziona il file tabella da installare."
+
+#~ msgid "Failed to install the table! It's already in table file directory."
+#~ msgstr ""
+#~ "Installazione della tabella non riuscita. È già nella cartella dei file "
+#~ "tabella."
+
+#~ msgid "Failed to load the table file!"
+#~ msgstr "Caricamento del file tabella non riuscito."
+
+#~ msgid ""
+#~ "Failed to install the table! Another version of this table was already "
+#~ "installed."
+#~ msgstr ""
+#~ "Installazione della tabella non riuscita. Un'altra versione di questa "
+#~ "tabella era già installata."
+
+#~ msgid ""
+#~ "Another version of this table was already installed. Do you want to "
+#~ "replace it with the new one?"
+#~ msgstr ""
+#~ "Un'altra versione di questa tabella era già installata. Vuoi sostituirla "
+#~ "con la nuova?"
+
+#~ msgid ""
+#~ "Failed to install the table! A table with the same file name was already "
+#~ "installed."
+#~ msgstr ""
+#~ "Installazione della tabella non riuscita. Una tabella con lo stesso nome "
+#~ "del file era già installata."
+
+#~ msgid ""
+#~ "A table with the same file name was already installed. Do you want to "
+#~ "overwrite it?"
+#~ msgstr ""
+#~ "Una tabella con lo stesso nome del file era già installata. Vuoi "
+#~ "sovrascriverla?"
+
+#~ msgid "Failed to install the table to %s!"
+#~ msgstr "Installazione della tabella in %s non riuscita."
+
+#~ msgid "Can not delete the file %s!"
+#~ msgstr "Impossibile eliminare il file %s."
+
+#~ msgid "Are you sure to delete this table file?"
+#~ msgstr "Sei sicuro di voler eliminare questo file tabella?"
+
+#~ msgid "Failed to delete the table file!"
+#~ msgstr "Eliminazione del file tabella non riuscita."
+
+#~ msgid "True"
+#~ msgstr "Vero"
+
+#~ msgid "False"
+#~ msgstr "Falso"
+
+#~ msgid "Split Keys:"
+#~ msgstr "Tasti di divisione:"
+
+#~ msgid "The key strokes to split inputed string."
+#~ msgstr "I tasti per dividere la stringa inserita."
+
+#~ msgid "Commit Keys:"
+#~ msgstr "Tasti di consegna:"
+
+#~ msgid "The key strokes to commit converted result to client."
+#~ msgstr "I tasti per consegnare il risultato convertito al client."
+
+#~ msgid "Forward Keys:"
+#~ msgstr "Tasti di inoltro:"
+
+#~ msgid "The key strokes to forward inputed string to client."
+#~ msgstr "I tasti per inoltrare la stringa inserita al client."
+
+#~ msgid "The key strokes to select candidate phrases in lookup table."
+#~ msgstr ""
+#~ "I tasti per selezionare delle frasi candidate nella tabella di "
+#~ "riferimento."
+
+#~ msgid "Page Up Keys:"
+#~ msgstr "Tasti pagina su:"
+
+#~ msgid "The lookup table page up keys"
+#~ msgstr "I tasti pagina su della tabella di riferimento"
+
+#~ msgid "Page Down Keys:"
+#~ msgstr "Tasti pagina giù:"
+
+#~ msgid "The lookup table page down keys"
+#~ msgstr "I tasti pagina giù della tabella di riferimento"
+
+#~ msgid "Table Properties"
+#~ msgstr "Proprietà della tabella"
+
+#~ msgid "Name:"
+#~ msgstr "Nome:"
+
+#~ msgid "The name of this table."
+#~ msgstr "Il nome di questa tabella."
+
+#~ msgid "Author:"
+#~ msgstr "Autore:"
+
+#~ msgid "The author of this table."
+#~ msgstr "L'autore di questa tabella."
+
+#~ msgid "UUID:"
+#~ msgstr "UUID:"
+
+#~ msgid "The unique ID of this table."
+#~ msgstr "L'ID univoca di questa tabella."
+
+#~ msgid "Serial Number:"
+#~ msgstr "Numero seriale:"
+
+#~ msgid "The serial number of this table."
+#~ msgstr "Il numero seriale di questa tabella."
+
+#~ msgid "Icon File:"
+#~ msgstr "File icone:"
+
+#~ msgid "The icon file of this table."
+#~ msgstr "Il file icone di questa tabella."
+
+#~ msgid "Supported Languages:"
+#~ msgstr "Lingue supportate:"
+
+#~ msgid "The languages supported by this table."
+#~ msgstr "Le lingue supportate da questa tabella."
+
+#~ msgid "Status Prompt:"
+#~ msgstr "Prompt di stato:"
+
+#~ msgid "A prompt string to be shown in status area."
+#~ msgstr "Una stringa di prompt da visualizzare nell'area di stato."
+
+#~ msgid "Valid Input Chars:"
+#~ msgstr "Caratteri di inserimento validi:"
+
+#~ msgid "The valid input chars of this table."
+#~ msgstr "I caratteri di inserimento validi di questa tabella."
+
+#~ msgid "Multi Wildcard Char:"
+#~ msgstr "Carattere jolly multiplo:"
+
+#~ msgid ""
+#~ "The multi wildcard chars of this table. These chars can be used to match "
+#~ "one or more arbitrary chars."
+#~ msgstr ""
+#~ "I caratteri jolly multipli di questa tabella. Questi caratteri possono "
+#~ "essere usati per corrispondere a uno o più caratteri arbitrari."
+
+#~ msgid "Single Wildcard Char:"
+#~ msgstr "Carattere jolly singolo:"
+
+#~ msgid ""
+#~ "The single wildcard chars of this table.These chars can be used to match "
+#~ "one arbitrary char."
+#~ msgstr ""
+#~ "I caratteri jolly singoli di questa tabella. Questi caratteri possono "
+#~ "essere usati per corrispondere a un carattere arbitrario."
+
+#~ msgid "Max Key Length:"
+#~ msgstr "Lunghezza massima dei tasti:"
+
+#~ msgid "The maxmium length of key strings."
+#~ msgstr "La lunghezza massima delle stringhe di tasti."
+
+#~ msgid "Show Key Prompt:"
+#~ msgstr "Mostra prompt del tasto:"
+
+#~ msgid "If true then the key prompts will be shown instead of the raw keys."
+#~ msgstr ""
+#~ "Se vero, saranno mostrati i prompt dei tasti invece dei tasti grezzi."
+
+#~ msgid "Auto Select:"
+#~ msgstr "Selezione automatica:"
+
+#~ msgid ""
+#~ "If true then the first candidate phrase will be selected automatically "
+#~ "when inputing the next key."
+#~ msgstr ""
+#~ "Se vero, la prima frase candidata sarà selezionata automaticamente quando "
+#~ "si inserisce il prossimo tasto."
+
+#~ msgid "Auto Wildcard:"
+#~ msgstr "Jolly automatico:"
+
+#~ msgid ""
+#~ "If true then a multi wildcard char will be append to the end of inputed "
+#~ "key string when searching phrases."
+#~ msgstr ""
+#~ "Se vero, un carattere jolly multiplo sarà aggiunto alla fine della "
+#~ "stringa di tasti inseriti quando si cercano le frasi."
+
+#~ msgid "Auto Commit:"
+#~ msgstr "Consegna automatica:"
+
+#~ msgid ""
+#~ "If true then the converted result string will be committed to client "
+#~ "automatically."
+#~ msgstr ""
+#~ "Se vero, la stringa risultante convertita sarà automaticamente consegnata "
+#~ "al client."
+
+#~ msgid ""
+#~ "If true then the inputed key string will be splitted automatically when "
+#~ "necessary."
+#~ msgstr ""
+#~ "Se vero, la stringa di tasti inserita sarà divisa automaticamente quando "
+#~ "necessario."
+
+#~ msgid "Discard Invalid Key:"
+#~ msgstr "Scarta tasto non valido:"
+
+#~ msgid ""
+#~ "If true then the invalid key will be discarded automatically.This option "
+#~ "is only valid when Auto Select and Auto Commit is true."
+#~ msgstr ""
+#~ "Se vero, il tasto non valido sarà scartato automaticamente. Questa "
+#~ "opzione è valida solo quando sono vere la selezione e la consegna "
+#~ "automatiche."
+
+#~ msgid "Dynamic Adjust:"
+#~ msgstr "Regolazione dinamica:"
+
+#~ msgid "If true then the phrases' frequencies will be adjusted dynamically."
+#~ msgstr "Se vero, le frequenze delle frasi saranno regolate dinamicamente."
+
+#~ msgid "Auto Fill Preedit Area:"
+#~ msgstr "Riempimento automatico dell'area di premodifica:"
+
+#~ msgid ""
+#~ "If true then the preedit string will be filled up with the current "
+#~ "candiate phrase automatically.This option is only valid when Auto Select "
+#~ "is TRUE."
+#~ msgstr ""
+#~ "Se vero, la stringa di premodifica sarà riempita automaticamente con la "
+#~ "frase candidata attuale. Questa opzione è valida solo quando la selezione "
+#~ "automatica è vera."
+
+#~ msgid "Always Show Lookup Table:"
+#~ msgstr "Mostra sempre la tabella di riferimento:"
+
+#~ msgid ""
+#~ "If true then the lookup table will always be shown when any candidate "
+#~ "phrase is available. Otherwise the lookup table will only be shown when "
+#~ "necessary.\n"
+#~ "If Auto Fill is false, then this option will be no effect, and always be "
+#~ "true."
+#~ msgstr ""
+#~ "Se vero, la tabella di riferimento sarà sempre visualizzata quando "
+#~ "qualsiasi frase candidata sarà disponibile. Altrimenti la tabella di "
+#~ "riferimento sarà visualizzata solo quando necessario.\n"
+#~ "Se il riempimento automatico è falso, questa opzione non avrà effetto, e "
+#~ "sarà sempre vera."
+
+#~ msgid "Default Full Width Punct:"
+#~ msgstr "Punteggiatura predefinita a larghezza piena:"
+
+#~ msgid "If true then full width punctuations will be inputed by default."
+#~ msgstr ""
+#~ "Se vero, saranno inseriti segni di punteggiatura a larghezza piena come "
+#~ "impostazione predefinita."
+
+#~ msgid "Default Full Width Letter:"
+#~ msgstr "Lettere predefinite a larghezza piena:"
+
+#~ msgid "If true then full width letters will be inputed by default."
+#~ msgstr ""
+#~ "Se vero, saranno inserite lettere a larghezza piena come impostazione "
+#~ "predefinita."
+
+#~ msgid "Invalid icon file."
+#~ msgstr "File icone non valido."
+
+#~ msgid "Invalid languages."
+#~ msgstr "Lingue non valide."
+
+#~ msgid "Invalid status prompt."
+#~ msgstr "Prompt di stato non valido."
+
+#~ msgid "Invalid multi wildcard chars."
+#~ msgstr "Caratteri jolly multipli non validi."
+
+#~ msgid "Invalid single wildcard chars."
+#~ msgstr "Caratteri jolly singoli non validi."
+
+#~ msgid "Invalid commit keys."
+#~ msgstr "Tasti di consegna non validi."
+
+#~ msgid "Invalid select keys."
+#~ msgstr "Tasti di selezione non validi."
+
+#~ msgid "Invalid page up keys."
+#~ msgstr "Tasti pagina su non validi."
+
+#~ msgid "Invalid page down keys."
+#~ msgstr "Tasti pagina giù non validi."
+
+#~ msgid "Invalid max key length."
+#~ msgstr "Lunghezza massima dei tasti non valida."
+
+#~ msgid "Failed to save table %s!"
+#~ msgstr "Salvataggio della tabella %s non riuscito!"
+
+#~ msgid "Failed to load any Config Modules!"
+#~ msgstr "Caricamento di qualsiasi modulo di configurazione non riuscito."
+
+#~ msgid "_Current Config Module:"
+#~ msgstr "Modulo di _configurazione attuale:"
+
+#~ msgid "<Not found>"
+#~ msgstr "<Non trovato>"
+
+#~ msgid "Current Config Module has been changed to %s."
+#~ msgstr "Il modulo di configurazione attuale è stato cambiato in %s."
+
+#~ msgid "Start the SCIM Setup Utility."
+#~ msgstr "Avvia il programma di configurazione di SCIM."
+
+#~ msgid "Setup ..."
+#~ msgstr "Configurazione..."
--- /dev/null
+# Japanese translation for SCIM
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# James Su <suzhe@tsinghua.org.cn>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ja\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 20:17+0900\n"
+"PO-Revision-Date: 2005-12-11 11:00+0900\n"
+"Last-Translator: Yukiko Bando <ybando@k6.dion.ne.jp>\n"
+"Language-Team: Japanese <ja@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.3.1\n"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "キー選択"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Options"
+msgstr "オプション"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+#, fuzzy
+msgid "Auto capitalization"
+msgstr "自動スプリット:"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+#, fuzzy
+msgid "Auto period"
+msgstr "自動スプリット:"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "全般"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "英語/キーボード"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "キー選択"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "キー選択"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "英語/キーボード"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "オプション"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "英語/キーボード"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "英語/キーボード"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "英語(アメリカ)"
+
+#~ msgid "Amharic"
+#~ msgstr "アムハラ語"
+
+#~ msgid "Arabic"
+#~ msgstr "アラビア語"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "アラビア語(エジプト)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "アラビア語(レバノン)"
+
+#~ msgid "Assamese"
+#~ msgstr "アッサム語"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "アゼルバイジャン語"
+
+#~ msgid "Belarusian"
+#~ msgstr "白ロシア語"
+
+#~ msgid "Bulgarian"
+#~ msgstr "ブルガリア語"
+
+#~ msgid "Bengali"
+#~ msgstr "ベンガル語"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "ベンガル語(インド)"
+
+#~ msgid "Tibetan"
+#~ msgstr "チベット語"
+
+#~ msgid "Bosnian"
+#~ msgstr "ボスニア語"
+
+#~ msgid "Catalan"
+#~ msgstr "カタロニア語"
+
+#~ msgid "Czech"
+#~ msgstr "チェコ語"
+
+#~ msgid "Welsh"
+#~ msgstr "ウェールズ語"
+
+#~ msgid "Danish"
+#~ msgstr "デンマーク語"
+
+#~ msgid "German"
+#~ msgstr "ドイツ語"
+
+#~ msgid "Greek"
+#~ msgstr "ギリシャ語"
+
+#~ msgid "English"
+#~ msgstr "英語"
+
+#~ msgid "English (Australian)"
+#~ msgstr "英語(オーストラリア)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "英語(カナダ)"
+
+#~ msgid "English (British)"
+#~ msgstr "英語(イギリス)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "英語(アイルランド)"
+
+#~ msgid "English (American)"
+#~ msgstr "英語(アメリカ)"
+
+#~ msgid "Spanish"
+#~ msgstr "スペイン語"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#~ msgid "Estonian"
+#~ msgstr "エストニア語"
+
+#~ msgid "Basque"
+#~ msgstr "バスク語"
+
+#~ msgid "Persian"
+#~ msgstr "ペルシア語"
+
+#~ msgid "Finnish"
+#~ msgstr "フィンランド語"
+
+#~ msgid "French"
+#~ msgstr "フランス語"
+
+#~ msgid "Irish"
+#~ msgstr "アイルランド語"
+
+#~ msgid "Galician"
+#~ msgstr "ガリシア語"
+
+#~ msgid "Gujarati"
+#~ msgstr "グジャラート語"
+
+#~ msgid "Hebrew"
+#~ msgstr "ヘブライ語"
+
+#~ msgid "Hindi"
+#~ msgstr "ヒンディー語"
+
+#~ msgid "Croatian"
+#~ msgstr "クロアチア語"
+
+#~ msgid "Hungarian"
+#~ msgstr "ハンガリー語"
+
+#, fuzzy
+#~ msgid "Armenian"
+#~ msgstr "ルーマニア語"
+
+#~ msgid "Interlingua"
+#~ msgstr "インターリングア"
+
+#~ msgid "Indonesian"
+#~ msgstr "インドネシア語"
+
+#~ msgid "Icelandic"
+#~ msgstr "アイスランド語"
+
+#~ msgid "Italian"
+#~ msgstr "イタリア語"
+
+#~ msgid "Japanese"
+#~ msgstr "日本語"
+
+#, fuzzy
+#~ msgid "Georgian"
+#~ msgstr "ドイツ語"
+
+#~ msgid "Kazakh"
+#~ msgstr "カザフスタン語"
+
+#~ msgid "Cambodian"
+#~ msgstr "クメール語"
+
+#~ msgid "Kannada"
+#~ msgstr "カンナダ語"
+
+#~ msgid "Korean"
+#~ msgstr "ハングル"
+
+#~ msgid "Laothian"
+#~ msgstr "ラオス語"
+
+#~ msgid "Lithuanian"
+#~ msgstr "リトアニア語"
+
+#~ msgid "Latvian"
+#~ msgstr "ラトヴィア語"
+
+#~ msgid "Macedonian"
+#~ msgstr "マケドニア語"
+
+#~ msgid "Malayalam"
+#~ msgstr "マラヤーラム語"
+
+#~ msgid "Mongolian"
+#~ msgstr "モンゴル語"
+
+#~ msgid "Marathi"
+#~ msgstr "マラーティー語"
+
+#~ msgid "Malay"
+#~ msgstr "マレー語"
+
+#, fuzzy
+#~ msgid "Burmese"
+#~ msgstr "ブラウズ"
+
+#~ msgid "Nepali"
+#~ msgstr "ネパール語"
+
+#~ msgid "Dutch"
+#~ msgstr "オランダ語"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "ノルウェー語(ニューノルスク)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "ノルウェー語(ボックモール)"
+
+#~ msgid "Oriya"
+#~ msgstr "オリヤー語"
+
+#~ msgid "Punjabi"
+#~ msgstr "パンジャブ語"
+
+#~ msgid "Polish"
+#~ msgstr "ポーランド語"
+
+#~ msgid "Portuguese"
+#~ msgstr "ポルトガル語"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "ポルトガル語(ブラジル)"
+
+#~ msgid "Romanian"
+#~ msgstr "ルーマニア語"
+
+#~ msgid "Russian"
+#~ msgstr "ロシア語"
+
+#~ msgid "Slovak"
+#~ msgstr "スロバキア語"
+
+#~ msgid "Slovenian"
+#~ msgstr "スロベニア語"
+
+#~ msgid "Albanian"
+#~ msgstr "アルバニア語"
+
+#~ msgid "Serbian"
+#~ msgstr "セルビア語"
+
+#~ msgid "Swedish"
+#~ msgstr "スウェーデン語"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "スウェーデン語(フィンランド)"
+
+#~ msgid "Tamil"
+#~ msgstr "タミル語"
+
+#~ msgid "Telugu"
+#~ msgstr "テルグ語"
+
+#~ msgid "Thai"
+#~ msgstr "タイ語"
+
+#~ msgid "Turkish"
+#~ msgstr "トルコ語"
+
+#~ msgid "Uighur"
+#~ msgstr "ウィグル語"
+
+#~ msgid "Ukrainian"
+#~ msgstr "ウクライナ語"
+
+#~ msgid "Urdu"
+#~ msgstr "ウルドゥー語"
+
+#~ msgid "Uzbek"
+#~ msgstr "ウズベク語"
+
+#~ msgid "Vietnamese"
+#~ msgstr "ベトナム語"
+
+#~ msgid "Walloon"
+#~ msgstr "ワロン語"
+
+#~ msgid "Yiddish"
+#~ msgstr "イディッシュ語"
+
+#~ msgid "Chinese"
+#~ msgstr "中国語"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "簡体中国語"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "繁体中国語"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "ベルギー"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "英語(US)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "英語(カナダ)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "英語(アイルランド)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "英語(イギリス)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "英語(アメリカ)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "英語(カナダ)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "英語(イギリス)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "英語(イギリス)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "英語(カナダ)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "英語(イギリス)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "フランス語(カナダ)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "フランス語(カナダ)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "フランス語(カナダ)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "ドイツ語(スイス)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "フランス語(カナダ)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "ドイツ語(deadkeyあり)"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "ドイツ語(スイス)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "英語(オーストラリア)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "ドイツ語(スイス)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "ドイツ語(スイス)"
+
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "ポルトガル語(ブラジル)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "ポルトガル語(ブラジル)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "スペイン語(ラテンアメリカ)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "スペイン語(ラテンアメリカ)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "スペイン語(ラテンアメリカ)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "スペイン語(ラテンアメリカ)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "スペイン語(ラテンアメリカ)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "スペイン語(CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "マラヤーラム語"
+
+#~ msgid "Norwegian"
+#~ msgstr "ノルウェー語"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "セルビア語"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "繁体中国語"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "繁体中国語"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "繁体中国語"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "中国語"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "簡体中国語"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "アラビア語(エジプト)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "アラビア語(エジプト)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "アラビア語(エジプト)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "アラビア語(エジプト)"
+
+#~ msgid "Other"
+#~ msgstr "その他"
+
+#~ msgid "Unknown"
+#~ msgstr "不明"
+
+#~ msgid "English (US)"
+#~ msgstr "英語(US)"
+
+#~ msgid "Belgian"
+#~ msgstr "ベルギー"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "チェコ語(qwerty)"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "フランス語(スイス)"
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "ドイツ語(deadkeyあり)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "ポルトガル語(ブラジルUSアクセント)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "スロバキア語(qwerty)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "スペイン語(CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "スペイン語(ラテンアメリカ)"
+
+#~ msgid "English (UK)"
+#~ msgstr "英語(UK)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "簡体-繁体中国語相互変換"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "簡体中国語と繁体中国語を相互変換する"
+
+#~ msgid "SC-TC"
+#~ msgstr "簡体-繁体"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "簡体-繁体中国語相互変換"
+
+#~ msgid "No Conversion"
+#~ msgstr "変換しない"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "簡体から繁体へ"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "簡体中国語を繁体中国語に変換する"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "繁体から簡体へ"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "繁体中国語を簡体中国語に変換する"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "簡体->繁体"
+
+#~ msgid "TC->SC"
+#~ msgstr "繁体->簡体"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "Smart Common Input Method platform"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "有効にする"
+
+#~ msgid "Name"
+#~ msgstr "名称"
+
+#~ msgid "Cursor Position"
+#~ msgstr "カーソル位置"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "現在のカーソル位置"
+
+#~ msgid "Maximum length"
+#~ msgstr "最大の長さ"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr ""
+#~ "String viewウィジェットの最大表示文字数。無制限の場合は0を指定して下さい。"
+
+#~ msgid "Maximum width"
+#~ msgstr "最大幅"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "String viewウィジェットの最大表示幅"
+
+#~ msgid "Has Frame"
+#~ msgstr "フレーム有りかどうか"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "FALSEを指定した場合、文字表示ウィジェットの縁取りを描画しません。"
+
+#~ msgid "Draw cursor"
+#~ msgstr "カーソルを描画する"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "TRUEを指定した場合、カーソルを点滅させます。"
+
+#~ msgid "Auto move cursor"
+#~ msgstr "カーソルの自動移動"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr ""
+#~ "TRUEを指定した場合、マウスクリックされた位置にカーソルが移動します。"
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "マウスボタンのイベントを送る"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr "TRUEの場合はマウスボタンのイベントをユーザプログラムに送ります。"
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "文字列に合わせてウィジェットのサイズを自動調整"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "TRUEを指定した、場合はウィジェットサイズを自動的に調整します。"
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr ""
+#~ "TRUEを指定した場合、マウスクリックされた位置にカーソルが移動します。"
+
+#~ msgid "Width in chars"
+#~ msgstr "文字の幅"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr "String viewウィジェットに表示する文字数"
+
+#~ msgid "Scroll offset"
+#~ msgstr "スクロールオフセット"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr "String viewウィジェットが画面左端に畳み込まれた際の表示ピクセル数"
+
+#~ msgid "Text"
+#~ msgstr "テキスト"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "String viewウィジェットの内容"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "設定済のキー:"
+
+#~ msgid "Key Code:"
+#~ msgstr "キーコード:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "モディファイア:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Ctrl"
+
+#~ msgid "A_lt"
+#~ msgstr "A_lt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Shift"
+
+#~ msgid "_Release"
+#~ msgstr "リリース(_R)"
+
+#~ msgid "_Meta"
+#~ msgstr "_Meta"
+
+#~ msgid "S_uper"
+#~ msgstr "S_uper"
+
+#~ msgid "_Hyper"
+#~ msgstr "_Hyper"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "キーコードを先に入力して下さい。"
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "キー(もしくは複数のキーの組合せ)を押して下さい。\n"
+#~ "キーをリリースするとこのダイアログは閉じます。"
+
+#~ msgid "Grabbing a key."
+#~ msgstr "キー選択"
+
+#~ msgid "Key Selection"
+#~ msgstr "キー選択"
+
+#~ msgid "Orientation"
+#~ msgstr "方向"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "トレイの方向"
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "テキスト"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "アムハラ語"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "常に"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "オプション"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "英語/キーボード"
+
+#~ msgid "English/European"
+#~ msgstr "英語/ヨーロッパ言語"
+
+#~ msgid "RAW CODE"
+#~ msgstr "RAW CODE"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "ホットキー:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " マルチバイトエンコード/ユニコードの切替え\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " 入力メソッドをリセット\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "現在の入力モード。変更するにはここをクリックして下さい。"
+
+#~ msgid "Unicode"
+#~ msgstr "ユニコード"
+
+#~ msgid "Global Setup"
+#~ msgstr "全体設定"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "全てのフロントエンドモジュール(X11 FrontEnd/GTK-Immoduele/Qt-Immoduleを含"
+#~ "む)で使用する全体オプションを設定"
+
+#~ msgid "_Trigger:"
+#~ msgstr "開始/終了(_T):"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "開始/終了キーの設定"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "入力メソッドを開始/終了するキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "Turn _On:"
+#~ msgstr "開始(_O):"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "開始キーの設定"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "入力メソッドを開始するキー。変更する場合は\n"
+#~ "右のボタンをクリックして下さい。"
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "終了(_F):"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "終了キーの設定"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "入力メソッドを終了するキー。変更する場合は\n"
+#~ "右のボタンをクリックして下さい。"
+
+#~ msgid "_Next input method:"
+#~ msgstr "次の入力メソッド(_N):"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "次の入力メソッドキーの設定"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "次の入力メソッドに切替えるキー。変更する場合は\n"
+#~ "右のボタンをクリックして下さい。"
+
+#~ msgid "_Previous input method:"
+#~ msgstr "前の入力メソッド(_P):"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "前の入力メソッドキーの設定"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "前の入力メソッドに切替えるキー。変更する場合は\n"
+#~ "右のボタンをクリックして下さい。"
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "入力メソッドメニューを表示(_M):"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "入力メソッドメニュー表示キーの設定"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "入力メソッドメニューを表示させるキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "キーボード配列(_K):"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "キーボード配列を認識する入力メソッドが正しく動作するように、現在使用されて"
+#~ "いるキーボード配列を選んでください。"
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "未確定文字列を入力対象クライアントのウィンドウに表示(_E)"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "このオプションを有効にすると、未確定文字列は独立した入力ウィンドウにではな"
+#~ "く入力対象クライアントに直接表示されます。"
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "全てのアプリケーションで同一入力メソッドを使用(_S)"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "このオプションを有効にすると、同一の入力メソッドを全てのアプリケーションで"
+#~ "使用できるようになります。アプリケーションごとに別々の入力メソッドを使用す"
+#~ "る場合はこのオプションを無効にして下さい。"
+
+#~ msgid "Hotkeys"
+#~ msgstr "ホットキー"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr "入力メソッドの有効/無効とホットキーの設定を行います。"
+
+#~ msgid "The installed input method services:"
+#~ msgstr "インストールされている入力メソッド:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "ホットキー(_H)"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "この入力メソッドに切り替えるホットキーを編集"
+
+#~ msgid "Select _Filters"
+#~ msgstr "フィルター(_F)"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "この入力メソッドで使用するフィルターを選択"
+
+#~ msgid "_Expand"
+#~ msgstr "開く(_E)"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "全ての言語グループを展開する"
+
+#~ msgid "_Collapse"
+#~ msgstr "閉じる(_C)"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "全ての言語グループを閉じる"
+
+#~ msgid "E_nable All"
+#~ msgstr "全て有効(_N)"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "全ての入力メソッドを有効にする"
+
+#~ msgid "_Disable All"
+#~ msgstr "全て無効(_D)"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "全ての入力メソッドを無効にする"
+
+#~ msgid "Filters"
+#~ msgstr "フィルター"
+
+#~ msgid "Languages"
+#~ msgstr "言語"
+
+#~ msgid "Description"
+#~ msgstr "説明"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "%s のホットキーを編集"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "%s のフィルターを編集"
+
+#~ msgid "Move _Up"
+#~ msgstr "上に移動(_U)"
+
+#~ msgid "Move _Down"
+#~ msgstr "下に移動(_D)"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "GTK+-2.xライブラリによるパネルデーモン"
+
+#~ msgid "On demand"
+#~ msgstr "開始時に"
+
+#~ msgid "Never"
+#~ msgstr "しない"
+
+#~ msgid "ToolBar"
+#~ msgstr "ツールバー"
+
+#~ msgid "_Show:"
+#~ msgstr "表示(_S):"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "オートスナップ(_N)"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "入力メソッドのアイコンを表示(_I)"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "入力メソッドの名称を表示(_U)"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "オートハイド(_O):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "スティックアイコンを表示(_T)"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "メニューアイコンを表示(_E)"
+
+#~ msgid "Show _help icon"
+#~ msgstr "ヘルプアイコンを表示(_H)"
+
+#~ msgid "Show _property label"
+#~ msgstr "プロパティーラベルを表示(_P)"
+
+#~ msgid "Input window"
+#~ msgstr "入力ウィンドウ"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "候補ウィンドウを埋め込む(_M)"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "候補ウィンドウを縦に表示(_V)"
+
+#~ msgid "Misc"
+#~ msgstr "その他"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "トレーアイコンを表示(_Y)"
+
+#~ msgid "Stick _windows"
+#~ msgstr "ウィンドウを固定(_W)"
+
+#~ msgid "_Font:"
+#~ msgstr "フォント(_F):"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "\"常に\"を選ぶと、SCIMがアクティブでない時もツールバーが表示されます。\"開"
+#~ "始時に\"を選ぶと、SCIMがアクティブな時だけ表示されます。\"しない\"を選ぶ"
+#~ "と、SCIMがアクティブな時もツールバーは表示されません。"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "このオプションを有効にするとツールバーが\n"
+#~ "自動的にスクリーンの端に移動します。"
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "ここで設定した時間が経過するとツールバーは自動的に消えます。このオプション"
+#~ "は表示に\"常に\"が選択されている場合にのみ有効です。オートハイドを無効にす"
+#~ "るには値をゼロにして下さい。"
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にすると入力メソッドの\n"
+#~ "アイコンがツールバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にすると入力メソッドの\n"
+#~ "名称がツールバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にするとスティックアイコンが\n"
+#~ "ツールバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にするとメニューアイコンが\n"
+#~ "ツールバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にするとヘルプアイコンが\n"
+#~ "ツールバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にすると入力メソッドの\n"
+#~ "プロパティーがツールバーにテキスト表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "このオプションを有効にすると候補ウィンドウが\n"
+#~ "入力ウィンドウの中に表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "このオプションを有効にすると候補ウィンドウが\n"
+#~ "縦に表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "このオプションを有効にするとトレーアイコンが\n"
+#~ "タスクバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "このオプションを有効にするとツールバーと入力/候補ウィンドウが\n"
+#~ "本来の表示位置に固定されます。"
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr "このフォント設定は入力/候補ウィンドウに適用されます。"
+
+#~ msgid "Select Interface Font"
+#~ msgstr "インターフェイスのフォントを選択"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "フロントエンド"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMエンジン"
+
+#~ msgid "Panel"
+#~ msgstr "パネル"
+
+#~ msgid "Extra"
+#~ msgstr "その他"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "SCIM入力メソッドの設定"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI セットアップユーティリティ</"
+#~ "span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">%s モジュールの設定</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "SCIMの設定を終了しますか?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "すぐに有効にならない設定項目があります。\n"
+#~ "すべての変更を有効にするにはSCIMを再起動して下さい。"
+
+#~ msgid "SCIM Setup"
+#~ msgstr "SCIMを設定"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "GTK Widget library に基づく統合設定ユーティリティ"
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "Smart Common Input Method platform セットアップユーティリティ"
+
+#~ msgid "SCIM Help"
+#~ msgstr "SCIMヘルプ"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Input Method"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "入力ウィンドウ・ツールバーを固定する/固定しない"
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "SCIMと現在の入力メソッドについて簡単なヘルプを表示します"
+
+#~ msgid "Show command menu."
+#~ msgstr "コマンドメニューを表示"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "設定をリロード"
+
+#~ msgid "Stick Windows"
+#~ msgstr "ウィンドウを固定"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "ツールバーを隠す"
+
+#~ msgid "Help ..."
+#~ msgstr "ヘルプ..."
+
+#~ msgid "Exit"
+#~ msgstr "終了"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "En"
+
+#~ msgid "Preedit String mode"
+#~ msgstr "未確定文字列の表示モード"
+
+#~ msgid "X Window"
+#~ msgstr "Xウィンドウ"
+
+#~ msgid "A FrontEnd module for X11R6 Window System, using XIM Protocol."
+#~ msgstr ""
+#~ "XIMプロトコルによるX11R6ウィンドウシステム用フロントエンドモジュール"
+
+#~ msgid "XIM Settings"
+#~ msgstr "XIMの設定"
+
+#~ msgid "_On The Spot"
+#~ msgstr "_On The Spot"
+
+#~ msgid "_Dynamic Event Flow"
+#~ msgstr "_Dynamic Event Flow"
+
+#~ msgid ""
+#~ "If this option is checked, the OnTheSpot input style will be used when "
+#~ "the client supports it."
+#~ msgstr ""
+#~ "このオプションを有効にするとOn The Spot入力スタイルが適用されます。但し、"
+#~ "クライアント側のサポートが必要です。"
+
+#~ msgid ""
+#~ "If this option is checked, then dynamic event flow will be used.This can "
+#~ "speed up the key event response, especially in remote X11 environment.But "
+#~ "SCIM may become unstable."
+#~ msgstr ""
+#~ "このオプションを有効にすると、特にリモートX11環境においてキーイベントのレ"
+#~ "スポンスを向上させることができます。但し、SCIMが不安定になる場合がありま"
+#~ "す。"
+
+#, fuzzy
+#~ msgid "Slovene"
+#~ msgstr "スロベニア語"
+
+#, fuzzy
+#~ msgid "Global"
+#~ msgstr "全体設定"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>"
+
+#, fuzzy
+#~ msgid "Hot Keys"
+#~ msgstr ""
+#~ "ショートカットキー:\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ "Hot keys:\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ "ショートカットキー:\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " open/close the input method.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ ":\n"
+#~ " 入力メソッドを開始/終了する\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " switch to the next input method.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ ":\n"
+#~ " 次の入力メソッドに切替える\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " switch to the previous input method.\n"
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ " 前の入力メソッドに切替える\n"
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Full/Half Letter"
+#~ msgstr "全角/半角文字"
+
+#~ msgid "Full/Half Punct"
+#~ msgstr "全角/半角句読点"
+
+#~ msgid ""
+#~ "The input mode of the letters. Click to toggle between half and full."
+#~ msgstr ""
+#~ "文字入力モード。全角/半角文字に切替えるにはここをクリックして下さい。"
+
+#~ msgid ""
+#~ "The input mode of the puncutations. Click to toggle between half and full."
+#~ msgstr "句読点入力モード。全角/半角に切替えるにはここをクリックして下さい。"
+
+#~ msgid ""
+#~ " Switch between full/half width letter mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " 全角/半角文字切替\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Switch between full/half width punctuation mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " 全角/半角句読点切替\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Switch between Forward/Input mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr "直接入力/変換入力モードに切替"
+
+#~ msgid ""
+#~ " Add a new phrase.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " 新しいフレーズを追加する\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Delete the selected phrase.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " 選択されたフレーズを削除する\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Control+Down:\n"
+#~ " Move lookup cursor to next shorter phrase\n"
+#~ " Only available when LongPhraseFirst option is set.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Control+Down:\n"
+#~ " カーソルを次のより短いフレーズに移動する\n"
+#~ " \"長いフレーズを優先的に表示\"が有効な場合のみ使用できます。\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Control+Up:\n"
+#~ " Move lookup cursor to previous longer phrase\n"
+#~ " Only available when LongPhraseFirst option is set.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Control+Up:\n"
+#~ " カーソルを前のより長いフレーズに移動する\n"
+#~ " \"長いフレーズを優先的に表示\"が有効な場合のみ使用できます。\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Esc:\n"
+#~ " 入力メソッドをリセット\n"
+#~ "\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "How to add a phrase:\n"
+#~ " Input the new phrase as normal, then press the\n"
+#~ " hot key. A hint will be shown to let you input a key\n"
+#~ " for this phrase.\n"
+#~ " Input a key then press the space bar.\n"
+#~ " A hint will be shown to indicate whether\n"
+#~ " the phrase was added sucessfully.\n"
+#~ msgstr ""
+#~ "フレーズの追加方法:\n"
+#~ " 新しいフレーズを普通に入力しショートカットキーを押します。\n"
+#~ " ヒントが表示され、そのフレーズを入力する際に使うキーの入力\n"
+#~ " を促します。\n"
+#~ " キーを入力しスペースを押して下さい。\n"
+#~ " ヒントにフレーズが正しく登録されたかどうか表示されますので\n"
+#~ " 確認して下さい。\n"
+
+#~ msgid "Input a key string for phrase: "
+#~ msgstr "このフレーズに使うキーを入力して下さい: "
+
+#~ msgid "Success."
+#~ msgstr "登録完了"
+
+#~ msgid "Failed."
+#~ msgstr "登録に失敗しました"
+
+#~ msgid "option -no cannot be used with -o\n"
+#~ msgstr "-noオプションは-oオプションと同時には使用できません\n"
+
+#~ msgid "option -o cannot be used with -no\n"
+#~ msgstr "-oオプションは-noオプションと同時には使用できません\n"
+
+#~ msgid "No argument for option "
+#~ msgstr "オプション引数がありません"
+
+#~ msgid "Invalid option: "
+#~ msgstr "オプションが無効です:"
+
+#~ msgid "Loading table file "
+#~ msgstr "テーブルを読込中"
+
+#~ msgid " ...\n"
+#~ msgstr " ...\n"
+
+#~ msgid "table file load failed!"
+#~ msgstr "テーブルの読込に失敗!"
+
+#~ msgid "Saving frequency table file "
+#~ msgstr "頻度テーブルを保存中"
+
+#~ msgid "frequency table file load failed!"
+#~ msgstr "頻度テーブルの読込に失敗!"
+
+#~ msgid "Saving table file "
+#~ msgstr "テーブルを保存中"
+
+#~ msgid "Table file save failed!"
+#~ msgstr "テーブルの保存に失敗!"
+
+#~ msgid "Generic Table"
+#~ msgstr "汎用テーブル"
+
+#~ msgid "An IMEngine Module which uses generic table input method file."
+#~ msgstr "汎用テーブル入力メソッドを使用するIMエンジンモジュール"
+
+#~ msgid "Full width _punctuation:"
+#~ msgstr "全角/半角句読点(_P):"
+
+#~ msgid "Select full width puncutation keys"
+#~ msgstr "全角/半角句読点切替キーの設定"
+
+#~ msgid ""
+#~ "The key events to switch full/half width punctuation input mode. Click on "
+#~ "the button on the right to edit it."
+#~ msgstr ""
+#~ "全角/半角句読点を切替えるキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "Full width _letter:"
+#~ msgstr "全角/半角文字(_L):"
+
+#~ msgid "Select full width letter keys"
+#~ msgstr "全角/半角文字切替キーの設定"
+
+#~ msgid ""
+#~ "The key events to switch full/half width letter input mode. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "全角/半角文字を切替えるキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "_Mode switch:"
+#~ msgstr "入力モード切替(_M):"
+
+#~ msgid "Select mode switch keys"
+#~ msgstr "入力モード切替キーの設定"
+
+#~ msgid ""
+#~ "The key events to change current input mode. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "入力モードを切替えるキー。変更する場合は\n"
+#~ "右のボタンをクリックして下さい。"
+
+#~ msgid "_Add phrase:"
+#~ msgstr "フレーズ追加(_A):"
+
+#~ msgid "Select add phrase keys."
+#~ msgstr "フレーズ追加キーの設定"
+
+#~ msgid ""
+#~ "The key events to add a new user defined phrase. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "新しいフレーズを追加するキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "_Delete phrase:"
+#~ msgstr "フレーズ削除(_D):"
+
+#~ msgid "Select delete phrase keys."
+#~ msgstr "フレーズ削除キーの設定"
+
+#~ msgid ""
+#~ "The key events to delete a selected phrase. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "選択されたフレーズを削除するキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "Show _prompt"
+#~ msgstr "プロンプトを表示(_P)"
+
+#~ msgid "Show key _hint"
+#~ msgstr "ヒントキーを表示(_H)"
+
+#~ msgid "Save _user table in binary format"
+#~ msgstr "ユーザーテーブルをバイナリー形式で保存(_U)"
+
+#~ msgid "Show the u_ser defined phrases first"
+#~ msgstr "ユーザー定義フレーズを優先的に表示(_S)"
+
+#~ msgid "Show the _longer phrases first"
+#~ msgstr "長いフレーズを優先的に表示(_L)"
+
+#~ msgid ""
+#~ "If this option is checked, the key prompt of the currently selected "
+#~ "phrase will be shown."
+#~ msgstr ""
+#~ "このオプションを有効にすると選択された\n"
+#~ "フレーズのキープロンプトが表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the remaining keystrokes of the phraseswill be "
+#~ "shown on the lookup table."
+#~ msgstr ""
+#~ "このオプションを有効にするとフレーズの残りの\n"
+#~ "キーストロークが候補ウィンドウに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the user table will be stored with binary "
+#~ "format, this will increase the loading speed."
+#~ msgstr ""
+#~ "このオプションを有効にするとユーザー定義テーブルがバイナリー\n"
+#~ "形式で保存されます。テーブルの読込が速くなります。"
+
+#~ msgid ""
+#~ "If this option is checked, the user defined phrases will be shown in "
+#~ "front of others. "
+#~ msgstr ""
+#~ "このオプションを有効にするとユーザー定義フレーズ\n"
+#~ "が優先的に表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the longer phrase will be shown in front of "
+#~ "others. "
+#~ msgstr ""
+#~ "このオプションを有効にすると長いフレーズが\n"
+#~ "優先的に表示されます。"
+
+#~ msgid "The installed tables:"
+#~ msgstr "インストール済みのテーブル:"
+
+#~ msgid "_Install"
+#~ msgstr "インストール(_I)"
+
+#~ msgid "Install a new table."
+#~ msgstr "新しいテーブルをインストール"
+
+#~ msgid "_Delete"
+#~ msgstr "削除(_D)"
+
+#~ msgid "Delete the selected table."
+#~ msgstr "選択されたテーブルを削除"
+
+#~ msgid "_Properties"
+#~ msgstr "プロパティー(_P)"
+
+#~ msgid "Edit the properties of the selected table."
+#~ msgstr "選択されたテーブルのプロパティーを編集"
+
+#~ msgid "Table Management"
+#~ msgstr "テーブル管理"
+
+#~ msgid "Select an icon file"
+#~ msgstr "アイコンファイルを選択"
+
+#~ msgid "User"
+#~ msgstr "ユーザー"
+
+#~ msgid "System"
+#~ msgstr "システム"
+
+#~ msgid "Please select the table file to be installed."
+#~ msgstr "インストールするテーブルファイルを選択して下さい。"
+
+#~ msgid "Failed to install the table! It's already in table file directory."
+#~ msgstr "テーブルのインストールに失敗!すでにインストールされています。"
+
+#~ msgid "Failed to load the table file!"
+#~ msgstr "テーブルファイルの読込に失敗!"
+
+#~ msgid ""
+#~ "Failed to install the table! Another version of this table was already "
+#~ "installed."
+#~ msgstr ""
+#~ "テーブルのインストールに失敗!他のバージョンが\n"
+#~ "すでにインストールされています。"
+
+#~ msgid ""
+#~ "Another version of this table was already installed. Do you want to "
+#~ "replace it with the new one?"
+#~ msgstr ""
+#~ "このテーブルの他のバージョンがすでにインストールされています。\n"
+#~ "新しいバージョンに置き換えますか?"
+
+#~ msgid ""
+#~ "Failed to install the table! A table with the same file name was already "
+#~ "installed."
+#~ msgstr ""
+#~ "テーブルのインストールに失敗!同じ名前のテーブルが\n"
+#~ "すでにインストールされています。"
+
+#~ msgid ""
+#~ "A table with the same file name was already installed. Do you want to "
+#~ "overwrite it?"
+#~ msgstr ""
+#~ "同じ名前のテーブルがすでにインストールされています。\n"
+#~ "上書きしますか?"
+
+#~ msgid "Failed to install the table to %s!"
+#~ msgstr "%sにテーブルをインストールできませんでした!"
+
+#~ msgid "Can not delete the file %s!"
+#~ msgstr "ファイル%sを削除できません!"
+
+#~ msgid "Are you sure to delete this table file?"
+#~ msgstr "このテーブルを削除しますか?"
+
+#~ msgid "Failed to delete the table file!"
+#~ msgstr "テーブルの削除に失敗!"
+
+#~ msgid "True"
+#~ msgstr "True"
+
+#~ msgid "False"
+#~ msgstr "False"
+
+#~ msgid "Split Keys:"
+#~ msgstr "スプリットキー:"
+
+#~ msgid "The key strokes to split inputed string."
+#~ msgstr "入力済みの文字列を分割するキー"
+
+#~ msgid "Commit Keys:"
+#~ msgstr "変換確定キー:"
+
+#~ msgid "The key strokes to commit converted result to client."
+#~ msgstr "変換結果をクライアントに送るキー"
+
+#~ msgid "Forward Keys:"
+#~ msgstr "直接入力キー:"
+
+#~ msgid "The key strokes to forward inputed string to client."
+#~ msgstr "入力された文字列を変換せずに直接クライアントに送るキー"
+
+#~ msgid "The key strokes to select candidate phrases in lookup table."
+#~ msgstr "候補ウィンドウからフレーズを選択するキー"
+
+#~ msgid "Page Up Keys:"
+#~ msgstr "前ページキー:"
+
+#~ msgid "The lookup table page up keys"
+#~ msgstr "候補ウィンドウで前のページに戻るキー"
+
+#~ msgid "Page Down Keys:"
+#~ msgstr "次ページキー:"
+
+#~ msgid "The lookup table page down keys"
+#~ msgstr "候補ウィンドウで次のページに進むキー"
+
+#~ msgid "Table Properties"
+#~ msgstr "テーブルのプロパティー"
+
+#~ msgid "Name:"
+#~ msgstr "名称:"
+
+#~ msgid "The name of this table."
+#~ msgstr "このテーブルの名称"
+
+#~ msgid "Author:"
+#~ msgstr "作者:"
+
+#~ msgid "The author of this table."
+#~ msgstr "このテーブルの作者"
+
+#~ msgid "UUID:"
+#~ msgstr "UUID:"
+
+#~ msgid "The unique ID of this table."
+#~ msgstr "このテーブルのID"
+
+#~ msgid "Serial Number:"
+#~ msgstr "バージョン:"
+
+#~ msgid "The serial number of this table."
+#~ msgstr "このテーブルのバージョン"
+
+#~ msgid "Icon File:"
+#~ msgstr "アイコンファイル:"
+
+#~ msgid "The icon file of this table."
+#~ msgstr "このテーブルのアイコンファイル"
+
+#~ msgid "Supported Languages:"
+#~ msgstr "サポート言語:"
+
+#~ msgid "The languages supported by this table."
+#~ msgstr "このテーブルがサポートする言語"
+
+#~ msgid "Status Prompt:"
+#~ msgstr "ステイタスプロンプト:"
+
+#~ msgid "A prompt string to be shown in status area."
+#~ msgstr "ステイタスに表示される文字列"
+
+#~ msgid "Valid Input Chars:"
+#~ msgstr "有効な文字:"
+
+#~ msgid "The valid input chars of this table."
+#~ msgstr "このテーブルで使用できる文字"
+
+#~ msgid "Multi Wildcard Char:"
+#~ msgstr "マルチワイルドカード文字:"
+
+#~ msgid ""
+#~ "The multi wildcard chars of this table. These chars can be used to match "
+#~ "one or more arbitrary chars."
+#~ msgstr ""
+#~ "このテーブルのマルチワイルドカード文字。\n"
+#~ "複数の文字の代わりに使用できます。"
+
+#~ msgid "Single Wildcard Char:"
+#~ msgstr "シングルワイルドカード文字:"
+
+#~ msgid ""
+#~ "The single wildcard chars of this table.These chars can be used to match "
+#~ "one arbitrary char."
+#~ msgstr ""
+#~ "このテーブルのシングルワイルドカード文字。\n"
+#~ "任意の一文字の代わりに使用できます。"
+
+#~ msgid "Max Key Length:"
+#~ msgstr "最大キー数:"
+
+#~ msgid "The maxmium length of key strings."
+#~ msgstr "文字列の最大キー数"
+
+#~ msgid "Show Key Prompt:"
+#~ msgstr "キープロンプトを表示:"
+
+#~ msgid "If true then the key prompts will be shown instead of the raw keys."
+#~ msgstr "Trueの場合は入力された文字の代わりにキープロンプトが表示されます。"
+
+#~ msgid "Auto Select:"
+#~ msgstr "自動選択:"
+
+#~ msgid ""
+#~ "If true then the first candidate phrase will be selected automatically "
+#~ "when inputing the next key."
+#~ msgstr ""
+#~ "Trueの場合は次のフレーズの入力を開始すると同時に入力済みの\n"
+#~ "フレーズに対してその第一変換候補が自動的に選択されます。"
+
+#~ msgid "Auto Wildcard:"
+#~ msgstr "自動ワイルドカード:"
+
+#~ msgid ""
+#~ "If true then a multi wildcard char will be append to the end of inputed "
+#~ "key string when searching phrases."
+#~ msgstr ""
+#~ "Trueの場合は検索時にマルチワイルドカード文字が\n"
+#~ "入力された文字列の最後に自動的に付加されます。"
+
+#~ msgid "Auto Commit:"
+#~ msgstr "自動コミット:"
+
+#~ msgid ""
+#~ "If true then the converted result string will be committed to client "
+#~ "automatically."
+#~ msgstr "Trueの場合は変換結果が自動的にコミットされます。"
+
+#~ msgid ""
+#~ "If true then the inputed key string will be splitted automatically when "
+#~ "necessary."
+#~ msgstr "Trueの場合は、入力された文字列が必要に応じて自動的に分割されます。"
+
+#~ msgid "Discard Invalid Key:"
+#~ msgstr "無効な文字列を排除:"
+
+#~ msgid ""
+#~ "If true then the invalid key will be discarded automatically.This option "
+#~ "is only valid when Auto Select and Auto Commit is true."
+#~ msgstr ""
+#~ "Trueの場合は、入力された無効な文字列を自動的に排除します。このオプションは"
+#~ "自動選択と自動コミットがTrueの場合のみ有効になります。"
+
+#~ msgid "Dynamic Adjust:"
+#~ msgstr "動的アップデート:"
+
+#~ msgid "If true then the phrases' frequencies will be adjusted dynamically."
+#~ msgstr "Trueの場合は、使用頻度情報が動的にアップデートされます。"
+
+#~ msgid "Auto Fill Preedit Area:"
+#~ msgstr "プリエディットの自動補完:"
+
+#~ msgid ""
+#~ "If true then the preedit string will be filled up with the current "
+#~ "candiate phrase automatically.This option is only valid when Auto Select "
+#~ "is TRUE."
+#~ msgstr ""
+#~ "Trueの場合は、自動的にプリエディットが変換候補によって補完されます。\n"
+#~ "このオプションは自動選択がTrueの場合のみ有効になります。"
+
+#~ msgid "Always Show Lookup Table:"
+#~ msgstr "候補リストを常に表示:"
+
+#~ msgid ""
+#~ "If true then the lookup table will always be shown when any candidate "
+#~ "phrase is available. Otherwise the lookup table will only be shown when "
+#~ "necessary.\n"
+#~ "If Auto Fill is false, then this option will be no effect, and always be "
+#~ "true."
+#~ msgstr ""
+#~ "Trueの場合は変換候補があれば常に候補ウィンドウが表示されます。\n"
+#~ "Falseの場合は必要な時のみ表示されます。\n"
+#~ "但し、自動補完が無効の場合は常に表示されます。"
+
+#~ msgid "Default Full Width Punct:"
+#~ msgstr "デフォルト句読点を全角に設定:"
+
+#~ msgid "If true then full width punctuations will be inputed by default."
+#~ msgstr "Trueの場合は、指定のない限り全角句読点が入力されます。"
+
+#~ msgid "Default Full Width Letter:"
+#~ msgstr "デフォルト文字幅を全角に設定:"
+
+#~ msgid "If true then full width letters will be inputed by default."
+#~ msgstr "Trueの場合は、指定のない限り全角文字が入力されます。"
+
+#~ msgid "Invalid icon file."
+#~ msgstr "アイコンファイルが無効です。"
+
+#~ msgid "Invalid languages."
+#~ msgstr "言語が無効です。"
+
+#~ msgid "Invalid status prompt."
+#~ msgstr "ステイタスプロンプトが無効です。"
+
+#~ msgid "Invalid multi wildcard chars."
+#~ msgstr "マルチワイルドカード文字が無効です。"
+
+#~ msgid "Invalid single wildcard chars."
+#~ msgstr "シングルワイルドカード文字が無効です。"
+
+#~ msgid "Invalid commit keys."
+#~ msgstr "コミットキーが無効です。"
+
+#~ msgid "Invalid select keys."
+#~ msgstr "選択キーが無効です。"
+
+#~ msgid "Invalid page up keys."
+#~ msgstr "次ページキーが無効です。"
+
+#~ msgid "Invalid page down keys."
+#~ msgstr "前ページキーが無効です。"
+
+#~ msgid "Invalid max key length."
+#~ msgstr "最大キー数が無効です。"
+
+#~ msgid "Failed to save table %s!"
+#~ msgstr "テーブル%sの保存に失敗!"
+
+#~ msgid "Failed to load any Config Modules!"
+#~ msgstr "設定モジュールの読込に失敗!"
+
+#~ msgid "_Current Config Module:"
+#~ msgstr "現在の設定モジュール(_C):"
+
+#~ msgid "<Not found>"
+#~ msgstr "<見つかりません>"
+
+#~ msgid "Current Config Module has been changed to %s."
+#~ msgstr "現在の設定モジュールを%sに変更しました。"
+
+#~ msgid "Start the SCIM Setup Utility."
+#~ msgstr "SCIMセットアップユーティリティを開く"
+
+#~ msgid "Setup ..."
+#~ msgstr "設定..."
--- /dev/null
+# translation of ko.
+# Copyright (C) 2004 THE ko'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the ko package.
+#
+# Kitae <bluetux@gmail.com>, 2005.
+# Choe Hwanjin <choe.hwanjin@gmail.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: SCIM\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 20:17+0900\n"
+"PO-Revision-Date: 2005-07-08 18:16+0900\n"
+"Last-Translator: Choe Hwanjin <choe.hwanjin@gmail.com>\n"
+"Language-Team: Korean <en@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr "설정"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+msgid "Selection"
+msgstr "키보드 선택"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, c-format
+msgid "Options"
+msgstr "옵션"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr "자동 대문자"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr "\".\" 단축키"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+msgid "General"
+msgstr "일반"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+msgid "S/W keyboard"
+msgstr "소프트 키보드"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+msgid "Keyboard selection"
+msgstr "키보드 선택"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+msgid "Keyboard option"
+msgstr "키보드 옵션"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+msgid "H/W keyboard"
+msgstr "하드웨어 키보드"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+msgid "option"
+msgstr "옵션"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr "이전"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+msgid "Keyboard"
+msgstr "키보드"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "영어/키보드"
+
+#~ msgid "English input service"
+#~ msgstr "영어 입력 서비스"
+
+#~ msgid "Amharic"
+#~ msgstr "암하라어"
+
+#~ msgid "Arabic"
+#~ msgstr "아랍어"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "아랍어 (이집트)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "아랍어 (레바논)"
+
+#~ msgid "Assamese"
+#~ msgstr "아삼어"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "아제르바이잔어"
+
+#~ msgid "Belarusian"
+#~ msgstr "벨로루시어"
+
+#~ msgid "Bulgarian"
+#~ msgstr "불가리어"
+
+#~ msgid "Bengali"
+#~ msgstr "벵갈어"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "뱅갈어 (인도)"
+
+#~ msgid "Tibetan"
+#~ msgstr "티벳어"
+
+#~ msgid "Bosnian"
+#~ msgstr "보스니아어"
+
+#~ msgid "Catalan"
+#~ msgstr "카탈로니아어"
+
+#~ msgid "Czech"
+#~ msgstr "체코어"
+
+#~ msgid "Welsh"
+#~ msgstr "웨일즈어"
+
+#~ msgid "Danish"
+#~ msgstr "덴마크어"
+
+#~ msgid "German"
+#~ msgstr "독일어"
+
+#~ msgid "Greek"
+#~ msgstr "그리스어"
+
+#~ msgid "English"
+#~ msgstr "영어"
+
+#~ msgid "English (Australian)"
+#~ msgstr "영어 (호주)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "영어 (캐나다)"
+
+#~ msgid "English (British)"
+#~ msgstr "영어 (영국)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "영어 (아일랜드)"
+
+#~ msgid "English (American)"
+#~ msgstr "영어 (미국)"
+
+#~ msgid "Spanish"
+#~ msgstr "스페인어"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "스페인어 (멕시코)"
+
+#~ msgid "Estonian"
+#~ msgstr "에스토니아어"
+
+#~ msgid "Basque"
+#~ msgstr "바스크어"
+
+#~ msgid "Persian"
+#~ msgstr "페르시아어"
+
+#~ msgid "Finnish"
+#~ msgstr "핀란드어"
+
+#~ msgid "French"
+#~ msgstr "프랑스어"
+
+#~ msgid "Irish"
+#~ msgstr "아일랜드어"
+
+#~ msgid "Galician"
+#~ msgstr "갈리시아어"
+
+#~ msgid "Gujarati"
+#~ msgstr "구자라트어"
+
+#~ msgid "Hebrew"
+#~ msgstr "히브리어"
+
+#~ msgid "Hindi"
+#~ msgstr "힌두어"
+
+#~ msgid "Croatian"
+#~ msgstr "크로아티아어"
+
+#~ msgid "Hungarian"
+#~ msgstr "헝가리어"
+
+#~ msgid "Armenian"
+#~ msgstr "아르메니아어"
+
+#~ msgid "Interlingua"
+#~ msgstr "국제어"
+
+#~ msgid "Indonesian"
+#~ msgstr "인도네시아어"
+
+#~ msgid "Icelandic"
+#~ msgstr "아이슬란드어"
+
+#~ msgid "Italian"
+#~ msgstr "이탈리아어"
+
+#~ msgid "Japanese"
+#~ msgstr "일본어"
+
+#~ msgid "Georgian"
+#~ msgstr "그루지아어"
+
+#~ msgid "Kazakh"
+#~ msgstr "카자흐어"
+
+#~ msgid "Cambodian"
+#~ msgstr "캄보디아어"
+
+#~ msgid "Kannada"
+#~ msgstr "칸나다어"
+
+#~ msgid "Korean"
+#~ msgstr "한국어"
+
+#~ msgid "Laothian"
+#~ msgstr "라오스어"
+
+#~ msgid "Lithuanian"
+#~ msgstr "리투아니아어"
+
+#~ msgid "Latvian"
+#~ msgstr "라트비아어"
+
+#~ msgid "Macedonian"
+#~ msgstr "마케도니아어"
+
+#~ msgid "Malayalam"
+#~ msgstr "말라얄람어"
+
+#~ msgid "Mongolian"
+#~ msgstr "몽골어"
+
+#~ msgid "Marathi"
+#~ msgstr "마라타어"
+
+#~ msgid "Malay"
+#~ msgstr "말레이어"
+
+#~ msgid "Burmese"
+#~ msgstr "버마어"
+
+#~ msgid "Nepali"
+#~ msgstr "네팔어"
+
+#~ msgid "Dutch"
+#~ msgstr "네델란드어"
+
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "노르웨이어 (뉘노르스크)"
+
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "노르웨이어 (부크말)"
+
+#~ msgid "Oriya"
+#~ msgstr "오리야어"
+
+#~ msgid "Punjabi"
+#~ msgstr "펀자브어"
+
+#~ msgid "Polish"
+#~ msgstr "폴란드어"
+
+#~ msgid "Portuguese"
+#~ msgstr "포루투갈어"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "포루투갈어 (브라질)"
+
+#~ msgid "Romanian"
+#~ msgstr "루마니아어"
+
+#~ msgid "Russian"
+#~ msgstr "러시아어"
+
+#~ msgid "Sinhala"
+#~ msgstr "싱할라어"
+
+#~ msgid "Slovak"
+#~ msgstr "슬로바키아어"
+
+#~ msgid "Slovenian"
+#~ msgstr "슬로베니아어"
+
+#~ msgid "Albanian"
+#~ msgstr "알바니아어"
+
+#~ msgid "Serbian"
+#~ msgstr "세르비아어"
+
+#~ msgid "Swedish"
+#~ msgstr "스웨덴어"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "스웨덴어 (핀란드)"
+
+#~ msgid "Tamil"
+#~ msgstr "타밀어"
+
+#~ msgid "Telugu"
+#~ msgstr "텔루구어"
+
+#~ msgid "Thai"
+#~ msgstr "타이어"
+
+#~ msgid "Turkish"
+#~ msgstr "터키어"
+
+#~ msgid "Uighur"
+#~ msgstr "위그루어"
+
+#~ msgid "Ukrainian"
+#~ msgstr "우크라이나어"
+
+#~ msgid "Urdu"
+#~ msgstr "우르두어"
+
+#~ msgid "Uzbek"
+#~ msgstr "우즈베키스탄어"
+
+#~ msgid "Vietnamese"
+#~ msgstr "베트남어"
+
+#~ msgid "Walloon"
+#~ msgstr "와론어"
+
+#~ msgid "Yiddish"
+#~ msgstr "이디시어"
+
+#~ msgid "Chinese"
+#~ msgstr "중국어"
+
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "중국어 (간체)"
+
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "중국어 (번체)"
+
+#~ msgid "Dutch (Standard)"
+#~ msgstr "네덜란드어"
+
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "네덜란드어 (벨기에)"
+
+#~ msgid "English (United States)"
+#~ msgstr "영어 (미국)"
+
+#~ msgid "English (United Kingdom)"
+#~ msgstr "영어 (캐나다)"
+
+#~ msgid "English (New Zealand)"
+#~ msgstr "영어 (뉴질랜드)"
+
+#~ msgid "English (Irish)"
+#~ msgstr "영어 (아일랜드)"
+
+#~ msgid "English (South Africa)"
+#~ msgstr "영어 (남아프리카)"
+
+#~ msgid "English (Jamaica)"
+#~ msgstr "영어 (자메이카)"
+
+#~ msgid "English (Belize)"
+#~ msgstr "영어 (벨리즈)"
+
+#~ msgid "English (Trinidad)"
+#~ msgstr "영어 (트리니다드)"
+
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "영어 (짐바브웨)"
+
+#~ msgid "English (Philippines)"
+#~ msgstr "영어 (필리핀)"
+
+#~ msgid "French (Standard)"
+#~ msgstr "프랑스어"
+
+#~ msgid "French (Belgian)"
+#~ msgstr "프랑스어 (벨기에)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "프랑스어 (캐나다)"
+
+#~ msgid "French (Swiss)"
+#~ msgstr "독일어 (스위스)"
+
+#~ msgid "French (Luxembourg)"
+#~ msgstr "프랑스어 (룩셈부르크)"
+
+#~ msgid "French (Monaco)"
+#~ msgstr "프랑스어 (모나코)"
+
+#~ msgid "German (Standard)"
+#~ msgstr "독일어"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "독일어 (스위스)"
+
+#~ msgid "German (Austrian)"
+#~ msgstr "영어 (호주)"
+
+#~ msgid "German (Luxembourg)"
+#~ msgstr "독일 (룩셈부르크)"
+
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "독일어 (리히텐슈타인)"
+
+#~ msgid "Italian (Standard)"
+#~ msgstr "이탈리아어"
+
+#~ msgid "Italian (Swiss)"
+#~ msgstr "이탈리아어 (스위스)"
+
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "포루투갈어 (브라질)"
+
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "포루투갈어"
+
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "스페인어 (전통 정렬)"
+
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "스페인어 (멕시코)"
+
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "스페인어 (과테말라)"
+
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "스페인어 (코스타리카)"
+
+#~ msgid "Spanish (Panama)"
+#~ msgstr "스페인어 (파나마)"
+
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "스페인어 (도미니카)"
+
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "스페인어 (베네수엘라)"
+
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "스페인어 (콜롬비아)"
+
+#~ msgid "Spanish (Peru)"
+#~ msgstr "스페인어 (페루)"
+
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "스페인어 (아르헨티나)"
+
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "스페인어 (에콰도르)"
+
+#~ msgid "Spanish (Chile)"
+#~ msgstr "스페인어 (칠레)"
+
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "스페인어 (우루과이)"
+
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "스페인어 (파라과이)"
+
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "스페인어 (볼리비아)"
+
+#~ msgid "Spanish (El Salvador)"
+#~ msgstr "스페인어 (엘사바도르)"
+
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "스페인어 (온두라스)"
+
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "스페인어 (니카라과)"
+
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "스페인어 (푸에르토리코)"
+
+#~ msgid "Afrikaans"
+#~ msgstr "아프리칸스어"
+
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "말레이어 (말레이시아)"
+
+#~ msgid "Malay (Brunei Darussalam)"
+#~ msgstr "말레이어 (브루나이)"
+
+#~ msgid "Norwegian"
+#~ msgstr "노르웨이어"
+
+#~ msgid "Serbian (Latin)"
+#~ msgstr "세르비아어 (라틴)"
+
+#~ msgid "Serbian (Cyrillic)"
+#~ msgstr "세르비아어 (키릴)"
+
+#~ msgid "Uzbek (Latin)"
+#~ msgstr "우즈벡어 (라틴)"
+
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "중국어 (대만)"
+
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "중국어 (홍콩)"
+
+#~ msgid "Chinese (Macau)"
+#~ msgstr "중국어 (마카오)"
+
+#~ msgid "Chinese (PRC)"
+#~ msgstr "중국어 (중국)"
+
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "중국어 (싱가폴)"
+
+#~ msgid "Arabic (Saudi Arabia)"
+#~ msgstr "아랍어 (사우디 아라비아)"
+
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "아랍어 (이라크)"
+
+#~ msgid "Arabic (Libya)"
+#~ msgstr "아랍어 (리비아)"
+
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "아랍어 (알제리)"
+
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "아랍어 (모로코)"
+
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "아랍어 (튀니지)"
+
+#~ msgid "Arabic (Oman)"
+#~ msgstr "아랍어 (오만)"
+
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "아랍어 (예멘)"
+
+#~ msgid "Arabic (Syria)"
+#~ msgstr "아랍어 (시리아)"
+
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "아랍어 (요르단)"
+
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "아랍어 (쿠웨이트)"
+
+#~ msgid "Arabic (UAE)"
+#~ msgstr "아랍어 (아랍에미레이트)"
+
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "아랍어 (바레인)"
+
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "아랍어 (카타르)"
+
+#~ msgid "Hausa"
+#~ msgstr "하우사어"
+
+#~ msgid "Xhosa"
+#~ msgstr "호사족어"
+
+#~ msgid "Yoruba"
+#~ msgstr "요루바어"
+
+#~ msgid "Zulu"
+#~ msgstr "줄루어"
+
+#~ msgid "Other"
+#~ msgstr "기타"
+
+#~ msgid "Unknown"
+#~ msgstr "알수없는"
+
+#~ msgid "English (US)"
+#~ msgstr "영어 (미국)"
+
+#~ msgid "Belgian"
+#~ msgstr "벨기에어"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "체코어 (쿼티)"
+
+#~ msgid "Dvorak"
+#~ msgstr "드보락"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "프랑스어 (스위스)"
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "독일어 (데드키 포함)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "포루투갈어 (브라질 미국 엑센트)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "슬로바키아어 (쿼티)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "스페인어 (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "스페인어 (라틴 아메리카)"
+
+#~ msgid "English (UK)"
+#~ msgstr "영어 (영국)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "중국어 간체-번체 변환"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "중국어를 간체와 번체로 변환"
+
+#~ msgid "SC-TC"
+#~ msgstr "간체-번체"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "중국어 간체-번체 변환"
+
+#~ msgid "No Conversion"
+#~ msgstr "변환 하지 않음"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "간체에서 번체로"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "간체에서 번체로 변환"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "번체에서 간체로"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "번체에서 간체로 변환"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "제임스 수 <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "간체->번체"
+
+#~ msgid "TC->SC"
+#~ msgstr "번체->간체"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "똑똑한 일반 입력 방식 플랫폼 "
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 제임스 수 <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "활성화"
+
+#~ msgid "Name"
+#~ msgstr "이름"
+
+#~ msgid "Cursor Position"
+#~ msgstr "커서 위치"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "문자열에서 커서의 현재 위치."
+
+#~ msgid "Maximum length"
+#~ msgstr "최대 길이"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr "문자열를 보기 위한 최대 문자수, 0은 제한 없음."
+
+#~ msgid "Maximum width"
+#~ msgstr "최대폭"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "문자열 보기의 최대 넓이."
+
+#~ msgid "Has Frame"
+#~ msgstr "프레임을 가짐"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "거짓으로 설정하면 문자열 보기의 외각 경사가 없어집니다."
+
+#~ msgid "Draw cursor"
+#~ msgstr "커서 그리기"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "참으로 설정하면 커서를 깜빡이게 합니다."
+
+#~ msgid "Auto move cursor"
+#~ msgstr "자동 커서 이동"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr "참으로 설정하면 마우스 클릭시 자동 커서가 이동합니다."
+
+#~ msgid "Forward button press/release event"
+#~ msgstr "전달 버튼 프레스 이벤트를 전달함"
+
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr "참으로 설정하면 버튼 프레스 이벤트를 사용자 프로그램에 전달."
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "문자열에 크기에 따라 위젯 크기 자동 조절"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "참으로 설정하면 자동으로 크기가 변합니다."
+
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr "참으로 설정하면 마우스 클릭시 자동 커서가 이동합니다."
+
+#~ msgid "Width in chars"
+#~ msgstr "폭(글자 단위)"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr "문자열 보기에서 공간을 만들기위해 사용할 글자수."
+
+#~ msgid "Scroll offset"
+#~ msgstr "스크롤 단위"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr "화면 좌측으로 부터 문자열 보기에서 스크롤을 위한 픽셀수"
+
+#~ msgid "Text"
+#~ msgstr "본문"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "문자열 보기의 내용"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "선택된 키(_K):"
+
+#~ msgid "Key Code:"
+#~ msgstr "키 코드:"
+
+#~ msgid "....."
+#~ msgstr "....."
+
+#~ msgid "Modifiers:"
+#~ msgstr "수정:"
+
+#~ msgid "_Release"
+#~ msgstr "놓음(_R)"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "키 코드를 입력하십시오"
+
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "키를 누르십시오(또는 키의 조합을).\n"
+#~ "키 선택 후 이창은 자동으로 닫힙니다."
+
+#~ msgid "Grabbing a key."
+#~ msgstr "키를 기록합니다."
+
+#~ msgid "Key Selection"
+#~ msgstr "키 선택"
+
+#~ msgid "Orientation"
+#~ msgstr "방향"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "트레이의 방향."
+
+#~ msgid "Previous"
+#~ msgstr "이전"
+
+#~ msgid "Next"
+#~ msgstr "다음"
+
+#~ msgid "Quit"
+#~ msgstr "종료"
+
+#~ msgid "Automatic"
+#~ msgstr "자동"
+
+#~ msgid "Always used"
+#~ msgstr "항상"
+
+#~ msgid "Done"
+#~ msgstr "완료"
+
+#~ msgid "Qwerty keyboard"
+#~ msgstr "Qwerty 키보드"
+
+#~ msgid "Phone keypad"
+#~ msgstr "폰 키보드"
+
+#~ msgid "%s Option"
+#~ msgstr "%s 옵션"
+
+#~ msgid "S/W keyboard connection"
+#~ msgstr "소프트웨어 키보드 연결"
+
+# msgid "MoAKey Korean"
+# msgstr "모아키 한국어"
+# msgid "MoAKey Chinese"
+# msgstr "모아키 중국어"
+# msgid "MoAKey Indic"
+# msgstr "모아키 인도어"
+# msgid "Indic"
+# msgstr "인도어"
+# msgid "Western Europe 1 & US"
+# msgstr "서유럽어 및 영어 키보드"
+#~ msgid "Keyboards"
+#~ msgstr "키보드"
+
+#~ msgid "Add new Keyboard"
+#~ msgstr "키보드 추가"
+
+#~ msgid "Supporting keyboard"
+#~ msgstr "지원 키보드"
+
+#~ msgid "Cancel"
+#~ msgstr "취소"
+
+#~ msgid "Keyboard Types"
+#~ msgstr "키보드 타입"
+
+#~ msgid "Writing languages"
+#~ msgstr "입력언어"
+
+#~ msgid "language"
+#~ msgstr "언어"
+
+#~ msgid "ISE selection"
+#~ msgstr "ISE 선택"
+
+#~ msgid "Text input"
+#~ msgstr "문자 입력 설정"
+
+#~ msgid "RAW CODE"
+#~ msgstr "RAW CODE"
+
+#~ msgid "(C) 2002-2006 Ja/mes Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 제임스 수 <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "단축키:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " 멀티바이트 인코딩과 유니코드간 전환.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " 입력기 초기화.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "현재 입력 상태입니다. 바꾸길 원하시면 클릭하십시오."
+
+#~ msgid "Unicode"
+#~ msgstr "유니코드"
+
+#~ msgid "Global Setup"
+#~ msgstr "전체 설정"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "X11, GTK 입력모듈, QT 입력모듈 등 모든 프론트엔드에대한 전체 설정을 합니"
+#~ "다."
+
+#~ msgid "_Trigger:"
+#~ msgstr "전환키(_T):"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "전환키 선택"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "SCIM 입력방식을 끄고/켜기 위한 키 설정입니다. 우측 단추를 클릭하고 수정하"
+#~ "세요."
+
+#~ msgid "Turn _On:"
+#~ msgstr "활성화(_O):"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "활성화키 선택"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "SCIM 입력방식을 켜기 위한 키 설정. 우측 단추를 클릭하고 수정하세요."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "끄기(_f):"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "끄기 키 선택"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "SCIM 입력방식을 끄기 위한 키 설정. 우측 단추를 클릭하고 수정하세요."
+
+#~ msgid "_Next input method:"
+#~ msgstr "다음 입력방식(_N):"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "다음 입력 방식으로 바꾸는데 사용할 키 선택"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "다음 입력방식으로 전환을 위한 키설정. 오를쪽 단추를 클릭하고 수정하세요."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "이전 입력방식(_P):"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "이전 입력방식을 선택"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "이전 입력방식으로 전환을 위한 키 설정. 우측 단추를 클릭하고 수정하세요."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "입력방식 방법 보여줌(_M)"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "입력 방식 보여줌 메뉴 키 선택"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "입력방식 메뉴를 보여줌 설정. 오를쪽 단추를 클릭하고 수정하세요."
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "현재 사용하는 키보드 레이아웃을 선택하세요, 그래야만 사용하려는 입력방법들"
+#~ "이 정확히 작동할수 있습니다."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "조합중인 글자를 클라이언트 윈도우에서 보여줌(_E)"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "이 옵션을 켜면, 조합중인 글자가 독립된 창에서 보이지 않고 입력창에서 바로 "
+#~ "보이게됩니다."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "모든 프로그램에 같은 입력 방법을 공유(_S)"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "이 옵션을 켜면 단하나의 입력 방법을 모든 프로그램에서 동시에 사용하게됩니"
+#~ "다. 선택하지 않으면 각각의 프로그램에서 다른 입력 방법이 적용됩니다."
+
+#~ msgid "Hotkeys"
+#~ msgstr "단축키"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr "각 입력 방법들과 단축키를 활성화하거나, 비활성화 할수 있습니다."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "설치된 입력기 서비스들:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "단축키 수정(_H)"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "선택된 입력 방식에 관련된 단축키 수정."
+
+#~ msgid "Select _Filters"
+#~ msgstr "필터 선택"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "현재 입력 방법에 연결될 필터 선택."
+
+#~ msgid "_Expand"
+#~ msgstr "확장(_E)"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "모든 언어 카테고리를 확장 "
+
+#~ msgid "_Collapse"
+#~ msgstr "축소(_C)"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "모든 언어 카테고리를 축소."
+
+#~ msgid "E_nable All"
+#~ msgstr "모두 활성화(_n)"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "모든 입력 방법을 활성화 "
+
+#~ msgid "_Disable All"
+#~ msgstr "모두 비활성(_D)"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "모든 입력 모듈 비활성화"
+
+#~ msgid "Filters"
+#~ msgstr "필터"
+
+#~ msgid "Description"
+#~ msgstr "설명"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "%s 단축기 수정"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "%s(을)를 위한 필터 선택"
+
+#~ msgid "Move _Up"
+#~ msgstr "위로(_U)"
+
+#~ msgid "Move _Down"
+#~ msgstr "아래로(_D)"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "GTK+-2.x 라이브러리를 기반으로 한 패널 디먼"
+
+#~ msgid "On demand"
+#~ msgstr "필요할때"
+
+#~ msgid "Never"
+#~ msgstr "전혀안함"
+
+#~ msgid "ToolBar"
+#~ msgstr "도구바"
+
+#~ msgid "_Show:"
+#~ msgstr "보이기(_S):"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "자동 스냅(_n)"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "입력방식 아이콘 보임(_i)"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "입력방식 이름 보임(_u)"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "숨기기 시간 제한(_o):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "고정 아이콘 보임(_t)"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "메뉴 아이콘 보임(_e)"
+
+#~ msgid "Show _help icon"
+#~ msgstr "도움말 아이콘 보임(_h)"
+
+#~ msgid "Show _property label"
+#~ msgstr "속성 상태 보임(_p)"
+
+#~ msgid "Input window"
+#~ msgstr "입력창"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "내장된 미리보기 테이블 사용(_m)"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "미리보기 테이블 세로로 보기(_V)"
+
+#~ msgid "Misc"
+#~ msgstr "기타"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "트레이 아이콘 보이기(_y)"
+
+#~ msgid "Stick _windows"
+#~ msgstr "창 고정(_w)"
+
+#~ msgid "_Font:"
+#~ msgstr "글꼴(_F):"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "\"항상\" 옵션이 선택되면 도구상자는 항상 화면에 보이게 됩니다. \"필요할때"
+#~ "\" 옵션이 선택되면 SCIM이 활성화 됐을 때만 보이게 됩니다. \"전혀안함\" 옵"
+#~ "션을 선택하면 전혀 보이지 않게 됩니다."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "이 설정을 선택하면, 도구상자가 화면 가장자리에 맞춰 움직이게 됩니다."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "일정 시간이 지나면 도구상자가 사라질 것입니다. 이 옵션은 \"항상 보임\" 옵"
+#~ "션이 선택 되어 있을때 작동합니다. 0으로 설정하면 작동하지 않습니다."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr "이 옵션을 선택하면, 입력방법 아이콘이 도구상자에 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr "이 옵션을 선택하면, 입력방법의 이름이 도구상자에 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr "이 옵션을 선택하면, 고정 아이콘이 도구상자에 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr "이 옵션을 선택하면, 메뉴 아이콘이 도구상자에 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr "이 옵션을 선택하면, 도구창에 도움말 아이콘이 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "이 옵션을 선택하면, 입력 방식의 속성들을 도구상자에서 볼 수 있습니다."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr "이 옵션을 선택하면, 미리보기 테이블이 입력창에 바로 붙을 것입니다."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr "이 옵션을 선택하면, 미리보기 테이블이 세로로 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "이 옵션을 선택하면, 트레이 아이콘이 데스크탑 테스크바에 보이게 됩니다."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "이 옵션을 선택하면, 도구상자, 입력창과 미리보기창들의 위치가 고정됩니다."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr "글꼴 설정은 입력창과 미리보기 테이블 창에 사용됩니다."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "글꼴 선택"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "프론트엔드"
+
+#~ msgid "IMEngine"
+#~ msgstr "입력기엔진"
+
+#~ msgid "Extra"
+#~ msgstr "기타"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "SCIM 입력기 설정"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">똑똑한 공통 입력 방법</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI 설정 프로그램</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, 제임스 수 <suzhe@tsinghua."
+#~ "org.cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">%s 모듈을 위한 설정.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "SCIM 설정을 종료하시겠습니까?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "모든 환경 설정을 새로 불러오진 못 합니다. 새로운 환경설정을 모두 적용 하"
+#~ "기 위해서는 SCIM을 다시 시작해야 합니다."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "SCIM 설정"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "GTK 라이브러리 기반의 설정 프로그램"
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "똑똑한 공통 입력 방법 (SCIM)을 위한 설정 프로그램"
+
+#~ msgid "SCIM Help"
+#~ msgstr "SCIM 도움말"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "똑똑한 공통 입력 방법"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "입력창과 도구상자 고정/비고정."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "SCIM 과 현재 입력 방법에 대한 간단한 도움말을 보여줌."
+
+#~ msgid "Show command menu."
+#~ msgstr "명령 메뉴를 보임."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 제임스 수 <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "설정 새로 불러오기"
+
+#~ msgid "Stick Windows"
+#~ msgstr "윈도우 고정"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "도구바 숨김"
+
+#~ msgid "Help ..."
+#~ msgstr "도움말 ..."
+
+#~ msgid "Exit"
+#~ msgstr "끝내기"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "En"
--- /dev/null
+# translation of nl.po to Nederlands
+# This file is distributed under the same license as the scim package.
+# Copyright (C) 2004 THE scim'S COPYRIGHT HOLDER.
+#
+#
+# Ronald Stroethoff <stroet43@zonnet.nl>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: nl\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 20:17+0900\n"
+"PO-Revision-Date: 2007-03-17 18:54+0100\n"
+"Last-Translator: Ronald Stroethoff <stroet43@zonnet.nl>\n"
+"Language-Team: Nederlands\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "Toetsen selectie"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Option"
+msgstr "Opties"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "Duits"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "Nederlands/toetsenbord"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Toetsen selectie"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "Toetsen selectie"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "Nederlands/toetsenbord"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "Opties"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "Nederlands/toetsenbord"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "Nederlands/toetsenbord"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "Engels (USA)"
+
+#~ msgid "Amharic"
+#~ msgstr "Amhaars"
+
+#~ msgid "Arabic"
+#~ msgstr "Arabisch"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "Arabisch (Egyptisch)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "Arabisch (Libanees)"
+
+#~ msgid "Assamese"
+#~ msgstr "Assamitisch"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "Azerbeidzjaans"
+
+#~ msgid "Belarusian"
+#~ msgstr "Witrussisch"
+
+#~ msgid "Bulgarian"
+#~ msgstr "Bulgaars"
+
+#~ msgid "Bengali"
+#~ msgstr "Bengaals"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "Bengaals (India)"
+
+#~ msgid "Tibetan"
+#~ msgstr "Tibetaans"
+
+#~ msgid "Bosnian"
+#~ msgstr "Bosnisch"
+
+#~ msgid "Catalan"
+#~ msgstr "Catalaans"
+
+#~ msgid "Czech"
+#~ msgstr "Tschechisch"
+
+#~ msgid "Welsh"
+#~ msgstr "Welsh"
+
+#~ msgid "Danish"
+#~ msgstr "Deens"
+
+#~ msgid "German"
+#~ msgstr "Duits"
+
+#~ msgid "Divehi"
+#~ msgstr "Divehi"
+
+#~ msgid "Greek"
+#~ msgstr "Grieks"
+
+#~ msgid "English"
+#~ msgstr "Engels"
+
+#~ msgid "English (Australian)"
+#~ msgstr "Engels (Australie)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "Engels (Canada)"
+
+#~ msgid "English (British)"
+#~ msgstr "Engels (Groot Britannie)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "Engels (Ierland)"
+
+#~ msgid "English (American)"
+#~ msgstr "Engels (USA)"
+
+#~ msgid "Spanish"
+#~ msgstr "Spaans"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "Spaans (Mexico)"
+
+#~ msgid "Estonian"
+#~ msgstr "Estlands"
+
+#~ msgid "Basque"
+#~ msgstr "Baskisch"
+
+#~ msgid "Persian"
+#~ msgstr "Perzisch"
+
+#~ msgid "Finnish"
+#~ msgstr "Fins"
+
+#~ msgid "French"
+#~ msgstr "Frans"
+
+#~ msgid "Irish"
+#~ msgstr "Iers"
+
+#~ msgid "Galician"
+#~ msgstr "Galicisch"
+
+#~ msgid "Gujarati"
+#~ msgstr "Gujarati"
+
+#~ msgid "Hebrew"
+#~ msgstr "Hebreeuws"
+
+#~ msgid "Hindi"
+#~ msgstr "Hindi"
+
+#~ msgid "Croatian"
+#~ msgstr "Kroatisch"
+
+#~ msgid "Hungarian"
+#~ msgstr "Hongaars"
+
+#~ msgid "Armenian"
+#~ msgstr "Armeens"
+
+#~ msgid "Interlingua"
+#~ msgstr "Interlingua"
+
+#~ msgid "Indonesian"
+#~ msgstr "Indonesisch"
+
+#~ msgid "Icelandic"
+#~ msgstr "IJslands"
+
+#~ msgid "Italian"
+#~ msgstr "Italiaans"
+
+#~ msgid "Japanese"
+#~ msgstr "Japans"
+
+#~ msgid "Georgian"
+#~ msgstr "Georgisch"
+
+#~ msgid "Kazakh"
+#~ msgstr "Kazachs"
+
+#~ msgid "Cambodian"
+#~ msgstr "Cambojaans"
+
+#~ msgid "Kannada"
+#~ msgstr "Kannada"
+
+#~ msgid "Korean"
+#~ msgstr "Koreaans"
+
+#~ msgid "Laothian"
+#~ msgstr "Laothian"
+
+#~ msgid "Lithuanian"
+#~ msgstr "Litouws"
+
+#~ msgid "Latvian"
+#~ msgstr "Lets"
+
+#~ msgid "Macedonian"
+#~ msgstr "Macedonisch"
+
+#~ msgid "Malayalam"
+#~ msgstr "Malayalam"
+
+#~ msgid "Mongolian"
+#~ msgstr "Mongools"
+
+#~ msgid "Marathi"
+#~ msgstr "Marathi"
+
+#~ msgid "Malay"
+#~ msgstr "Maleis"
+
+#~ msgid "Burmese"
+#~ msgstr "Birmaans"
+
+#~ msgid "Nepali"
+#~ msgstr "Nepalees"
+
+#~ msgid "Dutch"
+#~ msgstr "Nederlands"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "Noors (Nynorsk)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "Noors (Bokmal)"
+
+#~ msgid "Oriya"
+#~ msgstr "Oriya"
+
+#~ msgid "Punjabi"
+#~ msgstr "Punjabi"
+
+#~ msgid "Polish"
+#~ msgstr "Pools"
+
+#~ msgid "Portuguese"
+#~ msgstr "Portugees"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "Portugees (Brazilie)"
+
+#~ msgid "Romanian"
+#~ msgstr "Roemeens"
+
+#~ msgid "Russian"
+#~ msgstr "Russisch"
+
+#~ msgid "Sinhala"
+#~ msgstr "Singalees"
+
+#~ msgid "Slovak"
+#~ msgstr "Slowaaks"
+
+#~ msgid "Slovenian"
+#~ msgstr "Sloveens"
+
+#~ msgid "Albanian"
+#~ msgstr "Albanees"
+
+#~ msgid "Serbian"
+#~ msgstr "Servisch"
+
+#~ msgid "Swedish"
+#~ msgstr "Zweeds"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "Zweeds (Finland)"
+
+#~ msgid "Tamil"
+#~ msgstr "Tamil"
+
+#~ msgid "Telugu"
+#~ msgstr "Telugu"
+
+#~ msgid "Thai"
+#~ msgstr "Thais"
+
+#~ msgid "Turkish"
+#~ msgstr "Turks"
+
+#~ msgid "Uighur"
+#~ msgstr "Oeigoers"
+
+#~ msgid "Ukrainian"
+#~ msgstr "Oekraïens"
+
+#~ msgid "Urdu"
+#~ msgstr "Urdu"
+
+#~ msgid "Uzbek"
+#~ msgstr "Oezbeeks"
+
+#~ msgid "Vietnamese"
+#~ msgstr "Vietnamees"
+
+#~ msgid "Walloon"
+#~ msgstr "Waals"
+
+#~ msgid "Yiddish"
+#~ msgstr "Jiddisch"
+
+#~ msgid "Chinese"
+#~ msgstr "Chinees"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "Chinees (versimpeld)"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "Chinees (traditioneell)"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "Belgisch"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "Engels (US)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "Engels (Canada)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "Engels (Ierland)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "Engels (Groot Britannie)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "Engels (USA)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "Engels (Canada)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "Engels (Groot Britannie)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "Engels (Groot Britannie)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "Engels (Canada)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "Engels (Groot Britannie)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "Frans (Canada)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "Frans (Canada)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "Frans (Canada)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "Duits (Schwitsers)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "Frans (Canada)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "Duits (met deadkeys)"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "Duits (Schwitsers)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "Engels (Australie)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "Duits (Schwitsers)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "Duits (Schwitsers)"
+
+#, fuzzy
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "Portugees (Brazilie)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "Portugees (Brazilie)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "Spaans (Latijns Amerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "Spaans (Latijns Amerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "Spaans (Latijns Amerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "Spaans (Latijns Amerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "Spaans (Latijns Amerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "Spaans (CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "Malayalam"
+
+#~ msgid "Norwegian"
+#~ msgstr "Noors"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "Servisch"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "Chinees (traditioneell)"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "Chinees (traditioneell)"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "Chinees (traditioneell)"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "Chinees"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "Chinees (versimpeld)"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "Arabisch (Egyptisch)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "Arabisch (Egyptisch)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "Arabisch (Egyptisch)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "Arabisch (Egyptisch)"
+
+#~ msgid "Other"
+#~ msgstr "Overige"
+
+#~ msgid "Unknown"
+#~ msgstr "Onbekend"
+
+#~ msgid "English (US)"
+#~ msgstr "Engels (US)"
+
+#~ msgid "Belgian"
+#~ msgstr "Belgisch"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "Tsjechisch (qwerty)"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "Frans (Schwitsers) "
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "Duits (met deadkeys)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "Portugees (Brazilie, US, accent)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "Slowaaks (qwerty)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "Spaans (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "Spaans (Latijns Amerika)"
+
+#~ msgid "English (UK)"
+#~ msgstr "Engels (UK)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "Omzetten versimpeld/traditioneel Chinees"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "Versimpeld naar traditioneel Chinees omzetten en omgekeert."
+
+#, fuzzy
+#~ msgid "SC-TC"
+#~ msgstr "VC-TC"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "Omzetting versimpeld naar traditioneel Chinees"
+
+#~ msgid "No Conversion"
+#~ msgstr "Geen omzetting"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "Versimpeld naar traditioneel"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "Versimpeld Chinees naar triditioneel Chinees omzetten"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "Traditioneel naar versimpeld"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "Traditioneel Chinees naar versimpeld Chinees omzetten"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "VC->TC"
+
+#~ msgid "TC->SC"
+#~ msgstr "TC->VC"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "Smart Common Invoer-methode Plattform "
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(c) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "Aanzetten"
+
+#~ msgid "Name"
+#~ msgstr "Naam"
+
+#~ msgid "Cursor Position"
+#~ msgstr "Cursor positie"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "De huidige positie van de cursor (in karakters)."
+
+#~ msgid "Maximum length"
+#~ msgstr "Maximale lengte"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr "Maximale aantal getoonde karakters. »0« betekend onbegrenst."
+
+#~ msgid "Maximum width"
+#~ msgstr "Maximale Breedte"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "Maximale Breedte van de getoonde letterreeks."
+
+#~ msgid "Has Frame"
+#~ msgstr "Met kader"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "\"Nee\" verwijdert de buitenste rand van de getoonde letter-reeks."
+
+#~ msgid "Draw cursor"
+#~ msgstr "Cursor tonen"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "Met \"JA\" wordt een knipperende cursor getoond."
+
+#~ msgid "Auto move cursor"
+#~ msgstr "Cursor automatisch verplaatsen"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr "Bij »ja«, wordt de cursor automatisch verschoven."
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "Drukknop voor het doorgeven"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr ""
+#~ "Bij »ja«, wordt de gekozen uitdrukking met elke druk op een toets aan het "
+#~ "programma doorgegeven."
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "Venster-formaat automatisch aan teken-lengte aanpassen"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "Bei »ja« is de automatische grootte-aanpassing ingeschakeld."
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr "Bij »ja«, wordt de cursor automatisch verschoven."
+
+#~ msgid "Width in chars"
+#~ msgstr "Breedte in tekens"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr "Aantal tekens waarvoor ruimte gelaten wordt."
+
+#~ msgid "Scroll offset"
+#~ msgstr "Scroll-instelling"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr ""
+#~ "Aantal pixels, waarmee de tekenreeks weergave buiten het scherm naar "
+#~ "links verschoven wordt"
+
+#~ msgid "Text"
+#~ msgstr "Tekst"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "Inhoud van de tekenreeks weergave"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "Gekozen toetsen:"
+
+#~ msgid "Key Code:"
+#~ msgstr "Toetsen Code:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "Wizigings-toetsen:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Ctrl"
+
+#~ msgid "A_lt"
+#~ msgstr "_Alt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Shift"
+
+#~ msgid "_Release"
+#~ msgstr "_Vrijgeven"
+
+#~ msgid "_Meta"
+#~ msgstr "_Meta"
+
+#~ msgid "S_uper"
+#~ msgstr "Su_per"
+
+#~ msgid "_Hyper"
+#~ msgstr "_Hyper"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "Geef eerst een toets-code op."
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "Druk eerst een toets in (of een toetscombinatie).\n"
+#~ " Dit dialoog sluit zich, wanneer de toets wordt losgelaten."
+
+#~ msgid "Grabbing a key."
+#~ msgstr "Een toets pakken."
+
+#~ msgid "Key Selection"
+#~ msgstr "Toetsen selectie"
+
+#~ msgid "Orientation"
+#~ msgstr "Oriëntatie"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "De richting van de werkbalk."
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "Tekst"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amhaars"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Altijd"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Opties"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Nederlands/toetsenbord"
+
+#~ msgid "English/European"
+#~ msgstr "Nederlands/Europeesch"
+
+#, fuzzy
+#~ msgid "RAW CODE"
+#~ msgstr "Unicode RAW CODE"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(c) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Sneltoetsen:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " Omschakelen tussen Multibyte-Codering en Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " Invoer-methode terug zetten.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr ""
+#~ "De status van de huidige invoer-methode. Klik op deze om het te "
+#~ "veranderen."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Algemene instellingen"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Algemene instellingen die door alle FrontEnd-modules gebruikt worden, "
+#~ "inclusief de X11 FrontEnd, GKT IMModule, QT IMModule, enz."
+
+#, fuzzy
+#~ msgid "_Trigger:"
+#~ msgstr "_Trigger:"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Trigger-toetsen kiezen"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Toets-combinaties, waarmee de SCIM-invoer-methode wordt IN- en UIT-"
+#~ "geschakeld. Om dit te veranderen, klik op de rechterknop."
+
+#~ msgid "Turn _On:"
+#~ msgstr "_Inschakelen:"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Kies de inschakel toets."
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Toetscombinatie om de invoer-methode SCIM inteschakelen.Klik op de "
+#~ "rechterknop om te veranderen."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "U_itschakelen"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "UIT-schakeltoetsen uitkiezen"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Toetscombinatie waarmee de invoer-methode SCIM uitgeschakeld wordt. Klik "
+#~ "op de rechterknop om te veranderen."
+
+#~ msgid "_Next input method:"
+#~ msgstr "_Volgende invoer-methode:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr ""
+#~ "Kies een toetscombinatie om naar de volgende invoer-methode te gaan."
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Met deze toetscombinatie, gaat men naar de volgende invoer-methode. klik "
+#~ "op de rechterknop om te veranderen."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "_Vorige invoer-methode:"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Kies de toetscombinatie om naar de vorige invoer-methode te gaan"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Met deze toetscombinatie gaat men naar de vorige invoer-methode. Klik op "
+#~ "de rechterknop om te veranderen."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "Toon het keuze-menu voor invoer-methoden:"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "Kies de toetsen voor het tonen van het invoer-methode kies-menu"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Toetscombinatie's voor het tonen van het invoer-methode kies-menu. Klik "
+#~ "rechts voor het instellen."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "_Toetsenbord layout:"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Kies hier de huidige gebruikte toetsenbord-layout, zodat invoer-methoden, "
+#~ "die van het toetsenbord-layout afhankelijk zijn, goed werken."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "Invoer direkt in programma-venster tonen."
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Wanneer voor deze optie gekozen is, wordt de invoer direkt in het "
+#~ "programma-venster getoond, in plaats van een extra invoer-venster."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "Dezelfde invoer-methode voor alle programma's gebruiken."
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Wanneer dit gekozen is, wordt een en dezelfde invoer-methode voor alle "
+#~ "programma's gebruikt. Wanneer dit niet gekozen is, kan voor elke "
+#~ "programma een andere invoer-methode gekozen worden."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Sneltoetsen"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Hier kunnen de geïnstalleerde invoer-methoden IN- en UIT-geschakeld "
+#~ "worden en hiervoor sneltoetsen gekozen worden."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Geïnstalleerde invoer-methoden:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "_Sneltoetsen instellen"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "Sneltoetsen voor de gekozen invoer-methode instellen."
+
+#~ msgid "Select _Filters"
+#~ msgstr "_Filter selecteren"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "Kies de filter, die aan deze invoer-methode verbonden moet worden."
+
+#~ msgid "_Expand"
+#~ msgstr "Uitbreiden"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Alle taalgroepen uitbreiden."
+
+#~ msgid "_Collapse"
+#~ msgstr "Samenvouwen"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Alle taalgroepen samenvouwen."
+
+#~ msgid "E_nable All"
+#~ msgstr "Alles _inschakelen"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Alle invoer-methoden inschakelen."
+
+#~ msgid "_Disable All"
+#~ msgstr "Alles _uitschakelen"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Alle invoer-methoden uitschakelen."
+
+#~ msgid "Filters"
+#~ msgstr "Filter"
+
+#~ msgid "Languages"
+#~ msgstr "Talen"
+
+#~ msgid "Description"
+#~ msgstr "Omschrijving"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Sneltoetsen voor %s instellen"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Filter voor %s selecteren"
+
+#~ msgid "Move _Up"
+#~ msgstr "Naar _boven"
+
+#~ msgid "Move _Down"
+#~ msgstr "Naar _onderen"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr ""
+#~ "Een hulp-programma met panelen, gebaseert op de GTK+-2.x-bibliotheek."
+
+#~ msgid "On demand"
+#~ msgstr "Op verzoek"
+
+#~ msgid "Never"
+#~ msgstr "Nooit"
+
+#~ msgid "ToolBar"
+#~ msgstr "Werkbalk"
+
+#~ msgid "_Show:"
+#~ msgstr "_Toon:"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Auto s_nap"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Icoon voor invoer-methode tonen"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "_Namen van de invoer-methoden tonen"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "Ontzichtbaar maken na (sec):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Icoon altijd tonen"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "»_Menü« -icoon tonen"
+
+#~ msgid "Show _help icon"
+#~ msgstr "»_Help«-icoon tonen"
+
+#~ msgid "Show _property label"
+#~ msgstr "Eigenschappen-label tonen"
+
+#~ msgid "Input window"
+#~ msgstr "Invoer-venster"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "Interne opzoek-tabel"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "_Vertikale opzoek-tabel"
+
+#~ msgid "Misc"
+#~ msgstr "Diversen"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Toon tra_y icoon"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Venster op plaats vastzetten"
+
+#~ msgid "_Font:"
+#~ msgstr "_Lettertype:"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Wanneer \"Altijd\" is gekozen, wordt de werkbalk altijd op het scherm "
+#~ "getoond. Wanneer \"op verzoek\" is gekozen, wordt de werkbalk alleen "
+#~ "getoond wanneer SCIM aktief is. Wanneer \"Nooit\" is gekozen, wordt de "
+#~ "werkbalk nooit getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt de werkbalk aan de rand van het "
+#~ "beeldscherm vastgeklikt"
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "De werkbalk wordt ontzichtbaar na afloop van de ingestelde tijd. Deze "
+#~ "optie is alleen beschikbaar wanneer \"altijd tonen\" is gekozen.Zet de "
+#~ "tijd op nul (0) om dit gedrag uit te schakelen."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt het icoon van de huidige invoer-"
+#~ "methode in de werkbalk getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt de naam van de huidige invoer-"
+#~ "methode in de werkbalk getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt het sticky-icoon op de werkbalk "
+#~ "getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt het menu in de werkbalk getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt het hulp-icoon in de werkbalk "
+#~ "getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt naam van de invoer-methode getoond "
+#~ "in de werkbalk."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt de opzoek-tabel in het invoer-"
+#~ "venster getoond"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen wordt de opzoek-tabel vertikaal getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, zal het icoon van de werkbalk in het "
+#~ "systeemvak getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, worden de werkbalk, het invoer-venster en "
+#~ "de opzoektabel op deze plaats vastgezet."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "Dit gekozen lettertype wordt in het invoer-venster en in het opzoek-tabel "
+#~ "gebruikt."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Interface-lettertype kiezen"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "FrontEnd"
+
+#~ msgid "IMEngine"
+#~ msgstr "Invoer-methode"
+
+#~ msgid "Panel"
+#~ msgstr "Paneel"
+
+#~ msgid "Extra"
+#~ msgstr "Extra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Instellingen voor de SCIM-invoer-methode"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Smart Common Input Method-Plattform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI instellingen</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Instellen van de %s-Module.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Wilt U de setup van SCIM werkelijk verlaten?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Niet alle instellingen kunnen geladen worden. SCIM moet opnieuw gestart "
+#~ "worden om alle nieuwe instellingen te laden."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Instellen van SCIM"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "Geïntegreerde setup dat op de GTK-widget bibiotheek is gebaseerd."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "Setup voor de Smart Common Invoer-methode-Plattform"
+
+#~ msgid "SCIM Help"
+#~ msgstr "SCIM handboek"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Invoer-methode"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Invoer-venster en de werkbalk vastzetten/verschuifbaar maken."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "Toepasselijke help voor SCIM en de huidige invoer-methode tonen."
+
+#~ msgid "Show command menu."
+#~ msgstr "Commandoregel tonen."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(c) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Instellingen opnieuw laden"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Venster vastzetten"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Werkbalk ontzichtbaar maken"
+
+#~ msgid "Help ..."
+#~ msgstr "Help ..."
+
+#~ msgid "Exit"
+#~ msgstr "Afsluiten"
--- /dev/null
+# translation of pa.po to Punjabi
+# translation of scim.NEW.po to Punjabi
+# translation of scim.po to Punjabi
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Amanpreet Singh Alam <amanpreetalam@yahoo.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pa\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 20:17+0900\n"
+"PO-Revision-Date: 2005-12-13 08:28+0530\n"
+"Last-Translator: Amanpreet Singh Alam <amanpreetalam@yahoo.com>\n"
+"Language-Team: Punjabi <fedora-trans-pa@redhat.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "ਸਵਿੱਚ ਚੋਣ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Option"
+msgstr "ਚੋਣ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "ਜਰਮਨ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "ਅੰਗਰੇਜ਼ੀ/ਕੀ-ਬੋਰਡ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "ਸਵਿੱਚ ਚੋਣ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "ਸਵਿੱਚ ਚੋਣ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "ਅੰਗਰੇਜ਼ੀ/ਕੀ-ਬੋਰਡ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "ਚੋਣ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "ਅੰਗਰੇਜ਼ੀ/ਕੀ-ਬੋਰਡ"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ/ਕੀ-ਬੋਰਡ"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਮਰੀਕੀ)"
+
+#~ msgid "Amharic"
+#~ msgstr "ਅਮਹੀਕਿਨ"
+
+#~ msgid "Arabic"
+#~ msgstr "ਅਰਬੀ"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "ਅਰਬੀ (ਮਿਸਰ)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#~ msgid "Assamese"
+#~ msgstr "ਆਸਾਮੀ"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "ਅਜ਼ਰਬਾਈਜਾਨ"
+
+#~ msgid "Belarusian"
+#~ msgstr "ਬੇਲਾਰੂਸੀ"
+
+#~ msgid "Bulgarian"
+#~ msgstr "ਬੁਲਗਾਰੀਅਨ"
+
+#~ msgid "Bengali"
+#~ msgstr "ਬੰਗਾਲੀ"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "ਬੰਗਾਲੀ (ਭਾਰਤ)"
+
+#~ msgid "Tibetan"
+#~ msgstr "ਤਿੱਬਤੀ"
+
+#~ msgid "Bosnian"
+#~ msgstr "ਬੋਸਨੀਅਨ"
+
+#~ msgid "Catalan"
+#~ msgstr "ਕੇਟੇਲਨ"
+
+#~ msgid "Czech"
+#~ msgstr "ਚੈੱਕ"
+
+#~ msgid "Welsh"
+#~ msgstr "ਵਾਲਿਸ਼"
+
+#~ msgid "Danish"
+#~ msgstr "ਡੈਨਿਸ਼"
+
+#~ msgid "German"
+#~ msgstr "ਜਰਮਨ"
+
+#~ msgid "Greek"
+#~ msgstr "ਗਰੀਕ"
+
+#~ msgid "English"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ"
+
+#~ msgid "English (Australian)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਸਟਰੇਲੀਅਨ)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਕੈਨੇਡੀ)"
+
+#~ msgid "English (British)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਆਇਰਲੈਂਡ)"
+
+#~ msgid "English (American)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਮਰੀਕੀ)"
+
+#~ msgid "Spanish"
+#~ msgstr "ਸਪੇਨੀ"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#~ msgid "Estonian"
+#~ msgstr "ਈਸਟੋਨੀਅਨ"
+
+#~ msgid "Basque"
+#~ msgstr "ਬਸਕਿਉ"
+
+#~ msgid "Persian"
+#~ msgstr "ਪਰਸੀਅਨ"
+
+#~ msgid "Finnish"
+#~ msgstr "ਫੈਨਿਸ਼"
+
+#~ msgid "French"
+#~ msgstr "ਫਰੈਂਚ"
+
+#~ msgid "Irish"
+#~ msgstr "ਆਇਰਸ਼"
+
+#~ msgid "Galician"
+#~ msgstr "ਗਾਲੇਸ਼ੀਅਨ"
+
+#~ msgid "Gujarati"
+#~ msgstr "ਗੁਜਰਾਤੀ"
+
+#~ msgid "Hebrew"
+#~ msgstr "ਹੈਬਰਿਊ"
+
+#~ msgid "Hindi"
+#~ msgstr "ਹਿੰਦੀ"
+
+#~ msgid "Croatian"
+#~ msgstr "ਕਰੋਆਟੀਅਨ"
+
+#~ msgid "Hungarian"
+#~ msgstr "ਹੰਗਰੀਅਨ"
+
+#, fuzzy
+#~ msgid "Armenian"
+#~ msgstr "ਰੋਮਾਨੀਆਈ"
+
+#~ msgid "Interlingua"
+#~ msgstr "ਇੰਟਰਲਿੰਗੂਆ"
+
+#~ msgid "Indonesian"
+#~ msgstr "ਇੰਡੋਨੇਸ਼ੀਆਈ"
+
+#~ msgid "Icelandic"
+#~ msgstr "ਆਈਸਲੈਂਡੀ"
+
+#~ msgid "Italian"
+#~ msgstr "ਇਤਾਲਵੀ"
+
+#~ msgid "Japanese"
+#~ msgstr "ਜਾਪਾਨੀ"
+
+#, fuzzy
+#~ msgid "Georgian"
+#~ msgstr "ਜਰਮਨ"
+
+#~ msgid "Kazakh"
+#~ msgstr "ਕਾਜ਼ਕ"
+
+#~ msgid "Cambodian"
+#~ msgstr "ਕੰਬੋਡੀਅਨ"
+
+#~ msgid "Kannada"
+#~ msgstr "ਕੰਨੜ"
+
+#~ msgid "Korean"
+#~ msgstr "ਕੋਰੀਅਨ"
+
+#~ msgid "Laothian"
+#~ msgstr "ਲਿਊਥੀਅਨ"
+
+#~ msgid "Lithuanian"
+#~ msgstr "ਲੀਥੂਵਨੀਅਨ"
+
+#~ msgid "Latvian"
+#~ msgstr "ਲਾਟਵੀਅਨ"
+
+#~ msgid "Macedonian"
+#~ msgstr "ਮੈਕਡੋਨੀਅਨ"
+
+#~ msgid "Malayalam"
+#~ msgstr "ਮਾਲਿਆਲਮ"
+
+#~ msgid "Mongolian"
+#~ msgstr "ਮੰਗੋਲੀਅਨ"
+
+#~ msgid "Marathi"
+#~ msgstr "ਮਰਾਠੀ"
+
+#~ msgid "Malay"
+#~ msgstr "ਮਲਾਇਆ"
+
+#~ msgid "Nepali"
+#~ msgstr "ਨੇਪਾਲੀ"
+
+#~ msgid "Dutch"
+#~ msgstr "ਡੱਚ"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "ਨਾਰਵੇਗੀਅਨ (ਨਿਉਰਸਕ)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "ਨਾਰਵੇਗੀਅਨ (ਬੋਕਮਾਲ)"
+
+#~ msgid "Oriya"
+#~ msgstr "ਓੜੀਆ"
+
+#~ msgid "Punjabi"
+#~ msgstr "ਪੰਜਾਬੀ"
+
+#~ msgid "Polish"
+#~ msgstr "ਪੋਲਿਸ਼"
+
+#~ msgid "Portuguese"
+#~ msgstr "ਪੁਰਤਗਾਲੀ"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "ਪੁਰਤਗਾਲੀ (ਬਰਾਜ਼ੀਲ)"
+
+#~ msgid "Romanian"
+#~ msgstr "ਰੋਮਾਨੀਆਈ"
+
+#~ msgid "Russian"
+#~ msgstr "ਰੂਸੀ"
+
+#~ msgid "Slovak"
+#~ msgstr "ਸਲੋਵਾਕ"
+
+#~ msgid "Slovenian"
+#~ msgstr "ਸਲੋਵੀਅਨ"
+
+#~ msgid "Albanian"
+#~ msgstr "ਅਲਬਾਈਅਨ"
+
+#~ msgid "Serbian"
+#~ msgstr "ਸਰਬੀਅਨ"
+
+#~ msgid "Swedish"
+#~ msgstr "ਸਵੀਡਸ਼"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "ਸਵਡਿਸ਼ (ਫਿਨਲੈਂਡ)"
+
+#~ msgid "Tamil"
+#~ msgstr "ਤਾਮਿਲ"
+
+#~ msgid "Telugu"
+#~ msgstr "ਤੇਲਗੂ"
+
+#~ msgid "Thai"
+#~ msgstr "ਥਾਈ"
+
+#~ msgid "Turkish"
+#~ msgstr "ਤੁਰਕੀ"
+
+#~ msgid "Uighur"
+#~ msgstr "ਊਘਰ"
+
+#~ msgid "Ukrainian"
+#~ msgstr "ਯੂਕਰੇਨੀ"
+
+#~ msgid "Urdu"
+#~ msgstr "ਊਰਦੂ"
+
+#~ msgid "Uzbek"
+#~ msgstr "ਉਜੇਬਕ"
+
+#~ msgid "Vietnamese"
+#~ msgstr "ਵੀਅਤਨਾਮੀ"
+
+#~ msgid "Walloon"
+#~ msgstr "ਵਾਲਿਸ਼"
+
+#~ msgid "Yiddish"
+#~ msgstr "ਯਿਡਿੱਸ਼"
+
+#~ msgid "Chinese"
+#~ msgstr "ਚੀਨੀ"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "ਚੀਨੀ (ਸਧਾਰਨ)"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "ਚੀਨੀ (ਮੂਲ)"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "ਬੈਲਜੀਅਨ"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਮਰੀਕੀ)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਕੈਨੇਡੀ)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਆਇਰਲੈਂਡ)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਮਰੀਕੀ)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਕੈਨੇਡੀ)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਕੈਨੇਡੀ)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "ਫਰੈਂਚ (ਕੈਨੇਡੀ)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "ਫਰੈਂਚ (ਕੈਨੇਡੀ)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "ਫਰੈਂਚ (ਕੈਨੇਡੀ)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "ਜਰਮਨ (ਸਵਿੱਸ)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "ਫਰੈਂਚ (ਕੈਨੇਡੀ)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "ਜਰਮਨ (ਡਿੱਡ ਸਵਿੱਚਾਂ ਨਾਲ)"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "ਜਰਮਨ (ਸਵਿੱਸ)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਸਟਰੇਲੀਅਨ)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "ਜਰਮਨ (ਸਵਿੱਸ)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "ਜਰਮਨ (ਸਵਿੱਸ)"
+
+#, fuzzy
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "ਪੁਰਤਗਾਲੀ (ਬਰਾਜ਼ੀਲ)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "ਪੁਰਤਗਾਲੀ (ਬਰਾਜ਼ੀਲ)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "ਸਪੇਨੀ (CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "ਮਾਲਿਆਲਮ"
+
+#~ msgid "Norwegian"
+#~ msgstr "ਨਾਰਵੇਗੀਅਨ"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "ਸਰਬੀਅਨ"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "ਚੀਨੀ (ਮੂਲ)"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "ਚੀਨੀ (ਮੂਲ)"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "ਚੀਨੀ (ਮੂਲ)"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "ਚੀਨੀ"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "ਚੀਨੀ (ਸਧਾਰਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "ਅਰਬੀ (ਮਿਸਰ)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "ਅਰਬੀ (ਮਿਸਰ)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "ਅਰਬੀ (ਮਿਸਰ)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "ਅਰਬੀ (ਮਿਸਰ)"
+
+#~ msgid "Other"
+#~ msgstr "ਹੋਰ"
+
+#~ msgid "Unknown"
+#~ msgstr "ਅਣਜਾਣ"
+
+#~ msgid "English (US)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਮਰੀਕੀ)"
+
+#~ msgid "Belgian"
+#~ msgstr "ਬੈਲਜੀਅਨ"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "ਚੈੱਕ(ਕਿਉਵਰਟੀ)"
+
+#~ msgid "Dvorak"
+#~ msgstr "ਡਵੋਰਿਕ"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "ਫਰੈਂਚ (ਸਵਟਿਜ਼ਰਲੈਂਡ)"
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "ਜਰਮਨ (ਡਿੱਡ ਸਵਿੱਚਾਂ ਨਾਲ)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "ਪੁਰਤਗਾਲੀ (ਬਰਾਜ਼ੀਲ ਅਮਰੀਕੀ ਢੰਗ)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "ਸਲੋਵਾਕ(ਕਿਉਵਰਟੀ)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "ਸਪੇਨੀ (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#~ msgid "English (UK)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "ਸਧਾਰਨ-ਮੂਲ ਚੀਨੀ ਤਬਦੀਲੀ"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "ਸਧਾਰਨ ਚੀਨੀ ਅਤੇ ਮੂਲ ਚੀਨੀ ਵਿੱਚ ਤਬਦੀਲੀ"
+
+#~ msgid "SC-TC"
+#~ msgstr "SC-TC"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "ਸਧਾਰਨ-ਮੂਲ ਚੀਨੀ ਤਬਦੀਲੀ"
+
+#~ msgid "No Conversion"
+#~ msgstr "ਕੋਈ ਤਬਦੀਲੀ ਨਹੀਂ"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "ਸਧਾਰਨ ਤੋਂ ਮੂਲ"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "ਸਧਾਰਨ ਚੀਨੀ ਤੋਂ ਮੂਲ ਚੀਨੀ ਤਬਦੀਲ"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "ਮੂਲ ਤੋਂ ਸਧਾਰਨ"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "ਮੂਲ ਚੀਨੀ ਤੋਂ ਸਧਾਰਨ ਚੀਨੀ ਅਨੁਵਾਦ"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "SC->TC"
+
+#~ msgid "TC->SC"
+#~ msgstr "TC->SC"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "ਸਮਾਰਟ ਕਾਮਨ ਇੰਪੁੱਟ ਮੈਥਡ ਪਲੇਟਫਾਰਮ"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "ਯੋਗ"
+
+#~ msgid "Name"
+#~ msgstr "ਨਾਂ"
+
+#~ msgid "Cursor Position"
+#~ msgstr "ਕਰਸਰ ਸਥਿਤੀ"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "ਕਰਸਰ ਦੀ ਮੌਜੂਦਾ ਸਥਿਤੀ ਅੱਖਰਾਂ ਵਿੱਚ।"
+
+#~ msgid "Maximum length"
+#~ msgstr "ਵੱਧ ਤੋ ਵੱਧ ਲੰਬਾਈ"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr ""
+#~ "ਇਸ ਸਤਰ ਝਲਕ ਲਈ ਵੱਧ ਤੋਂ ਵੱਧ ਅੱਖਰਾਂ ਦੀ ਗਿਣਤੀ। ਜੇਕਰ ਵੱਧ ਤੋਂ ਵੱਧ ਨਾ ਹੋਇਆ ਤਾਂ ਸਿਫ਼ਰ ਹੋਵੇਗਾ।"
+
+#~ msgid "Maximum width"
+#~ msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਚੌੜਾਈ"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "ਇਸ ਸਤਰ ਝਲਕ ਦੀ ਵੱਧ ਤੋਂ ਵੱਧ ਚੌੜਾਈ ਹੈ।"
+
+#~ msgid "Has Frame"
+#~ msgstr "ਫਰੇਮ ਹੈ"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "FALSE ਨਾਲ ਸਤਰ ਝਲਕ ਤੋਂ ਬਾਹਰੀ bevel ਹਟਾਏ ਜਾਏਗਾ।"
+
+#~ msgid "Draw cursor"
+#~ msgstr "ਕਰਸਰ ਬਣਾਓ"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "TRUE ਝਪਕਦੀ ਕਰਸਰ ਬਣਾਏਗਾ।"
+
+#~ msgid "Auto move cursor"
+#~ msgstr "ਸਵੈ ਏਧਰ ਓਧਰ ਕਰਸਰ"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr "TRUE ਮਾਊਸ ਦਬਾਉਣ ਨਾਲ ਕਰਸਰ ਨੂੰ ਸਵੈ-ਚਾਲਤ ਏਧਰ ਓਧਰ ਕੀਤਾ ਜਾਵੇਗਾ।"
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "ਅੱਗੇ ਬਟਨ ਦਬਾਉਣ ਘਟਨਾ"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr "TRUE ਉਪਭੋਗੀ ਪਰੋਗਰਾਮ ਲਈ ਅੱਗੇ ਬਟਨ ਦਬਾਉਣ ਘਟਨਾ ਹੈ।"
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "ਸਤਰ ਫਿੱਟ ਕਰਨ ਲਈ ਵਿਦਗਿਟ ਸਵੈ ਮੁੜ-ਅਕਾਰ"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "TRUE ਸਵੈ ਮੁੜ-ਅਕਾਰ ਚਾਲੂ ਹੈ।"
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr "TRUE ਮਾਊਸ ਦਬਾਉਣ ਨਾਲ ਕਰਸਰ ਨੂੰ ਸਵੈ-ਚਾਲਤ ਏਧਰ ਓਧਰ ਕੀਤਾ ਜਾਵੇਗਾ।"
+
+#~ msgid "Width in chars"
+#~ msgstr "ਅੱਖਰਾਂ ਵਿੱਚ ਚੌਡ਼ਾਈ"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr "ਸਤਰ ਝਲਕ ਵਿੱਚ ਖਾਲੀ ਥਾਂ ਛੱਡਣ ਲਈ ਅੱਖਰਾਂ ਦੀ ਗਿਣਤੀ ਹੈ।"
+
+#~ msgid "Scroll offset"
+#~ msgstr "ਸੰਤੁਲਨ ਸਕਰੋਲ"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr "ਖੱਬੇ ਤੋਂ ਸਕਰੀਨ ਨੂੰ ਸਤਰ ਝਲਕ ਸਮੇਟਣ ਲਈ ਪਿਕਸਲਾਂ ਦੀ ਗਿਣਤੀ"
+
+#~ msgid "Text"
+#~ msgstr "ਪਾਠ"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "ਸਤਰ ਝਲਕ ਦਾ ਪਰਸੰਗ"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "ਚੁਣੀਆਂ ਸਵਿੱਚਾਂ(_K):"
+
+#~ msgid "Key Code:"
+#~ msgstr "ਸਵਿੱਚ ਕੋਡ:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "ਸੋਧਕ:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Ctrl"
+
+#~ msgid "A_lt"
+#~ msgstr "A_lt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Shift"
+
+#~ msgid "_Release"
+#~ msgstr "ਜਾਰੀ(_R)"
+
+#~ msgid "_Meta"
+#~ msgstr "ਮੈਟਾ(_M)"
+
+#~ msgid "S_uper"
+#~ msgstr "ਸੁਪਰ(_u)"
+
+#~ msgid "_Hyper"
+#~ msgstr "ਹਾਈਪਰ(_H)"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "ਪਹਿਲਾਂ ਇੱਕ ਸਵਿੱਚ ਕੋਡ ਦਿਓ।"
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "ਇੱਕ ਸਵਿੱਚ (ਜਾਂ ਇੱਕ ਸਵਿੱਚ ਜੋੜ) ਦਬਾਉ।\n"
+#~ "ਇਹ ਵਾਰਤਾਲਾਪ ਇੱਕ ਸਵਿੱਚ ਦਬਾਉਣ ਨਾਲ ਬੰਦ ਹੋ ਜਾਵੇਗਾ।"
+
+#~ msgid "Grabbing a key."
+#~ msgstr "ਇੱਕ ਸਵਿੱਚ ਫੜੋ।"
+
+#~ msgid "Key Selection"
+#~ msgstr "ਸਵਿੱਚ ਚੋਣ"
+
+#~ msgid "Orientation"
+#~ msgstr "ਸਥਿਤੀ"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "ਟਰੇ ਦੀ ਸਥਿਤੀ ਹੈ।"
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "ਪਾਠ"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "ਅਮਹੀਕਿਨ"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "ਹਮੇਸ਼ਾ"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "ਚੋਣ"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ/ਕੀ-ਬੋਰਡ"
+
+#~ msgid "English/European"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ/ਯੂਰਪ"
+
+#~ msgid "RAW CODE"
+#~ msgstr "ਕੱਚਾ ਕੋਡ"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "ਹਾਟ ਸਵਿੱਚਾਂ:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " ਬਹੁ-ਬਾਈਟ ਇੰਕੋਡਿੰਗ ਅਤੇ ਯੂਨੀਕਰੋਡ ਵਿੱਚ ਤਬਦੀਲ ਹੋਣ ਲਈ।\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " ਇੰਪੁੱਟ ਢੰਗ ਮੁੜ-ਸੈਟ ਕਰਨ ਲਈ।\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "ਮੌਜੂਦਾ ਇੰਪੁੱਟ ਢੰਗ ਦੀ ਸਥਿਤੀ ਹੈ। ਤਬਦੀਲ ਕਰਨ ਲਈ ਦਬਾਉ।"
+
+#~ msgid "Unicode"
+#~ msgstr "ਯੂਨੀਕੋਡ"
+
+#~ msgid "Global Setup"
+#~ msgstr "ਗਲੋਬਲ ਸੈਟਅੱਪ"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "ਸਭ ਮੁੱਖ ਮੈਡੀਊਲ ਰਾਹੀਂ ਵਰਤੇ ਜਾਦੇ ਗਲੋਬਲ ਚੋਣ ਸੈਟਅੱਪ, ਜਿਸ ਵਿੱਚ X11 ਮੁੱਖ ਭੂਮੀ, GTK IMModule, "
+#~ "QT IMModule ਆਦਿ"
+
+#~ msgid "_Trigger:"
+#~ msgstr "ਤਬਦੀਲ(_T):"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "ਤਬਦੀਲੀ ਸਵਿੱਚ ਚੁਣੋ"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "SCIM ਇੰਪੁੱਟ ਢੰਗ ਨੂੰ ਚਾਲੂ/ਬੰਦ ਕਰਨ ਲਈ ਕੁੰਜੀ ਘਟਨਾ ਹੈ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "Turn _On:"
+#~ msgstr "ਚਾਲੂ ਕਰੋ(_O):"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "ਚਾਲੂ ਕਰਨ ਵਾਲੀਆਂ ਕੁੰਜੀਆਂ ਚੁਣੋ"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "SCIM ਇੰਪੁੱਟ ਢੰਗ ਚਾਲੂ ਕਰਨ ਲਈ ਕੁੰਜੀਆਂ ਦੀ ਚੋਣ ਕਰੋ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਦੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "ਬੰਦ ਕਰੋ(_f):"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "ਬੰਦ ਕਰਨ ਵਾਲੀਆਂ ਕੁੰਜੀਆਂ"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "SCIM ਇੰਪੁੱਟ ਢੰਗ ਬੰਦ ਕਰਨ ਲਈ ਕੁੰਜੀਆਂ ਦੀ ਚੋਣ ਕਰੋ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਦੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "_Next input method:"
+#~ msgstr "ਅੱਗੇ ਇੰਪੁੱਟ ਢੰਗ(_N):"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "ਅੱਗੇ ਇੰਪੁੱਟ ਢੰਗ ਦੀ ਚੋਣ ਕਰਨ ਲਈ ਕੁੰਜੀਆਂ ਚੁਣੋ"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "ਅੱਗੇ ਇੰਪੁੱਟ ਢੰਗ ਦੀ ਚੋਣ ਕਰਨ ਲਈ ਕੁੰਜੀਆਂ ਦੀ ਚੋਣ ਕਰੋ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਦੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "_Previous input method:"
+#~ msgstr "ਪਿੱਛੇ ਇੰਪੁੱਟ ਢੰਗ(_P):"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "ਪਿਛਲਾ ਇੰਪੁੱਟ ਢੰਗ ਕੁੰਜੀਆਂ ਚੁਣੋ"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "ਪਿਛਲਾ ਇੰਪੁੱਟ ਢੰਗ ਚਾਲੂ ਕਰਨ ਲਈ ਕੁੰਜੀਆਂ ਦੀ ਚੋਣ ਕਰੋ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਦੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "ਇੰਪੁੱਟ ਢੰਗ ਮੇਨੂ ਵੇਖਾਓ(_m):"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "ਇੰਪੁੱਟ ਢੰਗ ਮੇਨੂ ਵੇਖਾਉਣ ਲਈ ਕੁੰਜੀਆਂ ਚੁਣੋ"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "ਇੰਪੁੱਟ ਢੰਗ ਮੇਨੂ ਵੇਖਾਉਣ ਲਈ ਕੁੰਜੀਆਂ ਦੀ ਚੋਣ ਕਰੋ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਦੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "ਕੀ-ਬੋਰਡ ਖਾਕਾ(_K):"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "ਤੁਹਾਨੂੰ ਇੱਥੇ ਆਪਣਾ ਮੌਜੂਦਾ ਕੀ-ਬੋਰਡ ਖਾਕੇ ਦੀ ਚੋਣ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ, ਤਾਂ ਕਿ ਇੰਪੁੱਟ ਢੰਗ, ਜੋ ਕਿ ਕੀ-"
+#~ "ਬੋਰਡ ਖਾਕੇ ਦਾ ਖਿਆਲ ਰੱਖਦਾ ਹੈ, ਠੀਕ ਤਰਾਂ ਕੰਮ ਕਰ ਸਕੇ।"
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "ਕਲਾਂਇਟ ਝਰੋਖੇ 'ਚ ਪਹਿਲਾਂ-ਸੋਧ ਸਤਰ(_E)"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਕਲਾਂਇਟ ਇੰਪੁੱਟ ਝਰੋਖੇ ਵਿੱਚ ਪਹਿਲਾਂ-ਸੋਧ ਸਤਰ ਸਿੱਧੀ ਵਿਖਾਈ ਜਾਵੇਗਾ, ਨਾ "
+#~ "ਕਿ ਇੱਕ ਆਜ਼ਾਦ ਤਰਦੇ ਝਰੋਖਾ।"
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "ਸਭ ਕਾਰਜਾਂ 'ਚ ਇੱਕੋ ਹੀ ਇੰਪੁੱਟ ਢੰਗ ਵਰਤੋਂ(_S)"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਸਿਰਫ਼ ਇੱਕ ਹੀ ਇੰਪੁੱਟ ਢੰਗ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਾਵੇਗੀ, ਜੋ ਕਿ ਇੱਕ ਸਮੇਂ ਸਭ "
+#~ "ਕਾਰਜਾਂ ਲਈ ਵਰਤਿਆ ਜਾਵੇਗਾ। ਨਹੀਂ ਤਾਂ ਹਰ ਕਾਰਜ ਲਈ ਵੱਖਰਾ ਢੰਗ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਸੀ।"
+
+#~ msgid "Hotkeys"
+#~ msgstr "ਹਾਟ-ਸਵਿੱਚ"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr "ਤੁਸੀਂ ਇੱਥੇ ਇੰਪੁੱਟ ਢੰਗ ਯੋਗ/ਅਯੋਗ ਕਰ ਅਤੇ ਇੰਪੁੱਟ ਢੰਗ ਲਈ ਹਾਟ-ਸਵਿੱਚਾਂ ਸੈਟ ਕਰ ਸਕਦੇ ਹੋ।"
+
+#~ msgid "The installed input method services:"
+#~ msgstr "ਇੰਸਟਾਲ ਹੋਏ ਇੰਪੁੱਟ ਢੰਗ ਸੇਵਾਵਾਂ:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "ਹਾਟ-ਸਵਿੱਚ ਸੋਧ(_H)"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "ਚੁਣੇ ਇੰਪੁੱਟ ਢੰਗ ਨਾਲ ਸਬੰਧਤ ਹਾਟ-ਕੁੰਜੀਆਂ ਦੀ ਸੋਧ ਕਰੋ।"
+
+#~ msgid "Select _Filters"
+#~ msgstr "ਫਿਲਟਰ ਚੁਣੋ(_F)"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "ਫਿਲਟਰ ਦੀ ਚੋਣ ਕਰੋ, ਜੋ ਕਿ ਇਸ ਇੰਪੁੱਟ ਢੰਗ ਨਾਲ ਜੋੜਿਆ ਜਾਵੇਗਾ।"
+
+#~ msgid "_Expand"
+#~ msgstr "ਫੈਲਾਓ(_E)"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "ਸਭ ਭਾਸ਼ਾ ਵਰਗ ਫੈਲਾਓ।"
+
+#~ msgid "_Collapse"
+#~ msgstr "ਸਮੇਟੋ(_C)"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "ਸਭ ਭਾਸ਼ਾ ਵਰਗ ਸਮੇਟੋ।"
+
+#~ msgid "E_nable All"
+#~ msgstr "ਸਭ ਯੋਗ(_n)"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "ਸਭ ਇੰਪੁੱਟ ਢੰਗ ਯੋਗ ਕਰਦਾ ਹੈ।"
+
+#~ msgid "_Disable All"
+#~ msgstr "ਸਭ ਆਯੋਗ(_D)"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "ਸਭ ਇੰਪੁੱਟ ਢੰਗ ਆਯੋਗ ਹਨ।"
+
+#~ msgid "Filters"
+#~ msgstr "ਫਿਲਟਰ"
+
+#~ msgid "Languages"
+#~ msgstr "ਭਾਸ਼ਾਵਾਂ"
+
+#~ msgid "Description"
+#~ msgstr "ਵੇਰਵਾ"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "%s ਲਈ ਹਾਟ-ਸਵਿੱਚ ਸੋਧ"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "%s ਲਈ ਫਿਲਟਰ ਚੁਣੋ"
+
+#~ msgid "Move _Up"
+#~ msgstr "ਉੱਪਰ ਜਾਓ(_U)"
+
+#~ msgid "Move _Down"
+#~ msgstr "ਹੇਠਾਂ ਜਾਓ(_D)"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "GTK+-2.x ਲਾਇਬਰੇਰੀ 'ਤੇ ਪੈਨਲ ਡਾਈਮੋਨ ਹੈ।"
+
+#~ msgid "On demand"
+#~ msgstr "ਲੋੜ ਸਮੇਂ"
+
+#~ msgid "Never"
+#~ msgstr "ਕਦੇ ਨਹੀਂ"
+
+#~ msgid "ToolBar"
+#~ msgstr "ਸੰਦ-ਪੱਟੀ"
+
+#~ msgid "_Show:"
+#~ msgstr "ਵੇਖਾਓ(_S):"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "ਸਵੈ ਸਨੈਪ(_n)"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "ਇੰਪੁੱਟ ਆਈਕਾਨ ਢੰਗ ਆਈਕਾਨ ਵੇਖਾਓ(_i)"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "ਇੰਪੁੱਟ ਢੰਗ ਨਾਂ ਵੇਖਾਓ(_u)"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "ਸਮਾਂ-ਅੰਤਰਾਲ ਓਹਲੇ(_o):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "ਟਿੱਕ ਆਈਕਾਨ ਵੇਖਾਓ(_t)"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "ਮੇਨੂ ਆਈਕਾਨ ਵੇਖਾਓ(_e)"
+
+#~ msgid "Show _help icon"
+#~ msgstr "ਸਹਾਇਤਾ ਆਈਕਾਨ ਵੇਖਾਓ(_h)"
+
+#~ msgid "Show _property label"
+#~ msgstr "ਵਿਸ਼ੇਸ਼ਤਾ ਲੇਬਲ ਵੇਖਾਓ(_p)"
+
+#~ msgid "Input window"
+#~ msgstr "ਇੰਪੁੱਟ ਝਰੋਖਾ"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "ਸ਼ਾਮਲ ਖੋਜ ਸਾਰਣੀ(_m)"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "ਲੰਬਕਾਰੀ ਖੋਜ ਸਾਰਣੀ(_V)"
+
+#~ msgid "Misc"
+#~ msgstr "ਫੁਟਕਲ"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "ਟਰੇ ਆਈਕਾਨ ਵੇਖਾਓ(_y)"
+
+#~ msgid "Stick _windows"
+#~ msgstr "ਝਰੋਖੇ ਚੇਪੋ(_w)"
+
+#~ msgid "_Font:"
+#~ msgstr "ਫੋਂਟ(_F):"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "ਜੇਕਰ \"ਹਮੇਸ਼ਾ\" ਚੋਣ ਯੋਗ ਕੀਤੀ ਗਈ ਤਾਂ, ਸੰਦ-ਪੱਟੀ ਨੂੰ ਹਮੇਸ਼ਾ ਪਰਦੇ 'ਤੇ ਵਿਖਾਇਆ ਜਾਵੇਗਾ। ਜੇਕਰ "
+#~ "\"ਲੋੜ ਸਮੇਂ\" ਦੀ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਹੀ ਵੇਖਾਇਆ ਜਾਵੇਗਾ, ਜਦੋਂ SCIM ਦੇ ਸਰਗਰਮ ਹੋਵੇਗਾ। ਜੇਕਰ \"ਕਦੇ "
+#~ "ਨਹੀਂ\" ਦੀ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਇਸ ਨੂੰ ਕਦੇ ਨਹੀਂ ਵੇਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਸੰਦ-ਪੱਟੀ ਸਕਰੀਨ ਹਾਸ਼ੀਏ 'ਚ ਸਮੇਟੀ ਜਾਵੇਗੀ।"
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "ਇਸ ਅੰਤਰਾਲ ਖਤਮ ਹੋਣ ਦੇ ਬਾਅਦ ਸੰਦ-ਪੱਟੀ ਨੂੰ ਓਹਲੇ ਕੀਤਾ ਜਾਵੇਗਾ। ਇਹ ਚੋਣ ਸਿਰਫ਼ ਤਾਂ ਹੀ ਠੀਕ ਹੈ, "
+#~ "ਜੇਕਰ \"ਹਮੇਸ਼ਾ ਵੇਖਾਓ\" ਦੀ ਚੋਣ ਕੀਤੀ ਹੈ। ਇਸ ਵਿਹਾਰ ਨੂੰ ਅਯੋਗ ਕਰਨ ਲਈ ਜ਼ੀਰੋ (0) ਬਣਾਓ।"
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਇੰਪੁੱਟ ਢੰਗ ਆਈਕਾਨ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਇੰਪੁੱਟ ਢੰਗ ਨਾਂ ਨੂੰ ਸੰਦ-ਪੱਟੀ 'ਚ ਚੁਣਿਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਸਟਿੱਕੀ ਆਈਕਾਨ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਮੇਨੂ ਆਈਕਾਨ ਨੂੰ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਸਹਾਇਤਾ ਆਈਕਾਨ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਇਆ ਜਾਦਾ ਹੈ।"
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਇੰਪੁੱਟ ਢੰਗ ਵਿਸ਼ੇਸ਼ਤਾ ਦਾ ਪਾਠ ਲੇਬਲ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਖੋਜ ਸਾਰਣੀ ਨੂੰ ਇੰਪੁੱਟ ਝਰੋਖੇ 'ਚ ਹੀ ਸ਼ਾਮਲ ਕੀਤਾ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਖੋਜ ਸਾਰਣੀ ਨੂੰ ਲੰਬਕਾਰੀ ਰੂਪ 'ਚ ਵਿਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਟਰੇ ਆਈਕਾਨ ਨੂੰ ਵੇਹੜੇ ਦੀ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਉ।"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਸੰਦ-ਪੱਟੀ, ਇੰਪੁੱਟ ਅਤੇ ਖੋਜ ਸਾਰਣੀ ਝਰੋਖੇ ਨੂੰ ਇਸ ਦੀ ਅਸਲੀ ਸਥਿਤੀ ਨਾਲ "
+#~ "ਹੀ ਜੋੜੀ ਰੱਖਿਆ ਜਾਵੇਗਾ।"
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr "ਇੰਪੁੱਟ ਅਤੇ ਖੋਜ ਸਾਰਣੀ ਝਰੋਖੇ ਵਿੱਚ ਫੋਂਟ ਸੈਟਿੰਗ ਵਰਤੀ ਜਾਵੇਗੀ।"
+
+#~ msgid "Select Interface Font"
+#~ msgstr "ਇੰਟਰਫੇਸ ਫੋਂਟ ਚੁਣੋ"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "ਮੁੱਖ-ਭਾਗ"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMEngine"
+
+#~ msgid "Panel"
+#~ msgstr "ਪੈਨਲ"
+
+#~ msgid "Extra"
+#~ msgstr "ਹੋਰ"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "SCIM ਇੰਪੁੱਟ ਢੰਗ ਸੈਟਅੱਪ"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">ਸਮਾਰਟ ਕਾਮਨ ਇੰਪੁੱਟ ਮੈਂਥਡ ਪਲੇਟਫਾਰਮ</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI ਸੈਟਅੱਪ ਸਹੂਲਤ</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">ਕਾਪੀਰਾਈਟ 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">%s ਮੈਡੀਊਲ ਲਈ ਸੈਟਅੱਪ ਹੈ।</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "ਕੀ ਤੁਸੀਂ SCIM ਸੈਟਅੱਪ ਨੂੰ ਬੰਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "ਸਭ ਸੰਰਚਨਾ ਨੂੰ ਯਕਦਮ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। ਨਵੀਂ ਸੰਰਚਨਾ ਨੂੰ ਪਰਭਾਵੀ ਹੋਣ ਲਈ SCIM ਨੂੰ ਮੁੜ-"
+#~ "ਚਾਲੂ ਕਰਨਾ ਨਾ ਭੁੱਲੋ।"
+
+#~ msgid "SCIM Setup"
+#~ msgstr "SCIM ਸੈਟਅੱਪ"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "GTK ਵਿਦਗਿਟ ਲਾਇਬਰੇਰੀ 'ਤੇ ਅਧਾਰਤ ਸੈਟਅੱਪ ਸਹੂਲਤ ਹੈ।"
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "ਸਮਾਰਟ ਕਾਮਨ ਇੰਪੁੱਟ ਮੈਂਥਸਡ ਪਲੇਟਫਾਰਮ ਲਈ ਸੈਟਅੱਪ ਸਹੂਲਤ"
+
+#~ msgid "SCIM Help"
+#~ msgstr "SCIM ਸਹਾਇਤਾ"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "ਸਮਾਰਟ ਕਾਮਨ ਇੰਪੁੱਟ ਮੈਂਥਡ"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "ਇੰਪੁੱਟ ਝਰੋਖਾ ਅਤੇ ਸੰਦ-ਪੱਟੀ ਸਟਿੱਕੀ/ਨਾ-ਸਟਿੱਕੀ ਹੈ।"
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "SCIM ਅਤੇ ਮੌਜੂਦਾ ਇੰਪੁੱਟ ਢੰਗ ਬਾਰੇ ਸੰਖੇਪ ਸਹਾਇਤਾ ਵਿਖਾਓ।"
+
+#~ msgid "Show command menu."
+#~ msgstr "ਕਮਾਂਡ ਮੇਨ ਵੇਖਾਓ।"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "ਸੰਰਚਨਾ ਮੁੜ-ਲੋਡ"
+
+#~ msgid "Stick Windows"
+#~ msgstr "ਸਟਿੱਕੀ ਝਰੋਖੇ"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "ਸੰਦ-ਪੱਟੀ ਓਹਲੇ"
+
+#~ msgid "Help ..."
+#~ msgstr "ਸਹਾਇਤਾ ..."
+
+#~ msgid "Exit"
+#~ msgstr "ਬਾਹਰ"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "En"
--- /dev/null
+# Swedish translation for scim
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the scim package.
+# <>, 2006.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: scim\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 20:17+0900\n"
+"PO-Revision-Date: 2006-09-09 21:37+0200\n"
+"Last-Translator: <>\n"
+"Language-Team: Swedish <sv@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "Tangentval"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Option"
+msgstr "Alternativ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "Tyska"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "Latinsk teckeninmatning"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Tangentval"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "Tangentval"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "Latinsk teckeninmatning"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "Alternativ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "Latinsk teckeninmatning"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "Latinsk teckeninmatning"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "Engelska (amerikansk)"
+
+#~ msgid "Amharic"
+#~ msgstr "Amhariska"
+
+#~ msgid "Arabic"
+#~ msgstr "Arabiska"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "Arabiska (Egypten)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "Arabiska (Libanon)"
+
+#~ msgid "Assamese"
+#~ msgstr "Assamesiska"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "Azerbajdzjanska"
+
+#~ msgid "Belarusian"
+#~ msgstr "Vitryska"
+
+#~ msgid "Bulgarian"
+#~ msgstr "Bulgariska"
+
+#~ msgid "Bengali"
+#~ msgstr "Bengali"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "Bengali (Indien)"
+
+#~ msgid "Tibetan"
+#~ msgstr "Tibetanska"
+
+#~ msgid "Bosnian"
+#~ msgstr "Bosniska"
+
+#~ msgid "Catalan"
+#~ msgstr "Katalanska"
+
+#~ msgid "Czech"
+#~ msgstr "Tjeckiska"
+
+#~ msgid "Welsh"
+#~ msgstr "Kymriska"
+
+#~ msgid "Danish"
+#~ msgstr "Danska"
+
+#~ msgid "German"
+#~ msgstr "Tyska"
+
+#~ msgid "Greek"
+#~ msgstr "Grekiska"
+
+#~ msgid "English"
+#~ msgstr "Engelska"
+
+#~ msgid "English (Australian)"
+#~ msgstr "Engelska (australiensisk)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "Engelska (kanadensisk)"
+
+#~ msgid "English (British)"
+#~ msgstr "Engelska (brittisk)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "Engelska (irländsk)"
+
+#~ msgid "English (American)"
+#~ msgstr "Engelska (amerikansk)"
+
+#~ msgid "Spanish"
+#~ msgstr "Spanska"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "Spanska (Mexiko)"
+
+#~ msgid "Estonian"
+#~ msgstr "Estniska"
+
+#~ msgid "Basque"
+#~ msgstr "Baskiska"
+
+#~ msgid "Persian"
+#~ msgstr "Persiska"
+
+#~ msgid "Finnish"
+#~ msgstr "Finska"
+
+#~ msgid "French"
+#~ msgstr "Franska"
+
+#~ msgid "Irish"
+#~ msgstr "Irländska"
+
+#~ msgid "Galician"
+#~ msgstr "Galiciska"
+
+#~ msgid "Gujarati"
+#~ msgstr "Gujarati"
+
+#~ msgid "Hebrew"
+#~ msgstr "Hebreiska"
+
+#~ msgid "Hindi"
+#~ msgstr "Hindi"
+
+#~ msgid "Croatian"
+#~ msgstr "Kroatiska"
+
+#~ msgid "Hungarian"
+#~ msgstr "Ungerska"
+
+#, fuzzy
+#~ msgid "Armenian"
+#~ msgstr "Rumänska"
+
+#~ msgid "Interlingua"
+#~ msgstr "Interlingua"
+
+#~ msgid "Indonesian"
+#~ msgstr "Indonesiska"
+
+#~ msgid "Icelandic"
+#~ msgstr "Isländska"
+
+#~ msgid "Italian"
+#~ msgstr "Italienska"
+
+#~ msgid "Japanese"
+#~ msgstr "Japanska"
+
+#, fuzzy
+#~ msgid "Georgian"
+#~ msgstr "Tyska"
+
+#~ msgid "Kazakh"
+#~ msgstr "Kazakisk"
+
+#~ msgid "Cambodian"
+#~ msgstr "Kambodjanska"
+
+#~ msgid "Kannada"
+#~ msgstr "Kannada"
+
+#~ msgid "Korean"
+#~ msgstr "Koreanska"
+
+#~ msgid "Laothian"
+#~ msgstr "Laotiska"
+
+#~ msgid "Lithuanian"
+#~ msgstr "Litauiska"
+
+#~ msgid "Latvian"
+#~ msgstr "Lettiska"
+
+#~ msgid "Macedonian"
+#~ msgstr "Makedonska"
+
+#~ msgid "Malayalam"
+#~ msgstr "Malayalam"
+
+#~ msgid "Mongolian"
+#~ msgstr "Mongolska"
+
+#~ msgid "Marathi"
+#~ msgstr "Marathi"
+
+#~ msgid "Malay"
+#~ msgstr "Malay"
+
+#~ msgid "Nepali"
+#~ msgstr "Nepali (Khaskura)"
+
+#~ msgid "Dutch"
+#~ msgstr "Holländska"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "Norska (nynorsk)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "Norska (bokmål)"
+
+#~ msgid "Oriya"
+#~ msgstr "Oriya"
+
+#~ msgid "Punjabi"
+#~ msgstr "Punjabi"
+
+#~ msgid "Polish"
+#~ msgstr "Polska"
+
+#~ msgid "Portuguese"
+#~ msgstr "Portugisiska"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "Portugisiska (Brasilien)"
+
+#~ msgid "Romanian"
+#~ msgstr "Rumänska"
+
+#~ msgid "Russian"
+#~ msgstr "Ryska"
+
+#~ msgid "Slovak"
+#~ msgstr "Slovakiska"
+
+#~ msgid "Slovenian"
+#~ msgstr "Slovenska"
+
+#~ msgid "Albanian"
+#~ msgstr "Albanska"
+
+#~ msgid "Serbian"
+#~ msgstr "Serbiska"
+
+#~ msgid "Swedish"
+#~ msgstr "Svenska"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "Svenska (Finland)"
+
+#~ msgid "Tamil"
+#~ msgstr "Tamil"
+
+#~ msgid "Telugu"
+#~ msgstr "Telagu"
+
+#~ msgid "Thai"
+#~ msgstr "Thai"
+
+#~ msgid "Turkish"
+#~ msgstr "Turkiska"
+
+#~ msgid "Uighur"
+#~ msgstr "Uiguriska"
+
+#~ msgid "Ukrainian"
+#~ msgstr "Ukrainska"
+
+#~ msgid "Urdu"
+#~ msgstr "Urdu"
+
+#~ msgid "Uzbek"
+#~ msgstr "Uzbekiska"
+
+#~ msgid "Vietnamese"
+#~ msgstr "Vietnamesiska"
+
+#~ msgid "Walloon"
+#~ msgstr "Vallonska"
+
+#~ msgid "Yiddish"
+#~ msgstr "Jiddish"
+
+#~ msgid "Chinese"
+#~ msgstr "Kinesiska"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "Kinesiska (förenklad)"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "Kinesiska (traditionell)"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "Belgisk"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "Engelsk (US)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "Engelska (kanadensisk)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "Engelska (irländsk)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "Engelska (brittisk)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "Engelska (amerikansk)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "Engelska (kanadensisk)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "Engelska (brittisk)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "Engelska (brittisk)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "Engelska (kanadensisk)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "Engelska (brittisk)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "Fransk (kanadensisk)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "Fransk (kanadensisk)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "Fransk (kanadensisk)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "Tysk (Schweizisk)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "Fransk (kanadensisk)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "Tysk (med 'Tottaste')"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "Tysk (Schweizisk)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "Engelska (australiensisk)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "Tysk (Schweizisk)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "Tysk (Schweizisk)"
+
+#, fuzzy
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "Portugisiska (Brasilien)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "Portugisiska (Brasilien)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "Spansk (Latinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "Spansk (Latinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "Spansk (Latinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "Spansk (Latinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "Spansk (Latinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "Spansk (CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "Malayalam"
+
+#~ msgid "Norwegian"
+#~ msgstr "Norsk"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "Serbiska"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "Kinesiska (traditionell)"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "Kinesiska (traditionell)"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "Kinesiska (traditionell)"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "Kinesiska"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "Kinesiska (förenklad)"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "Arabiska (Egypten)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "Arabiska (Egypten)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "Arabiska (Egypten)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "Arabiska (Egypten)"
+
+#~ msgid "Other"
+#~ msgstr "Annat"
+
+#~ msgid "Unknown"
+#~ msgstr "Okänd"
+
+#~ msgid "English (US)"
+#~ msgstr "Engelsk (US)"
+
+#~ msgid "Belgian"
+#~ msgstr "Belgisk"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "Tjeckisk (qwerty)"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "Fransk (schweizisk)"
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "Tysk (med 'Tottaste')"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "Portugisisk (Brazilien, am. diakriter)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "Slovakisk (qwerty)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "Spansk (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "Spansk (Latinamerika)"
+
+#~ msgid "English (UK)"
+#~ msgstr "Engelsk (UK)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "Omvandling förenklad/traditionell kinesiska"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "Omvandla förenklad kinesiska till traditionell och vice versa"
+
+#~ msgid "SC-TC"
+#~ msgstr "SC-TC"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "Omvandling förenklad/traditionell kinesiska"
+
+#~ msgid "No Conversion"
+#~ msgstr "Ingen omvandling"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "Förenklad till traditionell"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "Omvandla förenklad kinesiska till traditionell"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "Traditionell till förenklad"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "Omvandla traditionell kinesiska till förenklad"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "SC->TC"
+
+#~ msgid "TC->SC"
+#~ msgstr "TC->SC"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "Scim-plattformen (Smart Common Input Method)"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "Aktivera"
+
+#~ msgid "Name"
+#~ msgstr "Namn"
+
+#~ msgid "Cursor Position"
+#~ msgstr "Markörens position"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "Markörens läge i texten, räknat i tecken."
+
+#~ msgid "Maximum length"
+#~ msgstr "Maxlängd"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr ""
+#~ "Högsta antal tecken att visa i den här teckenraden. Välj 0 för att inte "
+#~ "begränsa längden."
+
+#~ msgid "Maximum width"
+#~ msgstr "Maxbredd"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "Maximal bredd för att visa den här teckenraden."
+
+#~ msgid "Has Frame"
+#~ msgstr "Med ram"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "Om FALSK tas ytterkanten bort från strängvyn."
+
+#~ msgid "Draw cursor"
+#~ msgstr "Visa markör"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "Om SANT använd blinkande markör."
+
+#~ msgid "Auto move cursor"
+#~ msgstr "Flytta markören automatiskt"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr "Flytta markören automatiskt vid musklick."
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "Direktmata tangenter"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr "Skicka tangentnedtryckningar till användarprogrammet."
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "Anpassa storleken automatiskt till teckenraden."
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "Storleken anpassas automatiskt."
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr "Flytta markören automatiskt vid musklick."
+
+#~ msgid "Width in chars"
+#~ msgstr "Bredd (antal tecken)"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr "Antal tecken att göra rum för i teckenraden."
+
+#~ msgid "Scroll offset"
+#~ msgstr "Mjuk rullning"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr "Antal pixlar i teckenraden som rullat över vänsterkanten på skärmen"
+
+#~ msgid "Text"
+#~ msgstr "Text"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "Innehållet i teckenraden"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "Valda _kortkommandon:"
+
+#~ msgid "Key Code:"
+#~ msgstr "Tangentkod:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "Specialtangenter:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Ctrl"
+
+#~ msgid "A_lt"
+#~ msgstr "A_lt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Shift"
+
+#~ msgid "_Release"
+#~ msgstr "_Release"
+
+#~ msgid "_Meta"
+#~ msgstr "_Meta"
+
+#~ msgid "S_uper"
+#~ msgstr "S_uper"
+
+#~ msgid "_Hyper"
+#~ msgstr "_Hyper"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "Ange tangentkod först."
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "Tryck på en tangent eller på en tangentkombination.\n"
+#~ "Den här rutan försvinner när du släpper tangenten."
+
+#~ msgid "Grabbing a key."
+#~ msgstr "Plockar tangent"
+
+#~ msgid "Key Selection"
+#~ msgstr "Tangentval"
+
+#~ msgid "Orientation"
+#~ msgstr "Riktning"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "Panelens riktning."
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "Text"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amhariska"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Alltid"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Alternativ"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Latinsk teckeninmatning"
+
+#~ msgid "English/European"
+#~ msgstr "Västerländsk"
+
+#~ msgid "RAW CODE"
+#~ msgstr "TANGENTKOD"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Snabbtangenter:\n"
+#~ "\n"
+#~ " Ctrl+u:\n"
+#~ " Växla mellan multibytekodning and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " återställ inmatningsmetod.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "Aktuell inmatningsmetod. Klicka för att ändra."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Allmänna inställningar"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Allmänna inställningar som gäller alla användargränssnitt, t.ex. X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+
+#~ msgid "_Trigger:"
+#~ msgstr "Ak_tiveringstangent"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Välj aktiveringstangenter"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som öppnar och stänger SCIM-inmatningen. Klicka "
+#~ "påknappen till höger för att ändra."
+
+#~ msgid "Turn _On:"
+#~ msgstr "Slå på (_o):"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Välj på-kommando"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som öppnar SCIM-inmatningen. Klicka påknappen till "
+#~ "höger för att ändra."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "Stäng av (_f):"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Välj på-kommando"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som stänger SCIM-inmatningen. Klicka påknappen till "
+#~ "höger för att ändra."
+
+#~ msgid "_Next input method:"
+#~ msgstr "_Nästa inmatningsmetod:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "Välj kommando för att hoppa till nästa"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som växlar till nästa inmatningsmetod. Klicka "
+#~ "påknappen till höger för att ändra."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "Föregående inmatningsmetod (_p):"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Välj kommando för att hoppa till föregående"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som växlar till föregående inmatningsmetod. Klicka "
+#~ "påknappen till höger för att ändra."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "Visa _meny med inmatningsmetoder:"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "Välj kommando för att visa menyn med inmatningsmetoder"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som visar menyn med inmatningsmetoder. Klicka "
+#~ "påknappen till höger för att ändra."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "Tangentbordslayout (_k):"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Här väljer du vilket slags tangentbord du har. Det är nödvändigt föratt "
+#~ "vissa inmatningsmetoder skall fungera."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "Visa okonverterad_e latinska tecken i ditt arbetsfönster."
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Med det här alternativet förbockat kommer de latinska bokstäver du "
+#~ "skriveratt visas direkt i fönstret du arbetar i. Annars visas de i ett "
+#~ "popup-fönster."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "Använd _samma inmatningsmetod i alla program"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Med det här alternativet förbockat kommer bara en inmatningsmetod att "
+#~ "användasi taget. Annars kan varje program använda olika metoder."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Kortkommandon"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Slå av och på inmatningsmetoder och ange kortkommandon för olika "
+#~ "inmatningsmetoder här."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Installerade inmatningsmetoder:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "Redigera kortkommandon (_h)"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "Välj kortkommandon för vald inmatningsmetod."
+
+#~ msgid "Select _Filters"
+#~ msgstr "Välj _filter"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "Välj filter att använda till den här inmatningsmetoden."
+
+#~ msgid "_Expand"
+#~ msgstr "Visa allt (_e)"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Visa alla inmatningsmetoder"
+
+#~ msgid "_Collapse"
+#~ msgstr "Göm allt (_c)"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Göm alla inmatningsmetoder."
+
+#~ msgid "E_nable All"
+#~ msgstr "Markera alla (_n)"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Gör alla inmatningsmetoder tillgängliga för användning."
+
+#~ msgid "_Disable All"
+#~ msgstr "Avmarkera alla (_d)"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Gör alla inmatningsmetoder otillgängliga för användning."
+
+#~ msgid "Filters"
+#~ msgstr "Filter"
+
+#~ msgid "Languages"
+#~ msgstr "Språk"
+
+#~ msgid "Description"
+#~ msgstr "Beskrivning"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Välj kortkommando för %s"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Välj filter för %s"
+
+#~ msgid "Move _Up"
+#~ msgstr "Flytta _uppåt"
+
+#~ msgid "Move _Down"
+#~ msgstr "Flytta ne_dåt"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "Paneldemon byggd på GTK+-2.x-biblioteket."
+
+#~ msgid "On demand"
+#~ msgstr "På begäran"
+
+#~ msgid "Never"
+#~ msgstr "Aldrig"
+
+#~ msgid "ToolBar"
+#~ msgstr "Verktygsfält"
+
+#~ msgid "_Show:"
+#~ msgstr "Vi_sa"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Fäst vid skärmka_nt"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Visa ikon för aktuell inmatningsmetod"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "Visa namn på akt_uell inmatningsmetod"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "Time_out för att dölja:"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Vi_sa fixeringsikonen"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Visa m_enyikonen"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Visa _hjälpikonen"
+
+#~ msgid "Show _property label"
+#~ msgstr "Visa inmatningsalternativ"
+
+#~ msgid "Input window"
+#~ msgstr "Inmatningsfönster"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "Infälld teckenväljare (_m)"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "_Vertikal teckenväljare"
+
+#~ msgid "Misc"
+#~ msgstr "Diverse"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Visa ikon i s_ystempanelen"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Fäst fönster (_w)"
+
+#~ msgid "_Font:"
+#~ msgstr "Typsnitt (_f)"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Välj \"Alltid\" för att ständigt visa verktygsfältet på skärmen. Välj\"På "
+#~ "begäran\" för att bara visa verktygsfältet när Scim är aktivt.Välj \"Never"
+#~ "\" för att aldrig visa verktygsfältet."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Med det här alternativet förbockat är verktygsfältet alltid fäst mot "
+#~ "skärmkanten."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "Verktygsfältet döljs efter så här lång tid. Den här inställningen används "
+#~ "baranär du har valt \"Alltid\" i menyn till vänster. Välj 0 för att "
+#~ "aldrig döljaverktygsfältet."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas alltid ikonen för "
+#~ "aktuellinmatningsmetod i verktygsfältet."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas alltid namnet på "
+#~ "aktuellinmatningsmetod i verktygsfältet."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas häftstiftsikonen i "
+#~ "verktygsfältet"
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas menyikonen i verktygsfältet"
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas hjälpikonen i verktygsfältet."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas en textlapp med "
+#~ "inmatningsalternativi verktygsfältet"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas teckenväljaren infälld "
+#~ "iinmatningsfönstret."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat används en vertikal teckenväljare."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat visas panelikonen i "
+#~ "skrivbordetssystempanel."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat fixeras verktygsfält, "
+#~ "inmatningsfönsteroch teckenväljare på en given plats."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "Det typsnitt som kommer att användas i inmatnings- och teckenväljarfönster"
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Välj typsnitt för användargränssnittet"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "FrontEnd"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMEngine"
+
+#~ msgid "Panel"
+#~ msgstr "Panel"
+
+#~ msgid "Extra"
+#~ msgstr "Extra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Inställningar för Scim"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Scim-plattformen (Smart Common Input Method)</"
+#~ "span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Grafiskt inställningsverktyg</"
+#~ "span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Inställningar för %s-moduler.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Vill du avsluta inställningsverktyget för Scim?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Många inställningar kräver att du startar om Scim innan du fortsätter,för "
+#~ "att de skall börja verka."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Inställningar för Scim"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "Inställningsverktyg byggt på GTK Widget-biblioteket."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr ""
+#~ "Inställningsverktyg för Scim-plattformen (Smart Common Input Method)"
+
+#~ msgid "SCIM Help"
+#~ msgstr "Om Scim"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Scim (Smart Common Input Method)"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Fixera/lossa inmatningsfönstret och verktygsfältet"
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "Kortfattad information om Scim och om aktuell inmatningsmetod."
+
+#~ msgid "Show command menu."
+#~ msgstr "Visa kommandomenyn."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Återhämta inställningar"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Fixera fönster"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Dölj verktygsfältet"
+
+#~ msgid "Help ..."
+#~ msgstr "Hjälp ..."
+
+#~ msgid "Exit"
+#~ msgstr "Avsluta"
--- /dev/null
+#!/bin/sh
+
+PACKAGE=isfsetting-efl
+SRCROOT=../..
+POTFILES=POTFILES.in
+
+#ALL_LINGUAS= am az be ca cs da de el en_CA en_GB es et fi fr hr hu it ja ko lv mk ml ms nb ne nl pa pl pt pt_BR ru rw sk sl sr sr@Latn sv ta tr uk vi zh_CN zh_TW
+ALL_LINGUAS="en_US en_GB ja ko zh_CN cs de fi fr it nl pa sv zh_TW"
+
+XGETTEXT=/usr/bin/xgettext
+MSGMERGE=/usr/bin/msgmerge
+
+echo -n "Make ${PACKAGE}.pot "
+if [ ! -e $POTFILES ] ; then
+ echo "$POTFILES not found"
+ exit 1
+fi
+
+$XGETTEXT --default-domain=${PACKAGE} --directory=${SRCROOT} \
+ --add-comments --keyword=_ --keyword=_T --files-from=$POTFILES \
+&& test ! -f ${PACKAGE}.po \
+ || (rm -f ${PACKAGE}.pot && mv ${PACKAGE}.po ${PACKAGE}.pot)
+
+if [ $? -ne 0 ]; then
+ echo "error"
+ exit 1
+else
+ echo "done"
+fi
+
+for LANG in $ALL_LINGUAS; do
+ echo "$LANG : "
+
+ if [ ! -e $LANG.po ] ; then
+ cp ${PACKAGE}.pot ${LANG}.po
+ echo "${LANG}.po created"
+ else
+ if $MSGMERGE ${LANG}.po ${PACKAGE}.pot -o ${LANG}.new.po ; then
+ if cmp ${LANG}.po ${LANG}.new.po > /dev/null 2>&1; then
+ rm -f ${LANG}.new.po
+ else
+ if mv -f ${LANG}.new.po ${LANG}.po; then
+ echo ""
+ else
+ echo "msgmerge for $LANG.po failed: cannot move $LANG.new.po to $LANG.po" 1>&2
+ rm -f ${LANG}.new.po
+ exit 1
+ fi
+ fi
+ else
+ echo "msgmerge for $LANG failed!"
+ rm -f ${LANG}.new.po
+ fi
+ fi
+ echo ""
+done
+
--- /dev/null
+# translation of zh_CN.po to Simplified Chinese
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: zh_CN\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-25 17:13+0900\n"
+"PO-Revision-Date: 2011-01-01 14:57+0800\n"
+"Last-Translator: Haifeng Deng <haifeng.deng@samsung.com>\n"
+"Language-Team: Simplified Chinese <zh@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.3.1\n"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:428
+#: ism/extras/efl_setting/isf_setting_efl.cpp:723
+msgid "Set"
+msgstr "设定"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:439
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:732
+msgid "Selection"
+msgstr "键盘选择"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:646
+#: ism/extras/efl_setting/isf_setting_efl.cpp:840
+msgid "Options"
+msgstr "选项"
+
+msgid "No option"
+msgstr "无选项"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:962
+msgid "Auto capitalization"
+msgstr "首字母大写"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:962
+msgid "Auto period"
+msgstr "自动空格"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:972
+msgid "General"
+msgstr "通用"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1007
+msgid "Software keyboard"
+msgstr "软键盘"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1013
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1088
+msgid "Keyboard selection"
+msgstr "键盘选择"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1025
+msgid "Keyboard option"
+msgstr "键盘选项"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1061
+msgid "Hardware keyboard"
+msgstr "硬键盘"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1074
+msgid "option"
+msgstr "选项"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1119
+msgid "Back"
+msgstr "返回"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1127
+msgid "Keyboard"
+msgstr "键盘"
--- /dev/null
+# translation of zh_HK.po to Chinese (Hongkong)
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ISF 2.2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-01 20:17+0900\n"
+"PO-Revision-Date: 2011-01-01 22:41+0800\n"
+"Last-Translator: Haifeng Deng <haifeng.deng@samsung.com>\n"
+"Language-Team: scim@freedesktop.org\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr "設定"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+msgid "Selection"
+msgstr "鍵盤選擇"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+msgid "Options"
+msgstr "選項"
+
+msgid "No option"
+msgstr "無選項"
+
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr "首字母大寫"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr "自動空格"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+msgid "General"
+msgstr "通用"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+msgid "Software keyboard"
+msgstr "軟鍵盤"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+msgid "Keyboard selection"
+msgstr "鍵盤選擇"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+msgid "Keyboard option"
+msgstr "鍵盤選項"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+msgid "Hardware keyboard"
+msgstr "硬鍵盤"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+msgid "option"
+msgstr "選項"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr "返回"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+msgid "Keyboard"
+msgstr "鍵盤"
--- /dev/null
+# translation of zh_TW.po to Chinese (Taiwan)
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ISF 2.2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 20:17+0900\n"
+"PO-Revision-Date: 2011-01-01 22:41+0800\n"
+"Last-Translator: Haifeng Deng <haifeng.deng@samsung.com>\n"
+"Language-Team: scim@freedesktop.org\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr "設定"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+msgid "Selection"
+msgstr "鍵盤選擇"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+msgid "Options"
+msgstr "選項"
+
+msgid "No option"
+msgstr "無選項"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr "首字母大寫"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr "自動空格"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+msgid "General"
+msgstr "通用"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+msgid "Software keyboard"
+msgstr "軟鍵盤"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+msgid "Keyboard selection"
+msgstr "鍵盤選擇"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+msgid "Keyboard option"
+msgstr "鍵盤選項"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+msgid "Hardware keyboard"
+msgstr "硬鍵盤"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+msgid "option"
+msgstr "選項"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr "返回"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+msgid "Keyboard"
+msgstr "鍵盤"
--- /dev/null
+# Makefile for program source directory in GNU NLS utilities package.
+# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+#
+# This file file be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU Public License
+# but which still want to provide support for the GNU gettext functionality.
+# Please note that the actual code is *not* freely available.
+#
+# - Modified by Owen Taylor <otaylor@redhat.com> to use GETTEXT_PACKAGE
+# instead of PACKAGE and to look for po2tbl in ./ not in intl/
+#
+# - Modified by jacob berkman <jacob@ximian.com> to install
+# Makefile.in.in and po2tbl.sed.in for use with glib-gettextize
+
+GETTEXT_PACKAGE = keyboard-setting-wizard-efl
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = @top_builddir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datadir = /opt/ug/res
+libdir = @libdir@
+localedir = $(libdir)/locale
+gnulocaledir = $(datadir)/locale
+gettextsrcdir = $(datadir)/glib-2.0/gettext/po
+subdir = po
+install_sh = @install_sh@
+mkdir_p = @mkdir_p@
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+CC = @CC@
+GENCAT = @GENCAT@
+GMSGFMT = @GMSGFMT@
+MSGFMT = @MSGFMT@
+XGETTEXT = @XGETTEXT@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+MSGMERGE = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist
+GENPOT = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot
+
+DEFS = @DEFS@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+
+INCLUDES = -I.. -I$(top_srcdir)/intl
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+SOURCES =
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+DISTFILES = $(srcdir)/ChangeLog $(srcdir)/Makefile.in.in $(srcdir)/POTFILES.in \
+$(POFILES) $(GMOFILES) $(SOURCES)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+INSTOBJEXT = @INSTOBJEXT@
+
+.SUFFIXES:
+.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat
+
+.c.o:
+ $(COMPILE) $<
+
+.po.pox:
+ $(MAKE) $(GETTEXT_PACKAGE).pot
+ $(MSGMERGE) $< $(top_builddir)/po/$(GETTEXT_PACKAGE).pot -o $*pox
+
+.po.mo:
+ $(MSGFMT) -o $@ $<
+
+.po.gmo:
+ file=`echo $* | sed 's,.*/,,'`.gmo \
+ && rm -f $$file && $(GMSGFMT) -o $$file $<
+
+.po.cat:
+ sed -f ../intl/po2msg.sed < $< > $*.msg \
+ && rm -f $@ && $(GENCAT) $@ $*.msg
+
+
+all: all-@USE_NLS@
+
+all-yes: $(CATALOGS)
+all-no:
+
+$(GETTEXT_PACKAGE).pot: $(POTFILES)
+ $(GENPOT)
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+install-data-no: all
+install-data-yes: all
+ if test -n "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $(DESTDIR)$(datadir); \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(datadir); \
+ fi
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ case "$$cat" in \
+ *.gmo) destdir=$(gnulocaledir);; \
+ *) destdir=$(localedir);; \
+ esac; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ dir=$(DESTDIR)$$destdir/$$lang/LC_MESSAGES; \
+ if test -n "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $$dir; \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $$dir; \
+ fi; \
+ if test -r $$cat; then \
+ $(INSTALL_DATA) $$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \
+ echo "installing $$cat as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \
+ else \
+ $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \
+ echo "installing $(srcdir)/$$cat as" \
+ "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \
+ fi; \
+ if test -r $$cat.m; then \
+ $(INSTALL_DATA) $$cat.m $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \
+ echo "installing $$cat.m as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \
+ else \
+ if test -r $(srcdir)/$$cat.m ; then \
+ $(INSTALL_DATA) $(srcdir)/$$cat.m \
+ $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \
+ echo "installing $(srcdir)/$$cat as" \
+ "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \
+ else \
+ true; \
+ fi; \
+ fi; \
+ done
+ if test "$(PACKAGE)" = "glib"; then \
+ if test -n "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $(DESTDIR)$(gettextsrcdir); \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(gettextsrcdir); \
+ fi; \
+ $(INSTALL_DATA) $(srcdir)/Makefile.in.in \
+ $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \
+ else \
+ : ; \
+ fi
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall:
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \
+ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \
+ rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \
+ rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \
+ done
+ if test "$(PACKAGE)" = "glib"; then \
+ rm -f $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \
+ fi
+
+check: all
+
+dvi info tags TAGS ID:
+
+mostlyclean:
+ rm -f core core.* *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp
+ rm -fr *.o *.gmo
+ rm -f .intltool-merge-cache
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ rm -f $(GMOFILES)
+
+distdir = ../$(GETTEXT_PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: $(DISTFILES) $(GETTEXT_PACKAGE).pot
+ dists="$(DISTFILES)"; \
+ for file in $$dists; do \
+ ln $$file $(distdir) 2> /dev/null \
+ || cp -p $$file $(distdir); \
+ done
+
+update-po: Makefile
+ $(MAKE) $(GETTEXT_PACKAGE).pot
+ tmpdir=`pwd`; \
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ echo "$$lang:"; \
+ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \
+ if $$result; then \
+ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+ rm -f $$tmpdir/$$lang.new.po; \
+ else \
+ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+ :; \
+ else \
+ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ exit 1; \
+ fi; \
+ fi; \
+ else \
+ echo "msgmerge for $$cat failed!"; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ fi; \
+ done
+
+# POTFILES is created from POTFILES.in by stripping comments, empty lines
+# and Intltool tags (enclosed in square brackets), and appending a full
+# relative path to them
+POTFILES: POTFILES.in
+ ( if test 'x$(srcdir)' != 'x.'; then \
+ posrcprefix='$(top_srcdir)/'; \
+ else \
+ posrcprefix="../"; \
+ fi; \
+ rm -f $@-t $@ \
+ && (sed -e '/^#/d' \
+ -e "s/^\[.*\] +//" \
+ -e '/^[ ]*$$/d' \
+ -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \
+ | sed -e '$$s/\\$$//') > $@-t \
+ && chmod a-w $@-t \
+ && mv $@-t $@ )
+
+Makefile: Makefile.in.in ../../config.status POTFILES
+ cd ../.. \
+ && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \
+ $(SHELL) ./config.status
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+ism/extras/efl_setting/scim_setup_module_efl.cpp
+ism/extras/efl_setting/isf_setting_wizard.cpp
--- /dev/null
+# translation of cs.po to Czech
+# translation of cs.po to cs_CZ
+# translation of scim.po to cs_CZ
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Klara Cihlarova <koty@seznam.cz>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: cs\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 18:51+0900\n"
+"PO-Revision-Date: 2005-12-11 19:55+0100\n"
+"Last-Translator: Klara Cihlarova <koty@seznam.cz>\n"
+"Language-Team: Czech <suse@suse.cz>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.10.2\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Výběr kláves"
+
+#, fuzzy
+#~ msgid "Selection"
+#~ msgstr "Výběr kláves"
+
+#, fuzzy
+#~ msgid "Option"
+#~ msgstr "Volby"
+
+#, fuzzy
+#~ msgid "General"
+#~ msgstr "Němčina"
+
+#, fuzzy
+#~ msgid "S/W keyboard"
+#~ msgstr "Angličtina/klávesnice"
+
+#, fuzzy
+#~ msgid "Keyboard option"
+#~ msgstr "Výběr kláves"
+
+#, fuzzy
+#~ msgid "H/W keyboard"
+#~ msgstr "Angličtina/klávesnice"
+
+#, fuzzy
+#~ msgid "option"
+#~ msgstr "Volby"
+
+#, fuzzy
+#~ msgid "Keyboard"
+#~ msgstr "Angličtina/klávesnice"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "Angličtina/klávesnice"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "Angličtina (americká)"
+
+#~ msgid "Amharic"
+#~ msgstr "Amharština"
+
+#~ msgid "Arabic"
+#~ msgstr "Arabština"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "Arabština (egyptská)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "Arabština (libanonská)"
+
+#~ msgid "Assamese"
+#~ msgstr "Ásámština"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "Azerbajdžánština"
+
+#~ msgid "Belarusian"
+#~ msgstr "Běloruština"
+
+#~ msgid "Bulgarian"
+#~ msgstr "Bulharština"
+
+#~ msgid "Bengali"
+#~ msgstr "Bengálština"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "Bengálština (indická)"
+
+#~ msgid "Tibetan"
+#~ msgstr "Tibetština"
+
+#~ msgid "Bosnian"
+#~ msgstr "Bosenština"
+
+#~ msgid "Catalan"
+#~ msgstr "Katalánština"
+
+#~ msgid "Czech"
+#~ msgstr "Čeština"
+
+#~ msgid "Welsh"
+#~ msgstr "Welština"
+
+#~ msgid "Danish"
+#~ msgstr "Dánština"
+
+#~ msgid "German"
+#~ msgstr "Němčina"
+
+#~ msgid "Greek"
+#~ msgstr "Řečtina"
+
+#~ msgid "English"
+#~ msgstr "Angličtina"
+
+#~ msgid "English (Australian)"
+#~ msgstr "Angličtina (australská)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "Angličtina (kanadská)"
+
+#~ msgid "English (British)"
+#~ msgstr "Angličtina (britská)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "Angličtina (irská)"
+
+#~ msgid "English (American)"
+#~ msgstr "Angličtina (americká)"
+
+#~ msgid "Spanish"
+#~ msgstr "Španělština"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "Španělština (mexická)"
+
+#~ msgid "Estonian"
+#~ msgstr "Estonština"
+
+#~ msgid "Basque"
+#~ msgstr "Baskičtina"
+
+#~ msgid "Persian"
+#~ msgstr "Perština"
+
+#~ msgid "Finnish"
+#~ msgstr "Finština"
+
+#~ msgid "French"
+#~ msgstr "Francouzština"
+
+#~ msgid "Irish"
+#~ msgstr "Irština"
+
+#~ msgid "Galician"
+#~ msgstr "Galština"
+
+#~ msgid "Gujarati"
+#~ msgstr "Gudžarádština"
+
+#~ msgid "Hebrew"
+#~ msgstr "Hebrejština"
+
+#~ msgid "Hindi"
+#~ msgstr "Hindština"
+
+#~ msgid "Croatian"
+#~ msgstr "Chorvatština"
+
+#~ msgid "Hungarian"
+#~ msgstr "Maďarština"
+
+#, fuzzy
+#~ msgid "Armenian"
+#~ msgstr "Rumunština"
+
+#~ msgid "Interlingua"
+#~ msgstr "Interlingua"
+
+#~ msgid "Indonesian"
+#~ msgstr "Indonézština"
+
+#~ msgid "Icelandic"
+#~ msgstr "Islandština"
+
+#~ msgid "Italian"
+#~ msgstr "Italština"
+
+#~ msgid "Japanese"
+#~ msgstr "Japonština"
+
+#, fuzzy
+#~ msgid "Georgian"
+#~ msgstr "Němčina"
+
+#~ msgid "Kazakh"
+#~ msgstr "Kazaština"
+
+#~ msgid "Cambodian"
+#~ msgstr "Khmerština"
+
+#~ msgid "Kannada"
+#~ msgstr "Kannadština"
+
+#~ msgid "Korean"
+#~ msgstr "Korejština"
+
+#~ msgid "Laothian"
+#~ msgstr "Laoština"
+
+#~ msgid "Lithuanian"
+#~ msgstr "Litevština"
+
+#~ msgid "Latvian"
+#~ msgstr "Lotyšština"
+
+#~ msgid "Macedonian"
+#~ msgstr "Makedonština"
+
+#~ msgid "Malayalam"
+#~ msgstr "Malajámština"
+
+#~ msgid "Mongolian"
+#~ msgstr "Mongolština"
+
+#~ msgid "Marathi"
+#~ msgstr "Maráthština"
+
+#~ msgid "Malay"
+#~ msgstr "Malajština"
+
+#~ msgid "Nepali"
+#~ msgstr "Nepálština"
+
+#~ msgid "Dutch"
+#~ msgstr "Nizozemské"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "Norština (nynorsk)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "Norština (bokmal)"
+
+#~ msgid "Oriya"
+#~ msgstr "Orijština"
+
+#~ msgid "Punjabi"
+#~ msgstr "Pandžábština"
+
+#~ msgid "Polish"
+#~ msgstr "Polština"
+
+#~ msgid "Portuguese"
+#~ msgstr "Portugalština"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "Portugalština (brazilská)"
+
+#~ msgid "Romanian"
+#~ msgstr "Rumunština"
+
+#~ msgid "Russian"
+#~ msgstr "Ruština"
+
+#~ msgid "Slovak"
+#~ msgstr "Slovenština"
+
+#~ msgid "Slovenian"
+#~ msgstr "Slovinština"
+
+#~ msgid "Albanian"
+#~ msgstr "Albánština"
+
+#~ msgid "Serbian"
+#~ msgstr "Srbština"
+
+#~ msgid "Swedish"
+#~ msgstr "Švédština"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "Švédština (finská)"
+
+#~ msgid "Tamil"
+#~ msgstr "Tamilština"
+
+#~ msgid "Telugu"
+#~ msgstr "Telugština"
+
+#~ msgid "Thai"
+#~ msgstr "Thajština"
+
+#~ msgid "Turkish"
+#~ msgstr "Turečtina"
+
+#~ msgid "Uighur"
+#~ msgstr "Ujgurština"
+
+#~ msgid "Ukrainian"
+#~ msgstr "Ukrajinština"
+
+#~ msgid "Urdu"
+#~ msgstr "Urdština"
+
+#~ msgid "Uzbek"
+#~ msgstr "Uzbečtina"
+
+#~ msgid "Vietnamese"
+#~ msgstr "Vietnamština"
+
+#~ msgid "Walloon"
+#~ msgstr "Walloon"
+
+#~ msgid "Yiddish"
+#~ msgstr "Jidiš"
+
+#~ msgid "Chinese"
+#~ msgstr "Čínština"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "Čínština (zjednodušená)"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "Čínština (tradiční)"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "Belgičtina"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "Angličtina (US)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "Angličtina (kanadská)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "Angličtina (irská)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "Angličtina (britská)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "Angličtina (americká)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "Angličtina (kanadská)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "Angličtina (britská)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "Angličtina (britská)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "Angličtina (kanadská)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "Angličtina (britská)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "Francouzština (kanadská)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "Francouzština (kanadská)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "Francouzština (kanadská)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "Němčina (švýcarská)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "Francouzština (kanadská)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "Němčina (s mrtvými klávesami)"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "Němčina (švýcarská)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "Angličtina (australská)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "Němčina (švýcarská)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "Němčina (švýcarská)"
+
+#, fuzzy
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "Portugalština (brazilská)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "Portugalština (brazilská)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "Španělština (jihoamerická)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "Španělština (jihoamerická)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "Španělština (jihoamerická)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "Španělština (jihoamerická)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "Španělština (jihoamerická)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "Španělština (CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "Španělština (mexická)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "Malajámština"
+
+#~ msgid "Norwegian"
+#~ msgstr "Norština"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "Srbština"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "Čínština (tradiční)"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "Čínština (tradiční)"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "Čínština (tradiční)"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "Čínština"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "Čínština (zjednodušená)"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "Arabština (egyptská)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "Arabština (egyptská)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "Arabština (egyptská)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "Arabština (libanonská)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "Arabština (egyptská)"
+
+#~ msgid "Other"
+#~ msgstr "Ostatní"
+
+#~ msgid "Unknown"
+#~ msgstr "Neznámé"
+
+#~ msgid "English (US)"
+#~ msgstr "Angličtina (US)"
+
+#~ msgid "Belgian"
+#~ msgstr "Belgičtina"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "Čeština (qwerty)"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "Francouzština (švýcarská)"
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "Němčina (s mrtvými klávesami)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "Portugalština (brazilská)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "Slovenština (qwerty)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "Španělština (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "Španělština (jihoamerická)"
+
+#~ msgid "English (UK)"
+#~ msgstr "Angličtina (UK)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "Převod zjednodušená - tradiční čínština"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "Převod mezi zjednodušenou čínštinou a tradiční čínštinou"
+
+#~ msgid "SC-TC"
+#~ msgstr "SC-TC"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "Převod zjednodušená - tradiční čínština"
+
+#~ msgid "No Conversion"
+#~ msgstr "Bez převodu"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "Ze zjednodušené do tradiční"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "Převést zjednodušenou čínštinu do tradiční čínštiny"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "Z tradiční do zjednodušené"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "Převést tradiční čínštinu do zjednodušené čínštiny"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "SC->TC"
+
+#~ msgid "TC->SC"
+#~ msgstr "TC->SC"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "SCIM platforma"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "Stav"
+
+#~ msgid "Name"
+#~ msgstr "Název"
+
+#~ msgid "Cursor Position"
+#~ msgstr "Pozice kurzoru"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "Aktuální pozice vkládacího kurzoru mezi znaky."
+
+#~ msgid "Maximum length"
+#~ msgstr "Maximální délka"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr ""
+#~ "Maximální počet znaků při zobrazení řetězce. Nula, pokud není nic "
+#~ "nastaveno."
+
+#~ msgid "Maximum width"
+#~ msgstr "Maximální šířka"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "Maximální šířka pohledu na řetězec."
+
+#~ msgid "Has Frame"
+#~ msgstr "S rámem"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "FALSE odstraní zkosení."
+
+#~ msgid "Draw cursor"
+#~ msgstr "Vykreslit kurzor"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "TRUE vykreslí blikající kurzor."
+
+#~ msgid "Auto move cursor"
+#~ msgstr "Automatické přesunutí kurzoru"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr "TRUE automaticky přemístí kurzor při kliknutí myší."
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "Předání událost stisknutí tlačítka"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr "TRUE předá událost stisknutí tlačítka programu."
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "Automatická změna velikosti widgetu podle řetězce"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "TRUE povolí automatickou změnu velikosti."
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr "TRUE automaticky přemístí kurzor při kliknutí myší."
+
+#~ msgid "Width in chars"
+#~ msgstr "Šířka znaků"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr "Počet znaků, pro které se v řetězci vynechá místo."
+
+#~ msgid "Scroll offset"
+#~ msgstr "Scroll offset"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr "Počet pixelů v zobrazeném řetězci při přesunu vlevo"
+
+#~ msgid "Text"
+#~ msgstr "Text"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "Obsahy zobrazeného řetězce"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "Zvolené _klávesy:"
+
+#~ msgid "Key Code:"
+#~ msgstr "Kód klávesy:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "Modifikátor:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Ctrl"
+
+#~ msgid "A_lt"
+#~ msgstr "A_lt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Shift"
+
+#~ msgid "_Release"
+#~ msgstr "_Uvolnit"
+
+#~ msgid "_Meta"
+#~ msgstr "_Meta"
+
+#~ msgid "S_uper"
+#~ msgstr "S_uper"
+
+#~ msgid "_Hyper"
+#~ msgstr "_Hyper"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "Zadejte prosím nejdřív kód klávesy."
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "Stiskněte klávesu (nebo kombinaci kláves).\n"
+#~ "Dialog se zavře po uvolnění kláves."
+
+#~ msgid "Grabbing a key."
+#~ msgstr "Zachycení klávesy."
+
+#~ msgid "Key Selection"
+#~ msgstr "Výběr kláves"
+
+#~ msgid "Orientation"
+#~ msgstr "Orientace"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "Orientace panelu."
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "Text"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amharština"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Vždy"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Volby"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Angličtina/klávesnice"
+
+#~ msgid "English/European"
+#~ msgstr "Angličtina/Evropa"
+
+#~ msgid "RAW CODE"
+#~ msgstr "RAW KÓD"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Klávesové zkratky:\n"
+#~ "\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " přepnutí mezi Multibyte a Unicode kódováním.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " zrušení vstupní metody.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "Stav aktuální vstupní metody. Změnu provedete kliknutím."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Obecná nastavení"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Nastavení klávesový zkratek používaných moduly včetně X11, GTK, IMModule, "
+#~ "GTK IMModule, QT IMModule atd."
+
+#~ msgid "_Trigger:"
+#~ msgstr "_Spouštění:"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Zvolte spouštěcí klávesy"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Klávesové události zapínající/vypínající SCIM vstupní metodu. Úpravu "
+#~ "provedete kliknutím na tlačítko vpravo."
+
+#~ msgid "Turn _On:"
+#~ msgstr "_Zapnout:"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Zvolte spouštěcí klávesy"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Klávesové události zapínající SCIM vstupní metodu. Úpravu provedete "
+#~ "kliknutím na tlačítko vpravo."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "_Vypnout:"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Zvolte vypínací klávesy"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Klávesové události vypínající SCIM vstupní metodu. Úpravu provedete "
+#~ "kliknutím na tlačítko vpravo."
+
+#~ msgid "_Next input method:"
+#~ msgstr "_Další vstupní metoda:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "Zvolte klávesy další vstupní metody"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Klávesové události přepínající na další vstupní metodu. Úpravu provedete "
+#~ "kliknutím na tlačítko vpravo."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "_Předchozí vstupní metoda:"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Zvolte klávesy předchozí vstupní metody"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Klávesové události přepnutí do předcházející vstupní metody. Úpravu "
+#~ "provedete kliknutím na tlačítko vpravo."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "_Zobrazit nabídku vstupní metody:"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "Zvolte klávesy zobrazení nabídky vstupní metody"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Klávesové události k zobrazení nabídky vstupní metody. Úpravu provedete "
+#~ "kliknutím na tlačítko vpravo."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "_Rozložení klávesnice:"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Zde můžete nastavit své rozložení klávesnice tak, aby zvolené vstupní "
+#~ "metody fungovaly korektně."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "_Vložit předpřipravený řetězec do klientského okna"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, zobrazí se předpřipravený řetězec přímo v "
+#~ "klientském vstupním okně než v nezávislém plovoucím okně."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "_Zdílet vstupní metody u všech aplikací"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Pokud tuto volbu zaškrtnete, bude se u všech aplikací používat pouze "
+#~ "jeden typ vstupní metody. V opačném případě se u každé aplikace může "
+#~ "použije jiná."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Klávesové zkratky"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Zde můžete povolit/zakázat vstupní metody a nastavit jejich klávesové "
+#~ "zkratky."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Služby nainstalované vstupní metody:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "Upravit _klávesové zkratky"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "Úprava klávesových zkratek spojených se zvolenou vstupní metodou."
+
+#~ msgid "Select _Filters"
+#~ msgstr "Zvolit _filtry"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "Zvolte filtry spojené s touto vstupní metodou."
+
+#~ msgid "_Expand"
+#~ msgstr "_Rozbalit"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Zobrazení všech jazykových kategorií."
+
+#~ msgid "_Collapse"
+#~ msgstr "_Zabalit"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Skrytí všech jazykových kategorií."
+
+#~ msgid "E_nable All"
+#~ msgstr "_Povolit vše"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Povolit všechny vstupní metody."
+
+#~ msgid "_Disable All"
+#~ msgstr "_Zakázat vše"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Zakázat všechny vstupní metody."
+
+#~ msgid "Filters"
+#~ msgstr "Filtry"
+
+#~ msgid "Languages"
+#~ msgstr "Jazyky"
+
+#~ msgid "Description"
+#~ msgstr "Popis"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Upravit klávesové zkratky %s"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Zvolte filtry pro %s"
+
+#~ msgid "Move _Up"
+#~ msgstr "Posunout na_horu"
+
+#~ msgid "Move _Down"
+#~ msgstr "Posunout _dolů"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "Démon zapuštěný do panelu založený na knihovně GTK+-2.x."
+
+#~ msgid "On demand"
+#~ msgstr "Na požádání"
+
+#~ msgid "Never"
+#~ msgstr "Nikdy"
+
+#~ msgid "ToolBar"
+#~ msgstr "Nástrojová lišta"
+
+#~ msgid "_Show:"
+#~ msgstr "_Zobrazit:"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Automatické přicvaknutí"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Zobrazit ikonu _vstupní metody"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "Zobrazit _název vstupní metody"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "Délka _zobrazení::"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Zobrazit ikonu _přilepení"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Zobrazit ikonu _nabídky"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Zobrazit ikonu _nápovědy"
+
+#~ msgid "Show _property label"
+#~ msgstr "Zobrazit _vlastnosti"
+
+#~ msgid "Input window"
+#~ msgstr "Vstupní okno"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "_Vložená vyhledávací tabulka"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "V_ertikální vyhledávací tabulka"
+
+#~ msgid "Misc"
+#~ msgstr "Různé"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Pohltit ikonu do panelu"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Přišpendlit _okno"
+
+#~ msgid "_Font:"
+#~ msgstr "_Písmo:"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Pokud jste zvolili \"Vždy\", bude lišta vždy zobrazena. V případě \"Na "
+#~ "požádání\" bude vždy po deaktivaci SCIM skryta. U volby \"Nikdy\" se "
+#~ "nezobrazí nikdy."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, bude nástrojová lišta přichycena k okraji "
+#~ "pracovní plochy."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "Lišta se skryje po uplynutí zadaného času. Tato volba je platná pouze "
+#~ "pokud jste současně zvolili \"Vždy zobrazit'\". Funkci vypnete nastavením "
+#~ "na hodnotu 0."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr "Pokud zvolíte tuto možnost, objeví se na liště ikona metody."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, objeví se na liště název vstupní metody."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr "Pokud zvolíte tuto možnost, objeví se na liště ikona přišpendlení."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr "Pokud zvolíte tuto možnost, objeví se na liště ikona nabídky."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr "Pokud zvolíte tuto možnost, objeví se na liště ikona nápovědy."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, objeví se na liště ikona vlastností vstupní "
+#~ "metody."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, připojí se vstupního okna vyhledávací tabulka."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, zobrazí se vyhledávací tabulka vertikálně."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr "Pokud zvolíte tuto možnost, zapustí se ikona programu do panelu."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, lišta nástrojů, vstupní okno a vyhledávací "
+#~ "tabulka se přišpendlí do původní pozice."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr "Nastavení písma v okně vstupu a ve vyhledávací tabulce."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Zvolte písmo rozhraní"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "Rozhraní"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMEngine"
+
+#~ msgid "Panel"
+#~ msgstr "Panel"
+
+#~ msgid "Extra"
+#~ msgstr "Rozšíření"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Nastavení vstupní metody SCIM"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ "<span size=\"20000\">Smart Common Input Method platforma</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Grafické rozhraní</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Nastavení %s modulů.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Chcete skutečně ukončit nastavení SCIM?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Ne všechna nastavení lze zavést za běhu. Nezapomeňte SCIM restartovat."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Nastavit SCIM"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "Grafické rozhraní založené na knihovně GTK Widget."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "Nástroj pro nastavení Smart Common Input Method platformy"
+
+#~ msgid "SCIM Help"
+#~ msgstr "Nápověda SCIM"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Input Method"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Přišpendlit/odšpendlit vstupní okno a nástrojovou lištu."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "Zobrazí krátkou nápovědu o aktuální vstupní metodě."
+
+#~ msgid "Show command menu."
+#~ msgstr "Zobrazí nabídku příkazů."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Obnovit konfiguraci"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Přišpendlit okno"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Skrýt lištu"
+
+#~ msgid "Help ..."
+#~ msgstr "Nápověda..."
+
+#~ msgid "Exit"
+#~ msgstr "Ukončit"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "En"
--- /dev/null
+# translation of de.po to German
+# This file is distributed under the same license as the scim package.
+# Copyright (C) 2004 THE scim'S COPYRIGHT HOLDER.
+#
+#
+# Jan Hefti <j.hefti@hamburg.de>, 2004.
+# Jan Hefti <j.hefti@chinaboard.de>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: de\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 18:51+0900\n"
+"PO-Revision-Date: 2005-12-16 14:10+0100\n"
+"Last-Translator: Jan Hefti <j.hefti@chinaboard.de>\n"
+"Language-Team: German <scim-devel@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: KBabel 1.11\n"
+
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Tastenauswahl"
+
+#, fuzzy
+#~ msgid "Selection"
+#~ msgstr "Tastenauswahl"
+
+#, fuzzy
+#~ msgid "Option"
+#~ msgstr "Optionen"
+
+#, fuzzy
+#~ msgid "General"
+#~ msgstr "Deutsch"
+
+#, fuzzy
+#~ msgid "S/W keyboard"
+#~ msgstr "Deutsch/Tastatur"
+
+#, fuzzy
+#~ msgid "Keyboard option"
+#~ msgstr "Tastenauswahl"
+
+#, fuzzy
+#~ msgid "H/W keyboard"
+#~ msgstr "Deutsch/Tastatur"
+
+#, fuzzy
+#~ msgid "option"
+#~ msgstr "Optionen"
+
+#, fuzzy
+#~ msgid "Keyboard"
+#~ msgstr "Deutsch/Tastatur"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "Deutsch/Tastatur"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "Englisch (USA)"
+
+#~ msgid "Amharic"
+#~ msgstr "Amharisch"
+
+#~ msgid "Arabic"
+#~ msgstr "Arabisch"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "Arabisch (Ägypten)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "Arabisch (Libanon)"
+
+#~ msgid "Assamese"
+#~ msgstr "Assamesisch"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "Aserbaidschanisch"
+
+#~ msgid "Belarusian"
+#~ msgstr "Weißrussisch"
+
+#~ msgid "Bulgarian"
+#~ msgstr "Bulgarisch"
+
+#~ msgid "Bengali"
+#~ msgstr "Bengalisch"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "Bengalisch (Indien)"
+
+#~ msgid "Tibetan"
+#~ msgstr "Tibetisch"
+
+#~ msgid "Bosnian"
+#~ msgstr "Bosnisch"
+
+#~ msgid "Catalan"
+#~ msgstr "Katalanisch"
+
+#~ msgid "Czech"
+#~ msgstr "Tschechisch"
+
+#~ msgid "Welsh"
+#~ msgstr "Walisisch"
+
+#~ msgid "Danish"
+#~ msgstr "Dänisch"
+
+#~ msgid "German"
+#~ msgstr "Deutsch"
+
+#~ msgid "Greek"
+#~ msgstr "Griechisch"
+
+#~ msgid "English"
+#~ msgstr "Englisch"
+
+#~ msgid "English (Australian)"
+#~ msgstr "Englisch (Australien)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "Englisch (Kanada)"
+
+#~ msgid "English (British)"
+#~ msgstr "Englisch (Großbritannien)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "Englisch (Irland)"
+
+#~ msgid "English (American)"
+#~ msgstr "Englisch (USA)"
+
+#~ msgid "Spanish"
+#~ msgstr "Spanisch"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#~ msgid "Estonian"
+#~ msgstr "Estnisch"
+
+#~ msgid "Basque"
+#~ msgstr "Baskisch"
+
+#~ msgid "Persian"
+#~ msgstr "Persisch"
+
+#~ msgid "Finnish"
+#~ msgstr "Finnisch"
+
+#~ msgid "French"
+#~ msgstr "Französisch"
+
+#~ msgid "Irish"
+#~ msgstr "Irisch"
+
+#~ msgid "Galician"
+#~ msgstr "Galizisch"
+
+#~ msgid "Gujarati"
+#~ msgstr "Gujarati"
+
+#~ msgid "Hebrew"
+#~ msgstr "Hebräisch"
+
+#~ msgid "Hindi"
+#~ msgstr "Hindi"
+
+#~ msgid "Croatian"
+#~ msgstr "Kroatisch"
+
+#~ msgid "Hungarian"
+#~ msgstr "Ungarisch"
+
+#, fuzzy
+#~ msgid "Armenian"
+#~ msgstr "Rumänisch"
+
+#~ msgid "Interlingua"
+#~ msgstr "Interlingua"
+
+#~ msgid "Indonesian"
+#~ msgstr "Indonesisch"
+
+#~ msgid "Icelandic"
+#~ msgstr "Isländisch"
+
+#~ msgid "Italian"
+#~ msgstr "Italienisch"
+
+#~ msgid "Japanese"
+#~ msgstr "Japanisch"
+
+#, fuzzy
+#~ msgid "Georgian"
+#~ msgstr "Deutsch"
+
+#~ msgid "Kazakh"
+#~ msgstr "Kasachisch"
+
+#~ msgid "Cambodian"
+#~ msgstr "Kambodschanisch"
+
+#~ msgid "Kannada"
+#~ msgstr "Kannada"
+
+#~ msgid "Korean"
+#~ msgstr "Koreanisch"
+
+#~ msgid "Laothian"
+#~ msgstr "Laotisch"
+
+#~ msgid "Lithuanian"
+#~ msgstr "Litauisch"
+
+#~ msgid "Latvian"
+#~ msgstr "Lettisch"
+
+#~ msgid "Macedonian"
+#~ msgstr "Mazedonisch"
+
+#~ msgid "Malayalam"
+#~ msgstr "Malajalam"
+
+#~ msgid "Mongolian"
+#~ msgstr "Mongolisch"
+
+#~ msgid "Marathi"
+#~ msgstr "Marathi"
+
+#~ msgid "Malay"
+#~ msgstr "Malaysisch"
+
+#~ msgid "Nepali"
+#~ msgstr "Nepalesisch"
+
+#~ msgid "Dutch"
+#~ msgstr "Niederländisch"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "Norwegisch (Nynorsk)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "Norwegisch (Bokmal)"
+
+#~ msgid "Oriya"
+#~ msgstr "Orija"
+
+#~ msgid "Punjabi"
+#~ msgstr "Pandschabi"
+
+#~ msgid "Polish"
+#~ msgstr "Polnisch"
+
+#~ msgid "Portuguese"
+#~ msgstr "Portugiesisch"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "Portugiesisch (Brasilien)"
+
+#~ msgid "Romanian"
+#~ msgstr "Rumänisch"
+
+#~ msgid "Russian"
+#~ msgstr "Russisch"
+
+#~ msgid "Slovak"
+#~ msgstr "Slowakisch"
+
+#~ msgid "Slovenian"
+#~ msgstr "Slowenisch"
+
+#~ msgid "Albanian"
+#~ msgstr "Albanisch"
+
+#~ msgid "Serbian"
+#~ msgstr "Serbisch"
+
+#~ msgid "Swedish"
+#~ msgstr "Schwedisch"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "Schwedisch (Finnland)"
+
+#~ msgid "Tamil"
+#~ msgstr "Tamilisch"
+
+#~ msgid "Telugu"
+#~ msgstr "Telugu"
+
+#~ msgid "Thai"
+#~ msgstr "Thai"
+
+#~ msgid "Turkish"
+#~ msgstr "Türkisch"
+
+#~ msgid "Uighur"
+#~ msgstr "Uigurisch"
+
+#~ msgid "Ukrainian"
+#~ msgstr "Ukrainisch"
+
+#~ msgid "Urdu"
+#~ msgstr "Urdu"
+
+#~ msgid "Uzbek"
+#~ msgstr "Usbekisch"
+
+#~ msgid "Vietnamese"
+#~ msgstr "Vietnamesisch"
+
+#~ msgid "Walloon"
+#~ msgstr "Wallonisch"
+
+#~ msgid "Yiddish"
+#~ msgstr "Jiddisch"
+
+#~ msgid "Chinese"
+#~ msgstr "Chinesisch"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "Chinesisch (vereinfacht)"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "Chinesisch (traditionell)"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "Belgisch"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "Englisch (US)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "Englisch (Kanada)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "Englisch (Irland)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "Englisch (Großbritannien)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "Englisch (USA)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "Englisch (Kanada)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "Englisch (Großbritannien)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "Englisch (Großbritannien)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "Englisch (Kanada)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "Englisch (Großbritannien)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "Französisch (Kanada)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "Französisch (Kanada)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "Französisch (Kanada)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "Deutsch (Schweiz)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "Französisch (Kanada)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "Deutsch (mit deadkeys)"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "Deutsch (Schweiz)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "Englisch (Australien)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "Deutsch (Schweiz)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "Deutsch (Schweiz)"
+
+#, fuzzy
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "Portugiesisch (Brasilien)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "Portugiesisch (Brasilien)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "Spanisch (Lateinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "Spanisch (Lateinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "Spanisch (Lateinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "Spanisch (Lateinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "Spanisch (Lateinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "Spanisch (CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "Spanisch (Mexiko)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "Malajalam"
+
+#~ msgid "Norwegian"
+#~ msgstr "Norwegisch"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "Serbisch"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "Chinesisch (traditionell)"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "Chinesisch (traditionell)"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "Chinesisch (traditionell)"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "Chinesisch"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "Chinesisch (vereinfacht)"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "Arabisch (Ägypten)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "Arabisch (Ägypten)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "Arabisch (Ägypten)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "Arabisch (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "Arabisch (Ägypten)"
+
+#~ msgid "Other"
+#~ msgstr "Sonstige"
+
+#~ msgid "Unknown"
+#~ msgstr "Unbekannt"
+
+#~ msgid "English (US)"
+#~ msgstr "Englisch (US)"
+
+#~ msgid "Belgian"
+#~ msgstr "Belgisch"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "Tschechisch (qwerty)"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "Französisch (Schweiz) "
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "Deutsch (mit deadkeys)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "Portugiesisch (Brasilien, US, Akzente)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "Slovakisch (qwerty)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "Spanisch (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "Spanisch (Lateinamerika)"
+
+#~ msgid "English (UK)"
+#~ msgstr "Englisch (UK)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "Umwandlung vereinfachtes/traditionelles Chinesisch"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "Vereinfachtes in traditionelles Chinesisch umwandeln und umgekehrt"
+
+#~ msgid "SC-TC"
+#~ msgstr "VC-TC"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "Umwandlung vereinfachtes->traditionelles Chinesisch"
+
+#~ msgid "No Conversion"
+#~ msgstr "Keine Umwandlung"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "Vereinfacht zu traditionell"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "Vereinfachtes Chinesisch in traditionelles Chinesisch umwandeln"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "Traditionell zu vereinfacht"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "Traditionelles Chinesisch in vereinfachtes Chinesisch umwandeln"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "VC->TC"
+
+#~ msgid "TC->SC"
+#~ msgstr "TC->VC"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "Smart Common Input Method Plattform "
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(c) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "Aktivieren"
+
+#~ msgid "Name"
+#~ msgstr "Name"
+
+#~ msgid "Cursor Position"
+#~ msgstr "Zeigerposition"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "Die aktuelle Zeigerposition (in Zeichen gerechnet)."
+
+#~ msgid "Maximum length"
+#~ msgstr "Maximale Länge"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr "Maximale Anzahl angezeigter Zeichen. »0« bedeutet unbegrenzt."
+
+#~ msgid "Maximum width"
+#~ msgstr "Maximale Breite"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "Maximale Breite der angezeigten Zeichenkette."
+
+#~ msgid "Has Frame"
+#~ msgstr "Mit Rahmen"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr ""
+#~ "»Nein« entfernt den umgebenden Rahmen von der angezeigten Zeichenkette."
+
+#~ msgid "Draw cursor"
+#~ msgstr "Zeiger anzeigen"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "Wenn »ja«, wird ein blinkender Zeiger angezeigt."
+
+#~ msgid "Auto move cursor"
+#~ msgstr "Zeiger automatisch verschieben"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr ""
+#~ "Wenn »ja«, wird der Zeiger bei einem Mausklick automatisch verschoben."
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "Knopfdruck zum Übertragen"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr ""
+#~ "Wenn »ja«, wird der gewählte Ausdruck beim jeweiligen Knopfdruck zum "
+#~ "Programm übertragen."
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "Anzeigefläche automatisch an Zeichenkette anpassen"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "Bei »ja« ist die automatische Größenanpassung aktiviert."
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr ""
+#~ "Wenn »ja«, wird der Zeiger bei einem Mausklick automatisch verschoben."
+
+#~ msgid "Width in chars"
+#~ msgstr "Breite in Zeichen"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr ""
+#~ "Anzahl der Zeichen, für die in der Anzeige Platz gelassen werden soll."
+
+#~ msgid "Scroll offset"
+#~ msgstr "Verschiebeversatz"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr ""
+#~ "Anzahl der Pixel, um die die Anzeige außerhalb des Bildschirms nach links "
+#~ "verschoben wird"
+
+#~ msgid "Text"
+#~ msgstr "Text"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "Inhalt der Zeichenkettenanzeige"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "Gewählte _Tasten:"
+
+#~ msgid "Key Code:"
+#~ msgstr "Tastencode:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "Sondertasten:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Strg"
+
+#~ msgid "A_lt"
+#~ msgstr "_Alt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Umschalt"
+
+#~ msgid "_Release"
+#~ msgstr "_Loslassen"
+
+#~ msgid "_Meta"
+#~ msgstr "_Meta"
+
+#~ msgid "S_uper"
+#~ msgstr "Su_per"
+
+#~ msgid "_Hyper"
+#~ msgstr "_Hyper"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "Bitte geben Sie zuerst einen Tastencode ein."
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "Drücken Sie eine Taste (oder eine Tastenkombination).\n"
+#~ "Dieser Dialog wird geschlossen, wenn die Tasten gelöst werden."
+
+#~ msgid "Grabbing a key."
+#~ msgstr "Erfassen der Tasten."
+
+#~ msgid "Key Selection"
+#~ msgstr "Tastenauswahl"
+
+#~ msgid "Orientation"
+#~ msgstr "Ausrichtung"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "Die Ausrichtung des Systemabschnitts der Kontrollleiste."
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "Text"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amharisch"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Immer"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Optionen"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Deutsch/Tastatur"
+
+#~ msgid "English/European"
+#~ msgstr "Deutsch/Europäisch"
+
+#~ msgid "RAW CODE"
+#~ msgstr "Unicode Rohdaten"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(c) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Tastenkürzel:\n"
+#~ "\n"
+#~ " Steuerung+u:\n"
+#~ " Umschalten zwischen Multibyte-Codierung und Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " Eingabemethode zurücksetzen.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr ""
+#~ "Der Status der aktuell verwendeten Eingabemethode. Klicken Sie diesen an, "
+#~ "um ihn zu ändern."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Globale Einstellungen"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Stellen Sie die globalen Optionen ein, die von allen FrontEnd-Modulen "
+#~ "beachtet werden, einschließlich dem X11 FrontEnd, GKT IMModule, QT "
+#~ "IMModule, usw."
+
+#~ msgid "_Trigger:"
+#~ msgstr "_Auslöser:"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Tasten zum Auslösen auswählen"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen die Eingabemethode SCIM an- und "
+#~ "ausgeschaltet wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "Turn _On:"
+#~ msgstr "_Einschalten:"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Tasten zum Einschalten auswählen"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen die Eingabemethode SCIM eingeschaltet "
+#~ "wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "A_usschalten"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Tasten zum Ausschalten auswählen"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen die Eingabemethode SCIM ausgeschaltet "
+#~ "wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "_Next input method:"
+#~ msgstr "_Nächste Eingabemethode:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr ""
+#~ "Wählen Sie die Tastenkombinationen, um zur nächsten Eingabemethode zu "
+#~ "wechseln"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen zur nächsten Eingabemethode gewechselt "
+#~ "wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "_Vorherige Eingabemethode:"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr ""
+#~ "Wählen Sie die Tastenkombinationen, um zur vorherigen Eingabemethode zu "
+#~ "wechseln"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen zur vorherigen Eingabemethode gewechselt "
+#~ "wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "Zeige _Auswahlmenü für Eingabemethoden:"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr ""
+#~ "Wählen Sie die Tastenkürzel, um das Auswahlmenü für Eingabemethoden "
+#~ "anzuzeigen"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen das Auswahlmenü für Eingabemethoden "
+#~ "angezeigt wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "_Tastaturlayout"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Sie sollten hier Ihr derzeit verwendetes Tastaturlayout einstellen, so "
+#~ "dass Eingabemethoden, die vom Tastaturlayout abhängig sind, korrekt "
+#~ "funktionieren."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "Roheingabe ins Client-Fenster einbetten"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird die Roheingabe - die bisher "
+#~ "eingegebenen Zeichen vor einer endgültigen Auswahl - ins Client-"
+#~ "Eingabefenster eingebettet und nicht in einem Extrafenster angezeigt."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "Dieselbe Eingabemethode unter _allen Anwendungen verwenden."
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Wenn diese Option aktiviert ist, wird ein und dieselbe Eingabemethode von "
+#~ "allen Anwendungen gleichzeitig verwendet. Andernfalls kann jede Anwendung "
+#~ "eine andere Eingabemethode verwenden."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Tastenkombinationen"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Hier können Sie die installierten Eingabemethoden aktivieren/deaktivieren "
+#~ "und ihnen Tastenkürzel zuordnen."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Installierte Eingabemethoden:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "_Tastenkürzel ändern"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr ""
+#~ "Stellen Sie die mit der gewählten Eingabemethode assoziierten "
+#~ "Tastenkürzel ein."
+
+#~ msgid "Select _Filters"
+#~ msgstr "_Filter auswählen"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr ""
+#~ "Wählen Sie die Filter, die dieser Eingabemethode zugeordnet werden sollen."
+
+#~ msgid "_Expand"
+#~ msgstr "Er_weitern"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Erweitern Sie alle Sprachgruppen."
+
+#~ msgid "_Collapse"
+#~ msgstr "Ein_klappen"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Klappen Sie alle Sprachgruppen ein."
+
+#~ msgid "E_nable All"
+#~ msgstr "Alle _aktivieren"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Alle Eingabemethoden aktivieren."
+
+#~ msgid "_Disable All"
+#~ msgstr "Alle _deaktivieren"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Alle Eingabemethoden deaktivieren."
+
+#~ msgid "Filters"
+#~ msgstr "Filter"
+
+#~ msgid "Languages"
+#~ msgstr "Sprachen"
+
+#~ msgid "Description"
+#~ msgstr "Beschreibung"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Tastenkürzel für %s ändern"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Filter für %s wählen"
+
+#~ msgid "Move _Up"
+#~ msgstr "Nach _oben"
+
+#~ msgid "Move _Down"
+#~ msgstr "Nach _unten"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr ""
+#~ "Ein Kontrollleisten-Hilfsprogramm, das auf der GTK+-2.x-Bibliothek beruht."
+
+#~ msgid "On demand"
+#~ msgstr "Auf Anforderung"
+
+#~ msgid "Never"
+#~ msgstr "Nie"
+
+#~ msgid "ToolBar"
+#~ msgstr "Symbolleiste"
+
+#~ msgid "_Show:"
+#~ msgstr "_Zeige:"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Automatisch ein_rasten"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Symbol für die Eingabe_methode anzeigen"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "_Name der Eingabemethode anzeigen"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "_Ausblenden nach (sek):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Symbol »Immer im _Vordergrund« anzeigen"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Symbol »_Menü« anzeigen"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Symbol »_Hilfe« anzeigen"
+
+#~ msgid "Show _property label"
+#~ msgstr "_Bezeichnung der Eigenschaften anzeigen"
+
+#~ msgid "Input window"
+#~ msgstr "Eingabefenster"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "Ein_gebettete Auswahlliste"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "_Vertikale Auswahlliste"
+
+#~ msgid "Misc"
+#~ msgstr "Verschiedenes"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Symbol im _Benachrichtigungsfeld anzeigen"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Fenster behält _Position"
+
+#~ msgid "_Font:"
+#~ msgstr "_Schriftart:"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Wenn »Immer« gewählt ist, wird die Symbolleiste immer auf dem Bildschirm "
+#~ "angezeigt. Bei »Auf Anforderung« wird sie nur angezeigt, wenn SCIM "
+#~ "aktiviert ist. Bei »Nie« wird sie niemals angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird die Symbolleiste am Bildschirmrand "
+#~ "eingerastet."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "Die Symbolleiste wird versteckt, nachdem die angegebene Zeit vergangen "
+#~ "ist. Diese Option ist nur verfügbar, wenn »Immer anzeigen« gewählt ist. "
+#~ "Geben Sie »0« ein, um dieses Verhalten zu unterdrücken. "
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird das Symbol der aktuellen "
+#~ "Eingabemethode auf der Symbolleiste angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird der Name der aktuellen Eingabemethode "
+#~ "auf der Symbolleiste angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird das Symbol »Immer im Vordergrund "
+#~ "halten« auf der Symbolleiste angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird das Symbol »Menü« auf der Symbolleiste "
+#~ "angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird das Symbol »Hilfe« auf der "
+#~ "Symbolleiste angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, werden die Bezeichnungen der einzelnen "
+#~ "Eigenschaften der Eingabemethode auf der Symbolleiste angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird die Auswahlliste ins Eingabefenster "
+#~ "eingebettet."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird die Auswahlliste senkrecht angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird ein Symbol in der Kontrollleiste "
+#~ "angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, werden Symbolleiste, Eingabefenster und "
+#~ "Auswahlliste immer an ihren jeweiligen Ausgangspositionen gehalten."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "Die eingestellte Schriftart wird in Eingabefenster und Auswahlliste "
+#~ "verwendet."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Schriftart für die Benutzeroberfläche wählen"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "Benutzeroberfläche"
+
+#~ msgid "IMEngine"
+#~ msgstr "Eingabemethoden"
+
+#~ msgid "Panel"
+#~ msgstr "Kontrollleiste"
+
+#~ msgid "Extra"
+#~ msgstr "Extra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Einstellungen der SCIM-Eingabemethoden"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Smart Common Input Method-Plattform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Grafisches Einrichtungswerkzeug</"
+#~ "span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Einstellungen der %s-Module.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Möchten Sie die Einstellung von SCIM wirklich verlassen?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Nicht alle Einstellungen können bei laufendem Programm neu geladen "
+#~ "werden. Starten Sie bitte SCIM neu, damit alle Änderungen übernommen "
+#~ "werden."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Einrichtung von SCIM"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr ""
+#~ "Integriertes Einrichtungswerkzeug, das auf der GTK Widget-Bibliothek "
+#~ "beruht."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "Einrichtungswerkzeug für die Smart Common Input Method-Plattform"
+
+#~ msgid "SCIM Help"
+#~ msgstr "Hilfe zu SCIM"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Input Method"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Eingabefenster und Symbolleiste festsetzen/verschiebbar machen."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "Zeige eine kurze Hilfe zu SCIM und zur gewählten Eingabemethode."
+
+#~ msgid "Show command menu."
+#~ msgstr "Befehlsmenü anzeigen."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(c) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Einstellungen neu laden"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Werkzeugleiste festsetzen"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Symbolleiste verstecken"
+
+#~ msgid "Help ..."
+#~ msgstr "Hilfe ..."
+
+#~ msgid "Exit"
+#~ msgstr "Beenden"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "De"
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 18:51+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+msgid "Keyboard selection"
+msgstr ""
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 18:51+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+msgid "Keyboard selection"
+msgstr ""
--- /dev/null
+# Finnish translation for scim
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the scim package.
+# Timo Jyrinki <timo.jyrinki@iki.fi>, 2006.
+# note: GFTT is at http://www.gnome.fi/
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: scim\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 18:51+0900\n"
+"PO-Revision-Date: 2006-05-24 16:51+0000\n"
+"Last-Translator: Timo Jyrinki <timo.jyrinki@iki.fi>\n"
+"Language-Team: Finnish <gnome-fi-laatu@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Näppäimen valinta"
+
+#, fuzzy
+#~ msgid "Selection"
+#~ msgstr "Näppäimen valinta"
+
+#, fuzzy
+#~ msgid "Option"
+#~ msgstr "Valinnat"
+
+#, fuzzy
+#~ msgid "General"
+#~ msgstr "saksa"
+
+#, fuzzy
+#~ msgid "S/W keyboard"
+#~ msgstr "englanti/näppäimistö"
+
+#, fuzzy
+#~ msgid "Keyboard option"
+#~ msgstr "Näppäimen valinta"
+
+#, fuzzy
+#~ msgid "H/W keyboard"
+#~ msgstr "englanti/näppäimistö"
+
+#, fuzzy
+#~ msgid "option"
+#~ msgstr "Valinnat"
+
+#, fuzzy
+#~ msgid "Keyboard"
+#~ msgstr "englanti/näppäimistö"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "englanti/näppäimistö"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "englanti (amerikanenglanti)"
+
+#~ msgid "Amharic"
+#~ msgstr "amhara"
+
+#~ msgid "Arabic"
+#~ msgstr "arabia"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "arabia (Egypti)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "arabia (Libanon)"
+
+#~ msgid "Assamese"
+#~ msgstr "assami"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "azeri"
+
+#~ msgid "Belarusian"
+#~ msgstr "valkovenäjä"
+
+#~ msgid "Bulgarian"
+#~ msgstr "bulgaria"
+
+#~ msgid "Bengali"
+#~ msgstr "bengali"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "bengali (Intia)"
+
+#~ msgid "Tibetan"
+#~ msgstr "tiibetti"
+
+#~ msgid "Bosnian"
+#~ msgstr "bosnia"
+
+#~ msgid "Catalan"
+#~ msgstr "katalaani"
+
+#~ msgid "Czech"
+#~ msgstr "tšekki"
+
+#~ msgid "Welsh"
+#~ msgstr "wales"
+
+#~ msgid "Danish"
+#~ msgstr "tanska"
+
+#~ msgid "German"
+#~ msgstr "saksa"
+
+#~ msgid "Greek"
+#~ msgstr "kreikka"
+
+#~ msgid "English"
+#~ msgstr "englanti"
+
+#~ msgid "English (Australian)"
+#~ msgstr "englanti (Australia)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "englanti (Kanada)"
+
+#~ msgid "English (British)"
+#~ msgstr "englanti (Iso-Britannia)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "englanti (Irlanti)"
+
+#~ msgid "English (American)"
+#~ msgstr "englanti (amerikanenglanti)"
+
+#~ msgid "Spanish"
+#~ msgstr "espanja"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "espanja (Mexico)"
+
+#~ msgid "Estonian"
+#~ msgstr "viro"
+
+#~ msgid "Basque"
+#~ msgstr "baski"
+
+#~ msgid "Persian"
+#~ msgstr "persia"
+
+#~ msgid "Finnish"
+#~ msgstr "suomi"
+
+#~ msgid "French"
+#~ msgstr "ranska"
+
+#~ msgid "Irish"
+#~ msgstr "irlanti"
+
+#~ msgid "Galician"
+#~ msgstr "galicia"
+
+#~ msgid "Gujarati"
+#~ msgstr "gudžarati"
+
+#~ msgid "Hebrew"
+#~ msgstr "heprea"
+
+#~ msgid "Hindi"
+#~ msgstr "hindi"
+
+#~ msgid "Croatian"
+#~ msgstr "kroatia"
+
+#~ msgid "Hungarian"
+#~ msgstr "unkari"
+
+#, fuzzy
+#~ msgid "Armenian"
+#~ msgstr "romania"
+
+#~ msgid "Interlingua"
+#~ msgstr "interlingua"
+
+#~ msgid "Indonesian"
+#~ msgstr "indonesia"
+
+#~ msgid "Icelandic"
+#~ msgstr "islanti"
+
+#~ msgid "Italian"
+#~ msgstr "italia"
+
+#~ msgid "Japanese"
+#~ msgstr "japani"
+
+#, fuzzy
+#~ msgid "Georgian"
+#~ msgstr "saksa"
+
+#~ msgid "Kazakh"
+#~ msgstr "kazak"
+
+#~ msgid "Cambodian"
+#~ msgstr "kampodia/khmer"
+
+#~ msgid "Kannada"
+#~ msgstr "kannada"
+
+#~ msgid "Korean"
+#~ msgstr "korea"
+
+#~ msgid "Laothian"
+#~ msgstr "laos"
+
+#~ msgid "Lithuanian"
+#~ msgstr "liettua"
+
+#~ msgid "Latvian"
+#~ msgstr "latvia"
+
+#~ msgid "Macedonian"
+#~ msgstr "makedonia"
+
+#~ msgid "Malayalam"
+#~ msgstr "malajalam"
+
+#~ msgid "Mongolian"
+#~ msgstr "mongolia"
+
+#~ msgid "Marathi"
+#~ msgstr "marathi"
+
+#~ msgid "Malay"
+#~ msgstr "malaiji"
+
+#~ msgid "Nepali"
+#~ msgstr "nepali"
+
+#~ msgid "Dutch"
+#~ msgstr "hollanti"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "norja (nykynorja)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "norja (kirjanorja)"
+
+#~ msgid "Oriya"
+#~ msgstr "oriya"
+
+#, fuzzy
+#~ msgid "Punjabi"
+#~ msgstr "panjabi"
+
+#~ msgid "Polish"
+#~ msgstr "puola"
+
+#~ msgid "Portuguese"
+#~ msgstr "portugali"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "portugali (Brasilia)"
+
+#~ msgid "Romanian"
+#~ msgstr "romania"
+
+#~ msgid "Russian"
+#~ msgstr "venäjä"
+
+#~ msgid "Slovak"
+#~ msgstr "slovakki"
+
+#~ msgid "Slovenian"
+#~ msgstr "sloveeni"
+
+#~ msgid "Albanian"
+#~ msgstr "albania"
+
+#~ msgid "Serbian"
+#~ msgstr "serbia"
+
+#~ msgid "Swedish"
+#~ msgstr "ruotsi"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "ruotsi (Suomi)"
+
+#~ msgid "Tamil"
+#~ msgstr "tamili"
+
+#~ msgid "Telugu"
+#~ msgstr "telugu"
+
+#~ msgid "Thai"
+#~ msgstr "thai"
+
+#~ msgid "Turkish"
+#~ msgstr "turkki"
+
+#~ msgid "Uighur"
+#~ msgstr "uiguuri"
+
+#~ msgid "Ukrainian"
+#~ msgstr "ukraina"
+
+#~ msgid "Urdu"
+#~ msgstr "urdu"
+
+#~ msgid "Uzbek"
+#~ msgstr "uzbekki"
+
+#~ msgid "Vietnamese"
+#~ msgstr "vietnam"
+
+#~ msgid "Walloon"
+#~ msgstr "valloni"
+
+#~ msgid "Yiddish"
+#~ msgstr "jiddiš"
+
+#~ msgid "Chinese"
+#~ msgstr "kiina"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "kiina (yksinkertaistettu)"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "kiina (perinteinen)"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "belgia"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "englanti (USA)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "englanti (Kanada)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "englanti (Irlanti)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "englanti (Iso-Britannia)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "englanti (amerikanenglanti)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "englanti (Kanada)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "englanti (Iso-Britannia)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "englanti (Iso-Britannia)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "englanti (Kanada)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "englanti (Iso-Britannia)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "Ranska (Kanada)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "Ranska (Kanada)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "Ranska (Kanada)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "Saksa (sveitsiläinen)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "Ranska (Kanada)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "Saksa (kuolleilla näppäimillä)"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "Saksa (sveitsiläinen)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "englanti (Australia)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "Saksa (sveitsiläinen)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "Saksa (sveitsiläinen)"
+
+#, fuzzy
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "portugali (Brasilia)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "portugali (Brasilia)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "espanja (latinalainen amerikka)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "espanja (latinalainen amerikka)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "espanja (latinalainen amerikka)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "espanja (latinalainen amerikka)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "espanja (latinalainen amerikka)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "espanja (CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "espanja (Mexico)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "malajalam"
+
+#~ msgid "Norwegian"
+#~ msgstr "norja"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "serbia"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "kiina (perinteinen)"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "kiina (perinteinen)"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "kiina (perinteinen)"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "kiina"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "kiina (yksinkertaistettu)"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "arabia (Egypti)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "arabia (Egypti)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "arabia (Egypti)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "arabia (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "arabia (Egypti)"
+
+#~ msgid "Other"
+#~ msgstr "Muu"
+
+#~ msgid "Unknown"
+#~ msgstr "Tuntematon"
+
+#~ msgid "English (US)"
+#~ msgstr "englanti (USA)"
+
+#~ msgid "Belgian"
+#~ msgstr "belgia"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "tšekki (qwerty)"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "Ranska (Sveitsi)"
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "Saksa (kuolleilla näppäimillä)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "portugali (Brasilia/US-aksenttimerkit)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "slovakia (qwerty)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "espanja (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "espanja (latinalainen amerikka)"
+
+#~ msgid "English (UK)"
+#~ msgstr "englanti (Iso-Britannia)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "Yksinkertaistetun/perinteisen kiinan muunnos"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "Muunna yksinkertaistetun ja perinteisen kiinan välillä"
+
+#~ msgid "SC-TC"
+#~ msgstr "yk-pk"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "Yksinkertaistetun/perinteisen kiinan muunnos"
+
+#~ msgid "No Conversion"
+#~ msgstr "Ei muunnosta"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "Yksinkertaistetusta perinteiseksi"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "Muunna yksinkertaistettu kiina perinteiseksi kiinaksi"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "Perinteisestä yksinkertaistetuksi"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "Muunna perinteisestä kiinasta yksinkertaistetuksi kiinaksi"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "yk->pk"
+
+#~ msgid "TC->SC"
+#~ msgstr "pk->yk"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "Smart Common Input Method -alusta "
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "Ota käyttöön"
+
+#~ msgid "Name"
+#~ msgstr "Nimi"
+
+#~ msgid "Cursor Position"
+#~ msgstr "Kohdistimen paikka"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "Syöttökohdistimen nykyinen paikka merkeissä."
+
+#~ msgid "Maximum length"
+#~ msgstr "Suurin pituus"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr ""
+#~ "Suurin määrä merkkejä tälle merkkijononäytölle. Nolla, jos ei aseteta."
+
+#~ msgid "Maximum width"
+#~ msgstr "Suurin leveys"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "Suurin leveys tälle merkkijononäytölle."
+
+#~ msgid "Has Frame"
+#~ msgstr "Reunus"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "FALSE poistaa ulkopuolisen reunan merkkijononäytöstä."
+
+#~ msgid "Draw cursor"
+#~ msgstr "Piirrä kohdistin"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "TRUE piirtää vilkkuvan kohdistimen."
+
+#~ msgid "Auto move cursor"
+#~ msgstr "Kohdistimen siirto"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr "TRUE siirtää kohdistinta automaattisesti hiiren napsautukseta."
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "Edelleenlähetä painikkeen painallus"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr "TRUE lähettää painikkeen painalluksen edelleen käyttäjäohjelmalle."
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "Muuta elementin kokoa merkkijonon mukaan"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "TRUE Automaattinen koon muuttaminen käytössä."
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr "TRUE siirtää kohdistinta automaattisesti hiiren napsautukseta."
+
+#~ msgid "Width in chars"
+#~ msgstr "Leveys merkeissä"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr "Merkkijononäyttöön jätettävän tyhjän tilan määrä merkeissä."
+
+#~ msgid "Scroll offset"
+#~ msgstr "Vieritysmäärä"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr "Merkkijonon vierityksen määrä pikseleissä"
+
+#~ msgid "Text"
+#~ msgstr "Teksti"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "Merkkijononäytön sisältö"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "Valitus _näppäimet:"
+
+#~ msgid "Key Code:"
+#~ msgstr "Näppäinkoodi:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "Pohjassa olevat näppäimet:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Ctrl"
+
+#~ msgid "A_lt"
+#~ msgstr "A_lt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Shift"
+
+#~ msgid "_Release"
+#~ msgstr "_Release"
+
+#~ msgid "_Meta"
+#~ msgstr "_Meta"
+
+#~ msgid "S_uper"
+#~ msgstr "S_uper"
+
+#~ msgid "_Hyper"
+#~ msgstr "_Hyper"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "Syötä näppäinkoodi ensin."
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "Paina näppäintä (tai näppäinyhdistelmää).\n"
+#~ "Tämä ikkuna sulkeutuu kun näppäin vapautetaan."
+
+#~ msgid "Grabbing a key."
+#~ msgstr "Odotetaan näppäintä."
+
+#~ msgid "Key Selection"
+#~ msgstr "Näppäimen valinta"
+
+#~ msgid "Orientation"
+#~ msgstr "Suunta"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "Ilmoitusalueen suunta."
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "Teksti"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "amhara"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Aina"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Valinnat"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "englanti/näppäimistö"
+
+#~ msgid "English/European"
+#~ msgstr "englanti/eurooppalainen"
+
+#~ msgid "RAW CODE"
+#~ msgstr "RAW CODE"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Pikanäppäimet:\n"
+#~ "\n"
+#~ " Ctrl+u:\n"
+#~ " vaihda monitavukoodauksen ja Unicoden välillä.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " palauta syöttötavan oletusarvot.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "Nykyisen syöttötavan tila. Napsauta vaihtaaksesi."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Globaalit asetukset"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Aseta yleiset kaikkien edustaohjelmien käyttämät asetukset, mukaanlukien "
+#~ "X11-, GTK-, IMModule-, QT IMModule-ohjelmat"
+
+#~ msgid "_Trigger:"
+#~ msgstr "_Liipaisin"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Valitse liipaisinnäppäimet"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat jotka ottavat käyttöön / poistavat käytöstä SCIM-"
+#~ "syöttötavan. Napsauta oikealla olevaa painiketta muokataksesi sitä."
+
+#~ msgid "Turn _On:"
+#~ msgstr "Ota _käyttöön"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Valitse \"ota käyttöön\"-näppäimet"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat jotka ottavat SCIM-syöttötavan käyttöön. Napsauta "
+#~ "oikealla olevaa painiketta muokataksesi sitä."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "_Poista käytöstä:"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Valitse \"poista käytöstä\"-näppäimet"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat jotka poistavat SCIM-syöttötavan käyttöstä. Napsauta "
+#~ "oikealla olevaa painiketta muokataksesi sitä."
+
+#~ msgid "_Next input method:"
+#~ msgstr "_Seuraava syöttötapa:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "Valitse \"seuraava syöttötapa\"-näppäimet"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat joilla vaihdetaan seuraavaan syöttötapaan. Napsauta "
+#~ "painiketta oikealla muokataksesi."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "_Edellinen syöttötapa:"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Valitse \"edellinen syöttötapa\"-näppäimet"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat joilla vaihdetaan edelliseen syöttötapaan. Napsauta "
+#~ "painiketta oikealla muokataksesi."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "Näytä syöttötapa_valikko"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "Valitse näppäimet joilla syöttötapavalikko näytetään"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat joilla syöttötapavalikko näytetään. Napsauta painiketta "
+#~ "oikealla muokataksesi."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "_Näppäimistöasettelu"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Valitse nykyinen näppäimistöasettelu tässä, jotta näppäimistöasettelusta "
+#~ "välittävät syöttötavat toimisivat oikein."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "_Sisällytä \"preedit\"-merkkijono asiakasikkunaan"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Jos tämä on valittu, \"preedit\"-merkkijono näytetään suoraan "
+#~ "asiakasikkunassa erillisen kelluvan ikkunan sijaan."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "_Jaa sama syöttötapa kaikkien ohjelmien kanssa"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Jos tämä on valittu, yhtä syöttötapaa käytetään kaikissa ohjelmissa. "
+#~ "Muutoin eri syöttötapa voidaan valita eri ohjelmille."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Pikanäppäimet"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Voit ottaa käyttöön / pois käytöstä syöttötapoja ja asettaa pikanäppäimiä "
+#~ "syöttötavoille."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Asennetut syöttötapapalvelut:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "Muokkaa _pikanäppäimiä"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "Muokkaa valittuun syöttötapaan liittyviä pikanäppäimiä."
+
+#~ msgid "Select _Filters"
+#~ msgstr "Valitse _suotimet"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "Valitse suotimet jotka liitetään tähän syöttötapaan."
+
+#~ msgid "_Expand"
+#~ msgstr "_Laajenna"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Laajenna kaikki kieliluokat"
+
+#~ msgid "_Collapse"
+#~ msgstr "_Supista"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Supista kaikki kieliluokat"
+
+#~ msgid "E_nable All"
+#~ msgstr "Ota _käyttöön kaikki"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Ottaa kaikki syöttötavat käyttöön."
+
+#~ msgid "_Disable All"
+#~ msgstr "_Poista käytöstä kaikki"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Poistaa kaikki syöttötavat käytöstä."
+
+#~ msgid "Filters"
+#~ msgstr "Suotimet"
+
+#~ msgid "Languages"
+#~ msgstr "Kielet"
+
+#~ msgid "Description"
+#~ msgstr "Kuvaus"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Muokkaa pikanäppäimiä: %s"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Valitse suotimet: %s"
+
+#~ msgid "Move _Up"
+#~ msgstr "Siirrä _ylös"
+
+#~ msgid "Move _Down"
+#~ msgstr "Siirrä _alas"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "GTK+-2.x-kirjastoon perustuva paneelisovellus"
+
+#~ msgid "On demand"
+#~ msgstr "Tarvittaessa"
+
+#~ msgid "Never"
+#~ msgstr "Ei koskaan"
+
+#~ msgid "ToolBar"
+#~ msgstr "Työkalupalkki"
+
+#~ msgid "_Show:"
+#~ msgstr "_Näytä:"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Automaattinen k_ohdistus"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Näytä _syöttötapakuvake"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "Näytä syöttätavan _nimi"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "Piilota aika_katkaisu"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Näytä _tikkukuvake"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Näytä _valikkokuvake"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Näytä o_hjekuvake"
+
+#~ msgid "Show _property label"
+#~ msgstr "Näytä ominaisuusnimi_ö"
+
+#~ msgid "Input window"
+#~ msgstr "Syöttöikkuna"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "S_ulautettu etsintätaulukko"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "_Pystysuuntainen etsintätaulukko"
+
+#~ msgid "Misc"
+#~ msgstr "Muut"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Näytä _ilmoitusalueen kuvake"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Koh_dista ikkunat"
+
+#~ msgid "_Font:"
+#~ msgstr "_Kirjasin:"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Jos valinta \"aina\" on valittu, työkalupalkki näytetään aina ruudulla. "
+#~ "Jos \"tarvittaessa\" on valittu, se näytetään vain SCIMin ollessa "
+#~ "aktiivisena. Valinnalla \"Never\" palkkia ei näytetä koskaan."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr "Jos tämä on valittu, työkalupalkki kohdistetaan ruudun reunaan."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "Työkalupalkki piilotetaan kun määritelty aika on kulunut. Tämä valinta on "
+#~ "kelvollinen vain jos \"Näytä aina\" on valittu. Aseta nollaksi "
+#~ "poistaaksesi piilotuksen käytöstä."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr "Jos tämä on valittu, syöttötapakuvake näytetään työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr "Jos tämä on valittu, syöttötavan nimi näytetään työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr "Jos tämä on valittu, kohdistuskuvake näytetään työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr "Jos tämä on valittu, valikkokuvake näytetään työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr "Jos tämä on valittu, ohjekuvake näytetään työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Jos tämä on valittu, syöttötapa-asetusten teksti näytetään "
+#~ "työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr "Jos tämä on valittu, etsintätaulukko sisällytetään syöttöikkunaan."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr "Jos tämä on valittu, etsintätaulukko näytetään pystysuuntaisesti."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Jos tämä on valittu, ilmoitusalueen kuvake näytetään työpöydän "
+#~ "työkalupalkissa"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Jos tämä on valittu, työkalupalkki, syöttö- ja etsintätaulukkoikkunat "
+#~ "kohdistetaan alkuperäisiin sijainteihinsa."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "Kirjasinasetusta käytetään syöttötapa- ja etsintätaulukkoikkunoihin."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Valitse käyttöliittymän kirjasin"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "Edustaohjelma"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMEngine"
+
+#~ msgid "Panel"
+#~ msgstr "Paneeli"
+
+#~ msgid "Extra"
+#~ msgstr "Ekstra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "SCIM syöttötapojen valinta"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Smart Common Input Method -alusta</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Graafinen asetusohjelma</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Asetukset moduulille \"%s\".</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Haluatko poistua SCIMin asetuksista?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Kaikkia asetuksia ei voida vaihtaa lennossa. Käynnistä SCIM uudelleen "
+#~ "ottaaksesi kaikki uudet asetukset käyttöön."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "SCIM-asetukset"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "GTK-elementtikirjastoon perustuva asetusohjelma."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "Asetusohjelma Smart Common Input Method -alustalle"
+
+#~ msgid "SCIM Help"
+#~ msgstr "SCIM-ohje"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Input Method"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Kohdista tai poista syöttöikkunan ja työkalurivun kohdistus."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "Näytä lyhyt ohje SCIMistä sekä nykyinen syöttötapa."
+
+#~ msgid "Show command menu."
+#~ msgstr "Näytä komentovalikko."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Lataa asetukset uudelleen"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Kohdista ikkunat"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Piilota työkalupalkki"
+
+#~ msgid "Help ..."
+#~ msgstr "Ohje ..."
+
+#~ msgid "Exit"
+#~ msgstr "Poistu"
--- /dev/null
+# translation of fr.po to French
+# This file is distributed under the same license as the scim package.
+# Copyright (C) 2004 James Su <suzhe@tsinghua.org.cn>.
+#
+# Damien Menanteau <MengDaming@nerdshack.com>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: fr\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 18:51+0900\n"
+"PO-Revision-Date: 2005-12-11 13:54+0800\n"
+"Last-Translator: Damien Menanteau <MengDaming@nerdshack.com>\n"
+"Language-Team: French\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Sélection de Touche"
+
+#, fuzzy
+#~ msgid "Selection"
+#~ msgstr "Sélection de Touche"
+
+#, fuzzy
+#~ msgid "Option"
+#~ msgstr "Options"
+
+#, fuzzy
+#~ msgid "General"
+#~ msgstr "Allemand"
+
+#, fuzzy
+#~ msgid "S/W keyboard"
+#~ msgstr "Français/Clavier"
+
+#, fuzzy
+#~ msgid "Keyboard option"
+#~ msgstr "Sélection de Touche"
+
+#, fuzzy
+#~ msgid "H/W keyboard"
+#~ msgstr "Français/Clavier"
+
+#, fuzzy
+#~ msgid "option"
+#~ msgstr "Options"
+
+#, fuzzy
+#~ msgid "Keyboard"
+#~ msgstr "Français/Clavier"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "Français/Clavier"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "Anglais (Etats-Unis)"
+
+#~ msgid "Amharic"
+#~ msgstr "Amharique"
+
+#~ msgid "Arabic"
+#~ msgstr "Arabe"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "Arabe (Egypte)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "Arabe (Liban)"
+
+#~ msgid "Assamese"
+#~ msgstr "Assamais"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "Azerbaïdjanais"
+
+#~ msgid "Belarusian"
+#~ msgstr "Biélorusse"
+
+#~ msgid "Bulgarian"
+#~ msgstr "Bulgare"
+
+#~ msgid "Bengali"
+#~ msgstr "Bengali"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "Bengali (Inde)"
+
+#~ msgid "Tibetan"
+#~ msgstr "Tibétain"
+
+#~ msgid "Bosnian"
+#~ msgstr "Bosniaque"
+
+#~ msgid "Catalan"
+#~ msgstr "Catalan"
+
+#~ msgid "Czech"
+#~ msgstr "Tchèque"
+
+#~ msgid "Welsh"
+#~ msgstr "Gallois"
+
+#~ msgid "Danish"
+#~ msgstr "Danois"
+
+#~ msgid "German"
+#~ msgstr "Allemand"
+
+#~ msgid "Divehi"
+#~ msgstr "Maldivien"
+
+#~ msgid "Greek"
+#~ msgstr "Grec"
+
+#~ msgid "English"
+#~ msgstr "Anglais"
+
+#~ msgid "English (Australian)"
+#~ msgstr "Anglais (Australie)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "Anglais (Canada)"
+
+#~ msgid "English (British)"
+#~ msgstr "Anglais (Royaume Uni)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "Anglais (Irlande)"
+
+#~ msgid "English (American)"
+#~ msgstr "Anglais (Etats-Unis)"
+
+#~ msgid "Spanish"
+#~ msgstr "Espagnol"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "Espagnol (Mexique)"
+
+#~ msgid "Estonian"
+#~ msgstr "Estonien"
+
+#~ msgid "Basque"
+#~ msgstr "Basque"
+
+#~ msgid "Persian"
+#~ msgstr "Perse"
+
+#~ msgid "Finnish"
+#~ msgstr "Finnois"
+
+#~ msgid "French"
+#~ msgstr "Français"
+
+#~ msgid "Irish"
+#~ msgstr "Irlandais"
+
+#~ msgid "Galician"
+#~ msgstr "Galicien"
+
+#~ msgid "Gujarati"
+#~ msgstr "Gujarati"
+
+#~ msgid "Hebrew"
+#~ msgstr "Hébreu"
+
+#~ msgid "Hindi"
+#~ msgstr "Hindou"
+
+#~ msgid "Croatian"
+#~ msgstr "Croate"
+
+#~ msgid "Hungarian"
+#~ msgstr "Hongrois"
+
+#~ msgid "Armenian"
+#~ msgstr "Arménien"
+
+#~ msgid "Interlingua"
+#~ msgstr "Interlingua"
+
+#~ msgid "Indonesian"
+#~ msgstr "Indonésien"
+
+#~ msgid "Icelandic"
+#~ msgstr "Islandais"
+
+#~ msgid "Italian"
+#~ msgstr "Italien"
+
+#~ msgid "Japanese"
+#~ msgstr "Japonais"
+
+#~ msgid "Georgian"
+#~ msgstr "Géorgien"
+
+#~ msgid "Kazakh"
+#~ msgstr "Kazakh"
+
+#~ msgid "Cambodian"
+#~ msgstr "Khmer"
+
+#~ msgid "Kannada"
+#~ msgstr "Kannara"
+
+#~ msgid "Korean"
+#~ msgstr "Coréen"
+
+#~ msgid "Laothian"
+#~ msgstr "Laotien"
+
+#~ msgid "Lithuanian"
+#~ msgstr "Lituanien"
+
+#~ msgid "Latvian"
+#~ msgstr "Letton"
+
+#~ msgid "Macedonian"
+#~ msgstr "Macédonien"
+
+#~ msgid "Malayalam"
+#~ msgstr "Malayalam"
+
+#~ msgid "Mongolian"
+#~ msgstr "Mongol"
+
+#~ msgid "Marathi"
+#~ msgstr "Marathi"
+
+#~ msgid "Malay"
+#~ msgstr "Malais"
+
+#~ msgid "Burmese"
+#~ msgstr "Birman"
+
+#~ msgid "Nepali"
+#~ msgstr "Népalais"
+
+#~ msgid "Dutch"
+#~ msgstr "Néerlandais"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "Norvégien (Nynorsk)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "Norvégien (Bokmal)"
+
+#~ msgid "Oriya"
+#~ msgstr "Oriya"
+
+#~ msgid "Punjabi"
+#~ msgstr "Punjabi"
+
+#~ msgid "Polish"
+#~ msgstr "Polonais"
+
+#~ msgid "Portuguese"
+#~ msgstr "Portugais"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "Portugais (Brésil)"
+
+#~ msgid "Romanian"
+#~ msgstr "Roumain"
+
+#~ msgid "Russian"
+#~ msgstr "Russe"
+
+#~ msgid "Sinhala"
+#~ msgstr "Singhalais"
+
+#~ msgid "Slovak"
+#~ msgstr "Slovaque"
+
+#~ msgid "Slovenian"
+#~ msgstr "Slovène"
+
+#~ msgid "Albanian"
+#~ msgstr "Albanais"
+
+#~ msgid "Serbian"
+#~ msgstr "Serbe"
+
+#~ msgid "Swedish"
+#~ msgstr "Suédois"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "Suédois (Finlande)"
+
+#~ msgid "Tamil"
+#~ msgstr "Tamoul"
+
+#~ msgid "Telugu"
+#~ msgstr "Telugu"
+
+#~ msgid "Thai"
+#~ msgstr "Thaï"
+
+#~ msgid "Turkish"
+#~ msgstr "Turc"
+
+#~ msgid "Uighur"
+#~ msgstr "Uighur"
+
+#~ msgid "Ukrainian"
+#~ msgstr "Ukrainien"
+
+#~ msgid "Urdu"
+#~ msgstr "Ourdou"
+
+#~ msgid "Uzbek"
+#~ msgstr "Ouzbèque"
+
+#~ msgid "Vietnamese"
+#~ msgstr "Vietnamien"
+
+#~ msgid "Walloon"
+#~ msgstr "Wallon"
+
+#~ msgid "Yiddish"
+#~ msgstr "Yiddish"
+
+#~ msgid "Chinese"
+#~ msgstr "Chinois"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "Chinois (simplifié)"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "Chinois (traditionnel)"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "Belge"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "Anglais (US)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "Anglais (Canada)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "Anglais (Irlande)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "Anglais (Royaume Uni)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "Anglais (Etats-Unis)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "Anglais (Canada)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "Anglais (Royaume Uni)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "Anglais (Royaume Uni)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "Anglais (Canada)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "Anglais (Royaume Uni)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "Français (Canada)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "Français (Canada)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "Français (Canada)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "Allemand (Suisse)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "Français (Canada)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "Allemand (avec touches mortes)"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "Allemand (Suisse)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "Anglais (Australie)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "Allemand (Suisse)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "Allemand (Suisse)"
+
+#, fuzzy
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "Portugais (Brésil)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "Portugais (Brésil)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "Espagnol (Amérique latine)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "Espagnol (Amérique latine)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "Espagnol (Amérique latine)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "Espagnol (Amérique latine)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "Espagnol (Amérique latine)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "Espagnol (CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "Espagnol (Mexique)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "Malayalam"
+
+#~ msgid "Norwegian"
+#~ msgstr "Norvégien"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "Serbe"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "Chinois (traditionnel)"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "Chinois (traditionnel)"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "Chinois (traditionnel)"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "Chinois"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "Chinois (simplifié)"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "Arabe (Egypte)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "Arabe (Egypte)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "Arabe (Egypte)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "Arabe (Liban)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "Arabe (Egypte)"
+
+#~ msgid "Other"
+#~ msgstr "Autre"
+
+#~ msgid "Unknown"
+#~ msgstr "Inconnu"
+
+#~ msgid "English (US)"
+#~ msgstr "Anglais (US)"
+
+#~ msgid "Belgian"
+#~ msgstr "Belge"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "Tchèque (qwerty)"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "Français (Suisse)"
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "Allemand (avec touches mortes)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "Portugais (Brésil accents US)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "Slovaque (qwerty)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "Espagnol (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "Espagnol (Amérique latine)"
+
+#~ msgid "English (UK)"
+#~ msgstr "Anglais (GB)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "Conversion Chinois Simplifié-Traditionnel"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "Conversion entre chinois simplifié et chinois traditionnel"
+
+#~ msgid "SC-TC"
+#~ msgstr "CS-CT"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "Conversion Chinois Simplifié-Traditionnel"
+
+#~ msgid "No Conversion"
+#~ msgstr "Pas de conversion"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "Simplifié vers Traditionnel"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "Conversion du chinois simplifié en chinois traditionnel"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "Traditionnel vers Simplifié"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "Conversion du chinois traditionnel en chinois simplifié"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "CS->CT"
+
+#~ msgid "TC->SC"
+#~ msgstr "CT->CS"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "Plateforme Smart Common Input Method"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ " :\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "Activer"
+
+#~ msgid "Name"
+#~ msgstr "Nom"
+
+#~ msgid "Cursor Position"
+#~ msgstr "Position du Curseur"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "Position courante du curseur d'insertion dans les caractères."
+
+#~ msgid "Maximum length"
+#~ msgstr "Longueur maximale"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr ""
+#~ "Nombre maximum de caractères pour cette vue de chaîne de caractères. Zero "
+#~ "si pas de maximum."
+
+#~ msgid "Maximum width"
+#~ msgstr "Largeur maximale"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "Largeur maximale de cette vue de chaîne de caractères."
+
+#~ msgid "Has Frame"
+#~ msgstr "Avec Cadre"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "FAUX supprime le cadre extérieur de la vue de chaîne de caractères."
+
+#~ msgid "Draw cursor"
+#~ msgstr "Affichage du curseur"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "VRAI Affichage d'un curseur clignotant."
+
+#~ msgid "Auto move cursor"
+#~ msgstr "Déplacement automatique du curseur"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr ""
+#~ "VRAI Déplacement automatique de la position du curseur sur clic de souris."
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "Transmission événement d'appui de bouton"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr ""
+#~ "VRAI Fait suivre les événements d'appui de bouton vers le programme "
+#~ "client."
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "Redimensionnement automatique à la taille de la chaîne"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "VRAI Redimensionnement automatique activé."
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr ""
+#~ "VRAI Déplacement automatique de la position du curseur sur clic de souris."
+
+#~ msgid "Width in chars"
+#~ msgstr "Largeur en caractères"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr ""
+#~ "Nombre de caractères à laisser vides dans la vue de chaîne de caractères."
+
+#~ msgid "Scroll offset"
+#~ msgstr "Décalage"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr ""
+#~ "Nombre de pixels de la vue de chaîne de caractères décalés à gauche en "
+#~ "dehors de l'écran"
+
+#~ msgid "Text"
+#~ msgstr "Texte"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "Le contenu de la vue de chaîne de caractères"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "_Touches Sélectionnées :"
+
+#~ msgid "Key Code:"
+#~ msgstr "Code Touche:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "Modificateurs:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Ctrl"
+
+#~ msgid "A_lt"
+#~ msgstr "_Alt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Maj"
+
+#~ msgid "_Release"
+#~ msgstr "_Relâche"
+
+#~ msgid "_Meta"
+#~ msgstr "_Meta"
+
+#~ msgid "S_uper"
+#~ msgstr "S_uper"
+
+#~ msgid "_Hyper"
+#~ msgstr "_Hyper"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "Veuillez d'abord entrer un code de touche."
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "Appuyer sur une touche (ou une combinaison de touches).\n"
+#~ "Cette fenêtre se fermera dès que la touche sera relâchée."
+
+#~ msgid "Grabbing a key."
+#~ msgstr "Capture de touche."
+
+#~ msgid "Key Selection"
+#~ msgstr "Sélection de Touche"
+
+#~ msgid "Orientation"
+#~ msgstr "Orientation"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "Orientation du tiroir."
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "Texte"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amharique"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Toujours"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Options"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Français/Clavier"
+
+#~ msgid "English/European"
+#~ msgstr "Français/Européen"
+
+#~ msgid "RAW CODE"
+#~ msgstr "CODE BRUT"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Racourcis :\n"
+#~ "\n"
+#~ " Ctrl+u :\n"
+#~ " bascule entre encodage Multi-octets et Unicode.\n"
+#~ "\n"
+#~ " Echap :\n"
+#~ " réinitialise la méthode de saisie.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "Etat de la méthode de saisie courante. Cliquer pour la modifier."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Configuration globale"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Configurer des options globales utilisées par tous les modules frontaux, "
+#~ "incluant le frontal X11, GTK IMModule, QT IMModule etc."
+
+#~ msgid "_Trigger:"
+#~ msgstr "_Déclencheur :"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Sélectionner les touches d'activation"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Touches pour activer/désactiver SCIM. Cliquer sur le bouton de droite "
+#~ "pour les modifier."
+
+#~ msgid "Turn _On:"
+#~ msgstr "_Activer:"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Sélectionner les touches d'activation"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Touches pour activer SCIM. Cliquer sur le bouton de droite pour les "
+#~ "modifier."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "Désac_tiver:"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Sélectionner les touches de désactivation"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Touches pour désactiver SCIM. Cliquer sur le bouton de droite pour les "
+#~ "modifier."
+
+#~ msgid "_Next input method:"
+#~ msgstr "Méthode de saisie _Suivante :"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "Sélectionner les touches pour la méthode de saisie suivante"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Touches pour aller à la méthode de saisie suivante. Cliquer sur le bouton "
+#~ "de droite pour les modifier."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "Méthode de saisie _Précédente :"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Sélectionner les touches pour la méthode de saisie précédente"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Touches pour revenir à la méthode de saisie précédente. Cliquer sur le "
+#~ "bouton de droite pour les modifier."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "Accès au _Menu des méthodes de saisie :"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr ""
+#~ "Sélectionner les touches pour accéder au menu des méthodes de saisie"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Touches pour accéder au menu des méthodes de saisie. Cliquer sur le "
+#~ "bouton de droite pour les modifier."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "_Type de Clavier:"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Indiquez ici le type de clavier que vous utilisez afin que les méthodes "
+#~ "de saisie qui dépendent du type de clavier puissent fonctionner "
+#~ "correctement."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "Insérer les chaîne en préédition dans la fenêtre cliente"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, la table de préédition est affichée "
+#~ "directement dans la fenêtre de saisie, et non pas dans une fenêtre "
+#~ "indépendante."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "_Partage de la même méthode de saisie entre toutes les applications"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, la même méthode de saisie peut être "
+#~ "utilisée par toutes les applications en même temps. Dans le cas "
+#~ "contraire, chaque application utilise sa propre méthode de saisie."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Raccourcis"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Ici, vous pouvez activer/désactiver les méthodes de saisie et les jeux de "
+#~ "raccourcis pour les méthodes de saisie."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Services de méthode de saisie installés :"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "Editer les _Raccourcis"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "Editer les raccourcis associés à la méthode de saisie sélectionnée."
+
+#~ msgid "Select _Filters"
+#~ msgstr "Sélectionner les _Filtres"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "Sélectionner les Filtres à associer à cette méthode de saisie."
+
+#~ msgid "_Expand"
+#~ msgstr "_Ouvrir"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Ouvrir toutes les catégories de langage."
+
+#~ msgid "_Collapse"
+#~ msgstr "_Refermer"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Fermer toutes les catégories de langage."
+
+#~ msgid "E_nable All"
+#~ msgstr "Tout Activer"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Activer toutes les méthodes de saisie."
+
+#~ msgid "_Disable All"
+#~ msgstr "Tout Désactiver"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Désactiver toutes les méthodes de saisie."
+
+#~ msgid "Filters"
+#~ msgstr "Filtres"
+
+#~ msgid "Languages"
+#~ msgstr "Langues"
+
+#~ msgid "Description"
+#~ msgstr "Description"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Editer les raccourcis pour %s"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Sélectionner les filtres pour %s"
+
+#~ msgid "Move _Up"
+#~ msgstr "_Monter"
+
+#~ msgid "Move _Down"
+#~ msgstr "_Descendre"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "Un panneau serveur basé sur la librairie GTK+-2.x."
+
+#~ msgid "On demand"
+#~ msgstr "A la demande"
+
+#~ msgid "Never"
+#~ msgstr "Jamais"
+
+#~ msgid "ToolBar"
+#~ msgstr "Barre d'Outils"
+
+#~ msgid "_Show:"
+#~ msgstr "_Afficher"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Aligne_ment automatique"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Affichage icône méthode de _saisie"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "Affichage _nom méthode de saisie"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "_Délai avant masquage :"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Affichage icône d'épin_glage fenêtre"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Afficher l'icône de m_enu"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Affichage icône d'_aide"
+
+#~ msgid "Show _property label"
+#~ msgstr "Affichage label de p_ropriété"
+
+#~ msgid "Input window"
+#~ msgstr "Fenêtre de saisie"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "Table de recherche _embarquée"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "Table de recherche _verticale"
+
+#~ msgid "Misc"
+#~ msgstr "Divers"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Affichage icône barre de _tâches"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Epinglage _fenêtres"
+
+#~ msgid "_Font:"
+#~ msgstr "P_olice :"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Quand l'option \"Toujours\" est sélectionnée, la barre d'outils est "
+#~ "affichée en permanence à l'écran. Quand l'option \"A la demande\" est "
+#~ "sélectionnée, la barre d'outils est affichée uniquement lorsque SCIM est "
+#~ "activé. Quand l'option \"Jamais\" estsélectionnée, la barre d'outils "
+#~ "n'est jamais affichée."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, la barre d'outil s'aligne "
+#~ "automatiquement sur le bord de l'écran."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "La barre d'outils sera masquée automatiquement après l'expiration de ce "
+#~ "délai. Cette option n'est valide que si l'option \"Afficher Toujours\" "
+#~ "est sélectionnée. Une valeur de délai de 0 supprime ce comportement."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, l'icône de la méthode de saisie est "
+#~ "inséré dans la barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, le nom de la méthode de saisie est "
+#~ "inséré dans la barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, l'icône d'épinglage de fenêtre est "
+#~ "inséré dans la barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, l'icône de menu est inséré dans la "
+#~ "barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, l'icône d'aide est inséré dans la "
+#~ "barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, le label des propriétés de la "
+#~ "méthode de saisie est inséré dans la barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, la table de recherche est embarquée "
+#~ "dans la fenêtre de saisie."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, la table de recherche est affichée "
+#~ "verticalement."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, l'icône est inséré dans la barre de "
+#~ "tâches du bureau."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, les fenêtres de saisie et de "
+#~ "recherche sont maintenues à leur position originale."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "La police de caractères configurée est utilisée dans les fenêtres de "
+#~ "saisie et de recherche."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Police de Caractères"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "Interface"
+
+#~ msgid "IMEngine"
+#~ msgstr "Moteur de Saisie"
+
+#~ msgid "Panel"
+#~ msgstr "Panneau"
+
+#~ msgid "Extra"
+#~ msgstr "Extra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Configuration de la Méthode de Saisie SCIM"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Plateforme Smart Common Input Method</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Utilitaire de Configuration</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Configuration des modules %s.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Etes vous sûr de vouloir quitter SCIM Config. ?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Certains des paramètres de configuration ne peuvent pas être pris en "
+#~ "compte automatiquement. N'oubliez pas de redémarrer SCIM afin que toutes "
+#~ "les nouvelles valeurs de configuration soient prises en compte."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Configuration de SCIM"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr ""
+#~ "Utilitaire de configuration intégré basé sur la librairie GTK Widget."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr ""
+#~ "Utilitaire de configuration de la plateforme \"Smart Common Input Method\""
+
+#~ msgid "SCIM Help"
+#~ msgstr "Aide SCIM"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Input Method"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Epingle la fenêtre de saisie et la barre d'outils."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr ""
+#~ "Affiche une aide succincte sur SCIM et la méthode de saisie courante."
+
+#~ msgid "Show command menu."
+#~ msgstr "Afficher le menu des commandes."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Recharger la Configuration"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Epingler les Fenêtres"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Masquer la Barre d'Outils"
+
+#~ msgid "Help ..."
+#~ msgstr "Aide ..."
+
+#~ msgid "Exit"
+#~ msgstr "Quitter"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "Fr"
--- /dev/null
+# translation of it.po to Italian
+# translation of scim.po to Italian
+# translation of scim_1_0-it.po to Italian
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Federico Zenith <zenith@chemeng.ntnu.no>, 2004, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: it\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 18:51+0900\n"
+"PO-Revision-Date: 2005-12-13 00:36+0100\n"
+"Last-Translator: Federico Zenith <zenith@chemeng.ntnu.no>\n"
+"Language-Team: Italian <kde-i18n-it@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.10.2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Selezione dei tasti"
+
+#, fuzzy
+#~ msgid "Selection"
+#~ msgstr "Selezione dei tasti"
+
+#, fuzzy
+#~ msgid "Option"
+#~ msgstr "Opzioni"
+
+#, fuzzy
+#~ msgid "Auto capitalization"
+#~ msgstr "Divisione automatica:"
+
+#, fuzzy
+#~ msgid "Auto period"
+#~ msgstr "Divisione automatica:"
+
+#, fuzzy
+#~ msgid "General"
+#~ msgstr "Generico"
+
+#, fuzzy
+#~ msgid "S/W keyboard"
+#~ msgstr "Inglese/Tastiera"
+
+#, fuzzy
+#~ msgid "Keyboard option"
+#~ msgstr "Selezione dei tasti"
+
+#, fuzzy
+#~ msgid "H/W keyboard"
+#~ msgstr "Inglese/Tastiera"
+
+#, fuzzy
+#~ msgid "option"
+#~ msgstr "Opzioni"
+
+#, fuzzy
+#~ msgid "Keyboard"
+#~ msgstr "Inglese/Tastiera"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "Inglese/Tastiera"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "Inglese (americano)"
+
+#~ msgid "Amharic"
+#~ msgstr "Amarico"
+
+#~ msgid "Arabic"
+#~ msgstr "Arabo"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "Arabo (Egitto)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "Arabo (Libano)"
+
+#~ msgid "Assamese"
+#~ msgstr "Assamese"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "Azerbaigiano"
+
+#~ msgid "Belarusian"
+#~ msgstr "Bielorusso"
+
+#~ msgid "Bulgarian"
+#~ msgstr "Bulgaro"
+
+#~ msgid "Bengali"
+#~ msgstr "Bengalese"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "Bengalese (India)"
+
+#~ msgid "Tibetan"
+#~ msgstr "Tibetano"
+
+#~ msgid "Bosnian"
+#~ msgstr "Bosniaco"
+
+#~ msgid "Catalan"
+#~ msgstr "Catalano"
+
+#~ msgid "Czech"
+#~ msgstr "Ceco"
+
+#~ msgid "Welsh"
+#~ msgstr "Gallese"
+
+#~ msgid "Danish"
+#~ msgstr "Danese"
+
+#~ msgid "German"
+#~ msgstr "Tedesco"
+
+#~ msgid "Greek"
+#~ msgstr "Greco"
+
+#~ msgid "English"
+#~ msgstr "Inglese"
+
+#~ msgid "English (Australian)"
+#~ msgstr "Inglese (australiano)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "Inglese (canadese)"
+
+#~ msgid "English (British)"
+#~ msgstr "Inglese (britannico)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "Inglese (Irlanda)"
+
+#~ msgid "English (American)"
+#~ msgstr "Inglese (americano)"
+
+#~ msgid "Spanish"
+#~ msgstr "Spagnolo"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "Spagnolo (Messico)"
+
+#~ msgid "Estonian"
+#~ msgstr "Estone"
+
+#~ msgid "Basque"
+#~ msgstr "Basco"
+
+#~ msgid "Persian"
+#~ msgstr "Persiano"
+
+#~ msgid "Finnish"
+#~ msgstr "Finlandese"
+
+#~ msgid "French"
+#~ msgstr "Francese"
+
+#~ msgid "Irish"
+#~ msgstr "Irlandese"
+
+#~ msgid "Galician"
+#~ msgstr "Galiziano"
+
+#~ msgid "Gujarati"
+#~ msgstr "Gujarati"
+
+#~ msgid "Hebrew"
+#~ msgstr "Ebraico"
+
+#~ msgid "Hindi"
+#~ msgstr "Hindi"
+
+#~ msgid "Croatian"
+#~ msgstr "Croato"
+
+#~ msgid "Hungarian"
+#~ msgstr "Ungherese"
+
+#, fuzzy
+#~ msgid "Armenian"
+#~ msgstr "Romeno"
+
+#~ msgid "Interlingua"
+#~ msgstr "Interlingua"
+
+#~ msgid "Indonesian"
+#~ msgstr "Indonesiano"
+
+#~ msgid "Icelandic"
+#~ msgstr "Islandese"
+
+#~ msgid "Italian"
+#~ msgstr "Italiano"
+
+#~ msgid "Japanese"
+#~ msgstr "Giapponese"
+
+#, fuzzy
+#~ msgid "Georgian"
+#~ msgstr "Tedesco"
+
+#~ msgid "Kazakh"
+#~ msgstr "Kazako"
+
+#~ msgid "Cambodian"
+#~ msgstr "Cambogiano"
+
+#~ msgid "Kannada"
+#~ msgstr "Kannada"
+
+#~ msgid "Korean"
+#~ msgstr "Coreano"
+
+#~ msgid "Laothian"
+#~ msgstr "Laotiano"
+
+#~ msgid "Lithuanian"
+#~ msgstr "Lituano"
+
+#~ msgid "Latvian"
+#~ msgstr "Lettone"
+
+#~ msgid "Macedonian"
+#~ msgstr "Macedone"
+
+#~ msgid "Malayalam"
+#~ msgstr "Malayalam"
+
+#~ msgid "Mongolian"
+#~ msgstr "Mongolo"
+
+#~ msgid "Marathi"
+#~ msgstr "Marathi"
+
+#~ msgid "Malay"
+#~ msgstr "Malese"
+
+#, fuzzy
+#~ msgid "Burmese"
+#~ msgstr "Sfoglia"
+
+#~ msgid "Nepali"
+#~ msgstr "Nepalese"
+
+#~ msgid "Dutch"
+#~ msgstr "Olandese"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "Norvegese (nynorsk)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "Norvegese (bokmål)"
+
+#~ msgid "Oriya"
+#~ msgstr "Oriya"
+
+#~ msgid "Punjabi"
+#~ msgstr "Punjabi"
+
+#~ msgid "Polish"
+#~ msgstr "Polacco"
+
+#~ msgid "Portuguese"
+#~ msgstr "Portoghese"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "Portoghese (Brasile)"
+
+#~ msgid "Romanian"
+#~ msgstr "Romeno"
+
+#~ msgid "Russian"
+#~ msgstr "Russo"
+
+#~ msgid "Slovak"
+#~ msgstr "Slovacco"
+
+#~ msgid "Slovenian"
+#~ msgstr "Sloveno"
+
+#~ msgid "Albanian"
+#~ msgstr "Albanese"
+
+#~ msgid "Serbian"
+#~ msgstr "Serbo"
+
+#~ msgid "Swedish"
+#~ msgstr "Svedese"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "Svedese (Finlandia)"
+
+#~ msgid "Tamil"
+#~ msgstr "Tamil"
+
+#~ msgid "Telugu"
+#~ msgstr "Telugu"
+
+#~ msgid "Thai"
+#~ msgstr "Tailandese"
+
+#~ msgid "Turkish"
+#~ msgstr "Turco"
+
+#~ msgid "Uighur"
+#~ msgstr "Uighur"
+
+#~ msgid "Ukrainian"
+#~ msgstr "Ucraino"
+
+#~ msgid "Urdu"
+#~ msgstr "Urdu"
+
+#~ msgid "Uzbek"
+#~ msgstr "Uzbeko"
+
+#~ msgid "Vietnamese"
+#~ msgstr "Vietnamita"
+
+#~ msgid "Walloon"
+#~ msgstr "Vallone"
+
+#~ msgid "Yiddish"
+#~ msgstr "Yiddish"
+
+#~ msgid "Chinese"
+#~ msgstr "Cinese"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "Cinese (semplificato)"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "Cinese (tradizionale)"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "Belga"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "Inglese (USA)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "Inglese (canadese)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "Inglese (Irlanda)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "Inglese (britannico)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "Inglese (americano)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "Inglese (canadese)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "Inglese (britannico)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "Inglese (britannico)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "Inglese (canadese)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "Inglese (britannico)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "Francese (canadese)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "Francese (canadese)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "Francese (canadese)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "Tedesco (svizzero)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "Francese (canadese)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "Tedesco (con tasti morti)"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "Tedesco (svizzero)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "Inglese (australiano)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "Tedesco (svizzero)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "Tedesco (svizzero)"
+
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "Portoghese (brasiliano)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "Portoghese (Brasile)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "Spagnolo (America latina)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "Spagnolo (America latina)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "Spagnolo (America latina)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "Spagnolo (America latina)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "Spagnolo (America latina)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "Spagnolo (CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "Spagnolo (Messico)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "Malayalam"
+
+#~ msgid "Norwegian"
+#~ msgstr "Norvegese"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "Serbo"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "Cinese (tradizionale)"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "Cinese (tradizionale)"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "Cinese (tradizionale)"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "Cinese"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "Cinese (semplificato)"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "Arabo (Egitto)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "Arabo (Egitto)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "Arabo (Egitto)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "Arabo (Libano)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "Arabo (Egitto)"
+
+#~ msgid "Other"
+#~ msgstr "Altro"
+
+#~ msgid "Unknown"
+#~ msgstr "Sconosciuto"
+
+#~ msgid "English (US)"
+#~ msgstr "Inglese (USA)"
+
+#~ msgid "Belgian"
+#~ msgstr "Belga"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "Ceco (qwerty)"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "Francese (Svizzera)"
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "Tedesco (con tasti morti)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "Portoghese (Brasile con accenti US)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "Slovacco (qwerty)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "Spagnolo (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "Spagnolo (America latina)"
+
+#~ msgid "English (UK)"
+#~ msgstr "Inglese (GB)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "Conversione tra cinese semplificato e tradizionale"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "Converti tra cinese semplificato e cinese tradizionale"
+
+#~ msgid "SC-TC"
+#~ msgstr "CS-CT"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "Conversione tra cinese semplificato e tradizionale"
+
+#~ msgid "No Conversion"
+#~ msgstr "Senza conversione"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "Da semplificato a tradizionale"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "Converti cinese semplificato in cinese tradizionale"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "Da tradizionale a semplificato"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "Converti cinese tradizionale in cinese semplificato"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "CS->CT"
+
+#~ msgid "TC->SC"
+#~ msgstr "CT->CS"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "Piattaforma del metodo intelligente di inserimento comune"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "Abilita"
+
+#~ msgid "Name"
+#~ msgstr "Nome"
+
+#~ msgid "Cursor Position"
+#~ msgstr "Posizione del cursore"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "La posizione attuale del cursore di inserimento in caratteri."
+
+#~ msgid "Maximum length"
+#~ msgstr "Lunghezza massima"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr ""
+#~ "Il numero massimo di caratteri per questa vista stringhe. Zero se non ce "
+#~ "n'è."
+
+#~ msgid "Maximum width"
+#~ msgstr "Larghezza massima"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "Larghezza massima di questa vista stringhe."
+
+#~ msgid "Has Frame"
+#~ msgstr "Ha cornice"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "Se falso, rimuove la cornice esterna dalla vista stringhe."
+
+#~ msgid "Draw cursor"
+#~ msgstr "Disegna cursore"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "Se vero, disegna un cursore lampeggiante."
+
+#~ msgid "Auto move cursor"
+#~ msgstr "Spostamento automatico del cursore"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr ""
+#~ "Se vero, sposta automaticamente la posizione del cursore quando si fa "
+#~ "clic con il mouse."
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "Inoltra evento di pressione di pulsante"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr ""
+#~ "Se vero, inoltra evento di pressione di pulsante al programma utente."
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "Ridimensiona automaticamente l'oggetto per adattarsi alla stringa"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "Se vero, attiva il ridimensionamento automatico."
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr ""
+#~ "Se vero, sposta automaticamente la posizione del cursore quando si fa "
+#~ "clic con il mouse."
+
+#~ msgid "Width in chars"
+#~ msgstr "Larghezza in caratteri"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr "Numero di caratteri per cui lasciare spazio nella vista stringhe."
+
+#~ msgid "Scroll offset"
+#~ msgstr "Scostamento dello scorrimento"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr ""
+#~ "Numero di pixel nella vista stringhe scorsi a sinistra dello schermo"
+
+#~ msgid "Text"
+#~ msgstr "Testo"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "Il contenuti della vista stringhe"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "Tasti sele_zionati:"
+
+#~ msgid "Key Code:"
+#~ msgstr "Codice del tasto:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "Modificatori:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Ctrl"
+
+#~ msgid "A_lt"
+#~ msgstr "A_lt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Shift"
+
+#~ msgid "_Release"
+#~ msgstr "_Rilascio"
+
+#~ msgid "_Meta"
+#~ msgstr "_Meta"
+
+#~ msgid "S_uper"
+#~ msgstr "S_uper"
+
+#~ msgid "_Hyper"
+#~ msgstr "_Hyper"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "Inserisci prima un codice del tasto."
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "Premi un tasto (o una combinazione di tasti).\n"
+#~ "Questa finestra sarà chiusa quando il tasto sarà rilasciato."
+
+#~ msgid "Grabbing a key."
+#~ msgstr "Cattura di un tasto."
+
+#~ msgid "Key Selection"
+#~ msgstr "Selezione dei tasti"
+
+#~ msgid "Orientation"
+#~ msgstr "Orientazione"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "L'orientazione del vassoio."
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "Testo"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amarico"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Sempre"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Opzioni"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Inglese/Tastiera"
+
+#~ msgid "English/European"
+#~ msgstr "Inglese/Europeo"
+
+#~ msgid "RAW CODE"
+#~ msgstr "CODICE GREZZO"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Tasti rapidi:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " passa tra la codifica multibyte e Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reimposta il metodo di inserimento.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "Lo stato del metodo di inserimento attuale. Fai clic per cambiarlo."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Configurazione globale"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Configura le opzioni globali usate da tutti i moduli di interfaccia, "
+#~ "inclusi l'interfaccia X11, i moduli di inserimento di GTK e QT, ecc."
+
+#~ msgid "_Trigger:"
+#~ msgstr "A_ttivatore:"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Seleziona i tasti di attivazione"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per accendere o spegnere il metodo di "
+#~ "inserimento. Fai clic sul pulsante a destra per modificarle."
+
+#~ msgid "Turn _On:"
+#~ msgstr "_Accendi:"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Seleziona i tasti di accensione"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per far partire il metodo di inserimento. Fai "
+#~ "clic sul pulsante a destra per modificarle."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "_Spegni:"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Seleziona i tasti di spegnimento"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per far fermare il metodo di inserimento. Fai "
+#~ "clic sul pulsante a destra per modificarle."
+
+#~ msgid "_Next input method:"
+#~ msgstr "Metodo di i_nserimento successivo:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "Seleziona i tasti del metodo di inserimento successivo"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per passare al metodo di inserimento successivo. "
+#~ "Fai clic sul pulsante a destra per modificarle."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "Metodo di inserimento _precedente:"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Seleziona i tasti del metodo di inserimento precedente"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per passare al metodo di inserimento precedente. "
+#~ "Fai clic sul pulsante a destra per modificarle."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "_Mostra il menu del metodo di inserimento:"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "Seleziona i tasti del menu del metodo di inserimento"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per mostrare il menu del metodo di inserimento. "
+#~ "Fai clic sul pulsante sulla destra per modificarle."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "Schema della _tastiera:"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Dovresti scegliere qui la tastiera che usi adesso, in modo che i metodi "
+#~ "di inserimento, che ne dipendono, funzionino correttamente."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "Incorpora la pr_emodifica delle stringhe nella finestra del client"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la stringa di premodifica sarà visualizzata "
+#~ "direttamente nella finestra di inserimento del client, piuttosto che in "
+#~ "una finestra libera."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "Condividi lo _stesso metodo di inserimento in tutte le applicazioni"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, si potrà usare un solo metodo di inserimento "
+#~ "in tutte le applicazioni allo stesso tempo. Altrimenti, ogni applicazione "
+#~ "potrà usare un metodo di inserimento diverso."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Tasti rapidi"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Qui puoi abilitare o disabilitare i metodi di inserimento e impostare i "
+#~ "loro tasti rapidi."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "I servizi di metodo di inserimento installati:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "Modi_fica tasti rapidi"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr ""
+#~ "Modifica i tasti rapidi associati con il metodo di inserimento "
+#~ "selezionato."
+
+#~ msgid "Select _Filters"
+#~ msgstr "Seleziona _filtri"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr ""
+#~ "Seleziona i filtri che saranno allegati a questo metodo di inserimento."
+
+#~ msgid "_Expand"
+#~ msgstr "_Espandi"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Espandi tutte le categorie delle lingue."
+
+#~ msgid "_Collapse"
+#~ msgstr "_Contrai"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Contrai tutte le categorie delle lingue."
+
+#~ msgid "E_nable All"
+#~ msgstr "A_bilita tutti"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Abilita tutti i metodi di inserimento."
+
+#~ msgid "_Disable All"
+#~ msgstr "_Disabilita tutti"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Disabilita tutti i metodi di inserimento."
+
+#~ msgid "Filters"
+#~ msgstr "Filtri"
+
+#~ msgid "Languages"
+#~ msgstr "Lingue"
+
+#~ msgid "Description"
+#~ msgstr "Descrizione"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Modifica i tasti rapidi per: %s"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Seleziona i filtri per: %s"
+
+#~ msgid "Move _Up"
+#~ msgstr "Sposta in s_u"
+
+#~ msgid "Move _Down"
+#~ msgstr "Sposta in _giù"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "Un demone di pannello basato sulle librerie GTK+-2.x."
+
+#~ msgid "On demand"
+#~ msgstr "A richiesta"
+
+#~ msgid "Never"
+#~ msgstr "Mai"
+
+#~ msgid "ToolBar"
+#~ msgstr "Barra degli strumenti"
+
+#~ msgid "_Show:"
+#~ msgstr "Mo_stra:"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Agga_ncia automaticamente"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Mostra icona del metodo di _inserimento"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "Mostra nome del metodo di ins_erimento"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "Nasc_ondi scadenza:"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Mostra icona dell'agganciamen_to"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Mostra icona del m_enu"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Mostra icona dell'ai_uto"
+
+#~ msgid "Show _property label"
+#~ msgstr "Mostra etichetta delle _proprietà"
+
+#~ msgid "Input window"
+#~ msgstr "Finestra di inserimento"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "Tabella di riferi_mento incorporata"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "Tabella di riferimento _verticale"
+
+#~ msgid "Misc"
+#~ msgstr "Varie"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Mostra icona del vasso_io"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Aggancia _finestre"
+
+#~ msgid "_Font:"
+#~ msgstr "_Carattere:"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Se l'opzione \"Sempre\" è segnata, la barra degli strumenti sarà sempre "
+#~ "visualizzata sullo schermo. Se è segnata l'opzione \"A richiesta\", sarà "
+#~ "mostrata solo quando viene attivato SCIM. Se è segnata l'opzione \"Mai\", "
+#~ "non sarà mai mostrata."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la barra degli strumenti sarà agganciata al "
+#~ "bordo dello schermo."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "La barra degli strumenti sarà nascosta dopo che sarà passato questo "
+#~ "tempo. Questa opzione è valida solo quando \"Visualizza sempre\" è "
+#~ "segnato. Imposta a zero per disabilitare questo comportamento."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'icona del metodo di inserimento sarà "
+#~ "mostrata nella barra degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, il nome del metodo di inserimento sarà "
+#~ "mostrato nella barra degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'icona dell'agganciamento sarà mostrata "
+#~ "sulla barra degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'icona del menu sarà mostrata nella barra "
+#~ "degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'icona dell'aiuto sarà mostrata nella barra "
+#~ "degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'etichetta di testo del metodo di "
+#~ "inserimento sarà mostrata nella barra degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la tabella di riferimento sarà incorporata "
+#~ "nella finestra di inserimento."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la tabella di riferimento sarà mostrata "
+#~ "verticalmente."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'icona del vassoio sarà mostrata nel "
+#~ "pannello del desktop."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la barra degli strumenti, le finestre di "
+#~ "inserimento e della tabella di riferimento saranno agganciate alla loro "
+#~ "posizione originale."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "L'impostazione del carattere sarà usata nelle finestre di inserimento e "
+#~ "della tabella di riferimento."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Seleziona il carattere dell'interfaccia"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "Interfaccia"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMEngine"
+
+#~ msgid "Panel"
+#~ msgstr "Pannello"
+
+#~ msgid "Extra"
+#~ msgstr "Extra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Configurazione del metodo di inserimento SCIM"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ "<span size=\"20000\">Piattaforma del metodo di inserimento comune "
+#~ "intelligente</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Programma di configurazione GUI</"
+#~ "span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">La configurazione per %s moduli.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Sei sicuro di uscire dalla configurazione di SCIM?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Non tutte le configurazioni possono essere ricaricate al volo. Non "
+#~ "dimenticarti di riavviare SCIM per permettere a tutte le nuove "
+#~ "configurazioni di avere effetto."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Configurazione di SCIM"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr ""
+#~ "Strumento di configurazione integrato basato sulla libreria di oggetti "
+#~ "GTK."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr ""
+#~ "Programma di configurazione per il metodo inserimento comune intelligente"
+
+#~ msgid "SCIM Help"
+#~ msgstr "Aiuto di SCIM"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Metodo inserimento comune intelligente"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr ""
+#~ "Aggancia o sgancia la finestra di inserimento e la barra degli strumenti."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr ""
+#~ "Visualizza un breve aiuto su SCIM e il metodo di inserimento attuale."
+
+#~ msgid "Show command menu."
+#~ msgstr "Mostra menu dei comandi."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Ricarica configurazione"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Aggancia finestre"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Nascondi la barra degli strumenti"
+
+#~ msgid "Help ..."
+#~ msgstr "Aiuto..."
+
+#~ msgid "Exit"
+#~ msgstr "Esci"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "En"
+
+#, fuzzy
+#~ msgid "_Switch input method globally"
+#~ msgstr "Mostra icona del metodo di _inserimento"
+
+#~ msgid "Preedit String mode"
+#~ msgstr "Modalità di premodifica delle stringhe"
+
+#~ msgid "X Window"
+#~ msgstr "X Window"
+
+#~ msgid "A FrontEnd module for X11R6 Window System, using XIM Protocol."
+#~ msgstr ""
+#~ "Un modulo di interfaccia per il sistema X11R6 X Window, usando il "
+#~ "protocollo XIM."
+
+#~ msgid "XIM Settings"
+#~ msgstr "Impostazioni XIM"
+
+#~ msgid "_On The Spot"
+#~ msgstr "Al v_olo"
+
+#~ msgid ""
+#~ "If this option is checked, the OnTheSpot input style will be used when "
+#~ "the client supports it."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, sarà usato lo stile di inserimento al volo "
+#~ "quando il client lo supporterà."
+
+#, fuzzy
+#~ msgid "Slovene"
+#~ msgstr "Sloveno"
+
+#~ msgid "Full/Half Letter"
+#~ msgstr "Lettera piena/mezza"
+
+#~ msgid "Full/Half Punct"
+#~ msgstr "Punteggiatura piena/mezza"
+
+#~ msgid ""
+#~ "The input mode of the letters. Click to toggle between half and full."
+#~ msgstr ""
+#~ "La modalità di inserimento delle lettere. Fai clic per passare tra mezza "
+#~ "a piena."
+
+#~ msgid ""
+#~ "The input mode of the puncutations. Click to toggle between half and full."
+#~ msgstr ""
+#~ "La modalità di inserimento della punteggiatura. Fai clic per passare tra "
+#~ "mezza a piena."
+
+#~ msgid ""
+#~ " Switch between full/half width letter mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " Passa tra le modalità delle lettere a larghezza piena/mezza.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Switch between full/half width punctuation mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " Passa tra le modalità della punteggiatura a larghezza piena/mezza\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Switch between Forward/Input mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " Passa tra le modalità di inoltro/inserimento.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Add a new phrase.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " Aggiungi una nuova frase.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Delete the selected phrase.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Elimina la frase selezionata.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Control+Down:\n"
+#~ " Move lookup cursor to next shorter phrase\n"
+#~ " Only available when LongPhraseFirst option is set.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Control+giù:\n"
+#~ " Sposta il cursore di ricerca alla frase più corta successiva\n"
+#~ " Disponibile solo quanto l'opzione FraseLungaPrima è impostata.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Control+Up:\n"
+#~ " Move lookup cursor to previous longer phrase\n"
+#~ " Only available when LongPhraseFirst option is set.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Control+su:\n"
+#~ " Sposta il cursore di ricerca alla frase più lunga precedente\n"
+#~ " Disponibile solo quanto l'opzione FraseLungaPrima è impostata.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Esc:\n"
+#~ " reimposta il metodo di inserimento.\n"
+#~ "\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "How to add a phrase:\n"
+#~ " Input the new phrase as normal, then press the\n"
+#~ " hot key. A hint will be shown to let you input a key\n"
+#~ " for this phrase.\n"
+#~ " Input a key then press the space bar.\n"
+#~ " A hint will be shown to indicate whether\n"
+#~ " the phrase was added sucessfully.\n"
+#~ msgstr ""
+#~ "Come aggiungere una frase:\n"
+#~ " Inserisci la frase come normale, quindi premi il\n"
+#~ " tasto rapido. Sarà mostrato un suggerimento per\n"
+#~ " permetterti di inserire un tasto per questa frase.\n"
+#~ " Inserisci un tasto e premi la barra spaziatrice.\n"
+#~ " Sarà mostrato un suggerimento per indicare se\n"
+#~ " la frase è stata aggiunta correttamente.\n"
+
+#~ msgid "Input a key string for phrase: "
+#~ msgstr "Inserisci una stringa di tasti per la frase: "
+
+#~ msgid "Success."
+#~ msgstr "Riuscito."
+
+#~ msgid "Failed."
+#~ msgstr "Non riuscito."
+
+#~ msgid ""
+#~ "Too few argument!\n"
+#~ "Usage:\n"
+#~ " scim-make-table <table_file> [options]\n"
+#~ "\n"
+#~ " table_file\tthe table file for table module\n"
+#~ " -b\t\tconvert to binary format, otherwise to text format\n"
+#~ " -o output\tsave new table to file output\n"
+#~ " -no\t\tdo not save new phrase table\n"
+#~ " -if ifreq\tload phrase frequencies from this file\n"
+#~ " -of ofreq\tsave phrase frequencies to this file\n"
+#~ " -s file\tspecifiy the source file to count phrase ages.\n"
+#~ msgstr ""
+#~ "Troppi pochi argomenti!\n"
+#~ "Uso:\n"
+#~ " scim-make-table <file_tabella> [opzioni]\n"
+#~ "\n"
+#~ " file_tabella\til file tabella per il modulo tabella\n"
+#~ " -b\t\tconverti a formato binario, altrimenti in formato testuale\n"
+#~ " -o output\tsalva la nuova tabella al file di output\n"
+#~ " -no\t\tnon salvare la nuova tabella delle frasi\n"
+#~ " -if ifreq\tcarica le frequenze delle frasi da questo file\n"
+#~ " -of ofreq\tsalva le frequenze delle frasi in questo file\n"
+#~ " -s file\tspecifica il file sorgente per contare l'età delle frasi.\n"
+
+#~ msgid "option -no cannot be used with -o\n"
+#~ msgstr "l'opzione -no non può essere usata con -o\n"
+
+#~ msgid "option -o cannot be used with -no\n"
+#~ msgstr "l'opzione -o non può essere usata con -no\n"
+
+#~ msgid "No argument for option "
+#~ msgstr "Nessun argomento per l'opzione "
+
+#~ msgid "Invalid option: "
+#~ msgstr "Opzione non valida: "
+
+#~ msgid "Loading table file "
+#~ msgstr "Caricamento del file tabella "
+
+#~ msgid " ...\n"
+#~ msgstr " ...\n"
+
+#~ msgid "table file load failed!"
+#~ msgstr "caricamento del file tabella non riuscito!"
+
+#~ msgid "Saving frequency table file "
+#~ msgstr "Salvataggio della tabella di frequenza "
+
+#~ msgid "frequency table file load failed!"
+#~ msgstr "caricamento del file tabella di frequenza non riuscito!"
+
+#~ msgid "Saving table file "
+#~ msgstr "Salvataggio del file tabella "
+
+#~ msgid "Table file save failed!"
+#~ msgstr "Salvataggio del file tabella non riuscito!"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ "Hot keys:\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ "Tasti rapidi:\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " open/close the input method.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ ":\n"
+#~ " apri/chiudi il metodo di inserimento.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " switch to the next input method.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ ":\n"
+#~ " passa al metodo di inserimento successivo.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " switch to the previous input method.\n"
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ " passa al metodo di inserimento precedente.\n"
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Generic Table"
+#~ msgstr "Tabella generica"
+
+#~ msgid "An IMEngine Module which uses generic table input method file."
+#~ msgstr ""
+#~ "Un modulo IMEngine che usa un file di metodo di inserimento con tabella "
+#~ "generica."
+
+#~ msgid "Full width _punctuation:"
+#~ msgstr "_Punteggiatura a larghezza piena:"
+
+#~ msgid "Select full width puncutation keys"
+#~ msgstr "Seleziona i tasti della punteggiatura a larghezza piena"
+
+#~ msgid ""
+#~ "The key events to switch full/half width punctuation input mode. Click on "
+#~ "the button on the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per passare tra le modalità di inserimento con "
+#~ "punteggiatura a larghezza piena/mezza. Fai clic sul pulsante a destra per "
+#~ "modificarle."
+
+#~ msgid "Full width _letter:"
+#~ msgstr "_Lettera a larghezza piena:"
+
+#~ msgid "Select full width letter keys"
+#~ msgstr "Seleziona i tasti delle lettere a larghezza piena"
+
+#~ msgid ""
+#~ "The key events to switch full/half width letter input mode. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per passare tra le modalità di inserimento con "
+#~ "lettere a larghezza piena/mezza. Fai clic sul pulsante a destra per "
+#~ "modificarle."
+
+#~ msgid "_Mode switch:"
+#~ msgstr "Cambio di _modalità:"
+
+#~ msgid "Select mode switch keys"
+#~ msgstr "Seleziona i tasti per il cambio di modalità"
+
+#~ msgid ""
+#~ "The key events to change current input mode. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per cambiare la modalità di inserimento attuale. "
+#~ "Fai clic sul pulsante a destra per cambiarle."
+
+#~ msgid "_Add phrase:"
+#~ msgstr "_Aggiungi frase:"
+
+#~ msgid "Select add phrase keys."
+#~ msgstr "Seleziona i tasti per aggiungere frasi."
+
+#~ msgid ""
+#~ "The key events to add a new user defined phrase. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per aggiungere una nuova frase definita "
+#~ "dall'utente. Fai clic sul pulsante a destra per cambiarle."
+
+#~ msgid "_Delete phrase:"
+#~ msgstr "_Elimina frase:"
+
+#~ msgid "Select delete phrase keys."
+#~ msgstr "Seleziona i tasti per eliminare frasi."
+
+#~ msgid ""
+#~ "The key events to delete a selected phrase. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per eliminare una frase selezionata. Fai clic "
+#~ "sul pulsante a destra per cambiarle."
+
+#~ msgid "Show _prompt"
+#~ msgstr "Mostra _prompt"
+
+#~ msgid "Show key _hint"
+#~ msgstr "Mostra su_ggerimento del tasto"
+
+#~ msgid "Save _user table in binary format"
+#~ msgstr "Salva la tabella dell'_utente in formato binario"
+
+#~ msgid "Show the u_ser defined phrases first"
+#~ msgstr "Mo_stra prima le frasi definite dall'utente"
+
+#~ msgid "Show the _longer phrases first"
+#~ msgstr "Mostra prima le frasi più _lunghe"
+
+#~ msgid ""
+#~ "If this option is checked, the key prompt of the currently selected "
+#~ "phrase will be shown."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, sarà mostrato il prompt del tasto della "
+#~ "frase attualmente selezionata."
+
+#~ msgid ""
+#~ "If this option is checked, the remaining keystrokes of the phraseswill be "
+#~ "shown on the lookup table."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, i tasti rimanenti della frase saranno "
+#~ "mostrati nella tabella di riferimento."
+
+#~ msgid ""
+#~ "If this option is checked, the user table will be stored with binary "
+#~ "format, this will increase the loading speed."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la tabella dell'utente sarà salvata in "
+#~ "formato binario; ciò aumenterà la velocità di caricamento."
+
+#~ msgid ""
+#~ "If this option is checked, the user defined phrases will be shown in "
+#~ "front of others. "
+#~ msgstr ""
+#~ "Se questa opzione è segnata, le frasi definite dall'utente saranno "
+#~ "mostrate prima delle altre. "
+
+#~ msgid ""
+#~ "If this option is checked, the longer phrase will be shown in front of "
+#~ "others. "
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la frasi più lunghe saranno mostrate prima "
+#~ "delle altre. "
+
+#~ msgid "The installed tables:"
+#~ msgstr "La tabelle installate:"
+
+#~ msgid "_Install"
+#~ msgstr "_Installa"
+
+#~ msgid "Install a new table."
+#~ msgstr "Installa una nuova tabella."
+
+#~ msgid "_Delete"
+#~ msgstr "_Elimina"
+
+#~ msgid "Delete the selected table."
+#~ msgstr "Elimina la tabella selezionata."
+
+#~ msgid "_Properties"
+#~ msgstr "_Proprietà"
+
+#~ msgid "Edit the properties of the selected table."
+#~ msgstr "Modifica le proprietà della tabella selezionata."
+
+#~ msgid "Table Management"
+#~ msgstr "Gestione delle tabelle"
+
+#~ msgid "Select an icon file"
+#~ msgstr "Seleziona un file icone"
+
+#~ msgid "User"
+#~ msgstr "Utente"
+
+#~ msgid "System"
+#~ msgstr "Sistema"
+
+#~ msgid "Please select the table file to be installed."
+#~ msgstr "Per piacere seleziona il file tabella da installare."
+
+#~ msgid "Failed to install the table! It's already in table file directory."
+#~ msgstr ""
+#~ "Installazione della tabella non riuscita. È già nella cartella dei file "
+#~ "tabella."
+
+#~ msgid "Failed to load the table file!"
+#~ msgstr "Caricamento del file tabella non riuscito."
+
+#~ msgid ""
+#~ "Failed to install the table! Another version of this table was already "
+#~ "installed."
+#~ msgstr ""
+#~ "Installazione della tabella non riuscita. Un'altra versione di questa "
+#~ "tabella era già installata."
+
+#~ msgid ""
+#~ "Another version of this table was already installed. Do you want to "
+#~ "replace it with the new one?"
+#~ msgstr ""
+#~ "Un'altra versione di questa tabella era già installata. Vuoi sostituirla "
+#~ "con la nuova?"
+
+#~ msgid ""
+#~ "Failed to install the table! A table with the same file name was already "
+#~ "installed."
+#~ msgstr ""
+#~ "Installazione della tabella non riuscita. Una tabella con lo stesso nome "
+#~ "del file era già installata."
+
+#~ msgid ""
+#~ "A table with the same file name was already installed. Do you want to "
+#~ "overwrite it?"
+#~ msgstr ""
+#~ "Una tabella con lo stesso nome del file era già installata. Vuoi "
+#~ "sovrascriverla?"
+
+#~ msgid "Failed to install the table to %s!"
+#~ msgstr "Installazione della tabella in %s non riuscita."
+
+#~ msgid "Can not delete the file %s!"
+#~ msgstr "Impossibile eliminare il file %s."
+
+#~ msgid "Are you sure to delete this table file?"
+#~ msgstr "Sei sicuro di voler eliminare questo file tabella?"
+
+#~ msgid "Failed to delete the table file!"
+#~ msgstr "Eliminazione del file tabella non riuscita."
+
+#~ msgid "True"
+#~ msgstr "Vero"
+
+#~ msgid "False"
+#~ msgstr "Falso"
+
+#~ msgid "Split Keys:"
+#~ msgstr "Tasti di divisione:"
+
+#~ msgid "The key strokes to split inputed string."
+#~ msgstr "I tasti per dividere la stringa inserita."
+
+#~ msgid "Commit Keys:"
+#~ msgstr "Tasti di consegna:"
+
+#~ msgid "The key strokes to commit converted result to client."
+#~ msgstr "I tasti per consegnare il risultato convertito al client."
+
+#~ msgid "Forward Keys:"
+#~ msgstr "Tasti di inoltro:"
+
+#~ msgid "The key strokes to forward inputed string to client."
+#~ msgstr "I tasti per inoltrare la stringa inserita al client."
+
+#~ msgid "The key strokes to select candidate phrases in lookup table."
+#~ msgstr ""
+#~ "I tasti per selezionare delle frasi candidate nella tabella di "
+#~ "riferimento."
+
+#~ msgid "Page Up Keys:"
+#~ msgstr "Tasti pagina su:"
+
+#~ msgid "The lookup table page up keys"
+#~ msgstr "I tasti pagina su della tabella di riferimento"
+
+#~ msgid "Page Down Keys:"
+#~ msgstr "Tasti pagina giù:"
+
+#~ msgid "The lookup table page down keys"
+#~ msgstr "I tasti pagina giù della tabella di riferimento"
+
+#~ msgid "Table Properties"
+#~ msgstr "Proprietà della tabella"
+
+#~ msgid "Name:"
+#~ msgstr "Nome:"
+
+#~ msgid "The name of this table."
+#~ msgstr "Il nome di questa tabella."
+
+#~ msgid "Author:"
+#~ msgstr "Autore:"
+
+#~ msgid "The author of this table."
+#~ msgstr "L'autore di questa tabella."
+
+#~ msgid "UUID:"
+#~ msgstr "UUID:"
+
+#~ msgid "The unique ID of this table."
+#~ msgstr "L'ID univoca di questa tabella."
+
+#~ msgid "Serial Number:"
+#~ msgstr "Numero seriale:"
+
+#~ msgid "The serial number of this table."
+#~ msgstr "Il numero seriale di questa tabella."
+
+#~ msgid "Icon File:"
+#~ msgstr "File icone:"
+
+#~ msgid "The icon file of this table."
+#~ msgstr "Il file icone di questa tabella."
+
+#~ msgid "Supported Languages:"
+#~ msgstr "Lingue supportate:"
+
+#~ msgid "The languages supported by this table."
+#~ msgstr "Le lingue supportate da questa tabella."
+
+#~ msgid "Status Prompt:"
+#~ msgstr "Prompt di stato:"
+
+#~ msgid "A prompt string to be shown in status area."
+#~ msgstr "Una stringa di prompt da visualizzare nell'area di stato."
+
+#~ msgid "Valid Input Chars:"
+#~ msgstr "Caratteri di inserimento validi:"
+
+#~ msgid "The valid input chars of this table."
+#~ msgstr "I caratteri di inserimento validi di questa tabella."
+
+#~ msgid "Multi Wildcard Char:"
+#~ msgstr "Carattere jolly multiplo:"
+
+#~ msgid ""
+#~ "The multi wildcard chars of this table. These chars can be used to match "
+#~ "one or more arbitrary chars."
+#~ msgstr ""
+#~ "I caratteri jolly multipli di questa tabella. Questi caratteri possono "
+#~ "essere usati per corrispondere a uno o più caratteri arbitrari."
+
+#~ msgid "Single Wildcard Char:"
+#~ msgstr "Carattere jolly singolo:"
+
+#~ msgid ""
+#~ "The single wildcard chars of this table.These chars can be used to match "
+#~ "one arbitrary char."
+#~ msgstr ""
+#~ "I caratteri jolly singoli di questa tabella. Questi caratteri possono "
+#~ "essere usati per corrispondere a un carattere arbitrario."
+
+#~ msgid "Max Key Length:"
+#~ msgstr "Lunghezza massima dei tasti:"
+
+#~ msgid "The maxmium length of key strings."
+#~ msgstr "La lunghezza massima delle stringhe di tasti."
+
+#~ msgid "Show Key Prompt:"
+#~ msgstr "Mostra prompt del tasto:"
+
+#~ msgid "If true then the key prompts will be shown instead of the raw keys."
+#~ msgstr ""
+#~ "Se vero, saranno mostrati i prompt dei tasti invece dei tasti grezzi."
+
+#~ msgid "Auto Select:"
+#~ msgstr "Selezione automatica:"
+
+#~ msgid ""
+#~ "If true then the first candidate phrase will be selected automatically "
+#~ "when inputing the next key."
+#~ msgstr ""
+#~ "Se vero, la prima frase candidata sarà selezionata automaticamente quando "
+#~ "si inserisce il prossimo tasto."
+
+#~ msgid "Auto Wildcard:"
+#~ msgstr "Jolly automatico:"
+
+#~ msgid ""
+#~ "If true then a multi wildcard char will be append to the end of inputed "
+#~ "key string when searching phrases."
+#~ msgstr ""
+#~ "Se vero, un carattere jolly multiplo sarà aggiunto alla fine della "
+#~ "stringa di tasti inseriti quando si cercano le frasi."
+
+#~ msgid "Auto Commit:"
+#~ msgstr "Consegna automatica:"
+
+#~ msgid ""
+#~ "If true then the converted result string will be committed to client "
+#~ "automatically."
+#~ msgstr ""
+#~ "Se vero, la stringa risultante convertita sarà automaticamente consegnata "
+#~ "al client."
+
+#~ msgid ""
+#~ "If true then the inputed key string will be splitted automatically when "
+#~ "necessary."
+#~ msgstr ""
+#~ "Se vero, la stringa di tasti inserita sarà divisa automaticamente quando "
+#~ "necessario."
+
+#~ msgid "Discard Invalid Key:"
+#~ msgstr "Scarta tasto non valido:"
+
+#~ msgid ""
+#~ "If true then the invalid key will be discarded automatically.This option "
+#~ "is only valid when Auto Select and Auto Commit is true."
+#~ msgstr ""
+#~ "Se vero, il tasto non valido sarà scartato automaticamente. Questa "
+#~ "opzione è valida solo quando sono vere la selezione e la consegna "
+#~ "automatiche."
+
+#~ msgid "Dynamic Adjust:"
+#~ msgstr "Regolazione dinamica:"
+
+#~ msgid "If true then the phrases' frequencies will be adjusted dynamically."
+#~ msgstr "Se vero, le frequenze delle frasi saranno regolate dinamicamente."
+
+#~ msgid "Auto Fill Preedit Area:"
+#~ msgstr "Riempimento automatico dell'area di premodifica:"
+
+#~ msgid ""
+#~ "If true then the preedit string will be filled up with the current "
+#~ "candiate phrase automatically.This option is only valid when Auto Select "
+#~ "is TRUE."
+#~ msgstr ""
+#~ "Se vero, la stringa di premodifica sarà riempita automaticamente con la "
+#~ "frase candidata attuale. Questa opzione è valida solo quando la selezione "
+#~ "automatica è vera."
+
+#~ msgid "Always Show Lookup Table:"
+#~ msgstr "Mostra sempre la tabella di riferimento:"
+
+#~ msgid ""
+#~ "If true then the lookup table will always be shown when any candidate "
+#~ "phrase is available. Otherwise the lookup table will only be shown when "
+#~ "necessary.\n"
+#~ "If Auto Fill is false, then this option will be no effect, and always be "
+#~ "true."
+#~ msgstr ""
+#~ "Se vero, la tabella di riferimento sarà sempre visualizzata quando "
+#~ "qualsiasi frase candidata sarà disponibile. Altrimenti la tabella di "
+#~ "riferimento sarà visualizzata solo quando necessario.\n"
+#~ "Se il riempimento automatico è falso, questa opzione non avrà effetto, e "
+#~ "sarà sempre vera."
+
+#~ msgid "Default Full Width Punct:"
+#~ msgstr "Punteggiatura predefinita a larghezza piena:"
+
+#~ msgid "If true then full width punctuations will be inputed by default."
+#~ msgstr ""
+#~ "Se vero, saranno inseriti segni di punteggiatura a larghezza piena come "
+#~ "impostazione predefinita."
+
+#~ msgid "Default Full Width Letter:"
+#~ msgstr "Lettere predefinite a larghezza piena:"
+
+#~ msgid "If true then full width letters will be inputed by default."
+#~ msgstr ""
+#~ "Se vero, saranno inserite lettere a larghezza piena come impostazione "
+#~ "predefinita."
+
+#~ msgid "Invalid icon file."
+#~ msgstr "File icone non valido."
+
+#~ msgid "Invalid languages."
+#~ msgstr "Lingue non valide."
+
+#~ msgid "Invalid status prompt."
+#~ msgstr "Prompt di stato non valido."
+
+#~ msgid "Invalid multi wildcard chars."
+#~ msgstr "Caratteri jolly multipli non validi."
+
+#~ msgid "Invalid single wildcard chars."
+#~ msgstr "Caratteri jolly singoli non validi."
+
+#~ msgid "Invalid commit keys."
+#~ msgstr "Tasti di consegna non validi."
+
+#~ msgid "Invalid select keys."
+#~ msgstr "Tasti di selezione non validi."
+
+#~ msgid "Invalid page up keys."
+#~ msgstr "Tasti pagina su non validi."
+
+#~ msgid "Invalid page down keys."
+#~ msgstr "Tasti pagina giù non validi."
+
+#~ msgid "Invalid max key length."
+#~ msgstr "Lunghezza massima dei tasti non valida."
+
+#~ msgid "Failed to save table %s!"
+#~ msgstr "Salvataggio della tabella %s non riuscito!"
+
+#~ msgid "Failed to load any Config Modules!"
+#~ msgstr "Caricamento di qualsiasi modulo di configurazione non riuscito."
+
+#~ msgid "_Current Config Module:"
+#~ msgstr "Modulo di _configurazione attuale:"
+
+#~ msgid "<Not found>"
+#~ msgstr "<Non trovato>"
+
+#~ msgid "Current Config Module has been changed to %s."
+#~ msgstr "Il modulo di configurazione attuale è stato cambiato in %s."
+
+#~ msgid "Start the SCIM Setup Utility."
+#~ msgstr "Avvia il programma di configurazione di SCIM."
+
+#~ msgid "Setup ..."
+#~ msgstr "Configurazione..."
--- /dev/null
+# Japanese translation for SCIM
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# James Su <suzhe@tsinghua.org.cn>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ja\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 18:51+0900\n"
+"PO-Revision-Date: 2005-12-11 11:00+0900\n"
+"Last-Translator: Yukiko Bando <ybando@k6.dion.ne.jp>\n"
+"Language-Team: Japanese <ja@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.3.1\n"
+
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "キー選択"
+
+#, fuzzy
+#~ msgid "Selection"
+#~ msgstr "キー選択"
+
+#, fuzzy
+#~ msgid "Option"
+#~ msgstr "オプション"
+
+#, fuzzy
+#~ msgid "Auto capitalization"
+#~ msgstr "自動スプリット:"
+
+#, fuzzy
+#~ msgid "Auto period"
+#~ msgstr "自動スプリット:"
+
+#, fuzzy
+#~ msgid "General"
+#~ msgstr "全般"
+
+#, fuzzy
+#~ msgid "S/W keyboard"
+#~ msgstr "英語/キーボード"
+
+#, fuzzy
+#~ msgid "Keyboard option"
+#~ msgstr "キー選択"
+
+#, fuzzy
+#~ msgid "H/W keyboard"
+#~ msgstr "英語/キーボード"
+
+#, fuzzy
+#~ msgid "option"
+#~ msgstr "オプション"
+
+#, fuzzy
+#~ msgid "Keyboard"
+#~ msgstr "英語/キーボード"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "英語/キーボード"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "英語(アメリカ)"
+
+#~ msgid "Amharic"
+#~ msgstr "アムハラ語"
+
+#~ msgid "Arabic"
+#~ msgstr "アラビア語"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "アラビア語(エジプト)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "アラビア語(レバノン)"
+
+#~ msgid "Assamese"
+#~ msgstr "アッサム語"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "アゼルバイジャン語"
+
+#~ msgid "Belarusian"
+#~ msgstr "白ロシア語"
+
+#~ msgid "Bulgarian"
+#~ msgstr "ブルガリア語"
+
+#~ msgid "Bengali"
+#~ msgstr "ベンガル語"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "ベンガル語(インド)"
+
+#~ msgid "Tibetan"
+#~ msgstr "チベット語"
+
+#~ msgid "Bosnian"
+#~ msgstr "ボスニア語"
+
+#~ msgid "Catalan"
+#~ msgstr "カタロニア語"
+
+#~ msgid "Czech"
+#~ msgstr "チェコ語"
+
+#~ msgid "Welsh"
+#~ msgstr "ウェールズ語"
+
+#~ msgid "Danish"
+#~ msgstr "デンマーク語"
+
+#~ msgid "German"
+#~ msgstr "ドイツ語"
+
+#~ msgid "Greek"
+#~ msgstr "ギリシャ語"
+
+#~ msgid "English"
+#~ msgstr "英語"
+
+#~ msgid "English (Australian)"
+#~ msgstr "英語(オーストラリア)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "英語(カナダ)"
+
+#~ msgid "English (British)"
+#~ msgstr "英語(イギリス)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "英語(アイルランド)"
+
+#~ msgid "English (American)"
+#~ msgstr "英語(アメリカ)"
+
+#~ msgid "Spanish"
+#~ msgstr "スペイン語"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#~ msgid "Estonian"
+#~ msgstr "エストニア語"
+
+#~ msgid "Basque"
+#~ msgstr "バスク語"
+
+#~ msgid "Persian"
+#~ msgstr "ペルシア語"
+
+#~ msgid "Finnish"
+#~ msgstr "フィンランド語"
+
+#~ msgid "French"
+#~ msgstr "フランス語"
+
+#~ msgid "Irish"
+#~ msgstr "アイルランド語"
+
+#~ msgid "Galician"
+#~ msgstr "ガリシア語"
+
+#~ msgid "Gujarati"
+#~ msgstr "グジャラート語"
+
+#~ msgid "Hebrew"
+#~ msgstr "ヘブライ語"
+
+#~ msgid "Hindi"
+#~ msgstr "ヒンディー語"
+
+#~ msgid "Croatian"
+#~ msgstr "クロアチア語"
+
+#~ msgid "Hungarian"
+#~ msgstr "ハンガリー語"
+
+#, fuzzy
+#~ msgid "Armenian"
+#~ msgstr "ルーマニア語"
+
+#~ msgid "Interlingua"
+#~ msgstr "インターリングア"
+
+#~ msgid "Indonesian"
+#~ msgstr "インドネシア語"
+
+#~ msgid "Icelandic"
+#~ msgstr "アイスランド語"
+
+#~ msgid "Italian"
+#~ msgstr "イタリア語"
+
+#~ msgid "Japanese"
+#~ msgstr "日本語"
+
+#, fuzzy
+#~ msgid "Georgian"
+#~ msgstr "ドイツ語"
+
+#~ msgid "Kazakh"
+#~ msgstr "カザフスタン語"
+
+#~ msgid "Cambodian"
+#~ msgstr "クメール語"
+
+#~ msgid "Kannada"
+#~ msgstr "カンナダ語"
+
+#~ msgid "Korean"
+#~ msgstr "ハングル"
+
+#~ msgid "Laothian"
+#~ msgstr "ラオス語"
+
+#~ msgid "Lithuanian"
+#~ msgstr "リトアニア語"
+
+#~ msgid "Latvian"
+#~ msgstr "ラトヴィア語"
+
+#~ msgid "Macedonian"
+#~ msgstr "マケドニア語"
+
+#~ msgid "Malayalam"
+#~ msgstr "マラヤーラム語"
+
+#~ msgid "Mongolian"
+#~ msgstr "モンゴル語"
+
+#~ msgid "Marathi"
+#~ msgstr "マラーティー語"
+
+#~ msgid "Malay"
+#~ msgstr "マレー語"
+
+#, fuzzy
+#~ msgid "Burmese"
+#~ msgstr "ブラウズ"
+
+#~ msgid "Nepali"
+#~ msgstr "ネパール語"
+
+#~ msgid "Dutch"
+#~ msgstr "オランダ語"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "ノルウェー語(ニューノルスク)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "ノルウェー語(ボックモール)"
+
+#~ msgid "Oriya"
+#~ msgstr "オリヤー語"
+
+#~ msgid "Punjabi"
+#~ msgstr "パンジャブ語"
+
+#~ msgid "Polish"
+#~ msgstr "ポーランド語"
+
+#~ msgid "Portuguese"
+#~ msgstr "ポルトガル語"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "ポルトガル語(ブラジル)"
+
+#~ msgid "Romanian"
+#~ msgstr "ルーマニア語"
+
+#~ msgid "Russian"
+#~ msgstr "ロシア語"
+
+#~ msgid "Slovak"
+#~ msgstr "スロバキア語"
+
+#~ msgid "Slovenian"
+#~ msgstr "スロベニア語"
+
+#~ msgid "Albanian"
+#~ msgstr "アルバニア語"
+
+#~ msgid "Serbian"
+#~ msgstr "セルビア語"
+
+#~ msgid "Swedish"
+#~ msgstr "スウェーデン語"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "スウェーデン語(フィンランド)"
+
+#~ msgid "Tamil"
+#~ msgstr "タミル語"
+
+#~ msgid "Telugu"
+#~ msgstr "テルグ語"
+
+#~ msgid "Thai"
+#~ msgstr "タイ語"
+
+#~ msgid "Turkish"
+#~ msgstr "トルコ語"
+
+#~ msgid "Uighur"
+#~ msgstr "ウィグル語"
+
+#~ msgid "Ukrainian"
+#~ msgstr "ウクライナ語"
+
+#~ msgid "Urdu"
+#~ msgstr "ウルドゥー語"
+
+#~ msgid "Uzbek"
+#~ msgstr "ウズベク語"
+
+#~ msgid "Vietnamese"
+#~ msgstr "ベトナム語"
+
+#~ msgid "Walloon"
+#~ msgstr "ワロン語"
+
+#~ msgid "Yiddish"
+#~ msgstr "イディッシュ語"
+
+#~ msgid "Chinese"
+#~ msgstr "中国語"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "簡体中国語"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "繁体中国語"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "ベルギー"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "英語(US)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "英語(カナダ)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "英語(アイルランド)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "英語(イギリス)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "英語(アメリカ)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "英語(カナダ)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "英語(イギリス)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "英語(イギリス)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "英語(カナダ)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "英語(イギリス)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "フランス語(カナダ)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "フランス語(カナダ)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "フランス語(カナダ)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "ドイツ語(スイス)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "フランス語(カナダ)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "ドイツ語(deadkeyあり)"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "ドイツ語(スイス)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "英語(オーストラリア)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "ドイツ語(スイス)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "ドイツ語(スイス)"
+
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "ポルトガル語(ブラジル)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "ポルトガル語(ブラジル)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "スペイン語(ラテンアメリカ)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "スペイン語(ラテンアメリカ)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "スペイン語(ラテンアメリカ)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "スペイン語(ラテンアメリカ)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "スペイン語(ラテンアメリカ)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "スペイン語(CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "スペイン語(メキシコ)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "マラヤーラム語"
+
+#~ msgid "Norwegian"
+#~ msgstr "ノルウェー語"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "セルビア語"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "繁体中国語"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "繁体中国語"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "繁体中国語"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "中国語"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "簡体中国語"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "アラビア語(エジプト)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "アラビア語(エジプト)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "アラビア語(エジプト)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "アラビア語(レバノン)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "アラビア語(エジプト)"
+
+#~ msgid "Other"
+#~ msgstr "その他"
+
+#~ msgid "Unknown"
+#~ msgstr "不明"
+
+#~ msgid "English (US)"
+#~ msgstr "英語(US)"
+
+#~ msgid "Belgian"
+#~ msgstr "ベルギー"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "チェコ語(qwerty)"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "フランス語(スイス)"
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "ドイツ語(deadkeyあり)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "ポルトガル語(ブラジルUSアクセント)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "スロバキア語(qwerty)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "スペイン語(CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "スペイン語(ラテンアメリカ)"
+
+#~ msgid "English (UK)"
+#~ msgstr "英語(UK)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "簡体-繁体中国語相互変換"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "簡体中国語と繁体中国語を相互変換する"
+
+#~ msgid "SC-TC"
+#~ msgstr "簡体-繁体"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "簡体-繁体中国語相互変換"
+
+#~ msgid "No Conversion"
+#~ msgstr "変換しない"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "簡体から繁体へ"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "簡体中国語を繁体中国語に変換する"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "繁体から簡体へ"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "繁体中国語を簡体中国語に変換する"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "簡体->繁体"
+
+#~ msgid "TC->SC"
+#~ msgstr "繁体->簡体"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "Smart Common Input Method platform"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "有効にする"
+
+#~ msgid "Name"
+#~ msgstr "名称"
+
+#~ msgid "Cursor Position"
+#~ msgstr "カーソル位置"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "現在のカーソル位置"
+
+#~ msgid "Maximum length"
+#~ msgstr "最大の長さ"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr ""
+#~ "String viewウィジェットの最大表示文字数。無制限の場合は0を指定して下さい。"
+
+#~ msgid "Maximum width"
+#~ msgstr "最大幅"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "String viewウィジェットの最大表示幅"
+
+#~ msgid "Has Frame"
+#~ msgstr "フレーム有りかどうか"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "FALSEを指定した場合、文字表示ウィジェットの縁取りを描画しません。"
+
+#~ msgid "Draw cursor"
+#~ msgstr "カーソルを描画する"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "TRUEを指定した場合、カーソルを点滅させます。"
+
+#~ msgid "Auto move cursor"
+#~ msgstr "カーソルの自動移動"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr ""
+#~ "TRUEを指定した場合、マウスクリックされた位置にカーソルが移動します。"
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "マウスボタンのイベントを送る"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr "TRUEの場合はマウスボタンのイベントをユーザプログラムに送ります。"
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "文字列に合わせてウィジェットのサイズを自動調整"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "TRUEを指定した、場合はウィジェットサイズを自動的に調整します。"
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr ""
+#~ "TRUEを指定した場合、マウスクリックされた位置にカーソルが移動します。"
+
+#~ msgid "Width in chars"
+#~ msgstr "文字の幅"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr "String viewウィジェットに表示する文字数"
+
+#~ msgid "Scroll offset"
+#~ msgstr "スクロールオフセット"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr "String viewウィジェットが画面左端に畳み込まれた際の表示ピクセル数"
+
+#~ msgid "Text"
+#~ msgstr "テキスト"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "String viewウィジェットの内容"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "設定済のキー:"
+
+#~ msgid "Key Code:"
+#~ msgstr "キーコード:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "モディファイア:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Ctrl"
+
+#~ msgid "A_lt"
+#~ msgstr "A_lt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Shift"
+
+#~ msgid "_Release"
+#~ msgstr "リリース(_R)"
+
+#~ msgid "_Meta"
+#~ msgstr "_Meta"
+
+#~ msgid "S_uper"
+#~ msgstr "S_uper"
+
+#~ msgid "_Hyper"
+#~ msgstr "_Hyper"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "キーコードを先に入力して下さい。"
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "キー(もしくは複数のキーの組合せ)を押して下さい。\n"
+#~ "キーをリリースするとこのダイアログは閉じます。"
+
+#~ msgid "Grabbing a key."
+#~ msgstr "キー選択"
+
+#~ msgid "Key Selection"
+#~ msgstr "キー選択"
+
+#~ msgid "Orientation"
+#~ msgstr "方向"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "トレイの方向"
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "テキスト"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "アムハラ語"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "常に"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "オプション"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "英語/キーボード"
+
+#~ msgid "English/European"
+#~ msgstr "英語/ヨーロッパ言語"
+
+#~ msgid "RAW CODE"
+#~ msgstr "RAW CODE"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "ホットキー:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " マルチバイトエンコード/ユニコードの切替え\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " 入力メソッドをリセット\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "現在の入力モード。変更するにはここをクリックして下さい。"
+
+#~ msgid "Unicode"
+#~ msgstr "ユニコード"
+
+#~ msgid "Global Setup"
+#~ msgstr "全体設定"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "全てのフロントエンドモジュール(X11 FrontEnd/GTK-Immoduele/Qt-Immoduleを含"
+#~ "む)で使用する全体オプションを設定"
+
+#~ msgid "_Trigger:"
+#~ msgstr "開始/終了(_T):"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "開始/終了キーの設定"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "入力メソッドを開始/終了するキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "Turn _On:"
+#~ msgstr "開始(_O):"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "開始キーの設定"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "入力メソッドを開始するキー。変更する場合は\n"
+#~ "右のボタンをクリックして下さい。"
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "終了(_F):"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "終了キーの設定"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "入力メソッドを終了するキー。変更する場合は\n"
+#~ "右のボタンをクリックして下さい。"
+
+#~ msgid "_Next input method:"
+#~ msgstr "次の入力メソッド(_N):"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "次の入力メソッドキーの設定"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "次の入力メソッドに切替えるキー。変更する場合は\n"
+#~ "右のボタンをクリックして下さい。"
+
+#~ msgid "_Previous input method:"
+#~ msgstr "前の入力メソッド(_P):"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "前の入力メソッドキーの設定"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "前の入力メソッドに切替えるキー。変更する場合は\n"
+#~ "右のボタンをクリックして下さい。"
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "入力メソッドメニューを表示(_M):"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "入力メソッドメニュー表示キーの設定"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "入力メソッドメニューを表示させるキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "キーボード配列(_K):"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "キーボード配列を認識する入力メソッドが正しく動作するように、現在使用されて"
+#~ "いるキーボード配列を選んでください。"
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "未確定文字列を入力対象クライアントのウィンドウに表示(_E)"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "このオプションを有効にすると、未確定文字列は独立した入力ウィンドウにではな"
+#~ "く入力対象クライアントに直接表示されます。"
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "全てのアプリケーションで同一入力メソッドを使用(_S)"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "このオプションを有効にすると、同一の入力メソッドを全てのアプリケーションで"
+#~ "使用できるようになります。アプリケーションごとに別々の入力メソッドを使用す"
+#~ "る場合はこのオプションを無効にして下さい。"
+
+#~ msgid "Hotkeys"
+#~ msgstr "ホットキー"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr "入力メソッドの有効/無効とホットキーの設定を行います。"
+
+#~ msgid "The installed input method services:"
+#~ msgstr "インストールされている入力メソッド:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "ホットキー(_H)"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "この入力メソッドに切り替えるホットキーを編集"
+
+#~ msgid "Select _Filters"
+#~ msgstr "フィルター(_F)"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "この入力メソッドで使用するフィルターを選択"
+
+#~ msgid "_Expand"
+#~ msgstr "開く(_E)"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "全ての言語グループを展開する"
+
+#~ msgid "_Collapse"
+#~ msgstr "閉じる(_C)"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "全ての言語グループを閉じる"
+
+#~ msgid "E_nable All"
+#~ msgstr "全て有効(_N)"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "全ての入力メソッドを有効にする"
+
+#~ msgid "_Disable All"
+#~ msgstr "全て無効(_D)"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "全ての入力メソッドを無効にする"
+
+#~ msgid "Filters"
+#~ msgstr "フィルター"
+
+#~ msgid "Languages"
+#~ msgstr "言語"
+
+#~ msgid "Description"
+#~ msgstr "説明"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "%s のホットキーを編集"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "%s のフィルターを編集"
+
+#~ msgid "Move _Up"
+#~ msgstr "上に移動(_U)"
+
+#~ msgid "Move _Down"
+#~ msgstr "下に移動(_D)"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "GTK+-2.xライブラリによるパネルデーモン"
+
+#~ msgid "On demand"
+#~ msgstr "開始時に"
+
+#~ msgid "Never"
+#~ msgstr "しない"
+
+#~ msgid "ToolBar"
+#~ msgstr "ツールバー"
+
+#~ msgid "_Show:"
+#~ msgstr "表示(_S):"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "オートスナップ(_N)"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "入力メソッドのアイコンを表示(_I)"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "入力メソッドの名称を表示(_U)"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "オートハイド(_O):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "スティックアイコンを表示(_T)"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "メニューアイコンを表示(_E)"
+
+#~ msgid "Show _help icon"
+#~ msgstr "ヘルプアイコンを表示(_H)"
+
+#~ msgid "Show _property label"
+#~ msgstr "プロパティーラベルを表示(_P)"
+
+#~ msgid "Input window"
+#~ msgstr "入力ウィンドウ"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "候補ウィンドウを埋め込む(_M)"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "候補ウィンドウを縦に表示(_V)"
+
+#~ msgid "Misc"
+#~ msgstr "その他"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "トレーアイコンを表示(_Y)"
+
+#~ msgid "Stick _windows"
+#~ msgstr "ウィンドウを固定(_W)"
+
+#~ msgid "_Font:"
+#~ msgstr "フォント(_F):"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "\"常に\"を選ぶと、SCIMがアクティブでない時もツールバーが表示されます。\"開"
+#~ "始時に\"を選ぶと、SCIMがアクティブな時だけ表示されます。\"しない\"を選ぶ"
+#~ "と、SCIMがアクティブな時もツールバーは表示されません。"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "このオプションを有効にするとツールバーが\n"
+#~ "自動的にスクリーンの端に移動します。"
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "ここで設定した時間が経過するとツールバーは自動的に消えます。このオプション"
+#~ "は表示に\"常に\"が選択されている場合にのみ有効です。オートハイドを無効にす"
+#~ "るには値をゼロにして下さい。"
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にすると入力メソッドの\n"
+#~ "アイコンがツールバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にすると入力メソッドの\n"
+#~ "名称がツールバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にするとスティックアイコンが\n"
+#~ "ツールバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にするとメニューアイコンが\n"
+#~ "ツールバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にするとヘルプアイコンが\n"
+#~ "ツールバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にすると入力メソッドの\n"
+#~ "プロパティーがツールバーにテキスト表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "このオプションを有効にすると候補ウィンドウが\n"
+#~ "入力ウィンドウの中に表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "このオプションを有効にすると候補ウィンドウが\n"
+#~ "縦に表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "このオプションを有効にするとトレーアイコンが\n"
+#~ "タスクバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "このオプションを有効にするとツールバーと入力/候補ウィンドウが\n"
+#~ "本来の表示位置に固定されます。"
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr "このフォント設定は入力/候補ウィンドウに適用されます。"
+
+#~ msgid "Select Interface Font"
+#~ msgstr "インターフェイスのフォントを選択"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "フロントエンド"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMエンジン"
+
+#~ msgid "Panel"
+#~ msgstr "パネル"
+
+#~ msgid "Extra"
+#~ msgstr "その他"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "SCIM入力メソッドの設定"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI セットアップユーティリティ</"
+#~ "span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">%s モジュールの設定</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "SCIMの設定を終了しますか?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "すぐに有効にならない設定項目があります。\n"
+#~ "すべての変更を有効にするにはSCIMを再起動して下さい。"
+
+#~ msgid "SCIM Setup"
+#~ msgstr "SCIMを設定"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "GTK Widget library に基づく統合設定ユーティリティ"
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "Smart Common Input Method platform セットアップユーティリティ"
+
+#~ msgid "SCIM Help"
+#~ msgstr "SCIMヘルプ"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Input Method"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "入力ウィンドウ・ツールバーを固定する/固定しない"
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "SCIMと現在の入力メソッドについて簡単なヘルプを表示します"
+
+#~ msgid "Show command menu."
+#~ msgstr "コマンドメニューを表示"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "設定をリロード"
+
+#~ msgid "Stick Windows"
+#~ msgstr "ウィンドウを固定"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "ツールバーを隠す"
+
+#~ msgid "Help ..."
+#~ msgstr "ヘルプ..."
+
+#~ msgid "Exit"
+#~ msgstr "終了"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "En"
+
+#~ msgid "Preedit String mode"
+#~ msgstr "未確定文字列の表示モード"
+
+#~ msgid "X Window"
+#~ msgstr "Xウィンドウ"
+
+#~ msgid "A FrontEnd module for X11R6 Window System, using XIM Protocol."
+#~ msgstr ""
+#~ "XIMプロトコルによるX11R6ウィンドウシステム用フロントエンドモジュール"
+
+#~ msgid "XIM Settings"
+#~ msgstr "XIMの設定"
+
+#~ msgid "_On The Spot"
+#~ msgstr "_On The Spot"
+
+#~ msgid "_Dynamic Event Flow"
+#~ msgstr "_Dynamic Event Flow"
+
+#~ msgid ""
+#~ "If this option is checked, the OnTheSpot input style will be used when "
+#~ "the client supports it."
+#~ msgstr ""
+#~ "このオプションを有効にするとOn The Spot入力スタイルが適用されます。但し、"
+#~ "クライアント側のサポートが必要です。"
+
+#~ msgid ""
+#~ "If this option is checked, then dynamic event flow will be used.This can "
+#~ "speed up the key event response, especially in remote X11 environment.But "
+#~ "SCIM may become unstable."
+#~ msgstr ""
+#~ "このオプションを有効にすると、特にリモートX11環境においてキーイベントのレ"
+#~ "スポンスを向上させることができます。但し、SCIMが不安定になる場合がありま"
+#~ "す。"
+
+#, fuzzy
+#~ msgid "Slovene"
+#~ msgstr "スロベニア語"
+
+#, fuzzy
+#~ msgid "Global"
+#~ msgstr "全体設定"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>"
+
+#, fuzzy
+#~ msgid "Hot Keys"
+#~ msgstr ""
+#~ "ショートカットキー:\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ "Hot keys:\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ "ショートカットキー:\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " open/close the input method.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ ":\n"
+#~ " 入力メソッドを開始/終了する\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " switch to the next input method.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ ":\n"
+#~ " 次の入力メソッドに切替える\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " switch to the previous input method.\n"
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ " 前の入力メソッドに切替える\n"
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Full/Half Letter"
+#~ msgstr "全角/半角文字"
+
+#~ msgid "Full/Half Punct"
+#~ msgstr "全角/半角句読点"
+
+#~ msgid ""
+#~ "The input mode of the letters. Click to toggle between half and full."
+#~ msgstr ""
+#~ "文字入力モード。全角/半角文字に切替えるにはここをクリックして下さい。"
+
+#~ msgid ""
+#~ "The input mode of the puncutations. Click to toggle between half and full."
+#~ msgstr "句読点入力モード。全角/半角に切替えるにはここをクリックして下さい。"
+
+#~ msgid ""
+#~ " Switch between full/half width letter mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " 全角/半角文字切替\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Switch between full/half width punctuation mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " 全角/半角句読点切替\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Switch between Forward/Input mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr "直接入力/変換入力モードに切替"
+
+#~ msgid ""
+#~ " Add a new phrase.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " 新しいフレーズを追加する\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Delete the selected phrase.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " 選択されたフレーズを削除する\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Control+Down:\n"
+#~ " Move lookup cursor to next shorter phrase\n"
+#~ " Only available when LongPhraseFirst option is set.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Control+Down:\n"
+#~ " カーソルを次のより短いフレーズに移動する\n"
+#~ " \"長いフレーズを優先的に表示\"が有効な場合のみ使用できます。\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Control+Up:\n"
+#~ " Move lookup cursor to previous longer phrase\n"
+#~ " Only available when LongPhraseFirst option is set.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Control+Up:\n"
+#~ " カーソルを前のより長いフレーズに移動する\n"
+#~ " \"長いフレーズを優先的に表示\"が有効な場合のみ使用できます。\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Esc:\n"
+#~ " 入力メソッドをリセット\n"
+#~ "\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "How to add a phrase:\n"
+#~ " Input the new phrase as normal, then press the\n"
+#~ " hot key. A hint will be shown to let you input a key\n"
+#~ " for this phrase.\n"
+#~ " Input a key then press the space bar.\n"
+#~ " A hint will be shown to indicate whether\n"
+#~ " the phrase was added sucessfully.\n"
+#~ msgstr ""
+#~ "フレーズの追加方法:\n"
+#~ " 新しいフレーズを普通に入力しショートカットキーを押します。\n"
+#~ " ヒントが表示され、そのフレーズを入力する際に使うキーの入力\n"
+#~ " を促します。\n"
+#~ " キーを入力しスペースを押して下さい。\n"
+#~ " ヒントにフレーズが正しく登録されたかどうか表示されますので\n"
+#~ " 確認して下さい。\n"
+
+#~ msgid "Input a key string for phrase: "
+#~ msgstr "このフレーズに使うキーを入力して下さい: "
+
+#~ msgid "Success."
+#~ msgstr "登録完了"
+
+#~ msgid "Failed."
+#~ msgstr "登録に失敗しました"
+
+#~ msgid "option -no cannot be used with -o\n"
+#~ msgstr "-noオプションは-oオプションと同時には使用できません\n"
+
+#~ msgid "option -o cannot be used with -no\n"
+#~ msgstr "-oオプションは-noオプションと同時には使用できません\n"
+
+#~ msgid "No argument for option "
+#~ msgstr "オプション引数がありません"
+
+#~ msgid "Invalid option: "
+#~ msgstr "オプションが無効です:"
+
+#~ msgid "Loading table file "
+#~ msgstr "テーブルを読込中"
+
+#~ msgid " ...\n"
+#~ msgstr " ...\n"
+
+#~ msgid "table file load failed!"
+#~ msgstr "テーブルの読込に失敗!"
+
+#~ msgid "Saving frequency table file "
+#~ msgstr "頻度テーブルを保存中"
+
+#~ msgid "frequency table file load failed!"
+#~ msgstr "頻度テーブルの読込に失敗!"
+
+#~ msgid "Saving table file "
+#~ msgstr "テーブルを保存中"
+
+#~ msgid "Table file save failed!"
+#~ msgstr "テーブルの保存に失敗!"
+
+#~ msgid "Generic Table"
+#~ msgstr "汎用テーブル"
+
+#~ msgid "An IMEngine Module which uses generic table input method file."
+#~ msgstr "汎用テーブル入力メソッドを使用するIMエンジンモジュール"
+
+#~ msgid "Full width _punctuation:"
+#~ msgstr "全角/半角句読点(_P):"
+
+#~ msgid "Select full width puncutation keys"
+#~ msgstr "全角/半角句読点切替キーの設定"
+
+#~ msgid ""
+#~ "The key events to switch full/half width punctuation input mode. Click on "
+#~ "the button on the right to edit it."
+#~ msgstr ""
+#~ "全角/半角句読点を切替えるキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "Full width _letter:"
+#~ msgstr "全角/半角文字(_L):"
+
+#~ msgid "Select full width letter keys"
+#~ msgstr "全角/半角文字切替キーの設定"
+
+#~ msgid ""
+#~ "The key events to switch full/half width letter input mode. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "全角/半角文字を切替えるキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "_Mode switch:"
+#~ msgstr "入力モード切替(_M):"
+
+#~ msgid "Select mode switch keys"
+#~ msgstr "入力モード切替キーの設定"
+
+#~ msgid ""
+#~ "The key events to change current input mode. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "入力モードを切替えるキー。変更する場合は\n"
+#~ "右のボタンをクリックして下さい。"
+
+#~ msgid "_Add phrase:"
+#~ msgstr "フレーズ追加(_A):"
+
+#~ msgid "Select add phrase keys."
+#~ msgstr "フレーズ追加キーの設定"
+
+#~ msgid ""
+#~ "The key events to add a new user defined phrase. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "新しいフレーズを追加するキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "_Delete phrase:"
+#~ msgstr "フレーズ削除(_D):"
+
+#~ msgid "Select delete phrase keys."
+#~ msgstr "フレーズ削除キーの設定"
+
+#~ msgid ""
+#~ "The key events to delete a selected phrase. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "選択されたフレーズを削除するキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "Show _prompt"
+#~ msgstr "プロンプトを表示(_P)"
+
+#~ msgid "Show key _hint"
+#~ msgstr "ヒントキーを表示(_H)"
+
+#~ msgid "Save _user table in binary format"
+#~ msgstr "ユーザーテーブルをバイナリー形式で保存(_U)"
+
+#~ msgid "Show the u_ser defined phrases first"
+#~ msgstr "ユーザー定義フレーズを優先的に表示(_S)"
+
+#~ msgid "Show the _longer phrases first"
+#~ msgstr "長いフレーズを優先的に表示(_L)"
+
+#~ msgid ""
+#~ "If this option is checked, the key prompt of the currently selected "
+#~ "phrase will be shown."
+#~ msgstr ""
+#~ "このオプションを有効にすると選択された\n"
+#~ "フレーズのキープロンプトが表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the remaining keystrokes of the phraseswill be "
+#~ "shown on the lookup table."
+#~ msgstr ""
+#~ "このオプションを有効にするとフレーズの残りの\n"
+#~ "キーストロークが候補ウィンドウに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the user table will be stored with binary "
+#~ "format, this will increase the loading speed."
+#~ msgstr ""
+#~ "このオプションを有効にするとユーザー定義テーブルがバイナリー\n"
+#~ "形式で保存されます。テーブルの読込が速くなります。"
+
+#~ msgid ""
+#~ "If this option is checked, the user defined phrases will be shown in "
+#~ "front of others. "
+#~ msgstr ""
+#~ "このオプションを有効にするとユーザー定義フレーズ\n"
+#~ "が優先的に表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the longer phrase will be shown in front of "
+#~ "others. "
+#~ msgstr ""
+#~ "このオプションを有効にすると長いフレーズが\n"
+#~ "優先的に表示されます。"
+
+#~ msgid "The installed tables:"
+#~ msgstr "インストール済みのテーブル:"
+
+#~ msgid "_Install"
+#~ msgstr "インストール(_I)"
+
+#~ msgid "Install a new table."
+#~ msgstr "新しいテーブルをインストール"
+
+#~ msgid "_Delete"
+#~ msgstr "削除(_D)"
+
+#~ msgid "Delete the selected table."
+#~ msgstr "選択されたテーブルを削除"
+
+#~ msgid "_Properties"
+#~ msgstr "プロパティー(_P)"
+
+#~ msgid "Edit the properties of the selected table."
+#~ msgstr "選択されたテーブルのプロパティーを編集"
+
+#~ msgid "Table Management"
+#~ msgstr "テーブル管理"
+
+#~ msgid "Select an icon file"
+#~ msgstr "アイコンファイルを選択"
+
+#~ msgid "User"
+#~ msgstr "ユーザー"
+
+#~ msgid "System"
+#~ msgstr "システム"
+
+#~ msgid "Please select the table file to be installed."
+#~ msgstr "インストールするテーブルファイルを選択して下さい。"
+
+#~ msgid "Failed to install the table! It's already in table file directory."
+#~ msgstr "テーブルのインストールに失敗!すでにインストールされています。"
+
+#~ msgid "Failed to load the table file!"
+#~ msgstr "テーブルファイルの読込に失敗!"
+
+#~ msgid ""
+#~ "Failed to install the table! Another version of this table was already "
+#~ "installed."
+#~ msgstr ""
+#~ "テーブルのインストールに失敗!他のバージョンが\n"
+#~ "すでにインストールされています。"
+
+#~ msgid ""
+#~ "Another version of this table was already installed. Do you want to "
+#~ "replace it with the new one?"
+#~ msgstr ""
+#~ "このテーブルの他のバージョンがすでにインストールされています。\n"
+#~ "新しいバージョンに置き換えますか?"
+
+#~ msgid ""
+#~ "Failed to install the table! A table with the same file name was already "
+#~ "installed."
+#~ msgstr ""
+#~ "テーブルのインストールに失敗!同じ名前のテーブルが\n"
+#~ "すでにインストールされています。"
+
+#~ msgid ""
+#~ "A table with the same file name was already installed. Do you want to "
+#~ "overwrite it?"
+#~ msgstr ""
+#~ "同じ名前のテーブルがすでにインストールされています。\n"
+#~ "上書きしますか?"
+
+#~ msgid "Failed to install the table to %s!"
+#~ msgstr "%sにテーブルをインストールできませんでした!"
+
+#~ msgid "Can not delete the file %s!"
+#~ msgstr "ファイル%sを削除できません!"
+
+#~ msgid "Are you sure to delete this table file?"
+#~ msgstr "このテーブルを削除しますか?"
+
+#~ msgid "Failed to delete the table file!"
+#~ msgstr "テーブルの削除に失敗!"
+
+#~ msgid "True"
+#~ msgstr "True"
+
+#~ msgid "False"
+#~ msgstr "False"
+
+#~ msgid "Split Keys:"
+#~ msgstr "スプリットキー:"
+
+#~ msgid "The key strokes to split inputed string."
+#~ msgstr "入力済みの文字列を分割するキー"
+
+#~ msgid "Commit Keys:"
+#~ msgstr "変換確定キー:"
+
+#~ msgid "The key strokes to commit converted result to client."
+#~ msgstr "変換結果をクライアントに送るキー"
+
+#~ msgid "Forward Keys:"
+#~ msgstr "直接入力キー:"
+
+#~ msgid "The key strokes to forward inputed string to client."
+#~ msgstr "入力された文字列を変換せずに直接クライアントに送るキー"
+
+#~ msgid "The key strokes to select candidate phrases in lookup table."
+#~ msgstr "候補ウィンドウからフレーズを選択するキー"
+
+#~ msgid "Page Up Keys:"
+#~ msgstr "前ページキー:"
+
+#~ msgid "The lookup table page up keys"
+#~ msgstr "候補ウィンドウで前のページに戻るキー"
+
+#~ msgid "Page Down Keys:"
+#~ msgstr "次ページキー:"
+
+#~ msgid "The lookup table page down keys"
+#~ msgstr "候補ウィンドウで次のページに進むキー"
+
+#~ msgid "Table Properties"
+#~ msgstr "テーブルのプロパティー"
+
+#~ msgid "Name:"
+#~ msgstr "名称:"
+
+#~ msgid "The name of this table."
+#~ msgstr "このテーブルの名称"
+
+#~ msgid "Author:"
+#~ msgstr "作者:"
+
+#~ msgid "The author of this table."
+#~ msgstr "このテーブルの作者"
+
+#~ msgid "UUID:"
+#~ msgstr "UUID:"
+
+#~ msgid "The unique ID of this table."
+#~ msgstr "このテーブルのID"
+
+#~ msgid "Serial Number:"
+#~ msgstr "バージョン:"
+
+#~ msgid "The serial number of this table."
+#~ msgstr "このテーブルのバージョン"
+
+#~ msgid "Icon File:"
+#~ msgstr "アイコンファイル:"
+
+#~ msgid "The icon file of this table."
+#~ msgstr "このテーブルのアイコンファイル"
+
+#~ msgid "Supported Languages:"
+#~ msgstr "サポート言語:"
+
+#~ msgid "The languages supported by this table."
+#~ msgstr "このテーブルがサポートする言語"
+
+#~ msgid "Status Prompt:"
+#~ msgstr "ステイタスプロンプト:"
+
+#~ msgid "A prompt string to be shown in status area."
+#~ msgstr "ステイタスに表示される文字列"
+
+#~ msgid "Valid Input Chars:"
+#~ msgstr "有効な文字:"
+
+#~ msgid "The valid input chars of this table."
+#~ msgstr "このテーブルで使用できる文字"
+
+#~ msgid "Multi Wildcard Char:"
+#~ msgstr "マルチワイルドカード文字:"
+
+#~ msgid ""
+#~ "The multi wildcard chars of this table. These chars can be used to match "
+#~ "one or more arbitrary chars."
+#~ msgstr ""
+#~ "このテーブルのマルチワイルドカード文字。\n"
+#~ "複数の文字の代わりに使用できます。"
+
+#~ msgid "Single Wildcard Char:"
+#~ msgstr "シングルワイルドカード文字:"
+
+#~ msgid ""
+#~ "The single wildcard chars of this table.These chars can be used to match "
+#~ "one arbitrary char."
+#~ msgstr ""
+#~ "このテーブルのシングルワイルドカード文字。\n"
+#~ "任意の一文字の代わりに使用できます。"
+
+#~ msgid "Max Key Length:"
+#~ msgstr "最大キー数:"
+
+#~ msgid "The maxmium length of key strings."
+#~ msgstr "文字列の最大キー数"
+
+#~ msgid "Show Key Prompt:"
+#~ msgstr "キープロンプトを表示:"
+
+#~ msgid "If true then the key prompts will be shown instead of the raw keys."
+#~ msgstr "Trueの場合は入力された文字の代わりにキープロンプトが表示されます。"
+
+#~ msgid "Auto Select:"
+#~ msgstr "自動選択:"
+
+#~ msgid ""
+#~ "If true then the first candidate phrase will be selected automatically "
+#~ "when inputing the next key."
+#~ msgstr ""
+#~ "Trueの場合は次のフレーズの入力を開始すると同時に入力済みの\n"
+#~ "フレーズに対してその第一変換候補が自動的に選択されます。"
+
+#~ msgid "Auto Wildcard:"
+#~ msgstr "自動ワイルドカード:"
+
+#~ msgid ""
+#~ "If true then a multi wildcard char will be append to the end of inputed "
+#~ "key string when searching phrases."
+#~ msgstr ""
+#~ "Trueの場合は検索時にマルチワイルドカード文字が\n"
+#~ "入力された文字列の最後に自動的に付加されます。"
+
+#~ msgid "Auto Commit:"
+#~ msgstr "自動コミット:"
+
+#~ msgid ""
+#~ "If true then the converted result string will be committed to client "
+#~ "automatically."
+#~ msgstr "Trueの場合は変換結果が自動的にコミットされます。"
+
+#~ msgid ""
+#~ "If true then the inputed key string will be splitted automatically when "
+#~ "necessary."
+#~ msgstr "Trueの場合は、入力された文字列が必要に応じて自動的に分割されます。"
+
+#~ msgid "Discard Invalid Key:"
+#~ msgstr "無効な文字列を排除:"
+
+#~ msgid ""
+#~ "If true then the invalid key will be discarded automatically.This option "
+#~ "is only valid when Auto Select and Auto Commit is true."
+#~ msgstr ""
+#~ "Trueの場合は、入力された無効な文字列を自動的に排除します。このオプションは"
+#~ "自動選択と自動コミットがTrueの場合のみ有効になります。"
+
+#~ msgid "Dynamic Adjust:"
+#~ msgstr "動的アップデート:"
+
+#~ msgid "If true then the phrases' frequencies will be adjusted dynamically."
+#~ msgstr "Trueの場合は、使用頻度情報が動的にアップデートされます。"
+
+#~ msgid "Auto Fill Preedit Area:"
+#~ msgstr "プリエディットの自動補完:"
+
+#~ msgid ""
+#~ "If true then the preedit string will be filled up with the current "
+#~ "candiate phrase automatically.This option is only valid when Auto Select "
+#~ "is TRUE."
+#~ msgstr ""
+#~ "Trueの場合は、自動的にプリエディットが変換候補によって補完されます。\n"
+#~ "このオプションは自動選択がTrueの場合のみ有効になります。"
+
+#~ msgid "Always Show Lookup Table:"
+#~ msgstr "候補リストを常に表示:"
+
+#~ msgid ""
+#~ "If true then the lookup table will always be shown when any candidate "
+#~ "phrase is available. Otherwise the lookup table will only be shown when "
+#~ "necessary.\n"
+#~ "If Auto Fill is false, then this option will be no effect, and always be "
+#~ "true."
+#~ msgstr ""
+#~ "Trueの場合は変換候補があれば常に候補ウィンドウが表示されます。\n"
+#~ "Falseの場合は必要な時のみ表示されます。\n"
+#~ "但し、自動補完が無効の場合は常に表示されます。"
+
+#~ msgid "Default Full Width Punct:"
+#~ msgstr "デフォルト句読点を全角に設定:"
+
+#~ msgid "If true then full width punctuations will be inputed by default."
+#~ msgstr "Trueの場合は、指定のない限り全角句読点が入力されます。"
+
+#~ msgid "Default Full Width Letter:"
+#~ msgstr "デフォルト文字幅を全角に設定:"
+
+#~ msgid "If true then full width letters will be inputed by default."
+#~ msgstr "Trueの場合は、指定のない限り全角文字が入力されます。"
+
+#~ msgid "Invalid icon file."
+#~ msgstr "アイコンファイルが無効です。"
+
+#~ msgid "Invalid languages."
+#~ msgstr "言語が無効です。"
+
+#~ msgid "Invalid status prompt."
+#~ msgstr "ステイタスプロンプトが無効です。"
+
+#~ msgid "Invalid multi wildcard chars."
+#~ msgstr "マルチワイルドカード文字が無効です。"
+
+#~ msgid "Invalid single wildcard chars."
+#~ msgstr "シングルワイルドカード文字が無効です。"
+
+#~ msgid "Invalid commit keys."
+#~ msgstr "コミットキーが無効です。"
+
+#~ msgid "Invalid select keys."
+#~ msgstr "選択キーが無効です。"
+
+#~ msgid "Invalid page up keys."
+#~ msgstr "次ページキーが無効です。"
+
+#~ msgid "Invalid page down keys."
+#~ msgstr "前ページキーが無効です。"
+
+#~ msgid "Invalid max key length."
+#~ msgstr "最大キー数が無効です。"
+
+#~ msgid "Failed to save table %s!"
+#~ msgstr "テーブル%sの保存に失敗!"
+
+#~ msgid "Failed to load any Config Modules!"
+#~ msgstr "設定モジュールの読込に失敗!"
+
+#~ msgid "_Current Config Module:"
+#~ msgstr "現在の設定モジュール(_C):"
+
+#~ msgid "<Not found>"
+#~ msgstr "<見つかりません>"
+
+#~ msgid "Current Config Module has been changed to %s."
+#~ msgstr "現在の設定モジュールを%sに変更しました。"
+
+#~ msgid "Start the SCIM Setup Utility."
+#~ msgstr "SCIMセットアップユーティリティを開く"
+
+#~ msgid "Setup ..."
+#~ msgstr "設定..."
--- /dev/null
+# translation of ko.
+# Copyright (C) 2004 THE ko'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the ko package.
+#
+# Kitae <bluetux@gmail.com>, 2005.
+# Choe Hwanjin <choe.hwanjin@gmail.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: SCIM\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 18:51+0900\n"
+"PO-Revision-Date: 2005-07-08 18:16+0900\n"
+"Last-Translator: Choe Hwanjin <choe.hwanjin@gmail.com>\n"
+"Language-Team: Korean <en@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+msgid "Keyboard selection"
+msgstr "키보드 선택"
+
+#~ msgid "Set"
+#~ msgstr "설정"
+
+#~ msgid "Selection"
+#~ msgstr "키보드 선택"
+
+#~ msgid "Option"
+#~ msgstr "옵션"
+
+#~ msgid "Auto capitalization"
+#~ msgstr "자동 대문자"
+
+#~ msgid "Auto period"
+#~ msgstr "\".\" 단축키"
+
+#~ msgid "General"
+#~ msgstr "일반"
+
+#~ msgid "S/W keyboard"
+#~ msgstr "소프트 키보드"
+
+#~ msgid "Keyboard option"
+#~ msgstr "키보드 옵션"
+
+#~ msgid "H/W keyboard"
+#~ msgstr "하드웨어 키보드"
+
+#~ msgid "option"
+#~ msgstr "옵션"
+
+#~ msgid "Back"
+#~ msgstr "이전"
+
+#~ msgid "Keyboard"
+#~ msgstr "키보드"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "영어/키보드"
+
+#~ msgid "English input service"
+#~ msgstr "영어 입력 서비스"
+
+#~ msgid "Amharic"
+#~ msgstr "암하라어"
+
+#~ msgid "Arabic"
+#~ msgstr "아랍어"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "아랍어 (이집트)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "아랍어 (레바논)"
+
+#~ msgid "Assamese"
+#~ msgstr "아삼어"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "아제르바이잔어"
+
+#~ msgid "Belarusian"
+#~ msgstr "벨로루시어"
+
+#~ msgid "Bulgarian"
+#~ msgstr "불가리어"
+
+#~ msgid "Bengali"
+#~ msgstr "벵갈어"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "뱅갈어 (인도)"
+
+#~ msgid "Tibetan"
+#~ msgstr "티벳어"
+
+#~ msgid "Bosnian"
+#~ msgstr "보스니아어"
+
+#~ msgid "Catalan"
+#~ msgstr "카탈로니아어"
+
+#~ msgid "Czech"
+#~ msgstr "체코어"
+
+#~ msgid "Welsh"
+#~ msgstr "웨일즈어"
+
+#~ msgid "Danish"
+#~ msgstr "덴마크어"
+
+#~ msgid "German"
+#~ msgstr "독일어"
+
+#~ msgid "Greek"
+#~ msgstr "그리스어"
+
+#~ msgid "English"
+#~ msgstr "영어"
+
+#~ msgid "English (Australian)"
+#~ msgstr "영어 (호주)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "영어 (캐나다)"
+
+#~ msgid "English (British)"
+#~ msgstr "영어 (영국)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "영어 (아일랜드)"
+
+#~ msgid "English (American)"
+#~ msgstr "영어 (미국)"
+
+#~ msgid "Spanish"
+#~ msgstr "스페인어"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "스페인어 (멕시코)"
+
+#~ msgid "Estonian"
+#~ msgstr "에스토니아어"
+
+#~ msgid "Basque"
+#~ msgstr "바스크어"
+
+#~ msgid "Persian"
+#~ msgstr "페르시아어"
+
+#~ msgid "Finnish"
+#~ msgstr "핀란드어"
+
+#~ msgid "French"
+#~ msgstr "프랑스어"
+
+#~ msgid "Irish"
+#~ msgstr "아일랜드어"
+
+#~ msgid "Galician"
+#~ msgstr "갈리시아어"
+
+#~ msgid "Gujarati"
+#~ msgstr "구자라트어"
+
+#~ msgid "Hebrew"
+#~ msgstr "히브리어"
+
+#~ msgid "Hindi"
+#~ msgstr "힌두어"
+
+#~ msgid "Croatian"
+#~ msgstr "크로아티아어"
+
+#~ msgid "Hungarian"
+#~ msgstr "헝가리어"
+
+#~ msgid "Armenian"
+#~ msgstr "아르메니아어"
+
+#~ msgid "Interlingua"
+#~ msgstr "국제어"
+
+#~ msgid "Indonesian"
+#~ msgstr "인도네시아어"
+
+#~ msgid "Icelandic"
+#~ msgstr "아이슬란드어"
+
+#~ msgid "Italian"
+#~ msgstr "이탈리아어"
+
+#~ msgid "Japanese"
+#~ msgstr "일본어"
+
+#~ msgid "Georgian"
+#~ msgstr "그루지아어"
+
+#~ msgid "Kazakh"
+#~ msgstr "카자흐어"
+
+#~ msgid "Cambodian"
+#~ msgstr "캄보디아어"
+
+#~ msgid "Kannada"
+#~ msgstr "칸나다어"
+
+#~ msgid "Korean"
+#~ msgstr "한국어"
+
+#~ msgid "Laothian"
+#~ msgstr "라오스어"
+
+#~ msgid "Lithuanian"
+#~ msgstr "리투아니아어"
+
+#~ msgid "Latvian"
+#~ msgstr "라트비아어"
+
+#~ msgid "Macedonian"
+#~ msgstr "마케도니아어"
+
+#~ msgid "Malayalam"
+#~ msgstr "말라얄람어"
+
+#~ msgid "Mongolian"
+#~ msgstr "몽골어"
+
+#~ msgid "Marathi"
+#~ msgstr "마라타어"
+
+#~ msgid "Malay"
+#~ msgstr "말레이어"
+
+#~ msgid "Burmese"
+#~ msgstr "버마어"
+
+#~ msgid "Nepali"
+#~ msgstr "네팔어"
+
+#~ msgid "Dutch"
+#~ msgstr "네델란드어"
+
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "노르웨이어 (뉘노르스크)"
+
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "노르웨이어 (부크말)"
+
+#~ msgid "Oriya"
+#~ msgstr "오리야어"
+
+#~ msgid "Punjabi"
+#~ msgstr "펀자브어"
+
+#~ msgid "Polish"
+#~ msgstr "폴란드어"
+
+#~ msgid "Portuguese"
+#~ msgstr "포루투갈어"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "포루투갈어 (브라질)"
+
+#~ msgid "Romanian"
+#~ msgstr "루마니아어"
+
+#~ msgid "Russian"
+#~ msgstr "러시아어"
+
+#~ msgid "Sinhala"
+#~ msgstr "싱할라어"
+
+#~ msgid "Slovak"
+#~ msgstr "슬로바키아어"
+
+#~ msgid "Slovenian"
+#~ msgstr "슬로베니아어"
+
+#~ msgid "Albanian"
+#~ msgstr "알바니아어"
+
+#~ msgid "Serbian"
+#~ msgstr "세르비아어"
+
+#~ msgid "Swedish"
+#~ msgstr "스웨덴어"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "스웨덴어 (핀란드)"
+
+#~ msgid "Tamil"
+#~ msgstr "타밀어"
+
+#~ msgid "Telugu"
+#~ msgstr "텔루구어"
+
+#~ msgid "Thai"
+#~ msgstr "타이어"
+
+#~ msgid "Turkish"
+#~ msgstr "터키어"
+
+#~ msgid "Uighur"
+#~ msgstr "위그루어"
+
+#~ msgid "Ukrainian"
+#~ msgstr "우크라이나어"
+
+#~ msgid "Urdu"
+#~ msgstr "우르두어"
+
+#~ msgid "Uzbek"
+#~ msgstr "우즈베키스탄어"
+
+#~ msgid "Vietnamese"
+#~ msgstr "베트남어"
+
+#~ msgid "Walloon"
+#~ msgstr "와론어"
+
+#~ msgid "Yiddish"
+#~ msgstr "이디시어"
+
+#~ msgid "Chinese"
+#~ msgstr "중국어"
+
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "중국어 (간체)"
+
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "중국어 (번체)"
+
+#~ msgid "Dutch (Standard)"
+#~ msgstr "네덜란드어"
+
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "네덜란드어 (벨기에)"
+
+#~ msgid "English (United States)"
+#~ msgstr "영어 (미국)"
+
+#~ msgid "English (United Kingdom)"
+#~ msgstr "영어 (캐나다)"
+
+#~ msgid "English (New Zealand)"
+#~ msgstr "영어 (뉴질랜드)"
+
+#~ msgid "English (Irish)"
+#~ msgstr "영어 (아일랜드)"
+
+#~ msgid "English (South Africa)"
+#~ msgstr "영어 (남아프리카)"
+
+#~ msgid "English (Jamaica)"
+#~ msgstr "영어 (자메이카)"
+
+#~ msgid "English (Belize)"
+#~ msgstr "영어 (벨리즈)"
+
+#~ msgid "English (Trinidad)"
+#~ msgstr "영어 (트리니다드)"
+
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "영어 (짐바브웨)"
+
+#~ msgid "English (Philippines)"
+#~ msgstr "영어 (필리핀)"
+
+#~ msgid "French (Standard)"
+#~ msgstr "프랑스어"
+
+#~ msgid "French (Belgian)"
+#~ msgstr "프랑스어 (벨기에)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "프랑스어 (캐나다)"
+
+#~ msgid "French (Swiss)"
+#~ msgstr "독일어 (스위스)"
+
+#~ msgid "French (Luxembourg)"
+#~ msgstr "프랑스어 (룩셈부르크)"
+
+#~ msgid "French (Monaco)"
+#~ msgstr "프랑스어 (모나코)"
+
+#~ msgid "German (Standard)"
+#~ msgstr "독일어"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "독일어 (스위스)"
+
+#~ msgid "German (Austrian)"
+#~ msgstr "영어 (호주)"
+
+#~ msgid "German (Luxembourg)"
+#~ msgstr "독일 (룩셈부르크)"
+
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "독일어 (리히텐슈타인)"
+
+#~ msgid "Italian (Standard)"
+#~ msgstr "이탈리아어"
+
+#~ msgid "Italian (Swiss)"
+#~ msgstr "이탈리아어 (스위스)"
+
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "포루투갈어 (브라질)"
+
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "포루투갈어"
+
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "스페인어 (전통 정렬)"
+
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "스페인어 (멕시코)"
+
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "스페인어 (과테말라)"
+
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "스페인어 (코스타리카)"
+
+#~ msgid "Spanish (Panama)"
+#~ msgstr "스페인어 (파나마)"
+
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "스페인어 (도미니카)"
+
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "스페인어 (베네수엘라)"
+
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "스페인어 (콜롬비아)"
+
+#~ msgid "Spanish (Peru)"
+#~ msgstr "스페인어 (페루)"
+
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "스페인어 (아르헨티나)"
+
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "스페인어 (에콰도르)"
+
+#~ msgid "Spanish (Chile)"
+#~ msgstr "스페인어 (칠레)"
+
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "스페인어 (우루과이)"
+
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "스페인어 (파라과이)"
+
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "스페인어 (볼리비아)"
+
+#~ msgid "Spanish (El Salvador)"
+#~ msgstr "스페인어 (엘사바도르)"
+
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "스페인어 (온두라스)"
+
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "스페인어 (니카라과)"
+
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "스페인어 (푸에르토리코)"
+
+#~ msgid "Afrikaans"
+#~ msgstr "아프리칸스어"
+
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "말레이어 (말레이시아)"
+
+#~ msgid "Malay (Brunei Darussalam)"
+#~ msgstr "말레이어 (브루나이)"
+
+#~ msgid "Norwegian"
+#~ msgstr "노르웨이어"
+
+#~ msgid "Serbian (Latin)"
+#~ msgstr "세르비아어 (라틴)"
+
+#~ msgid "Serbian (Cyrillic)"
+#~ msgstr "세르비아어 (키릴)"
+
+#~ msgid "Uzbek (Latin)"
+#~ msgstr "우즈벡어 (라틴)"
+
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "중국어 (대만)"
+
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "중국어 (홍콩)"
+
+#~ msgid "Chinese (Macau)"
+#~ msgstr "중국어 (마카오)"
+
+#~ msgid "Chinese (PRC)"
+#~ msgstr "중국어 (중국)"
+
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "중국어 (싱가폴)"
+
+#~ msgid "Arabic (Saudi Arabia)"
+#~ msgstr "아랍어 (사우디 아라비아)"
+
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "아랍어 (이라크)"
+
+#~ msgid "Arabic (Libya)"
+#~ msgstr "아랍어 (리비아)"
+
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "아랍어 (알제리)"
+
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "아랍어 (모로코)"
+
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "아랍어 (튀니지)"
+
+#~ msgid "Arabic (Oman)"
+#~ msgstr "아랍어 (오만)"
+
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "아랍어 (예멘)"
+
+#~ msgid "Arabic (Syria)"
+#~ msgstr "아랍어 (시리아)"
+
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "아랍어 (요르단)"
+
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "아랍어 (쿠웨이트)"
+
+#~ msgid "Arabic (UAE)"
+#~ msgstr "아랍어 (아랍에미레이트)"
+
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "아랍어 (바레인)"
+
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "아랍어 (카타르)"
+
+#~ msgid "Hausa"
+#~ msgstr "하우사어"
+
+#~ msgid "Xhosa"
+#~ msgstr "호사족어"
+
+#~ msgid "Yoruba"
+#~ msgstr "요루바어"
+
+#~ msgid "Zulu"
+#~ msgstr "줄루어"
+
+#~ msgid "Other"
+#~ msgstr "기타"
+
+#~ msgid "Unknown"
+#~ msgstr "알수없는"
+
+#~ msgid "English (US)"
+#~ msgstr "영어 (미국)"
+
+#~ msgid "Belgian"
+#~ msgstr "벨기에어"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "체코어 (쿼티)"
+
+#~ msgid "Dvorak"
+#~ msgstr "드보락"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "프랑스어 (스위스)"
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "독일어 (데드키 포함)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "포루투갈어 (브라질 미국 엑센트)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "슬로바키아어 (쿼티)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "스페인어 (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "스페인어 (라틴 아메리카)"
+
+#~ msgid "English (UK)"
+#~ msgstr "영어 (영국)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "중국어 간체-번체 변환"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "중국어를 간체와 번체로 변환"
+
+#~ msgid "SC-TC"
+#~ msgstr "간체-번체"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "중국어 간체-번체 변환"
+
+#~ msgid "No Conversion"
+#~ msgstr "변환 하지 않음"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "간체에서 번체로"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "간체에서 번체로 변환"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "번체에서 간체로"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "번체에서 간체로 변환"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "제임스 수 <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "간체->번체"
+
+#~ msgid "TC->SC"
+#~ msgstr "번체->간체"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "똑똑한 일반 입력 방식 플랫폼 "
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 제임스 수 <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "활성화"
+
+#~ msgid "Name"
+#~ msgstr "이름"
+
+#~ msgid "Cursor Position"
+#~ msgstr "커서 위치"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "문자열에서 커서의 현재 위치."
+
+#~ msgid "Maximum length"
+#~ msgstr "최대 길이"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr "문자열를 보기 위한 최대 문자수, 0은 제한 없음."
+
+#~ msgid "Maximum width"
+#~ msgstr "최대폭"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "문자열 보기의 최대 넓이."
+
+#~ msgid "Has Frame"
+#~ msgstr "프레임을 가짐"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "거짓으로 설정하면 문자열 보기의 외각 경사가 없어집니다."
+
+#~ msgid "Draw cursor"
+#~ msgstr "커서 그리기"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "참으로 설정하면 커서를 깜빡이게 합니다."
+
+#~ msgid "Auto move cursor"
+#~ msgstr "자동 커서 이동"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr "참으로 설정하면 마우스 클릭시 자동 커서가 이동합니다."
+
+#~ msgid "Forward button press/release event"
+#~ msgstr "전달 버튼 프레스 이벤트를 전달함"
+
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr "참으로 설정하면 버튼 프레스 이벤트를 사용자 프로그램에 전달."
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "문자열에 크기에 따라 위젯 크기 자동 조절"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "참으로 설정하면 자동으로 크기가 변합니다."
+
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr "참으로 설정하면 마우스 클릭시 자동 커서가 이동합니다."
+
+#~ msgid "Width in chars"
+#~ msgstr "폭(글자 단위)"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr "문자열 보기에서 공간을 만들기위해 사용할 글자수."
+
+#~ msgid "Scroll offset"
+#~ msgstr "스크롤 단위"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr "화면 좌측으로 부터 문자열 보기에서 스크롤을 위한 픽셀수"
+
+#~ msgid "Text"
+#~ msgstr "본문"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "문자열 보기의 내용"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "선택된 키(_K):"
+
+#~ msgid "Key Code:"
+#~ msgstr "키 코드:"
+
+#~ msgid "....."
+#~ msgstr "....."
+
+#~ msgid "Modifiers:"
+#~ msgstr "수정:"
+
+#~ msgid "_Release"
+#~ msgstr "놓음(_R)"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "키 코드를 입력하십시오"
+
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "키를 누르십시오(또는 키의 조합을).\n"
+#~ "키 선택 후 이창은 자동으로 닫힙니다."
+
+#~ msgid "Grabbing a key."
+#~ msgstr "키를 기록합니다."
+
+#~ msgid "Key Selection"
+#~ msgstr "키 선택"
+
+#~ msgid "Orientation"
+#~ msgstr "방향"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "트레이의 방향."
+
+#~ msgid "Previous"
+#~ msgstr "이전"
+
+#~ msgid "Next"
+#~ msgstr "다음"
+
+#~ msgid "Quit"
+#~ msgstr "종료"
+
+#~ msgid "Automatic"
+#~ msgstr "자동"
+
+#~ msgid "Always used"
+#~ msgstr "항상"
+
+#~ msgid "Done"
+#~ msgstr "완료"
+
+#~ msgid "Qwerty keyboard"
+#~ msgstr "Qwerty 키보드"
+
+#~ msgid "Phone keypad"
+#~ msgstr "폰 키보드"
+
+#~ msgid "%s Option"
+#~ msgstr "%s 옵션"
+
+#~ msgid "S/W keyboard connection"
+#~ msgstr "소프트웨어 키보드 연결"
+
+# msgid "MoAKey Korean"
+# msgstr "모아키 한국어"
+# msgid "MoAKey Chinese"
+# msgstr "모아키 중국어"
+# msgid "MoAKey Indic"
+# msgstr "모아키 인도어"
+# msgid "Indic"
+# msgstr "인도어"
+# msgid "Western Europe 1 & US"
+# msgstr "서유럽어 및 영어 키보드"
+#~ msgid "Keyboards"
+#~ msgstr "키보드"
+
+#~ msgid "Add new Keyboard"
+#~ msgstr "키보드 추가"
+
+#~ msgid "Supporting keyboard"
+#~ msgstr "지원 키보드"
+
+#~ msgid "Cancel"
+#~ msgstr "취소"
+
+#~ msgid "Keyboard Types"
+#~ msgstr "키보드 타입"
+
+#~ msgid "Writing languages"
+#~ msgstr "입력언어"
+
+#~ msgid "language"
+#~ msgstr "언어"
+
+#~ msgid "ISE selection"
+#~ msgstr "ISE 선택"
+
+#~ msgid "Text input"
+#~ msgstr "문자 입력 설정"
+
+#~ msgid "RAW CODE"
+#~ msgstr "RAW CODE"
+
+#~ msgid "(C) 2002-2006 Ja/mes Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 제임스 수 <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "단축키:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " 멀티바이트 인코딩과 유니코드간 전환.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " 입력기 초기화.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "현재 입력 상태입니다. 바꾸길 원하시면 클릭하십시오."
+
+#~ msgid "Unicode"
+#~ msgstr "유니코드"
+
+#~ msgid "Global Setup"
+#~ msgstr "전체 설정"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "X11, GTK 입력모듈, QT 입력모듈 등 모든 프론트엔드에대한 전체 설정을 합니"
+#~ "다."
+
+#~ msgid "_Trigger:"
+#~ msgstr "전환키(_T):"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "전환키 선택"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "SCIM 입력방식을 끄고/켜기 위한 키 설정입니다. 우측 단추를 클릭하고 수정하"
+#~ "세요."
+
+#~ msgid "Turn _On:"
+#~ msgstr "활성화(_O):"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "활성화키 선택"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "SCIM 입력방식을 켜기 위한 키 설정. 우측 단추를 클릭하고 수정하세요."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "끄기(_f):"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "끄기 키 선택"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "SCIM 입력방식을 끄기 위한 키 설정. 우측 단추를 클릭하고 수정하세요."
+
+#~ msgid "_Next input method:"
+#~ msgstr "다음 입력방식(_N):"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "다음 입력 방식으로 바꾸는데 사용할 키 선택"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "다음 입력방식으로 전환을 위한 키설정. 오를쪽 단추를 클릭하고 수정하세요."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "이전 입력방식(_P):"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "이전 입력방식을 선택"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "이전 입력방식으로 전환을 위한 키 설정. 우측 단추를 클릭하고 수정하세요."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "입력방식 방법 보여줌(_M)"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "입력 방식 보여줌 메뉴 키 선택"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "입력방식 메뉴를 보여줌 설정. 오를쪽 단추를 클릭하고 수정하세요."
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "현재 사용하는 키보드 레이아웃을 선택하세요, 그래야만 사용하려는 입력방법들"
+#~ "이 정확히 작동할수 있습니다."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "조합중인 글자를 클라이언트 윈도우에서 보여줌(_E)"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "이 옵션을 켜면, 조합중인 글자가 독립된 창에서 보이지 않고 입력창에서 바로 "
+#~ "보이게됩니다."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "모든 프로그램에 같은 입력 방법을 공유(_S)"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "이 옵션을 켜면 단하나의 입력 방법을 모든 프로그램에서 동시에 사용하게됩니"
+#~ "다. 선택하지 않으면 각각의 프로그램에서 다른 입력 방법이 적용됩니다."
+
+#~ msgid "Hotkeys"
+#~ msgstr "단축키"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr "각 입력 방법들과 단축키를 활성화하거나, 비활성화 할수 있습니다."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "설치된 입력기 서비스들:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "단축키 수정(_H)"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "선택된 입력 방식에 관련된 단축키 수정."
+
+#~ msgid "Select _Filters"
+#~ msgstr "필터 선택"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "현재 입력 방법에 연결될 필터 선택."
+
+#~ msgid "_Expand"
+#~ msgstr "확장(_E)"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "모든 언어 카테고리를 확장 "
+
+#~ msgid "_Collapse"
+#~ msgstr "축소(_C)"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "모든 언어 카테고리를 축소."
+
+#~ msgid "E_nable All"
+#~ msgstr "모두 활성화(_n)"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "모든 입력 방법을 활성화 "
+
+#~ msgid "_Disable All"
+#~ msgstr "모두 비활성(_D)"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "모든 입력 모듈 비활성화"
+
+#~ msgid "Filters"
+#~ msgstr "필터"
+
+#~ msgid "Description"
+#~ msgstr "설명"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "%s 단축기 수정"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "%s(을)를 위한 필터 선택"
+
+#~ msgid "Move _Up"
+#~ msgstr "위로(_U)"
+
+#~ msgid "Move _Down"
+#~ msgstr "아래로(_D)"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "GTK+-2.x 라이브러리를 기반으로 한 패널 디먼"
+
+#~ msgid "On demand"
+#~ msgstr "필요할때"
+
+#~ msgid "Never"
+#~ msgstr "전혀안함"
+
+#~ msgid "ToolBar"
+#~ msgstr "도구바"
+
+#~ msgid "_Show:"
+#~ msgstr "보이기(_S):"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "자동 스냅(_n)"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "입력방식 아이콘 보임(_i)"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "입력방식 이름 보임(_u)"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "숨기기 시간 제한(_o):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "고정 아이콘 보임(_t)"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "메뉴 아이콘 보임(_e)"
+
+#~ msgid "Show _help icon"
+#~ msgstr "도움말 아이콘 보임(_h)"
+
+#~ msgid "Show _property label"
+#~ msgstr "속성 상태 보임(_p)"
+
+#~ msgid "Input window"
+#~ msgstr "입력창"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "내장된 미리보기 테이블 사용(_m)"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "미리보기 테이블 세로로 보기(_V)"
+
+#~ msgid "Misc"
+#~ msgstr "기타"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "트레이 아이콘 보이기(_y)"
+
+#~ msgid "Stick _windows"
+#~ msgstr "창 고정(_w)"
+
+#~ msgid "_Font:"
+#~ msgstr "글꼴(_F):"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "\"항상\" 옵션이 선택되면 도구상자는 항상 화면에 보이게 됩니다. \"필요할때"
+#~ "\" 옵션이 선택되면 SCIM이 활성화 됐을 때만 보이게 됩니다. \"전혀안함\" 옵"
+#~ "션을 선택하면 전혀 보이지 않게 됩니다."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "이 설정을 선택하면, 도구상자가 화면 가장자리에 맞춰 움직이게 됩니다."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "일정 시간이 지나면 도구상자가 사라질 것입니다. 이 옵션은 \"항상 보임\" 옵"
+#~ "션이 선택 되어 있을때 작동합니다. 0으로 설정하면 작동하지 않습니다."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr "이 옵션을 선택하면, 입력방법 아이콘이 도구상자에 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr "이 옵션을 선택하면, 입력방법의 이름이 도구상자에 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr "이 옵션을 선택하면, 고정 아이콘이 도구상자에 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr "이 옵션을 선택하면, 메뉴 아이콘이 도구상자에 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr "이 옵션을 선택하면, 도구창에 도움말 아이콘이 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "이 옵션을 선택하면, 입력 방식의 속성들을 도구상자에서 볼 수 있습니다."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr "이 옵션을 선택하면, 미리보기 테이블이 입력창에 바로 붙을 것입니다."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr "이 옵션을 선택하면, 미리보기 테이블이 세로로 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "이 옵션을 선택하면, 트레이 아이콘이 데스크탑 테스크바에 보이게 됩니다."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "이 옵션을 선택하면, 도구상자, 입력창과 미리보기창들의 위치가 고정됩니다."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr "글꼴 설정은 입력창과 미리보기 테이블 창에 사용됩니다."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "글꼴 선택"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "프론트엔드"
+
+#~ msgid "IMEngine"
+#~ msgstr "입력기엔진"
+
+#~ msgid "Extra"
+#~ msgstr "기타"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "SCIM 입력기 설정"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">똑똑한 공통 입력 방법</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI 설정 프로그램</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, 제임스 수 <suzhe@tsinghua."
+#~ "org.cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">%s 모듈을 위한 설정.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "SCIM 설정을 종료하시겠습니까?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "모든 환경 설정을 새로 불러오진 못 합니다. 새로운 환경설정을 모두 적용 하"
+#~ "기 위해서는 SCIM을 다시 시작해야 합니다."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "SCIM 설정"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "GTK 라이브러리 기반의 설정 프로그램"
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "똑똑한 공통 입력 방법 (SCIM)을 위한 설정 프로그램"
+
+#~ msgid "SCIM Help"
+#~ msgstr "SCIM 도움말"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "똑똑한 공통 입력 방법"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "입력창과 도구상자 고정/비고정."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "SCIM 과 현재 입력 방법에 대한 간단한 도움말을 보여줌."
+
+#~ msgid "Show command menu."
+#~ msgstr "명령 메뉴를 보임."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 제임스 수 <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "설정 새로 불러오기"
+
+#~ msgid "Stick Windows"
+#~ msgstr "윈도우 고정"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "도구바 숨김"
+
+#~ msgid "Help ..."
+#~ msgstr "도움말 ..."
+
+#~ msgid "Exit"
+#~ msgstr "끝내기"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "En"
--- /dev/null
+# translation of nl.po to Nederlands
+# This file is distributed under the same license as the scim package.
+# Copyright (C) 2004 THE scim'S COPYRIGHT HOLDER.
+#
+#
+# Ronald Stroethoff <stroet43@zonnet.nl>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: nl\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 18:51+0900\n"
+"PO-Revision-Date: 2007-03-17 18:54+0100\n"
+"Last-Translator: Ronald Stroethoff <stroet43@zonnet.nl>\n"
+"Language-Team: Nederlands\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Toetsen selectie"
+
+#, fuzzy
+#~ msgid "Selection"
+#~ msgstr "Toetsen selectie"
+
+#, fuzzy
+#~ msgid "Option"
+#~ msgstr "Opties"
+
+#, fuzzy
+#~ msgid "General"
+#~ msgstr "Duits"
+
+#, fuzzy
+#~ msgid "S/W keyboard"
+#~ msgstr "Nederlands/toetsenbord"
+
+#, fuzzy
+#~ msgid "Keyboard option"
+#~ msgstr "Toetsen selectie"
+
+#, fuzzy
+#~ msgid "H/W keyboard"
+#~ msgstr "Nederlands/toetsenbord"
+
+#, fuzzy
+#~ msgid "option"
+#~ msgstr "Opties"
+
+#, fuzzy
+#~ msgid "Keyboard"
+#~ msgstr "Nederlands/toetsenbord"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "Nederlands/toetsenbord"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "Engels (USA)"
+
+#~ msgid "Amharic"
+#~ msgstr "Amhaars"
+
+#~ msgid "Arabic"
+#~ msgstr "Arabisch"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "Arabisch (Egyptisch)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "Arabisch (Libanees)"
+
+#~ msgid "Assamese"
+#~ msgstr "Assamitisch"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "Azerbeidzjaans"
+
+#~ msgid "Belarusian"
+#~ msgstr "Witrussisch"
+
+#~ msgid "Bulgarian"
+#~ msgstr "Bulgaars"
+
+#~ msgid "Bengali"
+#~ msgstr "Bengaals"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "Bengaals (India)"
+
+#~ msgid "Tibetan"
+#~ msgstr "Tibetaans"
+
+#~ msgid "Bosnian"
+#~ msgstr "Bosnisch"
+
+#~ msgid "Catalan"
+#~ msgstr "Catalaans"
+
+#~ msgid "Czech"
+#~ msgstr "Tschechisch"
+
+#~ msgid "Welsh"
+#~ msgstr "Welsh"
+
+#~ msgid "Danish"
+#~ msgstr "Deens"
+
+#~ msgid "German"
+#~ msgstr "Duits"
+
+#~ msgid "Divehi"
+#~ msgstr "Divehi"
+
+#~ msgid "Greek"
+#~ msgstr "Grieks"
+
+#~ msgid "English"
+#~ msgstr "Engels"
+
+#~ msgid "English (Australian)"
+#~ msgstr "Engels (Australie)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "Engels (Canada)"
+
+#~ msgid "English (British)"
+#~ msgstr "Engels (Groot Britannie)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "Engels (Ierland)"
+
+#~ msgid "English (American)"
+#~ msgstr "Engels (USA)"
+
+#~ msgid "Spanish"
+#~ msgstr "Spaans"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "Spaans (Mexico)"
+
+#~ msgid "Estonian"
+#~ msgstr "Estlands"
+
+#~ msgid "Basque"
+#~ msgstr "Baskisch"
+
+#~ msgid "Persian"
+#~ msgstr "Perzisch"
+
+#~ msgid "Finnish"
+#~ msgstr "Fins"
+
+#~ msgid "French"
+#~ msgstr "Frans"
+
+#~ msgid "Irish"
+#~ msgstr "Iers"
+
+#~ msgid "Galician"
+#~ msgstr "Galicisch"
+
+#~ msgid "Gujarati"
+#~ msgstr "Gujarati"
+
+#~ msgid "Hebrew"
+#~ msgstr "Hebreeuws"
+
+#~ msgid "Hindi"
+#~ msgstr "Hindi"
+
+#~ msgid "Croatian"
+#~ msgstr "Kroatisch"
+
+#~ msgid "Hungarian"
+#~ msgstr "Hongaars"
+
+#~ msgid "Armenian"
+#~ msgstr "Armeens"
+
+#~ msgid "Interlingua"
+#~ msgstr "Interlingua"
+
+#~ msgid "Indonesian"
+#~ msgstr "Indonesisch"
+
+#~ msgid "Icelandic"
+#~ msgstr "IJslands"
+
+#~ msgid "Italian"
+#~ msgstr "Italiaans"
+
+#~ msgid "Japanese"
+#~ msgstr "Japans"
+
+#~ msgid "Georgian"
+#~ msgstr "Georgisch"
+
+#~ msgid "Kazakh"
+#~ msgstr "Kazachs"
+
+#~ msgid "Cambodian"
+#~ msgstr "Cambojaans"
+
+#~ msgid "Kannada"
+#~ msgstr "Kannada"
+
+#~ msgid "Korean"
+#~ msgstr "Koreaans"
+
+#~ msgid "Laothian"
+#~ msgstr "Laothian"
+
+#~ msgid "Lithuanian"
+#~ msgstr "Litouws"
+
+#~ msgid "Latvian"
+#~ msgstr "Lets"
+
+#~ msgid "Macedonian"
+#~ msgstr "Macedonisch"
+
+#~ msgid "Malayalam"
+#~ msgstr "Malayalam"
+
+#~ msgid "Mongolian"
+#~ msgstr "Mongools"
+
+#~ msgid "Marathi"
+#~ msgstr "Marathi"
+
+#~ msgid "Malay"
+#~ msgstr "Maleis"
+
+#~ msgid "Burmese"
+#~ msgstr "Birmaans"
+
+#~ msgid "Nepali"
+#~ msgstr "Nepalees"
+
+#~ msgid "Dutch"
+#~ msgstr "Nederlands"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "Noors (Nynorsk)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "Noors (Bokmal)"
+
+#~ msgid "Oriya"
+#~ msgstr "Oriya"
+
+#~ msgid "Punjabi"
+#~ msgstr "Punjabi"
+
+#~ msgid "Polish"
+#~ msgstr "Pools"
+
+#~ msgid "Portuguese"
+#~ msgstr "Portugees"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "Portugees (Brazilie)"
+
+#~ msgid "Romanian"
+#~ msgstr "Roemeens"
+
+#~ msgid "Russian"
+#~ msgstr "Russisch"
+
+#~ msgid "Sinhala"
+#~ msgstr "Singalees"
+
+#~ msgid "Slovak"
+#~ msgstr "Slowaaks"
+
+#~ msgid "Slovenian"
+#~ msgstr "Sloveens"
+
+#~ msgid "Albanian"
+#~ msgstr "Albanees"
+
+#~ msgid "Serbian"
+#~ msgstr "Servisch"
+
+#~ msgid "Swedish"
+#~ msgstr "Zweeds"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "Zweeds (Finland)"
+
+#~ msgid "Tamil"
+#~ msgstr "Tamil"
+
+#~ msgid "Telugu"
+#~ msgstr "Telugu"
+
+#~ msgid "Thai"
+#~ msgstr "Thais"
+
+#~ msgid "Turkish"
+#~ msgstr "Turks"
+
+#~ msgid "Uighur"
+#~ msgstr "Oeigoers"
+
+#~ msgid "Ukrainian"
+#~ msgstr "Oekraïens"
+
+#~ msgid "Urdu"
+#~ msgstr "Urdu"
+
+#~ msgid "Uzbek"
+#~ msgstr "Oezbeeks"
+
+#~ msgid "Vietnamese"
+#~ msgstr "Vietnamees"
+
+#~ msgid "Walloon"
+#~ msgstr "Waals"
+
+#~ msgid "Yiddish"
+#~ msgstr "Jiddisch"
+
+#~ msgid "Chinese"
+#~ msgstr "Chinees"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "Chinees (versimpeld)"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "Chinees (traditioneell)"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "Belgisch"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "Engels (US)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "Engels (Canada)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "Engels (Ierland)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "Engels (Groot Britannie)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "Engels (USA)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "Engels (Canada)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "Engels (Groot Britannie)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "Engels (Groot Britannie)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "Engels (Canada)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "Engels (Groot Britannie)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "Frans (Canada)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "Frans (Canada)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "Frans (Canada)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "Duits (Schwitsers)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "Frans (Canada)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "Duits (met deadkeys)"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "Duits (Schwitsers)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "Engels (Australie)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "Duits (Schwitsers)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "Duits (Schwitsers)"
+
+#, fuzzy
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "Portugees (Brazilie)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "Portugees (Brazilie)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "Spaans (Latijns Amerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "Spaans (Latijns Amerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "Spaans (Latijns Amerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "Spaans (Latijns Amerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "Spaans (Latijns Amerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "Spaans (CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "Spaans (Mexico)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "Malayalam"
+
+#~ msgid "Norwegian"
+#~ msgstr "Noors"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "Servisch"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "Chinees (traditioneell)"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "Chinees (traditioneell)"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "Chinees (traditioneell)"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "Chinees"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "Chinees (versimpeld)"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "Arabisch (Egyptisch)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "Arabisch (Egyptisch)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "Arabisch (Egyptisch)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "Arabisch (Libanees)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "Arabisch (Egyptisch)"
+
+#~ msgid "Other"
+#~ msgstr "Overige"
+
+#~ msgid "Unknown"
+#~ msgstr "Onbekend"
+
+#~ msgid "English (US)"
+#~ msgstr "Engels (US)"
+
+#~ msgid "Belgian"
+#~ msgstr "Belgisch"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "Tsjechisch (qwerty)"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "Frans (Schwitsers) "
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "Duits (met deadkeys)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "Portugees (Brazilie, US, accent)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "Slowaaks (qwerty)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "Spaans (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "Spaans (Latijns Amerika)"
+
+#~ msgid "English (UK)"
+#~ msgstr "Engels (UK)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "Omzetten versimpeld/traditioneel Chinees"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "Versimpeld naar traditioneel Chinees omzetten en omgekeert."
+
+#, fuzzy
+#~ msgid "SC-TC"
+#~ msgstr "VC-TC"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "Omzetting versimpeld naar traditioneel Chinees"
+
+#~ msgid "No Conversion"
+#~ msgstr "Geen omzetting"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "Versimpeld naar traditioneel"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "Versimpeld Chinees naar triditioneel Chinees omzetten"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "Traditioneel naar versimpeld"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "Traditioneel Chinees naar versimpeld Chinees omzetten"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "VC->TC"
+
+#~ msgid "TC->SC"
+#~ msgstr "TC->VC"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "Smart Common Invoer-methode Plattform "
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(c) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "Aanzetten"
+
+#~ msgid "Name"
+#~ msgstr "Naam"
+
+#~ msgid "Cursor Position"
+#~ msgstr "Cursor positie"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "De huidige positie van de cursor (in karakters)."
+
+#~ msgid "Maximum length"
+#~ msgstr "Maximale lengte"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr "Maximale aantal getoonde karakters. »0« betekend onbegrenst."
+
+#~ msgid "Maximum width"
+#~ msgstr "Maximale Breedte"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "Maximale Breedte van de getoonde letterreeks."
+
+#~ msgid "Has Frame"
+#~ msgstr "Met kader"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "\"Nee\" verwijdert de buitenste rand van de getoonde letter-reeks."
+
+#~ msgid "Draw cursor"
+#~ msgstr "Cursor tonen"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "Met \"JA\" wordt een knipperende cursor getoond."
+
+#~ msgid "Auto move cursor"
+#~ msgstr "Cursor automatisch verplaatsen"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr "Bij »ja«, wordt de cursor automatisch verschoven."
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "Drukknop voor het doorgeven"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr ""
+#~ "Bij »ja«, wordt de gekozen uitdrukking met elke druk op een toets aan het "
+#~ "programma doorgegeven."
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "Venster-formaat automatisch aan teken-lengte aanpassen"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "Bei »ja« is de automatische grootte-aanpassing ingeschakeld."
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr "Bij »ja«, wordt de cursor automatisch verschoven."
+
+#~ msgid "Width in chars"
+#~ msgstr "Breedte in tekens"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr "Aantal tekens waarvoor ruimte gelaten wordt."
+
+#~ msgid "Scroll offset"
+#~ msgstr "Scroll-instelling"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr ""
+#~ "Aantal pixels, waarmee de tekenreeks weergave buiten het scherm naar "
+#~ "links verschoven wordt"
+
+#~ msgid "Text"
+#~ msgstr "Tekst"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "Inhoud van de tekenreeks weergave"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "Gekozen toetsen:"
+
+#~ msgid "Key Code:"
+#~ msgstr "Toetsen Code:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "Wizigings-toetsen:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Ctrl"
+
+#~ msgid "A_lt"
+#~ msgstr "_Alt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Shift"
+
+#~ msgid "_Release"
+#~ msgstr "_Vrijgeven"
+
+#~ msgid "_Meta"
+#~ msgstr "_Meta"
+
+#~ msgid "S_uper"
+#~ msgstr "Su_per"
+
+#~ msgid "_Hyper"
+#~ msgstr "_Hyper"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "Geef eerst een toets-code op."
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "Druk eerst een toets in (of een toetscombinatie).\n"
+#~ " Dit dialoog sluit zich, wanneer de toets wordt losgelaten."
+
+#~ msgid "Grabbing a key."
+#~ msgstr "Een toets pakken."
+
+#~ msgid "Key Selection"
+#~ msgstr "Toetsen selectie"
+
+#~ msgid "Orientation"
+#~ msgstr "Oriëntatie"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "De richting van de werkbalk."
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "Tekst"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amhaars"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Altijd"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Opties"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Nederlands/toetsenbord"
+
+#~ msgid "English/European"
+#~ msgstr "Nederlands/Europeesch"
+
+#, fuzzy
+#~ msgid "RAW CODE"
+#~ msgstr "Unicode RAW CODE"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(c) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Sneltoetsen:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " Omschakelen tussen Multibyte-Codering en Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " Invoer-methode terug zetten.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr ""
+#~ "De status van de huidige invoer-methode. Klik op deze om het te "
+#~ "veranderen."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Algemene instellingen"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Algemene instellingen die door alle FrontEnd-modules gebruikt worden, "
+#~ "inclusief de X11 FrontEnd, GKT IMModule, QT IMModule, enz."
+
+#, fuzzy
+#~ msgid "_Trigger:"
+#~ msgstr "_Trigger:"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Trigger-toetsen kiezen"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Toets-combinaties, waarmee de SCIM-invoer-methode wordt IN- en UIT-"
+#~ "geschakeld. Om dit te veranderen, klik op de rechterknop."
+
+#~ msgid "Turn _On:"
+#~ msgstr "_Inschakelen:"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Kies de inschakel toets."
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Toetscombinatie om de invoer-methode SCIM inteschakelen.Klik op de "
+#~ "rechterknop om te veranderen."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "U_itschakelen"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "UIT-schakeltoetsen uitkiezen"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Toetscombinatie waarmee de invoer-methode SCIM uitgeschakeld wordt. Klik "
+#~ "op de rechterknop om te veranderen."
+
+#~ msgid "_Next input method:"
+#~ msgstr "_Volgende invoer-methode:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr ""
+#~ "Kies een toetscombinatie om naar de volgende invoer-methode te gaan."
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Met deze toetscombinatie, gaat men naar de volgende invoer-methode. klik "
+#~ "op de rechterknop om te veranderen."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "_Vorige invoer-methode:"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Kies de toetscombinatie om naar de vorige invoer-methode te gaan"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Met deze toetscombinatie gaat men naar de vorige invoer-methode. Klik op "
+#~ "de rechterknop om te veranderen."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "Toon het keuze-menu voor invoer-methoden:"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "Kies de toetsen voor het tonen van het invoer-methode kies-menu"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Toetscombinatie's voor het tonen van het invoer-methode kies-menu. Klik "
+#~ "rechts voor het instellen."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "_Toetsenbord layout:"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Kies hier de huidige gebruikte toetsenbord-layout, zodat invoer-methoden, "
+#~ "die van het toetsenbord-layout afhankelijk zijn, goed werken."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "Invoer direkt in programma-venster tonen."
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Wanneer voor deze optie gekozen is, wordt de invoer direkt in het "
+#~ "programma-venster getoond, in plaats van een extra invoer-venster."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "Dezelfde invoer-methode voor alle programma's gebruiken."
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Wanneer dit gekozen is, wordt een en dezelfde invoer-methode voor alle "
+#~ "programma's gebruikt. Wanneer dit niet gekozen is, kan voor elke "
+#~ "programma een andere invoer-methode gekozen worden."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Sneltoetsen"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Hier kunnen de geïnstalleerde invoer-methoden IN- en UIT-geschakeld "
+#~ "worden en hiervoor sneltoetsen gekozen worden."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Geïnstalleerde invoer-methoden:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "_Sneltoetsen instellen"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "Sneltoetsen voor de gekozen invoer-methode instellen."
+
+#~ msgid "Select _Filters"
+#~ msgstr "_Filter selecteren"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "Kies de filter, die aan deze invoer-methode verbonden moet worden."
+
+#~ msgid "_Expand"
+#~ msgstr "Uitbreiden"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Alle taalgroepen uitbreiden."
+
+#~ msgid "_Collapse"
+#~ msgstr "Samenvouwen"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Alle taalgroepen samenvouwen."
+
+#~ msgid "E_nable All"
+#~ msgstr "Alles _inschakelen"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Alle invoer-methoden inschakelen."
+
+#~ msgid "_Disable All"
+#~ msgstr "Alles _uitschakelen"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Alle invoer-methoden uitschakelen."
+
+#~ msgid "Filters"
+#~ msgstr "Filter"
+
+#~ msgid "Languages"
+#~ msgstr "Talen"
+
+#~ msgid "Description"
+#~ msgstr "Omschrijving"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Sneltoetsen voor %s instellen"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Filter voor %s selecteren"
+
+#~ msgid "Move _Up"
+#~ msgstr "Naar _boven"
+
+#~ msgid "Move _Down"
+#~ msgstr "Naar _onderen"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr ""
+#~ "Een hulp-programma met panelen, gebaseert op de GTK+-2.x-bibliotheek."
+
+#~ msgid "On demand"
+#~ msgstr "Op verzoek"
+
+#~ msgid "Never"
+#~ msgstr "Nooit"
+
+#~ msgid "ToolBar"
+#~ msgstr "Werkbalk"
+
+#~ msgid "_Show:"
+#~ msgstr "_Toon:"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Auto s_nap"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Icoon voor invoer-methode tonen"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "_Namen van de invoer-methoden tonen"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "Ontzichtbaar maken na (sec):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Icoon altijd tonen"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "»_Menü« -icoon tonen"
+
+#~ msgid "Show _help icon"
+#~ msgstr "»_Help«-icoon tonen"
+
+#~ msgid "Show _property label"
+#~ msgstr "Eigenschappen-label tonen"
+
+#~ msgid "Input window"
+#~ msgstr "Invoer-venster"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "Interne opzoek-tabel"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "_Vertikale opzoek-tabel"
+
+#~ msgid "Misc"
+#~ msgstr "Diversen"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Toon tra_y icoon"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Venster op plaats vastzetten"
+
+#~ msgid "_Font:"
+#~ msgstr "_Lettertype:"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Wanneer \"Altijd\" is gekozen, wordt de werkbalk altijd op het scherm "
+#~ "getoond. Wanneer \"op verzoek\" is gekozen, wordt de werkbalk alleen "
+#~ "getoond wanneer SCIM aktief is. Wanneer \"Nooit\" is gekozen, wordt de "
+#~ "werkbalk nooit getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt de werkbalk aan de rand van het "
+#~ "beeldscherm vastgeklikt"
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "De werkbalk wordt ontzichtbaar na afloop van de ingestelde tijd. Deze "
+#~ "optie is alleen beschikbaar wanneer \"altijd tonen\" is gekozen.Zet de "
+#~ "tijd op nul (0) om dit gedrag uit te schakelen."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt het icoon van de huidige invoer-"
+#~ "methode in de werkbalk getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt de naam van de huidige invoer-"
+#~ "methode in de werkbalk getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt het sticky-icoon op de werkbalk "
+#~ "getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt het menu in de werkbalk getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt het hulp-icoon in de werkbalk "
+#~ "getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt naam van de invoer-methode getoond "
+#~ "in de werkbalk."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt de opzoek-tabel in het invoer-"
+#~ "venster getoond"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen wordt de opzoek-tabel vertikaal getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, zal het icoon van de werkbalk in het "
+#~ "systeemvak getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, worden de werkbalk, het invoer-venster en "
+#~ "de opzoektabel op deze plaats vastgezet."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "Dit gekozen lettertype wordt in het invoer-venster en in het opzoek-tabel "
+#~ "gebruikt."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Interface-lettertype kiezen"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "FrontEnd"
+
+#~ msgid "IMEngine"
+#~ msgstr "Invoer-methode"
+
+#~ msgid "Panel"
+#~ msgstr "Paneel"
+
+#~ msgid "Extra"
+#~ msgstr "Extra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Instellingen voor de SCIM-invoer-methode"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Smart Common Input Method-Plattform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI instellingen</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Instellen van de %s-Module.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Wilt U de setup van SCIM werkelijk verlaten?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Niet alle instellingen kunnen geladen worden. SCIM moet opnieuw gestart "
+#~ "worden om alle nieuwe instellingen te laden."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Instellen van SCIM"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "Geïntegreerde setup dat op de GTK-widget bibiotheek is gebaseerd."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "Setup voor de Smart Common Invoer-methode-Plattform"
+
+#~ msgid "SCIM Help"
+#~ msgstr "SCIM handboek"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Invoer-methode"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Invoer-venster en de werkbalk vastzetten/verschuifbaar maken."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "Toepasselijke help voor SCIM en de huidige invoer-methode tonen."
+
+#~ msgid "Show command menu."
+#~ msgstr "Commandoregel tonen."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(c) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Instellingen opnieuw laden"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Venster vastzetten"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Werkbalk ontzichtbaar maken"
+
+#~ msgid "Help ..."
+#~ msgstr "Help ..."
+
+#~ msgid "Exit"
+#~ msgstr "Afsluiten"
--- /dev/null
+# translation of pa.po to Punjabi
+# translation of scim.NEW.po to Punjabi
+# translation of scim.po to Punjabi
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Amanpreet Singh Alam <amanpreetalam@yahoo.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pa\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 18:51+0900\n"
+"PO-Revision-Date: 2005-12-13 08:28+0530\n"
+"Last-Translator: Amanpreet Singh Alam <amanpreetalam@yahoo.com>\n"
+"Language-Team: Punjabi <fedora-trans-pa@redhat.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "ਸਵਿੱਚ ਚੋਣ"
+
+#, fuzzy
+#~ msgid "Selection"
+#~ msgstr "ਸਵਿੱਚ ਚੋਣ"
+
+#, fuzzy
+#~ msgid "Option"
+#~ msgstr "ਚੋਣ"
+
+#, fuzzy
+#~ msgid "General"
+#~ msgstr "ਜਰਮਨ"
+
+#, fuzzy
+#~ msgid "S/W keyboard"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ/ਕੀ-ਬੋਰਡ"
+
+#, fuzzy
+#~ msgid "Keyboard option"
+#~ msgstr "ਸਵਿੱਚ ਚੋਣ"
+
+#, fuzzy
+#~ msgid "H/W keyboard"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ/ਕੀ-ਬੋਰਡ"
+
+#, fuzzy
+#~ msgid "option"
+#~ msgstr "ਚੋਣ"
+
+#, fuzzy
+#~ msgid "Keyboard"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ/ਕੀ-ਬੋਰਡ"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ/ਕੀ-ਬੋਰਡ"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਮਰੀਕੀ)"
+
+#~ msgid "Amharic"
+#~ msgstr "ਅਮਹੀਕਿਨ"
+
+#~ msgid "Arabic"
+#~ msgstr "ਅਰਬੀ"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "ਅਰਬੀ (ਮਿਸਰ)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#~ msgid "Assamese"
+#~ msgstr "ਆਸਾਮੀ"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "ਅਜ਼ਰਬਾਈਜਾਨ"
+
+#~ msgid "Belarusian"
+#~ msgstr "ਬੇਲਾਰੂਸੀ"
+
+#~ msgid "Bulgarian"
+#~ msgstr "ਬੁਲਗਾਰੀਅਨ"
+
+#~ msgid "Bengali"
+#~ msgstr "ਬੰਗਾਲੀ"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "ਬੰਗਾਲੀ (ਭਾਰਤ)"
+
+#~ msgid "Tibetan"
+#~ msgstr "ਤਿੱਬਤੀ"
+
+#~ msgid "Bosnian"
+#~ msgstr "ਬੋਸਨੀਅਨ"
+
+#~ msgid "Catalan"
+#~ msgstr "ਕੇਟੇਲਨ"
+
+#~ msgid "Czech"
+#~ msgstr "ਚੈੱਕ"
+
+#~ msgid "Welsh"
+#~ msgstr "ਵਾਲਿਸ਼"
+
+#~ msgid "Danish"
+#~ msgstr "ਡੈਨਿਸ਼"
+
+#~ msgid "German"
+#~ msgstr "ਜਰਮਨ"
+
+#~ msgid "Greek"
+#~ msgstr "ਗਰੀਕ"
+
+#~ msgid "English"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ"
+
+#~ msgid "English (Australian)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਸਟਰੇਲੀਅਨ)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਕੈਨੇਡੀ)"
+
+#~ msgid "English (British)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਆਇਰਲੈਂਡ)"
+
+#~ msgid "English (American)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਮਰੀਕੀ)"
+
+#~ msgid "Spanish"
+#~ msgstr "ਸਪੇਨੀ"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#~ msgid "Estonian"
+#~ msgstr "ਈਸਟੋਨੀਅਨ"
+
+#~ msgid "Basque"
+#~ msgstr "ਬਸਕਿਉ"
+
+#~ msgid "Persian"
+#~ msgstr "ਪਰਸੀਅਨ"
+
+#~ msgid "Finnish"
+#~ msgstr "ਫੈਨਿਸ਼"
+
+#~ msgid "French"
+#~ msgstr "ਫਰੈਂਚ"
+
+#~ msgid "Irish"
+#~ msgstr "ਆਇਰਸ਼"
+
+#~ msgid "Galician"
+#~ msgstr "ਗਾਲੇਸ਼ੀਅਨ"
+
+#~ msgid "Gujarati"
+#~ msgstr "ਗੁਜਰਾਤੀ"
+
+#~ msgid "Hebrew"
+#~ msgstr "ਹੈਬਰਿਊ"
+
+#~ msgid "Hindi"
+#~ msgstr "ਹਿੰਦੀ"
+
+#~ msgid "Croatian"
+#~ msgstr "ਕਰੋਆਟੀਅਨ"
+
+#~ msgid "Hungarian"
+#~ msgstr "ਹੰਗਰੀਅਨ"
+
+#, fuzzy
+#~ msgid "Armenian"
+#~ msgstr "ਰੋਮਾਨੀਆਈ"
+
+#~ msgid "Interlingua"
+#~ msgstr "ਇੰਟਰਲਿੰਗੂਆ"
+
+#~ msgid "Indonesian"
+#~ msgstr "ਇੰਡੋਨੇਸ਼ੀਆਈ"
+
+#~ msgid "Icelandic"
+#~ msgstr "ਆਈਸਲੈਂਡੀ"
+
+#~ msgid "Italian"
+#~ msgstr "ਇਤਾਲਵੀ"
+
+#~ msgid "Japanese"
+#~ msgstr "ਜਾਪਾਨੀ"
+
+#, fuzzy
+#~ msgid "Georgian"
+#~ msgstr "ਜਰਮਨ"
+
+#~ msgid "Kazakh"
+#~ msgstr "ਕਾਜ਼ਕ"
+
+#~ msgid "Cambodian"
+#~ msgstr "ਕੰਬੋਡੀਅਨ"
+
+#~ msgid "Kannada"
+#~ msgstr "ਕੰਨੜ"
+
+#~ msgid "Korean"
+#~ msgstr "ਕੋਰੀਅਨ"
+
+#~ msgid "Laothian"
+#~ msgstr "ਲਿਊਥੀਅਨ"
+
+#~ msgid "Lithuanian"
+#~ msgstr "ਲੀਥੂਵਨੀਅਨ"
+
+#~ msgid "Latvian"
+#~ msgstr "ਲਾਟਵੀਅਨ"
+
+#~ msgid "Macedonian"
+#~ msgstr "ਮੈਕਡੋਨੀਅਨ"
+
+#~ msgid "Malayalam"
+#~ msgstr "ਮਾਲਿਆਲਮ"
+
+#~ msgid "Mongolian"
+#~ msgstr "ਮੰਗੋਲੀਅਨ"
+
+#~ msgid "Marathi"
+#~ msgstr "ਮਰਾਠੀ"
+
+#~ msgid "Malay"
+#~ msgstr "ਮਲਾਇਆ"
+
+#~ msgid "Nepali"
+#~ msgstr "ਨੇਪਾਲੀ"
+
+#~ msgid "Dutch"
+#~ msgstr "ਡੱਚ"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "ਨਾਰਵੇਗੀਅਨ (ਨਿਉਰਸਕ)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "ਨਾਰਵੇਗੀਅਨ (ਬੋਕਮਾਲ)"
+
+#~ msgid "Oriya"
+#~ msgstr "ਓੜੀਆ"
+
+#~ msgid "Punjabi"
+#~ msgstr "ਪੰਜਾਬੀ"
+
+#~ msgid "Polish"
+#~ msgstr "ਪੋਲਿਸ਼"
+
+#~ msgid "Portuguese"
+#~ msgstr "ਪੁਰਤਗਾਲੀ"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "ਪੁਰਤਗਾਲੀ (ਬਰਾਜ਼ੀਲ)"
+
+#~ msgid "Romanian"
+#~ msgstr "ਰੋਮਾਨੀਆਈ"
+
+#~ msgid "Russian"
+#~ msgstr "ਰੂਸੀ"
+
+#~ msgid "Slovak"
+#~ msgstr "ਸਲੋਵਾਕ"
+
+#~ msgid "Slovenian"
+#~ msgstr "ਸਲੋਵੀਅਨ"
+
+#~ msgid "Albanian"
+#~ msgstr "ਅਲਬਾਈਅਨ"
+
+#~ msgid "Serbian"
+#~ msgstr "ਸਰਬੀਅਨ"
+
+#~ msgid "Swedish"
+#~ msgstr "ਸਵੀਡਸ਼"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "ਸਵਡਿਸ਼ (ਫਿਨਲੈਂਡ)"
+
+#~ msgid "Tamil"
+#~ msgstr "ਤਾਮਿਲ"
+
+#~ msgid "Telugu"
+#~ msgstr "ਤੇਲਗੂ"
+
+#~ msgid "Thai"
+#~ msgstr "ਥਾਈ"
+
+#~ msgid "Turkish"
+#~ msgstr "ਤੁਰਕੀ"
+
+#~ msgid "Uighur"
+#~ msgstr "ਊਘਰ"
+
+#~ msgid "Ukrainian"
+#~ msgstr "ਯੂਕਰੇਨੀ"
+
+#~ msgid "Urdu"
+#~ msgstr "ਊਰਦੂ"
+
+#~ msgid "Uzbek"
+#~ msgstr "ਉਜੇਬਕ"
+
+#~ msgid "Vietnamese"
+#~ msgstr "ਵੀਅਤਨਾਮੀ"
+
+#~ msgid "Walloon"
+#~ msgstr "ਵਾਲਿਸ਼"
+
+#~ msgid "Yiddish"
+#~ msgstr "ਯਿਡਿੱਸ਼"
+
+#~ msgid "Chinese"
+#~ msgstr "ਚੀਨੀ"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "ਚੀਨੀ (ਸਧਾਰਨ)"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "ਚੀਨੀ (ਮੂਲ)"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "ਬੈਲਜੀਅਨ"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਮਰੀਕੀ)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਕੈਨੇਡੀ)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਆਇਰਲੈਂਡ)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਮਰੀਕੀ)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਕੈਨੇਡੀ)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਕੈਨੇਡੀ)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "ਫਰੈਂਚ (ਕੈਨੇਡੀ)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "ਫਰੈਂਚ (ਕੈਨੇਡੀ)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "ਫਰੈਂਚ (ਕੈਨੇਡੀ)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "ਜਰਮਨ (ਸਵਿੱਸ)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "ਫਰੈਂਚ (ਕੈਨੇਡੀ)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "ਜਰਮਨ (ਡਿੱਡ ਸਵਿੱਚਾਂ ਨਾਲ)"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "ਜਰਮਨ (ਸਵਿੱਸ)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਸਟਰੇਲੀਅਨ)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "ਜਰਮਨ (ਸਵਿੱਸ)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "ਜਰਮਨ (ਸਵਿੱਸ)"
+
+#, fuzzy
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "ਪੁਰਤਗਾਲੀ (ਬਰਾਜ਼ੀਲ)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "ਪੁਰਤਗਾਲੀ (ਬਰਾਜ਼ੀਲ)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "ਸਪੇਨੀ (CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "ਮਾਲਿਆਲਮ"
+
+#~ msgid "Norwegian"
+#~ msgstr "ਨਾਰਵੇਗੀਅਨ"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "ਸਰਬੀਅਨ"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "ਚੀਨੀ (ਮੂਲ)"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "ਚੀਨੀ (ਮੂਲ)"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "ਚੀਨੀ (ਮੂਲ)"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "ਚੀਨੀ"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "ਚੀਨੀ (ਸਧਾਰਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "ਅਰਬੀ (ਮਿਸਰ)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "ਅਰਬੀ (ਮਿਸਰ)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "ਅਰਬੀ (ਮਿਸਰ)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "ਅਰਬੀ (ਮਿਸਰ)"
+
+#~ msgid "Other"
+#~ msgstr "ਹੋਰ"
+
+#~ msgid "Unknown"
+#~ msgstr "ਅਣਜਾਣ"
+
+#~ msgid "English (US)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਮਰੀਕੀ)"
+
+#~ msgid "Belgian"
+#~ msgstr "ਬੈਲਜੀਅਨ"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "ਚੈੱਕ(ਕਿਉਵਰਟੀ)"
+
+#~ msgid "Dvorak"
+#~ msgstr "ਡਵੋਰਿਕ"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "ਫਰੈਂਚ (ਸਵਟਿਜ਼ਰਲੈਂਡ)"
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "ਜਰਮਨ (ਡਿੱਡ ਸਵਿੱਚਾਂ ਨਾਲ)"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "ਪੁਰਤਗਾਲੀ (ਬਰਾਜ਼ੀਲ ਅਮਰੀਕੀ ਢੰਗ)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "ਸਲੋਵਾਕ(ਕਿਉਵਰਟੀ)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "ਸਪੇਨੀ (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#~ msgid "English (UK)"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "ਸਧਾਰਨ-ਮੂਲ ਚੀਨੀ ਤਬਦੀਲੀ"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "ਸਧਾਰਨ ਚੀਨੀ ਅਤੇ ਮੂਲ ਚੀਨੀ ਵਿੱਚ ਤਬਦੀਲੀ"
+
+#~ msgid "SC-TC"
+#~ msgstr "SC-TC"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "ਸਧਾਰਨ-ਮੂਲ ਚੀਨੀ ਤਬਦੀਲੀ"
+
+#~ msgid "No Conversion"
+#~ msgstr "ਕੋਈ ਤਬਦੀਲੀ ਨਹੀਂ"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "ਸਧਾਰਨ ਤੋਂ ਮੂਲ"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "ਸਧਾਰਨ ਚੀਨੀ ਤੋਂ ਮੂਲ ਚੀਨੀ ਤਬਦੀਲ"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "ਮੂਲ ਤੋਂ ਸਧਾਰਨ"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "ਮੂਲ ਚੀਨੀ ਤੋਂ ਸਧਾਰਨ ਚੀਨੀ ਅਨੁਵਾਦ"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "SC->TC"
+
+#~ msgid "TC->SC"
+#~ msgstr "TC->SC"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "ਸਮਾਰਟ ਕਾਮਨ ਇੰਪੁੱਟ ਮੈਥਡ ਪਲੇਟਫਾਰਮ"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "ਯੋਗ"
+
+#~ msgid "Name"
+#~ msgstr "ਨਾਂ"
+
+#~ msgid "Cursor Position"
+#~ msgstr "ਕਰਸਰ ਸਥਿਤੀ"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "ਕਰਸਰ ਦੀ ਮੌਜੂਦਾ ਸਥਿਤੀ ਅੱਖਰਾਂ ਵਿੱਚ।"
+
+#~ msgid "Maximum length"
+#~ msgstr "ਵੱਧ ਤੋ ਵੱਧ ਲੰਬਾਈ"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr ""
+#~ "ਇਸ ਸਤਰ ਝਲਕ ਲਈ ਵੱਧ ਤੋਂ ਵੱਧ ਅੱਖਰਾਂ ਦੀ ਗਿਣਤੀ। ਜੇਕਰ ਵੱਧ ਤੋਂ ਵੱਧ ਨਾ ਹੋਇਆ ਤਾਂ ਸਿਫ਼ਰ ਹੋਵੇਗਾ।"
+
+#~ msgid "Maximum width"
+#~ msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਚੌੜਾਈ"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "ਇਸ ਸਤਰ ਝਲਕ ਦੀ ਵੱਧ ਤੋਂ ਵੱਧ ਚੌੜਾਈ ਹੈ।"
+
+#~ msgid "Has Frame"
+#~ msgstr "ਫਰੇਮ ਹੈ"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "FALSE ਨਾਲ ਸਤਰ ਝਲਕ ਤੋਂ ਬਾਹਰੀ bevel ਹਟਾਏ ਜਾਏਗਾ।"
+
+#~ msgid "Draw cursor"
+#~ msgstr "ਕਰਸਰ ਬਣਾਓ"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "TRUE ਝਪਕਦੀ ਕਰਸਰ ਬਣਾਏਗਾ।"
+
+#~ msgid "Auto move cursor"
+#~ msgstr "ਸਵੈ ਏਧਰ ਓਧਰ ਕਰਸਰ"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr "TRUE ਮਾਊਸ ਦਬਾਉਣ ਨਾਲ ਕਰਸਰ ਨੂੰ ਸਵੈ-ਚਾਲਤ ਏਧਰ ਓਧਰ ਕੀਤਾ ਜਾਵੇਗਾ।"
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "ਅੱਗੇ ਬਟਨ ਦਬਾਉਣ ਘਟਨਾ"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr "TRUE ਉਪਭੋਗੀ ਪਰੋਗਰਾਮ ਲਈ ਅੱਗੇ ਬਟਨ ਦਬਾਉਣ ਘਟਨਾ ਹੈ।"
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "ਸਤਰ ਫਿੱਟ ਕਰਨ ਲਈ ਵਿਦਗਿਟ ਸਵੈ ਮੁੜ-ਅਕਾਰ"
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "TRUE ਸਵੈ ਮੁੜ-ਅਕਾਰ ਚਾਲੂ ਹੈ।"
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr "TRUE ਮਾਊਸ ਦਬਾਉਣ ਨਾਲ ਕਰਸਰ ਨੂੰ ਸਵੈ-ਚਾਲਤ ਏਧਰ ਓਧਰ ਕੀਤਾ ਜਾਵੇਗਾ।"
+
+#~ msgid "Width in chars"
+#~ msgstr "ਅੱਖਰਾਂ ਵਿੱਚ ਚੌਡ਼ਾਈ"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr "ਸਤਰ ਝਲਕ ਵਿੱਚ ਖਾਲੀ ਥਾਂ ਛੱਡਣ ਲਈ ਅੱਖਰਾਂ ਦੀ ਗਿਣਤੀ ਹੈ।"
+
+#~ msgid "Scroll offset"
+#~ msgstr "ਸੰਤੁਲਨ ਸਕਰੋਲ"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr "ਖੱਬੇ ਤੋਂ ਸਕਰੀਨ ਨੂੰ ਸਤਰ ਝਲਕ ਸਮੇਟਣ ਲਈ ਪਿਕਸਲਾਂ ਦੀ ਗਿਣਤੀ"
+
+#~ msgid "Text"
+#~ msgstr "ਪਾਠ"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "ਸਤਰ ਝਲਕ ਦਾ ਪਰਸੰਗ"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "ਚੁਣੀਆਂ ਸਵਿੱਚਾਂ(_K):"
+
+#~ msgid "Key Code:"
+#~ msgstr "ਸਵਿੱਚ ਕੋਡ:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "ਸੋਧਕ:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Ctrl"
+
+#~ msgid "A_lt"
+#~ msgstr "A_lt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Shift"
+
+#~ msgid "_Release"
+#~ msgstr "ਜਾਰੀ(_R)"
+
+#~ msgid "_Meta"
+#~ msgstr "ਮੈਟਾ(_M)"
+
+#~ msgid "S_uper"
+#~ msgstr "ਸੁਪਰ(_u)"
+
+#~ msgid "_Hyper"
+#~ msgstr "ਹਾਈਪਰ(_H)"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "ਪਹਿਲਾਂ ਇੱਕ ਸਵਿੱਚ ਕੋਡ ਦਿਓ।"
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "ਇੱਕ ਸਵਿੱਚ (ਜਾਂ ਇੱਕ ਸਵਿੱਚ ਜੋੜ) ਦਬਾਉ।\n"
+#~ "ਇਹ ਵਾਰਤਾਲਾਪ ਇੱਕ ਸਵਿੱਚ ਦਬਾਉਣ ਨਾਲ ਬੰਦ ਹੋ ਜਾਵੇਗਾ।"
+
+#~ msgid "Grabbing a key."
+#~ msgstr "ਇੱਕ ਸਵਿੱਚ ਫੜੋ।"
+
+#~ msgid "Key Selection"
+#~ msgstr "ਸਵਿੱਚ ਚੋਣ"
+
+#~ msgid "Orientation"
+#~ msgstr "ਸਥਿਤੀ"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "ਟਰੇ ਦੀ ਸਥਿਤੀ ਹੈ।"
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "ਪਾਠ"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "ਅਮਹੀਕਿਨ"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "ਹਮੇਸ਼ਾ"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "ਚੋਣ"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ/ਕੀ-ਬੋਰਡ"
+
+#~ msgid "English/European"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ/ਯੂਰਪ"
+
+#~ msgid "RAW CODE"
+#~ msgstr "ਕੱਚਾ ਕੋਡ"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "ਹਾਟ ਸਵਿੱਚਾਂ:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " ਬਹੁ-ਬਾਈਟ ਇੰਕੋਡਿੰਗ ਅਤੇ ਯੂਨੀਕਰੋਡ ਵਿੱਚ ਤਬਦੀਲ ਹੋਣ ਲਈ।\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " ਇੰਪੁੱਟ ਢੰਗ ਮੁੜ-ਸੈਟ ਕਰਨ ਲਈ।\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "ਮੌਜੂਦਾ ਇੰਪੁੱਟ ਢੰਗ ਦੀ ਸਥਿਤੀ ਹੈ। ਤਬਦੀਲ ਕਰਨ ਲਈ ਦਬਾਉ।"
+
+#~ msgid "Unicode"
+#~ msgstr "ਯੂਨੀਕੋਡ"
+
+#~ msgid "Global Setup"
+#~ msgstr "ਗਲੋਬਲ ਸੈਟਅੱਪ"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "ਸਭ ਮੁੱਖ ਮੈਡੀਊਲ ਰਾਹੀਂ ਵਰਤੇ ਜਾਦੇ ਗਲੋਬਲ ਚੋਣ ਸੈਟਅੱਪ, ਜਿਸ ਵਿੱਚ X11 ਮੁੱਖ ਭੂਮੀ, GTK IMModule, "
+#~ "QT IMModule ਆਦਿ"
+
+#~ msgid "_Trigger:"
+#~ msgstr "ਤਬਦੀਲ(_T):"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "ਤਬਦੀਲੀ ਸਵਿੱਚ ਚੁਣੋ"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "SCIM ਇੰਪੁੱਟ ਢੰਗ ਨੂੰ ਚਾਲੂ/ਬੰਦ ਕਰਨ ਲਈ ਕੁੰਜੀ ਘਟਨਾ ਹੈ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "Turn _On:"
+#~ msgstr "ਚਾਲੂ ਕਰੋ(_O):"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "ਚਾਲੂ ਕਰਨ ਵਾਲੀਆਂ ਕੁੰਜੀਆਂ ਚੁਣੋ"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "SCIM ਇੰਪੁੱਟ ਢੰਗ ਚਾਲੂ ਕਰਨ ਲਈ ਕੁੰਜੀਆਂ ਦੀ ਚੋਣ ਕਰੋ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਦੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "ਬੰਦ ਕਰੋ(_f):"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "ਬੰਦ ਕਰਨ ਵਾਲੀਆਂ ਕੁੰਜੀਆਂ"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "SCIM ਇੰਪੁੱਟ ਢੰਗ ਬੰਦ ਕਰਨ ਲਈ ਕੁੰਜੀਆਂ ਦੀ ਚੋਣ ਕਰੋ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਦੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "_Next input method:"
+#~ msgstr "ਅੱਗੇ ਇੰਪੁੱਟ ਢੰਗ(_N):"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "ਅੱਗੇ ਇੰਪੁੱਟ ਢੰਗ ਦੀ ਚੋਣ ਕਰਨ ਲਈ ਕੁੰਜੀਆਂ ਚੁਣੋ"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "ਅੱਗੇ ਇੰਪੁੱਟ ਢੰਗ ਦੀ ਚੋਣ ਕਰਨ ਲਈ ਕੁੰਜੀਆਂ ਦੀ ਚੋਣ ਕਰੋ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਦੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "_Previous input method:"
+#~ msgstr "ਪਿੱਛੇ ਇੰਪੁੱਟ ਢੰਗ(_P):"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "ਪਿਛਲਾ ਇੰਪੁੱਟ ਢੰਗ ਕੁੰਜੀਆਂ ਚੁਣੋ"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "ਪਿਛਲਾ ਇੰਪੁੱਟ ਢੰਗ ਚਾਲੂ ਕਰਨ ਲਈ ਕੁੰਜੀਆਂ ਦੀ ਚੋਣ ਕਰੋ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਦੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "ਇੰਪੁੱਟ ਢੰਗ ਮੇਨੂ ਵੇਖਾਓ(_m):"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "ਇੰਪੁੱਟ ਢੰਗ ਮੇਨੂ ਵੇਖਾਉਣ ਲਈ ਕੁੰਜੀਆਂ ਚੁਣੋ"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "ਇੰਪੁੱਟ ਢੰਗ ਮੇਨੂ ਵੇਖਾਉਣ ਲਈ ਕੁੰਜੀਆਂ ਦੀ ਚੋਣ ਕਰੋ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਦੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "ਕੀ-ਬੋਰਡ ਖਾਕਾ(_K):"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "ਤੁਹਾਨੂੰ ਇੱਥੇ ਆਪਣਾ ਮੌਜੂਦਾ ਕੀ-ਬੋਰਡ ਖਾਕੇ ਦੀ ਚੋਣ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ, ਤਾਂ ਕਿ ਇੰਪੁੱਟ ਢੰਗ, ਜੋ ਕਿ ਕੀ-"
+#~ "ਬੋਰਡ ਖਾਕੇ ਦਾ ਖਿਆਲ ਰੱਖਦਾ ਹੈ, ਠੀਕ ਤਰਾਂ ਕੰਮ ਕਰ ਸਕੇ।"
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "ਕਲਾਂਇਟ ਝਰੋਖੇ 'ਚ ਪਹਿਲਾਂ-ਸੋਧ ਸਤਰ(_E)"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਕਲਾਂਇਟ ਇੰਪੁੱਟ ਝਰੋਖੇ ਵਿੱਚ ਪਹਿਲਾਂ-ਸੋਧ ਸਤਰ ਸਿੱਧੀ ਵਿਖਾਈ ਜਾਵੇਗਾ, ਨਾ "
+#~ "ਕਿ ਇੱਕ ਆਜ਼ਾਦ ਤਰਦੇ ਝਰੋਖਾ।"
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "ਸਭ ਕਾਰਜਾਂ 'ਚ ਇੱਕੋ ਹੀ ਇੰਪੁੱਟ ਢੰਗ ਵਰਤੋਂ(_S)"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਸਿਰਫ਼ ਇੱਕ ਹੀ ਇੰਪੁੱਟ ਢੰਗ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਾਵੇਗੀ, ਜੋ ਕਿ ਇੱਕ ਸਮੇਂ ਸਭ "
+#~ "ਕਾਰਜਾਂ ਲਈ ਵਰਤਿਆ ਜਾਵੇਗਾ। ਨਹੀਂ ਤਾਂ ਹਰ ਕਾਰਜ ਲਈ ਵੱਖਰਾ ਢੰਗ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਸੀ।"
+
+#~ msgid "Hotkeys"
+#~ msgstr "ਹਾਟ-ਸਵਿੱਚ"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr "ਤੁਸੀਂ ਇੱਥੇ ਇੰਪੁੱਟ ਢੰਗ ਯੋਗ/ਅਯੋਗ ਕਰ ਅਤੇ ਇੰਪੁੱਟ ਢੰਗ ਲਈ ਹਾਟ-ਸਵਿੱਚਾਂ ਸੈਟ ਕਰ ਸਕਦੇ ਹੋ।"
+
+#~ msgid "The installed input method services:"
+#~ msgstr "ਇੰਸਟਾਲ ਹੋਏ ਇੰਪੁੱਟ ਢੰਗ ਸੇਵਾਵਾਂ:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "ਹਾਟ-ਸਵਿੱਚ ਸੋਧ(_H)"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "ਚੁਣੇ ਇੰਪੁੱਟ ਢੰਗ ਨਾਲ ਸਬੰਧਤ ਹਾਟ-ਕੁੰਜੀਆਂ ਦੀ ਸੋਧ ਕਰੋ।"
+
+#~ msgid "Select _Filters"
+#~ msgstr "ਫਿਲਟਰ ਚੁਣੋ(_F)"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "ਫਿਲਟਰ ਦੀ ਚੋਣ ਕਰੋ, ਜੋ ਕਿ ਇਸ ਇੰਪੁੱਟ ਢੰਗ ਨਾਲ ਜੋੜਿਆ ਜਾਵੇਗਾ।"
+
+#~ msgid "_Expand"
+#~ msgstr "ਫੈਲਾਓ(_E)"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "ਸਭ ਭਾਸ਼ਾ ਵਰਗ ਫੈਲਾਓ।"
+
+#~ msgid "_Collapse"
+#~ msgstr "ਸਮੇਟੋ(_C)"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "ਸਭ ਭਾਸ਼ਾ ਵਰਗ ਸਮੇਟੋ।"
+
+#~ msgid "E_nable All"
+#~ msgstr "ਸਭ ਯੋਗ(_n)"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "ਸਭ ਇੰਪੁੱਟ ਢੰਗ ਯੋਗ ਕਰਦਾ ਹੈ।"
+
+#~ msgid "_Disable All"
+#~ msgstr "ਸਭ ਆਯੋਗ(_D)"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "ਸਭ ਇੰਪੁੱਟ ਢੰਗ ਆਯੋਗ ਹਨ।"
+
+#~ msgid "Filters"
+#~ msgstr "ਫਿਲਟਰ"
+
+#~ msgid "Languages"
+#~ msgstr "ਭਾਸ਼ਾਵਾਂ"
+
+#~ msgid "Description"
+#~ msgstr "ਵੇਰਵਾ"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "%s ਲਈ ਹਾਟ-ਸਵਿੱਚ ਸੋਧ"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "%s ਲਈ ਫਿਲਟਰ ਚੁਣੋ"
+
+#~ msgid "Move _Up"
+#~ msgstr "ਉੱਪਰ ਜਾਓ(_U)"
+
+#~ msgid "Move _Down"
+#~ msgstr "ਹੇਠਾਂ ਜਾਓ(_D)"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "GTK+-2.x ਲਾਇਬਰੇਰੀ 'ਤੇ ਪੈਨਲ ਡਾਈਮੋਨ ਹੈ।"
+
+#~ msgid "On demand"
+#~ msgstr "ਲੋੜ ਸਮੇਂ"
+
+#~ msgid "Never"
+#~ msgstr "ਕਦੇ ਨਹੀਂ"
+
+#~ msgid "ToolBar"
+#~ msgstr "ਸੰਦ-ਪੱਟੀ"
+
+#~ msgid "_Show:"
+#~ msgstr "ਵੇਖਾਓ(_S):"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "ਸਵੈ ਸਨੈਪ(_n)"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "ਇੰਪੁੱਟ ਆਈਕਾਨ ਢੰਗ ਆਈਕਾਨ ਵੇਖਾਓ(_i)"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "ਇੰਪੁੱਟ ਢੰਗ ਨਾਂ ਵੇਖਾਓ(_u)"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "ਸਮਾਂ-ਅੰਤਰਾਲ ਓਹਲੇ(_o):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "ਟਿੱਕ ਆਈਕਾਨ ਵੇਖਾਓ(_t)"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "ਮੇਨੂ ਆਈਕਾਨ ਵੇਖਾਓ(_e)"
+
+#~ msgid "Show _help icon"
+#~ msgstr "ਸਹਾਇਤਾ ਆਈਕਾਨ ਵੇਖਾਓ(_h)"
+
+#~ msgid "Show _property label"
+#~ msgstr "ਵਿਸ਼ੇਸ਼ਤਾ ਲੇਬਲ ਵੇਖਾਓ(_p)"
+
+#~ msgid "Input window"
+#~ msgstr "ਇੰਪੁੱਟ ਝਰੋਖਾ"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "ਸ਼ਾਮਲ ਖੋਜ ਸਾਰਣੀ(_m)"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "ਲੰਬਕਾਰੀ ਖੋਜ ਸਾਰਣੀ(_V)"
+
+#~ msgid "Misc"
+#~ msgstr "ਫੁਟਕਲ"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "ਟਰੇ ਆਈਕਾਨ ਵੇਖਾਓ(_y)"
+
+#~ msgid "Stick _windows"
+#~ msgstr "ਝਰੋਖੇ ਚੇਪੋ(_w)"
+
+#~ msgid "_Font:"
+#~ msgstr "ਫੋਂਟ(_F):"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "ਜੇਕਰ \"ਹਮੇਸ਼ਾ\" ਚੋਣ ਯੋਗ ਕੀਤੀ ਗਈ ਤਾਂ, ਸੰਦ-ਪੱਟੀ ਨੂੰ ਹਮੇਸ਼ਾ ਪਰਦੇ 'ਤੇ ਵਿਖਾਇਆ ਜਾਵੇਗਾ। ਜੇਕਰ "
+#~ "\"ਲੋੜ ਸਮੇਂ\" ਦੀ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਹੀ ਵੇਖਾਇਆ ਜਾਵੇਗਾ, ਜਦੋਂ SCIM ਦੇ ਸਰਗਰਮ ਹੋਵੇਗਾ। ਜੇਕਰ \"ਕਦੇ "
+#~ "ਨਹੀਂ\" ਦੀ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਇਸ ਨੂੰ ਕਦੇ ਨਹੀਂ ਵੇਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਸੰਦ-ਪੱਟੀ ਸਕਰੀਨ ਹਾਸ਼ੀਏ 'ਚ ਸਮੇਟੀ ਜਾਵੇਗੀ।"
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "ਇਸ ਅੰਤਰਾਲ ਖਤਮ ਹੋਣ ਦੇ ਬਾਅਦ ਸੰਦ-ਪੱਟੀ ਨੂੰ ਓਹਲੇ ਕੀਤਾ ਜਾਵੇਗਾ। ਇਹ ਚੋਣ ਸਿਰਫ਼ ਤਾਂ ਹੀ ਠੀਕ ਹੈ, "
+#~ "ਜੇਕਰ \"ਹਮੇਸ਼ਾ ਵੇਖਾਓ\" ਦੀ ਚੋਣ ਕੀਤੀ ਹੈ। ਇਸ ਵਿਹਾਰ ਨੂੰ ਅਯੋਗ ਕਰਨ ਲਈ ਜ਼ੀਰੋ (0) ਬਣਾਓ।"
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਇੰਪੁੱਟ ਢੰਗ ਆਈਕਾਨ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਇੰਪੁੱਟ ਢੰਗ ਨਾਂ ਨੂੰ ਸੰਦ-ਪੱਟੀ 'ਚ ਚੁਣਿਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਸਟਿੱਕੀ ਆਈਕਾਨ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਮੇਨੂ ਆਈਕਾਨ ਨੂੰ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਸਹਾਇਤਾ ਆਈਕਾਨ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਇਆ ਜਾਦਾ ਹੈ।"
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਇੰਪੁੱਟ ਢੰਗ ਵਿਸ਼ੇਸ਼ਤਾ ਦਾ ਪਾਠ ਲੇਬਲ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਖੋਜ ਸਾਰਣੀ ਨੂੰ ਇੰਪੁੱਟ ਝਰੋਖੇ 'ਚ ਹੀ ਸ਼ਾਮਲ ਕੀਤਾ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਖੋਜ ਸਾਰਣੀ ਨੂੰ ਲੰਬਕਾਰੀ ਰੂਪ 'ਚ ਵਿਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਟਰੇ ਆਈਕਾਨ ਨੂੰ ਵੇਹੜੇ ਦੀ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਉ।"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਸੰਦ-ਪੱਟੀ, ਇੰਪੁੱਟ ਅਤੇ ਖੋਜ ਸਾਰਣੀ ਝਰੋਖੇ ਨੂੰ ਇਸ ਦੀ ਅਸਲੀ ਸਥਿਤੀ ਨਾਲ "
+#~ "ਹੀ ਜੋੜੀ ਰੱਖਿਆ ਜਾਵੇਗਾ।"
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr "ਇੰਪੁੱਟ ਅਤੇ ਖੋਜ ਸਾਰਣੀ ਝਰੋਖੇ ਵਿੱਚ ਫੋਂਟ ਸੈਟਿੰਗ ਵਰਤੀ ਜਾਵੇਗੀ।"
+
+#~ msgid "Select Interface Font"
+#~ msgstr "ਇੰਟਰਫੇਸ ਫੋਂਟ ਚੁਣੋ"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "ਮੁੱਖ-ਭਾਗ"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMEngine"
+
+#~ msgid "Panel"
+#~ msgstr "ਪੈਨਲ"
+
+#~ msgid "Extra"
+#~ msgstr "ਹੋਰ"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "SCIM ਇੰਪੁੱਟ ਢੰਗ ਸੈਟਅੱਪ"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">ਸਮਾਰਟ ਕਾਮਨ ਇੰਪੁੱਟ ਮੈਂਥਡ ਪਲੇਟਫਾਰਮ</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI ਸੈਟਅੱਪ ਸਹੂਲਤ</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">ਕਾਪੀਰਾਈਟ 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">%s ਮੈਡੀਊਲ ਲਈ ਸੈਟਅੱਪ ਹੈ।</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "ਕੀ ਤੁਸੀਂ SCIM ਸੈਟਅੱਪ ਨੂੰ ਬੰਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "ਸਭ ਸੰਰਚਨਾ ਨੂੰ ਯਕਦਮ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। ਨਵੀਂ ਸੰਰਚਨਾ ਨੂੰ ਪਰਭਾਵੀ ਹੋਣ ਲਈ SCIM ਨੂੰ ਮੁੜ-"
+#~ "ਚਾਲੂ ਕਰਨਾ ਨਾ ਭੁੱਲੋ।"
+
+#~ msgid "SCIM Setup"
+#~ msgstr "SCIM ਸੈਟਅੱਪ"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "GTK ਵਿਦਗਿਟ ਲਾਇਬਰੇਰੀ 'ਤੇ ਅਧਾਰਤ ਸੈਟਅੱਪ ਸਹੂਲਤ ਹੈ।"
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "ਸਮਾਰਟ ਕਾਮਨ ਇੰਪੁੱਟ ਮੈਂਥਸਡ ਪਲੇਟਫਾਰਮ ਲਈ ਸੈਟਅੱਪ ਸਹੂਲਤ"
+
+#~ msgid "SCIM Help"
+#~ msgstr "SCIM ਸਹਾਇਤਾ"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "ਸਮਾਰਟ ਕਾਮਨ ਇੰਪੁੱਟ ਮੈਂਥਡ"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "ਇੰਪੁੱਟ ਝਰੋਖਾ ਅਤੇ ਸੰਦ-ਪੱਟੀ ਸਟਿੱਕੀ/ਨਾ-ਸਟਿੱਕੀ ਹੈ।"
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "SCIM ਅਤੇ ਮੌਜੂਦਾ ਇੰਪੁੱਟ ਢੰਗ ਬਾਰੇ ਸੰਖੇਪ ਸਹਾਇਤਾ ਵਿਖਾਓ।"
+
+#~ msgid "Show command menu."
+#~ msgstr "ਕਮਾਂਡ ਮੇਨ ਵੇਖਾਓ।"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "ਸੰਰਚਨਾ ਮੁੜ-ਲੋਡ"
+
+#~ msgid "Stick Windows"
+#~ msgstr "ਸਟਿੱਕੀ ਝਰੋਖੇ"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "ਸੰਦ-ਪੱਟੀ ਓਹਲੇ"
+
+#~ msgid "Help ..."
+#~ msgstr "ਸਹਾਇਤਾ ..."
+
+#~ msgid "Exit"
+#~ msgstr "ਬਾਹਰ"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "En"
--- /dev/null
+# Swedish translation for scim
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the scim package.
+# <>, 2006.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: scim\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 18:51+0900\n"
+"PO-Revision-Date: 2006-09-09 21:37+0200\n"
+"Last-Translator: <>\n"
+"Language-Team: Swedish <sv@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Tangentval"
+
+#, fuzzy
+#~ msgid "Selection"
+#~ msgstr "Tangentval"
+
+#, fuzzy
+#~ msgid "Option"
+#~ msgstr "Alternativ"
+
+#, fuzzy
+#~ msgid "General"
+#~ msgstr "Tyska"
+
+#, fuzzy
+#~ msgid "S/W keyboard"
+#~ msgstr "Latinsk teckeninmatning"
+
+#, fuzzy
+#~ msgid "Keyboard option"
+#~ msgstr "Tangentval"
+
+#, fuzzy
+#~ msgid "H/W keyboard"
+#~ msgstr "Latinsk teckeninmatning"
+
+#, fuzzy
+#~ msgid "option"
+#~ msgstr "Alternativ"
+
+#, fuzzy
+#~ msgid "Keyboard"
+#~ msgstr "Latinsk teckeninmatning"
+
+#~ msgid "English/Keyboard"
+#~ msgstr "Latinsk teckeninmatning"
+
+#, fuzzy
+#~ msgid "English input service"
+#~ msgstr "Engelska (amerikansk)"
+
+#~ msgid "Amharic"
+#~ msgstr "Amhariska"
+
+#~ msgid "Arabic"
+#~ msgstr "Arabiska"
+
+#~ msgid "Arabic (Egypt)"
+#~ msgstr "Arabiska (Egypten)"
+
+#~ msgid "Arabic (Lebanon)"
+#~ msgstr "Arabiska (Libanon)"
+
+#~ msgid "Assamese"
+#~ msgstr "Assamesiska"
+
+#~ msgid "Azerbaijani"
+#~ msgstr "Azerbajdzjanska"
+
+#~ msgid "Belarusian"
+#~ msgstr "Vitryska"
+
+#~ msgid "Bulgarian"
+#~ msgstr "Bulgariska"
+
+#~ msgid "Bengali"
+#~ msgstr "Bengali"
+
+#~ msgid "Bengali (India)"
+#~ msgstr "Bengali (Indien)"
+
+#~ msgid "Tibetan"
+#~ msgstr "Tibetanska"
+
+#~ msgid "Bosnian"
+#~ msgstr "Bosniska"
+
+#~ msgid "Catalan"
+#~ msgstr "Katalanska"
+
+#~ msgid "Czech"
+#~ msgstr "Tjeckiska"
+
+#~ msgid "Welsh"
+#~ msgstr "Kymriska"
+
+#~ msgid "Danish"
+#~ msgstr "Danska"
+
+#~ msgid "German"
+#~ msgstr "Tyska"
+
+#~ msgid "Greek"
+#~ msgstr "Grekiska"
+
+#~ msgid "English"
+#~ msgstr "Engelska"
+
+#~ msgid "English (Australian)"
+#~ msgstr "Engelska (australiensisk)"
+
+#~ msgid "English (Canadian)"
+#~ msgstr "Engelska (kanadensisk)"
+
+#~ msgid "English (British)"
+#~ msgstr "Engelska (brittisk)"
+
+#~ msgid "English (Ireland)"
+#~ msgstr "Engelska (irländsk)"
+
+#~ msgid "English (American)"
+#~ msgstr "Engelska (amerikansk)"
+
+#~ msgid "Spanish"
+#~ msgstr "Spanska"
+
+#~ msgid "Spanish (Mexico)"
+#~ msgstr "Spanska (Mexiko)"
+
+#~ msgid "Estonian"
+#~ msgstr "Estniska"
+
+#~ msgid "Basque"
+#~ msgstr "Baskiska"
+
+#~ msgid "Persian"
+#~ msgstr "Persiska"
+
+#~ msgid "Finnish"
+#~ msgstr "Finska"
+
+#~ msgid "French"
+#~ msgstr "Franska"
+
+#~ msgid "Irish"
+#~ msgstr "Irländska"
+
+#~ msgid "Galician"
+#~ msgstr "Galiciska"
+
+#~ msgid "Gujarati"
+#~ msgstr "Gujarati"
+
+#~ msgid "Hebrew"
+#~ msgstr "Hebreiska"
+
+#~ msgid "Hindi"
+#~ msgstr "Hindi"
+
+#~ msgid "Croatian"
+#~ msgstr "Kroatiska"
+
+#~ msgid "Hungarian"
+#~ msgstr "Ungerska"
+
+#, fuzzy
+#~ msgid "Armenian"
+#~ msgstr "Rumänska"
+
+#~ msgid "Interlingua"
+#~ msgstr "Interlingua"
+
+#~ msgid "Indonesian"
+#~ msgstr "Indonesiska"
+
+#~ msgid "Icelandic"
+#~ msgstr "Isländska"
+
+#~ msgid "Italian"
+#~ msgstr "Italienska"
+
+#~ msgid "Japanese"
+#~ msgstr "Japanska"
+
+#, fuzzy
+#~ msgid "Georgian"
+#~ msgstr "Tyska"
+
+#~ msgid "Kazakh"
+#~ msgstr "Kazakisk"
+
+#~ msgid "Cambodian"
+#~ msgstr "Kambodjanska"
+
+#~ msgid "Kannada"
+#~ msgstr "Kannada"
+
+#~ msgid "Korean"
+#~ msgstr "Koreanska"
+
+#~ msgid "Laothian"
+#~ msgstr "Laotiska"
+
+#~ msgid "Lithuanian"
+#~ msgstr "Litauiska"
+
+#~ msgid "Latvian"
+#~ msgstr "Lettiska"
+
+#~ msgid "Macedonian"
+#~ msgstr "Makedonska"
+
+#~ msgid "Malayalam"
+#~ msgstr "Malayalam"
+
+#~ msgid "Mongolian"
+#~ msgstr "Mongolska"
+
+#~ msgid "Marathi"
+#~ msgstr "Marathi"
+
+#~ msgid "Malay"
+#~ msgstr "Malay"
+
+#~ msgid "Nepali"
+#~ msgstr "Nepali (Khaskura)"
+
+#~ msgid "Dutch"
+#~ msgstr "Holländska"
+
+#, fuzzy
+#~ msgid "Norwegian (Nynorsk)"
+#~ msgstr "Norska (nynorsk)"
+
+#, fuzzy
+#~ msgid "Norwegian (Bokmal)"
+#~ msgstr "Norska (bokmål)"
+
+#~ msgid "Oriya"
+#~ msgstr "Oriya"
+
+#~ msgid "Punjabi"
+#~ msgstr "Punjabi"
+
+#~ msgid "Polish"
+#~ msgstr "Polska"
+
+#~ msgid "Portuguese"
+#~ msgstr "Portugisiska"
+
+#~ msgid "Portuguese (Brazil)"
+#~ msgstr "Portugisiska (Brasilien)"
+
+#~ msgid "Romanian"
+#~ msgstr "Rumänska"
+
+#~ msgid "Russian"
+#~ msgstr "Ryska"
+
+#~ msgid "Slovak"
+#~ msgstr "Slovakiska"
+
+#~ msgid "Slovenian"
+#~ msgstr "Slovenska"
+
+#~ msgid "Albanian"
+#~ msgstr "Albanska"
+
+#~ msgid "Serbian"
+#~ msgstr "Serbiska"
+
+#~ msgid "Swedish"
+#~ msgstr "Svenska"
+
+#~ msgid "Swedish (Finland)"
+#~ msgstr "Svenska (Finland)"
+
+#~ msgid "Tamil"
+#~ msgstr "Tamil"
+
+#~ msgid "Telugu"
+#~ msgstr "Telagu"
+
+#~ msgid "Thai"
+#~ msgstr "Thai"
+
+#~ msgid "Turkish"
+#~ msgstr "Turkiska"
+
+#~ msgid "Uighur"
+#~ msgstr "Uiguriska"
+
+#~ msgid "Ukrainian"
+#~ msgstr "Ukrainska"
+
+#~ msgid "Urdu"
+#~ msgstr "Urdu"
+
+#~ msgid "Uzbek"
+#~ msgstr "Uzbekiska"
+
+#~ msgid "Vietnamese"
+#~ msgstr "Vietnamesiska"
+
+#~ msgid "Walloon"
+#~ msgstr "Vallonska"
+
+#~ msgid "Yiddish"
+#~ msgstr "Jiddish"
+
+#~ msgid "Chinese"
+#~ msgstr "Kinesiska"
+
+#, fuzzy
+#~ msgid "Chinese (Simplified)"
+#~ msgstr "Kinesiska (förenklad)"
+
+#, fuzzy
+#~ msgid "Chinese (Traditional)"
+#~ msgstr "Kinesiska (traditionell)"
+
+#, fuzzy
+#~ msgid "Dutch (Belgian)"
+#~ msgstr "Belgisk"
+
+#, fuzzy
+#~ msgid "English (United States)"
+#~ msgstr "Engelsk (US)"
+
+#, fuzzy
+#~ msgid "English (United Kingdom)"
+#~ msgstr "Engelska (kanadensisk)"
+
+#, fuzzy
+#~ msgid "English (New Zealand)"
+#~ msgstr "Engelska (irländsk)"
+
+#, fuzzy
+#~ msgid "English (Irish)"
+#~ msgstr "Engelska (brittisk)"
+
+#, fuzzy
+#~ msgid "English (South Africa)"
+#~ msgstr "Engelska (amerikansk)"
+
+#, fuzzy
+#~ msgid "English (Jamaica)"
+#~ msgstr "Engelska (kanadensisk)"
+
+#, fuzzy
+#~ msgid "English (Belize)"
+#~ msgstr "Engelska (brittisk)"
+
+#, fuzzy
+#~ msgid "English (Trinidad)"
+#~ msgstr "Engelska (brittisk)"
+
+#, fuzzy
+#~ msgid "English (Zimbabwe)"
+#~ msgstr "Engelska (kanadensisk)"
+
+#, fuzzy
+#~ msgid "English (Philippines)"
+#~ msgstr "Engelska (brittisk)"
+
+#, fuzzy
+#~ msgid "French (Standard)"
+#~ msgstr "Fransk (kanadensisk)"
+
+#, fuzzy
+#~ msgid "French (Belgian)"
+#~ msgstr "Fransk (kanadensisk)"
+
+#~ msgid "French (Canadian)"
+#~ msgstr "Fransk (kanadensisk)"
+
+#, fuzzy
+#~ msgid "French (Swiss)"
+#~ msgstr "Tysk (Schweizisk)"
+
+#, fuzzy
+#~ msgid "French (Monaco)"
+#~ msgstr "Fransk (kanadensisk)"
+
+#, fuzzy
+#~ msgid "German (Standard)"
+#~ msgstr "Tysk (med 'Tottaste')"
+
+#~ msgid "German (Swiss)"
+#~ msgstr "Tysk (Schweizisk)"
+
+#, fuzzy
+#~ msgid "German (Austrian)"
+#~ msgstr "Engelska (australiensisk)"
+
+#, fuzzy
+#~ msgid "German (Liechtenstein)"
+#~ msgstr "Tysk (Schweizisk)"
+
+#, fuzzy
+#~ msgid "Italian (Swiss)"
+#~ msgstr "Tysk (Schweizisk)"
+
+#, fuzzy
+#~ msgid "Portuguese (Brazilian)"
+#~ msgstr "Portugisiska (Brasilien)"
+
+#, fuzzy
+#~ msgid "Portuguese (Standard)"
+#~ msgstr "Portugisiska (Brasilien)"
+
+#, fuzzy
+#~ msgid "Spanish (Traditional Sort)"
+#~ msgstr "Spansk (Latinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Mexican)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Guatemala)"
+#~ msgstr "Spansk (Latinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Costa Rica)"
+#~ msgstr "Spansk (Latinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Panama)"
+#~ msgstr "Spansk (Latinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Dominican Republic)"
+#~ msgstr "Spansk (Latinamerika)"
+
+#, fuzzy
+#~ msgid "Spanish (Venezuela)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Colombia)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Peru)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Argentina)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Ecuador)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Chile)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Uruguay)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Paraguay)"
+#~ msgstr "Spansk (CP 850)"
+
+#, fuzzy
+#~ msgid "Spanish (Bolivia)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Honduras)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Nicaragua)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Spanish (Puerto Rico)"
+#~ msgstr "Spanska (Mexiko)"
+
+#, fuzzy
+#~ msgid "Malay (Malaysia)"
+#~ msgstr "Malayalam"
+
+#~ msgid "Norwegian"
+#~ msgstr "Norsk"
+
+#, fuzzy
+#~ msgid "Serbian (Latin)"
+#~ msgstr "Serbiska"
+
+#, fuzzy
+#~ msgid "Chinese (Taiwan)"
+#~ msgstr "Kinesiska (traditionell)"
+
+#, fuzzy
+#~ msgid "Chinese (Hong Kong)"
+#~ msgstr "Kinesiska (traditionell)"
+
+#, fuzzy
+#~ msgid "Chinese (Macau)"
+#~ msgstr "Kinesiska (traditionell)"
+
+#, fuzzy
+#~ msgid "Chinese (PRC)"
+#~ msgstr "Kinesiska"
+
+#, fuzzy
+#~ msgid "Chinese (Singapore)"
+#~ msgstr "Kinesiska (förenklad)"
+
+#, fuzzy
+#~ msgid "Arabic (Iraq)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Libya)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Algeria)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Morocco)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Tunisia)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Oman)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Yemen)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Syria)"
+#~ msgstr "Arabiska (Egypten)"
+
+#, fuzzy
+#~ msgid "Arabic (Jordan)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Kuwait)"
+#~ msgstr "Arabiska (Egypten)"
+
+#, fuzzy
+#~ msgid "Arabic (UAE)"
+#~ msgstr "Arabiska (Egypten)"
+
+#, fuzzy
+#~ msgid "Arabic (Bahrain)"
+#~ msgstr "Arabiska (Libanon)"
+
+#, fuzzy
+#~ msgid "Arabic (Qatar)"
+#~ msgstr "Arabiska (Egypten)"
+
+#~ msgid "Other"
+#~ msgstr "Annat"
+
+#~ msgid "Unknown"
+#~ msgstr "Okänd"
+
+#~ msgid "English (US)"
+#~ msgstr "Engelsk (US)"
+
+#~ msgid "Belgian"
+#~ msgstr "Belgisk"
+
+#~ msgid "Czech (qwerty)"
+#~ msgstr "Tjeckisk (qwerty)"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "French (Switzerland)"
+#~ msgstr "Fransk (schweizisk)"
+
+#~ msgid "German (with deadkeys)"
+#~ msgstr "Tysk (med 'Tottaste')"
+
+#~ msgid "Portuguese (Brazil US accents)"
+#~ msgstr "Portugisisk (Brazilien, am. diakriter)"
+
+#~ msgid "Slovak (qwerty)"
+#~ msgstr "Slovakisk (qwerty)"
+
+#~ msgid "Spanish (CP 850)"
+#~ msgstr "Spansk (CP 850)"
+
+#~ msgid "Spanish (Latin America)"
+#~ msgstr "Spansk (Latinamerika)"
+
+#~ msgid "English (UK)"
+#~ msgstr "Engelsk (UK)"
+
+#~ msgid "Simplified-Traditional Chinese Conversion"
+#~ msgstr "Omvandling förenklad/traditionell kinesiska"
+
+#~ msgid "Convert between Simplified Chinese and Traditional Chinese"
+#~ msgstr "Omvandla förenklad kinesiska till traditionell och vice versa"
+
+#~ msgid "SC-TC"
+#~ msgstr "SC-TC"
+
+#~ msgid "Simplified-Traditional Chinese conversion"
+#~ msgstr "Omvandling förenklad/traditionell kinesiska"
+
+#~ msgid "No Conversion"
+#~ msgstr "Ingen omvandling"
+
+#~ msgid "Simplified to Traditional"
+#~ msgstr "Förenklad till traditionell"
+
+#~ msgid "Convert Simplified Chinese to Traditional Chinese"
+#~ msgstr "Omvandla förenklad kinesiska till traditionell"
+
+#~ msgid "Traditional to Simplified"
+#~ msgstr "Traditionell till förenklad"
+
+#~ msgid "Convert Traditional Chinese to Simplified Chinese"
+#~ msgstr "Omvandla traditionell kinesiska till förenklad"
+
+#~ msgid "James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "SC->TC"
+#~ msgstr "SC->TC"
+
+#~ msgid "TC->SC"
+#~ msgstr "TC->SC"
+
+#~ msgid "Smart Common Input Method platform "
+#~ msgstr "Scim-plattformen (Smart Common Input Method)"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+
+#~ msgid ""
+#~ ":\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Enable"
+#~ msgstr "Aktivera"
+
+#~ msgid "Name"
+#~ msgstr "Namn"
+
+#~ msgid "Cursor Position"
+#~ msgstr "Markörens position"
+
+#~ msgid "The current position of the insertion cursor in chars."
+#~ msgstr "Markörens läge i texten, räknat i tecken."
+
+#~ msgid "Maximum length"
+#~ msgstr "Maxlängd"
+
+#~ msgid ""
+#~ "Maximum number of characters for this string view. Zero if no maximum."
+#~ msgstr ""
+#~ "Högsta antal tecken att visa i den här teckenraden. Välj 0 för att inte "
+#~ "begränsa längden."
+
+#~ msgid "Maximum width"
+#~ msgstr "Maxbredd"
+
+#~ msgid "Maximum width of this string view."
+#~ msgstr "Maximal bredd för att visa den här teckenraden."
+
+#~ msgid "Has Frame"
+#~ msgstr "Med ram"
+
+#~ msgid "FALSE removes outside bevel from string view."
+#~ msgstr "Om FALSK tas ytterkanten bort från strängvyn."
+
+#~ msgid "Draw cursor"
+#~ msgstr "Visa markör"
+
+#~ msgid "TRUE draw blinking cursor."
+#~ msgstr "Om SANT använd blinkande markör."
+
+#~ msgid "Auto move cursor"
+#~ msgstr "Flytta markören automatiskt"
+
+#~ msgid "TRUE auto move cursor position when mouse clicking."
+#~ msgstr "Flytta markören automatiskt vid musklick."
+
+#, fuzzy
+#~ msgid "Forward button press/release event"
+#~ msgstr "Direktmata tangenter"
+
+#, fuzzy
+#~ msgid "TRUE forward button press/release event to user program."
+#~ msgstr "Skicka tangentnedtryckningar till användarprogrammet."
+
+#~ msgid "Auto resize the widget to fit the string"
+#~ msgstr "Anpassa storleken automatiskt till teckenraden."
+
+#~ msgid "TRUE Auto resize on."
+#~ msgstr "Storleken anpassas automatiskt."
+
+#, fuzzy
+#~ msgid "TRUE Emit move_cursor signal when press the string."
+#~ msgstr "Flytta markören automatiskt vid musklick."
+
+#~ msgid "Width in chars"
+#~ msgstr "Bredd (antal tecken)"
+
+#~ msgid "Number of characters to leave space for in the string view."
+#~ msgstr "Antal tecken att göra rum för i teckenraden."
+
+#~ msgid "Scroll offset"
+#~ msgstr "Mjuk rullning"
+
+#~ msgid ""
+#~ "Number of pixels of the string view scrolled off the screen to the left"
+#~ msgstr "Antal pixlar i teckenraden som rullat över vänsterkanten på skärmen"
+
+#~ msgid "Text"
+#~ msgstr "Text"
+
+#~ msgid "The contents of the string view"
+#~ msgstr "Innehållet i teckenraden"
+
+#~ msgid "Selected _Keys:"
+#~ msgstr "Valda _kortkommandon:"
+
+#~ msgid "Key Code:"
+#~ msgstr "Tangentkod:"
+
+#, fuzzy
+#~ msgid "....."
+#~ msgstr "..."
+
+#~ msgid "Modifiers:"
+#~ msgstr "Specialtangenter:"
+
+#~ msgid "_Ctrl"
+#~ msgstr "_Ctrl"
+
+#~ msgid "A_lt"
+#~ msgstr "A_lt"
+
+#~ msgid "_Shift"
+#~ msgstr "_Shift"
+
+#~ msgid "_Release"
+#~ msgstr "_Release"
+
+#~ msgid "_Meta"
+#~ msgstr "_Meta"
+
+#~ msgid "S_uper"
+#~ msgstr "S_uper"
+
+#~ msgid "_Hyper"
+#~ msgstr "_Hyper"
+
+#~ msgid "Please enter a Key Code first."
+#~ msgstr "Ange tangentkod först."
+
+#, fuzzy
+#~ msgid ""
+#~ "Press a key (or a key combination).\n"
+#~ "This dialog will be closed \n"
+#~ "when the key is released."
+#~ msgstr ""
+#~ "Tryck på en tangent eller på en tangentkombination.\n"
+#~ "Den här rutan försvinner när du släpper tangenten."
+
+#~ msgid "Grabbing a key."
+#~ msgstr "Plockar tangent"
+
+#~ msgid "Key Selection"
+#~ msgstr "Tangentval"
+
+#~ msgid "Orientation"
+#~ msgstr "Riktning"
+
+#~ msgid "The orientation of the tray."
+#~ msgstr "Panelens riktning."
+
+#, fuzzy
+#~ msgid "Next"
+#~ msgstr "Text"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amhariska"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Alltid"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Alternativ"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Latinsk teckeninmatning"
+
+#~ msgid "English/European"
+#~ msgstr "Västerländsk"
+
+#~ msgid "RAW CODE"
+#~ msgstr "TANGENTKOD"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Snabbtangenter:\n"
+#~ "\n"
+#~ " Ctrl+u:\n"
+#~ " Växla mellan multibytekodning and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " återställ inmatningsmetod.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "Aktuell inmatningsmetod. Klicka för att ändra."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Allmänna inställningar"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Allmänna inställningar som gäller alla användargränssnitt, t.ex. X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+
+#~ msgid "_Trigger:"
+#~ msgstr "Ak_tiveringstangent"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Välj aktiveringstangenter"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som öppnar och stänger SCIM-inmatningen. Klicka "
+#~ "påknappen till höger för att ändra."
+
+#~ msgid "Turn _On:"
+#~ msgstr "Slå på (_o):"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Välj på-kommando"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som öppnar SCIM-inmatningen. Klicka påknappen till "
+#~ "höger för att ändra."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "Stäng av (_f):"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Välj på-kommando"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som stänger SCIM-inmatningen. Klicka påknappen till "
+#~ "höger för att ändra."
+
+#~ msgid "_Next input method:"
+#~ msgstr "_Nästa inmatningsmetod:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "Välj kommando för att hoppa till nästa"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som växlar till nästa inmatningsmetod. Klicka "
+#~ "påknappen till höger för att ändra."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "Föregående inmatningsmetod (_p):"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Välj kommando för att hoppa till föregående"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som växlar till föregående inmatningsmetod. Klicka "
+#~ "påknappen till höger för att ändra."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "Visa _meny med inmatningsmetoder:"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "Välj kommando för att visa menyn med inmatningsmetoder"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som visar menyn med inmatningsmetoder. Klicka "
+#~ "påknappen till höger för att ändra."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "Tangentbordslayout (_k):"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Här väljer du vilket slags tangentbord du har. Det är nödvändigt föratt "
+#~ "vissa inmatningsmetoder skall fungera."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "Visa okonverterad_e latinska tecken i ditt arbetsfönster."
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Med det här alternativet förbockat kommer de latinska bokstäver du "
+#~ "skriveratt visas direkt i fönstret du arbetar i. Annars visas de i ett "
+#~ "popup-fönster."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "Använd _samma inmatningsmetod i alla program"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Med det här alternativet förbockat kommer bara en inmatningsmetod att "
+#~ "användasi taget. Annars kan varje program använda olika metoder."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Kortkommandon"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Slå av och på inmatningsmetoder och ange kortkommandon för olika "
+#~ "inmatningsmetoder här."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Installerade inmatningsmetoder:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "Redigera kortkommandon (_h)"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "Välj kortkommandon för vald inmatningsmetod."
+
+#~ msgid "Select _Filters"
+#~ msgstr "Välj _filter"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "Välj filter att använda till den här inmatningsmetoden."
+
+#~ msgid "_Expand"
+#~ msgstr "Visa allt (_e)"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Visa alla inmatningsmetoder"
+
+#~ msgid "_Collapse"
+#~ msgstr "Göm allt (_c)"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Göm alla inmatningsmetoder."
+
+#~ msgid "E_nable All"
+#~ msgstr "Markera alla (_n)"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Gör alla inmatningsmetoder tillgängliga för användning."
+
+#~ msgid "_Disable All"
+#~ msgstr "Avmarkera alla (_d)"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Gör alla inmatningsmetoder otillgängliga för användning."
+
+#~ msgid "Filters"
+#~ msgstr "Filter"
+
+#~ msgid "Languages"
+#~ msgstr "Språk"
+
+#~ msgid "Description"
+#~ msgstr "Beskrivning"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Välj kortkommando för %s"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Välj filter för %s"
+
+#~ msgid "Move _Up"
+#~ msgstr "Flytta _uppåt"
+
+#~ msgid "Move _Down"
+#~ msgstr "Flytta ne_dåt"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "Paneldemon byggd på GTK+-2.x-biblioteket."
+
+#~ msgid "On demand"
+#~ msgstr "På begäran"
+
+#~ msgid "Never"
+#~ msgstr "Aldrig"
+
+#~ msgid "ToolBar"
+#~ msgstr "Verktygsfält"
+
+#~ msgid "_Show:"
+#~ msgstr "Vi_sa"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Fäst vid skärmka_nt"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Visa ikon för aktuell inmatningsmetod"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "Visa namn på akt_uell inmatningsmetod"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "Time_out för att dölja:"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Vi_sa fixeringsikonen"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Visa m_enyikonen"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Visa _hjälpikonen"
+
+#~ msgid "Show _property label"
+#~ msgstr "Visa inmatningsalternativ"
+
+#~ msgid "Input window"
+#~ msgstr "Inmatningsfönster"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "Infälld teckenväljare (_m)"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "_Vertikal teckenväljare"
+
+#~ msgid "Misc"
+#~ msgstr "Diverse"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Visa ikon i s_ystempanelen"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Fäst fönster (_w)"
+
+#~ msgid "_Font:"
+#~ msgstr "Typsnitt (_f)"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Välj \"Alltid\" för att ständigt visa verktygsfältet på skärmen. Välj\"På "
+#~ "begäran\" för att bara visa verktygsfältet när Scim är aktivt.Välj \"Never"
+#~ "\" för att aldrig visa verktygsfältet."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Med det här alternativet förbockat är verktygsfältet alltid fäst mot "
+#~ "skärmkanten."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "Verktygsfältet döljs efter så här lång tid. Den här inställningen används "
+#~ "baranär du har valt \"Alltid\" i menyn till vänster. Välj 0 för att "
+#~ "aldrig döljaverktygsfältet."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas alltid ikonen för "
+#~ "aktuellinmatningsmetod i verktygsfältet."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas alltid namnet på "
+#~ "aktuellinmatningsmetod i verktygsfältet."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas häftstiftsikonen i "
+#~ "verktygsfältet"
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas menyikonen i verktygsfältet"
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas hjälpikonen i verktygsfältet."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas en textlapp med "
+#~ "inmatningsalternativi verktygsfältet"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas teckenväljaren infälld "
+#~ "iinmatningsfönstret."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat används en vertikal teckenväljare."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat visas panelikonen i "
+#~ "skrivbordetssystempanel."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat fixeras verktygsfält, "
+#~ "inmatningsfönsteroch teckenväljare på en given plats."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "Det typsnitt som kommer att användas i inmatnings- och teckenväljarfönster"
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Välj typsnitt för användargränssnittet"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "FrontEnd"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMEngine"
+
+#~ msgid "Panel"
+#~ msgstr "Panel"
+
+#~ msgid "Extra"
+#~ msgstr "Extra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Inställningar för Scim"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Scim-plattformen (Smart Common Input Method)</"
+#~ "span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Grafiskt inställningsverktyg</"
+#~ "span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Inställningar för %s-moduler.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Vill du avsluta inställningsverktyget för Scim?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Många inställningar kräver att du startar om Scim innan du fortsätter,för "
+#~ "att de skall börja verka."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Inställningar för Scim"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "Inställningsverktyg byggt på GTK Widget-biblioteket."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr ""
+#~ "Inställningsverktyg för Scim-plattformen (Smart Common Input Method)"
+
+#~ msgid "SCIM Help"
+#~ msgstr "Om Scim"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Scim (Smart Common Input Method)"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Fixera/lossa inmatningsfönstret och verktygsfältet"
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "Kortfattad information om Scim och om aktuell inmatningsmetod."
+
+#~ msgid "Show command menu."
+#~ msgstr "Visa kommandomenyn."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Återhämta inställningar"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Fixera fönster"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Dölj verktygsfältet"
+
+#~ msgid "Help ..."
+#~ msgstr "Hjälp ..."
+
+#~ msgid "Exit"
+#~ msgstr "Avsluta"
--- /dev/null
+#!/bin/sh
+
+PACKAGE=keyboard-setting-wizard-efl
+SRCROOT=../..
+POTFILES=POTFILES.in
+
+#ALL_LINGUAS= am az be ca cs da de el en_CA en_GB es et fi fr hr hu it ja ko lv mk ml ms nb ne nl pa pl pt pt_BR ru rw sk sl sr sr@Latn sv ta tr uk vi zh_CN zh_TW
+ALL_LINGUAS="en_US en_GB ja ko zh_CN cs de fi fr it nl pa sv zh_TW"
+
+XGETTEXT=/usr/bin/xgettext
+MSGMERGE=/usr/bin/msgmerge
+
+echo -n "Make ${PACKAGE}.pot "
+if [ ! -e $POTFILES ] ; then
+ echo "$POTFILES not found"
+ exit 1
+fi
+
+$XGETTEXT --default-domain=${PACKAGE} --directory=${SRCROOT} \
+ --add-comments --keyword=_ --keyword=T_ --files-from=$POTFILES \
+&& test ! -f ${PACKAGE}.po \
+ || (rm -f ${PACKAGE}.pot && mv ${PACKAGE}.po ${PACKAGE}.pot)
+
+if [ $? -ne 0 ]; then
+ echo "error"
+ exit 1
+else
+ echo "done"
+fi
+
+for LANG in $ALL_LINGUAS; do
+ echo "$LANG : "
+
+ if [ ! -e $LANG.po ] ; then
+ cp ${PACKAGE}.pot ${LANG}.po
+ echo "${LANG}.po created"
+ else
+ if $MSGMERGE ${LANG}.po ${PACKAGE}.pot -o ${LANG}.new.po ; then
+ if cmp ${LANG}.po ${LANG}.new.po > /dev/null 2>&1; then
+ rm -f ${LANG}.new.po
+ else
+ if mv -f ${LANG}.new.po ${LANG}.po; then
+ echo ""
+ else
+ echo "msgmerge for $LANG.po failed: cannot move $LANG.new.po to $LANG.po" 1>&2
+ rm -f ${LANG}.new.po
+ exit 1
+ fi
+ fi
+ else
+ echo "msgmerge for $LANG failed!"
+ rm -f ${LANG}.new.po
+ fi
+ fi
+ echo ""
+done
+
--- /dev/null
+# translation of zh_CN.po to Simplified Chinese
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: zh_CN\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 18:51+0900\n"
+"PO-Revision-Date: 2011-01-01 14:57+0800\n"
+"Last-Translator: Haifeng Deng <haifeng.deng@samsung.com>\n"
+"Language-Team: Simplified Chinese <zh@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.3.1\n"
+
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+msgid "Keyboard selection"
+msgstr "键盘选择"
+
+msgid "Keyboard"
+msgstr "键盘"
--- /dev/null
+# translation of zh_HK.po to Chinese (Hongkong)
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ISF 2.2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 18:51+0900\n"
+"PO-Revision-Date: 2011-01-01 22:41+0800\n"
+"Last-Translator: Haifeng Deng <haifeng.deng@samsung.com>\n"
+"Language-Team: scim@freedesktop.org\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+msgid "Keyboard selection"
+msgstr "鍵盤選擇"
+
+msgid "Keyboard"
+msgstr "鍵盤"
--- /dev/null
+# translation of zh_TW.po to Chinese (Taiwan)
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ISF 2.2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 18:51+0900\n"
+"PO-Revision-Date: 2011-01-01 22:41+0800\n"
+"Last-Translator: Haifeng Deng <haifeng.deng@samsung.com>\n"
+"Language-Team: scim@freedesktop.org\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+msgid "Keyboard selection"
+msgstr "鍵盤選擇"
+
+msgid "Keyboard"
+msgstr "鍵盤"
--- /dev/null
+# Makefile for program source directory in GNU NLS utilities package.
+# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+#
+# This file file be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU Public License
+# but which still want to provide support for the GNU gettext functionality.
+# Please note that the actual code is *not* freely available.
+#
+# - Modified by Owen Taylor <otaylor@redhat.com> to use GETTEXT_PACKAGE
+# instead of PACKAGE and to look for po2tbl in ./ not in intl/
+#
+# - Modified by jacob berkman <jacob@ximian.com> to install
+# Makefile.in.in and po2tbl.sed.in for use with glib-gettextize
+
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = @top_builddir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datadir = /usr/share
+libdir = @libdir@
+localedir = $(libdir)/locale
+gnulocaledir = $(datadir)/locale
+gettextsrcdir = $(datadir)/glib-2.0/gettext/po
+subdir = po
+install_sh = @install_sh@
+mkdir_p = @mkdir_p@
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+CC = @CC@
+GENCAT = @GENCAT@
+GMSGFMT = @GMSGFMT@
+MSGFMT = @MSGFMT@
+XGETTEXT = @XGETTEXT@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+MSGMERGE = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist
+GENPOT = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot
+
+DEFS = @DEFS@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+
+INCLUDES = -I.. -I$(top_srcdir)/intl
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+SOURCES =
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+DISTFILES = $(srcdir)/ChangeLog $(srcdir)/Makefile.in.in $(srcdir)/POTFILES.in \
+$(POFILES) $(GMOFILES) $(SOURCES)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+INSTOBJEXT = @INSTOBJEXT@
+
+.SUFFIXES:
+.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat
+
+.c.o:
+ $(COMPILE) $<
+
+.po.pox:
+ $(MAKE) $(GETTEXT_PACKAGE).pot
+ $(MSGMERGE) $< $(top_builddir)/po/$(GETTEXT_PACKAGE).pot -o $*pox
+
+.po.mo:
+ $(MSGFMT) -o $@ $<
+
+.po.gmo:
+ file=`echo $* | sed 's,.*/,,'`.gmo \
+ && rm -f $$file && $(GMSGFMT) -o $$file $<
+
+.po.cat:
+ sed -f ../intl/po2msg.sed < $< > $*.msg \
+ && rm -f $@ && $(GENCAT) $@ $*.msg
+
+
+all: all-@USE_NLS@
+
+all-yes: $(CATALOGS)
+all-no:
+
+$(GETTEXT_PACKAGE).pot: $(POTFILES)
+ $(GENPOT)
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+install-data-no: all
+install-data-yes: all
+ if test -n "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $(DESTDIR)$(datadir); \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(datadir); \
+ fi
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ case "$$cat" in \
+ *.gmo) destdir=$(gnulocaledir);; \
+ *) destdir=$(localedir);; \
+ esac; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ dir=$(DESTDIR)$$destdir/$$lang/LC_MESSAGES; \
+ if test -n "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $$dir; \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $$dir; \
+ fi; \
+ if test -r $$cat; then \
+ $(INSTALL_DATA) $$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \
+ echo "installing $$cat as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \
+ else \
+ $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \
+ echo "installing $(srcdir)/$$cat as" \
+ "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \
+ fi; \
+ if test -r $$cat.m; then \
+ $(INSTALL_DATA) $$cat.m $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \
+ echo "installing $$cat.m as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \
+ else \
+ if test -r $(srcdir)/$$cat.m ; then \
+ $(INSTALL_DATA) $(srcdir)/$$cat.m \
+ $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \
+ echo "installing $(srcdir)/$$cat as" \
+ "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \
+ else \
+ true; \
+ fi; \
+ fi; \
+ done
+ if test "$(PACKAGE)" = "glib"; then \
+ if test -n "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $(DESTDIR)$(gettextsrcdir); \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(gettextsrcdir); \
+ fi; \
+ $(INSTALL_DATA) $(srcdir)/Makefile.in.in \
+ $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \
+ else \
+ : ; \
+ fi
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall:
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \
+ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \
+ rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \
+ rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \
+ done
+ if test "$(PACKAGE)" = "glib"; then \
+ rm -f $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \
+ fi
+
+check: all
+
+dvi info tags TAGS ID:
+
+mostlyclean:
+ rm -f core core.* *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp
+ rm -fr *.o *.gmo
+ rm -f .intltool-merge-cache
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ rm -f $(GMOFILES)
+
+distdir = ../$(GETTEXT_PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: $(DISTFILES) $(GETTEXT_PACKAGE).pot
+ dists="$(DISTFILES)"; \
+ for file in $$dists; do \
+ ln $$file $(distdir) 2> /dev/null \
+ || cp -p $$file $(distdir); \
+ done
+
+update-po: Makefile
+ $(MAKE) $(GETTEXT_PACKAGE).pot
+ tmpdir=`pwd`; \
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ echo "$$lang:"; \
+ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \
+ if $$result; then \
+ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+ rm -f $$tmpdir/$$lang.new.po; \
+ else \
+ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+ :; \
+ else \
+ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ exit 1; \
+ fi; \
+ fi; \
+ else \
+ echo "msgmerge for $$cat failed!"; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ fi; \
+ done
+
+# POTFILES is created from POTFILES.in by stripping comments, empty lines
+# and Intltool tags (enclosed in square brackets), and appending a full
+# relative path to them
+POTFILES: POTFILES.in
+ ( if test 'x$(srcdir)' != 'x.'; then \
+ posrcprefix='$(top_srcdir)/'; \
+ else \
+ posrcprefix="../"; \
+ fi; \
+ rm -f $@-t $@ \
+ && (sed -e '/^#/d' \
+ -e "s/^\[.*\] +//" \
+ -e '/^[ ]*$$/d' \
+ -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \
+ | sed -e '$$s/\\$$//') > $@-t \
+ && chmod a-w $@-t \
+ && mv $@-t $@ )
+
+Makefile: Makefile.in.in ../../config.status POTFILES
+ cd ../.. \
+ && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \
+ $(SHELL) ./config.status
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+ism/src/scim_backend.cpp
+ism/src/scim_chartraits.cpp
+ism/src/scim_compose_key.cpp
+ism/src/scim_config_agent.cpp
+ism/src/scim_config_base.cpp
+ism/src/scim_config_module.cpp
+ism/src/scim_connection.cpp
+ism/src/scim.cpp
+ism/src/scim_debug.cpp
+ism/src/scim_event.cpp
+ism/src/scim_filter.cpp
+ism/src/scim_filter_manager.cpp
+ism/src/scim_filter_module.cpp
+ism/src/scim_frontend.cpp
+ism/src/scim_frontend_module.cpp
+ism/src/scim_global_config.cpp
+ism/src/scim_helper.cpp
+ism/src/scim_helper_launcher.cpp
+ism/src/scim_helper_manager.cpp
+ism/src/scim_helper_module.cpp
+ism/src/scim_hotkey.cpp
+ism/src/scim_iconv.cpp
+ism/src/scim_imengine.cpp
+ism/src/scim_imengine_module.cpp
+ism/src/scim_launcher.cpp
+ism/src/scim_lookup_table.cpp
+ism/src/scim_module.cpp
+ism/src/scim_object.cpp
+ism/src/scim_panel_agent.cpp
+ism/src/scim_panel_client.cpp
+ism/src/scim_private.cpp
+ism/src/scim_signals.cpp
+ism/src/scim_slot.cpp
+ism/src/scim_socket.cpp
+ism/src/scim_transaction.cpp
+ism/src/scim_utility.cpp
+ism/src/scim_keyboard_layout_data.h
+ism/src/scim_keyevent_data.h
+ism/modules/config/scim_simple_config.cpp
+ism/modules/config/scim_socket_config.cpp
+ism/modules/filter/scim_sctc_filter.cpp
+ism/modules/frontend/scim_socket_frontend.cpp
+ism/modules/imengine/scim_socket_imengine.cpp
+ism/extras/gtk2_immodule/gtkimcontextscim.cpp
+ism/extras/gtk2_immodule/imscim.cpp
+ism/extras/gtk_panel/scim_panel_gtk.cpp
+ism/extras/efl_panel/isf_panel_efl.cpp
+ism/utils/scimstringview.c
+ism/utils/scimkeyselection.cpp
+ism/utils/scimtrayicon.c
+ism/demos/isf_layout_efl.cpp
+ism/demos/isf_demo_efl.cpp
+ism/demos/isf_entry_event_efl.cpp
+ism/demos/isf_event_efl.cpp
+ism/demos/isf_imcontrol_efl.cpp
--- /dev/null
+# translation of cs.po to Czech
+# translation of cs.po to cs_CZ
+# translation of scim.po to cs_CZ
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Klara Cihlarova <koty@seznam.cz>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: cs\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 15:30+0900\n"
+"PO-Revision-Date: 2005-12-11 19:55+0100\n"
+"Last-Translator: Klara Cihlarova <koty@seznam.cz>\n"
+"Language-Team: Czech <suse@suse.cz>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.10.2\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ism/src/scim_compose_key.cpp:127 ism/src/scim_imengine.cpp:659
+#: ism/src/scim_panel_agent.cpp:345 ism/src/scim_panel_agent.cpp:4334
+#: ism/src/scim_utility.cpp:701
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1740
+msgid "English/Keyboard"
+msgstr "Angličtina/klávesnice"
+
+#. return WideString ();
+#: ism/src/scim_compose_key.cpp:146
+#, fuzzy
+msgid "English input service"
+msgstr "Angličtina (americká)"
+
+#: ism/src/scim_utility.cpp:702
+msgid "Amharic"
+msgstr "Amharština"
+
+#: ism/src/scim_utility.cpp:703
+msgid "Arabic"
+msgstr "Arabština"
+
+#: ism/src/scim_utility.cpp:704 ism/src/scim_utility.cpp:893
+msgid "Arabic (Egypt)"
+msgstr "Arabština (egyptská)"
+
+#: ism/src/scim_utility.cpp:705 ism/src/scim_utility.cpp:902
+msgid "Arabic (Lebanon)"
+msgstr "Arabština (libanonská)"
+
+#: ism/src/scim_utility.cpp:706
+msgid "Assamese"
+msgstr "Ásámština"
+
+#: ism/src/scim_utility.cpp:707 ism/src/scim_utility.cpp:918
+msgid "Azerbaijani"
+msgstr "Azerbajdžánština"
+
+#: ism/src/scim_utility.cpp:708
+msgid "Belarusian"
+msgstr "Běloruština"
+
+#: ism/src/scim_utility.cpp:709 ism/src/scim_utility.cpp:874
+msgid "Bulgarian"
+msgstr "Bulharština"
+
+#: ism/src/scim_utility.cpp:710 ism/src/scim_utility.cpp:711
+#: ism/src/scim_utility.cpp:913
+msgid "Bengali"
+msgstr "Bengálština"
+
+#: ism/src/scim_utility.cpp:712
+msgid "Bengali (India)"
+msgstr "Bengálština (indická)"
+
+#: ism/src/scim_utility.cpp:713
+msgid "Tibetan"
+msgstr "Tibetština"
+
+#: ism/src/scim_utility.cpp:714
+msgid "Bosnian"
+msgstr "Bosenština"
+
+#: ism/src/scim_utility.cpp:715 ism/src/scim_utility.cpp:853
+msgid "Catalan"
+msgstr "Katalánština"
+
+#: ism/src/scim_utility.cpp:716 ism/src/scim_utility.cpp:863
+#: ism/src/scim_keyboard_layout_data.h:4596
+msgid "Czech"
+msgstr "Čeština"
+
+#: ism/src/scim_utility.cpp:717 ism/src/scim_utility.cpp:923
+msgid "Welsh"
+msgstr "Welština"
+
+#: ism/src/scim_utility.cpp:718 ism/src/scim_utility.cpp:854
+#: ism/src/scim_keyboard_layout_data.h:4598
+msgid "Danish"
+msgstr "Dánština"
+
+#: ism/src/scim_utility.cpp:719 ism/src/scim_keyboard_layout_data.h:4606
+msgid "German"
+msgstr "Němčina"
+
+#: ism/src/scim_utility.cpp:720
+msgid "Divehi"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:721 ism/src/scim_utility.cpp:873
+#: ism/src/scim_keyboard_layout_data.h:4609
+msgid "Greek"
+msgstr "Řečtina"
+
+#: ism/src/scim_utility.cpp:722
+msgid "English"
+msgstr "Angličtina"
+
+#: ism/src/scim_utility.cpp:723 ism/src/scim_utility.cpp:808
+msgid "English (Australian)"
+msgstr "Angličtina (australská)"
+
+#: ism/src/scim_utility.cpp:724 ism/src/scim_utility.cpp:809
+msgid "English (Canadian)"
+msgstr "Angličtina (kanadská)"
+
+#: ism/src/scim_utility.cpp:725
+msgid "English (British)"
+msgstr "Angličtina (britská)"
+
+#: ism/src/scim_utility.cpp:726
+msgid "English (Ireland)"
+msgstr "Angličtina (irská)"
+
+#: ism/src/scim_utility.cpp:727
+msgid "English (American)"
+msgstr "Angličtina (americká)"
+
+#: ism/src/scim_utility.cpp:728 ism/src/scim_utility.cpp:729
+#: ism/src/scim_keyboard_layout_data.h:4622
+msgid "Spanish"
+msgstr "Španělština"
+
+#: ism/src/scim_utility.cpp:730
+msgid "Spanish (Mexico)"
+msgstr "Španělština (mexická)"
+
+#: ism/src/scim_utility.cpp:731 ism/src/scim_utility.cpp:870
+#: ism/src/scim_keyboard_layout_data.h:4601
+msgid "Estonian"
+msgstr "Estonština"
+
+#: ism/src/scim_utility.cpp:732 ism/src/scim_utility.cpp:852
+msgid "Basque"
+msgstr "Baskičtina"
+
+#: ism/src/scim_utility.cpp:733
+msgid "Persian"
+msgstr "Perština"
+
+#: ism/src/scim_utility.cpp:734 ism/src/scim_utility.cpp:857
+#: ism/src/scim_keyboard_layout_data.h:4602
+msgid "Finnish"
+msgstr "Finština"
+
+#: ism/src/scim_utility.cpp:735 ism/src/scim_keyboard_layout_data.h:4603
+msgid "French"
+msgstr "Francouzština"
+
+#: ism/src/scim_utility.cpp:736 ism/src/scim_utility.cpp:921
+msgid "Irish"
+msgstr "Irština"
+
+#: ism/src/scim_utility.cpp:737 ism/src/scim_utility.cpp:919
+msgid "Galician"
+msgstr "Galština"
+
+#: ism/src/scim_utility.cpp:738 ism/src/scim_utility.cpp:914
+msgid "Gujarati"
+msgstr "Gudžarádština"
+
+#: ism/src/scim_utility.cpp:739 ism/src/scim_utility.cpp:748
+#: ism/src/scim_utility.cpp:890
+msgid "Hebrew"
+msgstr "Hebrejština"
+
+#: ism/src/scim_utility.cpp:740 ism/src/scim_utility.cpp:909
+msgid "Hindi"
+msgstr "Hindština"
+
+#: ism/src/scim_utility.cpp:741 ism/src/scim_keyboard_layout_data.h:4595
+msgid "Croatian"
+msgstr "Chorvatština"
+
+#: ism/src/scim_utility.cpp:742 ism/src/scim_utility.cpp:864
+#: ism/src/scim_keyboard_layout_data.h:4610
+msgid "Hungarian"
+msgstr "Maďarština"
+
+#: ism/src/scim_utility.cpp:743
+#, fuzzy
+msgid "Armenian"
+msgstr "Rumunština"
+
+#: ism/src/scim_utility.cpp:744
+msgid "Interlingua"
+msgstr "Interlingua"
+
+#: ism/src/scim_utility.cpp:745
+msgid "Indonesian"
+msgstr "Indonézština"
+
+#: ism/src/scim_utility.cpp:746 ism/src/scim_utility.cpp:856
+#: ism/src/scim_keyboard_layout_data.h:4628
+msgid "Icelandic"
+msgstr "Islandština"
+
+#: ism/src/scim_utility.cpp:747 ism/src/scim_keyboard_layout_data.h:4611
+msgid "Italian"
+msgstr "Italština"
+
+#: ism/src/scim_utility.cpp:749 ism/src/scim_utility.cpp:882
+#: ism/src/scim_keyboard_layout_data.h:4612
+msgid "Japanese"
+msgstr "Japonština"
+
+#: ism/src/scim_utility.cpp:750 ism/src/scim_utility.cpp:917
+#, fuzzy
+msgid "Georgian"
+msgstr "Němčina"
+
+#: ism/src/scim_utility.cpp:751 ism/src/scim_utility.cpp:875
+msgid "Kazakh"
+msgstr "Kazaština"
+
+#: ism/src/scim_utility.cpp:752
+msgid "Cambodian"
+msgstr "Khmerština"
+
+#: ism/src/scim_utility.cpp:753
+msgid "Kannada"
+msgstr "Kannadština"
+
+#: ism/src/scim_utility.cpp:754 ism/src/scim_utility.cpp:883
+msgid "Korean"
+msgstr "Korejština"
+
+#: ism/src/scim_utility.cpp:755
+msgid "Laothian"
+msgstr "Laoština"
+
+#: ism/src/scim_utility.cpp:756 ism/src/scim_utility.cpp:872
+#: ism/src/scim_keyboard_layout_data.h:4629
+msgid "Lithuanian"
+msgstr "Litevština"
+
+#: ism/src/scim_utility.cpp:757 ism/src/scim_utility.cpp:871
+msgid "Latvian"
+msgstr "Lotyšština"
+
+#: ism/src/scim_utility.cpp:758 ism/src/scim_utility.cpp:876
+msgid "Macedonian"
+msgstr "Makedonština"
+
+#: ism/src/scim_utility.cpp:759 ism/src/scim_utility.cpp:915
+msgid "Malayalam"
+msgstr "Malajámština"
+
+#: ism/src/scim_utility.cpp:760
+msgid "Mongolian"
+msgstr "Mongolština"
+
+#: ism/src/scim_utility.cpp:761 ism/src/scim_utility.cpp:911
+msgid "Marathi"
+msgstr "Maráthština"
+
+#: ism/src/scim_utility.cpp:762
+msgid "Malay"
+msgstr "Malajština"
+
+#: ism/src/scim_utility.cpp:763
+msgid "Burmese"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:764
+msgid "Nepali"
+msgstr "Nepálština"
+
+#: ism/src/scim_utility.cpp:765 ism/src/scim_keyboard_layout_data.h:4599
+msgid "Dutch"
+msgstr "Nizozemské"
+
+#: ism/src/scim_utility.cpp:766
+#, fuzzy
+msgid "Norwegian (Nynorsk)"
+msgstr "Norština (nynorsk)"
+
+#: ism/src/scim_utility.cpp:767
+#, fuzzy
+msgid "Norwegian (Bokmal)"
+msgstr "Norština (bokmal)"
+
+#: ism/src/scim_utility.cpp:768
+msgid "Oriya"
+msgstr "Orijština"
+
+#: ism/src/scim_utility.cpp:769 ism/src/scim_utility.cpp:916
+msgid "Punjabi"
+msgstr "Pandžábština"
+
+#: ism/src/scim_utility.cpp:770 ism/src/scim_utility.cpp:865
+#: ism/src/scim_keyboard_layout_data.h:4614
+msgid "Polish"
+msgstr "Polština"
+
+#: ism/src/scim_utility.cpp:771 ism/src/scim_utility.cpp:773
+#: ism/src/scim_keyboard_layout_data.h:4615
+msgid "Portuguese"
+msgstr "Portugalština"
+
+#: ism/src/scim_utility.cpp:772 ism/src/scim_keyboard_layout_data.h:4616
+msgid "Portuguese (Brazil)"
+msgstr "Portugalština (brazilská)"
+
+#: ism/src/scim_utility.cpp:774 ism/src/scim_utility.cpp:866
+msgid "Romanian"
+msgstr "Rumunština"
+
+#: ism/src/scim_utility.cpp:775 ism/src/scim_utility.cpp:877
+#: ism/src/scim_keyboard_layout_data.h:4618
+msgid "Russian"
+msgstr "Ruština"
+
+#: ism/src/scim_utility.cpp:776 ism/src/scim_utility.cpp:922
+msgid "Sinhala"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:777 ism/src/scim_utility.cpp:868
+#: ism/src/scim_keyboard_layout_data.h:4619
+msgid "Slovak"
+msgstr "Slovenština"
+
+#: ism/src/scim_utility.cpp:778 ism/src/scim_utility.cpp:869
+#: ism/src/scim_keyboard_layout_data.h:4621
+msgid "Slovenian"
+msgstr "Slovinština"
+
+#: ism/src/scim_utility.cpp:779
+msgid "Albanian"
+msgstr "Albánština"
+
+#: ism/src/scim_utility.cpp:780 ism/src/scim_utility.cpp:781
+#: ism/src/scim_utility.cpp:782
+msgid "Serbian"
+msgstr "Srbština"
+
+#: ism/src/scim_utility.cpp:783 ism/src/scim_utility.cpp:785
+#: ism/src/scim_utility.cpp:861 ism/src/scim_keyboard_layout_data.h:4625
+msgid "Swedish"
+msgstr "Švédština"
+
+#: ism/src/scim_utility.cpp:784 ism/src/scim_utility.cpp:862
+msgid "Swedish (Finland)"
+msgstr "Švédština (finská)"
+
+#: ism/src/scim_utility.cpp:786 ism/src/scim_utility.cpp:912
+msgid "Tamil"
+msgstr "Tamilština"
+
+#: ism/src/scim_utility.cpp:787 ism/src/scim_utility.cpp:910
+msgid "Telugu"
+msgstr "Telugština"
+
+#: ism/src/scim_utility.cpp:788 ism/src/scim_utility.cpp:889
+msgid "Thai"
+msgstr "Thajština"
+
+#: ism/src/scim_utility.cpp:789 ism/src/scim_utility.cpp:880
+#: ism/src/scim_keyboard_layout_data.h:4626
+msgid "Turkish"
+msgstr "Turečtina"
+
+#: ism/src/scim_utility.cpp:790
+msgid "Uighur"
+msgstr "Ujgurština"
+
+#: ism/src/scim_utility.cpp:791 ism/src/scim_utility.cpp:879
+#: ism/src/scim_keyboard_layout_data.h:4630
+msgid "Ukrainian"
+msgstr "Ukrajinština"
+
+#: ism/src/scim_utility.cpp:792 ism/src/scim_utility.cpp:907
+msgid "Urdu"
+msgstr "Urdština"
+
+#: ism/src/scim_utility.cpp:793
+msgid "Uzbek"
+msgstr "Uzbečtina"
+
+#: ism/src/scim_utility.cpp:794 ism/src/scim_utility.cpp:908
+msgid "Vietnamese"
+msgstr "Vietnamština"
+
+#: ism/src/scim_utility.cpp:795
+msgid "Walloon"
+msgstr "Walloon"
+
+#: ism/src/scim_utility.cpp:796 ism/src/scim_utility.cpp:797
+msgid "Yiddish"
+msgstr "Jidiš"
+
+#: ism/src/scim_utility.cpp:798
+msgid "Chinese"
+msgstr "Čínština"
+
+#: ism/src/scim_utility.cpp:799 ism/src/scim_utility.cpp:801
+#, fuzzy
+msgid "Chinese (Simplified)"
+msgstr "Čínština (zjednodušená)"
+
+#: ism/src/scim_utility.cpp:800 ism/src/scim_utility.cpp:802
+#, fuzzy
+msgid "Chinese (Traditional)"
+msgstr "Čínština (tradiční)"
+
+#: ism/src/scim_utility.cpp:804
+msgid "Dutch (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:805
+#, fuzzy
+msgid "Dutch (Belgian)"
+msgstr "Belgičtina"
+
+#: ism/src/scim_utility.cpp:806
+#, fuzzy
+msgid "English (United States)"
+msgstr "Angličtina (US)"
+
+#: ism/src/scim_utility.cpp:807
+#, fuzzy
+msgid "English (United Kingdom)"
+msgstr "Angličtina (kanadská)"
+
+#: ism/src/scim_utility.cpp:810
+#, fuzzy
+msgid "English (New Zealand)"
+msgstr "Angličtina (irská)"
+
+#: ism/src/scim_utility.cpp:811
+#, fuzzy
+msgid "English (Irish)"
+msgstr "Angličtina (britská)"
+
+#: ism/src/scim_utility.cpp:812
+#, fuzzy
+msgid "English (South Africa)"
+msgstr "Angličtina (americká)"
+
+#: ism/src/scim_utility.cpp:813
+#, fuzzy
+msgid "English (Jamaica)"
+msgstr "Angličtina (kanadská)"
+
+#: ism/src/scim_utility.cpp:814
+#, fuzzy
+msgid "English (Belize)"
+msgstr "Angličtina (britská)"
+
+#: ism/src/scim_utility.cpp:815
+#, fuzzy
+msgid "English (Trinidad)"
+msgstr "Angličtina (britská)"
+
+#: ism/src/scim_utility.cpp:816
+#, fuzzy
+msgid "English (Zimbabwe)"
+msgstr "Angličtina (kanadská)"
+
+#: ism/src/scim_utility.cpp:817
+#, fuzzy
+msgid "English (Philippines)"
+msgstr "Angličtina (britská)"
+
+#: ism/src/scim_utility.cpp:818
+#, fuzzy
+msgid "French (Standard)"
+msgstr "Francouzština (kanadská)"
+
+#: ism/src/scim_utility.cpp:819
+#, fuzzy
+msgid "French (Belgian)"
+msgstr "Francouzština (kanadská)"
+
+#: ism/src/scim_utility.cpp:820 ism/src/scim_keyboard_layout_data.h:4604
+msgid "French (Canadian)"
+msgstr "Francouzština (kanadská)"
+
+#: ism/src/scim_utility.cpp:821
+#, fuzzy
+msgid "French (Swiss)"
+msgstr "Němčina (švýcarská)"
+
+#: ism/src/scim_utility.cpp:822
+msgid "French (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:823
+#, fuzzy
+msgid "French (Monaco)"
+msgstr "Francouzština (kanadská)"
+
+#: ism/src/scim_utility.cpp:824
+#, fuzzy
+msgid "German (Standard)"
+msgstr "Němčina (s mrtvými klávesami)"
+
+#: ism/src/scim_utility.cpp:825 ism/src/scim_keyboard_layout_data.h:4608
+msgid "German (Swiss)"
+msgstr "Němčina (švýcarská)"
+
+#: ism/src/scim_utility.cpp:826
+#, fuzzy
+msgid "German (Austrian)"
+msgstr "Angličtina (australská)"
+
+#: ism/src/scim_utility.cpp:827
+msgid "German (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:828
+#, fuzzy
+msgid "German (Liechtenstein)"
+msgstr "Němčina (švýcarská)"
+
+#: ism/src/scim_utility.cpp:829
+msgid "Italian (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:830
+#, fuzzy
+msgid "Italian (Swiss)"
+msgstr "Němčina (švýcarská)"
+
+#: ism/src/scim_utility.cpp:831
+#, fuzzy
+msgid "Portuguese (Brazilian)"
+msgstr "Portugalština (brazilská)"
+
+#: ism/src/scim_utility.cpp:832
+#, fuzzy
+msgid "Portuguese (Standard)"
+msgstr "Portugalština (brazilská)"
+
+#: ism/src/scim_utility.cpp:833
+#, fuzzy
+msgid "Spanish (Traditional Sort)"
+msgstr "Španělština (jihoamerická)"
+
+#: ism/src/scim_utility.cpp:834
+#, fuzzy
+msgid "Spanish (Mexican)"
+msgstr "Španělština (mexická)"
+
+#: ism/src/scim_utility.cpp:835
+#, fuzzy
+msgid "Spanish (Guatemala)"
+msgstr "Španělština (jihoamerická)"
+
+#: ism/src/scim_utility.cpp:836
+#, fuzzy
+msgid "Spanish (Costa Rica)"
+msgstr "Španělština (jihoamerická)"
+
+#: ism/src/scim_utility.cpp:837
+#, fuzzy
+msgid "Spanish (Panama)"
+msgstr "Španělština (jihoamerická)"
+
+#: ism/src/scim_utility.cpp:838
+#, fuzzy
+msgid "Spanish (Dominican Republic)"
+msgstr "Španělština (jihoamerická)"
+
+#: ism/src/scim_utility.cpp:839
+#, fuzzy
+msgid "Spanish (Venezuela)"
+msgstr "Španělština (mexická)"
+
+#: ism/src/scim_utility.cpp:840
+#, fuzzy
+msgid "Spanish (Colombia)"
+msgstr "Španělština (mexická)"
+
+#: ism/src/scim_utility.cpp:841
+#, fuzzy
+msgid "Spanish (Peru)"
+msgstr "Španělština (mexická)"
+
+#: ism/src/scim_utility.cpp:842
+#, fuzzy
+msgid "Spanish (Argentina)"
+msgstr "Španělština (mexická)"
+
+#: ism/src/scim_utility.cpp:843
+#, fuzzy
+msgid "Spanish (Ecuador)"
+msgstr "Španělština (mexická)"
+
+#: ism/src/scim_utility.cpp:844
+#, fuzzy
+msgid "Spanish (Chile)"
+msgstr "Španělština (mexická)"
+
+#: ism/src/scim_utility.cpp:845
+#, fuzzy
+msgid "Spanish (Uruguay)"
+msgstr "Španělština (mexická)"
+
+#: ism/src/scim_utility.cpp:846
+#, fuzzy
+msgid "Spanish (Paraguay)"
+msgstr "Španělština (CP 850)"
+
+#: ism/src/scim_utility.cpp:847
+#, fuzzy
+msgid "Spanish (Bolivia)"
+msgstr "Španělština (mexická)"
+
+#: ism/src/scim_utility.cpp:848
+msgid "Spanish (El Salvador)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:849
+#, fuzzy
+msgid "Spanish (Honduras)"
+msgstr "Španělština (mexická)"
+
+#: ism/src/scim_utility.cpp:850
+#, fuzzy
+msgid "Spanish (Nicaragua)"
+msgstr "Španělština (mexická)"
+
+#: ism/src/scim_utility.cpp:851
+#, fuzzy
+msgid "Spanish (Puerto Rico)"
+msgstr "Španělština (mexická)"
+
+#: ism/src/scim_utility.cpp:855
+msgid "Afrikaans"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:858
+#, fuzzy
+msgid "Malay (Malaysia)"
+msgstr "Malajámština"
+
+#: ism/src/scim_utility.cpp:859
+msgid "Malay (Brunei Darussalam)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:860 ism/src/scim_keyboard_layout_data.h:4613
+msgid "Norwegian"
+msgstr "Norština"
+
+#: ism/src/scim_utility.cpp:867
+#, fuzzy
+msgid "Serbian (Latin)"
+msgstr "Srbština"
+
+#: ism/src/scim_utility.cpp:878
+msgid "Serbian (Cyrillic)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:881
+msgid "Uzbek (Latin)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:884
+#, fuzzy
+msgid "Chinese (Taiwan)"
+msgstr "Čínština (tradiční)"
+
+#: ism/src/scim_utility.cpp:885
+#, fuzzy
+msgid "Chinese (Hong Kong)"
+msgstr "Čínština (tradiční)"
+
+#: ism/src/scim_utility.cpp:886
+#, fuzzy
+msgid "Chinese (Macau)"
+msgstr "Čínština (tradiční)"
+
+#: ism/src/scim_utility.cpp:887
+#, fuzzy
+msgid "Chinese (PRC)"
+msgstr "Čínština"
+
+#: ism/src/scim_utility.cpp:888
+#, fuzzy
+msgid "Chinese (Singapore)"
+msgstr "Čínština (zjednodušená)"
+
+#: ism/src/scim_utility.cpp:891
+msgid "Arabic (Saudi Arabia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:892
+#, fuzzy
+msgid "Arabic (Iraq)"
+msgstr "Arabština (libanonská)"
+
+#: ism/src/scim_utility.cpp:894
+#, fuzzy
+msgid "Arabic (Libya)"
+msgstr "Arabština (libanonská)"
+
+#: ism/src/scim_utility.cpp:895
+#, fuzzy
+msgid "Arabic (Algeria)"
+msgstr "Arabština (libanonská)"
+
+#: ism/src/scim_utility.cpp:896
+#, fuzzy
+msgid "Arabic (Morocco)"
+msgstr "Arabština (libanonská)"
+
+#: ism/src/scim_utility.cpp:897
+#, fuzzy
+msgid "Arabic (Tunisia)"
+msgstr "Arabština (libanonská)"
+
+#: ism/src/scim_utility.cpp:898
+#, fuzzy
+msgid "Arabic (Oman)"
+msgstr "Arabština (libanonská)"
+
+#: ism/src/scim_utility.cpp:899
+#, fuzzy
+msgid "Arabic (Yemen)"
+msgstr "Arabština (libanonská)"
+
+#: ism/src/scim_utility.cpp:900
+#, fuzzy
+msgid "Arabic (Syria)"
+msgstr "Arabština (egyptská)"
+
+#: ism/src/scim_utility.cpp:901
+#, fuzzy
+msgid "Arabic (Jordan)"
+msgstr "Arabština (libanonská)"
+
+#: ism/src/scim_utility.cpp:903
+#, fuzzy
+msgid "Arabic (Kuwait)"
+msgstr "Arabština (egyptská)"
+
+#: ism/src/scim_utility.cpp:904
+#, fuzzy
+msgid "Arabic (UAE)"
+msgstr "Arabština (egyptská)"
+
+#: ism/src/scim_utility.cpp:905
+#, fuzzy
+msgid "Arabic (Bahrain)"
+msgstr "Arabština (libanonská)"
+
+#: ism/src/scim_utility.cpp:906
+#, fuzzy
+msgid "Arabic (Qatar)"
+msgstr "Arabština (egyptská)"
+
+#: ism/src/scim_utility.cpp:920
+msgid "Hausa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:924
+msgid "Xhosa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:925
+msgid "Yoruba"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:926
+msgid "Zulu"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:1024
+msgid "Other"
+msgstr "Ostatní"
+
+#: ism/src/scim_keyboard_layout_data.h:4592
+#: ism/modules/imengine/scim_socket_imengine.cpp:408
+#: ism/modules/imengine/scim_socket_imengine.cpp:438
+#: ism/modules/imengine/scim_socket_imengine.cpp:523
+#: ism/modules/imengine/scim_socket_imengine.cpp:553
+#: ism/modules/imengine/scim_socket_imengine.cpp:583
+msgid "Unknown"
+msgstr "Neznámé"
+
+#: ism/src/scim_keyboard_layout_data.h:4593
+msgid "English (US)"
+msgstr "Angličtina (US)"
+
+#: ism/src/scim_keyboard_layout_data.h:4594
+msgid "Belgian"
+msgstr "Belgičtina"
+
+#: ism/src/scim_keyboard_layout_data.h:4597
+msgid "Czech (qwerty)"
+msgstr "Čeština (qwerty)"
+
+#: ism/src/scim_keyboard_layout_data.h:4600
+msgid "Dvorak"
+msgstr "Dvorak"
+
+#: ism/src/scim_keyboard_layout_data.h:4605
+msgid "French (Switzerland)"
+msgstr "Francouzština (švýcarská)"
+
+#: ism/src/scim_keyboard_layout_data.h:4607
+msgid "German (with deadkeys)"
+msgstr "Němčina (s mrtvými klávesami)"
+
+#: ism/src/scim_keyboard_layout_data.h:4617
+msgid "Portuguese (Brazil US accents)"
+msgstr "Portugalština (brazilská)"
+
+#: ism/src/scim_keyboard_layout_data.h:4620
+msgid "Slovak (qwerty)"
+msgstr "Slovenština (qwerty)"
+
+#: ism/src/scim_keyboard_layout_data.h:4623
+msgid "Spanish (CP 850)"
+msgstr "Španělština (CP 850)"
+
+#: ism/src/scim_keyboard_layout_data.h:4624
+msgid "Spanish (Latin America)"
+msgstr "Španělština (jihoamerická)"
+
+#: ism/src/scim_keyboard_layout_data.h:4627
+msgid "English (UK)"
+msgstr "Angličtina (UK)"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:57
+msgid "Simplified-Traditional Chinese Conversion"
+msgstr "Převod zjednodušená - tradiční čínština"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:60
+msgid "Convert between Simplified Chinese and Traditional Chinese"
+msgstr "Převod mezi zjednodušenou čínštinou a tradiční čínštinou"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:71
+msgid "SC-TC"
+msgstr "SC-TC"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:73
+#: ism/modules/filter/scim_sctc_filter.cpp:78
+msgid "Simplified-Traditional Chinese conversion"
+msgstr "Převod zjednodušená - tradiční čínština"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:76
+msgid "No Conversion"
+msgstr "Bez převodu"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:81
+msgid "Simplified to Traditional"
+msgstr "Ze zjednodušené do tradiční"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:83
+msgid "Convert Simplified Chinese to Traditional Chinese"
+msgstr "Převést zjednodušenou čínštinu do tradiční čínštiny"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:86
+msgid "Traditional to Simplified"
+msgstr "Z tradiční do zjednodušené"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:88
+msgid "Convert Traditional Chinese to Simplified Chinese"
+msgstr "Převést tradiční čínštinu do zjednodušené čínštiny"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:300
+msgid "James Su <suzhe@tsinghua.org.cn>"
+msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:425
+#: ism/modules/filter/scim_sctc_filter.cpp:555
+#: ism/modules/filter/scim_sctc_filter.cpp:571
+msgid "SC->TC"
+msgstr "SC->TC"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:431
+#: ism/modules/filter/scim_sctc_filter.cpp:559
+#: ism/modules/filter/scim_sctc_filter.cpp:575
+msgid "TC->SC"
+msgstr "TC->SC"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1693
+msgid "Smart Common Input Method platform "
+msgstr "SCIM platforma"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1695
+msgid ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+msgstr ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1700
+msgid ""
+":\n"
+"\n"
+msgstr ""
+":\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1703
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:963
+msgid "Enable"
+msgstr "Stav"
+
+#. gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+#. gtk_tree_view_column_set_fixed_width (column, 232);
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:984
+msgid "Name"
+msgstr "Název"
+
+#: ism/utils/scimstringview.c:201
+msgid "Cursor Position"
+msgstr "Pozice kurzoru"
+
+#: ism/utils/scimstringview.c:202
+msgid "The current position of the insertion cursor in chars."
+msgstr "Aktuální pozice vkládacího kurzoru mezi znaky."
+
+#: ism/utils/scimstringview.c:211
+msgid "Maximum length"
+msgstr "Maximální délka"
+
+#: ism/utils/scimstringview.c:212
+msgid "Maximum number of characters for this string view. Zero if no maximum."
+msgstr ""
+"Maximální počet znaků při zobrazení řetězce. Nula, pokud není nic nastaveno."
+
+#: ism/utils/scimstringview.c:221
+msgid "Maximum width"
+msgstr "Maximální šířka"
+
+#: ism/utils/scimstringview.c:222
+msgid "Maximum width of this string view."
+msgstr "Maximální šířka pohledu na řetězec."
+
+#: ism/utils/scimstringview.c:231
+msgid "Has Frame"
+msgstr "S rámem"
+
+#: ism/utils/scimstringview.c:232
+msgid "FALSE removes outside bevel from string view."
+msgstr "FALSE odstraní zkosení."
+
+#: ism/utils/scimstringview.c:239
+msgid "Draw cursor"
+msgstr "Vykreslit kurzor"
+
+#: ism/utils/scimstringview.c:240
+msgid "TRUE draw blinking cursor."
+msgstr "TRUE vykreslí blikající kurzor."
+
+#: ism/utils/scimstringview.c:247
+msgid "Auto move cursor"
+msgstr "Automatické přesunutí kurzoru"
+
+#: ism/utils/scimstringview.c:248
+msgid "TRUE auto move cursor position when mouse clicking."
+msgstr "TRUE automaticky přemístí kurzor při kliknutí myší."
+
+#: ism/utils/scimstringview.c:255
+#, fuzzy
+msgid "Forward button press/release event"
+msgstr "Předání událost stisknutí tlačítka"
+
+#: ism/utils/scimstringview.c:256
+#, fuzzy
+msgid "TRUE forward button press/release event to user program."
+msgstr "TRUE předá událost stisknutí tlačítka programu."
+
+#: ism/utils/scimstringview.c:263
+msgid "Auto resize the widget to fit the string"
+msgstr "Automatická změna velikosti widgetu podle řetězce"
+
+#: ism/utils/scimstringview.c:264
+msgid "TRUE Auto resize on."
+msgstr "TRUE povolí automatickou změnu velikosti."
+
+#: ism/utils/scimstringview.c:271
+msgid "Emit move_cursor signal when press/release the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:272
+#, fuzzy
+msgid "TRUE Emit move_cursor signal when press the string."
+msgstr "TRUE automaticky přemístí kurzor při kliknutí myší."
+
+#: ism/utils/scimstringview.c:279
+msgid "Width in chars"
+msgstr "Šířka znaků"
+
+#: ism/utils/scimstringview.c:280
+msgid "Number of characters to leave space for in the string view."
+msgstr "Počet znaků, pro které se v řetězci vynechá místo."
+
+#: ism/utils/scimstringview.c:289
+msgid "Scroll offset"
+msgstr "Scroll offset"
+
+#: ism/utils/scimstringview.c:290
+msgid "Number of pixels of the string view scrolled off the screen to the left"
+msgstr "Počet pixelů v zobrazeném řetězci při přesunu vlevo"
+
+#: ism/utils/scimstringview.c:299
+msgid "Text"
+msgstr "Text"
+
+#: ism/utils/scimstringview.c:300
+msgid "The contents of the string view"
+msgstr "Obsahy zobrazeného řetězce"
+
+#: ism/utils/scimkeyselection.cpp:161
+msgid "Selected _Keys:"
+msgstr "Zvolené _klávesy:"
+
+#: ism/utils/scimkeyselection.cpp:206
+msgid "Key Code:"
+msgstr "Kód klávesy:"
+
+#: ism/utils/scimkeyselection.cpp:224
+#, fuzzy
+msgid "....."
+msgstr "..."
+
+#: ism/utils/scimkeyselection.cpp:229
+msgid "Modifiers:"
+msgstr "Modifikátor:"
+
+#: ism/utils/scimkeyselection.cpp:242
+msgid "_Ctrl"
+msgstr "_Ctrl"
+
+#: ism/utils/scimkeyselection.cpp:246
+msgid "A_lt"
+msgstr "A_lt"
+
+#: ism/utils/scimkeyselection.cpp:250
+msgid "_Shift"
+msgstr "_Shift"
+
+#: ism/utils/scimkeyselection.cpp:254
+msgid "_Release"
+msgstr "_Uvolnit"
+
+#: ism/utils/scimkeyselection.cpp:264
+msgid "_Meta"
+msgstr "_Meta"
+
+#: ism/utils/scimkeyselection.cpp:268
+msgid "S_uper"
+msgstr "S_uper"
+
+#: ism/utils/scimkeyselection.cpp:272
+msgid "_Hyper"
+msgstr "_Hyper"
+
+#: ism/utils/scimkeyselection.cpp:337
+msgid "Please enter a Key Code first."
+msgstr "Zadejte prosím nejdřív kód klávesy."
+
+#: ism/utils/scimkeyselection.cpp:391
+#, fuzzy
+msgid ""
+"Press a key (or a key combination).\n"
+"This dialog will be closed \n"
+"when the key is released."
+msgstr ""
+"Stiskněte klávesu (nebo kombinaci kláves).\n"
+"Dialog se zavře po uvolnění kláves."
+
+#: ism/utils/scimkeyselection.cpp:395
+msgid "Grabbing a key."
+msgstr "Zachycení klávesy."
+
+#: ism/utils/scimkeyselection.cpp:686
+msgid "Key Selection"
+msgstr "Výběr kláves"
+
+#: ism/utils/scimtrayicon.c:108
+msgid "Orientation"
+msgstr "Orientace"
+
+#: ism/utils/scimtrayicon.c:109
+msgid "The orientation of the tray."
+msgstr "Orientace panelu."
+
+#. Normal Layout
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "NORMAL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "click to enter TEXT"
+msgstr ""
+
+#. Number Layout
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "NUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "click to enter NUMBER"
+msgstr ""
+
+#. Email Layout
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "EMAIL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "click to enter EMAIL"
+msgstr ""
+
+#. URL Layout
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "URL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "click to enter URL"
+msgstr ""
+
+#. Phonenumber Layout
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "PHONENUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "click to enter PHONENUMBER"
+msgstr ""
+
+#. IP Layout
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "IP LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "click to enter IP"
+msgstr ""
+
+#. Month Layout
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "MONTH LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "click to enter MONTH"
+msgstr ""
+
+#. Number Only Layout
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "NUMBERONLY LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "click to enter NUMBERONLY"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:220
+msgid "ise layout"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:51
+msgid "Application template"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:52
+msgid "Click to exit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:156
+msgid "Previous"
+msgstr ""
+
+#. bundle_add(ad->data, "navi_btn_left", NULL);
+#: ism/demos/isf_demo_efl.cpp:158
+#, fuzzy
+msgid "Next"
+msgstr "Text"
+
+#: ism/demos/isf_demo_efl.cpp:171
+msgid "Quit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:203
+msgid "isf demo"
+msgstr ""
+
+#: ism/demos/isf_entry_event_efl.cpp:151
+msgid "entry event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:220
+msgid "label event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:250
+msgid "ise event demo"
+msgstr ""
+
+#: ism/demos/isf_imcontrol_efl.cpp:375
+msgid "isfimcontrol api"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "Výběr kláves"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Option"
+msgstr "Volby"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "Němčina"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "Angličtina/klávesnice"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Výběr kláves"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "Výběr kláves"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "Angličtina/klávesnice"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "Volby"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "Angličtina/klávesnice"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amharština"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Vždy"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Volby"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Angličtina/klávesnice"
+
+#~ msgid "English/European"
+#~ msgstr "Angličtina/Evropa"
+
+#~ msgid "RAW CODE"
+#~ msgstr "RAW KÓD"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Klávesové zkratky:\n"
+#~ "\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " přepnutí mezi Multibyte a Unicode kódováním.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " zrušení vstupní metody.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "Stav aktuální vstupní metody. Změnu provedete kliknutím."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Obecná nastavení"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Nastavení klávesový zkratek používaných moduly včetně X11, GTK, IMModule, "
+#~ "GTK IMModule, QT IMModule atd."
+
+#~ msgid "_Trigger:"
+#~ msgstr "_Spouštění:"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Zvolte spouštěcí klávesy"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Klávesové události zapínající/vypínající SCIM vstupní metodu. Úpravu "
+#~ "provedete kliknutím na tlačítko vpravo."
+
+#~ msgid "Turn _On:"
+#~ msgstr "_Zapnout:"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Zvolte spouštěcí klávesy"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Klávesové události zapínající SCIM vstupní metodu. Úpravu provedete "
+#~ "kliknutím na tlačítko vpravo."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "_Vypnout:"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Zvolte vypínací klávesy"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Klávesové události vypínající SCIM vstupní metodu. Úpravu provedete "
+#~ "kliknutím na tlačítko vpravo."
+
+#~ msgid "_Next input method:"
+#~ msgstr "_Další vstupní metoda:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "Zvolte klávesy další vstupní metody"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Klávesové události přepínající na další vstupní metodu. Úpravu provedete "
+#~ "kliknutím na tlačítko vpravo."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "_Předchozí vstupní metoda:"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Zvolte klávesy předchozí vstupní metody"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Klávesové události přepnutí do předcházející vstupní metody. Úpravu "
+#~ "provedete kliknutím na tlačítko vpravo."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "_Zobrazit nabídku vstupní metody:"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "Zvolte klávesy zobrazení nabídky vstupní metody"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Klávesové události k zobrazení nabídky vstupní metody. Úpravu provedete "
+#~ "kliknutím na tlačítko vpravo."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "_Rozložení klávesnice:"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Zde můžete nastavit své rozložení klávesnice tak, aby zvolené vstupní "
+#~ "metody fungovaly korektně."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "_Vložit předpřipravený řetězec do klientského okna"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, zobrazí se předpřipravený řetězec přímo v "
+#~ "klientském vstupním okně než v nezávislém plovoucím okně."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "_Zdílet vstupní metody u všech aplikací"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Pokud tuto volbu zaškrtnete, bude se u všech aplikací používat pouze "
+#~ "jeden typ vstupní metody. V opačném případě se u každé aplikace může "
+#~ "použije jiná."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Klávesové zkratky"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Zde můžete povolit/zakázat vstupní metody a nastavit jejich klávesové "
+#~ "zkratky."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Služby nainstalované vstupní metody:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "Upravit _klávesové zkratky"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "Úprava klávesových zkratek spojených se zvolenou vstupní metodou."
+
+#~ msgid "Select _Filters"
+#~ msgstr "Zvolit _filtry"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "Zvolte filtry spojené s touto vstupní metodou."
+
+#~ msgid "_Expand"
+#~ msgstr "_Rozbalit"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Zobrazení všech jazykových kategorií."
+
+#~ msgid "_Collapse"
+#~ msgstr "_Zabalit"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Skrytí všech jazykových kategorií."
+
+#~ msgid "E_nable All"
+#~ msgstr "_Povolit vše"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Povolit všechny vstupní metody."
+
+#~ msgid "_Disable All"
+#~ msgstr "_Zakázat vše"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Zakázat všechny vstupní metody."
+
+#~ msgid "Filters"
+#~ msgstr "Filtry"
+
+#~ msgid "Languages"
+#~ msgstr "Jazyky"
+
+#~ msgid "Description"
+#~ msgstr "Popis"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Upravit klávesové zkratky %s"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Zvolte filtry pro %s"
+
+#~ msgid "Move _Up"
+#~ msgstr "Posunout na_horu"
+
+#~ msgid "Move _Down"
+#~ msgstr "Posunout _dolů"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "Démon zapuštěný do panelu založený na knihovně GTK+-2.x."
+
+#~ msgid "On demand"
+#~ msgstr "Na požádání"
+
+#~ msgid "Never"
+#~ msgstr "Nikdy"
+
+#~ msgid "ToolBar"
+#~ msgstr "Nástrojová lišta"
+
+#~ msgid "_Show:"
+#~ msgstr "_Zobrazit:"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Automatické přicvaknutí"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Zobrazit ikonu _vstupní metody"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "Zobrazit _název vstupní metody"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "Délka _zobrazení::"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Zobrazit ikonu _přilepení"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Zobrazit ikonu _nabídky"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Zobrazit ikonu _nápovědy"
+
+#~ msgid "Show _property label"
+#~ msgstr "Zobrazit _vlastnosti"
+
+#~ msgid "Input window"
+#~ msgstr "Vstupní okno"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "_Vložená vyhledávací tabulka"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "V_ertikální vyhledávací tabulka"
+
+#~ msgid "Misc"
+#~ msgstr "Různé"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Pohltit ikonu do panelu"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Přišpendlit _okno"
+
+#~ msgid "_Font:"
+#~ msgstr "_Písmo:"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Pokud jste zvolili \"Vždy\", bude lišta vždy zobrazena. V případě \"Na "
+#~ "požádání\" bude vždy po deaktivaci SCIM skryta. U volby \"Nikdy\" se "
+#~ "nezobrazí nikdy."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, bude nástrojová lišta přichycena k okraji "
+#~ "pracovní plochy."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "Lišta se skryje po uplynutí zadaného času. Tato volba je platná pouze "
+#~ "pokud jste současně zvolili \"Vždy zobrazit'\". Funkci vypnete nastavením "
+#~ "na hodnotu 0."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr "Pokud zvolíte tuto možnost, objeví se na liště ikona metody."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, objeví se na liště název vstupní metody."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr "Pokud zvolíte tuto možnost, objeví se na liště ikona přišpendlení."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr "Pokud zvolíte tuto možnost, objeví se na liště ikona nabídky."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr "Pokud zvolíte tuto možnost, objeví se na liště ikona nápovědy."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, objeví se na liště ikona vlastností vstupní "
+#~ "metody."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, připojí se vstupního okna vyhledávací tabulka."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, zobrazí se vyhledávací tabulka vertikálně."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr "Pokud zvolíte tuto možnost, zapustí se ikona programu do panelu."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Pokud zvolíte tuto možnost, lišta nástrojů, vstupní okno a vyhledávací "
+#~ "tabulka se přišpendlí do původní pozice."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr "Nastavení písma v okně vstupu a ve vyhledávací tabulce."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Zvolte písmo rozhraní"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "Rozhraní"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMEngine"
+
+#~ msgid "Panel"
+#~ msgstr "Panel"
+
+#~ msgid "Extra"
+#~ msgstr "Rozšíření"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Nastavení vstupní metody SCIM"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ "<span size=\"20000\">Smart Common Input Method platforma</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Grafické rozhraní</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Nastavení %s modulů.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Chcete skutečně ukončit nastavení SCIM?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Ne všechna nastavení lze zavést za běhu. Nezapomeňte SCIM restartovat."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Nastavit SCIM"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "Grafické rozhraní založené na knihovně GTK Widget."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "Nástroj pro nastavení Smart Common Input Method platformy"
+
+#~ msgid "SCIM Help"
+#~ msgstr "Nápověda SCIM"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Input Method"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Přišpendlit/odšpendlit vstupní okno a nástrojovou lištu."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "Zobrazí krátkou nápovědu o aktuální vstupní metodě."
+
+#~ msgid "Show command menu."
+#~ msgstr "Zobrazí nabídku příkazů."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Obnovit konfiguraci"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Přišpendlit okno"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Skrýt lištu"
+
+#~ msgid "Help ..."
+#~ msgstr "Nápověda..."
+
+#~ msgid "Exit"
+#~ msgstr "Ukončit"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "En"
--- /dev/null
+# translation of de.po to German
+# This file is distributed under the same license as the scim package.
+# Copyright (C) 2004 THE scim'S COPYRIGHT HOLDER.
+#
+#
+# Jan Hefti <j.hefti@hamburg.de>, 2004.
+# Jan Hefti <j.hefti@chinaboard.de>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: de\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 15:30+0900\n"
+"PO-Revision-Date: 2005-12-16 14:10+0100\n"
+"Last-Translator: Jan Hefti <j.hefti@chinaboard.de>\n"
+"Language-Team: German <scim-devel@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: KBabel 1.11\n"
+
+#: ism/src/scim_compose_key.cpp:127 ism/src/scim_imengine.cpp:659
+#: ism/src/scim_panel_agent.cpp:345 ism/src/scim_panel_agent.cpp:4334
+#: ism/src/scim_utility.cpp:701
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1740
+msgid "English/Keyboard"
+msgstr "Deutsch/Tastatur"
+
+#. return WideString ();
+#: ism/src/scim_compose_key.cpp:146
+#, fuzzy
+msgid "English input service"
+msgstr "Englisch (USA)"
+
+#: ism/src/scim_utility.cpp:702
+msgid "Amharic"
+msgstr "Amharisch"
+
+#: ism/src/scim_utility.cpp:703
+msgid "Arabic"
+msgstr "Arabisch"
+
+#: ism/src/scim_utility.cpp:704 ism/src/scim_utility.cpp:893
+msgid "Arabic (Egypt)"
+msgstr "Arabisch (Ägypten)"
+
+#: ism/src/scim_utility.cpp:705 ism/src/scim_utility.cpp:902
+msgid "Arabic (Lebanon)"
+msgstr "Arabisch (Libanon)"
+
+#: ism/src/scim_utility.cpp:706
+msgid "Assamese"
+msgstr "Assamesisch"
+
+#: ism/src/scim_utility.cpp:707 ism/src/scim_utility.cpp:918
+msgid "Azerbaijani"
+msgstr "Aserbaidschanisch"
+
+#: ism/src/scim_utility.cpp:708
+msgid "Belarusian"
+msgstr "Weißrussisch"
+
+#: ism/src/scim_utility.cpp:709 ism/src/scim_utility.cpp:874
+msgid "Bulgarian"
+msgstr "Bulgarisch"
+
+#: ism/src/scim_utility.cpp:710 ism/src/scim_utility.cpp:711
+#: ism/src/scim_utility.cpp:913
+msgid "Bengali"
+msgstr "Bengalisch"
+
+#: ism/src/scim_utility.cpp:712
+msgid "Bengali (India)"
+msgstr "Bengalisch (Indien)"
+
+#: ism/src/scim_utility.cpp:713
+msgid "Tibetan"
+msgstr "Tibetisch"
+
+#: ism/src/scim_utility.cpp:714
+msgid "Bosnian"
+msgstr "Bosnisch"
+
+#: ism/src/scim_utility.cpp:715 ism/src/scim_utility.cpp:853
+msgid "Catalan"
+msgstr "Katalanisch"
+
+#: ism/src/scim_utility.cpp:716 ism/src/scim_utility.cpp:863
+#: ism/src/scim_keyboard_layout_data.h:4596
+msgid "Czech"
+msgstr "Tschechisch"
+
+#: ism/src/scim_utility.cpp:717 ism/src/scim_utility.cpp:923
+msgid "Welsh"
+msgstr "Walisisch"
+
+#: ism/src/scim_utility.cpp:718 ism/src/scim_utility.cpp:854
+#: ism/src/scim_keyboard_layout_data.h:4598
+msgid "Danish"
+msgstr "Dänisch"
+
+#: ism/src/scim_utility.cpp:719 ism/src/scim_keyboard_layout_data.h:4606
+msgid "German"
+msgstr "Deutsch"
+
+#: ism/src/scim_utility.cpp:720
+msgid "Divehi"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:721 ism/src/scim_utility.cpp:873
+#: ism/src/scim_keyboard_layout_data.h:4609
+msgid "Greek"
+msgstr "Griechisch"
+
+#: ism/src/scim_utility.cpp:722
+msgid "English"
+msgstr "Englisch"
+
+#: ism/src/scim_utility.cpp:723 ism/src/scim_utility.cpp:808
+msgid "English (Australian)"
+msgstr "Englisch (Australien)"
+
+#: ism/src/scim_utility.cpp:724 ism/src/scim_utility.cpp:809
+msgid "English (Canadian)"
+msgstr "Englisch (Kanada)"
+
+#: ism/src/scim_utility.cpp:725
+msgid "English (British)"
+msgstr "Englisch (Großbritannien)"
+
+#: ism/src/scim_utility.cpp:726
+msgid "English (Ireland)"
+msgstr "Englisch (Irland)"
+
+#: ism/src/scim_utility.cpp:727
+msgid "English (American)"
+msgstr "Englisch (USA)"
+
+#: ism/src/scim_utility.cpp:728 ism/src/scim_utility.cpp:729
+#: ism/src/scim_keyboard_layout_data.h:4622
+msgid "Spanish"
+msgstr "Spanisch"
+
+#: ism/src/scim_utility.cpp:730
+msgid "Spanish (Mexico)"
+msgstr "Spanisch (Mexiko)"
+
+#: ism/src/scim_utility.cpp:731 ism/src/scim_utility.cpp:870
+#: ism/src/scim_keyboard_layout_data.h:4601
+msgid "Estonian"
+msgstr "Estnisch"
+
+#: ism/src/scim_utility.cpp:732 ism/src/scim_utility.cpp:852
+msgid "Basque"
+msgstr "Baskisch"
+
+#: ism/src/scim_utility.cpp:733
+msgid "Persian"
+msgstr "Persisch"
+
+#: ism/src/scim_utility.cpp:734 ism/src/scim_utility.cpp:857
+#: ism/src/scim_keyboard_layout_data.h:4602
+msgid "Finnish"
+msgstr "Finnisch"
+
+#: ism/src/scim_utility.cpp:735 ism/src/scim_keyboard_layout_data.h:4603
+msgid "French"
+msgstr "Französisch"
+
+#: ism/src/scim_utility.cpp:736 ism/src/scim_utility.cpp:921
+msgid "Irish"
+msgstr "Irisch"
+
+#: ism/src/scim_utility.cpp:737 ism/src/scim_utility.cpp:919
+msgid "Galician"
+msgstr "Galizisch"
+
+#: ism/src/scim_utility.cpp:738 ism/src/scim_utility.cpp:914
+msgid "Gujarati"
+msgstr "Gujarati"
+
+#: ism/src/scim_utility.cpp:739 ism/src/scim_utility.cpp:748
+#: ism/src/scim_utility.cpp:890
+msgid "Hebrew"
+msgstr "Hebräisch"
+
+#: ism/src/scim_utility.cpp:740 ism/src/scim_utility.cpp:909
+msgid "Hindi"
+msgstr "Hindi"
+
+#: ism/src/scim_utility.cpp:741 ism/src/scim_keyboard_layout_data.h:4595
+msgid "Croatian"
+msgstr "Kroatisch"
+
+#: ism/src/scim_utility.cpp:742 ism/src/scim_utility.cpp:864
+#: ism/src/scim_keyboard_layout_data.h:4610
+msgid "Hungarian"
+msgstr "Ungarisch"
+
+#: ism/src/scim_utility.cpp:743
+#, fuzzy
+msgid "Armenian"
+msgstr "Rumänisch"
+
+#: ism/src/scim_utility.cpp:744
+msgid "Interlingua"
+msgstr "Interlingua"
+
+#: ism/src/scim_utility.cpp:745
+msgid "Indonesian"
+msgstr "Indonesisch"
+
+#: ism/src/scim_utility.cpp:746 ism/src/scim_utility.cpp:856
+#: ism/src/scim_keyboard_layout_data.h:4628
+msgid "Icelandic"
+msgstr "Isländisch"
+
+#: ism/src/scim_utility.cpp:747 ism/src/scim_keyboard_layout_data.h:4611
+msgid "Italian"
+msgstr "Italienisch"
+
+#: ism/src/scim_utility.cpp:749 ism/src/scim_utility.cpp:882
+#: ism/src/scim_keyboard_layout_data.h:4612
+msgid "Japanese"
+msgstr "Japanisch"
+
+#: ism/src/scim_utility.cpp:750 ism/src/scim_utility.cpp:917
+#, fuzzy
+msgid "Georgian"
+msgstr "Deutsch"
+
+#: ism/src/scim_utility.cpp:751 ism/src/scim_utility.cpp:875
+msgid "Kazakh"
+msgstr "Kasachisch"
+
+#: ism/src/scim_utility.cpp:752
+msgid "Cambodian"
+msgstr "Kambodschanisch"
+
+#: ism/src/scim_utility.cpp:753
+msgid "Kannada"
+msgstr "Kannada"
+
+#: ism/src/scim_utility.cpp:754 ism/src/scim_utility.cpp:883
+msgid "Korean"
+msgstr "Koreanisch"
+
+#: ism/src/scim_utility.cpp:755
+msgid "Laothian"
+msgstr "Laotisch"
+
+#: ism/src/scim_utility.cpp:756 ism/src/scim_utility.cpp:872
+#: ism/src/scim_keyboard_layout_data.h:4629
+msgid "Lithuanian"
+msgstr "Litauisch"
+
+#: ism/src/scim_utility.cpp:757 ism/src/scim_utility.cpp:871
+msgid "Latvian"
+msgstr "Lettisch"
+
+#: ism/src/scim_utility.cpp:758 ism/src/scim_utility.cpp:876
+msgid "Macedonian"
+msgstr "Mazedonisch"
+
+#: ism/src/scim_utility.cpp:759 ism/src/scim_utility.cpp:915
+msgid "Malayalam"
+msgstr "Malajalam"
+
+#: ism/src/scim_utility.cpp:760
+msgid "Mongolian"
+msgstr "Mongolisch"
+
+#: ism/src/scim_utility.cpp:761 ism/src/scim_utility.cpp:911
+msgid "Marathi"
+msgstr "Marathi"
+
+#: ism/src/scim_utility.cpp:762
+msgid "Malay"
+msgstr "Malaysisch"
+
+#: ism/src/scim_utility.cpp:763
+msgid "Burmese"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:764
+msgid "Nepali"
+msgstr "Nepalesisch"
+
+#: ism/src/scim_utility.cpp:765 ism/src/scim_keyboard_layout_data.h:4599
+msgid "Dutch"
+msgstr "Niederländisch"
+
+#: ism/src/scim_utility.cpp:766
+#, fuzzy
+msgid "Norwegian (Nynorsk)"
+msgstr "Norwegisch (Nynorsk)"
+
+#: ism/src/scim_utility.cpp:767
+#, fuzzy
+msgid "Norwegian (Bokmal)"
+msgstr "Norwegisch (Bokmal)"
+
+#: ism/src/scim_utility.cpp:768
+msgid "Oriya"
+msgstr "Orija"
+
+#: ism/src/scim_utility.cpp:769 ism/src/scim_utility.cpp:916
+msgid "Punjabi"
+msgstr "Pandschabi"
+
+#: ism/src/scim_utility.cpp:770 ism/src/scim_utility.cpp:865
+#: ism/src/scim_keyboard_layout_data.h:4614
+msgid "Polish"
+msgstr "Polnisch"
+
+#: ism/src/scim_utility.cpp:771 ism/src/scim_utility.cpp:773
+#: ism/src/scim_keyboard_layout_data.h:4615
+msgid "Portuguese"
+msgstr "Portugiesisch"
+
+#: ism/src/scim_utility.cpp:772 ism/src/scim_keyboard_layout_data.h:4616
+msgid "Portuguese (Brazil)"
+msgstr "Portugiesisch (Brasilien)"
+
+#: ism/src/scim_utility.cpp:774 ism/src/scim_utility.cpp:866
+msgid "Romanian"
+msgstr "Rumänisch"
+
+#: ism/src/scim_utility.cpp:775 ism/src/scim_utility.cpp:877
+#: ism/src/scim_keyboard_layout_data.h:4618
+msgid "Russian"
+msgstr "Russisch"
+
+#: ism/src/scim_utility.cpp:776 ism/src/scim_utility.cpp:922
+msgid "Sinhala"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:777 ism/src/scim_utility.cpp:868
+#: ism/src/scim_keyboard_layout_data.h:4619
+msgid "Slovak"
+msgstr "Slowakisch"
+
+#: ism/src/scim_utility.cpp:778 ism/src/scim_utility.cpp:869
+#: ism/src/scim_keyboard_layout_data.h:4621
+msgid "Slovenian"
+msgstr "Slowenisch"
+
+#: ism/src/scim_utility.cpp:779
+msgid "Albanian"
+msgstr "Albanisch"
+
+#: ism/src/scim_utility.cpp:780 ism/src/scim_utility.cpp:781
+#: ism/src/scim_utility.cpp:782
+msgid "Serbian"
+msgstr "Serbisch"
+
+#: ism/src/scim_utility.cpp:783 ism/src/scim_utility.cpp:785
+#: ism/src/scim_utility.cpp:861 ism/src/scim_keyboard_layout_data.h:4625
+msgid "Swedish"
+msgstr "Schwedisch"
+
+#: ism/src/scim_utility.cpp:784 ism/src/scim_utility.cpp:862
+msgid "Swedish (Finland)"
+msgstr "Schwedisch (Finnland)"
+
+#: ism/src/scim_utility.cpp:786 ism/src/scim_utility.cpp:912
+msgid "Tamil"
+msgstr "Tamilisch"
+
+#: ism/src/scim_utility.cpp:787 ism/src/scim_utility.cpp:910
+msgid "Telugu"
+msgstr "Telugu"
+
+#: ism/src/scim_utility.cpp:788 ism/src/scim_utility.cpp:889
+msgid "Thai"
+msgstr "Thai"
+
+#: ism/src/scim_utility.cpp:789 ism/src/scim_utility.cpp:880
+#: ism/src/scim_keyboard_layout_data.h:4626
+msgid "Turkish"
+msgstr "Türkisch"
+
+#: ism/src/scim_utility.cpp:790
+msgid "Uighur"
+msgstr "Uigurisch"
+
+#: ism/src/scim_utility.cpp:791 ism/src/scim_utility.cpp:879
+#: ism/src/scim_keyboard_layout_data.h:4630
+msgid "Ukrainian"
+msgstr "Ukrainisch"
+
+#: ism/src/scim_utility.cpp:792 ism/src/scim_utility.cpp:907
+msgid "Urdu"
+msgstr "Urdu"
+
+#: ism/src/scim_utility.cpp:793
+msgid "Uzbek"
+msgstr "Usbekisch"
+
+#: ism/src/scim_utility.cpp:794 ism/src/scim_utility.cpp:908
+msgid "Vietnamese"
+msgstr "Vietnamesisch"
+
+#: ism/src/scim_utility.cpp:795
+msgid "Walloon"
+msgstr "Wallonisch"
+
+#: ism/src/scim_utility.cpp:796 ism/src/scim_utility.cpp:797
+msgid "Yiddish"
+msgstr "Jiddisch"
+
+#: ism/src/scim_utility.cpp:798
+msgid "Chinese"
+msgstr "Chinesisch"
+
+#: ism/src/scim_utility.cpp:799 ism/src/scim_utility.cpp:801
+#, fuzzy
+msgid "Chinese (Simplified)"
+msgstr "Chinesisch (vereinfacht)"
+
+#: ism/src/scim_utility.cpp:800 ism/src/scim_utility.cpp:802
+#, fuzzy
+msgid "Chinese (Traditional)"
+msgstr "Chinesisch (traditionell)"
+
+#: ism/src/scim_utility.cpp:804
+msgid "Dutch (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:805
+#, fuzzy
+msgid "Dutch (Belgian)"
+msgstr "Belgisch"
+
+#: ism/src/scim_utility.cpp:806
+#, fuzzy
+msgid "English (United States)"
+msgstr "Englisch (US)"
+
+#: ism/src/scim_utility.cpp:807
+#, fuzzy
+msgid "English (United Kingdom)"
+msgstr "Englisch (Kanada)"
+
+#: ism/src/scim_utility.cpp:810
+#, fuzzy
+msgid "English (New Zealand)"
+msgstr "Englisch (Irland)"
+
+#: ism/src/scim_utility.cpp:811
+#, fuzzy
+msgid "English (Irish)"
+msgstr "Englisch (Großbritannien)"
+
+#: ism/src/scim_utility.cpp:812
+#, fuzzy
+msgid "English (South Africa)"
+msgstr "Englisch (USA)"
+
+#: ism/src/scim_utility.cpp:813
+#, fuzzy
+msgid "English (Jamaica)"
+msgstr "Englisch (Kanada)"
+
+#: ism/src/scim_utility.cpp:814
+#, fuzzy
+msgid "English (Belize)"
+msgstr "Englisch (Großbritannien)"
+
+#: ism/src/scim_utility.cpp:815
+#, fuzzy
+msgid "English (Trinidad)"
+msgstr "Englisch (Großbritannien)"
+
+#: ism/src/scim_utility.cpp:816
+#, fuzzy
+msgid "English (Zimbabwe)"
+msgstr "Englisch (Kanada)"
+
+#: ism/src/scim_utility.cpp:817
+#, fuzzy
+msgid "English (Philippines)"
+msgstr "Englisch (Großbritannien)"
+
+#: ism/src/scim_utility.cpp:818
+#, fuzzy
+msgid "French (Standard)"
+msgstr "Französisch (Kanada)"
+
+#: ism/src/scim_utility.cpp:819
+#, fuzzy
+msgid "French (Belgian)"
+msgstr "Französisch (Kanada)"
+
+#: ism/src/scim_utility.cpp:820 ism/src/scim_keyboard_layout_data.h:4604
+msgid "French (Canadian)"
+msgstr "Französisch (Kanada)"
+
+#: ism/src/scim_utility.cpp:821
+#, fuzzy
+msgid "French (Swiss)"
+msgstr "Deutsch (Schweiz)"
+
+#: ism/src/scim_utility.cpp:822
+msgid "French (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:823
+#, fuzzy
+msgid "French (Monaco)"
+msgstr "Französisch (Kanada)"
+
+#: ism/src/scim_utility.cpp:824
+#, fuzzy
+msgid "German (Standard)"
+msgstr "Deutsch (mit deadkeys)"
+
+#: ism/src/scim_utility.cpp:825 ism/src/scim_keyboard_layout_data.h:4608
+msgid "German (Swiss)"
+msgstr "Deutsch (Schweiz)"
+
+#: ism/src/scim_utility.cpp:826
+#, fuzzy
+msgid "German (Austrian)"
+msgstr "Englisch (Australien)"
+
+#: ism/src/scim_utility.cpp:827
+msgid "German (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:828
+#, fuzzy
+msgid "German (Liechtenstein)"
+msgstr "Deutsch (Schweiz)"
+
+#: ism/src/scim_utility.cpp:829
+msgid "Italian (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:830
+#, fuzzy
+msgid "Italian (Swiss)"
+msgstr "Deutsch (Schweiz)"
+
+#: ism/src/scim_utility.cpp:831
+#, fuzzy
+msgid "Portuguese (Brazilian)"
+msgstr "Portugiesisch (Brasilien)"
+
+#: ism/src/scim_utility.cpp:832
+#, fuzzy
+msgid "Portuguese (Standard)"
+msgstr "Portugiesisch (Brasilien)"
+
+#: ism/src/scim_utility.cpp:833
+#, fuzzy
+msgid "Spanish (Traditional Sort)"
+msgstr "Spanisch (Lateinamerika)"
+
+#: ism/src/scim_utility.cpp:834
+#, fuzzy
+msgid "Spanish (Mexican)"
+msgstr "Spanisch (Mexiko)"
+
+#: ism/src/scim_utility.cpp:835
+#, fuzzy
+msgid "Spanish (Guatemala)"
+msgstr "Spanisch (Lateinamerika)"
+
+#: ism/src/scim_utility.cpp:836
+#, fuzzy
+msgid "Spanish (Costa Rica)"
+msgstr "Spanisch (Lateinamerika)"
+
+#: ism/src/scim_utility.cpp:837
+#, fuzzy
+msgid "Spanish (Panama)"
+msgstr "Spanisch (Lateinamerika)"
+
+#: ism/src/scim_utility.cpp:838
+#, fuzzy
+msgid "Spanish (Dominican Republic)"
+msgstr "Spanisch (Lateinamerika)"
+
+#: ism/src/scim_utility.cpp:839
+#, fuzzy
+msgid "Spanish (Venezuela)"
+msgstr "Spanisch (Mexiko)"
+
+#: ism/src/scim_utility.cpp:840
+#, fuzzy
+msgid "Spanish (Colombia)"
+msgstr "Spanisch (Mexiko)"
+
+#: ism/src/scim_utility.cpp:841
+#, fuzzy
+msgid "Spanish (Peru)"
+msgstr "Spanisch (Mexiko)"
+
+#: ism/src/scim_utility.cpp:842
+#, fuzzy
+msgid "Spanish (Argentina)"
+msgstr "Spanisch (Mexiko)"
+
+#: ism/src/scim_utility.cpp:843
+#, fuzzy
+msgid "Spanish (Ecuador)"
+msgstr "Spanisch (Mexiko)"
+
+#: ism/src/scim_utility.cpp:844
+#, fuzzy
+msgid "Spanish (Chile)"
+msgstr "Spanisch (Mexiko)"
+
+#: ism/src/scim_utility.cpp:845
+#, fuzzy
+msgid "Spanish (Uruguay)"
+msgstr "Spanisch (Mexiko)"
+
+#: ism/src/scim_utility.cpp:846
+#, fuzzy
+msgid "Spanish (Paraguay)"
+msgstr "Spanisch (CP 850)"
+
+#: ism/src/scim_utility.cpp:847
+#, fuzzy
+msgid "Spanish (Bolivia)"
+msgstr "Spanisch (Mexiko)"
+
+#: ism/src/scim_utility.cpp:848
+msgid "Spanish (El Salvador)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:849
+#, fuzzy
+msgid "Spanish (Honduras)"
+msgstr "Spanisch (Mexiko)"
+
+#: ism/src/scim_utility.cpp:850
+#, fuzzy
+msgid "Spanish (Nicaragua)"
+msgstr "Spanisch (Mexiko)"
+
+#: ism/src/scim_utility.cpp:851
+#, fuzzy
+msgid "Spanish (Puerto Rico)"
+msgstr "Spanisch (Mexiko)"
+
+#: ism/src/scim_utility.cpp:855
+msgid "Afrikaans"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:858
+#, fuzzy
+msgid "Malay (Malaysia)"
+msgstr "Malajalam"
+
+#: ism/src/scim_utility.cpp:859
+msgid "Malay (Brunei Darussalam)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:860 ism/src/scim_keyboard_layout_data.h:4613
+msgid "Norwegian"
+msgstr "Norwegisch"
+
+#: ism/src/scim_utility.cpp:867
+#, fuzzy
+msgid "Serbian (Latin)"
+msgstr "Serbisch"
+
+#: ism/src/scim_utility.cpp:878
+msgid "Serbian (Cyrillic)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:881
+msgid "Uzbek (Latin)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:884
+#, fuzzy
+msgid "Chinese (Taiwan)"
+msgstr "Chinesisch (traditionell)"
+
+#: ism/src/scim_utility.cpp:885
+#, fuzzy
+msgid "Chinese (Hong Kong)"
+msgstr "Chinesisch (traditionell)"
+
+#: ism/src/scim_utility.cpp:886
+#, fuzzy
+msgid "Chinese (Macau)"
+msgstr "Chinesisch (traditionell)"
+
+#: ism/src/scim_utility.cpp:887
+#, fuzzy
+msgid "Chinese (PRC)"
+msgstr "Chinesisch"
+
+#: ism/src/scim_utility.cpp:888
+#, fuzzy
+msgid "Chinese (Singapore)"
+msgstr "Chinesisch (vereinfacht)"
+
+#: ism/src/scim_utility.cpp:891
+msgid "Arabic (Saudi Arabia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:892
+#, fuzzy
+msgid "Arabic (Iraq)"
+msgstr "Arabisch (Libanon)"
+
+#: ism/src/scim_utility.cpp:894
+#, fuzzy
+msgid "Arabic (Libya)"
+msgstr "Arabisch (Libanon)"
+
+#: ism/src/scim_utility.cpp:895
+#, fuzzy
+msgid "Arabic (Algeria)"
+msgstr "Arabisch (Libanon)"
+
+#: ism/src/scim_utility.cpp:896
+#, fuzzy
+msgid "Arabic (Morocco)"
+msgstr "Arabisch (Libanon)"
+
+#: ism/src/scim_utility.cpp:897
+#, fuzzy
+msgid "Arabic (Tunisia)"
+msgstr "Arabisch (Libanon)"
+
+#: ism/src/scim_utility.cpp:898
+#, fuzzy
+msgid "Arabic (Oman)"
+msgstr "Arabisch (Libanon)"
+
+#: ism/src/scim_utility.cpp:899
+#, fuzzy
+msgid "Arabic (Yemen)"
+msgstr "Arabisch (Libanon)"
+
+#: ism/src/scim_utility.cpp:900
+#, fuzzy
+msgid "Arabic (Syria)"
+msgstr "Arabisch (Ägypten)"
+
+#: ism/src/scim_utility.cpp:901
+#, fuzzy
+msgid "Arabic (Jordan)"
+msgstr "Arabisch (Libanon)"
+
+#: ism/src/scim_utility.cpp:903
+#, fuzzy
+msgid "Arabic (Kuwait)"
+msgstr "Arabisch (Ägypten)"
+
+#: ism/src/scim_utility.cpp:904
+#, fuzzy
+msgid "Arabic (UAE)"
+msgstr "Arabisch (Ägypten)"
+
+#: ism/src/scim_utility.cpp:905
+#, fuzzy
+msgid "Arabic (Bahrain)"
+msgstr "Arabisch (Libanon)"
+
+#: ism/src/scim_utility.cpp:906
+#, fuzzy
+msgid "Arabic (Qatar)"
+msgstr "Arabisch (Ägypten)"
+
+#: ism/src/scim_utility.cpp:920
+msgid "Hausa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:924
+msgid "Xhosa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:925
+msgid "Yoruba"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:926
+msgid "Zulu"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:1024
+msgid "Other"
+msgstr "Sonstige"
+
+#: ism/src/scim_keyboard_layout_data.h:4592
+#: ism/modules/imengine/scim_socket_imengine.cpp:408
+#: ism/modules/imengine/scim_socket_imengine.cpp:438
+#: ism/modules/imengine/scim_socket_imengine.cpp:523
+#: ism/modules/imengine/scim_socket_imengine.cpp:553
+#: ism/modules/imengine/scim_socket_imengine.cpp:583
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: ism/src/scim_keyboard_layout_data.h:4593
+msgid "English (US)"
+msgstr "Englisch (US)"
+
+#: ism/src/scim_keyboard_layout_data.h:4594
+msgid "Belgian"
+msgstr "Belgisch"
+
+#: ism/src/scim_keyboard_layout_data.h:4597
+msgid "Czech (qwerty)"
+msgstr "Tschechisch (qwerty)"
+
+#: ism/src/scim_keyboard_layout_data.h:4600
+msgid "Dvorak"
+msgstr "Dvorak"
+
+#: ism/src/scim_keyboard_layout_data.h:4605
+msgid "French (Switzerland)"
+msgstr "Französisch (Schweiz) "
+
+#: ism/src/scim_keyboard_layout_data.h:4607
+msgid "German (with deadkeys)"
+msgstr "Deutsch (mit deadkeys)"
+
+#: ism/src/scim_keyboard_layout_data.h:4617
+msgid "Portuguese (Brazil US accents)"
+msgstr "Portugiesisch (Brasilien, US, Akzente)"
+
+#: ism/src/scim_keyboard_layout_data.h:4620
+msgid "Slovak (qwerty)"
+msgstr "Slovakisch (qwerty)"
+
+#: ism/src/scim_keyboard_layout_data.h:4623
+msgid "Spanish (CP 850)"
+msgstr "Spanisch (CP 850)"
+
+#: ism/src/scim_keyboard_layout_data.h:4624
+msgid "Spanish (Latin America)"
+msgstr "Spanisch (Lateinamerika)"
+
+#: ism/src/scim_keyboard_layout_data.h:4627
+msgid "English (UK)"
+msgstr "Englisch (UK)"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:57
+msgid "Simplified-Traditional Chinese Conversion"
+msgstr "Umwandlung vereinfachtes/traditionelles Chinesisch"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:60
+msgid "Convert between Simplified Chinese and Traditional Chinese"
+msgstr "Vereinfachtes in traditionelles Chinesisch umwandeln und umgekehrt"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:71
+msgid "SC-TC"
+msgstr "VC-TC"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:73
+#: ism/modules/filter/scim_sctc_filter.cpp:78
+msgid "Simplified-Traditional Chinese conversion"
+msgstr "Umwandlung vereinfachtes->traditionelles Chinesisch"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:76
+msgid "No Conversion"
+msgstr "Keine Umwandlung"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:81
+msgid "Simplified to Traditional"
+msgstr "Vereinfacht zu traditionell"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:83
+msgid "Convert Simplified Chinese to Traditional Chinese"
+msgstr "Vereinfachtes Chinesisch in traditionelles Chinesisch umwandeln"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:86
+msgid "Traditional to Simplified"
+msgstr "Traditionell zu vereinfacht"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:88
+msgid "Convert Traditional Chinese to Simplified Chinese"
+msgstr "Traditionelles Chinesisch in vereinfachtes Chinesisch umwandeln"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:300
+msgid "James Su <suzhe@tsinghua.org.cn>"
+msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:425
+#: ism/modules/filter/scim_sctc_filter.cpp:555
+#: ism/modules/filter/scim_sctc_filter.cpp:571
+msgid "SC->TC"
+msgstr "VC->TC"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:431
+#: ism/modules/filter/scim_sctc_filter.cpp:559
+#: ism/modules/filter/scim_sctc_filter.cpp:575
+msgid "TC->SC"
+msgstr "TC->VC"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1693
+msgid "Smart Common Input Method platform "
+msgstr "Smart Common Input Method Plattform "
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1695
+msgid ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+msgstr ""
+"\n"
+"(c) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1700
+msgid ""
+":\n"
+"\n"
+msgstr ""
+":\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1703
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:963
+msgid "Enable"
+msgstr "Aktivieren"
+
+#. gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+#. gtk_tree_view_column_set_fixed_width (column, 232);
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:984
+msgid "Name"
+msgstr "Name"
+
+#: ism/utils/scimstringview.c:201
+msgid "Cursor Position"
+msgstr "Zeigerposition"
+
+#: ism/utils/scimstringview.c:202
+msgid "The current position of the insertion cursor in chars."
+msgstr "Die aktuelle Zeigerposition (in Zeichen gerechnet)."
+
+#: ism/utils/scimstringview.c:211
+msgid "Maximum length"
+msgstr "Maximale Länge"
+
+#: ism/utils/scimstringview.c:212
+msgid "Maximum number of characters for this string view. Zero if no maximum."
+msgstr "Maximale Anzahl angezeigter Zeichen. »0« bedeutet unbegrenzt."
+
+#: ism/utils/scimstringview.c:221
+msgid "Maximum width"
+msgstr "Maximale Breite"
+
+#: ism/utils/scimstringview.c:222
+msgid "Maximum width of this string view."
+msgstr "Maximale Breite der angezeigten Zeichenkette."
+
+#: ism/utils/scimstringview.c:231
+msgid "Has Frame"
+msgstr "Mit Rahmen"
+
+#: ism/utils/scimstringview.c:232
+msgid "FALSE removes outside bevel from string view."
+msgstr "»Nein« entfernt den umgebenden Rahmen von der angezeigten Zeichenkette."
+
+#: ism/utils/scimstringview.c:239
+msgid "Draw cursor"
+msgstr "Zeiger anzeigen"
+
+#: ism/utils/scimstringview.c:240
+msgid "TRUE draw blinking cursor."
+msgstr "Wenn »ja«, wird ein blinkender Zeiger angezeigt."
+
+#: ism/utils/scimstringview.c:247
+msgid "Auto move cursor"
+msgstr "Zeiger automatisch verschieben"
+
+#: ism/utils/scimstringview.c:248
+msgid "TRUE auto move cursor position when mouse clicking."
+msgstr "Wenn »ja«, wird der Zeiger bei einem Mausklick automatisch verschoben."
+
+#: ism/utils/scimstringview.c:255
+#, fuzzy
+msgid "Forward button press/release event"
+msgstr "Knopfdruck zum Übertragen"
+
+#: ism/utils/scimstringview.c:256
+#, fuzzy
+msgid "TRUE forward button press/release event to user program."
+msgstr ""
+"Wenn »ja«, wird der gewählte Ausdruck beim jeweiligen Knopfdruck zum Programm "
+"übertragen."
+
+#: ism/utils/scimstringview.c:263
+msgid "Auto resize the widget to fit the string"
+msgstr "Anzeigefläche automatisch an Zeichenkette anpassen"
+
+#: ism/utils/scimstringview.c:264
+msgid "TRUE Auto resize on."
+msgstr "Bei »ja« ist die automatische Größenanpassung aktiviert."
+
+#: ism/utils/scimstringview.c:271
+msgid "Emit move_cursor signal when press/release the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:272
+#, fuzzy
+msgid "TRUE Emit move_cursor signal when press the string."
+msgstr "Wenn »ja«, wird der Zeiger bei einem Mausklick automatisch verschoben."
+
+#: ism/utils/scimstringview.c:279
+msgid "Width in chars"
+msgstr "Breite in Zeichen"
+
+#: ism/utils/scimstringview.c:280
+msgid "Number of characters to leave space for in the string view."
+msgstr "Anzahl der Zeichen, für die in der Anzeige Platz gelassen werden soll."
+
+#: ism/utils/scimstringview.c:289
+msgid "Scroll offset"
+msgstr "Verschiebeversatz"
+
+#: ism/utils/scimstringview.c:290
+msgid "Number of pixels of the string view scrolled off the screen to the left"
+msgstr ""
+"Anzahl der Pixel, um die die Anzeige außerhalb des Bildschirms nach links "
+"verschoben wird"
+
+#: ism/utils/scimstringview.c:299
+msgid "Text"
+msgstr "Text"
+
+#: ism/utils/scimstringview.c:300
+msgid "The contents of the string view"
+msgstr "Inhalt der Zeichenkettenanzeige"
+
+#: ism/utils/scimkeyselection.cpp:161
+msgid "Selected _Keys:"
+msgstr "Gewählte _Tasten:"
+
+#: ism/utils/scimkeyselection.cpp:206
+msgid "Key Code:"
+msgstr "Tastencode:"
+
+#: ism/utils/scimkeyselection.cpp:224
+#, fuzzy
+msgid "....."
+msgstr "..."
+
+#: ism/utils/scimkeyselection.cpp:229
+msgid "Modifiers:"
+msgstr "Sondertasten:"
+
+#: ism/utils/scimkeyselection.cpp:242
+msgid "_Ctrl"
+msgstr "_Strg"
+
+#: ism/utils/scimkeyselection.cpp:246
+msgid "A_lt"
+msgstr "_Alt"
+
+#: ism/utils/scimkeyselection.cpp:250
+msgid "_Shift"
+msgstr "_Umschalt"
+
+#: ism/utils/scimkeyselection.cpp:254
+msgid "_Release"
+msgstr "_Loslassen"
+
+#: ism/utils/scimkeyselection.cpp:264
+msgid "_Meta"
+msgstr "_Meta"
+
+#: ism/utils/scimkeyselection.cpp:268
+msgid "S_uper"
+msgstr "Su_per"
+
+#: ism/utils/scimkeyselection.cpp:272
+msgid "_Hyper"
+msgstr "_Hyper"
+
+#: ism/utils/scimkeyselection.cpp:337
+msgid "Please enter a Key Code first."
+msgstr "Bitte geben Sie zuerst einen Tastencode ein."
+
+#: ism/utils/scimkeyselection.cpp:391
+#, fuzzy
+msgid ""
+"Press a key (or a key combination).\n"
+"This dialog will be closed \n"
+"when the key is released."
+msgstr ""
+"Drücken Sie eine Taste (oder eine Tastenkombination).\n"
+"Dieser Dialog wird geschlossen, wenn die Tasten gelöst werden."
+
+#: ism/utils/scimkeyselection.cpp:395
+msgid "Grabbing a key."
+msgstr "Erfassen der Tasten."
+
+#: ism/utils/scimkeyselection.cpp:686
+msgid "Key Selection"
+msgstr "Tastenauswahl"
+
+#: ism/utils/scimtrayicon.c:108
+msgid "Orientation"
+msgstr "Ausrichtung"
+
+#: ism/utils/scimtrayicon.c:109
+msgid "The orientation of the tray."
+msgstr "Die Ausrichtung des Systemabschnitts der Kontrollleiste."
+
+#. Normal Layout
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "NORMAL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "click to enter TEXT"
+msgstr ""
+
+#. Number Layout
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "NUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "click to enter NUMBER"
+msgstr ""
+
+#. Email Layout
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "EMAIL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "click to enter EMAIL"
+msgstr ""
+
+#. URL Layout
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "URL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "click to enter URL"
+msgstr ""
+
+#. Phonenumber Layout
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "PHONENUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "click to enter PHONENUMBER"
+msgstr ""
+
+#. IP Layout
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "IP LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "click to enter IP"
+msgstr ""
+
+#. Month Layout
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "MONTH LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "click to enter MONTH"
+msgstr ""
+
+#. Number Only Layout
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "NUMBERONLY LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "click to enter NUMBERONLY"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:220
+msgid "ise layout"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:51
+msgid "Application template"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:52
+msgid "Click to exit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:156
+msgid "Previous"
+msgstr ""
+
+#. bundle_add(ad->data, "navi_btn_left", NULL);
+#: ism/demos/isf_demo_efl.cpp:158
+#, fuzzy
+msgid "Next"
+msgstr "Text"
+
+#: ism/demos/isf_demo_efl.cpp:171
+msgid "Quit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:203
+msgid "isf demo"
+msgstr ""
+
+#: ism/demos/isf_entry_event_efl.cpp:151
+msgid "entry event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:220
+msgid "label event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:250
+msgid "ise event demo"
+msgstr ""
+
+#: ism/demos/isf_imcontrol_efl.cpp:375
+msgid "isfimcontrol api"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "Tastenauswahl"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Option"
+msgstr "Optionen"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "Deutsch"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "Deutsch/Tastatur"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Tastenauswahl"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "Tastenauswahl"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "Deutsch/Tastatur"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "Optionen"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "Deutsch/Tastatur"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amharisch"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Immer"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Optionen"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Deutsch/Tastatur"
+
+#~ msgid "English/European"
+#~ msgstr "Deutsch/Europäisch"
+
+#~ msgid "RAW CODE"
+#~ msgstr "Unicode Rohdaten"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(c) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Tastenkürzel:\n"
+#~ "\n"
+#~ " Steuerung+u:\n"
+#~ " Umschalten zwischen Multibyte-Codierung und Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " Eingabemethode zurücksetzen.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr ""
+#~ "Der Status der aktuell verwendeten Eingabemethode. Klicken Sie diesen an, "
+#~ "um ihn zu ändern."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Globale Einstellungen"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Stellen Sie die globalen Optionen ein, die von allen FrontEnd-Modulen "
+#~ "beachtet werden, einschließlich dem X11 FrontEnd, GKT IMModule, QT "
+#~ "IMModule, usw."
+
+#~ msgid "_Trigger:"
+#~ msgstr "_Auslöser:"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Tasten zum Auslösen auswählen"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen die Eingabemethode SCIM an- und "
+#~ "ausgeschaltet wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "Turn _On:"
+#~ msgstr "_Einschalten:"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Tasten zum Einschalten auswählen"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen die Eingabemethode SCIM eingeschaltet "
+#~ "wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "A_usschalten"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Tasten zum Ausschalten auswählen"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen die Eingabemethode SCIM ausgeschaltet "
+#~ "wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "_Next input method:"
+#~ msgstr "_Nächste Eingabemethode:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr ""
+#~ "Wählen Sie die Tastenkombinationen, um zur nächsten Eingabemethode zu "
+#~ "wechseln"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen zur nächsten Eingabemethode gewechselt "
+#~ "wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "_Vorherige Eingabemethode:"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr ""
+#~ "Wählen Sie die Tastenkombinationen, um zur vorherigen Eingabemethode zu "
+#~ "wechseln"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen zur vorherigen Eingabemethode gewechselt "
+#~ "wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "Zeige _Auswahlmenü für Eingabemethoden:"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr ""
+#~ "Wählen Sie die Tastenkürzel, um das Auswahlmenü für Eingabemethoden "
+#~ "anzuzeigen"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tastenkombinationen, mit denen das Auswahlmenü für Eingabemethoden "
+#~ "angezeigt wird. Klicken Sie zum Ändern auf den rechten Knopf."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "_Tastaturlayout"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Sie sollten hier Ihr derzeit verwendetes Tastaturlayout einstellen, so "
+#~ "dass Eingabemethoden, die vom Tastaturlayout abhängig sind, korrekt "
+#~ "funktionieren."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "Roheingabe ins Client-Fenster einbetten"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird die Roheingabe - die bisher "
+#~ "eingegebenen Zeichen vor einer endgültigen Auswahl - ins Client-"
+#~ "Eingabefenster eingebettet und nicht in einem Extrafenster angezeigt."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "Dieselbe Eingabemethode unter _allen Anwendungen verwenden."
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Wenn diese Option aktiviert ist, wird ein und dieselbe Eingabemethode von "
+#~ "allen Anwendungen gleichzeitig verwendet. Andernfalls kann jede Anwendung "
+#~ "eine andere Eingabemethode verwenden."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Tastenkombinationen"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Hier können Sie die installierten Eingabemethoden aktivieren/deaktivieren "
+#~ "und ihnen Tastenkürzel zuordnen."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Installierte Eingabemethoden:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "_Tastenkürzel ändern"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr ""
+#~ "Stellen Sie die mit der gewählten Eingabemethode assoziierten "
+#~ "Tastenkürzel ein."
+
+#~ msgid "Select _Filters"
+#~ msgstr "_Filter auswählen"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr ""
+#~ "Wählen Sie die Filter, die dieser Eingabemethode zugeordnet werden sollen."
+
+#~ msgid "_Expand"
+#~ msgstr "Er_weitern"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Erweitern Sie alle Sprachgruppen."
+
+#~ msgid "_Collapse"
+#~ msgstr "Ein_klappen"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Klappen Sie alle Sprachgruppen ein."
+
+#~ msgid "E_nable All"
+#~ msgstr "Alle _aktivieren"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Alle Eingabemethoden aktivieren."
+
+#~ msgid "_Disable All"
+#~ msgstr "Alle _deaktivieren"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Alle Eingabemethoden deaktivieren."
+
+#~ msgid "Filters"
+#~ msgstr "Filter"
+
+#~ msgid "Languages"
+#~ msgstr "Sprachen"
+
+#~ msgid "Description"
+#~ msgstr "Beschreibung"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Tastenkürzel für %s ändern"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Filter für %s wählen"
+
+#~ msgid "Move _Up"
+#~ msgstr "Nach _oben"
+
+#~ msgid "Move _Down"
+#~ msgstr "Nach _unten"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr ""
+#~ "Ein Kontrollleisten-Hilfsprogramm, das auf der GTK+-2.x-Bibliothek beruht."
+
+#~ msgid "On demand"
+#~ msgstr "Auf Anforderung"
+
+#~ msgid "Never"
+#~ msgstr "Nie"
+
+#~ msgid "ToolBar"
+#~ msgstr "Symbolleiste"
+
+#~ msgid "_Show:"
+#~ msgstr "_Zeige:"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Automatisch ein_rasten"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Symbol für die Eingabe_methode anzeigen"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "_Name der Eingabemethode anzeigen"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "_Ausblenden nach (sek):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Symbol »Immer im _Vordergrund« anzeigen"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Symbol »_Menü« anzeigen"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Symbol »_Hilfe« anzeigen"
+
+#~ msgid "Show _property label"
+#~ msgstr "_Bezeichnung der Eigenschaften anzeigen"
+
+#~ msgid "Input window"
+#~ msgstr "Eingabefenster"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "Ein_gebettete Auswahlliste"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "_Vertikale Auswahlliste"
+
+#~ msgid "Misc"
+#~ msgstr "Verschiedenes"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Symbol im _Benachrichtigungsfeld anzeigen"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Fenster behält _Position"
+
+#~ msgid "_Font:"
+#~ msgstr "_Schriftart:"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Wenn »Immer« gewählt ist, wird die Symbolleiste immer auf dem Bildschirm "
+#~ "angezeigt. Bei »Auf Anforderung« wird sie nur angezeigt, wenn SCIM "
+#~ "aktiviert ist. Bei »Nie« wird sie niemals angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird die Symbolleiste am Bildschirmrand "
+#~ "eingerastet."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "Die Symbolleiste wird versteckt, nachdem die angegebene Zeit vergangen "
+#~ "ist. Diese Option ist nur verfügbar, wenn »Immer anzeigen« gewählt ist. "
+#~ "Geben Sie »0« ein, um dieses Verhalten zu unterdrücken. "
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird das Symbol der aktuellen "
+#~ "Eingabemethode auf der Symbolleiste angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird der Name der aktuellen Eingabemethode "
+#~ "auf der Symbolleiste angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird das Symbol »Immer im Vordergrund "
+#~ "halten« auf der Symbolleiste angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird das Symbol »Menü« auf der Symbolleiste "
+#~ "angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird das Symbol »Hilfe« auf der "
+#~ "Symbolleiste angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, werden die Bezeichnungen der einzelnen "
+#~ "Eigenschaften der Eingabemethode auf der Symbolleiste angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird die Auswahlliste ins Eingabefenster "
+#~ "eingebettet."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird die Auswahlliste senkrecht angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, wird ein Symbol in der Kontrollleiste "
+#~ "angezeigt."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Wenn diese Option gewählt ist, werden Symbolleiste, Eingabefenster und "
+#~ "Auswahlliste immer an ihren jeweiligen Ausgangspositionen gehalten."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "Die eingestellte Schriftart wird in Eingabefenster und Auswahlliste "
+#~ "verwendet."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Schriftart für die Benutzeroberfläche wählen"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "Benutzeroberfläche"
+
+#~ msgid "IMEngine"
+#~ msgstr "Eingabemethoden"
+
+#~ msgid "Panel"
+#~ msgstr "Kontrollleiste"
+
+#~ msgid "Extra"
+#~ msgstr "Extra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Einstellungen der SCIM-Eingabemethoden"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Smart Common Input Method-Plattform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Grafisches Einrichtungswerkzeug</"
+#~ "span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Einstellungen der %s-Module.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Möchten Sie die Einstellung von SCIM wirklich verlassen?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Nicht alle Einstellungen können bei laufendem Programm neu geladen "
+#~ "werden. Starten Sie bitte SCIM neu, damit alle Änderungen übernommen "
+#~ "werden."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Einrichtung von SCIM"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr ""
+#~ "Integriertes Einrichtungswerkzeug, das auf der GTK Widget-Bibliothek "
+#~ "beruht."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "Einrichtungswerkzeug für die Smart Common Input Method-Plattform"
+
+#~ msgid "SCIM Help"
+#~ msgstr "Hilfe zu SCIM"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Input Method"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Eingabefenster und Symbolleiste festsetzen/verschiebbar machen."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "Zeige eine kurze Hilfe zu SCIM und zur gewählten Eingabemethode."
+
+#~ msgid "Show command menu."
+#~ msgstr "Befehlsmenü anzeigen."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(c) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Einstellungen neu laden"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Werkzeugleiste festsetzen"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Symbolleiste verstecken"
+
+#~ msgid "Help ..."
+#~ msgstr "Hilfe ..."
+
+#~ msgid "Exit"
+#~ msgstr "Beenden"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "De"
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 15:30+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/src/scim_compose_key.cpp:127 ism/src/scim_imengine.cpp:659
+#: ism/src/scim_panel_agent.cpp:345 ism/src/scim_panel_agent.cpp:4334
+#: ism/src/scim_utility.cpp:701
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1740
+msgid "English/Keyboard"
+msgstr ""
+
+#. return WideString ();
+#: ism/src/scim_compose_key.cpp:146
+msgid "English input service"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:702
+msgid "Amharic"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:703
+msgid "Arabic"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:704 ism/src/scim_utility.cpp:893
+msgid "Arabic (Egypt)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:705 ism/src/scim_utility.cpp:902
+msgid "Arabic (Lebanon)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:706
+msgid "Assamese"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:707 ism/src/scim_utility.cpp:918
+msgid "Azerbaijani"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:708
+msgid "Belarusian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:709 ism/src/scim_utility.cpp:874
+msgid "Bulgarian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:710 ism/src/scim_utility.cpp:711
+#: ism/src/scim_utility.cpp:913
+msgid "Bengali"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:712
+msgid "Bengali (India)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:713
+msgid "Tibetan"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:714
+msgid "Bosnian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:715 ism/src/scim_utility.cpp:853
+msgid "Catalan"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:716 ism/src/scim_utility.cpp:863
+#: ism/src/scim_keyboard_layout_data.h:4596
+msgid "Czech"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:717 ism/src/scim_utility.cpp:923
+msgid "Welsh"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:718 ism/src/scim_utility.cpp:854
+#: ism/src/scim_keyboard_layout_data.h:4598
+msgid "Danish"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:719 ism/src/scim_keyboard_layout_data.h:4606
+msgid "German"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:720
+msgid "Divehi"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:721 ism/src/scim_utility.cpp:873
+#: ism/src/scim_keyboard_layout_data.h:4609
+msgid "Greek"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:722
+msgid "English"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:723 ism/src/scim_utility.cpp:808
+msgid "English (Australian)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:724 ism/src/scim_utility.cpp:809
+msgid "English (Canadian)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:725
+msgid "English (British)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:726
+msgid "English (Ireland)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:727
+msgid "English (American)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:728 ism/src/scim_utility.cpp:729
+#: ism/src/scim_keyboard_layout_data.h:4622
+msgid "Spanish"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:730
+msgid "Spanish (Mexico)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:731 ism/src/scim_utility.cpp:870
+#: ism/src/scim_keyboard_layout_data.h:4601
+msgid "Estonian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:732 ism/src/scim_utility.cpp:852
+msgid "Basque"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:733
+msgid "Persian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:734 ism/src/scim_utility.cpp:857
+#: ism/src/scim_keyboard_layout_data.h:4602
+msgid "Finnish"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:735 ism/src/scim_keyboard_layout_data.h:4603
+msgid "French"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:736 ism/src/scim_utility.cpp:921
+msgid "Irish"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:737 ism/src/scim_utility.cpp:919
+msgid "Galician"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:738 ism/src/scim_utility.cpp:914
+msgid "Gujarati"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:739 ism/src/scim_utility.cpp:748
+#: ism/src/scim_utility.cpp:890
+msgid "Hebrew"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:740 ism/src/scim_utility.cpp:909
+msgid "Hindi"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:741 ism/src/scim_keyboard_layout_data.h:4595
+msgid "Croatian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:742 ism/src/scim_utility.cpp:864
+#: ism/src/scim_keyboard_layout_data.h:4610
+msgid "Hungarian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:743
+msgid "Armenian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:744
+msgid "Interlingua"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:745
+msgid "Indonesian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:746 ism/src/scim_utility.cpp:856
+#: ism/src/scim_keyboard_layout_data.h:4628
+msgid "Icelandic"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:747 ism/src/scim_keyboard_layout_data.h:4611
+msgid "Italian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:749 ism/src/scim_utility.cpp:882
+#: ism/src/scim_keyboard_layout_data.h:4612
+msgid "Japanese"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:750 ism/src/scim_utility.cpp:917
+msgid "Georgian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:751 ism/src/scim_utility.cpp:875
+msgid "Kazakh"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:752
+msgid "Cambodian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:753
+msgid "Kannada"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:754 ism/src/scim_utility.cpp:883
+msgid "Korean"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:755
+msgid "Laothian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:756 ism/src/scim_utility.cpp:872
+#: ism/src/scim_keyboard_layout_data.h:4629
+msgid "Lithuanian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:757 ism/src/scim_utility.cpp:871
+msgid "Latvian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:758 ism/src/scim_utility.cpp:876
+msgid "Macedonian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:759 ism/src/scim_utility.cpp:915
+msgid "Malayalam"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:760
+msgid "Mongolian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:761 ism/src/scim_utility.cpp:911
+msgid "Marathi"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:762
+msgid "Malay"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:763
+msgid "Burmese"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:764
+msgid "Nepali"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:765 ism/src/scim_keyboard_layout_data.h:4599
+msgid "Dutch"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:766
+msgid "Norwegian (Nynorsk)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:767
+msgid "Norwegian (Bokmal)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:768
+msgid "Oriya"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:769 ism/src/scim_utility.cpp:916
+msgid "Punjabi"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:770 ism/src/scim_utility.cpp:865
+#: ism/src/scim_keyboard_layout_data.h:4614
+msgid "Polish"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:771 ism/src/scim_utility.cpp:773
+#: ism/src/scim_keyboard_layout_data.h:4615
+msgid "Portuguese"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:772 ism/src/scim_keyboard_layout_data.h:4616
+msgid "Portuguese (Brazil)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:774 ism/src/scim_utility.cpp:866
+msgid "Romanian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:775 ism/src/scim_utility.cpp:877
+#: ism/src/scim_keyboard_layout_data.h:4618
+msgid "Russian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:776 ism/src/scim_utility.cpp:922
+msgid "Sinhala"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:777 ism/src/scim_utility.cpp:868
+#: ism/src/scim_keyboard_layout_data.h:4619
+msgid "Slovak"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:778 ism/src/scim_utility.cpp:869
+#: ism/src/scim_keyboard_layout_data.h:4621
+msgid "Slovenian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:779
+msgid "Albanian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:780 ism/src/scim_utility.cpp:781
+#: ism/src/scim_utility.cpp:782
+msgid "Serbian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:783 ism/src/scim_utility.cpp:785
+#: ism/src/scim_utility.cpp:861 ism/src/scim_keyboard_layout_data.h:4625
+msgid "Swedish"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:784 ism/src/scim_utility.cpp:862
+msgid "Swedish (Finland)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:786 ism/src/scim_utility.cpp:912
+msgid "Tamil"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:787 ism/src/scim_utility.cpp:910
+msgid "Telugu"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:788 ism/src/scim_utility.cpp:889
+msgid "Thai"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:789 ism/src/scim_utility.cpp:880
+#: ism/src/scim_keyboard_layout_data.h:4626
+msgid "Turkish"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:790
+msgid "Uighur"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:791 ism/src/scim_utility.cpp:879
+#: ism/src/scim_keyboard_layout_data.h:4630
+msgid "Ukrainian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:792 ism/src/scim_utility.cpp:907
+msgid "Urdu"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:793
+msgid "Uzbek"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:794 ism/src/scim_utility.cpp:908
+msgid "Vietnamese"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:795
+msgid "Walloon"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:796 ism/src/scim_utility.cpp:797
+msgid "Yiddish"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:798
+msgid "Chinese"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:799 ism/src/scim_utility.cpp:801
+msgid "Chinese (Simplified)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:800 ism/src/scim_utility.cpp:802
+msgid "Chinese (Traditional)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:804
+msgid "Dutch (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:805
+msgid "Dutch (Belgian)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:806
+msgid "English (United States)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:807
+msgid "English (United Kingdom)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:810
+msgid "English (New Zealand)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:811
+msgid "English (Irish)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:812
+msgid "English (South Africa)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:813
+msgid "English (Jamaica)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:814
+msgid "English (Belize)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:815
+msgid "English (Trinidad)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:816
+msgid "English (Zimbabwe)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:817
+msgid "English (Philippines)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:818
+msgid "French (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:819
+msgid "French (Belgian)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:820 ism/src/scim_keyboard_layout_data.h:4604
+msgid "French (Canadian)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:821
+msgid "French (Swiss)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:822
+msgid "French (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:823
+msgid "French (Monaco)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:824
+msgid "German (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:825 ism/src/scim_keyboard_layout_data.h:4608
+msgid "German (Swiss)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:826
+msgid "German (Austrian)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:827
+msgid "German (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:828
+msgid "German (Liechtenstein)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:829
+msgid "Italian (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:830
+msgid "Italian (Swiss)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:831
+msgid "Portuguese (Brazilian)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:832
+msgid "Portuguese (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:833
+msgid "Spanish (Traditional Sort)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:834
+msgid "Spanish (Mexican)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:835
+msgid "Spanish (Guatemala)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:836
+msgid "Spanish (Costa Rica)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:837
+msgid "Spanish (Panama)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:838
+msgid "Spanish (Dominican Republic)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:839
+msgid "Spanish (Venezuela)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:840
+msgid "Spanish (Colombia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:841
+msgid "Spanish (Peru)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:842
+msgid "Spanish (Argentina)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:843
+msgid "Spanish (Ecuador)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:844
+msgid "Spanish (Chile)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:845
+msgid "Spanish (Uruguay)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:846
+msgid "Spanish (Paraguay)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:847
+msgid "Spanish (Bolivia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:848
+msgid "Spanish (El Salvador)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:849
+msgid "Spanish (Honduras)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:850
+msgid "Spanish (Nicaragua)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:851
+msgid "Spanish (Puerto Rico)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:855
+msgid "Afrikaans"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:858
+msgid "Malay (Malaysia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:859
+msgid "Malay (Brunei Darussalam)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:860 ism/src/scim_keyboard_layout_data.h:4613
+msgid "Norwegian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:867
+msgid "Serbian (Latin)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:878
+msgid "Serbian (Cyrillic)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:881
+msgid "Uzbek (Latin)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:884
+msgid "Chinese (Taiwan)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:885
+msgid "Chinese (Hong Kong)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:886
+msgid "Chinese (Macau)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:887
+msgid "Chinese (PRC)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:888
+msgid "Chinese (Singapore)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:891
+msgid "Arabic (Saudi Arabia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:892
+msgid "Arabic (Iraq)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:894
+msgid "Arabic (Libya)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:895
+msgid "Arabic (Algeria)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:896
+msgid "Arabic (Morocco)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:897
+msgid "Arabic (Tunisia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:898
+msgid "Arabic (Oman)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:899
+msgid "Arabic (Yemen)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:900
+msgid "Arabic (Syria)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:901
+msgid "Arabic (Jordan)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:903
+msgid "Arabic (Kuwait)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:904
+msgid "Arabic (UAE)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:905
+msgid "Arabic (Bahrain)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:906
+msgid "Arabic (Qatar)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:920
+msgid "Hausa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:924
+msgid "Xhosa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:925
+msgid "Yoruba"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:926
+msgid "Zulu"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:1024
+msgid "Other"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4592
+#: ism/modules/imengine/scim_socket_imengine.cpp:408
+#: ism/modules/imengine/scim_socket_imengine.cpp:438
+#: ism/modules/imengine/scim_socket_imengine.cpp:523
+#: ism/modules/imengine/scim_socket_imengine.cpp:553
+#: ism/modules/imengine/scim_socket_imengine.cpp:583
+msgid "Unknown"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4593
+msgid "English (US)"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4594
+msgid "Belgian"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4597
+msgid "Czech (qwerty)"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4600
+msgid "Dvorak"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4605
+msgid "French (Switzerland)"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4607
+msgid "German (with deadkeys)"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4617
+msgid "Portuguese (Brazil US accents)"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4620
+msgid "Slovak (qwerty)"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4623
+msgid "Spanish (CP 850)"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4624
+msgid "Spanish (Latin America)"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4627
+msgid "English (UK)"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:57
+msgid "Simplified-Traditional Chinese Conversion"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:60
+msgid "Convert between Simplified Chinese and Traditional Chinese"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:71
+msgid "SC-TC"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:73
+#: ism/modules/filter/scim_sctc_filter.cpp:78
+msgid "Simplified-Traditional Chinese conversion"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:76
+msgid "No Conversion"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:81
+msgid "Simplified to Traditional"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:83
+msgid "Convert Simplified Chinese to Traditional Chinese"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:86
+msgid "Traditional to Simplified"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:88
+msgid "Convert Traditional Chinese to Simplified Chinese"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:300
+msgid "James Su <suzhe@tsinghua.org.cn>"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:425
+#: ism/modules/filter/scim_sctc_filter.cpp:555
+#: ism/modules/filter/scim_sctc_filter.cpp:571
+msgid "SC->TC"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:431
+#: ism/modules/filter/scim_sctc_filter.cpp:559
+#: ism/modules/filter/scim_sctc_filter.cpp:575
+msgid "TC->SC"
+msgstr ""
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1693
+msgid "Smart Common Input Method platform "
+msgstr ""
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1695
+msgid ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+msgstr ""
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1700
+msgid ""
+":\n"
+"\n"
+msgstr ""
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1703
+msgid ""
+"\n"
+"\n"
+msgstr ""
+
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:963
+msgid "Enable"
+msgstr ""
+
+#. gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+#. gtk_tree_view_column_set_fixed_width (column, 232);
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:984
+msgid "Name"
+msgstr ""
+
+#: ism/utils/scimstringview.c:201
+msgid "Cursor Position"
+msgstr ""
+
+#: ism/utils/scimstringview.c:202
+msgid "The current position of the insertion cursor in chars."
+msgstr ""
+
+#: ism/utils/scimstringview.c:211
+msgid "Maximum length"
+msgstr ""
+
+#: ism/utils/scimstringview.c:212
+msgid "Maximum number of characters for this string view. Zero if no maximum."
+msgstr ""
+
+#: ism/utils/scimstringview.c:221
+msgid "Maximum width"
+msgstr ""
+
+#: ism/utils/scimstringview.c:222
+msgid "Maximum width of this string view."
+msgstr ""
+
+#: ism/utils/scimstringview.c:231
+msgid "Has Frame"
+msgstr ""
+
+#: ism/utils/scimstringview.c:232
+msgid "FALSE removes outside bevel from string view."
+msgstr ""
+
+#: ism/utils/scimstringview.c:239
+msgid "Draw cursor"
+msgstr ""
+
+#: ism/utils/scimstringview.c:240
+msgid "TRUE draw blinking cursor."
+msgstr ""
+
+#: ism/utils/scimstringview.c:247
+msgid "Auto move cursor"
+msgstr ""
+
+#: ism/utils/scimstringview.c:248
+msgid "TRUE auto move cursor position when mouse clicking."
+msgstr ""
+
+#: ism/utils/scimstringview.c:255
+msgid "Forward button press/release event"
+msgstr ""
+
+#: ism/utils/scimstringview.c:256
+msgid "TRUE forward button press/release event to user program."
+msgstr ""
+
+#: ism/utils/scimstringview.c:263
+msgid "Auto resize the widget to fit the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:264
+msgid "TRUE Auto resize on."
+msgstr ""
+
+#: ism/utils/scimstringview.c:271
+msgid "Emit move_cursor signal when press/release the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:272
+msgid "TRUE Emit move_cursor signal when press the string."
+msgstr ""
+
+#: ism/utils/scimstringview.c:279
+msgid "Width in chars"
+msgstr ""
+
+#: ism/utils/scimstringview.c:280
+msgid "Number of characters to leave space for in the string view."
+msgstr ""
+
+#: ism/utils/scimstringview.c:289
+msgid "Scroll offset"
+msgstr ""
+
+#: ism/utils/scimstringview.c:290
+msgid "Number of pixels of the string view scrolled off the screen to the left"
+msgstr ""
+
+#: ism/utils/scimstringview.c:299
+msgid "Text"
+msgstr ""
+
+#: ism/utils/scimstringview.c:300
+msgid "The contents of the string view"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:161
+msgid "Selected _Keys:"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:206
+msgid "Key Code:"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:224
+msgid "....."
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:229
+msgid "Modifiers:"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:242
+msgid "_Ctrl"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:246
+msgid "A_lt"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:250
+msgid "_Shift"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:254
+msgid "_Release"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:264
+msgid "_Meta"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:268
+msgid "S_uper"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:272
+msgid "_Hyper"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:337
+msgid "Please enter a Key Code first."
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:391
+msgid ""
+"Press a key (or a key combination).\n"
+"This dialog will be closed \n"
+"when the key is released."
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:395
+msgid "Grabbing a key."
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:686
+msgid "Key Selection"
+msgstr ""
+
+#: ism/utils/scimtrayicon.c:108
+msgid "Orientation"
+msgstr ""
+
+#: ism/utils/scimtrayicon.c:109
+msgid "The orientation of the tray."
+msgstr ""
+
+#. Normal Layout
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "NORMAL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "click to enter TEXT"
+msgstr ""
+
+#. Number Layout
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "NUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "click to enter NUMBER"
+msgstr ""
+
+#. Email Layout
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "EMAIL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "click to enter EMAIL"
+msgstr ""
+
+#. URL Layout
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "URL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "click to enter URL"
+msgstr ""
+
+#. Phonenumber Layout
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "PHONENUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "click to enter PHONENUMBER"
+msgstr ""
+
+#. IP Layout
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "IP LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "click to enter IP"
+msgstr ""
+
+#. Month Layout
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "MONTH LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "click to enter MONTH"
+msgstr ""
+
+#. Number Only Layout
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "NUMBERONLY LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "click to enter NUMBERONLY"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:220
+msgid "ise layout"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:51
+msgid "Application template"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:52
+msgid "Click to exit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:156
+msgid "Previous"
+msgstr ""
+
+#. bundle_add(ad->data, "navi_btn_left", NULL);
+#: ism/demos/isf_demo_efl.cpp:158
+msgid "Next"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:171
+msgid "Quit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:203
+msgid "isf demo"
+msgstr ""
+
+#: ism/demos/isf_entry_event_efl.cpp:151
+msgid "entry event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:220
+msgid "label event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:250
+msgid "ise event demo"
+msgstr ""
+
+#: ism/demos/isf_imcontrol_efl.cpp:375
+msgid "isfimcontrol api"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+msgid "Selection"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, c-format
+msgid "Option"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+msgid "General"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+msgid "S/W keyboard"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+msgid "Keyboard selection"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+msgid "Keyboard option"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+msgid "H/W keyboard"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+msgid "option"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+msgid "Keyboard"
+msgstr ""
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 15:30+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/src/scim_compose_key.cpp:127 ism/src/scim_imengine.cpp:659
+#: ism/src/scim_panel_agent.cpp:345 ism/src/scim_panel_agent.cpp:4334
+#: ism/src/scim_utility.cpp:701
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1740
+msgid "English/Keyboard"
+msgstr ""
+
+#. return WideString ();
+#: ism/src/scim_compose_key.cpp:146
+msgid "English input service"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:702
+msgid "Amharic"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:703
+msgid "Arabic"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:704 ism/src/scim_utility.cpp:893
+msgid "Arabic (Egypt)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:705 ism/src/scim_utility.cpp:902
+msgid "Arabic (Lebanon)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:706
+msgid "Assamese"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:707 ism/src/scim_utility.cpp:918
+msgid "Azerbaijani"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:708
+msgid "Belarusian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:709 ism/src/scim_utility.cpp:874
+msgid "Bulgarian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:710 ism/src/scim_utility.cpp:711
+#: ism/src/scim_utility.cpp:913
+msgid "Bengali"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:712
+msgid "Bengali (India)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:713
+msgid "Tibetan"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:714
+msgid "Bosnian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:715 ism/src/scim_utility.cpp:853
+msgid "Catalan"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:716 ism/src/scim_utility.cpp:863
+#: ism/src/scim_keyboard_layout_data.h:4596
+msgid "Czech"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:717 ism/src/scim_utility.cpp:923
+msgid "Welsh"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:718 ism/src/scim_utility.cpp:854
+#: ism/src/scim_keyboard_layout_data.h:4598
+msgid "Danish"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:719 ism/src/scim_keyboard_layout_data.h:4606
+msgid "German"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:720
+msgid "Divehi"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:721 ism/src/scim_utility.cpp:873
+#: ism/src/scim_keyboard_layout_data.h:4609
+msgid "Greek"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:722
+msgid "English"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:723 ism/src/scim_utility.cpp:808
+msgid "English (Australian)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:724 ism/src/scim_utility.cpp:809
+msgid "English (Canadian)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:725
+msgid "English (British)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:726
+msgid "English (Ireland)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:727
+msgid "English (American)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:728 ism/src/scim_utility.cpp:729
+#: ism/src/scim_keyboard_layout_data.h:4622
+msgid "Spanish"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:730
+msgid "Spanish (Mexico)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:731 ism/src/scim_utility.cpp:870
+#: ism/src/scim_keyboard_layout_data.h:4601
+msgid "Estonian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:732 ism/src/scim_utility.cpp:852
+msgid "Basque"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:733
+msgid "Persian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:734 ism/src/scim_utility.cpp:857
+#: ism/src/scim_keyboard_layout_data.h:4602
+msgid "Finnish"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:735 ism/src/scim_keyboard_layout_data.h:4603
+msgid "French"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:736 ism/src/scim_utility.cpp:921
+msgid "Irish"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:737 ism/src/scim_utility.cpp:919
+msgid "Galician"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:738 ism/src/scim_utility.cpp:914
+msgid "Gujarati"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:739 ism/src/scim_utility.cpp:748
+#: ism/src/scim_utility.cpp:890
+msgid "Hebrew"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:740 ism/src/scim_utility.cpp:909
+msgid "Hindi"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:741 ism/src/scim_keyboard_layout_data.h:4595
+msgid "Croatian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:742 ism/src/scim_utility.cpp:864
+#: ism/src/scim_keyboard_layout_data.h:4610
+msgid "Hungarian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:743
+msgid "Armenian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:744
+msgid "Interlingua"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:745
+msgid "Indonesian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:746 ism/src/scim_utility.cpp:856
+#: ism/src/scim_keyboard_layout_data.h:4628
+msgid "Icelandic"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:747 ism/src/scim_keyboard_layout_data.h:4611
+msgid "Italian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:749 ism/src/scim_utility.cpp:882
+#: ism/src/scim_keyboard_layout_data.h:4612
+msgid "Japanese"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:750 ism/src/scim_utility.cpp:917
+msgid "Georgian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:751 ism/src/scim_utility.cpp:875
+msgid "Kazakh"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:752
+msgid "Cambodian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:753
+msgid "Kannada"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:754 ism/src/scim_utility.cpp:883
+msgid "Korean"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:755
+msgid "Laothian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:756 ism/src/scim_utility.cpp:872
+#: ism/src/scim_keyboard_layout_data.h:4629
+msgid "Lithuanian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:757 ism/src/scim_utility.cpp:871
+msgid "Latvian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:758 ism/src/scim_utility.cpp:876
+msgid "Macedonian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:759 ism/src/scim_utility.cpp:915
+msgid "Malayalam"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:760
+msgid "Mongolian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:761 ism/src/scim_utility.cpp:911
+msgid "Marathi"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:762
+msgid "Malay"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:763
+msgid "Burmese"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:764
+msgid "Nepali"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:765 ism/src/scim_keyboard_layout_data.h:4599
+msgid "Dutch"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:766
+msgid "Norwegian (Nynorsk)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:767
+msgid "Norwegian (Bokmal)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:768
+msgid "Oriya"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:769 ism/src/scim_utility.cpp:916
+msgid "Punjabi"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:770 ism/src/scim_utility.cpp:865
+#: ism/src/scim_keyboard_layout_data.h:4614
+msgid "Polish"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:771 ism/src/scim_utility.cpp:773
+#: ism/src/scim_keyboard_layout_data.h:4615
+msgid "Portuguese"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:772 ism/src/scim_keyboard_layout_data.h:4616
+msgid "Portuguese (Brazil)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:774 ism/src/scim_utility.cpp:866
+msgid "Romanian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:775 ism/src/scim_utility.cpp:877
+#: ism/src/scim_keyboard_layout_data.h:4618
+msgid "Russian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:776 ism/src/scim_utility.cpp:922
+msgid "Sinhala"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:777 ism/src/scim_utility.cpp:868
+#: ism/src/scim_keyboard_layout_data.h:4619
+msgid "Slovak"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:778 ism/src/scim_utility.cpp:869
+#: ism/src/scim_keyboard_layout_data.h:4621
+msgid "Slovenian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:779
+msgid "Albanian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:780 ism/src/scim_utility.cpp:781
+#: ism/src/scim_utility.cpp:782
+msgid "Serbian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:783 ism/src/scim_utility.cpp:785
+#: ism/src/scim_utility.cpp:861 ism/src/scim_keyboard_layout_data.h:4625
+msgid "Swedish"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:784 ism/src/scim_utility.cpp:862
+msgid "Swedish (Finland)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:786 ism/src/scim_utility.cpp:912
+msgid "Tamil"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:787 ism/src/scim_utility.cpp:910
+msgid "Telugu"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:788 ism/src/scim_utility.cpp:889
+msgid "Thai"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:789 ism/src/scim_utility.cpp:880
+#: ism/src/scim_keyboard_layout_data.h:4626
+msgid "Turkish"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:790
+msgid "Uighur"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:791 ism/src/scim_utility.cpp:879
+#: ism/src/scim_keyboard_layout_data.h:4630
+msgid "Ukrainian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:792 ism/src/scim_utility.cpp:907
+msgid "Urdu"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:793
+msgid "Uzbek"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:794 ism/src/scim_utility.cpp:908
+msgid "Vietnamese"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:795
+msgid "Walloon"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:796 ism/src/scim_utility.cpp:797
+msgid "Yiddish"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:798
+msgid "Chinese"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:799 ism/src/scim_utility.cpp:801
+msgid "Chinese (Simplified)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:800 ism/src/scim_utility.cpp:802
+msgid "Chinese (Traditional)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:804
+msgid "Dutch (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:805
+msgid "Dutch (Belgian)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:806
+msgid "English (United States)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:807
+msgid "English (United Kingdom)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:810
+msgid "English (New Zealand)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:811
+msgid "English (Irish)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:812
+msgid "English (South Africa)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:813
+msgid "English (Jamaica)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:814
+msgid "English (Belize)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:815
+msgid "English (Trinidad)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:816
+msgid "English (Zimbabwe)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:817
+msgid "English (Philippines)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:818
+msgid "French (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:819
+msgid "French (Belgian)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:820 ism/src/scim_keyboard_layout_data.h:4604
+msgid "French (Canadian)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:821
+msgid "French (Swiss)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:822
+msgid "French (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:823
+msgid "French (Monaco)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:824
+msgid "German (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:825 ism/src/scim_keyboard_layout_data.h:4608
+msgid "German (Swiss)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:826
+msgid "German (Austrian)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:827
+msgid "German (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:828
+msgid "German (Liechtenstein)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:829
+msgid "Italian (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:830
+msgid "Italian (Swiss)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:831
+msgid "Portuguese (Brazilian)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:832
+msgid "Portuguese (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:833
+msgid "Spanish (Traditional Sort)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:834
+msgid "Spanish (Mexican)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:835
+msgid "Spanish (Guatemala)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:836
+msgid "Spanish (Costa Rica)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:837
+msgid "Spanish (Panama)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:838
+msgid "Spanish (Dominican Republic)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:839
+msgid "Spanish (Venezuela)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:840
+msgid "Spanish (Colombia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:841
+msgid "Spanish (Peru)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:842
+msgid "Spanish (Argentina)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:843
+msgid "Spanish (Ecuador)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:844
+msgid "Spanish (Chile)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:845
+msgid "Spanish (Uruguay)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:846
+msgid "Spanish (Paraguay)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:847
+msgid "Spanish (Bolivia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:848
+msgid "Spanish (El Salvador)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:849
+msgid "Spanish (Honduras)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:850
+msgid "Spanish (Nicaragua)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:851
+msgid "Spanish (Puerto Rico)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:855
+msgid "Afrikaans"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:858
+msgid "Malay (Malaysia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:859
+msgid "Malay (Brunei Darussalam)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:860 ism/src/scim_keyboard_layout_data.h:4613
+msgid "Norwegian"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:867
+msgid "Serbian (Latin)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:878
+msgid "Serbian (Cyrillic)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:881
+msgid "Uzbek (Latin)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:884
+msgid "Chinese (Taiwan)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:885
+msgid "Chinese (Hong Kong)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:886
+msgid "Chinese (Macau)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:887
+msgid "Chinese (PRC)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:888
+msgid "Chinese (Singapore)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:891
+msgid "Arabic (Saudi Arabia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:892
+msgid "Arabic (Iraq)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:894
+msgid "Arabic (Libya)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:895
+msgid "Arabic (Algeria)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:896
+msgid "Arabic (Morocco)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:897
+msgid "Arabic (Tunisia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:898
+msgid "Arabic (Oman)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:899
+msgid "Arabic (Yemen)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:900
+msgid "Arabic (Syria)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:901
+msgid "Arabic (Jordan)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:903
+msgid "Arabic (Kuwait)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:904
+msgid "Arabic (UAE)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:905
+msgid "Arabic (Bahrain)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:906
+msgid "Arabic (Qatar)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:920
+msgid "Hausa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:924
+msgid "Xhosa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:925
+msgid "Yoruba"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:926
+msgid "Zulu"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:1024
+msgid "Other"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4592
+#: ism/modules/imengine/scim_socket_imengine.cpp:408
+#: ism/modules/imengine/scim_socket_imengine.cpp:438
+#: ism/modules/imengine/scim_socket_imengine.cpp:523
+#: ism/modules/imengine/scim_socket_imengine.cpp:553
+#: ism/modules/imengine/scim_socket_imengine.cpp:583
+msgid "Unknown"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4593
+msgid "English (US)"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4594
+msgid "Belgian"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4597
+msgid "Czech (qwerty)"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4600
+msgid "Dvorak"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4605
+msgid "French (Switzerland)"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4607
+msgid "German (with deadkeys)"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4617
+msgid "Portuguese (Brazil US accents)"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4620
+msgid "Slovak (qwerty)"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4623
+msgid "Spanish (CP 850)"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4624
+msgid "Spanish (Latin America)"
+msgstr ""
+
+#: ism/src/scim_keyboard_layout_data.h:4627
+msgid "English (UK)"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:57
+msgid "Simplified-Traditional Chinese Conversion"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:60
+msgid "Convert between Simplified Chinese and Traditional Chinese"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:71
+msgid "SC-TC"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:73
+#: ism/modules/filter/scim_sctc_filter.cpp:78
+msgid "Simplified-Traditional Chinese conversion"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:76
+msgid "No Conversion"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:81
+msgid "Simplified to Traditional"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:83
+msgid "Convert Simplified Chinese to Traditional Chinese"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:86
+msgid "Traditional to Simplified"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:88
+msgid "Convert Traditional Chinese to Simplified Chinese"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:300
+msgid "James Su <suzhe@tsinghua.org.cn>"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:425
+#: ism/modules/filter/scim_sctc_filter.cpp:555
+#: ism/modules/filter/scim_sctc_filter.cpp:571
+msgid "SC->TC"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:431
+#: ism/modules/filter/scim_sctc_filter.cpp:559
+#: ism/modules/filter/scim_sctc_filter.cpp:575
+msgid "TC->SC"
+msgstr ""
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1693
+msgid "Smart Common Input Method platform "
+msgstr ""
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1695
+msgid ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+msgstr ""
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1700
+msgid ""
+":\n"
+"\n"
+msgstr ""
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1703
+msgid ""
+"\n"
+"\n"
+msgstr ""
+
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:963
+msgid "Enable"
+msgstr ""
+
+#. gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+#. gtk_tree_view_column_set_fixed_width (column, 232);
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:984
+msgid "Name"
+msgstr ""
+
+#: ism/utils/scimstringview.c:201
+msgid "Cursor Position"
+msgstr ""
+
+#: ism/utils/scimstringview.c:202
+msgid "The current position of the insertion cursor in chars."
+msgstr ""
+
+#: ism/utils/scimstringview.c:211
+msgid "Maximum length"
+msgstr ""
+
+#: ism/utils/scimstringview.c:212
+msgid "Maximum number of characters for this string view. Zero if no maximum."
+msgstr ""
+
+#: ism/utils/scimstringview.c:221
+msgid "Maximum width"
+msgstr ""
+
+#: ism/utils/scimstringview.c:222
+msgid "Maximum width of this string view."
+msgstr ""
+
+#: ism/utils/scimstringview.c:231
+msgid "Has Frame"
+msgstr ""
+
+#: ism/utils/scimstringview.c:232
+msgid "FALSE removes outside bevel from string view."
+msgstr ""
+
+#: ism/utils/scimstringview.c:239
+msgid "Draw cursor"
+msgstr ""
+
+#: ism/utils/scimstringview.c:240
+msgid "TRUE draw blinking cursor."
+msgstr ""
+
+#: ism/utils/scimstringview.c:247
+msgid "Auto move cursor"
+msgstr ""
+
+#: ism/utils/scimstringview.c:248
+msgid "TRUE auto move cursor position when mouse clicking."
+msgstr ""
+
+#: ism/utils/scimstringview.c:255
+msgid "Forward button press/release event"
+msgstr ""
+
+#: ism/utils/scimstringview.c:256
+msgid "TRUE forward button press/release event to user program."
+msgstr ""
+
+#: ism/utils/scimstringview.c:263
+msgid "Auto resize the widget to fit the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:264
+msgid "TRUE Auto resize on."
+msgstr ""
+
+#: ism/utils/scimstringview.c:271
+msgid "Emit move_cursor signal when press/release the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:272
+msgid "TRUE Emit move_cursor signal when press the string."
+msgstr ""
+
+#: ism/utils/scimstringview.c:279
+msgid "Width in chars"
+msgstr ""
+
+#: ism/utils/scimstringview.c:280
+msgid "Number of characters to leave space for in the string view."
+msgstr ""
+
+#: ism/utils/scimstringview.c:289
+msgid "Scroll offset"
+msgstr ""
+
+#: ism/utils/scimstringview.c:290
+msgid "Number of pixels of the string view scrolled off the screen to the left"
+msgstr ""
+
+#: ism/utils/scimstringview.c:299
+msgid "Text"
+msgstr ""
+
+#: ism/utils/scimstringview.c:300
+msgid "The contents of the string view"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:161
+msgid "Selected _Keys:"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:206
+msgid "Key Code:"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:224
+msgid "....."
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:229
+msgid "Modifiers:"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:242
+msgid "_Ctrl"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:246
+msgid "A_lt"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:250
+msgid "_Shift"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:254
+msgid "_Release"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:264
+msgid "_Meta"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:268
+msgid "S_uper"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:272
+msgid "_Hyper"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:337
+msgid "Please enter a Key Code first."
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:391
+msgid ""
+"Press a key (or a key combination).\n"
+"This dialog will be closed \n"
+"when the key is released."
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:395
+msgid "Grabbing a key."
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:686
+msgid "Key Selection"
+msgstr ""
+
+#: ism/utils/scimtrayicon.c:108
+msgid "Orientation"
+msgstr ""
+
+#: ism/utils/scimtrayicon.c:109
+msgid "The orientation of the tray."
+msgstr ""
+
+#. Normal Layout
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "NORMAL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "click to enter TEXT"
+msgstr ""
+
+#. Number Layout
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "NUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "click to enter NUMBER"
+msgstr ""
+
+#. Email Layout
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "EMAIL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "click to enter EMAIL"
+msgstr ""
+
+#. URL Layout
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "URL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "click to enter URL"
+msgstr ""
+
+#. Phonenumber Layout
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "PHONENUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "click to enter PHONENUMBER"
+msgstr ""
+
+#. IP Layout
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "IP LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "click to enter IP"
+msgstr ""
+
+#. Month Layout
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "MONTH LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "click to enter MONTH"
+msgstr ""
+
+#. Number Only Layout
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "NUMBERONLY LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "click to enter NUMBERONLY"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:220
+msgid "ise layout"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:51
+msgid "Application template"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:52
+msgid "Click to exit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:156
+msgid "Previous"
+msgstr ""
+
+#. bundle_add(ad->data, "navi_btn_left", NULL);
+#: ism/demos/isf_demo_efl.cpp:158
+msgid "Next"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:171
+msgid "Quit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:203
+msgid "isf demo"
+msgstr ""
+
+#: ism/demos/isf_entry_event_efl.cpp:151
+msgid "entry event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:220
+msgid "label event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:250
+msgid "ise event demo"
+msgstr ""
+
+#: ism/demos/isf_imcontrol_efl.cpp:375
+msgid "isfimcontrol api"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+msgid "Selection"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, c-format
+msgid "Option"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+msgid "General"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+msgid "S/W keyboard"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+msgid "Keyboard selection"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+msgid "Keyboard option"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+msgid "H/W keyboard"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+msgid "option"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+msgid "Keyboard"
+msgstr ""
--- /dev/null
+# Finnish translation for scim
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the scim package.
+# Timo Jyrinki <timo.jyrinki@iki.fi>, 2006.
+# note: GFTT is at http://www.gnome.fi/
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: scim\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 15:30+0900\n"
+"PO-Revision-Date: 2006-05-24 16:51+0000\n"
+"Last-Translator: Timo Jyrinki <timo.jyrinki@iki.fi>\n"
+"Language-Team: Finnish <gnome-fi-laatu@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/src/scim_compose_key.cpp:127 ism/src/scim_imengine.cpp:659
+#: ism/src/scim_panel_agent.cpp:345 ism/src/scim_panel_agent.cpp:4334
+#: ism/src/scim_utility.cpp:701
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1740
+msgid "English/Keyboard"
+msgstr "englanti/näppäimistö"
+
+#. return WideString ();
+#: ism/src/scim_compose_key.cpp:146
+#, fuzzy
+msgid "English input service"
+msgstr "englanti (amerikanenglanti)"
+
+#: ism/src/scim_utility.cpp:702
+msgid "Amharic"
+msgstr "amhara"
+
+#: ism/src/scim_utility.cpp:703
+msgid "Arabic"
+msgstr "arabia"
+
+#: ism/src/scim_utility.cpp:704 ism/src/scim_utility.cpp:893
+msgid "Arabic (Egypt)"
+msgstr "arabia (Egypti)"
+
+#: ism/src/scim_utility.cpp:705 ism/src/scim_utility.cpp:902
+msgid "Arabic (Lebanon)"
+msgstr "arabia (Libanon)"
+
+#: ism/src/scim_utility.cpp:706
+msgid "Assamese"
+msgstr "assami"
+
+#: ism/src/scim_utility.cpp:707 ism/src/scim_utility.cpp:918
+msgid "Azerbaijani"
+msgstr "azeri"
+
+#: ism/src/scim_utility.cpp:708
+msgid "Belarusian"
+msgstr "valkovenäjä"
+
+#: ism/src/scim_utility.cpp:709 ism/src/scim_utility.cpp:874
+msgid "Bulgarian"
+msgstr "bulgaria"
+
+#: ism/src/scim_utility.cpp:710 ism/src/scim_utility.cpp:711
+#: ism/src/scim_utility.cpp:913
+msgid "Bengali"
+msgstr "bengali"
+
+#: ism/src/scim_utility.cpp:712
+msgid "Bengali (India)"
+msgstr "bengali (Intia)"
+
+#: ism/src/scim_utility.cpp:713
+msgid "Tibetan"
+msgstr "tiibetti"
+
+#: ism/src/scim_utility.cpp:714
+msgid "Bosnian"
+msgstr "bosnia"
+
+#: ism/src/scim_utility.cpp:715 ism/src/scim_utility.cpp:853
+msgid "Catalan"
+msgstr "katalaani"
+
+#: ism/src/scim_utility.cpp:716 ism/src/scim_utility.cpp:863
+#: ism/src/scim_keyboard_layout_data.h:4596
+msgid "Czech"
+msgstr "tšekki"
+
+#: ism/src/scim_utility.cpp:717 ism/src/scim_utility.cpp:923
+msgid "Welsh"
+msgstr "wales"
+
+#: ism/src/scim_utility.cpp:718 ism/src/scim_utility.cpp:854
+#: ism/src/scim_keyboard_layout_data.h:4598
+msgid "Danish"
+msgstr "tanska"
+
+#: ism/src/scim_utility.cpp:719 ism/src/scim_keyboard_layout_data.h:4606
+msgid "German"
+msgstr "saksa"
+
+#: ism/src/scim_utility.cpp:720
+msgid "Divehi"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:721 ism/src/scim_utility.cpp:873
+#: ism/src/scim_keyboard_layout_data.h:4609
+msgid "Greek"
+msgstr "kreikka"
+
+#: ism/src/scim_utility.cpp:722
+msgid "English"
+msgstr "englanti"
+
+#: ism/src/scim_utility.cpp:723 ism/src/scim_utility.cpp:808
+msgid "English (Australian)"
+msgstr "englanti (Australia)"
+
+#: ism/src/scim_utility.cpp:724 ism/src/scim_utility.cpp:809
+msgid "English (Canadian)"
+msgstr "englanti (Kanada)"
+
+#: ism/src/scim_utility.cpp:725
+msgid "English (British)"
+msgstr "englanti (Iso-Britannia)"
+
+#: ism/src/scim_utility.cpp:726
+msgid "English (Ireland)"
+msgstr "englanti (Irlanti)"
+
+#: ism/src/scim_utility.cpp:727
+msgid "English (American)"
+msgstr "englanti (amerikanenglanti)"
+
+#: ism/src/scim_utility.cpp:728 ism/src/scim_utility.cpp:729
+#: ism/src/scim_keyboard_layout_data.h:4622
+msgid "Spanish"
+msgstr "espanja"
+
+#: ism/src/scim_utility.cpp:730
+msgid "Spanish (Mexico)"
+msgstr "espanja (Mexico)"
+
+#: ism/src/scim_utility.cpp:731 ism/src/scim_utility.cpp:870
+#: ism/src/scim_keyboard_layout_data.h:4601
+msgid "Estonian"
+msgstr "viro"
+
+#: ism/src/scim_utility.cpp:732 ism/src/scim_utility.cpp:852
+msgid "Basque"
+msgstr "baski"
+
+#: ism/src/scim_utility.cpp:733
+msgid "Persian"
+msgstr "persia"
+
+#: ism/src/scim_utility.cpp:734 ism/src/scim_utility.cpp:857
+#: ism/src/scim_keyboard_layout_data.h:4602
+msgid "Finnish"
+msgstr "suomi"
+
+#: ism/src/scim_utility.cpp:735 ism/src/scim_keyboard_layout_data.h:4603
+msgid "French"
+msgstr "ranska"
+
+#: ism/src/scim_utility.cpp:736 ism/src/scim_utility.cpp:921
+msgid "Irish"
+msgstr "irlanti"
+
+#: ism/src/scim_utility.cpp:737 ism/src/scim_utility.cpp:919
+msgid "Galician"
+msgstr "galicia"
+
+#: ism/src/scim_utility.cpp:738 ism/src/scim_utility.cpp:914
+msgid "Gujarati"
+msgstr "gudžarati"
+
+#: ism/src/scim_utility.cpp:739 ism/src/scim_utility.cpp:748
+#: ism/src/scim_utility.cpp:890
+msgid "Hebrew"
+msgstr "heprea"
+
+#: ism/src/scim_utility.cpp:740 ism/src/scim_utility.cpp:909
+msgid "Hindi"
+msgstr "hindi"
+
+#: ism/src/scim_utility.cpp:741 ism/src/scim_keyboard_layout_data.h:4595
+msgid "Croatian"
+msgstr "kroatia"
+
+#: ism/src/scim_utility.cpp:742 ism/src/scim_utility.cpp:864
+#: ism/src/scim_keyboard_layout_data.h:4610
+msgid "Hungarian"
+msgstr "unkari"
+
+#: ism/src/scim_utility.cpp:743
+#, fuzzy
+msgid "Armenian"
+msgstr "romania"
+
+#: ism/src/scim_utility.cpp:744
+msgid "Interlingua"
+msgstr "interlingua"
+
+#: ism/src/scim_utility.cpp:745
+msgid "Indonesian"
+msgstr "indonesia"
+
+#: ism/src/scim_utility.cpp:746 ism/src/scim_utility.cpp:856
+#: ism/src/scim_keyboard_layout_data.h:4628
+msgid "Icelandic"
+msgstr "islanti"
+
+#: ism/src/scim_utility.cpp:747 ism/src/scim_keyboard_layout_data.h:4611
+msgid "Italian"
+msgstr "italia"
+
+#: ism/src/scim_utility.cpp:749 ism/src/scim_utility.cpp:882
+#: ism/src/scim_keyboard_layout_data.h:4612
+msgid "Japanese"
+msgstr "japani"
+
+#: ism/src/scim_utility.cpp:750 ism/src/scim_utility.cpp:917
+#, fuzzy
+msgid "Georgian"
+msgstr "saksa"
+
+#: ism/src/scim_utility.cpp:751 ism/src/scim_utility.cpp:875
+msgid "Kazakh"
+msgstr "kazak"
+
+#: ism/src/scim_utility.cpp:752
+msgid "Cambodian"
+msgstr "kampodia/khmer"
+
+#: ism/src/scim_utility.cpp:753
+msgid "Kannada"
+msgstr "kannada"
+
+#: ism/src/scim_utility.cpp:754 ism/src/scim_utility.cpp:883
+msgid "Korean"
+msgstr "korea"
+
+#: ism/src/scim_utility.cpp:755
+msgid "Laothian"
+msgstr "laos"
+
+#: ism/src/scim_utility.cpp:756 ism/src/scim_utility.cpp:872
+#: ism/src/scim_keyboard_layout_data.h:4629
+msgid "Lithuanian"
+msgstr "liettua"
+
+#: ism/src/scim_utility.cpp:757 ism/src/scim_utility.cpp:871
+msgid "Latvian"
+msgstr "latvia"
+
+#: ism/src/scim_utility.cpp:758 ism/src/scim_utility.cpp:876
+msgid "Macedonian"
+msgstr "makedonia"
+
+#: ism/src/scim_utility.cpp:759 ism/src/scim_utility.cpp:915
+msgid "Malayalam"
+msgstr "malajalam"
+
+#: ism/src/scim_utility.cpp:760
+msgid "Mongolian"
+msgstr "mongolia"
+
+#: ism/src/scim_utility.cpp:761 ism/src/scim_utility.cpp:911
+msgid "Marathi"
+msgstr "marathi"
+
+#: ism/src/scim_utility.cpp:762
+msgid "Malay"
+msgstr "malaiji"
+
+#: ism/src/scim_utility.cpp:763
+msgid "Burmese"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:764
+msgid "Nepali"
+msgstr "nepali"
+
+#: ism/src/scim_utility.cpp:765 ism/src/scim_keyboard_layout_data.h:4599
+msgid "Dutch"
+msgstr "hollanti"
+
+#: ism/src/scim_utility.cpp:766
+#, fuzzy
+msgid "Norwegian (Nynorsk)"
+msgstr "norja (nykynorja)"
+
+#: ism/src/scim_utility.cpp:767
+#, fuzzy
+msgid "Norwegian (Bokmal)"
+msgstr "norja (kirjanorja)"
+
+#: ism/src/scim_utility.cpp:768
+msgid "Oriya"
+msgstr "oriya"
+
+#: ism/src/scim_utility.cpp:769 ism/src/scim_utility.cpp:916
+#, fuzzy
+msgid "Punjabi"
+msgstr "panjabi"
+
+#: ism/src/scim_utility.cpp:770 ism/src/scim_utility.cpp:865
+#: ism/src/scim_keyboard_layout_data.h:4614
+msgid "Polish"
+msgstr "puola"
+
+#: ism/src/scim_utility.cpp:771 ism/src/scim_utility.cpp:773
+#: ism/src/scim_keyboard_layout_data.h:4615
+msgid "Portuguese"
+msgstr "portugali"
+
+#: ism/src/scim_utility.cpp:772 ism/src/scim_keyboard_layout_data.h:4616
+msgid "Portuguese (Brazil)"
+msgstr "portugali (Brasilia)"
+
+#: ism/src/scim_utility.cpp:774 ism/src/scim_utility.cpp:866
+msgid "Romanian"
+msgstr "romania"
+
+#: ism/src/scim_utility.cpp:775 ism/src/scim_utility.cpp:877
+#: ism/src/scim_keyboard_layout_data.h:4618
+msgid "Russian"
+msgstr "venäjä"
+
+#: ism/src/scim_utility.cpp:776 ism/src/scim_utility.cpp:922
+msgid "Sinhala"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:777 ism/src/scim_utility.cpp:868
+#: ism/src/scim_keyboard_layout_data.h:4619
+msgid "Slovak"
+msgstr "slovakki"
+
+#: ism/src/scim_utility.cpp:778 ism/src/scim_utility.cpp:869
+#: ism/src/scim_keyboard_layout_data.h:4621
+msgid "Slovenian"
+msgstr "sloveeni"
+
+#: ism/src/scim_utility.cpp:779
+msgid "Albanian"
+msgstr "albania"
+
+#: ism/src/scim_utility.cpp:780 ism/src/scim_utility.cpp:781
+#: ism/src/scim_utility.cpp:782
+msgid "Serbian"
+msgstr "serbia"
+
+#: ism/src/scim_utility.cpp:783 ism/src/scim_utility.cpp:785
+#: ism/src/scim_utility.cpp:861 ism/src/scim_keyboard_layout_data.h:4625
+msgid "Swedish"
+msgstr "ruotsi"
+
+#: ism/src/scim_utility.cpp:784 ism/src/scim_utility.cpp:862
+msgid "Swedish (Finland)"
+msgstr "ruotsi (Suomi)"
+
+#: ism/src/scim_utility.cpp:786 ism/src/scim_utility.cpp:912
+msgid "Tamil"
+msgstr "tamili"
+
+#: ism/src/scim_utility.cpp:787 ism/src/scim_utility.cpp:910
+msgid "Telugu"
+msgstr "telugu"
+
+#: ism/src/scim_utility.cpp:788 ism/src/scim_utility.cpp:889
+msgid "Thai"
+msgstr "thai"
+
+#: ism/src/scim_utility.cpp:789 ism/src/scim_utility.cpp:880
+#: ism/src/scim_keyboard_layout_data.h:4626
+msgid "Turkish"
+msgstr "turkki"
+
+#: ism/src/scim_utility.cpp:790
+msgid "Uighur"
+msgstr "uiguuri"
+
+#: ism/src/scim_utility.cpp:791 ism/src/scim_utility.cpp:879
+#: ism/src/scim_keyboard_layout_data.h:4630
+msgid "Ukrainian"
+msgstr "ukraina"
+
+#: ism/src/scim_utility.cpp:792 ism/src/scim_utility.cpp:907
+msgid "Urdu"
+msgstr "urdu"
+
+#: ism/src/scim_utility.cpp:793
+msgid "Uzbek"
+msgstr "uzbekki"
+
+#: ism/src/scim_utility.cpp:794 ism/src/scim_utility.cpp:908
+msgid "Vietnamese"
+msgstr "vietnam"
+
+#: ism/src/scim_utility.cpp:795
+msgid "Walloon"
+msgstr "valloni"
+
+#: ism/src/scim_utility.cpp:796 ism/src/scim_utility.cpp:797
+msgid "Yiddish"
+msgstr "jiddiš"
+
+#: ism/src/scim_utility.cpp:798
+msgid "Chinese"
+msgstr "kiina"
+
+#: ism/src/scim_utility.cpp:799 ism/src/scim_utility.cpp:801
+#, fuzzy
+msgid "Chinese (Simplified)"
+msgstr "kiina (yksinkertaistettu)"
+
+#: ism/src/scim_utility.cpp:800 ism/src/scim_utility.cpp:802
+#, fuzzy
+msgid "Chinese (Traditional)"
+msgstr "kiina (perinteinen)"
+
+#: ism/src/scim_utility.cpp:804
+msgid "Dutch (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:805
+#, fuzzy
+msgid "Dutch (Belgian)"
+msgstr "belgia"
+
+#: ism/src/scim_utility.cpp:806
+#, fuzzy
+msgid "English (United States)"
+msgstr "englanti (USA)"
+
+#: ism/src/scim_utility.cpp:807
+#, fuzzy
+msgid "English (United Kingdom)"
+msgstr "englanti (Kanada)"
+
+#: ism/src/scim_utility.cpp:810
+#, fuzzy
+msgid "English (New Zealand)"
+msgstr "englanti (Irlanti)"
+
+#: ism/src/scim_utility.cpp:811
+#, fuzzy
+msgid "English (Irish)"
+msgstr "englanti (Iso-Britannia)"
+
+#: ism/src/scim_utility.cpp:812
+#, fuzzy
+msgid "English (South Africa)"
+msgstr "englanti (amerikanenglanti)"
+
+#: ism/src/scim_utility.cpp:813
+#, fuzzy
+msgid "English (Jamaica)"
+msgstr "englanti (Kanada)"
+
+#: ism/src/scim_utility.cpp:814
+#, fuzzy
+msgid "English (Belize)"
+msgstr "englanti (Iso-Britannia)"
+
+#: ism/src/scim_utility.cpp:815
+#, fuzzy
+msgid "English (Trinidad)"
+msgstr "englanti (Iso-Britannia)"
+
+#: ism/src/scim_utility.cpp:816
+#, fuzzy
+msgid "English (Zimbabwe)"
+msgstr "englanti (Kanada)"
+
+#: ism/src/scim_utility.cpp:817
+#, fuzzy
+msgid "English (Philippines)"
+msgstr "englanti (Iso-Britannia)"
+
+#: ism/src/scim_utility.cpp:818
+#, fuzzy
+msgid "French (Standard)"
+msgstr "Ranska (Kanada)"
+
+#: ism/src/scim_utility.cpp:819
+#, fuzzy
+msgid "French (Belgian)"
+msgstr "Ranska (Kanada)"
+
+#: ism/src/scim_utility.cpp:820 ism/src/scim_keyboard_layout_data.h:4604
+msgid "French (Canadian)"
+msgstr "Ranska (Kanada)"
+
+#: ism/src/scim_utility.cpp:821
+#, fuzzy
+msgid "French (Swiss)"
+msgstr "Saksa (sveitsiläinen)"
+
+#: ism/src/scim_utility.cpp:822
+msgid "French (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:823
+#, fuzzy
+msgid "French (Monaco)"
+msgstr "Ranska (Kanada)"
+
+#: ism/src/scim_utility.cpp:824
+#, fuzzy
+msgid "German (Standard)"
+msgstr "Saksa (kuolleilla näppäimillä)"
+
+#: ism/src/scim_utility.cpp:825 ism/src/scim_keyboard_layout_data.h:4608
+msgid "German (Swiss)"
+msgstr "Saksa (sveitsiläinen)"
+
+#: ism/src/scim_utility.cpp:826
+#, fuzzy
+msgid "German (Austrian)"
+msgstr "englanti (Australia)"
+
+#: ism/src/scim_utility.cpp:827
+msgid "German (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:828
+#, fuzzy
+msgid "German (Liechtenstein)"
+msgstr "Saksa (sveitsiläinen)"
+
+#: ism/src/scim_utility.cpp:829
+msgid "Italian (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:830
+#, fuzzy
+msgid "Italian (Swiss)"
+msgstr "Saksa (sveitsiläinen)"
+
+#: ism/src/scim_utility.cpp:831
+#, fuzzy
+msgid "Portuguese (Brazilian)"
+msgstr "portugali (Brasilia)"
+
+#: ism/src/scim_utility.cpp:832
+#, fuzzy
+msgid "Portuguese (Standard)"
+msgstr "portugali (Brasilia)"
+
+#: ism/src/scim_utility.cpp:833
+#, fuzzy
+msgid "Spanish (Traditional Sort)"
+msgstr "espanja (latinalainen amerikka)"
+
+#: ism/src/scim_utility.cpp:834
+#, fuzzy
+msgid "Spanish (Mexican)"
+msgstr "espanja (Mexico)"
+
+#: ism/src/scim_utility.cpp:835
+#, fuzzy
+msgid "Spanish (Guatemala)"
+msgstr "espanja (latinalainen amerikka)"
+
+#: ism/src/scim_utility.cpp:836
+#, fuzzy
+msgid "Spanish (Costa Rica)"
+msgstr "espanja (latinalainen amerikka)"
+
+#: ism/src/scim_utility.cpp:837
+#, fuzzy
+msgid "Spanish (Panama)"
+msgstr "espanja (latinalainen amerikka)"
+
+#: ism/src/scim_utility.cpp:838
+#, fuzzy
+msgid "Spanish (Dominican Republic)"
+msgstr "espanja (latinalainen amerikka)"
+
+#: ism/src/scim_utility.cpp:839
+#, fuzzy
+msgid "Spanish (Venezuela)"
+msgstr "espanja (Mexico)"
+
+#: ism/src/scim_utility.cpp:840
+#, fuzzy
+msgid "Spanish (Colombia)"
+msgstr "espanja (Mexico)"
+
+#: ism/src/scim_utility.cpp:841
+#, fuzzy
+msgid "Spanish (Peru)"
+msgstr "espanja (Mexico)"
+
+#: ism/src/scim_utility.cpp:842
+#, fuzzy
+msgid "Spanish (Argentina)"
+msgstr "espanja (Mexico)"
+
+#: ism/src/scim_utility.cpp:843
+#, fuzzy
+msgid "Spanish (Ecuador)"
+msgstr "espanja (Mexico)"
+
+#: ism/src/scim_utility.cpp:844
+#, fuzzy
+msgid "Spanish (Chile)"
+msgstr "espanja (Mexico)"
+
+#: ism/src/scim_utility.cpp:845
+#, fuzzy
+msgid "Spanish (Uruguay)"
+msgstr "espanja (Mexico)"
+
+#: ism/src/scim_utility.cpp:846
+#, fuzzy
+msgid "Spanish (Paraguay)"
+msgstr "espanja (CP 850)"
+
+#: ism/src/scim_utility.cpp:847
+#, fuzzy
+msgid "Spanish (Bolivia)"
+msgstr "espanja (Mexico)"
+
+#: ism/src/scim_utility.cpp:848
+msgid "Spanish (El Salvador)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:849
+#, fuzzy
+msgid "Spanish (Honduras)"
+msgstr "espanja (Mexico)"
+
+#: ism/src/scim_utility.cpp:850
+#, fuzzy
+msgid "Spanish (Nicaragua)"
+msgstr "espanja (Mexico)"
+
+#: ism/src/scim_utility.cpp:851
+#, fuzzy
+msgid "Spanish (Puerto Rico)"
+msgstr "espanja (Mexico)"
+
+#: ism/src/scim_utility.cpp:855
+msgid "Afrikaans"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:858
+#, fuzzy
+msgid "Malay (Malaysia)"
+msgstr "malajalam"
+
+#: ism/src/scim_utility.cpp:859
+msgid "Malay (Brunei Darussalam)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:860 ism/src/scim_keyboard_layout_data.h:4613
+msgid "Norwegian"
+msgstr "norja"
+
+#: ism/src/scim_utility.cpp:867
+#, fuzzy
+msgid "Serbian (Latin)"
+msgstr "serbia"
+
+#: ism/src/scim_utility.cpp:878
+msgid "Serbian (Cyrillic)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:881
+msgid "Uzbek (Latin)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:884
+#, fuzzy
+msgid "Chinese (Taiwan)"
+msgstr "kiina (perinteinen)"
+
+#: ism/src/scim_utility.cpp:885
+#, fuzzy
+msgid "Chinese (Hong Kong)"
+msgstr "kiina (perinteinen)"
+
+#: ism/src/scim_utility.cpp:886
+#, fuzzy
+msgid "Chinese (Macau)"
+msgstr "kiina (perinteinen)"
+
+#: ism/src/scim_utility.cpp:887
+#, fuzzy
+msgid "Chinese (PRC)"
+msgstr "kiina"
+
+#: ism/src/scim_utility.cpp:888
+#, fuzzy
+msgid "Chinese (Singapore)"
+msgstr "kiina (yksinkertaistettu)"
+
+#: ism/src/scim_utility.cpp:891
+msgid "Arabic (Saudi Arabia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:892
+#, fuzzy
+msgid "Arabic (Iraq)"
+msgstr "arabia (Libanon)"
+
+#: ism/src/scim_utility.cpp:894
+#, fuzzy
+msgid "Arabic (Libya)"
+msgstr "arabia (Libanon)"
+
+#: ism/src/scim_utility.cpp:895
+#, fuzzy
+msgid "Arabic (Algeria)"
+msgstr "arabia (Libanon)"
+
+#: ism/src/scim_utility.cpp:896
+#, fuzzy
+msgid "Arabic (Morocco)"
+msgstr "arabia (Libanon)"
+
+#: ism/src/scim_utility.cpp:897
+#, fuzzy
+msgid "Arabic (Tunisia)"
+msgstr "arabia (Libanon)"
+
+#: ism/src/scim_utility.cpp:898
+#, fuzzy
+msgid "Arabic (Oman)"
+msgstr "arabia (Libanon)"
+
+#: ism/src/scim_utility.cpp:899
+#, fuzzy
+msgid "Arabic (Yemen)"
+msgstr "arabia (Libanon)"
+
+#: ism/src/scim_utility.cpp:900
+#, fuzzy
+msgid "Arabic (Syria)"
+msgstr "arabia (Egypti)"
+
+#: ism/src/scim_utility.cpp:901
+#, fuzzy
+msgid "Arabic (Jordan)"
+msgstr "arabia (Libanon)"
+
+#: ism/src/scim_utility.cpp:903
+#, fuzzy
+msgid "Arabic (Kuwait)"
+msgstr "arabia (Egypti)"
+
+#: ism/src/scim_utility.cpp:904
+#, fuzzy
+msgid "Arabic (UAE)"
+msgstr "arabia (Egypti)"
+
+#: ism/src/scim_utility.cpp:905
+#, fuzzy
+msgid "Arabic (Bahrain)"
+msgstr "arabia (Libanon)"
+
+#: ism/src/scim_utility.cpp:906
+#, fuzzy
+msgid "Arabic (Qatar)"
+msgstr "arabia (Egypti)"
+
+#: ism/src/scim_utility.cpp:920
+msgid "Hausa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:924
+msgid "Xhosa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:925
+msgid "Yoruba"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:926
+msgid "Zulu"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:1024
+msgid "Other"
+msgstr "Muu"
+
+#: ism/src/scim_keyboard_layout_data.h:4592
+#: ism/modules/imengine/scim_socket_imengine.cpp:408
+#: ism/modules/imengine/scim_socket_imengine.cpp:438
+#: ism/modules/imengine/scim_socket_imengine.cpp:523
+#: ism/modules/imengine/scim_socket_imengine.cpp:553
+#: ism/modules/imengine/scim_socket_imengine.cpp:583
+msgid "Unknown"
+msgstr "Tuntematon"
+
+#: ism/src/scim_keyboard_layout_data.h:4593
+msgid "English (US)"
+msgstr "englanti (USA)"
+
+#: ism/src/scim_keyboard_layout_data.h:4594
+msgid "Belgian"
+msgstr "belgia"
+
+#: ism/src/scim_keyboard_layout_data.h:4597
+msgid "Czech (qwerty)"
+msgstr "tšekki (qwerty)"
+
+#: ism/src/scim_keyboard_layout_data.h:4600
+msgid "Dvorak"
+msgstr "Dvorak"
+
+#: ism/src/scim_keyboard_layout_data.h:4605
+msgid "French (Switzerland)"
+msgstr "Ranska (Sveitsi)"
+
+#: ism/src/scim_keyboard_layout_data.h:4607
+msgid "German (with deadkeys)"
+msgstr "Saksa (kuolleilla näppäimillä)"
+
+#: ism/src/scim_keyboard_layout_data.h:4617
+msgid "Portuguese (Brazil US accents)"
+msgstr "portugali (Brasilia/US-aksenttimerkit)"
+
+#: ism/src/scim_keyboard_layout_data.h:4620
+msgid "Slovak (qwerty)"
+msgstr "slovakia (qwerty)"
+
+#: ism/src/scim_keyboard_layout_data.h:4623
+msgid "Spanish (CP 850)"
+msgstr "espanja (CP 850)"
+
+#: ism/src/scim_keyboard_layout_data.h:4624
+msgid "Spanish (Latin America)"
+msgstr "espanja (latinalainen amerikka)"
+
+#: ism/src/scim_keyboard_layout_data.h:4627
+msgid "English (UK)"
+msgstr "englanti (Iso-Britannia)"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:57
+msgid "Simplified-Traditional Chinese Conversion"
+msgstr "Yksinkertaistetun/perinteisen kiinan muunnos"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:60
+msgid "Convert between Simplified Chinese and Traditional Chinese"
+msgstr "Muunna yksinkertaistetun ja perinteisen kiinan välillä"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:71
+msgid "SC-TC"
+msgstr "yk-pk"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:73
+#: ism/modules/filter/scim_sctc_filter.cpp:78
+msgid "Simplified-Traditional Chinese conversion"
+msgstr "Yksinkertaistetun/perinteisen kiinan muunnos"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:76
+msgid "No Conversion"
+msgstr "Ei muunnosta"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:81
+msgid "Simplified to Traditional"
+msgstr "Yksinkertaistetusta perinteiseksi"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:83
+msgid "Convert Simplified Chinese to Traditional Chinese"
+msgstr "Muunna yksinkertaistettu kiina perinteiseksi kiinaksi"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:86
+msgid "Traditional to Simplified"
+msgstr "Perinteisestä yksinkertaistetuksi"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:88
+msgid "Convert Traditional Chinese to Simplified Chinese"
+msgstr "Muunna perinteisestä kiinasta yksinkertaistetuksi kiinaksi"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:300
+msgid "James Su <suzhe@tsinghua.org.cn>"
+msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:425
+#: ism/modules/filter/scim_sctc_filter.cpp:555
+#: ism/modules/filter/scim_sctc_filter.cpp:571
+msgid "SC->TC"
+msgstr "yk->pk"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:431
+#: ism/modules/filter/scim_sctc_filter.cpp:559
+#: ism/modules/filter/scim_sctc_filter.cpp:575
+msgid "TC->SC"
+msgstr "pk->yk"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1693
+msgid "Smart Common Input Method platform "
+msgstr "Smart Common Input Method -alusta "
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1695
+msgid ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+msgstr ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1700
+msgid ""
+":\n"
+"\n"
+msgstr ""
+":\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1703
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:963
+msgid "Enable"
+msgstr "Ota käyttöön"
+
+#. gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+#. gtk_tree_view_column_set_fixed_width (column, 232);
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:984
+msgid "Name"
+msgstr "Nimi"
+
+#: ism/utils/scimstringview.c:201
+msgid "Cursor Position"
+msgstr "Kohdistimen paikka"
+
+#: ism/utils/scimstringview.c:202
+msgid "The current position of the insertion cursor in chars."
+msgstr "Syöttökohdistimen nykyinen paikka merkeissä."
+
+#: ism/utils/scimstringview.c:211
+msgid "Maximum length"
+msgstr "Suurin pituus"
+
+#: ism/utils/scimstringview.c:212
+msgid "Maximum number of characters for this string view. Zero if no maximum."
+msgstr "Suurin määrä merkkejä tälle merkkijononäytölle. Nolla, jos ei aseteta."
+
+#: ism/utils/scimstringview.c:221
+msgid "Maximum width"
+msgstr "Suurin leveys"
+
+#: ism/utils/scimstringview.c:222
+msgid "Maximum width of this string view."
+msgstr "Suurin leveys tälle merkkijononäytölle."
+
+#: ism/utils/scimstringview.c:231
+msgid "Has Frame"
+msgstr "Reunus"
+
+#: ism/utils/scimstringview.c:232
+msgid "FALSE removes outside bevel from string view."
+msgstr "FALSE poistaa ulkopuolisen reunan merkkijononäytöstä."
+
+#: ism/utils/scimstringview.c:239
+msgid "Draw cursor"
+msgstr "Piirrä kohdistin"
+
+#: ism/utils/scimstringview.c:240
+msgid "TRUE draw blinking cursor."
+msgstr "TRUE piirtää vilkkuvan kohdistimen."
+
+#: ism/utils/scimstringview.c:247
+msgid "Auto move cursor"
+msgstr "Kohdistimen siirto"
+
+#: ism/utils/scimstringview.c:248
+msgid "TRUE auto move cursor position when mouse clicking."
+msgstr "TRUE siirtää kohdistinta automaattisesti hiiren napsautukseta."
+
+#: ism/utils/scimstringview.c:255
+#, fuzzy
+msgid "Forward button press/release event"
+msgstr "Edelleenlähetä painikkeen painallus"
+
+#: ism/utils/scimstringview.c:256
+#, fuzzy
+msgid "TRUE forward button press/release event to user program."
+msgstr "TRUE lähettää painikkeen painalluksen edelleen käyttäjäohjelmalle."
+
+#: ism/utils/scimstringview.c:263
+msgid "Auto resize the widget to fit the string"
+msgstr "Muuta elementin kokoa merkkijonon mukaan"
+
+#: ism/utils/scimstringview.c:264
+msgid "TRUE Auto resize on."
+msgstr "TRUE Automaattinen koon muuttaminen käytössä."
+
+#: ism/utils/scimstringview.c:271
+msgid "Emit move_cursor signal when press/release the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:272
+#, fuzzy
+msgid "TRUE Emit move_cursor signal when press the string."
+msgstr "TRUE siirtää kohdistinta automaattisesti hiiren napsautukseta."
+
+#: ism/utils/scimstringview.c:279
+msgid "Width in chars"
+msgstr "Leveys merkeissä"
+
+#: ism/utils/scimstringview.c:280
+msgid "Number of characters to leave space for in the string view."
+msgstr "Merkkijononäyttöön jätettävän tyhjän tilan määrä merkeissä."
+
+#: ism/utils/scimstringview.c:289
+msgid "Scroll offset"
+msgstr "Vieritysmäärä"
+
+#: ism/utils/scimstringview.c:290
+msgid "Number of pixels of the string view scrolled off the screen to the left"
+msgstr "Merkkijonon vierityksen määrä pikseleissä"
+
+#: ism/utils/scimstringview.c:299
+msgid "Text"
+msgstr "Teksti"
+
+#: ism/utils/scimstringview.c:300
+msgid "The contents of the string view"
+msgstr "Merkkijononäytön sisältö"
+
+#: ism/utils/scimkeyselection.cpp:161
+msgid "Selected _Keys:"
+msgstr "Valitus _näppäimet:"
+
+#: ism/utils/scimkeyselection.cpp:206
+msgid "Key Code:"
+msgstr "Näppäinkoodi:"
+
+#: ism/utils/scimkeyselection.cpp:224
+#, fuzzy
+msgid "....."
+msgstr "..."
+
+#: ism/utils/scimkeyselection.cpp:229
+msgid "Modifiers:"
+msgstr "Pohjassa olevat näppäimet:"
+
+#: ism/utils/scimkeyselection.cpp:242
+msgid "_Ctrl"
+msgstr "_Ctrl"
+
+#: ism/utils/scimkeyselection.cpp:246
+msgid "A_lt"
+msgstr "A_lt"
+
+#: ism/utils/scimkeyselection.cpp:250
+msgid "_Shift"
+msgstr "_Shift"
+
+#: ism/utils/scimkeyselection.cpp:254
+msgid "_Release"
+msgstr "_Release"
+
+#: ism/utils/scimkeyselection.cpp:264
+msgid "_Meta"
+msgstr "_Meta"
+
+#: ism/utils/scimkeyselection.cpp:268
+msgid "S_uper"
+msgstr "S_uper"
+
+#: ism/utils/scimkeyselection.cpp:272
+msgid "_Hyper"
+msgstr "_Hyper"
+
+#: ism/utils/scimkeyselection.cpp:337
+msgid "Please enter a Key Code first."
+msgstr "Syötä näppäinkoodi ensin."
+
+#: ism/utils/scimkeyselection.cpp:391
+#, fuzzy
+msgid ""
+"Press a key (or a key combination).\n"
+"This dialog will be closed \n"
+"when the key is released."
+msgstr ""
+"Paina näppäintä (tai näppäinyhdistelmää).\n"
+"Tämä ikkuna sulkeutuu kun näppäin vapautetaan."
+
+#: ism/utils/scimkeyselection.cpp:395
+msgid "Grabbing a key."
+msgstr "Odotetaan näppäintä."
+
+#: ism/utils/scimkeyselection.cpp:686
+msgid "Key Selection"
+msgstr "Näppäimen valinta"
+
+#: ism/utils/scimtrayicon.c:108
+msgid "Orientation"
+msgstr "Suunta"
+
+#: ism/utils/scimtrayicon.c:109
+msgid "The orientation of the tray."
+msgstr "Ilmoitusalueen suunta."
+
+#. Normal Layout
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "NORMAL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "click to enter TEXT"
+msgstr ""
+
+#. Number Layout
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "NUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "click to enter NUMBER"
+msgstr ""
+
+#. Email Layout
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "EMAIL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "click to enter EMAIL"
+msgstr ""
+
+#. URL Layout
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "URL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "click to enter URL"
+msgstr ""
+
+#. Phonenumber Layout
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "PHONENUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "click to enter PHONENUMBER"
+msgstr ""
+
+#. IP Layout
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "IP LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "click to enter IP"
+msgstr ""
+
+#. Month Layout
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "MONTH LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "click to enter MONTH"
+msgstr ""
+
+#. Number Only Layout
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "NUMBERONLY LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "click to enter NUMBERONLY"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:220
+msgid "ise layout"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:51
+msgid "Application template"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:52
+msgid "Click to exit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:156
+msgid "Previous"
+msgstr ""
+
+#. bundle_add(ad->data, "navi_btn_left", NULL);
+#: ism/demos/isf_demo_efl.cpp:158
+#, fuzzy
+msgid "Next"
+msgstr "Teksti"
+
+#: ism/demos/isf_demo_efl.cpp:171
+msgid "Quit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:203
+msgid "isf demo"
+msgstr ""
+
+#: ism/demos/isf_entry_event_efl.cpp:151
+msgid "entry event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:220
+msgid "label event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:250
+msgid "ise event demo"
+msgstr ""
+
+#: ism/demos/isf_imcontrol_efl.cpp:375
+msgid "isfimcontrol api"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "Näppäimen valinta"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Option"
+msgstr "Valinnat"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "saksa"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "englanti/näppäimistö"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Näppäimen valinta"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "Näppäimen valinta"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "englanti/näppäimistö"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "Valinnat"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "englanti/näppäimistö"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "amhara"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Aina"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Valinnat"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "englanti/näppäimistö"
+
+#~ msgid "English/European"
+#~ msgstr "englanti/eurooppalainen"
+
+#~ msgid "RAW CODE"
+#~ msgstr "RAW CODE"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Pikanäppäimet:\n"
+#~ "\n"
+#~ " Ctrl+u:\n"
+#~ " vaihda monitavukoodauksen ja Unicoden välillä.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " palauta syöttötavan oletusarvot.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "Nykyisen syöttötavan tila. Napsauta vaihtaaksesi."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Globaalit asetukset"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Aseta yleiset kaikkien edustaohjelmien käyttämät asetukset, mukaanlukien "
+#~ "X11-, GTK-, IMModule-, QT IMModule-ohjelmat"
+
+#~ msgid "_Trigger:"
+#~ msgstr "_Liipaisin"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Valitse liipaisinnäppäimet"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat jotka ottavat käyttöön / poistavat käytöstä SCIM-"
+#~ "syöttötavan. Napsauta oikealla olevaa painiketta muokataksesi sitä."
+
+#~ msgid "Turn _On:"
+#~ msgstr "Ota _käyttöön"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Valitse \"ota käyttöön\"-näppäimet"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat jotka ottavat SCIM-syöttötavan käyttöön. Napsauta "
+#~ "oikealla olevaa painiketta muokataksesi sitä."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "_Poista käytöstä:"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Valitse \"poista käytöstä\"-näppäimet"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat jotka poistavat SCIM-syöttötavan käyttöstä. Napsauta "
+#~ "oikealla olevaa painiketta muokataksesi sitä."
+
+#~ msgid "_Next input method:"
+#~ msgstr "_Seuraava syöttötapa:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "Valitse \"seuraava syöttötapa\"-näppäimet"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat joilla vaihdetaan seuraavaan syöttötapaan. Napsauta "
+#~ "painiketta oikealla muokataksesi."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "_Edellinen syöttötapa:"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Valitse \"edellinen syöttötapa\"-näppäimet"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat joilla vaihdetaan edelliseen syöttötapaan. Napsauta "
+#~ "painiketta oikealla muokataksesi."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "Näytä syöttötapa_valikko"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "Valitse näppäimet joilla syöttötapavalikko näytetään"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Näppäintapahtumat joilla syöttötapavalikko näytetään. Napsauta painiketta "
+#~ "oikealla muokataksesi."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "_Näppäimistöasettelu"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Valitse nykyinen näppäimistöasettelu tässä, jotta näppäimistöasettelusta "
+#~ "välittävät syöttötavat toimisivat oikein."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "_Sisällytä \"preedit\"-merkkijono asiakasikkunaan"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Jos tämä on valittu, \"preedit\"-merkkijono näytetään suoraan "
+#~ "asiakasikkunassa erillisen kelluvan ikkunan sijaan."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "_Jaa sama syöttötapa kaikkien ohjelmien kanssa"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Jos tämä on valittu, yhtä syöttötapaa käytetään kaikissa ohjelmissa. "
+#~ "Muutoin eri syöttötapa voidaan valita eri ohjelmille."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Pikanäppäimet"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Voit ottaa käyttöön / pois käytöstä syöttötapoja ja asettaa pikanäppäimiä "
+#~ "syöttötavoille."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Asennetut syöttötapapalvelut:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "Muokkaa _pikanäppäimiä"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "Muokkaa valittuun syöttötapaan liittyviä pikanäppäimiä."
+
+#~ msgid "Select _Filters"
+#~ msgstr "Valitse _suotimet"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "Valitse suotimet jotka liitetään tähän syöttötapaan."
+
+#~ msgid "_Expand"
+#~ msgstr "_Laajenna"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Laajenna kaikki kieliluokat"
+
+#~ msgid "_Collapse"
+#~ msgstr "_Supista"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Supista kaikki kieliluokat"
+
+#~ msgid "E_nable All"
+#~ msgstr "Ota _käyttöön kaikki"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Ottaa kaikki syöttötavat käyttöön."
+
+#~ msgid "_Disable All"
+#~ msgstr "_Poista käytöstä kaikki"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Poistaa kaikki syöttötavat käytöstä."
+
+#~ msgid "Filters"
+#~ msgstr "Suotimet"
+
+#~ msgid "Languages"
+#~ msgstr "Kielet"
+
+#~ msgid "Description"
+#~ msgstr "Kuvaus"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Muokkaa pikanäppäimiä: %s"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Valitse suotimet: %s"
+
+#~ msgid "Move _Up"
+#~ msgstr "Siirrä _ylös"
+
+#~ msgid "Move _Down"
+#~ msgstr "Siirrä _alas"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "GTK+-2.x-kirjastoon perustuva paneelisovellus"
+
+#~ msgid "On demand"
+#~ msgstr "Tarvittaessa"
+
+#~ msgid "Never"
+#~ msgstr "Ei koskaan"
+
+#~ msgid "ToolBar"
+#~ msgstr "Työkalupalkki"
+
+#~ msgid "_Show:"
+#~ msgstr "_Näytä:"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Automaattinen k_ohdistus"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Näytä _syöttötapakuvake"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "Näytä syöttätavan _nimi"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "Piilota aika_katkaisu"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Näytä _tikkukuvake"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Näytä _valikkokuvake"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Näytä o_hjekuvake"
+
+#~ msgid "Show _property label"
+#~ msgstr "Näytä ominaisuusnimi_ö"
+
+#~ msgid "Input window"
+#~ msgstr "Syöttöikkuna"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "S_ulautettu etsintätaulukko"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "_Pystysuuntainen etsintätaulukko"
+
+#~ msgid "Misc"
+#~ msgstr "Muut"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Näytä _ilmoitusalueen kuvake"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Koh_dista ikkunat"
+
+#~ msgid "_Font:"
+#~ msgstr "_Kirjasin:"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Jos valinta \"aina\" on valittu, työkalupalkki näytetään aina ruudulla. "
+#~ "Jos \"tarvittaessa\" on valittu, se näytetään vain SCIMin ollessa "
+#~ "aktiivisena. Valinnalla \"Never\" palkkia ei näytetä koskaan."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr "Jos tämä on valittu, työkalupalkki kohdistetaan ruudun reunaan."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "Työkalupalkki piilotetaan kun määritelty aika on kulunut. Tämä valinta on "
+#~ "kelvollinen vain jos \"Näytä aina\" on valittu. Aseta nollaksi "
+#~ "poistaaksesi piilotuksen käytöstä."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr "Jos tämä on valittu, syöttötapakuvake näytetään työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr "Jos tämä on valittu, syöttötavan nimi näytetään työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr "Jos tämä on valittu, kohdistuskuvake näytetään työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr "Jos tämä on valittu, valikkokuvake näytetään työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr "Jos tämä on valittu, ohjekuvake näytetään työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Jos tämä on valittu, syöttötapa-asetusten teksti näytetään "
+#~ "työkalupalkissa."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr "Jos tämä on valittu, etsintätaulukko sisällytetään syöttöikkunaan."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr "Jos tämä on valittu, etsintätaulukko näytetään pystysuuntaisesti."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Jos tämä on valittu, ilmoitusalueen kuvake näytetään työpöydän "
+#~ "työkalupalkissa"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Jos tämä on valittu, työkalupalkki, syöttö- ja etsintätaulukkoikkunat "
+#~ "kohdistetaan alkuperäisiin sijainteihinsa."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "Kirjasinasetusta käytetään syöttötapa- ja etsintätaulukkoikkunoihin."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Valitse käyttöliittymän kirjasin"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "Edustaohjelma"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMEngine"
+
+#~ msgid "Panel"
+#~ msgstr "Paneeli"
+
+#~ msgid "Extra"
+#~ msgstr "Ekstra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "SCIM syöttötapojen valinta"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Smart Common Input Method -alusta</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Graafinen asetusohjelma</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Asetukset moduulille \"%s\".</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Haluatko poistua SCIMin asetuksista?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Kaikkia asetuksia ei voida vaihtaa lennossa. Käynnistä SCIM uudelleen "
+#~ "ottaaksesi kaikki uudet asetukset käyttöön."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "SCIM-asetukset"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "GTK-elementtikirjastoon perustuva asetusohjelma."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "Asetusohjelma Smart Common Input Method -alustalle"
+
+#~ msgid "SCIM Help"
+#~ msgstr "SCIM-ohje"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Input Method"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Kohdista tai poista syöttöikkunan ja työkalurivun kohdistus."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "Näytä lyhyt ohje SCIMistä sekä nykyinen syöttötapa."
+
+#~ msgid "Show command menu."
+#~ msgstr "Näytä komentovalikko."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Lataa asetukset uudelleen"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Kohdista ikkunat"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Piilota työkalupalkki"
+
+#~ msgid "Help ..."
+#~ msgstr "Ohje ..."
+
+#~ msgid "Exit"
+#~ msgstr "Poistu"
--- /dev/null
+# translation of fr.po to French
+# This file is distributed under the same license as the scim package.
+# Copyright (C) 2004 James Su <suzhe@tsinghua.org.cn>.
+#
+# Damien Menanteau <MengDaming@nerdshack.com>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: fr\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 15:30+0900\n"
+"PO-Revision-Date: 2005-12-11 13:54+0800\n"
+"Last-Translator: Damien Menanteau <MengDaming@nerdshack.com>\n"
+"Language-Team: French\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ism/src/scim_compose_key.cpp:127 ism/src/scim_imengine.cpp:659
+#: ism/src/scim_panel_agent.cpp:345 ism/src/scim_panel_agent.cpp:4334
+#: ism/src/scim_utility.cpp:701
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1740
+msgid "English/Keyboard"
+msgstr "Français/Clavier"
+
+#. return WideString ();
+#: ism/src/scim_compose_key.cpp:146
+#, fuzzy
+msgid "English input service"
+msgstr "Anglais (Etats-Unis)"
+
+#: ism/src/scim_utility.cpp:702
+msgid "Amharic"
+msgstr "Amharique"
+
+#: ism/src/scim_utility.cpp:703
+msgid "Arabic"
+msgstr "Arabe"
+
+#: ism/src/scim_utility.cpp:704 ism/src/scim_utility.cpp:893
+msgid "Arabic (Egypt)"
+msgstr "Arabe (Egypte)"
+
+#: ism/src/scim_utility.cpp:705 ism/src/scim_utility.cpp:902
+msgid "Arabic (Lebanon)"
+msgstr "Arabe (Liban)"
+
+#: ism/src/scim_utility.cpp:706
+msgid "Assamese"
+msgstr "Assamais"
+
+#: ism/src/scim_utility.cpp:707 ism/src/scim_utility.cpp:918
+msgid "Azerbaijani"
+msgstr "Azerbaïdjanais"
+
+#: ism/src/scim_utility.cpp:708
+msgid "Belarusian"
+msgstr "Biélorusse"
+
+#: ism/src/scim_utility.cpp:709 ism/src/scim_utility.cpp:874
+msgid "Bulgarian"
+msgstr "Bulgare"
+
+#: ism/src/scim_utility.cpp:710 ism/src/scim_utility.cpp:711
+#: ism/src/scim_utility.cpp:913
+msgid "Bengali"
+msgstr "Bengali"
+
+#: ism/src/scim_utility.cpp:712
+msgid "Bengali (India)"
+msgstr "Bengali (Inde)"
+
+#: ism/src/scim_utility.cpp:713
+msgid "Tibetan"
+msgstr "Tibétain"
+
+#: ism/src/scim_utility.cpp:714
+msgid "Bosnian"
+msgstr "Bosniaque"
+
+#: ism/src/scim_utility.cpp:715 ism/src/scim_utility.cpp:853
+msgid "Catalan"
+msgstr "Catalan"
+
+#: ism/src/scim_utility.cpp:716 ism/src/scim_utility.cpp:863
+#: ism/src/scim_keyboard_layout_data.h:4596
+msgid "Czech"
+msgstr "Tchèque"
+
+#: ism/src/scim_utility.cpp:717 ism/src/scim_utility.cpp:923
+msgid "Welsh"
+msgstr "Gallois"
+
+#: ism/src/scim_utility.cpp:718 ism/src/scim_utility.cpp:854
+#: ism/src/scim_keyboard_layout_data.h:4598
+msgid "Danish"
+msgstr "Danois"
+
+#: ism/src/scim_utility.cpp:719 ism/src/scim_keyboard_layout_data.h:4606
+msgid "German"
+msgstr "Allemand"
+
+#: ism/src/scim_utility.cpp:720
+msgid "Divehi"
+msgstr "Maldivien"
+
+#: ism/src/scim_utility.cpp:721 ism/src/scim_utility.cpp:873
+#: ism/src/scim_keyboard_layout_data.h:4609
+msgid "Greek"
+msgstr "Grec"
+
+#: ism/src/scim_utility.cpp:722
+msgid "English"
+msgstr "Anglais"
+
+#: ism/src/scim_utility.cpp:723 ism/src/scim_utility.cpp:808
+msgid "English (Australian)"
+msgstr "Anglais (Australie)"
+
+#: ism/src/scim_utility.cpp:724 ism/src/scim_utility.cpp:809
+msgid "English (Canadian)"
+msgstr "Anglais (Canada)"
+
+#: ism/src/scim_utility.cpp:725
+msgid "English (British)"
+msgstr "Anglais (Royaume Uni)"
+
+#: ism/src/scim_utility.cpp:726
+msgid "English (Ireland)"
+msgstr "Anglais (Irlande)"
+
+#: ism/src/scim_utility.cpp:727
+msgid "English (American)"
+msgstr "Anglais (Etats-Unis)"
+
+#: ism/src/scim_utility.cpp:728 ism/src/scim_utility.cpp:729
+#: ism/src/scim_keyboard_layout_data.h:4622
+msgid "Spanish"
+msgstr "Espagnol"
+
+#: ism/src/scim_utility.cpp:730
+msgid "Spanish (Mexico)"
+msgstr "Espagnol (Mexique)"
+
+#: ism/src/scim_utility.cpp:731 ism/src/scim_utility.cpp:870
+#: ism/src/scim_keyboard_layout_data.h:4601
+msgid "Estonian"
+msgstr "Estonien"
+
+#: ism/src/scim_utility.cpp:732 ism/src/scim_utility.cpp:852
+msgid "Basque"
+msgstr "Basque"
+
+#: ism/src/scim_utility.cpp:733
+msgid "Persian"
+msgstr "Perse"
+
+#: ism/src/scim_utility.cpp:734 ism/src/scim_utility.cpp:857
+#: ism/src/scim_keyboard_layout_data.h:4602
+msgid "Finnish"
+msgstr "Finnois"
+
+#: ism/src/scim_utility.cpp:735 ism/src/scim_keyboard_layout_data.h:4603
+msgid "French"
+msgstr "Français"
+
+#: ism/src/scim_utility.cpp:736 ism/src/scim_utility.cpp:921
+msgid "Irish"
+msgstr "Irlandais"
+
+#: ism/src/scim_utility.cpp:737 ism/src/scim_utility.cpp:919
+msgid "Galician"
+msgstr "Galicien"
+
+#: ism/src/scim_utility.cpp:738 ism/src/scim_utility.cpp:914
+msgid "Gujarati"
+msgstr "Gujarati"
+
+#: ism/src/scim_utility.cpp:739 ism/src/scim_utility.cpp:748
+#: ism/src/scim_utility.cpp:890
+msgid "Hebrew"
+msgstr "Hébreu"
+
+#: ism/src/scim_utility.cpp:740 ism/src/scim_utility.cpp:909
+msgid "Hindi"
+msgstr "Hindou"
+
+#: ism/src/scim_utility.cpp:741 ism/src/scim_keyboard_layout_data.h:4595
+msgid "Croatian"
+msgstr "Croate"
+
+#: ism/src/scim_utility.cpp:742 ism/src/scim_utility.cpp:864
+#: ism/src/scim_keyboard_layout_data.h:4610
+msgid "Hungarian"
+msgstr "Hongrois"
+
+#: ism/src/scim_utility.cpp:743
+msgid "Armenian"
+msgstr "Arménien"
+
+#: ism/src/scim_utility.cpp:744
+msgid "Interlingua"
+msgstr "Interlingua"
+
+#: ism/src/scim_utility.cpp:745
+msgid "Indonesian"
+msgstr "Indonésien"
+
+#: ism/src/scim_utility.cpp:746 ism/src/scim_utility.cpp:856
+#: ism/src/scim_keyboard_layout_data.h:4628
+msgid "Icelandic"
+msgstr "Islandais"
+
+#: ism/src/scim_utility.cpp:747 ism/src/scim_keyboard_layout_data.h:4611
+msgid "Italian"
+msgstr "Italien"
+
+#: ism/src/scim_utility.cpp:749 ism/src/scim_utility.cpp:882
+#: ism/src/scim_keyboard_layout_data.h:4612
+msgid "Japanese"
+msgstr "Japonais"
+
+#: ism/src/scim_utility.cpp:750 ism/src/scim_utility.cpp:917
+msgid "Georgian"
+msgstr "Géorgien"
+
+#: ism/src/scim_utility.cpp:751 ism/src/scim_utility.cpp:875
+msgid "Kazakh"
+msgstr "Kazakh"
+
+#: ism/src/scim_utility.cpp:752
+msgid "Cambodian"
+msgstr "Khmer"
+
+#: ism/src/scim_utility.cpp:753
+msgid "Kannada"
+msgstr "Kannara"
+
+#: ism/src/scim_utility.cpp:754 ism/src/scim_utility.cpp:883
+msgid "Korean"
+msgstr "Coréen"
+
+#: ism/src/scim_utility.cpp:755
+msgid "Laothian"
+msgstr "Laotien"
+
+#: ism/src/scim_utility.cpp:756 ism/src/scim_utility.cpp:872
+#: ism/src/scim_keyboard_layout_data.h:4629
+msgid "Lithuanian"
+msgstr "Lituanien"
+
+#: ism/src/scim_utility.cpp:757 ism/src/scim_utility.cpp:871
+msgid "Latvian"
+msgstr "Letton"
+
+#: ism/src/scim_utility.cpp:758 ism/src/scim_utility.cpp:876
+msgid "Macedonian"
+msgstr "Macédonien"
+
+#: ism/src/scim_utility.cpp:759 ism/src/scim_utility.cpp:915
+msgid "Malayalam"
+msgstr "Malayalam"
+
+#: ism/src/scim_utility.cpp:760
+msgid "Mongolian"
+msgstr "Mongol"
+
+#: ism/src/scim_utility.cpp:761 ism/src/scim_utility.cpp:911
+msgid "Marathi"
+msgstr "Marathi"
+
+#: ism/src/scim_utility.cpp:762
+msgid "Malay"
+msgstr "Malais"
+
+#: ism/src/scim_utility.cpp:763
+msgid "Burmese"
+msgstr "Birman"
+
+#: ism/src/scim_utility.cpp:764
+msgid "Nepali"
+msgstr "Népalais"
+
+#: ism/src/scim_utility.cpp:765 ism/src/scim_keyboard_layout_data.h:4599
+msgid "Dutch"
+msgstr "Néerlandais"
+
+#: ism/src/scim_utility.cpp:766
+#, fuzzy
+msgid "Norwegian (Nynorsk)"
+msgstr "Norvégien (Nynorsk)"
+
+#: ism/src/scim_utility.cpp:767
+#, fuzzy
+msgid "Norwegian (Bokmal)"
+msgstr "Norvégien (Bokmal)"
+
+#: ism/src/scim_utility.cpp:768
+msgid "Oriya"
+msgstr "Oriya"
+
+#: ism/src/scim_utility.cpp:769 ism/src/scim_utility.cpp:916
+msgid "Punjabi"
+msgstr "Punjabi"
+
+#: ism/src/scim_utility.cpp:770 ism/src/scim_utility.cpp:865
+#: ism/src/scim_keyboard_layout_data.h:4614
+msgid "Polish"
+msgstr "Polonais"
+
+#: ism/src/scim_utility.cpp:771 ism/src/scim_utility.cpp:773
+#: ism/src/scim_keyboard_layout_data.h:4615
+msgid "Portuguese"
+msgstr "Portugais"
+
+#: ism/src/scim_utility.cpp:772 ism/src/scim_keyboard_layout_data.h:4616
+msgid "Portuguese (Brazil)"
+msgstr "Portugais (Brésil)"
+
+#: ism/src/scim_utility.cpp:774 ism/src/scim_utility.cpp:866
+msgid "Romanian"
+msgstr "Roumain"
+
+#: ism/src/scim_utility.cpp:775 ism/src/scim_utility.cpp:877
+#: ism/src/scim_keyboard_layout_data.h:4618
+msgid "Russian"
+msgstr "Russe"
+
+#: ism/src/scim_utility.cpp:776 ism/src/scim_utility.cpp:922
+msgid "Sinhala"
+msgstr "Singhalais"
+
+#: ism/src/scim_utility.cpp:777 ism/src/scim_utility.cpp:868
+#: ism/src/scim_keyboard_layout_data.h:4619
+msgid "Slovak"
+msgstr "Slovaque"
+
+#: ism/src/scim_utility.cpp:778 ism/src/scim_utility.cpp:869
+#: ism/src/scim_keyboard_layout_data.h:4621
+msgid "Slovenian"
+msgstr "Slovène"
+
+#: ism/src/scim_utility.cpp:779
+msgid "Albanian"
+msgstr "Albanais"
+
+#: ism/src/scim_utility.cpp:780 ism/src/scim_utility.cpp:781
+#: ism/src/scim_utility.cpp:782
+msgid "Serbian"
+msgstr "Serbe"
+
+#: ism/src/scim_utility.cpp:783 ism/src/scim_utility.cpp:785
+#: ism/src/scim_utility.cpp:861 ism/src/scim_keyboard_layout_data.h:4625
+msgid "Swedish"
+msgstr "Suédois"
+
+#: ism/src/scim_utility.cpp:784 ism/src/scim_utility.cpp:862
+msgid "Swedish (Finland)"
+msgstr "Suédois (Finlande)"
+
+#: ism/src/scim_utility.cpp:786 ism/src/scim_utility.cpp:912
+msgid "Tamil"
+msgstr "Tamoul"
+
+#: ism/src/scim_utility.cpp:787 ism/src/scim_utility.cpp:910
+msgid "Telugu"
+msgstr "Telugu"
+
+#: ism/src/scim_utility.cpp:788 ism/src/scim_utility.cpp:889
+msgid "Thai"
+msgstr "Thaï"
+
+#: ism/src/scim_utility.cpp:789 ism/src/scim_utility.cpp:880
+#: ism/src/scim_keyboard_layout_data.h:4626
+msgid "Turkish"
+msgstr "Turc"
+
+#: ism/src/scim_utility.cpp:790
+msgid "Uighur"
+msgstr "Uighur"
+
+#: ism/src/scim_utility.cpp:791 ism/src/scim_utility.cpp:879
+#: ism/src/scim_keyboard_layout_data.h:4630
+msgid "Ukrainian"
+msgstr "Ukrainien"
+
+#: ism/src/scim_utility.cpp:792 ism/src/scim_utility.cpp:907
+msgid "Urdu"
+msgstr "Ourdou"
+
+#: ism/src/scim_utility.cpp:793
+msgid "Uzbek"
+msgstr "Ouzbèque"
+
+#: ism/src/scim_utility.cpp:794 ism/src/scim_utility.cpp:908
+msgid "Vietnamese"
+msgstr "Vietnamien"
+
+#: ism/src/scim_utility.cpp:795
+msgid "Walloon"
+msgstr "Wallon"
+
+#: ism/src/scim_utility.cpp:796 ism/src/scim_utility.cpp:797
+msgid "Yiddish"
+msgstr "Yiddish"
+
+#: ism/src/scim_utility.cpp:798
+msgid "Chinese"
+msgstr "Chinois"
+
+#: ism/src/scim_utility.cpp:799 ism/src/scim_utility.cpp:801
+#, fuzzy
+msgid "Chinese (Simplified)"
+msgstr "Chinois (simplifié)"
+
+#: ism/src/scim_utility.cpp:800 ism/src/scim_utility.cpp:802
+#, fuzzy
+msgid "Chinese (Traditional)"
+msgstr "Chinois (traditionnel)"
+
+#: ism/src/scim_utility.cpp:804
+msgid "Dutch (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:805
+#, fuzzy
+msgid "Dutch (Belgian)"
+msgstr "Belge"
+
+#: ism/src/scim_utility.cpp:806
+#, fuzzy
+msgid "English (United States)"
+msgstr "Anglais (US)"
+
+#: ism/src/scim_utility.cpp:807
+#, fuzzy
+msgid "English (United Kingdom)"
+msgstr "Anglais (Canada)"
+
+#: ism/src/scim_utility.cpp:810
+#, fuzzy
+msgid "English (New Zealand)"
+msgstr "Anglais (Irlande)"
+
+#: ism/src/scim_utility.cpp:811
+#, fuzzy
+msgid "English (Irish)"
+msgstr "Anglais (Royaume Uni)"
+
+#: ism/src/scim_utility.cpp:812
+#, fuzzy
+msgid "English (South Africa)"
+msgstr "Anglais (Etats-Unis)"
+
+#: ism/src/scim_utility.cpp:813
+#, fuzzy
+msgid "English (Jamaica)"
+msgstr "Anglais (Canada)"
+
+#: ism/src/scim_utility.cpp:814
+#, fuzzy
+msgid "English (Belize)"
+msgstr "Anglais (Royaume Uni)"
+
+#: ism/src/scim_utility.cpp:815
+#, fuzzy
+msgid "English (Trinidad)"
+msgstr "Anglais (Royaume Uni)"
+
+#: ism/src/scim_utility.cpp:816
+#, fuzzy
+msgid "English (Zimbabwe)"
+msgstr "Anglais (Canada)"
+
+#: ism/src/scim_utility.cpp:817
+#, fuzzy
+msgid "English (Philippines)"
+msgstr "Anglais (Royaume Uni)"
+
+#: ism/src/scim_utility.cpp:818
+#, fuzzy
+msgid "French (Standard)"
+msgstr "Français (Canada)"
+
+#: ism/src/scim_utility.cpp:819
+#, fuzzy
+msgid "French (Belgian)"
+msgstr "Français (Canada)"
+
+#: ism/src/scim_utility.cpp:820 ism/src/scim_keyboard_layout_data.h:4604
+msgid "French (Canadian)"
+msgstr "Français (Canada)"
+
+#: ism/src/scim_utility.cpp:821
+#, fuzzy
+msgid "French (Swiss)"
+msgstr "Allemand (Suisse)"
+
+#: ism/src/scim_utility.cpp:822
+msgid "French (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:823
+#, fuzzy
+msgid "French (Monaco)"
+msgstr "Français (Canada)"
+
+#: ism/src/scim_utility.cpp:824
+#, fuzzy
+msgid "German (Standard)"
+msgstr "Allemand (avec touches mortes)"
+
+#: ism/src/scim_utility.cpp:825 ism/src/scim_keyboard_layout_data.h:4608
+msgid "German (Swiss)"
+msgstr "Allemand (Suisse)"
+
+#: ism/src/scim_utility.cpp:826
+#, fuzzy
+msgid "German (Austrian)"
+msgstr "Anglais (Australie)"
+
+#: ism/src/scim_utility.cpp:827
+msgid "German (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:828
+#, fuzzy
+msgid "German (Liechtenstein)"
+msgstr "Allemand (Suisse)"
+
+#: ism/src/scim_utility.cpp:829
+msgid "Italian (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:830
+#, fuzzy
+msgid "Italian (Swiss)"
+msgstr "Allemand (Suisse)"
+
+#: ism/src/scim_utility.cpp:831
+#, fuzzy
+msgid "Portuguese (Brazilian)"
+msgstr "Portugais (Brésil)"
+
+#: ism/src/scim_utility.cpp:832
+#, fuzzy
+msgid "Portuguese (Standard)"
+msgstr "Portugais (Brésil)"
+
+#: ism/src/scim_utility.cpp:833
+#, fuzzy
+msgid "Spanish (Traditional Sort)"
+msgstr "Espagnol (Amérique latine)"
+
+#: ism/src/scim_utility.cpp:834
+#, fuzzy
+msgid "Spanish (Mexican)"
+msgstr "Espagnol (Mexique)"
+
+#: ism/src/scim_utility.cpp:835
+#, fuzzy
+msgid "Spanish (Guatemala)"
+msgstr "Espagnol (Amérique latine)"
+
+#: ism/src/scim_utility.cpp:836
+#, fuzzy
+msgid "Spanish (Costa Rica)"
+msgstr "Espagnol (Amérique latine)"
+
+#: ism/src/scim_utility.cpp:837
+#, fuzzy
+msgid "Spanish (Panama)"
+msgstr "Espagnol (Amérique latine)"
+
+#: ism/src/scim_utility.cpp:838
+#, fuzzy
+msgid "Spanish (Dominican Republic)"
+msgstr "Espagnol (Amérique latine)"
+
+#: ism/src/scim_utility.cpp:839
+#, fuzzy
+msgid "Spanish (Venezuela)"
+msgstr "Espagnol (Mexique)"
+
+#: ism/src/scim_utility.cpp:840
+#, fuzzy
+msgid "Spanish (Colombia)"
+msgstr "Espagnol (Mexique)"
+
+#: ism/src/scim_utility.cpp:841
+#, fuzzy
+msgid "Spanish (Peru)"
+msgstr "Espagnol (Mexique)"
+
+#: ism/src/scim_utility.cpp:842
+#, fuzzy
+msgid "Spanish (Argentina)"
+msgstr "Espagnol (Mexique)"
+
+#: ism/src/scim_utility.cpp:843
+#, fuzzy
+msgid "Spanish (Ecuador)"
+msgstr "Espagnol (Mexique)"
+
+#: ism/src/scim_utility.cpp:844
+#, fuzzy
+msgid "Spanish (Chile)"
+msgstr "Espagnol (Mexique)"
+
+#: ism/src/scim_utility.cpp:845
+#, fuzzy
+msgid "Spanish (Uruguay)"
+msgstr "Espagnol (Mexique)"
+
+#: ism/src/scim_utility.cpp:846
+#, fuzzy
+msgid "Spanish (Paraguay)"
+msgstr "Espagnol (CP 850)"
+
+#: ism/src/scim_utility.cpp:847
+#, fuzzy
+msgid "Spanish (Bolivia)"
+msgstr "Espagnol (Mexique)"
+
+#: ism/src/scim_utility.cpp:848
+msgid "Spanish (El Salvador)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:849
+#, fuzzy
+msgid "Spanish (Honduras)"
+msgstr "Espagnol (Mexique)"
+
+#: ism/src/scim_utility.cpp:850
+#, fuzzy
+msgid "Spanish (Nicaragua)"
+msgstr "Espagnol (Mexique)"
+
+#: ism/src/scim_utility.cpp:851
+#, fuzzy
+msgid "Spanish (Puerto Rico)"
+msgstr "Espagnol (Mexique)"
+
+#: ism/src/scim_utility.cpp:855
+msgid "Afrikaans"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:858
+#, fuzzy
+msgid "Malay (Malaysia)"
+msgstr "Malayalam"
+
+#: ism/src/scim_utility.cpp:859
+msgid "Malay (Brunei Darussalam)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:860 ism/src/scim_keyboard_layout_data.h:4613
+msgid "Norwegian"
+msgstr "Norvégien"
+
+#: ism/src/scim_utility.cpp:867
+#, fuzzy
+msgid "Serbian (Latin)"
+msgstr "Serbe"
+
+#: ism/src/scim_utility.cpp:878
+msgid "Serbian (Cyrillic)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:881
+msgid "Uzbek (Latin)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:884
+#, fuzzy
+msgid "Chinese (Taiwan)"
+msgstr "Chinois (traditionnel)"
+
+#: ism/src/scim_utility.cpp:885
+#, fuzzy
+msgid "Chinese (Hong Kong)"
+msgstr "Chinois (traditionnel)"
+
+#: ism/src/scim_utility.cpp:886
+#, fuzzy
+msgid "Chinese (Macau)"
+msgstr "Chinois (traditionnel)"
+
+#: ism/src/scim_utility.cpp:887
+#, fuzzy
+msgid "Chinese (PRC)"
+msgstr "Chinois"
+
+#: ism/src/scim_utility.cpp:888
+#, fuzzy
+msgid "Chinese (Singapore)"
+msgstr "Chinois (simplifié)"
+
+#: ism/src/scim_utility.cpp:891
+msgid "Arabic (Saudi Arabia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:892
+#, fuzzy
+msgid "Arabic (Iraq)"
+msgstr "Arabe (Liban)"
+
+#: ism/src/scim_utility.cpp:894
+#, fuzzy
+msgid "Arabic (Libya)"
+msgstr "Arabe (Liban)"
+
+#: ism/src/scim_utility.cpp:895
+#, fuzzy
+msgid "Arabic (Algeria)"
+msgstr "Arabe (Liban)"
+
+#: ism/src/scim_utility.cpp:896
+#, fuzzy
+msgid "Arabic (Morocco)"
+msgstr "Arabe (Liban)"
+
+#: ism/src/scim_utility.cpp:897
+#, fuzzy
+msgid "Arabic (Tunisia)"
+msgstr "Arabe (Liban)"
+
+#: ism/src/scim_utility.cpp:898
+#, fuzzy
+msgid "Arabic (Oman)"
+msgstr "Arabe (Liban)"
+
+#: ism/src/scim_utility.cpp:899
+#, fuzzy
+msgid "Arabic (Yemen)"
+msgstr "Arabe (Liban)"
+
+#: ism/src/scim_utility.cpp:900
+#, fuzzy
+msgid "Arabic (Syria)"
+msgstr "Arabe (Egypte)"
+
+#: ism/src/scim_utility.cpp:901
+#, fuzzy
+msgid "Arabic (Jordan)"
+msgstr "Arabe (Liban)"
+
+#: ism/src/scim_utility.cpp:903
+#, fuzzy
+msgid "Arabic (Kuwait)"
+msgstr "Arabe (Egypte)"
+
+#: ism/src/scim_utility.cpp:904
+#, fuzzy
+msgid "Arabic (UAE)"
+msgstr "Arabe (Egypte)"
+
+#: ism/src/scim_utility.cpp:905
+#, fuzzy
+msgid "Arabic (Bahrain)"
+msgstr "Arabe (Liban)"
+
+#: ism/src/scim_utility.cpp:906
+#, fuzzy
+msgid "Arabic (Qatar)"
+msgstr "Arabe (Egypte)"
+
+#: ism/src/scim_utility.cpp:920
+msgid "Hausa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:924
+msgid "Xhosa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:925
+msgid "Yoruba"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:926
+msgid "Zulu"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:1024
+msgid "Other"
+msgstr "Autre"
+
+#: ism/src/scim_keyboard_layout_data.h:4592
+#: ism/modules/imengine/scim_socket_imengine.cpp:408
+#: ism/modules/imengine/scim_socket_imengine.cpp:438
+#: ism/modules/imengine/scim_socket_imengine.cpp:523
+#: ism/modules/imengine/scim_socket_imengine.cpp:553
+#: ism/modules/imengine/scim_socket_imengine.cpp:583
+msgid "Unknown"
+msgstr "Inconnu"
+
+#: ism/src/scim_keyboard_layout_data.h:4593
+msgid "English (US)"
+msgstr "Anglais (US)"
+
+#: ism/src/scim_keyboard_layout_data.h:4594
+msgid "Belgian"
+msgstr "Belge"
+
+#: ism/src/scim_keyboard_layout_data.h:4597
+msgid "Czech (qwerty)"
+msgstr "Tchèque (qwerty)"
+
+#: ism/src/scim_keyboard_layout_data.h:4600
+msgid "Dvorak"
+msgstr "Dvorak"
+
+#: ism/src/scim_keyboard_layout_data.h:4605
+msgid "French (Switzerland)"
+msgstr "Français (Suisse)"
+
+#: ism/src/scim_keyboard_layout_data.h:4607
+msgid "German (with deadkeys)"
+msgstr "Allemand (avec touches mortes)"
+
+#: ism/src/scim_keyboard_layout_data.h:4617
+msgid "Portuguese (Brazil US accents)"
+msgstr "Portugais (Brésil accents US)"
+
+#: ism/src/scim_keyboard_layout_data.h:4620
+msgid "Slovak (qwerty)"
+msgstr "Slovaque (qwerty)"
+
+#: ism/src/scim_keyboard_layout_data.h:4623
+msgid "Spanish (CP 850)"
+msgstr "Espagnol (CP 850)"
+
+#: ism/src/scim_keyboard_layout_data.h:4624
+msgid "Spanish (Latin America)"
+msgstr "Espagnol (Amérique latine)"
+
+#: ism/src/scim_keyboard_layout_data.h:4627
+msgid "English (UK)"
+msgstr "Anglais (GB)"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:57
+msgid "Simplified-Traditional Chinese Conversion"
+msgstr "Conversion Chinois Simplifié-Traditionnel"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:60
+msgid "Convert between Simplified Chinese and Traditional Chinese"
+msgstr "Conversion entre chinois simplifié et chinois traditionnel"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:71
+msgid "SC-TC"
+msgstr "CS-CT"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:73
+#: ism/modules/filter/scim_sctc_filter.cpp:78
+msgid "Simplified-Traditional Chinese conversion"
+msgstr "Conversion Chinois Simplifié-Traditionnel"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:76
+msgid "No Conversion"
+msgstr "Pas de conversion"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:81
+msgid "Simplified to Traditional"
+msgstr "Simplifié vers Traditionnel"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:83
+msgid "Convert Simplified Chinese to Traditional Chinese"
+msgstr "Conversion du chinois simplifié en chinois traditionnel"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:86
+msgid "Traditional to Simplified"
+msgstr "Traditionnel vers Simplifié"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:88
+msgid "Convert Traditional Chinese to Simplified Chinese"
+msgstr "Conversion du chinois traditionnel en chinois simplifié"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:300
+msgid "James Su <suzhe@tsinghua.org.cn>"
+msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:425
+#: ism/modules/filter/scim_sctc_filter.cpp:555
+#: ism/modules/filter/scim_sctc_filter.cpp:571
+msgid "SC->TC"
+msgstr "CS->CT"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:431
+#: ism/modules/filter/scim_sctc_filter.cpp:559
+#: ism/modules/filter/scim_sctc_filter.cpp:575
+msgid "TC->SC"
+msgstr "CT->CS"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1693
+msgid "Smart Common Input Method platform "
+msgstr "Plateforme Smart Common Input Method"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1695
+msgid ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+msgstr ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1700
+msgid ""
+":\n"
+"\n"
+msgstr ""
+" :\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1703
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:963
+msgid "Enable"
+msgstr "Activer"
+
+#. gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+#. gtk_tree_view_column_set_fixed_width (column, 232);
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:984
+msgid "Name"
+msgstr "Nom"
+
+#: ism/utils/scimstringview.c:201
+msgid "Cursor Position"
+msgstr "Position du Curseur"
+
+#: ism/utils/scimstringview.c:202
+msgid "The current position of the insertion cursor in chars."
+msgstr "Position courante du curseur d'insertion dans les caractères."
+
+#: ism/utils/scimstringview.c:211
+msgid "Maximum length"
+msgstr "Longueur maximale"
+
+#: ism/utils/scimstringview.c:212
+msgid "Maximum number of characters for this string view. Zero if no maximum."
+msgstr ""
+"Nombre maximum de caractères pour cette vue de chaîne de caractères. Zero si "
+"pas de maximum."
+
+#: ism/utils/scimstringview.c:221
+msgid "Maximum width"
+msgstr "Largeur maximale"
+
+#: ism/utils/scimstringview.c:222
+msgid "Maximum width of this string view."
+msgstr "Largeur maximale de cette vue de chaîne de caractères."
+
+#: ism/utils/scimstringview.c:231
+msgid "Has Frame"
+msgstr "Avec Cadre"
+
+#: ism/utils/scimstringview.c:232
+msgid "FALSE removes outside bevel from string view."
+msgstr "FAUX supprime le cadre extérieur de la vue de chaîne de caractères."
+
+#: ism/utils/scimstringview.c:239
+msgid "Draw cursor"
+msgstr "Affichage du curseur"
+
+#: ism/utils/scimstringview.c:240
+msgid "TRUE draw blinking cursor."
+msgstr "VRAI Affichage d'un curseur clignotant."
+
+#: ism/utils/scimstringview.c:247
+msgid "Auto move cursor"
+msgstr "Déplacement automatique du curseur"
+
+#: ism/utils/scimstringview.c:248
+msgid "TRUE auto move cursor position when mouse clicking."
+msgstr ""
+"VRAI Déplacement automatique de la position du curseur sur clic de souris."
+
+#: ism/utils/scimstringview.c:255
+#, fuzzy
+msgid "Forward button press/release event"
+msgstr "Transmission événement d'appui de bouton"
+
+#: ism/utils/scimstringview.c:256
+#, fuzzy
+msgid "TRUE forward button press/release event to user program."
+msgstr ""
+"VRAI Fait suivre les événements d'appui de bouton vers le programme client."
+
+#: ism/utils/scimstringview.c:263
+msgid "Auto resize the widget to fit the string"
+msgstr "Redimensionnement automatique à la taille de la chaîne"
+
+#: ism/utils/scimstringview.c:264
+msgid "TRUE Auto resize on."
+msgstr "VRAI Redimensionnement automatique activé."
+
+#: ism/utils/scimstringview.c:271
+msgid "Emit move_cursor signal when press/release the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:272
+#, fuzzy
+msgid "TRUE Emit move_cursor signal when press the string."
+msgstr ""
+"VRAI Déplacement automatique de la position du curseur sur clic de souris."
+
+#: ism/utils/scimstringview.c:279
+msgid "Width in chars"
+msgstr "Largeur en caractères"
+
+#: ism/utils/scimstringview.c:280
+msgid "Number of characters to leave space for in the string view."
+msgstr ""
+"Nombre de caractères à laisser vides dans la vue de chaîne de caractères."
+
+#: ism/utils/scimstringview.c:289
+msgid "Scroll offset"
+msgstr "Décalage"
+
+#: ism/utils/scimstringview.c:290
+msgid "Number of pixels of the string view scrolled off the screen to the left"
+msgstr ""
+"Nombre de pixels de la vue de chaîne de caractères décalés à gauche en "
+"dehors de l'écran"
+
+#: ism/utils/scimstringview.c:299
+msgid "Text"
+msgstr "Texte"
+
+#: ism/utils/scimstringview.c:300
+msgid "The contents of the string view"
+msgstr "Le contenu de la vue de chaîne de caractères"
+
+#: ism/utils/scimkeyselection.cpp:161
+msgid "Selected _Keys:"
+msgstr "_Touches Sélectionnées :"
+
+#: ism/utils/scimkeyselection.cpp:206
+msgid "Key Code:"
+msgstr "Code Touche:"
+
+#: ism/utils/scimkeyselection.cpp:224
+#, fuzzy
+msgid "....."
+msgstr "..."
+
+#: ism/utils/scimkeyselection.cpp:229
+msgid "Modifiers:"
+msgstr "Modificateurs:"
+
+#: ism/utils/scimkeyselection.cpp:242
+msgid "_Ctrl"
+msgstr "_Ctrl"
+
+#: ism/utils/scimkeyselection.cpp:246
+msgid "A_lt"
+msgstr "_Alt"
+
+#: ism/utils/scimkeyselection.cpp:250
+msgid "_Shift"
+msgstr "_Maj"
+
+#: ism/utils/scimkeyselection.cpp:254
+msgid "_Release"
+msgstr "_Relâche"
+
+#: ism/utils/scimkeyselection.cpp:264
+msgid "_Meta"
+msgstr "_Meta"
+
+#: ism/utils/scimkeyselection.cpp:268
+msgid "S_uper"
+msgstr "S_uper"
+
+#: ism/utils/scimkeyselection.cpp:272
+msgid "_Hyper"
+msgstr "_Hyper"
+
+#: ism/utils/scimkeyselection.cpp:337
+msgid "Please enter a Key Code first."
+msgstr "Veuillez d'abord entrer un code de touche."
+
+#: ism/utils/scimkeyselection.cpp:391
+#, fuzzy
+msgid ""
+"Press a key (or a key combination).\n"
+"This dialog will be closed \n"
+"when the key is released."
+msgstr ""
+"Appuyer sur une touche (ou une combinaison de touches).\n"
+"Cette fenêtre se fermera dès que la touche sera relâchée."
+
+#: ism/utils/scimkeyselection.cpp:395
+msgid "Grabbing a key."
+msgstr "Capture de touche."
+
+#: ism/utils/scimkeyselection.cpp:686
+msgid "Key Selection"
+msgstr "Sélection de Touche"
+
+#: ism/utils/scimtrayicon.c:108
+msgid "Orientation"
+msgstr "Orientation"
+
+#: ism/utils/scimtrayicon.c:109
+msgid "The orientation of the tray."
+msgstr "Orientation du tiroir."
+
+#. Normal Layout
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "NORMAL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "click to enter TEXT"
+msgstr ""
+
+#. Number Layout
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "NUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "click to enter NUMBER"
+msgstr ""
+
+#. Email Layout
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "EMAIL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "click to enter EMAIL"
+msgstr ""
+
+#. URL Layout
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "URL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "click to enter URL"
+msgstr ""
+
+#. Phonenumber Layout
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "PHONENUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "click to enter PHONENUMBER"
+msgstr ""
+
+#. IP Layout
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "IP LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "click to enter IP"
+msgstr ""
+
+#. Month Layout
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "MONTH LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "click to enter MONTH"
+msgstr ""
+
+#. Number Only Layout
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "NUMBERONLY LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "click to enter NUMBERONLY"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:220
+msgid "ise layout"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:51
+msgid "Application template"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:52
+msgid "Click to exit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:156
+msgid "Previous"
+msgstr ""
+
+#. bundle_add(ad->data, "navi_btn_left", NULL);
+#: ism/demos/isf_demo_efl.cpp:158
+#, fuzzy
+msgid "Next"
+msgstr "Texte"
+
+#: ism/demos/isf_demo_efl.cpp:171
+msgid "Quit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:203
+msgid "isf demo"
+msgstr ""
+
+#: ism/demos/isf_entry_event_efl.cpp:151
+msgid "entry event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:220
+msgid "label event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:250
+msgid "ise event demo"
+msgstr ""
+
+#: ism/demos/isf_imcontrol_efl.cpp:375
+msgid "isfimcontrol api"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "Sélection de Touche"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Option"
+msgstr "Options"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "Allemand"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "Français/Clavier"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Sélection de Touche"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "Sélection de Touche"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "Français/Clavier"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "Options"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "Français/Clavier"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amharique"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Toujours"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Options"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Français/Clavier"
+
+#~ msgid "English/European"
+#~ msgstr "Français/Européen"
+
+#~ msgid "RAW CODE"
+#~ msgstr "CODE BRUT"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Racourcis :\n"
+#~ "\n"
+#~ " Ctrl+u :\n"
+#~ " bascule entre encodage Multi-octets et Unicode.\n"
+#~ "\n"
+#~ " Echap :\n"
+#~ " réinitialise la méthode de saisie.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "Etat de la méthode de saisie courante. Cliquer pour la modifier."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Configuration globale"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Configurer des options globales utilisées par tous les modules frontaux, "
+#~ "incluant le frontal X11, GTK IMModule, QT IMModule etc."
+
+#~ msgid "_Trigger:"
+#~ msgstr "_Déclencheur :"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Sélectionner les touches d'activation"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Touches pour activer/désactiver SCIM. Cliquer sur le bouton de droite "
+#~ "pour les modifier."
+
+#~ msgid "Turn _On:"
+#~ msgstr "_Activer:"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Sélectionner les touches d'activation"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Touches pour activer SCIM. Cliquer sur le bouton de droite pour les "
+#~ "modifier."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "Désac_tiver:"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Sélectionner les touches de désactivation"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Touches pour désactiver SCIM. Cliquer sur le bouton de droite pour les "
+#~ "modifier."
+
+#~ msgid "_Next input method:"
+#~ msgstr "Méthode de saisie _Suivante :"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "Sélectionner les touches pour la méthode de saisie suivante"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Touches pour aller à la méthode de saisie suivante. Cliquer sur le bouton "
+#~ "de droite pour les modifier."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "Méthode de saisie _Précédente :"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Sélectionner les touches pour la méthode de saisie précédente"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Touches pour revenir à la méthode de saisie précédente. Cliquer sur le "
+#~ "bouton de droite pour les modifier."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "Accès au _Menu des méthodes de saisie :"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr ""
+#~ "Sélectionner les touches pour accéder au menu des méthodes de saisie"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Touches pour accéder au menu des méthodes de saisie. Cliquer sur le "
+#~ "bouton de droite pour les modifier."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "_Type de Clavier:"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Indiquez ici le type de clavier que vous utilisez afin que les méthodes "
+#~ "de saisie qui dépendent du type de clavier puissent fonctionner "
+#~ "correctement."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "Insérer les chaîne en préédition dans la fenêtre cliente"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, la table de préédition est affichée "
+#~ "directement dans la fenêtre de saisie, et non pas dans une fenêtre "
+#~ "indépendante."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "_Partage de la même méthode de saisie entre toutes les applications"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, la même méthode de saisie peut être "
+#~ "utilisée par toutes les applications en même temps. Dans le cas "
+#~ "contraire, chaque application utilise sa propre méthode de saisie."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Raccourcis"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Ici, vous pouvez activer/désactiver les méthodes de saisie et les jeux de "
+#~ "raccourcis pour les méthodes de saisie."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Services de méthode de saisie installés :"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "Editer les _Raccourcis"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "Editer les raccourcis associés à la méthode de saisie sélectionnée."
+
+#~ msgid "Select _Filters"
+#~ msgstr "Sélectionner les _Filtres"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "Sélectionner les Filtres à associer à cette méthode de saisie."
+
+#~ msgid "_Expand"
+#~ msgstr "_Ouvrir"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Ouvrir toutes les catégories de langage."
+
+#~ msgid "_Collapse"
+#~ msgstr "_Refermer"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Fermer toutes les catégories de langage."
+
+#~ msgid "E_nable All"
+#~ msgstr "Tout Activer"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Activer toutes les méthodes de saisie."
+
+#~ msgid "_Disable All"
+#~ msgstr "Tout Désactiver"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Désactiver toutes les méthodes de saisie."
+
+#~ msgid "Filters"
+#~ msgstr "Filtres"
+
+#~ msgid "Languages"
+#~ msgstr "Langues"
+
+#~ msgid "Description"
+#~ msgstr "Description"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Editer les raccourcis pour %s"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Sélectionner les filtres pour %s"
+
+#~ msgid "Move _Up"
+#~ msgstr "_Monter"
+
+#~ msgid "Move _Down"
+#~ msgstr "_Descendre"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "Un panneau serveur basé sur la librairie GTK+-2.x."
+
+#~ msgid "On demand"
+#~ msgstr "A la demande"
+
+#~ msgid "Never"
+#~ msgstr "Jamais"
+
+#~ msgid "ToolBar"
+#~ msgstr "Barre d'Outils"
+
+#~ msgid "_Show:"
+#~ msgstr "_Afficher"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Aligne_ment automatique"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Affichage icône méthode de _saisie"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "Affichage _nom méthode de saisie"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "_Délai avant masquage :"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Affichage icône d'épin_glage fenêtre"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Afficher l'icône de m_enu"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Affichage icône d'_aide"
+
+#~ msgid "Show _property label"
+#~ msgstr "Affichage label de p_ropriété"
+
+#~ msgid "Input window"
+#~ msgstr "Fenêtre de saisie"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "Table de recherche _embarquée"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "Table de recherche _verticale"
+
+#~ msgid "Misc"
+#~ msgstr "Divers"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Affichage icône barre de _tâches"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Epinglage _fenêtres"
+
+#~ msgid "_Font:"
+#~ msgstr "P_olice :"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Quand l'option \"Toujours\" est sélectionnée, la barre d'outils est "
+#~ "affichée en permanence à l'écran. Quand l'option \"A la demande\" est "
+#~ "sélectionnée, la barre d'outils est affichée uniquement lorsque SCIM est "
+#~ "activé. Quand l'option \"Jamais\" estsélectionnée, la barre d'outils "
+#~ "n'est jamais affichée."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, la barre d'outil s'aligne "
+#~ "automatiquement sur le bord de l'écran."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "La barre d'outils sera masquée automatiquement après l'expiration de ce "
+#~ "délai. Cette option n'est valide que si l'option \"Afficher Toujours\" "
+#~ "est sélectionnée. Une valeur de délai de 0 supprime ce comportement."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, l'icône de la méthode de saisie est "
+#~ "inséré dans la barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, le nom de la méthode de saisie est "
+#~ "inséré dans la barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, l'icône d'épinglage de fenêtre est "
+#~ "inséré dans la barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, l'icône de menu est inséré dans la "
+#~ "barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, l'icône d'aide est inséré dans la "
+#~ "barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, le label des propriétés de la "
+#~ "méthode de saisie est inséré dans la barre d'outils."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, la table de recherche est embarquée "
+#~ "dans la fenêtre de saisie."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, la table de recherche est affichée "
+#~ "verticalement."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, l'icône est inséré dans la barre de "
+#~ "tâches du bureau."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Quand cette option est sélectionnée, les fenêtres de saisie et de "
+#~ "recherche sont maintenues à leur position originale."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "La police de caractères configurée est utilisée dans les fenêtres de "
+#~ "saisie et de recherche."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Police de Caractères"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "Interface"
+
+#~ msgid "IMEngine"
+#~ msgstr "Moteur de Saisie"
+
+#~ msgid "Panel"
+#~ msgstr "Panneau"
+
+#~ msgid "Extra"
+#~ msgstr "Extra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Configuration de la Méthode de Saisie SCIM"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Plateforme Smart Common Input Method</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Utilitaire de Configuration</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Configuration des modules %s.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Etes vous sûr de vouloir quitter SCIM Config. ?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Certains des paramètres de configuration ne peuvent pas être pris en "
+#~ "compte automatiquement. N'oubliez pas de redémarrer SCIM afin que toutes "
+#~ "les nouvelles valeurs de configuration soient prises en compte."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Configuration de SCIM"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr ""
+#~ "Utilitaire de configuration intégré basé sur la librairie GTK Widget."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr ""
+#~ "Utilitaire de configuration de la plateforme \"Smart Common Input Method\""
+
+#~ msgid "SCIM Help"
+#~ msgstr "Aide SCIM"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Input Method"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Epingle la fenêtre de saisie et la barre d'outils."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr ""
+#~ "Affiche une aide succincte sur SCIM et la méthode de saisie courante."
+
+#~ msgid "Show command menu."
+#~ msgstr "Afficher le menu des commandes."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Recharger la Configuration"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Epingler les Fenêtres"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Masquer la Barre d'Outils"
+
+#~ msgid "Help ..."
+#~ msgstr "Aide ..."
+
+#~ msgid "Exit"
+#~ msgstr "Quitter"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "Fr"
--- /dev/null
+# translation of it.po to Italian
+# translation of scim.po to Italian
+# translation of scim_1_0-it.po to Italian
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Federico Zenith <zenith@chemeng.ntnu.no>, 2004, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: it\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 15:30+0900\n"
+"PO-Revision-Date: 2005-12-13 00:36+0100\n"
+"Last-Translator: Federico Zenith <zenith@chemeng.ntnu.no>\n"
+"Language-Team: Italian <kde-i18n-it@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.10.2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ism/src/scim_compose_key.cpp:127 ism/src/scim_imengine.cpp:659
+#: ism/src/scim_panel_agent.cpp:345 ism/src/scim_panel_agent.cpp:4334
+#: ism/src/scim_utility.cpp:701
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1740
+msgid "English/Keyboard"
+msgstr "Inglese/Tastiera"
+
+#. return WideString ();
+#: ism/src/scim_compose_key.cpp:146
+#, fuzzy
+msgid "English input service"
+msgstr "Inglese (americano)"
+
+#: ism/src/scim_utility.cpp:702
+msgid "Amharic"
+msgstr "Amarico"
+
+#: ism/src/scim_utility.cpp:703
+msgid "Arabic"
+msgstr "Arabo"
+
+#: ism/src/scim_utility.cpp:704 ism/src/scim_utility.cpp:893
+msgid "Arabic (Egypt)"
+msgstr "Arabo (Egitto)"
+
+#: ism/src/scim_utility.cpp:705 ism/src/scim_utility.cpp:902
+msgid "Arabic (Lebanon)"
+msgstr "Arabo (Libano)"
+
+#: ism/src/scim_utility.cpp:706
+msgid "Assamese"
+msgstr "Assamese"
+
+#: ism/src/scim_utility.cpp:707 ism/src/scim_utility.cpp:918
+msgid "Azerbaijani"
+msgstr "Azerbaigiano"
+
+#: ism/src/scim_utility.cpp:708
+msgid "Belarusian"
+msgstr "Bielorusso"
+
+#: ism/src/scim_utility.cpp:709 ism/src/scim_utility.cpp:874
+msgid "Bulgarian"
+msgstr "Bulgaro"
+
+#: ism/src/scim_utility.cpp:710 ism/src/scim_utility.cpp:711
+#: ism/src/scim_utility.cpp:913
+msgid "Bengali"
+msgstr "Bengalese"
+
+#: ism/src/scim_utility.cpp:712
+msgid "Bengali (India)"
+msgstr "Bengalese (India)"
+
+#: ism/src/scim_utility.cpp:713
+msgid "Tibetan"
+msgstr "Tibetano"
+
+#: ism/src/scim_utility.cpp:714
+msgid "Bosnian"
+msgstr "Bosniaco"
+
+#: ism/src/scim_utility.cpp:715 ism/src/scim_utility.cpp:853
+msgid "Catalan"
+msgstr "Catalano"
+
+#: ism/src/scim_utility.cpp:716 ism/src/scim_utility.cpp:863
+#: ism/src/scim_keyboard_layout_data.h:4596
+msgid "Czech"
+msgstr "Ceco"
+
+#: ism/src/scim_utility.cpp:717 ism/src/scim_utility.cpp:923
+msgid "Welsh"
+msgstr "Gallese"
+
+#: ism/src/scim_utility.cpp:718 ism/src/scim_utility.cpp:854
+#: ism/src/scim_keyboard_layout_data.h:4598
+msgid "Danish"
+msgstr "Danese"
+
+#: ism/src/scim_utility.cpp:719 ism/src/scim_keyboard_layout_data.h:4606
+msgid "German"
+msgstr "Tedesco"
+
+#: ism/src/scim_utility.cpp:720
+msgid "Divehi"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:721 ism/src/scim_utility.cpp:873
+#: ism/src/scim_keyboard_layout_data.h:4609
+msgid "Greek"
+msgstr "Greco"
+
+#: ism/src/scim_utility.cpp:722
+msgid "English"
+msgstr "Inglese"
+
+#: ism/src/scim_utility.cpp:723 ism/src/scim_utility.cpp:808
+msgid "English (Australian)"
+msgstr "Inglese (australiano)"
+
+#: ism/src/scim_utility.cpp:724 ism/src/scim_utility.cpp:809
+msgid "English (Canadian)"
+msgstr "Inglese (canadese)"
+
+#: ism/src/scim_utility.cpp:725
+msgid "English (British)"
+msgstr "Inglese (britannico)"
+
+#: ism/src/scim_utility.cpp:726
+msgid "English (Ireland)"
+msgstr "Inglese (Irlanda)"
+
+#: ism/src/scim_utility.cpp:727
+msgid "English (American)"
+msgstr "Inglese (americano)"
+
+#: ism/src/scim_utility.cpp:728 ism/src/scim_utility.cpp:729
+#: ism/src/scim_keyboard_layout_data.h:4622
+msgid "Spanish"
+msgstr "Spagnolo"
+
+#: ism/src/scim_utility.cpp:730
+msgid "Spanish (Mexico)"
+msgstr "Spagnolo (Messico)"
+
+#: ism/src/scim_utility.cpp:731 ism/src/scim_utility.cpp:870
+#: ism/src/scim_keyboard_layout_data.h:4601
+msgid "Estonian"
+msgstr "Estone"
+
+#: ism/src/scim_utility.cpp:732 ism/src/scim_utility.cpp:852
+msgid "Basque"
+msgstr "Basco"
+
+#: ism/src/scim_utility.cpp:733
+msgid "Persian"
+msgstr "Persiano"
+
+#: ism/src/scim_utility.cpp:734 ism/src/scim_utility.cpp:857
+#: ism/src/scim_keyboard_layout_data.h:4602
+msgid "Finnish"
+msgstr "Finlandese"
+
+#: ism/src/scim_utility.cpp:735 ism/src/scim_keyboard_layout_data.h:4603
+msgid "French"
+msgstr "Francese"
+
+#: ism/src/scim_utility.cpp:736 ism/src/scim_utility.cpp:921
+msgid "Irish"
+msgstr "Irlandese"
+
+#: ism/src/scim_utility.cpp:737 ism/src/scim_utility.cpp:919
+msgid "Galician"
+msgstr "Galiziano"
+
+#: ism/src/scim_utility.cpp:738 ism/src/scim_utility.cpp:914
+msgid "Gujarati"
+msgstr "Gujarati"
+
+#: ism/src/scim_utility.cpp:739 ism/src/scim_utility.cpp:748
+#: ism/src/scim_utility.cpp:890
+msgid "Hebrew"
+msgstr "Ebraico"
+
+#: ism/src/scim_utility.cpp:740 ism/src/scim_utility.cpp:909
+msgid "Hindi"
+msgstr "Hindi"
+
+#: ism/src/scim_utility.cpp:741 ism/src/scim_keyboard_layout_data.h:4595
+msgid "Croatian"
+msgstr "Croato"
+
+#: ism/src/scim_utility.cpp:742 ism/src/scim_utility.cpp:864
+#: ism/src/scim_keyboard_layout_data.h:4610
+msgid "Hungarian"
+msgstr "Ungherese"
+
+#: ism/src/scim_utility.cpp:743
+#, fuzzy
+msgid "Armenian"
+msgstr "Romeno"
+
+#: ism/src/scim_utility.cpp:744
+msgid "Interlingua"
+msgstr "Interlingua"
+
+#: ism/src/scim_utility.cpp:745
+msgid "Indonesian"
+msgstr "Indonesiano"
+
+#: ism/src/scim_utility.cpp:746 ism/src/scim_utility.cpp:856
+#: ism/src/scim_keyboard_layout_data.h:4628
+msgid "Icelandic"
+msgstr "Islandese"
+
+#: ism/src/scim_utility.cpp:747 ism/src/scim_keyboard_layout_data.h:4611
+msgid "Italian"
+msgstr "Italiano"
+
+#: ism/src/scim_utility.cpp:749 ism/src/scim_utility.cpp:882
+#: ism/src/scim_keyboard_layout_data.h:4612
+msgid "Japanese"
+msgstr "Giapponese"
+
+#: ism/src/scim_utility.cpp:750 ism/src/scim_utility.cpp:917
+#, fuzzy
+msgid "Georgian"
+msgstr "Tedesco"
+
+#: ism/src/scim_utility.cpp:751 ism/src/scim_utility.cpp:875
+msgid "Kazakh"
+msgstr "Kazako"
+
+#: ism/src/scim_utility.cpp:752
+msgid "Cambodian"
+msgstr "Cambogiano"
+
+#: ism/src/scim_utility.cpp:753
+msgid "Kannada"
+msgstr "Kannada"
+
+#: ism/src/scim_utility.cpp:754 ism/src/scim_utility.cpp:883
+msgid "Korean"
+msgstr "Coreano"
+
+#: ism/src/scim_utility.cpp:755
+msgid "Laothian"
+msgstr "Laotiano"
+
+#: ism/src/scim_utility.cpp:756 ism/src/scim_utility.cpp:872
+#: ism/src/scim_keyboard_layout_data.h:4629
+msgid "Lithuanian"
+msgstr "Lituano"
+
+#: ism/src/scim_utility.cpp:757 ism/src/scim_utility.cpp:871
+msgid "Latvian"
+msgstr "Lettone"
+
+#: ism/src/scim_utility.cpp:758 ism/src/scim_utility.cpp:876
+msgid "Macedonian"
+msgstr "Macedone"
+
+#: ism/src/scim_utility.cpp:759 ism/src/scim_utility.cpp:915
+msgid "Malayalam"
+msgstr "Malayalam"
+
+#: ism/src/scim_utility.cpp:760
+msgid "Mongolian"
+msgstr "Mongolo"
+
+#: ism/src/scim_utility.cpp:761 ism/src/scim_utility.cpp:911
+msgid "Marathi"
+msgstr "Marathi"
+
+#: ism/src/scim_utility.cpp:762
+msgid "Malay"
+msgstr "Malese"
+
+#: ism/src/scim_utility.cpp:763
+#, fuzzy
+msgid "Burmese"
+msgstr "Sfoglia"
+
+#: ism/src/scim_utility.cpp:764
+msgid "Nepali"
+msgstr "Nepalese"
+
+#: ism/src/scim_utility.cpp:765 ism/src/scim_keyboard_layout_data.h:4599
+msgid "Dutch"
+msgstr "Olandese"
+
+#: ism/src/scim_utility.cpp:766
+#, fuzzy
+msgid "Norwegian (Nynorsk)"
+msgstr "Norvegese (nynorsk)"
+
+#: ism/src/scim_utility.cpp:767
+#, fuzzy
+msgid "Norwegian (Bokmal)"
+msgstr "Norvegese (bokmål)"
+
+#: ism/src/scim_utility.cpp:768
+msgid "Oriya"
+msgstr "Oriya"
+
+#: ism/src/scim_utility.cpp:769 ism/src/scim_utility.cpp:916
+msgid "Punjabi"
+msgstr "Punjabi"
+
+#: ism/src/scim_utility.cpp:770 ism/src/scim_utility.cpp:865
+#: ism/src/scim_keyboard_layout_data.h:4614
+msgid "Polish"
+msgstr "Polacco"
+
+#: ism/src/scim_utility.cpp:771 ism/src/scim_utility.cpp:773
+#: ism/src/scim_keyboard_layout_data.h:4615
+msgid "Portuguese"
+msgstr "Portoghese"
+
+#: ism/src/scim_utility.cpp:772 ism/src/scim_keyboard_layout_data.h:4616
+msgid "Portuguese (Brazil)"
+msgstr "Portoghese (Brasile)"
+
+#: ism/src/scim_utility.cpp:774 ism/src/scim_utility.cpp:866
+msgid "Romanian"
+msgstr "Romeno"
+
+#: ism/src/scim_utility.cpp:775 ism/src/scim_utility.cpp:877
+#: ism/src/scim_keyboard_layout_data.h:4618
+msgid "Russian"
+msgstr "Russo"
+
+#: ism/src/scim_utility.cpp:776 ism/src/scim_utility.cpp:922
+msgid "Sinhala"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:777 ism/src/scim_utility.cpp:868
+#: ism/src/scim_keyboard_layout_data.h:4619
+msgid "Slovak"
+msgstr "Slovacco"
+
+#: ism/src/scim_utility.cpp:778 ism/src/scim_utility.cpp:869
+#: ism/src/scim_keyboard_layout_data.h:4621
+msgid "Slovenian"
+msgstr "Sloveno"
+
+#: ism/src/scim_utility.cpp:779
+msgid "Albanian"
+msgstr "Albanese"
+
+#: ism/src/scim_utility.cpp:780 ism/src/scim_utility.cpp:781
+#: ism/src/scim_utility.cpp:782
+msgid "Serbian"
+msgstr "Serbo"
+
+#: ism/src/scim_utility.cpp:783 ism/src/scim_utility.cpp:785
+#: ism/src/scim_utility.cpp:861 ism/src/scim_keyboard_layout_data.h:4625
+msgid "Swedish"
+msgstr "Svedese"
+
+#: ism/src/scim_utility.cpp:784 ism/src/scim_utility.cpp:862
+msgid "Swedish (Finland)"
+msgstr "Svedese (Finlandia)"
+
+#: ism/src/scim_utility.cpp:786 ism/src/scim_utility.cpp:912
+msgid "Tamil"
+msgstr "Tamil"
+
+#: ism/src/scim_utility.cpp:787 ism/src/scim_utility.cpp:910
+msgid "Telugu"
+msgstr "Telugu"
+
+#: ism/src/scim_utility.cpp:788 ism/src/scim_utility.cpp:889
+msgid "Thai"
+msgstr "Tailandese"
+
+#: ism/src/scim_utility.cpp:789 ism/src/scim_utility.cpp:880
+#: ism/src/scim_keyboard_layout_data.h:4626
+msgid "Turkish"
+msgstr "Turco"
+
+#: ism/src/scim_utility.cpp:790
+msgid "Uighur"
+msgstr "Uighur"
+
+#: ism/src/scim_utility.cpp:791 ism/src/scim_utility.cpp:879
+#: ism/src/scim_keyboard_layout_data.h:4630
+msgid "Ukrainian"
+msgstr "Ucraino"
+
+#: ism/src/scim_utility.cpp:792 ism/src/scim_utility.cpp:907
+msgid "Urdu"
+msgstr "Urdu"
+
+#: ism/src/scim_utility.cpp:793
+msgid "Uzbek"
+msgstr "Uzbeko"
+
+#: ism/src/scim_utility.cpp:794 ism/src/scim_utility.cpp:908
+msgid "Vietnamese"
+msgstr "Vietnamita"
+
+#: ism/src/scim_utility.cpp:795
+msgid "Walloon"
+msgstr "Vallone"
+
+#: ism/src/scim_utility.cpp:796 ism/src/scim_utility.cpp:797
+msgid "Yiddish"
+msgstr "Yiddish"
+
+#: ism/src/scim_utility.cpp:798
+msgid "Chinese"
+msgstr "Cinese"
+
+#: ism/src/scim_utility.cpp:799 ism/src/scim_utility.cpp:801
+#, fuzzy
+msgid "Chinese (Simplified)"
+msgstr "Cinese (semplificato)"
+
+#: ism/src/scim_utility.cpp:800 ism/src/scim_utility.cpp:802
+#, fuzzy
+msgid "Chinese (Traditional)"
+msgstr "Cinese (tradizionale)"
+
+#: ism/src/scim_utility.cpp:804
+msgid "Dutch (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:805
+#, fuzzy
+msgid "Dutch (Belgian)"
+msgstr "Belga"
+
+#: ism/src/scim_utility.cpp:806
+#, fuzzy
+msgid "English (United States)"
+msgstr "Inglese (USA)"
+
+#: ism/src/scim_utility.cpp:807
+#, fuzzy
+msgid "English (United Kingdom)"
+msgstr "Inglese (canadese)"
+
+#: ism/src/scim_utility.cpp:810
+#, fuzzy
+msgid "English (New Zealand)"
+msgstr "Inglese (Irlanda)"
+
+#: ism/src/scim_utility.cpp:811
+#, fuzzy
+msgid "English (Irish)"
+msgstr "Inglese (britannico)"
+
+#: ism/src/scim_utility.cpp:812
+#, fuzzy
+msgid "English (South Africa)"
+msgstr "Inglese (americano)"
+
+#: ism/src/scim_utility.cpp:813
+#, fuzzy
+msgid "English (Jamaica)"
+msgstr "Inglese (canadese)"
+
+#: ism/src/scim_utility.cpp:814
+#, fuzzy
+msgid "English (Belize)"
+msgstr "Inglese (britannico)"
+
+#: ism/src/scim_utility.cpp:815
+#, fuzzy
+msgid "English (Trinidad)"
+msgstr "Inglese (britannico)"
+
+#: ism/src/scim_utility.cpp:816
+#, fuzzy
+msgid "English (Zimbabwe)"
+msgstr "Inglese (canadese)"
+
+#: ism/src/scim_utility.cpp:817
+#, fuzzy
+msgid "English (Philippines)"
+msgstr "Inglese (britannico)"
+
+#: ism/src/scim_utility.cpp:818
+#, fuzzy
+msgid "French (Standard)"
+msgstr "Francese (canadese)"
+
+#: ism/src/scim_utility.cpp:819
+#, fuzzy
+msgid "French (Belgian)"
+msgstr "Francese (canadese)"
+
+#: ism/src/scim_utility.cpp:820 ism/src/scim_keyboard_layout_data.h:4604
+msgid "French (Canadian)"
+msgstr "Francese (canadese)"
+
+#: ism/src/scim_utility.cpp:821
+#, fuzzy
+msgid "French (Swiss)"
+msgstr "Tedesco (svizzero)"
+
+#: ism/src/scim_utility.cpp:822
+msgid "French (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:823
+#, fuzzy
+msgid "French (Monaco)"
+msgstr "Francese (canadese)"
+
+#: ism/src/scim_utility.cpp:824
+#, fuzzy
+msgid "German (Standard)"
+msgstr "Tedesco (con tasti morti)"
+
+#: ism/src/scim_utility.cpp:825 ism/src/scim_keyboard_layout_data.h:4608
+msgid "German (Swiss)"
+msgstr "Tedesco (svizzero)"
+
+#: ism/src/scim_utility.cpp:826
+#, fuzzy
+msgid "German (Austrian)"
+msgstr "Inglese (australiano)"
+
+#: ism/src/scim_utility.cpp:827
+msgid "German (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:828
+#, fuzzy
+msgid "German (Liechtenstein)"
+msgstr "Tedesco (svizzero)"
+
+#: ism/src/scim_utility.cpp:829
+msgid "Italian (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:830
+#, fuzzy
+msgid "Italian (Swiss)"
+msgstr "Tedesco (svizzero)"
+
+#: ism/src/scim_utility.cpp:831
+msgid "Portuguese (Brazilian)"
+msgstr "Portoghese (brasiliano)"
+
+#: ism/src/scim_utility.cpp:832
+#, fuzzy
+msgid "Portuguese (Standard)"
+msgstr "Portoghese (Brasile)"
+
+#: ism/src/scim_utility.cpp:833
+#, fuzzy
+msgid "Spanish (Traditional Sort)"
+msgstr "Spagnolo (America latina)"
+
+#: ism/src/scim_utility.cpp:834
+#, fuzzy
+msgid "Spanish (Mexican)"
+msgstr "Spagnolo (Messico)"
+
+#: ism/src/scim_utility.cpp:835
+#, fuzzy
+msgid "Spanish (Guatemala)"
+msgstr "Spagnolo (America latina)"
+
+#: ism/src/scim_utility.cpp:836
+#, fuzzy
+msgid "Spanish (Costa Rica)"
+msgstr "Spagnolo (America latina)"
+
+#: ism/src/scim_utility.cpp:837
+#, fuzzy
+msgid "Spanish (Panama)"
+msgstr "Spagnolo (America latina)"
+
+#: ism/src/scim_utility.cpp:838
+#, fuzzy
+msgid "Spanish (Dominican Republic)"
+msgstr "Spagnolo (America latina)"
+
+#: ism/src/scim_utility.cpp:839
+#, fuzzy
+msgid "Spanish (Venezuela)"
+msgstr "Spagnolo (Messico)"
+
+#: ism/src/scim_utility.cpp:840
+#, fuzzy
+msgid "Spanish (Colombia)"
+msgstr "Spagnolo (Messico)"
+
+#: ism/src/scim_utility.cpp:841
+#, fuzzy
+msgid "Spanish (Peru)"
+msgstr "Spagnolo (Messico)"
+
+#: ism/src/scim_utility.cpp:842
+#, fuzzy
+msgid "Spanish (Argentina)"
+msgstr "Spagnolo (Messico)"
+
+#: ism/src/scim_utility.cpp:843
+#, fuzzy
+msgid "Spanish (Ecuador)"
+msgstr "Spagnolo (Messico)"
+
+#: ism/src/scim_utility.cpp:844
+#, fuzzy
+msgid "Spanish (Chile)"
+msgstr "Spagnolo (Messico)"
+
+#: ism/src/scim_utility.cpp:845
+#, fuzzy
+msgid "Spanish (Uruguay)"
+msgstr "Spagnolo (Messico)"
+
+#: ism/src/scim_utility.cpp:846
+#, fuzzy
+msgid "Spanish (Paraguay)"
+msgstr "Spagnolo (CP 850)"
+
+#: ism/src/scim_utility.cpp:847
+#, fuzzy
+msgid "Spanish (Bolivia)"
+msgstr "Spagnolo (Messico)"
+
+#: ism/src/scim_utility.cpp:848
+msgid "Spanish (El Salvador)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:849
+#, fuzzy
+msgid "Spanish (Honduras)"
+msgstr "Spagnolo (Messico)"
+
+#: ism/src/scim_utility.cpp:850
+#, fuzzy
+msgid "Spanish (Nicaragua)"
+msgstr "Spagnolo (Messico)"
+
+#: ism/src/scim_utility.cpp:851
+#, fuzzy
+msgid "Spanish (Puerto Rico)"
+msgstr "Spagnolo (Messico)"
+
+#: ism/src/scim_utility.cpp:855
+msgid "Afrikaans"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:858
+#, fuzzy
+msgid "Malay (Malaysia)"
+msgstr "Malayalam"
+
+#: ism/src/scim_utility.cpp:859
+msgid "Malay (Brunei Darussalam)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:860 ism/src/scim_keyboard_layout_data.h:4613
+msgid "Norwegian"
+msgstr "Norvegese"
+
+#: ism/src/scim_utility.cpp:867
+#, fuzzy
+msgid "Serbian (Latin)"
+msgstr "Serbo"
+
+#: ism/src/scim_utility.cpp:878
+msgid "Serbian (Cyrillic)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:881
+msgid "Uzbek (Latin)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:884
+#, fuzzy
+msgid "Chinese (Taiwan)"
+msgstr "Cinese (tradizionale)"
+
+#: ism/src/scim_utility.cpp:885
+#, fuzzy
+msgid "Chinese (Hong Kong)"
+msgstr "Cinese (tradizionale)"
+
+#: ism/src/scim_utility.cpp:886
+#, fuzzy
+msgid "Chinese (Macau)"
+msgstr "Cinese (tradizionale)"
+
+#: ism/src/scim_utility.cpp:887
+#, fuzzy
+msgid "Chinese (PRC)"
+msgstr "Cinese"
+
+#: ism/src/scim_utility.cpp:888
+#, fuzzy
+msgid "Chinese (Singapore)"
+msgstr "Cinese (semplificato)"
+
+#: ism/src/scim_utility.cpp:891
+msgid "Arabic (Saudi Arabia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:892
+#, fuzzy
+msgid "Arabic (Iraq)"
+msgstr "Arabo (Libano)"
+
+#: ism/src/scim_utility.cpp:894
+#, fuzzy
+msgid "Arabic (Libya)"
+msgstr "Arabo (Libano)"
+
+#: ism/src/scim_utility.cpp:895
+#, fuzzy
+msgid "Arabic (Algeria)"
+msgstr "Arabo (Libano)"
+
+#: ism/src/scim_utility.cpp:896
+#, fuzzy
+msgid "Arabic (Morocco)"
+msgstr "Arabo (Libano)"
+
+#: ism/src/scim_utility.cpp:897
+#, fuzzy
+msgid "Arabic (Tunisia)"
+msgstr "Arabo (Libano)"
+
+#: ism/src/scim_utility.cpp:898
+#, fuzzy
+msgid "Arabic (Oman)"
+msgstr "Arabo (Libano)"
+
+#: ism/src/scim_utility.cpp:899
+#, fuzzy
+msgid "Arabic (Yemen)"
+msgstr "Arabo (Libano)"
+
+#: ism/src/scim_utility.cpp:900
+#, fuzzy
+msgid "Arabic (Syria)"
+msgstr "Arabo (Egitto)"
+
+#: ism/src/scim_utility.cpp:901
+#, fuzzy
+msgid "Arabic (Jordan)"
+msgstr "Arabo (Libano)"
+
+#: ism/src/scim_utility.cpp:903
+#, fuzzy
+msgid "Arabic (Kuwait)"
+msgstr "Arabo (Egitto)"
+
+#: ism/src/scim_utility.cpp:904
+#, fuzzy
+msgid "Arabic (UAE)"
+msgstr "Arabo (Egitto)"
+
+#: ism/src/scim_utility.cpp:905
+#, fuzzy
+msgid "Arabic (Bahrain)"
+msgstr "Arabo (Libano)"
+
+#: ism/src/scim_utility.cpp:906
+#, fuzzy
+msgid "Arabic (Qatar)"
+msgstr "Arabo (Egitto)"
+
+#: ism/src/scim_utility.cpp:920
+msgid "Hausa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:924
+msgid "Xhosa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:925
+msgid "Yoruba"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:926
+msgid "Zulu"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:1024
+msgid "Other"
+msgstr "Altro"
+
+#: ism/src/scim_keyboard_layout_data.h:4592
+#: ism/modules/imengine/scim_socket_imengine.cpp:408
+#: ism/modules/imengine/scim_socket_imengine.cpp:438
+#: ism/modules/imengine/scim_socket_imengine.cpp:523
+#: ism/modules/imengine/scim_socket_imengine.cpp:553
+#: ism/modules/imengine/scim_socket_imengine.cpp:583
+msgid "Unknown"
+msgstr "Sconosciuto"
+
+#: ism/src/scim_keyboard_layout_data.h:4593
+msgid "English (US)"
+msgstr "Inglese (USA)"
+
+#: ism/src/scim_keyboard_layout_data.h:4594
+msgid "Belgian"
+msgstr "Belga"
+
+#: ism/src/scim_keyboard_layout_data.h:4597
+msgid "Czech (qwerty)"
+msgstr "Ceco (qwerty)"
+
+#: ism/src/scim_keyboard_layout_data.h:4600
+msgid "Dvorak"
+msgstr "Dvorak"
+
+#: ism/src/scim_keyboard_layout_data.h:4605
+msgid "French (Switzerland)"
+msgstr "Francese (Svizzera)"
+
+#: ism/src/scim_keyboard_layout_data.h:4607
+msgid "German (with deadkeys)"
+msgstr "Tedesco (con tasti morti)"
+
+#: ism/src/scim_keyboard_layout_data.h:4617
+msgid "Portuguese (Brazil US accents)"
+msgstr "Portoghese (Brasile con accenti US)"
+
+#: ism/src/scim_keyboard_layout_data.h:4620
+msgid "Slovak (qwerty)"
+msgstr "Slovacco (qwerty)"
+
+#: ism/src/scim_keyboard_layout_data.h:4623
+msgid "Spanish (CP 850)"
+msgstr "Spagnolo (CP 850)"
+
+#: ism/src/scim_keyboard_layout_data.h:4624
+msgid "Spanish (Latin America)"
+msgstr "Spagnolo (America latina)"
+
+#: ism/src/scim_keyboard_layout_data.h:4627
+msgid "English (UK)"
+msgstr "Inglese (GB)"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:57
+msgid "Simplified-Traditional Chinese Conversion"
+msgstr "Conversione tra cinese semplificato e tradizionale"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:60
+msgid "Convert between Simplified Chinese and Traditional Chinese"
+msgstr "Converti tra cinese semplificato e cinese tradizionale"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:71
+msgid "SC-TC"
+msgstr "CS-CT"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:73
+#: ism/modules/filter/scim_sctc_filter.cpp:78
+msgid "Simplified-Traditional Chinese conversion"
+msgstr "Conversione tra cinese semplificato e tradizionale"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:76
+msgid "No Conversion"
+msgstr "Senza conversione"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:81
+msgid "Simplified to Traditional"
+msgstr "Da semplificato a tradizionale"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:83
+msgid "Convert Simplified Chinese to Traditional Chinese"
+msgstr "Converti cinese semplificato in cinese tradizionale"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:86
+msgid "Traditional to Simplified"
+msgstr "Da tradizionale a semplificato"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:88
+msgid "Convert Traditional Chinese to Simplified Chinese"
+msgstr "Converti cinese tradizionale in cinese semplificato"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:300
+msgid "James Su <suzhe@tsinghua.org.cn>"
+msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:425
+#: ism/modules/filter/scim_sctc_filter.cpp:555
+#: ism/modules/filter/scim_sctc_filter.cpp:571
+msgid "SC->TC"
+msgstr "CS->CT"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:431
+#: ism/modules/filter/scim_sctc_filter.cpp:559
+#: ism/modules/filter/scim_sctc_filter.cpp:575
+msgid "TC->SC"
+msgstr "CT->CS"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1693
+msgid "Smart Common Input Method platform "
+msgstr "Piattaforma del metodo intelligente di inserimento comune"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1695
+msgid ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+msgstr ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1700
+msgid ""
+":\n"
+"\n"
+msgstr ""
+":\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1703
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:963
+msgid "Enable"
+msgstr "Abilita"
+
+#. gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+#. gtk_tree_view_column_set_fixed_width (column, 232);
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:984
+msgid "Name"
+msgstr "Nome"
+
+#: ism/utils/scimstringview.c:201
+msgid "Cursor Position"
+msgstr "Posizione del cursore"
+
+#: ism/utils/scimstringview.c:202
+msgid "The current position of the insertion cursor in chars."
+msgstr "La posizione attuale del cursore di inserimento in caratteri."
+
+#: ism/utils/scimstringview.c:211
+msgid "Maximum length"
+msgstr "Lunghezza massima"
+
+#: ism/utils/scimstringview.c:212
+msgid "Maximum number of characters for this string view. Zero if no maximum."
+msgstr ""
+"Il numero massimo di caratteri per questa vista stringhe. Zero se non ce n'è."
+
+#: ism/utils/scimstringview.c:221
+msgid "Maximum width"
+msgstr "Larghezza massima"
+
+#: ism/utils/scimstringview.c:222
+msgid "Maximum width of this string view."
+msgstr "Larghezza massima di questa vista stringhe."
+
+#: ism/utils/scimstringview.c:231
+msgid "Has Frame"
+msgstr "Ha cornice"
+
+#: ism/utils/scimstringview.c:232
+msgid "FALSE removes outside bevel from string view."
+msgstr "Se falso, rimuove la cornice esterna dalla vista stringhe."
+
+#: ism/utils/scimstringview.c:239
+msgid "Draw cursor"
+msgstr "Disegna cursore"
+
+#: ism/utils/scimstringview.c:240
+msgid "TRUE draw blinking cursor."
+msgstr "Se vero, disegna un cursore lampeggiante."
+
+#: ism/utils/scimstringview.c:247
+msgid "Auto move cursor"
+msgstr "Spostamento automatico del cursore"
+
+#: ism/utils/scimstringview.c:248
+msgid "TRUE auto move cursor position when mouse clicking."
+msgstr ""
+"Se vero, sposta automaticamente la posizione del cursore quando si fa clic "
+"con il mouse."
+
+#: ism/utils/scimstringview.c:255
+#, fuzzy
+msgid "Forward button press/release event"
+msgstr "Inoltra evento di pressione di pulsante"
+
+#: ism/utils/scimstringview.c:256
+#, fuzzy
+msgid "TRUE forward button press/release event to user program."
+msgstr "Se vero, inoltra evento di pressione di pulsante al programma utente."
+
+#: ism/utils/scimstringview.c:263
+msgid "Auto resize the widget to fit the string"
+msgstr "Ridimensiona automaticamente l'oggetto per adattarsi alla stringa"
+
+#: ism/utils/scimstringview.c:264
+msgid "TRUE Auto resize on."
+msgstr "Se vero, attiva il ridimensionamento automatico."
+
+#: ism/utils/scimstringview.c:271
+msgid "Emit move_cursor signal when press/release the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:272
+#, fuzzy
+msgid "TRUE Emit move_cursor signal when press the string."
+msgstr ""
+"Se vero, sposta automaticamente la posizione del cursore quando si fa clic "
+"con il mouse."
+
+#: ism/utils/scimstringview.c:279
+msgid "Width in chars"
+msgstr "Larghezza in caratteri"
+
+#: ism/utils/scimstringview.c:280
+msgid "Number of characters to leave space for in the string view."
+msgstr "Numero di caratteri per cui lasciare spazio nella vista stringhe."
+
+#: ism/utils/scimstringview.c:289
+msgid "Scroll offset"
+msgstr "Scostamento dello scorrimento"
+
+#: ism/utils/scimstringview.c:290
+msgid "Number of pixels of the string view scrolled off the screen to the left"
+msgstr "Numero di pixel nella vista stringhe scorsi a sinistra dello schermo"
+
+#: ism/utils/scimstringview.c:299
+msgid "Text"
+msgstr "Testo"
+
+#: ism/utils/scimstringview.c:300
+msgid "The contents of the string view"
+msgstr "Il contenuti della vista stringhe"
+
+#: ism/utils/scimkeyselection.cpp:161
+msgid "Selected _Keys:"
+msgstr "Tasti sele_zionati:"
+
+#: ism/utils/scimkeyselection.cpp:206
+msgid "Key Code:"
+msgstr "Codice del tasto:"
+
+#: ism/utils/scimkeyselection.cpp:224
+#, fuzzy
+msgid "....."
+msgstr "..."
+
+#: ism/utils/scimkeyselection.cpp:229
+msgid "Modifiers:"
+msgstr "Modificatori:"
+
+#: ism/utils/scimkeyselection.cpp:242
+msgid "_Ctrl"
+msgstr "_Ctrl"
+
+#: ism/utils/scimkeyselection.cpp:246
+msgid "A_lt"
+msgstr "A_lt"
+
+#: ism/utils/scimkeyselection.cpp:250
+msgid "_Shift"
+msgstr "_Shift"
+
+#: ism/utils/scimkeyselection.cpp:254
+msgid "_Release"
+msgstr "_Rilascio"
+
+#: ism/utils/scimkeyselection.cpp:264
+msgid "_Meta"
+msgstr "_Meta"
+
+#: ism/utils/scimkeyselection.cpp:268
+msgid "S_uper"
+msgstr "S_uper"
+
+#: ism/utils/scimkeyselection.cpp:272
+msgid "_Hyper"
+msgstr "_Hyper"
+
+#: ism/utils/scimkeyselection.cpp:337
+msgid "Please enter a Key Code first."
+msgstr "Inserisci prima un codice del tasto."
+
+#: ism/utils/scimkeyselection.cpp:391
+#, fuzzy
+msgid ""
+"Press a key (or a key combination).\n"
+"This dialog will be closed \n"
+"when the key is released."
+msgstr ""
+"Premi un tasto (o una combinazione di tasti).\n"
+"Questa finestra sarà chiusa quando il tasto sarà rilasciato."
+
+#: ism/utils/scimkeyselection.cpp:395
+msgid "Grabbing a key."
+msgstr "Cattura di un tasto."
+
+#: ism/utils/scimkeyselection.cpp:686
+msgid "Key Selection"
+msgstr "Selezione dei tasti"
+
+#: ism/utils/scimtrayicon.c:108
+msgid "Orientation"
+msgstr "Orientazione"
+
+#: ism/utils/scimtrayicon.c:109
+msgid "The orientation of the tray."
+msgstr "L'orientazione del vassoio."
+
+#. Normal Layout
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "NORMAL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "click to enter TEXT"
+msgstr ""
+
+#. Number Layout
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "NUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "click to enter NUMBER"
+msgstr ""
+
+#. Email Layout
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "EMAIL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "click to enter EMAIL"
+msgstr ""
+
+#. URL Layout
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "URL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "click to enter URL"
+msgstr ""
+
+#. Phonenumber Layout
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "PHONENUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "click to enter PHONENUMBER"
+msgstr ""
+
+#. IP Layout
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "IP LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "click to enter IP"
+msgstr ""
+
+#. Month Layout
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "MONTH LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "click to enter MONTH"
+msgstr ""
+
+#. Number Only Layout
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "NUMBERONLY LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "click to enter NUMBERONLY"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:220
+msgid "ise layout"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:51
+msgid "Application template"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:52
+msgid "Click to exit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:156
+msgid "Previous"
+msgstr ""
+
+#. bundle_add(ad->data, "navi_btn_left", NULL);
+#: ism/demos/isf_demo_efl.cpp:158
+#, fuzzy
+msgid "Next"
+msgstr "Testo"
+
+#: ism/demos/isf_demo_efl.cpp:171
+msgid "Quit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:203
+msgid "isf demo"
+msgstr ""
+
+#: ism/demos/isf_entry_event_efl.cpp:151
+msgid "entry event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:220
+msgid "label event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:250
+msgid "ise event demo"
+msgstr ""
+
+#: ism/demos/isf_imcontrol_efl.cpp:375
+msgid "isfimcontrol api"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "Selezione dei tasti"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Option"
+msgstr "Opzioni"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+#, fuzzy
+msgid "Auto capitalization"
+msgstr "Divisione automatica:"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+#, fuzzy
+msgid "Auto period"
+msgstr "Divisione automatica:"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "Generico"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "Inglese/Tastiera"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Selezione dei tasti"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "Selezione dei tasti"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "Inglese/Tastiera"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "Opzioni"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "Inglese/Tastiera"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amarico"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Sempre"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Opzioni"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Inglese/Tastiera"
+
+#~ msgid "English/European"
+#~ msgstr "Inglese/Europeo"
+
+#~ msgid "RAW CODE"
+#~ msgstr "CODICE GREZZO"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Tasti rapidi:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " passa tra la codifica multibyte e Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reimposta il metodo di inserimento.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "Lo stato del metodo di inserimento attuale. Fai clic per cambiarlo."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Configurazione globale"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Configura le opzioni globali usate da tutti i moduli di interfaccia, "
+#~ "inclusi l'interfaccia X11, i moduli di inserimento di GTK e QT, ecc."
+
+#~ msgid "_Trigger:"
+#~ msgstr "A_ttivatore:"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Seleziona i tasti di attivazione"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per accendere o spegnere il metodo di "
+#~ "inserimento. Fai clic sul pulsante a destra per modificarle."
+
+#~ msgid "Turn _On:"
+#~ msgstr "_Accendi:"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Seleziona i tasti di accensione"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per far partire il metodo di inserimento. Fai "
+#~ "clic sul pulsante a destra per modificarle."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "_Spegni:"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Seleziona i tasti di spegnimento"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per far fermare il metodo di inserimento. Fai "
+#~ "clic sul pulsante a destra per modificarle."
+
+#~ msgid "_Next input method:"
+#~ msgstr "Metodo di i_nserimento successivo:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "Seleziona i tasti del metodo di inserimento successivo"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per passare al metodo di inserimento successivo. "
+#~ "Fai clic sul pulsante a destra per modificarle."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "Metodo di inserimento _precedente:"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Seleziona i tasti del metodo di inserimento precedente"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per passare al metodo di inserimento precedente. "
+#~ "Fai clic sul pulsante a destra per modificarle."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "_Mostra il menu del metodo di inserimento:"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "Seleziona i tasti del menu del metodo di inserimento"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per mostrare il menu del metodo di inserimento. "
+#~ "Fai clic sul pulsante sulla destra per modificarle."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "Schema della _tastiera:"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Dovresti scegliere qui la tastiera che usi adesso, in modo che i metodi "
+#~ "di inserimento, che ne dipendono, funzionino correttamente."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "Incorpora la pr_emodifica delle stringhe nella finestra del client"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la stringa di premodifica sarà visualizzata "
+#~ "direttamente nella finestra di inserimento del client, piuttosto che in "
+#~ "una finestra libera."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "Condividi lo _stesso metodo di inserimento in tutte le applicazioni"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, si potrà usare un solo metodo di inserimento "
+#~ "in tutte le applicazioni allo stesso tempo. Altrimenti, ogni applicazione "
+#~ "potrà usare un metodo di inserimento diverso."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Tasti rapidi"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Qui puoi abilitare o disabilitare i metodi di inserimento e impostare i "
+#~ "loro tasti rapidi."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "I servizi di metodo di inserimento installati:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "Modi_fica tasti rapidi"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr ""
+#~ "Modifica i tasti rapidi associati con il metodo di inserimento "
+#~ "selezionato."
+
+#~ msgid "Select _Filters"
+#~ msgstr "Seleziona _filtri"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr ""
+#~ "Seleziona i filtri che saranno allegati a questo metodo di inserimento."
+
+#~ msgid "_Expand"
+#~ msgstr "_Espandi"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Espandi tutte le categorie delle lingue."
+
+#~ msgid "_Collapse"
+#~ msgstr "_Contrai"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Contrai tutte le categorie delle lingue."
+
+#~ msgid "E_nable All"
+#~ msgstr "A_bilita tutti"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Abilita tutti i metodi di inserimento."
+
+#~ msgid "_Disable All"
+#~ msgstr "_Disabilita tutti"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Disabilita tutti i metodi di inserimento."
+
+#~ msgid "Filters"
+#~ msgstr "Filtri"
+
+#~ msgid "Languages"
+#~ msgstr "Lingue"
+
+#~ msgid "Description"
+#~ msgstr "Descrizione"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Modifica i tasti rapidi per: %s"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Seleziona i filtri per: %s"
+
+#~ msgid "Move _Up"
+#~ msgstr "Sposta in s_u"
+
+#~ msgid "Move _Down"
+#~ msgstr "Sposta in _giù"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "Un demone di pannello basato sulle librerie GTK+-2.x."
+
+#~ msgid "On demand"
+#~ msgstr "A richiesta"
+
+#~ msgid "Never"
+#~ msgstr "Mai"
+
+#~ msgid "ToolBar"
+#~ msgstr "Barra degli strumenti"
+
+#~ msgid "_Show:"
+#~ msgstr "Mo_stra:"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Agga_ncia automaticamente"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Mostra icona del metodo di _inserimento"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "Mostra nome del metodo di ins_erimento"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "Nasc_ondi scadenza:"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Mostra icona dell'agganciamen_to"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Mostra icona del m_enu"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Mostra icona dell'ai_uto"
+
+#~ msgid "Show _property label"
+#~ msgstr "Mostra etichetta delle _proprietà"
+
+#~ msgid "Input window"
+#~ msgstr "Finestra di inserimento"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "Tabella di riferi_mento incorporata"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "Tabella di riferimento _verticale"
+
+#~ msgid "Misc"
+#~ msgstr "Varie"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Mostra icona del vasso_io"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Aggancia _finestre"
+
+#~ msgid "_Font:"
+#~ msgstr "_Carattere:"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Se l'opzione \"Sempre\" è segnata, la barra degli strumenti sarà sempre "
+#~ "visualizzata sullo schermo. Se è segnata l'opzione \"A richiesta\", sarà "
+#~ "mostrata solo quando viene attivato SCIM. Se è segnata l'opzione \"Mai\", "
+#~ "non sarà mai mostrata."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la barra degli strumenti sarà agganciata al "
+#~ "bordo dello schermo."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "La barra degli strumenti sarà nascosta dopo che sarà passato questo "
+#~ "tempo. Questa opzione è valida solo quando \"Visualizza sempre\" è "
+#~ "segnato. Imposta a zero per disabilitare questo comportamento."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'icona del metodo di inserimento sarà "
+#~ "mostrata nella barra degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, il nome del metodo di inserimento sarà "
+#~ "mostrato nella barra degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'icona dell'agganciamento sarà mostrata "
+#~ "sulla barra degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'icona del menu sarà mostrata nella barra "
+#~ "degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'icona dell'aiuto sarà mostrata nella barra "
+#~ "degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'etichetta di testo del metodo di "
+#~ "inserimento sarà mostrata nella barra degli strumenti."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la tabella di riferimento sarà incorporata "
+#~ "nella finestra di inserimento."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la tabella di riferimento sarà mostrata "
+#~ "verticalmente."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, l'icona del vassoio sarà mostrata nel "
+#~ "pannello del desktop."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la barra degli strumenti, le finestre di "
+#~ "inserimento e della tabella di riferimento saranno agganciate alla loro "
+#~ "posizione originale."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "L'impostazione del carattere sarà usata nelle finestre di inserimento e "
+#~ "della tabella di riferimento."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Seleziona il carattere dell'interfaccia"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "Interfaccia"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMEngine"
+
+#~ msgid "Panel"
+#~ msgstr "Pannello"
+
+#~ msgid "Extra"
+#~ msgstr "Extra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Configurazione del metodo di inserimento SCIM"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ "<span size=\"20000\">Piattaforma del metodo di inserimento comune "
+#~ "intelligente</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Programma di configurazione GUI</"
+#~ "span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">La configurazione per %s moduli.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Sei sicuro di uscire dalla configurazione di SCIM?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Non tutte le configurazioni possono essere ricaricate al volo. Non "
+#~ "dimenticarti di riavviare SCIM per permettere a tutte le nuove "
+#~ "configurazioni di avere effetto."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Configurazione di SCIM"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr ""
+#~ "Strumento di configurazione integrato basato sulla libreria di oggetti "
+#~ "GTK."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr ""
+#~ "Programma di configurazione per il metodo inserimento comune intelligente"
+
+#~ msgid "SCIM Help"
+#~ msgstr "Aiuto di SCIM"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Metodo inserimento comune intelligente"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr ""
+#~ "Aggancia o sgancia la finestra di inserimento e la barra degli strumenti."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr ""
+#~ "Visualizza un breve aiuto su SCIM e il metodo di inserimento attuale."
+
+#~ msgid "Show command menu."
+#~ msgstr "Mostra menu dei comandi."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Ricarica configurazione"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Aggancia finestre"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Nascondi la barra degli strumenti"
+
+#~ msgid "Help ..."
+#~ msgstr "Aiuto..."
+
+#~ msgid "Exit"
+#~ msgstr "Esci"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "En"
+
+#, fuzzy
+#~ msgid "_Switch input method globally"
+#~ msgstr "Mostra icona del metodo di _inserimento"
+
+#~ msgid "Preedit String mode"
+#~ msgstr "Modalità di premodifica delle stringhe"
+
+#~ msgid "X Window"
+#~ msgstr "X Window"
+
+#~ msgid "A FrontEnd module for X11R6 Window System, using XIM Protocol."
+#~ msgstr ""
+#~ "Un modulo di interfaccia per il sistema X11R6 X Window, usando il "
+#~ "protocollo XIM."
+
+#~ msgid "XIM Settings"
+#~ msgstr "Impostazioni XIM"
+
+#~ msgid "_On The Spot"
+#~ msgstr "Al v_olo"
+
+#~ msgid ""
+#~ "If this option is checked, the OnTheSpot input style will be used when "
+#~ "the client supports it."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, sarà usato lo stile di inserimento al volo "
+#~ "quando il client lo supporterà."
+
+#, fuzzy
+#~ msgid "Slovene"
+#~ msgstr "Sloveno"
+
+#~ msgid "Full/Half Letter"
+#~ msgstr "Lettera piena/mezza"
+
+#~ msgid "Full/Half Punct"
+#~ msgstr "Punteggiatura piena/mezza"
+
+#~ msgid ""
+#~ "The input mode of the letters. Click to toggle between half and full."
+#~ msgstr ""
+#~ "La modalità di inserimento delle lettere. Fai clic per passare tra mezza "
+#~ "a piena."
+
+#~ msgid ""
+#~ "The input mode of the puncutations. Click to toggle between half and full."
+#~ msgstr ""
+#~ "La modalità di inserimento della punteggiatura. Fai clic per passare tra "
+#~ "mezza a piena."
+
+#~ msgid ""
+#~ " Switch between full/half width letter mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " Passa tra le modalità delle lettere a larghezza piena/mezza.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Switch between full/half width punctuation mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " Passa tra le modalità della punteggiatura a larghezza piena/mezza\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Switch between Forward/Input mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " Passa tra le modalità di inoltro/inserimento.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Add a new phrase.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " Aggiungi una nuova frase.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Delete the selected phrase.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Elimina la frase selezionata.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Control+Down:\n"
+#~ " Move lookup cursor to next shorter phrase\n"
+#~ " Only available when LongPhraseFirst option is set.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Control+giù:\n"
+#~ " Sposta il cursore di ricerca alla frase più corta successiva\n"
+#~ " Disponibile solo quanto l'opzione FraseLungaPrima è impostata.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Control+Up:\n"
+#~ " Move lookup cursor to previous longer phrase\n"
+#~ " Only available when LongPhraseFirst option is set.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Control+su:\n"
+#~ " Sposta il cursore di ricerca alla frase più lunga precedente\n"
+#~ " Disponibile solo quanto l'opzione FraseLungaPrima è impostata.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Esc:\n"
+#~ " reimposta il metodo di inserimento.\n"
+#~ "\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "How to add a phrase:\n"
+#~ " Input the new phrase as normal, then press the\n"
+#~ " hot key. A hint will be shown to let you input a key\n"
+#~ " for this phrase.\n"
+#~ " Input a key then press the space bar.\n"
+#~ " A hint will be shown to indicate whether\n"
+#~ " the phrase was added sucessfully.\n"
+#~ msgstr ""
+#~ "Come aggiungere una frase:\n"
+#~ " Inserisci la frase come normale, quindi premi il\n"
+#~ " tasto rapido. Sarà mostrato un suggerimento per\n"
+#~ " permetterti di inserire un tasto per questa frase.\n"
+#~ " Inserisci un tasto e premi la barra spaziatrice.\n"
+#~ " Sarà mostrato un suggerimento per indicare se\n"
+#~ " la frase è stata aggiunta correttamente.\n"
+
+#~ msgid "Input a key string for phrase: "
+#~ msgstr "Inserisci una stringa di tasti per la frase: "
+
+#~ msgid "Success."
+#~ msgstr "Riuscito."
+
+#~ msgid "Failed."
+#~ msgstr "Non riuscito."
+
+#~ msgid ""
+#~ "Too few argument!\n"
+#~ "Usage:\n"
+#~ " scim-make-table <table_file> [options]\n"
+#~ "\n"
+#~ " table_file\tthe table file for table module\n"
+#~ " -b\t\tconvert to binary format, otherwise to text format\n"
+#~ " -o output\tsave new table to file output\n"
+#~ " -no\t\tdo not save new phrase table\n"
+#~ " -if ifreq\tload phrase frequencies from this file\n"
+#~ " -of ofreq\tsave phrase frequencies to this file\n"
+#~ " -s file\tspecifiy the source file to count phrase ages.\n"
+#~ msgstr ""
+#~ "Troppi pochi argomenti!\n"
+#~ "Uso:\n"
+#~ " scim-make-table <file_tabella> [opzioni]\n"
+#~ "\n"
+#~ " file_tabella\til file tabella per il modulo tabella\n"
+#~ " -b\t\tconverti a formato binario, altrimenti in formato testuale\n"
+#~ " -o output\tsalva la nuova tabella al file di output\n"
+#~ " -no\t\tnon salvare la nuova tabella delle frasi\n"
+#~ " -if ifreq\tcarica le frequenze delle frasi da questo file\n"
+#~ " -of ofreq\tsalva le frequenze delle frasi in questo file\n"
+#~ " -s file\tspecifica il file sorgente per contare l'età delle frasi.\n"
+
+#~ msgid "option -no cannot be used with -o\n"
+#~ msgstr "l'opzione -no non può essere usata con -o\n"
+
+#~ msgid "option -o cannot be used with -no\n"
+#~ msgstr "l'opzione -o non può essere usata con -no\n"
+
+#~ msgid "No argument for option "
+#~ msgstr "Nessun argomento per l'opzione "
+
+#~ msgid "Invalid option: "
+#~ msgstr "Opzione non valida: "
+
+#~ msgid "Loading table file "
+#~ msgstr "Caricamento del file tabella "
+
+#~ msgid " ...\n"
+#~ msgstr " ...\n"
+
+#~ msgid "table file load failed!"
+#~ msgstr "caricamento del file tabella non riuscito!"
+
+#~ msgid "Saving frequency table file "
+#~ msgstr "Salvataggio della tabella di frequenza "
+
+#~ msgid "frequency table file load failed!"
+#~ msgstr "caricamento del file tabella di frequenza non riuscito!"
+
+#~ msgid "Saving table file "
+#~ msgstr "Salvataggio del file tabella "
+
+#~ msgid "Table file save failed!"
+#~ msgstr "Salvataggio del file tabella non riuscito!"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ "Hot keys:\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ "Tasti rapidi:\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " open/close the input method.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ ":\n"
+#~ " apri/chiudi il metodo di inserimento.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " switch to the next input method.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ ":\n"
+#~ " passa al metodo di inserimento successivo.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " switch to the previous input method.\n"
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ " passa al metodo di inserimento precedente.\n"
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Generic Table"
+#~ msgstr "Tabella generica"
+
+#~ msgid "An IMEngine Module which uses generic table input method file."
+#~ msgstr ""
+#~ "Un modulo IMEngine che usa un file di metodo di inserimento con tabella "
+#~ "generica."
+
+#~ msgid "Full width _punctuation:"
+#~ msgstr "_Punteggiatura a larghezza piena:"
+
+#~ msgid "Select full width puncutation keys"
+#~ msgstr "Seleziona i tasti della punteggiatura a larghezza piena"
+
+#~ msgid ""
+#~ "The key events to switch full/half width punctuation input mode. Click on "
+#~ "the button on the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per passare tra le modalità di inserimento con "
+#~ "punteggiatura a larghezza piena/mezza. Fai clic sul pulsante a destra per "
+#~ "modificarle."
+
+#~ msgid "Full width _letter:"
+#~ msgstr "_Lettera a larghezza piena:"
+
+#~ msgid "Select full width letter keys"
+#~ msgstr "Seleziona i tasti delle lettere a larghezza piena"
+
+#~ msgid ""
+#~ "The key events to switch full/half width letter input mode. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per passare tra le modalità di inserimento con "
+#~ "lettere a larghezza piena/mezza. Fai clic sul pulsante a destra per "
+#~ "modificarle."
+
+#~ msgid "_Mode switch:"
+#~ msgstr "Cambio di _modalità:"
+
+#~ msgid "Select mode switch keys"
+#~ msgstr "Seleziona i tasti per il cambio di modalità"
+
+#~ msgid ""
+#~ "The key events to change current input mode. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per cambiare la modalità di inserimento attuale. "
+#~ "Fai clic sul pulsante a destra per cambiarle."
+
+#~ msgid "_Add phrase:"
+#~ msgstr "_Aggiungi frase:"
+
+#~ msgid "Select add phrase keys."
+#~ msgstr "Seleziona i tasti per aggiungere frasi."
+
+#~ msgid ""
+#~ "The key events to add a new user defined phrase. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per aggiungere una nuova frase definita "
+#~ "dall'utente. Fai clic sul pulsante a destra per cambiarle."
+
+#~ msgid "_Delete phrase:"
+#~ msgstr "_Elimina frase:"
+
+#~ msgid "Select delete phrase keys."
+#~ msgstr "Seleziona i tasti per eliminare frasi."
+
+#~ msgid ""
+#~ "The key events to delete a selected phrase. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Le combinazioni di tasti per eliminare una frase selezionata. Fai clic "
+#~ "sul pulsante a destra per cambiarle."
+
+#~ msgid "Show _prompt"
+#~ msgstr "Mostra _prompt"
+
+#~ msgid "Show key _hint"
+#~ msgstr "Mostra su_ggerimento del tasto"
+
+#~ msgid "Save _user table in binary format"
+#~ msgstr "Salva la tabella dell'_utente in formato binario"
+
+#~ msgid "Show the u_ser defined phrases first"
+#~ msgstr "Mo_stra prima le frasi definite dall'utente"
+
+#~ msgid "Show the _longer phrases first"
+#~ msgstr "Mostra prima le frasi più _lunghe"
+
+#~ msgid ""
+#~ "If this option is checked, the key prompt of the currently selected "
+#~ "phrase will be shown."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, sarà mostrato il prompt del tasto della "
+#~ "frase attualmente selezionata."
+
+#~ msgid ""
+#~ "If this option is checked, the remaining keystrokes of the phraseswill be "
+#~ "shown on the lookup table."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, i tasti rimanenti della frase saranno "
+#~ "mostrati nella tabella di riferimento."
+
+#~ msgid ""
+#~ "If this option is checked, the user table will be stored with binary "
+#~ "format, this will increase the loading speed."
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la tabella dell'utente sarà salvata in "
+#~ "formato binario; ciò aumenterà la velocità di caricamento."
+
+#~ msgid ""
+#~ "If this option is checked, the user defined phrases will be shown in "
+#~ "front of others. "
+#~ msgstr ""
+#~ "Se questa opzione è segnata, le frasi definite dall'utente saranno "
+#~ "mostrate prima delle altre. "
+
+#~ msgid ""
+#~ "If this option is checked, the longer phrase will be shown in front of "
+#~ "others. "
+#~ msgstr ""
+#~ "Se questa opzione è segnata, la frasi più lunghe saranno mostrate prima "
+#~ "delle altre. "
+
+#~ msgid "The installed tables:"
+#~ msgstr "La tabelle installate:"
+
+#~ msgid "_Install"
+#~ msgstr "_Installa"
+
+#~ msgid "Install a new table."
+#~ msgstr "Installa una nuova tabella."
+
+#~ msgid "_Delete"
+#~ msgstr "_Elimina"
+
+#~ msgid "Delete the selected table."
+#~ msgstr "Elimina la tabella selezionata."
+
+#~ msgid "_Properties"
+#~ msgstr "_Proprietà"
+
+#~ msgid "Edit the properties of the selected table."
+#~ msgstr "Modifica le proprietà della tabella selezionata."
+
+#~ msgid "Table Management"
+#~ msgstr "Gestione delle tabelle"
+
+#~ msgid "Select an icon file"
+#~ msgstr "Seleziona un file icone"
+
+#~ msgid "User"
+#~ msgstr "Utente"
+
+#~ msgid "System"
+#~ msgstr "Sistema"
+
+#~ msgid "Please select the table file to be installed."
+#~ msgstr "Per piacere seleziona il file tabella da installare."
+
+#~ msgid "Failed to install the table! It's already in table file directory."
+#~ msgstr ""
+#~ "Installazione della tabella non riuscita. È già nella cartella dei file "
+#~ "tabella."
+
+#~ msgid "Failed to load the table file!"
+#~ msgstr "Caricamento del file tabella non riuscito."
+
+#~ msgid ""
+#~ "Failed to install the table! Another version of this table was already "
+#~ "installed."
+#~ msgstr ""
+#~ "Installazione della tabella non riuscita. Un'altra versione di questa "
+#~ "tabella era già installata."
+
+#~ msgid ""
+#~ "Another version of this table was already installed. Do you want to "
+#~ "replace it with the new one?"
+#~ msgstr ""
+#~ "Un'altra versione di questa tabella era già installata. Vuoi sostituirla "
+#~ "con la nuova?"
+
+#~ msgid ""
+#~ "Failed to install the table! A table with the same file name was already "
+#~ "installed."
+#~ msgstr ""
+#~ "Installazione della tabella non riuscita. Una tabella con lo stesso nome "
+#~ "del file era già installata."
+
+#~ msgid ""
+#~ "A table with the same file name was already installed. Do you want to "
+#~ "overwrite it?"
+#~ msgstr ""
+#~ "Una tabella con lo stesso nome del file era già installata. Vuoi "
+#~ "sovrascriverla?"
+
+#~ msgid "Failed to install the table to %s!"
+#~ msgstr "Installazione della tabella in %s non riuscita."
+
+#~ msgid "Can not delete the file %s!"
+#~ msgstr "Impossibile eliminare il file %s."
+
+#~ msgid "Are you sure to delete this table file?"
+#~ msgstr "Sei sicuro di voler eliminare questo file tabella?"
+
+#~ msgid "Failed to delete the table file!"
+#~ msgstr "Eliminazione del file tabella non riuscita."
+
+#~ msgid "True"
+#~ msgstr "Vero"
+
+#~ msgid "False"
+#~ msgstr "Falso"
+
+#~ msgid "Split Keys:"
+#~ msgstr "Tasti di divisione:"
+
+#~ msgid "The key strokes to split inputed string."
+#~ msgstr "I tasti per dividere la stringa inserita."
+
+#~ msgid "Commit Keys:"
+#~ msgstr "Tasti di consegna:"
+
+#~ msgid "The key strokes to commit converted result to client."
+#~ msgstr "I tasti per consegnare il risultato convertito al client."
+
+#~ msgid "Forward Keys:"
+#~ msgstr "Tasti di inoltro:"
+
+#~ msgid "The key strokes to forward inputed string to client."
+#~ msgstr "I tasti per inoltrare la stringa inserita al client."
+
+#~ msgid "The key strokes to select candidate phrases in lookup table."
+#~ msgstr ""
+#~ "I tasti per selezionare delle frasi candidate nella tabella di "
+#~ "riferimento."
+
+#~ msgid "Page Up Keys:"
+#~ msgstr "Tasti pagina su:"
+
+#~ msgid "The lookup table page up keys"
+#~ msgstr "I tasti pagina su della tabella di riferimento"
+
+#~ msgid "Page Down Keys:"
+#~ msgstr "Tasti pagina giù:"
+
+#~ msgid "The lookup table page down keys"
+#~ msgstr "I tasti pagina giù della tabella di riferimento"
+
+#~ msgid "Table Properties"
+#~ msgstr "Proprietà della tabella"
+
+#~ msgid "Name:"
+#~ msgstr "Nome:"
+
+#~ msgid "The name of this table."
+#~ msgstr "Il nome di questa tabella."
+
+#~ msgid "Author:"
+#~ msgstr "Autore:"
+
+#~ msgid "The author of this table."
+#~ msgstr "L'autore di questa tabella."
+
+#~ msgid "UUID:"
+#~ msgstr "UUID:"
+
+#~ msgid "The unique ID of this table."
+#~ msgstr "L'ID univoca di questa tabella."
+
+#~ msgid "Serial Number:"
+#~ msgstr "Numero seriale:"
+
+#~ msgid "The serial number of this table."
+#~ msgstr "Il numero seriale di questa tabella."
+
+#~ msgid "Icon File:"
+#~ msgstr "File icone:"
+
+#~ msgid "The icon file of this table."
+#~ msgstr "Il file icone di questa tabella."
+
+#~ msgid "Supported Languages:"
+#~ msgstr "Lingue supportate:"
+
+#~ msgid "The languages supported by this table."
+#~ msgstr "Le lingue supportate da questa tabella."
+
+#~ msgid "Status Prompt:"
+#~ msgstr "Prompt di stato:"
+
+#~ msgid "A prompt string to be shown in status area."
+#~ msgstr "Una stringa di prompt da visualizzare nell'area di stato."
+
+#~ msgid "Valid Input Chars:"
+#~ msgstr "Caratteri di inserimento validi:"
+
+#~ msgid "The valid input chars of this table."
+#~ msgstr "I caratteri di inserimento validi di questa tabella."
+
+#~ msgid "Multi Wildcard Char:"
+#~ msgstr "Carattere jolly multiplo:"
+
+#~ msgid ""
+#~ "The multi wildcard chars of this table. These chars can be used to match "
+#~ "one or more arbitrary chars."
+#~ msgstr ""
+#~ "I caratteri jolly multipli di questa tabella. Questi caratteri possono "
+#~ "essere usati per corrispondere a uno o più caratteri arbitrari."
+
+#~ msgid "Single Wildcard Char:"
+#~ msgstr "Carattere jolly singolo:"
+
+#~ msgid ""
+#~ "The single wildcard chars of this table.These chars can be used to match "
+#~ "one arbitrary char."
+#~ msgstr ""
+#~ "I caratteri jolly singoli di questa tabella. Questi caratteri possono "
+#~ "essere usati per corrispondere a un carattere arbitrario."
+
+#~ msgid "Max Key Length:"
+#~ msgstr "Lunghezza massima dei tasti:"
+
+#~ msgid "The maxmium length of key strings."
+#~ msgstr "La lunghezza massima delle stringhe di tasti."
+
+#~ msgid "Show Key Prompt:"
+#~ msgstr "Mostra prompt del tasto:"
+
+#~ msgid "If true then the key prompts will be shown instead of the raw keys."
+#~ msgstr ""
+#~ "Se vero, saranno mostrati i prompt dei tasti invece dei tasti grezzi."
+
+#~ msgid "Auto Select:"
+#~ msgstr "Selezione automatica:"
+
+#~ msgid ""
+#~ "If true then the first candidate phrase will be selected automatically "
+#~ "when inputing the next key."
+#~ msgstr ""
+#~ "Se vero, la prima frase candidata sarà selezionata automaticamente quando "
+#~ "si inserisce il prossimo tasto."
+
+#~ msgid "Auto Wildcard:"
+#~ msgstr "Jolly automatico:"
+
+#~ msgid ""
+#~ "If true then a multi wildcard char will be append to the end of inputed "
+#~ "key string when searching phrases."
+#~ msgstr ""
+#~ "Se vero, un carattere jolly multiplo sarà aggiunto alla fine della "
+#~ "stringa di tasti inseriti quando si cercano le frasi."
+
+#~ msgid "Auto Commit:"
+#~ msgstr "Consegna automatica:"
+
+#~ msgid ""
+#~ "If true then the converted result string will be committed to client "
+#~ "automatically."
+#~ msgstr ""
+#~ "Se vero, la stringa risultante convertita sarà automaticamente consegnata "
+#~ "al client."
+
+#~ msgid ""
+#~ "If true then the inputed key string will be splitted automatically when "
+#~ "necessary."
+#~ msgstr ""
+#~ "Se vero, la stringa di tasti inserita sarà divisa automaticamente quando "
+#~ "necessario."
+
+#~ msgid "Discard Invalid Key:"
+#~ msgstr "Scarta tasto non valido:"
+
+#~ msgid ""
+#~ "If true then the invalid key will be discarded automatically.This option "
+#~ "is only valid when Auto Select and Auto Commit is true."
+#~ msgstr ""
+#~ "Se vero, il tasto non valido sarà scartato automaticamente. Questa "
+#~ "opzione è valida solo quando sono vere la selezione e la consegna "
+#~ "automatiche."
+
+#~ msgid "Dynamic Adjust:"
+#~ msgstr "Regolazione dinamica:"
+
+#~ msgid "If true then the phrases' frequencies will be adjusted dynamically."
+#~ msgstr "Se vero, le frequenze delle frasi saranno regolate dinamicamente."
+
+#~ msgid "Auto Fill Preedit Area:"
+#~ msgstr "Riempimento automatico dell'area di premodifica:"
+
+#~ msgid ""
+#~ "If true then the preedit string will be filled up with the current "
+#~ "candiate phrase automatically.This option is only valid when Auto Select "
+#~ "is TRUE."
+#~ msgstr ""
+#~ "Se vero, la stringa di premodifica sarà riempita automaticamente con la "
+#~ "frase candidata attuale. Questa opzione è valida solo quando la selezione "
+#~ "automatica è vera."
+
+#~ msgid "Always Show Lookup Table:"
+#~ msgstr "Mostra sempre la tabella di riferimento:"
+
+#~ msgid ""
+#~ "If true then the lookup table will always be shown when any candidate "
+#~ "phrase is available. Otherwise the lookup table will only be shown when "
+#~ "necessary.\n"
+#~ "If Auto Fill is false, then this option will be no effect, and always be "
+#~ "true."
+#~ msgstr ""
+#~ "Se vero, la tabella di riferimento sarà sempre visualizzata quando "
+#~ "qualsiasi frase candidata sarà disponibile. Altrimenti la tabella di "
+#~ "riferimento sarà visualizzata solo quando necessario.\n"
+#~ "Se il riempimento automatico è falso, questa opzione non avrà effetto, e "
+#~ "sarà sempre vera."
+
+#~ msgid "Default Full Width Punct:"
+#~ msgstr "Punteggiatura predefinita a larghezza piena:"
+
+#~ msgid "If true then full width punctuations will be inputed by default."
+#~ msgstr ""
+#~ "Se vero, saranno inseriti segni di punteggiatura a larghezza piena come "
+#~ "impostazione predefinita."
+
+#~ msgid "Default Full Width Letter:"
+#~ msgstr "Lettere predefinite a larghezza piena:"
+
+#~ msgid "If true then full width letters will be inputed by default."
+#~ msgstr ""
+#~ "Se vero, saranno inserite lettere a larghezza piena come impostazione "
+#~ "predefinita."
+
+#~ msgid "Invalid icon file."
+#~ msgstr "File icone non valido."
+
+#~ msgid "Invalid languages."
+#~ msgstr "Lingue non valide."
+
+#~ msgid "Invalid status prompt."
+#~ msgstr "Prompt di stato non valido."
+
+#~ msgid "Invalid multi wildcard chars."
+#~ msgstr "Caratteri jolly multipli non validi."
+
+#~ msgid "Invalid single wildcard chars."
+#~ msgstr "Caratteri jolly singoli non validi."
+
+#~ msgid "Invalid commit keys."
+#~ msgstr "Tasti di consegna non validi."
+
+#~ msgid "Invalid select keys."
+#~ msgstr "Tasti di selezione non validi."
+
+#~ msgid "Invalid page up keys."
+#~ msgstr "Tasti pagina su non validi."
+
+#~ msgid "Invalid page down keys."
+#~ msgstr "Tasti pagina giù non validi."
+
+#~ msgid "Invalid max key length."
+#~ msgstr "Lunghezza massima dei tasti non valida."
+
+#~ msgid "Failed to save table %s!"
+#~ msgstr "Salvataggio della tabella %s non riuscito!"
+
+#~ msgid "Failed to load any Config Modules!"
+#~ msgstr "Caricamento di qualsiasi modulo di configurazione non riuscito."
+
+#~ msgid "_Current Config Module:"
+#~ msgstr "Modulo di _configurazione attuale:"
+
+#~ msgid "<Not found>"
+#~ msgstr "<Non trovato>"
+
+#~ msgid "Current Config Module has been changed to %s."
+#~ msgstr "Il modulo di configurazione attuale è stato cambiato in %s."
+
+#~ msgid "Start the SCIM Setup Utility."
+#~ msgstr "Avvia il programma di configurazione di SCIM."
+
+#~ msgid "Setup ..."
+#~ msgstr "Configurazione..."
--- /dev/null
+# Japanese translation for SCIM
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# James Su <suzhe@tsinghua.org.cn>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ja\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 15:30+0900\n"
+"PO-Revision-Date: 2005-12-11 11:00+0900\n"
+"Last-Translator: Yukiko Bando <ybando@k6.dion.ne.jp>\n"
+"Language-Team: Japanese <ja@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.3.1\n"
+
+#: ism/src/scim_compose_key.cpp:127 ism/src/scim_imengine.cpp:659
+#: ism/src/scim_panel_agent.cpp:345 ism/src/scim_panel_agent.cpp:4334
+#: ism/src/scim_utility.cpp:701
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1740
+msgid "English/Keyboard"
+msgstr "英語/キーボード"
+
+#. return WideString ();
+#: ism/src/scim_compose_key.cpp:146
+#, fuzzy
+msgid "English input service"
+msgstr "英語(アメリカ)"
+
+#: ism/src/scim_utility.cpp:702
+msgid "Amharic"
+msgstr "アムハラ語"
+
+#: ism/src/scim_utility.cpp:703
+msgid "Arabic"
+msgstr "アラビア語"
+
+#: ism/src/scim_utility.cpp:704 ism/src/scim_utility.cpp:893
+msgid "Arabic (Egypt)"
+msgstr "アラビア語(エジプト)"
+
+#: ism/src/scim_utility.cpp:705 ism/src/scim_utility.cpp:902
+msgid "Arabic (Lebanon)"
+msgstr "アラビア語(レバノン)"
+
+#: ism/src/scim_utility.cpp:706
+msgid "Assamese"
+msgstr "アッサム語"
+
+#: ism/src/scim_utility.cpp:707 ism/src/scim_utility.cpp:918
+msgid "Azerbaijani"
+msgstr "アゼルバイジャン語"
+
+#: ism/src/scim_utility.cpp:708
+msgid "Belarusian"
+msgstr "白ロシア語"
+
+#: ism/src/scim_utility.cpp:709 ism/src/scim_utility.cpp:874
+msgid "Bulgarian"
+msgstr "ブルガリア語"
+
+#: ism/src/scim_utility.cpp:710 ism/src/scim_utility.cpp:711
+#: ism/src/scim_utility.cpp:913
+msgid "Bengali"
+msgstr "ベンガル語"
+
+#: ism/src/scim_utility.cpp:712
+msgid "Bengali (India)"
+msgstr "ベンガル語(インド)"
+
+#: ism/src/scim_utility.cpp:713
+msgid "Tibetan"
+msgstr "チベット語"
+
+#: ism/src/scim_utility.cpp:714
+msgid "Bosnian"
+msgstr "ボスニア語"
+
+#: ism/src/scim_utility.cpp:715 ism/src/scim_utility.cpp:853
+msgid "Catalan"
+msgstr "カタロニア語"
+
+#: ism/src/scim_utility.cpp:716 ism/src/scim_utility.cpp:863
+#: ism/src/scim_keyboard_layout_data.h:4596
+msgid "Czech"
+msgstr "チェコ語"
+
+#: ism/src/scim_utility.cpp:717 ism/src/scim_utility.cpp:923
+msgid "Welsh"
+msgstr "ウェールズ語"
+
+#: ism/src/scim_utility.cpp:718 ism/src/scim_utility.cpp:854
+#: ism/src/scim_keyboard_layout_data.h:4598
+msgid "Danish"
+msgstr "デンマーク語"
+
+#: ism/src/scim_utility.cpp:719 ism/src/scim_keyboard_layout_data.h:4606
+msgid "German"
+msgstr "ドイツ語"
+
+#: ism/src/scim_utility.cpp:720
+msgid "Divehi"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:721 ism/src/scim_utility.cpp:873
+#: ism/src/scim_keyboard_layout_data.h:4609
+msgid "Greek"
+msgstr "ギリシャ語"
+
+#: ism/src/scim_utility.cpp:722
+msgid "English"
+msgstr "英語"
+
+#: ism/src/scim_utility.cpp:723 ism/src/scim_utility.cpp:808
+msgid "English (Australian)"
+msgstr "英語(オーストラリア)"
+
+#: ism/src/scim_utility.cpp:724 ism/src/scim_utility.cpp:809
+msgid "English (Canadian)"
+msgstr "英語(カナダ)"
+
+#: ism/src/scim_utility.cpp:725
+msgid "English (British)"
+msgstr "英語(イギリス)"
+
+#: ism/src/scim_utility.cpp:726
+msgid "English (Ireland)"
+msgstr "英語(アイルランド)"
+
+#: ism/src/scim_utility.cpp:727
+msgid "English (American)"
+msgstr "英語(アメリカ)"
+
+#: ism/src/scim_utility.cpp:728 ism/src/scim_utility.cpp:729
+#: ism/src/scim_keyboard_layout_data.h:4622
+msgid "Spanish"
+msgstr "スペイン語"
+
+#: ism/src/scim_utility.cpp:730
+msgid "Spanish (Mexico)"
+msgstr "スペイン語(メキシコ)"
+
+#: ism/src/scim_utility.cpp:731 ism/src/scim_utility.cpp:870
+#: ism/src/scim_keyboard_layout_data.h:4601
+msgid "Estonian"
+msgstr "エストニア語"
+
+#: ism/src/scim_utility.cpp:732 ism/src/scim_utility.cpp:852
+msgid "Basque"
+msgstr "バスク語"
+
+#: ism/src/scim_utility.cpp:733
+msgid "Persian"
+msgstr "ペルシア語"
+
+#: ism/src/scim_utility.cpp:734 ism/src/scim_utility.cpp:857
+#: ism/src/scim_keyboard_layout_data.h:4602
+msgid "Finnish"
+msgstr "フィンランド語"
+
+#: ism/src/scim_utility.cpp:735 ism/src/scim_keyboard_layout_data.h:4603
+msgid "French"
+msgstr "フランス語"
+
+#: ism/src/scim_utility.cpp:736 ism/src/scim_utility.cpp:921
+msgid "Irish"
+msgstr "アイルランド語"
+
+#: ism/src/scim_utility.cpp:737 ism/src/scim_utility.cpp:919
+msgid "Galician"
+msgstr "ガリシア語"
+
+#: ism/src/scim_utility.cpp:738 ism/src/scim_utility.cpp:914
+msgid "Gujarati"
+msgstr "グジャラート語"
+
+#: ism/src/scim_utility.cpp:739 ism/src/scim_utility.cpp:748
+#: ism/src/scim_utility.cpp:890
+msgid "Hebrew"
+msgstr "ヘブライ語"
+
+#: ism/src/scim_utility.cpp:740 ism/src/scim_utility.cpp:909
+msgid "Hindi"
+msgstr "ヒンディー語"
+
+#: ism/src/scim_utility.cpp:741 ism/src/scim_keyboard_layout_data.h:4595
+msgid "Croatian"
+msgstr "クロアチア語"
+
+#: ism/src/scim_utility.cpp:742 ism/src/scim_utility.cpp:864
+#: ism/src/scim_keyboard_layout_data.h:4610
+msgid "Hungarian"
+msgstr "ハンガリー語"
+
+#: ism/src/scim_utility.cpp:743
+#, fuzzy
+msgid "Armenian"
+msgstr "ルーマニア語"
+
+#: ism/src/scim_utility.cpp:744
+msgid "Interlingua"
+msgstr "インターリングア"
+
+#: ism/src/scim_utility.cpp:745
+msgid "Indonesian"
+msgstr "インドネシア語"
+
+#: ism/src/scim_utility.cpp:746 ism/src/scim_utility.cpp:856
+#: ism/src/scim_keyboard_layout_data.h:4628
+msgid "Icelandic"
+msgstr "アイスランド語"
+
+#: ism/src/scim_utility.cpp:747 ism/src/scim_keyboard_layout_data.h:4611
+msgid "Italian"
+msgstr "イタリア語"
+
+#: ism/src/scim_utility.cpp:749 ism/src/scim_utility.cpp:882
+#: ism/src/scim_keyboard_layout_data.h:4612
+msgid "Japanese"
+msgstr "日本語"
+
+#: ism/src/scim_utility.cpp:750 ism/src/scim_utility.cpp:917
+#, fuzzy
+msgid "Georgian"
+msgstr "ドイツ語"
+
+#: ism/src/scim_utility.cpp:751 ism/src/scim_utility.cpp:875
+msgid "Kazakh"
+msgstr "カザフスタン語"
+
+#: ism/src/scim_utility.cpp:752
+msgid "Cambodian"
+msgstr "クメール語"
+
+#: ism/src/scim_utility.cpp:753
+msgid "Kannada"
+msgstr "カンナダ語"
+
+#: ism/src/scim_utility.cpp:754 ism/src/scim_utility.cpp:883
+msgid "Korean"
+msgstr "ハングル"
+
+#: ism/src/scim_utility.cpp:755
+msgid "Laothian"
+msgstr "ラオス語"
+
+#: ism/src/scim_utility.cpp:756 ism/src/scim_utility.cpp:872
+#: ism/src/scim_keyboard_layout_data.h:4629
+msgid "Lithuanian"
+msgstr "リトアニア語"
+
+#: ism/src/scim_utility.cpp:757 ism/src/scim_utility.cpp:871
+msgid "Latvian"
+msgstr "ラトヴィア語"
+
+#: ism/src/scim_utility.cpp:758 ism/src/scim_utility.cpp:876
+msgid "Macedonian"
+msgstr "マケドニア語"
+
+#: ism/src/scim_utility.cpp:759 ism/src/scim_utility.cpp:915
+msgid "Malayalam"
+msgstr "マラヤーラム語"
+
+#: ism/src/scim_utility.cpp:760
+msgid "Mongolian"
+msgstr "モンゴル語"
+
+#: ism/src/scim_utility.cpp:761 ism/src/scim_utility.cpp:911
+msgid "Marathi"
+msgstr "マラーティー語"
+
+#: ism/src/scim_utility.cpp:762
+msgid "Malay"
+msgstr "マレー語"
+
+#: ism/src/scim_utility.cpp:763
+#, fuzzy
+msgid "Burmese"
+msgstr "ブラウズ"
+
+#: ism/src/scim_utility.cpp:764
+msgid "Nepali"
+msgstr "ネパール語"
+
+#: ism/src/scim_utility.cpp:765 ism/src/scim_keyboard_layout_data.h:4599
+msgid "Dutch"
+msgstr "オランダ語"
+
+#: ism/src/scim_utility.cpp:766
+#, fuzzy
+msgid "Norwegian (Nynorsk)"
+msgstr "ノルウェー語(ニューノルスク)"
+
+#: ism/src/scim_utility.cpp:767
+#, fuzzy
+msgid "Norwegian (Bokmal)"
+msgstr "ノルウェー語(ボックモール)"
+
+#: ism/src/scim_utility.cpp:768
+msgid "Oriya"
+msgstr "オリヤー語"
+
+#: ism/src/scim_utility.cpp:769 ism/src/scim_utility.cpp:916
+msgid "Punjabi"
+msgstr "パンジャブ語"
+
+#: ism/src/scim_utility.cpp:770 ism/src/scim_utility.cpp:865
+#: ism/src/scim_keyboard_layout_data.h:4614
+msgid "Polish"
+msgstr "ポーランド語"
+
+#: ism/src/scim_utility.cpp:771 ism/src/scim_utility.cpp:773
+#: ism/src/scim_keyboard_layout_data.h:4615
+msgid "Portuguese"
+msgstr "ポルトガル語"
+
+#: ism/src/scim_utility.cpp:772 ism/src/scim_keyboard_layout_data.h:4616
+msgid "Portuguese (Brazil)"
+msgstr "ポルトガル語(ブラジル)"
+
+#: ism/src/scim_utility.cpp:774 ism/src/scim_utility.cpp:866
+msgid "Romanian"
+msgstr "ルーマニア語"
+
+#: ism/src/scim_utility.cpp:775 ism/src/scim_utility.cpp:877
+#: ism/src/scim_keyboard_layout_data.h:4618
+msgid "Russian"
+msgstr "ロシア語"
+
+#: ism/src/scim_utility.cpp:776 ism/src/scim_utility.cpp:922
+msgid "Sinhala"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:777 ism/src/scim_utility.cpp:868
+#: ism/src/scim_keyboard_layout_data.h:4619
+msgid "Slovak"
+msgstr "スロバキア語"
+
+#: ism/src/scim_utility.cpp:778 ism/src/scim_utility.cpp:869
+#: ism/src/scim_keyboard_layout_data.h:4621
+msgid "Slovenian"
+msgstr "スロベニア語"
+
+#: ism/src/scim_utility.cpp:779
+msgid "Albanian"
+msgstr "アルバニア語"
+
+#: ism/src/scim_utility.cpp:780 ism/src/scim_utility.cpp:781
+#: ism/src/scim_utility.cpp:782
+msgid "Serbian"
+msgstr "セルビア語"
+
+#: ism/src/scim_utility.cpp:783 ism/src/scim_utility.cpp:785
+#: ism/src/scim_utility.cpp:861 ism/src/scim_keyboard_layout_data.h:4625
+msgid "Swedish"
+msgstr "スウェーデン語"
+
+#: ism/src/scim_utility.cpp:784 ism/src/scim_utility.cpp:862
+msgid "Swedish (Finland)"
+msgstr "スウェーデン語(フィンランド)"
+
+#: ism/src/scim_utility.cpp:786 ism/src/scim_utility.cpp:912
+msgid "Tamil"
+msgstr "タミル語"
+
+#: ism/src/scim_utility.cpp:787 ism/src/scim_utility.cpp:910
+msgid "Telugu"
+msgstr "テルグ語"
+
+#: ism/src/scim_utility.cpp:788 ism/src/scim_utility.cpp:889
+msgid "Thai"
+msgstr "タイ語"
+
+#: ism/src/scim_utility.cpp:789 ism/src/scim_utility.cpp:880
+#: ism/src/scim_keyboard_layout_data.h:4626
+msgid "Turkish"
+msgstr "トルコ語"
+
+#: ism/src/scim_utility.cpp:790
+msgid "Uighur"
+msgstr "ウィグル語"
+
+#: ism/src/scim_utility.cpp:791 ism/src/scim_utility.cpp:879
+#: ism/src/scim_keyboard_layout_data.h:4630
+msgid "Ukrainian"
+msgstr "ウクライナ語"
+
+#: ism/src/scim_utility.cpp:792 ism/src/scim_utility.cpp:907
+msgid "Urdu"
+msgstr "ウルドゥー語"
+
+#: ism/src/scim_utility.cpp:793
+msgid "Uzbek"
+msgstr "ウズベク語"
+
+#: ism/src/scim_utility.cpp:794 ism/src/scim_utility.cpp:908
+msgid "Vietnamese"
+msgstr "ベトナム語"
+
+#: ism/src/scim_utility.cpp:795
+msgid "Walloon"
+msgstr "ワロン語"
+
+#: ism/src/scim_utility.cpp:796 ism/src/scim_utility.cpp:797
+msgid "Yiddish"
+msgstr "イディッシュ語"
+
+#: ism/src/scim_utility.cpp:798
+msgid "Chinese"
+msgstr "中国語"
+
+#: ism/src/scim_utility.cpp:799 ism/src/scim_utility.cpp:801
+#, fuzzy
+msgid "Chinese (Simplified)"
+msgstr "簡体中国語"
+
+#: ism/src/scim_utility.cpp:800 ism/src/scim_utility.cpp:802
+#, fuzzy
+msgid "Chinese (Traditional)"
+msgstr "繁体中国語"
+
+#: ism/src/scim_utility.cpp:804
+msgid "Dutch (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:805
+#, fuzzy
+msgid "Dutch (Belgian)"
+msgstr "ベルギー"
+
+#: ism/src/scim_utility.cpp:806
+#, fuzzy
+msgid "English (United States)"
+msgstr "英語(US)"
+
+#: ism/src/scim_utility.cpp:807
+#, fuzzy
+msgid "English (United Kingdom)"
+msgstr "英語(カナダ)"
+
+#: ism/src/scim_utility.cpp:810
+#, fuzzy
+msgid "English (New Zealand)"
+msgstr "英語(アイルランド)"
+
+#: ism/src/scim_utility.cpp:811
+#, fuzzy
+msgid "English (Irish)"
+msgstr "英語(イギリス)"
+
+#: ism/src/scim_utility.cpp:812
+#, fuzzy
+msgid "English (South Africa)"
+msgstr "英語(アメリカ)"
+
+#: ism/src/scim_utility.cpp:813
+#, fuzzy
+msgid "English (Jamaica)"
+msgstr "英語(カナダ)"
+
+#: ism/src/scim_utility.cpp:814
+#, fuzzy
+msgid "English (Belize)"
+msgstr "英語(イギリス)"
+
+#: ism/src/scim_utility.cpp:815
+#, fuzzy
+msgid "English (Trinidad)"
+msgstr "英語(イギリス)"
+
+#: ism/src/scim_utility.cpp:816
+#, fuzzy
+msgid "English (Zimbabwe)"
+msgstr "英語(カナダ)"
+
+#: ism/src/scim_utility.cpp:817
+#, fuzzy
+msgid "English (Philippines)"
+msgstr "英語(イギリス)"
+
+#: ism/src/scim_utility.cpp:818
+#, fuzzy
+msgid "French (Standard)"
+msgstr "フランス語(カナダ)"
+
+#: ism/src/scim_utility.cpp:819
+#, fuzzy
+msgid "French (Belgian)"
+msgstr "フランス語(カナダ)"
+
+#: ism/src/scim_utility.cpp:820 ism/src/scim_keyboard_layout_data.h:4604
+msgid "French (Canadian)"
+msgstr "フランス語(カナダ)"
+
+#: ism/src/scim_utility.cpp:821
+#, fuzzy
+msgid "French (Swiss)"
+msgstr "ドイツ語(スイス)"
+
+#: ism/src/scim_utility.cpp:822
+msgid "French (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:823
+#, fuzzy
+msgid "French (Monaco)"
+msgstr "フランス語(カナダ)"
+
+#: ism/src/scim_utility.cpp:824
+#, fuzzy
+msgid "German (Standard)"
+msgstr "ドイツ語(deadkeyあり)"
+
+#: ism/src/scim_utility.cpp:825 ism/src/scim_keyboard_layout_data.h:4608
+msgid "German (Swiss)"
+msgstr "ドイツ語(スイス)"
+
+#: ism/src/scim_utility.cpp:826
+#, fuzzy
+msgid "German (Austrian)"
+msgstr "英語(オーストラリア)"
+
+#: ism/src/scim_utility.cpp:827
+msgid "German (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:828
+#, fuzzy
+msgid "German (Liechtenstein)"
+msgstr "ドイツ語(スイス)"
+
+#: ism/src/scim_utility.cpp:829
+msgid "Italian (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:830
+#, fuzzy
+msgid "Italian (Swiss)"
+msgstr "ドイツ語(スイス)"
+
+#: ism/src/scim_utility.cpp:831
+msgid "Portuguese (Brazilian)"
+msgstr "ポルトガル語(ブラジル)"
+
+#: ism/src/scim_utility.cpp:832
+#, fuzzy
+msgid "Portuguese (Standard)"
+msgstr "ポルトガル語(ブラジル)"
+
+#: ism/src/scim_utility.cpp:833
+#, fuzzy
+msgid "Spanish (Traditional Sort)"
+msgstr "スペイン語(ラテンアメリカ)"
+
+#: ism/src/scim_utility.cpp:834
+#, fuzzy
+msgid "Spanish (Mexican)"
+msgstr "スペイン語(メキシコ)"
+
+#: ism/src/scim_utility.cpp:835
+#, fuzzy
+msgid "Spanish (Guatemala)"
+msgstr "スペイン語(ラテンアメリカ)"
+
+#: ism/src/scim_utility.cpp:836
+#, fuzzy
+msgid "Spanish (Costa Rica)"
+msgstr "スペイン語(ラテンアメリカ)"
+
+#: ism/src/scim_utility.cpp:837
+#, fuzzy
+msgid "Spanish (Panama)"
+msgstr "スペイン語(ラテンアメリカ)"
+
+#: ism/src/scim_utility.cpp:838
+#, fuzzy
+msgid "Spanish (Dominican Republic)"
+msgstr "スペイン語(ラテンアメリカ)"
+
+#: ism/src/scim_utility.cpp:839
+#, fuzzy
+msgid "Spanish (Venezuela)"
+msgstr "スペイン語(メキシコ)"
+
+#: ism/src/scim_utility.cpp:840
+#, fuzzy
+msgid "Spanish (Colombia)"
+msgstr "スペイン語(メキシコ)"
+
+#: ism/src/scim_utility.cpp:841
+#, fuzzy
+msgid "Spanish (Peru)"
+msgstr "スペイン語(メキシコ)"
+
+#: ism/src/scim_utility.cpp:842
+#, fuzzy
+msgid "Spanish (Argentina)"
+msgstr "スペイン語(メキシコ)"
+
+#: ism/src/scim_utility.cpp:843
+#, fuzzy
+msgid "Spanish (Ecuador)"
+msgstr "スペイン語(メキシコ)"
+
+#: ism/src/scim_utility.cpp:844
+#, fuzzy
+msgid "Spanish (Chile)"
+msgstr "スペイン語(メキシコ)"
+
+#: ism/src/scim_utility.cpp:845
+#, fuzzy
+msgid "Spanish (Uruguay)"
+msgstr "スペイン語(メキシコ)"
+
+#: ism/src/scim_utility.cpp:846
+#, fuzzy
+msgid "Spanish (Paraguay)"
+msgstr "スペイン語(CP 850)"
+
+#: ism/src/scim_utility.cpp:847
+#, fuzzy
+msgid "Spanish (Bolivia)"
+msgstr "スペイン語(メキシコ)"
+
+#: ism/src/scim_utility.cpp:848
+msgid "Spanish (El Salvador)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:849
+#, fuzzy
+msgid "Spanish (Honduras)"
+msgstr "スペイン語(メキシコ)"
+
+#: ism/src/scim_utility.cpp:850
+#, fuzzy
+msgid "Spanish (Nicaragua)"
+msgstr "スペイン語(メキシコ)"
+
+#: ism/src/scim_utility.cpp:851
+#, fuzzy
+msgid "Spanish (Puerto Rico)"
+msgstr "スペイン語(メキシコ)"
+
+#: ism/src/scim_utility.cpp:855
+msgid "Afrikaans"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:858
+#, fuzzy
+msgid "Malay (Malaysia)"
+msgstr "マラヤーラム語"
+
+#: ism/src/scim_utility.cpp:859
+msgid "Malay (Brunei Darussalam)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:860 ism/src/scim_keyboard_layout_data.h:4613
+msgid "Norwegian"
+msgstr "ノルウェー語"
+
+#: ism/src/scim_utility.cpp:867
+#, fuzzy
+msgid "Serbian (Latin)"
+msgstr "セルビア語"
+
+#: ism/src/scim_utility.cpp:878
+msgid "Serbian (Cyrillic)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:881
+msgid "Uzbek (Latin)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:884
+#, fuzzy
+msgid "Chinese (Taiwan)"
+msgstr "繁体中国語"
+
+#: ism/src/scim_utility.cpp:885
+#, fuzzy
+msgid "Chinese (Hong Kong)"
+msgstr "繁体中国語"
+
+#: ism/src/scim_utility.cpp:886
+#, fuzzy
+msgid "Chinese (Macau)"
+msgstr "繁体中国語"
+
+#: ism/src/scim_utility.cpp:887
+#, fuzzy
+msgid "Chinese (PRC)"
+msgstr "中国語"
+
+#: ism/src/scim_utility.cpp:888
+#, fuzzy
+msgid "Chinese (Singapore)"
+msgstr "簡体中国語"
+
+#: ism/src/scim_utility.cpp:891
+msgid "Arabic (Saudi Arabia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:892
+#, fuzzy
+msgid "Arabic (Iraq)"
+msgstr "アラビア語(レバノン)"
+
+#: ism/src/scim_utility.cpp:894
+#, fuzzy
+msgid "Arabic (Libya)"
+msgstr "アラビア語(レバノン)"
+
+#: ism/src/scim_utility.cpp:895
+#, fuzzy
+msgid "Arabic (Algeria)"
+msgstr "アラビア語(レバノン)"
+
+#: ism/src/scim_utility.cpp:896
+#, fuzzy
+msgid "Arabic (Morocco)"
+msgstr "アラビア語(レバノン)"
+
+#: ism/src/scim_utility.cpp:897
+#, fuzzy
+msgid "Arabic (Tunisia)"
+msgstr "アラビア語(レバノン)"
+
+#: ism/src/scim_utility.cpp:898
+#, fuzzy
+msgid "Arabic (Oman)"
+msgstr "アラビア語(レバノン)"
+
+#: ism/src/scim_utility.cpp:899
+#, fuzzy
+msgid "Arabic (Yemen)"
+msgstr "アラビア語(レバノン)"
+
+#: ism/src/scim_utility.cpp:900
+#, fuzzy
+msgid "Arabic (Syria)"
+msgstr "アラビア語(エジプト)"
+
+#: ism/src/scim_utility.cpp:901
+#, fuzzy
+msgid "Arabic (Jordan)"
+msgstr "アラビア語(レバノン)"
+
+#: ism/src/scim_utility.cpp:903
+#, fuzzy
+msgid "Arabic (Kuwait)"
+msgstr "アラビア語(エジプト)"
+
+#: ism/src/scim_utility.cpp:904
+#, fuzzy
+msgid "Arabic (UAE)"
+msgstr "アラビア語(エジプト)"
+
+#: ism/src/scim_utility.cpp:905
+#, fuzzy
+msgid "Arabic (Bahrain)"
+msgstr "アラビア語(レバノン)"
+
+#: ism/src/scim_utility.cpp:906
+#, fuzzy
+msgid "Arabic (Qatar)"
+msgstr "アラビア語(エジプト)"
+
+#: ism/src/scim_utility.cpp:920
+msgid "Hausa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:924
+msgid "Xhosa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:925
+msgid "Yoruba"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:926
+msgid "Zulu"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:1024
+msgid "Other"
+msgstr "その他"
+
+#: ism/src/scim_keyboard_layout_data.h:4592
+#: ism/modules/imengine/scim_socket_imengine.cpp:408
+#: ism/modules/imengine/scim_socket_imengine.cpp:438
+#: ism/modules/imengine/scim_socket_imengine.cpp:523
+#: ism/modules/imengine/scim_socket_imengine.cpp:553
+#: ism/modules/imengine/scim_socket_imengine.cpp:583
+msgid "Unknown"
+msgstr "不明"
+
+#: ism/src/scim_keyboard_layout_data.h:4593
+msgid "English (US)"
+msgstr "英語(US)"
+
+#: ism/src/scim_keyboard_layout_data.h:4594
+msgid "Belgian"
+msgstr "ベルギー"
+
+#: ism/src/scim_keyboard_layout_data.h:4597
+msgid "Czech (qwerty)"
+msgstr "チェコ語(qwerty)"
+
+#: ism/src/scim_keyboard_layout_data.h:4600
+msgid "Dvorak"
+msgstr "Dvorak"
+
+#: ism/src/scim_keyboard_layout_data.h:4605
+msgid "French (Switzerland)"
+msgstr "フランス語(スイス)"
+
+#: ism/src/scim_keyboard_layout_data.h:4607
+msgid "German (with deadkeys)"
+msgstr "ドイツ語(deadkeyあり)"
+
+#: ism/src/scim_keyboard_layout_data.h:4617
+msgid "Portuguese (Brazil US accents)"
+msgstr "ポルトガル語(ブラジルUSアクセント)"
+
+#: ism/src/scim_keyboard_layout_data.h:4620
+msgid "Slovak (qwerty)"
+msgstr "スロバキア語(qwerty)"
+
+#: ism/src/scim_keyboard_layout_data.h:4623
+msgid "Spanish (CP 850)"
+msgstr "スペイン語(CP 850)"
+
+#: ism/src/scim_keyboard_layout_data.h:4624
+msgid "Spanish (Latin America)"
+msgstr "スペイン語(ラテンアメリカ)"
+
+#: ism/src/scim_keyboard_layout_data.h:4627
+msgid "English (UK)"
+msgstr "英語(UK)"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:57
+msgid "Simplified-Traditional Chinese Conversion"
+msgstr "簡体-繁体中国語相互変換"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:60
+msgid "Convert between Simplified Chinese and Traditional Chinese"
+msgstr "簡体中国語と繁体中国語を相互変換する"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:71
+msgid "SC-TC"
+msgstr "簡体-繁体"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:73
+#: ism/modules/filter/scim_sctc_filter.cpp:78
+msgid "Simplified-Traditional Chinese conversion"
+msgstr "簡体-繁体中国語相互変換"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:76
+msgid "No Conversion"
+msgstr "変換しない"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:81
+msgid "Simplified to Traditional"
+msgstr "簡体から繁体へ"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:83
+msgid "Convert Simplified Chinese to Traditional Chinese"
+msgstr "簡体中国語を繁体中国語に変換する"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:86
+msgid "Traditional to Simplified"
+msgstr "繁体から簡体へ"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:88
+msgid "Convert Traditional Chinese to Simplified Chinese"
+msgstr "繁体中国語を簡体中国語に変換する"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:300
+msgid "James Su <suzhe@tsinghua.org.cn>"
+msgstr "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:425
+#: ism/modules/filter/scim_sctc_filter.cpp:555
+#: ism/modules/filter/scim_sctc_filter.cpp:571
+msgid "SC->TC"
+msgstr "簡体->繁体"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:431
+#: ism/modules/filter/scim_sctc_filter.cpp:559
+#: ism/modules/filter/scim_sctc_filter.cpp:575
+msgid "TC->SC"
+msgstr "繁体->簡体"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1693
+msgid "Smart Common Input Method platform "
+msgstr "Smart Common Input Method platform"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1695
+msgid ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+msgstr ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1700
+msgid ""
+":\n"
+"\n"
+msgstr ""
+":\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1703
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:963
+msgid "Enable"
+msgstr "有効にする"
+
+#. gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+#. gtk_tree_view_column_set_fixed_width (column, 232);
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:984
+msgid "Name"
+msgstr "名称"
+
+#: ism/utils/scimstringview.c:201
+msgid "Cursor Position"
+msgstr "カーソル位置"
+
+#: ism/utils/scimstringview.c:202
+msgid "The current position of the insertion cursor in chars."
+msgstr "現在のカーソル位置"
+
+#: ism/utils/scimstringview.c:211
+msgid "Maximum length"
+msgstr "最大の長さ"
+
+#: ism/utils/scimstringview.c:212
+msgid "Maximum number of characters for this string view. Zero if no maximum."
+msgstr ""
+"String viewウィジェットの最大表示文字数。無制限の場合は0を指定して下さい。"
+
+#: ism/utils/scimstringview.c:221
+msgid "Maximum width"
+msgstr "最大幅"
+
+#: ism/utils/scimstringview.c:222
+msgid "Maximum width of this string view."
+msgstr "String viewウィジェットの最大表示幅"
+
+#: ism/utils/scimstringview.c:231
+msgid "Has Frame"
+msgstr "フレーム有りかどうか"
+
+#: ism/utils/scimstringview.c:232
+msgid "FALSE removes outside bevel from string view."
+msgstr "FALSEを指定した場合、文字表示ウィジェットの縁取りを描画しません。"
+
+#: ism/utils/scimstringview.c:239
+msgid "Draw cursor"
+msgstr "カーソルを描画する"
+
+#: ism/utils/scimstringview.c:240
+msgid "TRUE draw blinking cursor."
+msgstr "TRUEを指定した場合、カーソルを点滅させます。"
+
+#: ism/utils/scimstringview.c:247
+msgid "Auto move cursor"
+msgstr "カーソルの自動移動"
+
+#: ism/utils/scimstringview.c:248
+msgid "TRUE auto move cursor position when mouse clicking."
+msgstr "TRUEを指定した場合、マウスクリックされた位置にカーソルが移動します。"
+
+#: ism/utils/scimstringview.c:255
+#, fuzzy
+msgid "Forward button press/release event"
+msgstr "マウスボタンのイベントを送る"
+
+#: ism/utils/scimstringview.c:256
+#, fuzzy
+msgid "TRUE forward button press/release event to user program."
+msgstr "TRUEの場合はマウスボタンのイベントをユーザプログラムに送ります。"
+
+#: ism/utils/scimstringview.c:263
+msgid "Auto resize the widget to fit the string"
+msgstr "文字列に合わせてウィジェットのサイズを自動調整"
+
+#: ism/utils/scimstringview.c:264
+msgid "TRUE Auto resize on."
+msgstr "TRUEを指定した、場合はウィジェットサイズを自動的に調整します。"
+
+#: ism/utils/scimstringview.c:271
+msgid "Emit move_cursor signal when press/release the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:272
+#, fuzzy
+msgid "TRUE Emit move_cursor signal when press the string."
+msgstr "TRUEを指定した場合、マウスクリックされた位置にカーソルが移動します。"
+
+#: ism/utils/scimstringview.c:279
+msgid "Width in chars"
+msgstr "文字の幅"
+
+#: ism/utils/scimstringview.c:280
+msgid "Number of characters to leave space for in the string view."
+msgstr "String viewウィジェットに表示する文字数"
+
+#: ism/utils/scimstringview.c:289
+msgid "Scroll offset"
+msgstr "スクロールオフセット"
+
+#: ism/utils/scimstringview.c:290
+msgid "Number of pixels of the string view scrolled off the screen to the left"
+msgstr "String viewウィジェットが画面左端に畳み込まれた際の表示ピクセル数"
+
+#: ism/utils/scimstringview.c:299
+msgid "Text"
+msgstr "テキスト"
+
+#: ism/utils/scimstringview.c:300
+msgid "The contents of the string view"
+msgstr "String viewウィジェットの内容"
+
+#: ism/utils/scimkeyselection.cpp:161
+msgid "Selected _Keys:"
+msgstr "設定済のキー:"
+
+#: ism/utils/scimkeyselection.cpp:206
+msgid "Key Code:"
+msgstr "キーコード:"
+
+#: ism/utils/scimkeyselection.cpp:224
+#, fuzzy
+msgid "....."
+msgstr "..."
+
+#: ism/utils/scimkeyselection.cpp:229
+msgid "Modifiers:"
+msgstr "モディファイア:"
+
+#: ism/utils/scimkeyselection.cpp:242
+msgid "_Ctrl"
+msgstr "_Ctrl"
+
+#: ism/utils/scimkeyselection.cpp:246
+msgid "A_lt"
+msgstr "A_lt"
+
+#: ism/utils/scimkeyselection.cpp:250
+msgid "_Shift"
+msgstr "_Shift"
+
+#: ism/utils/scimkeyselection.cpp:254
+msgid "_Release"
+msgstr "リリース(_R)"
+
+#: ism/utils/scimkeyselection.cpp:264
+msgid "_Meta"
+msgstr "_Meta"
+
+#: ism/utils/scimkeyselection.cpp:268
+msgid "S_uper"
+msgstr "S_uper"
+
+#: ism/utils/scimkeyselection.cpp:272
+msgid "_Hyper"
+msgstr "_Hyper"
+
+#: ism/utils/scimkeyselection.cpp:337
+msgid "Please enter a Key Code first."
+msgstr "キーコードを先に入力して下さい。"
+
+#: ism/utils/scimkeyselection.cpp:391
+#, fuzzy
+msgid ""
+"Press a key (or a key combination).\n"
+"This dialog will be closed \n"
+"when the key is released."
+msgstr ""
+"キー(もしくは複数のキーの組合せ)を押して下さい。\n"
+"キーをリリースするとこのダイアログは閉じます。"
+
+#: ism/utils/scimkeyselection.cpp:395
+msgid "Grabbing a key."
+msgstr "キー選択"
+
+#: ism/utils/scimkeyselection.cpp:686
+msgid "Key Selection"
+msgstr "キー選択"
+
+#: ism/utils/scimtrayicon.c:108
+msgid "Orientation"
+msgstr "方向"
+
+#: ism/utils/scimtrayicon.c:109
+msgid "The orientation of the tray."
+msgstr "トレイの方向"
+
+#. Normal Layout
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "NORMAL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "click to enter TEXT"
+msgstr ""
+
+#. Number Layout
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "NUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "click to enter NUMBER"
+msgstr ""
+
+#. Email Layout
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "EMAIL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "click to enter EMAIL"
+msgstr ""
+
+#. URL Layout
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "URL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "click to enter URL"
+msgstr ""
+
+#. Phonenumber Layout
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "PHONENUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "click to enter PHONENUMBER"
+msgstr ""
+
+#. IP Layout
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "IP LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "click to enter IP"
+msgstr ""
+
+#. Month Layout
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "MONTH LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "click to enter MONTH"
+msgstr ""
+
+#. Number Only Layout
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "NUMBERONLY LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "click to enter NUMBERONLY"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:220
+msgid "ise layout"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:51
+msgid "Application template"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:52
+msgid "Click to exit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:156
+msgid "Previous"
+msgstr ""
+
+#. bundle_add(ad->data, "navi_btn_left", NULL);
+#: ism/demos/isf_demo_efl.cpp:158
+#, fuzzy
+msgid "Next"
+msgstr "テキスト"
+
+#: ism/demos/isf_demo_efl.cpp:171
+msgid "Quit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:203
+msgid "isf demo"
+msgstr ""
+
+#: ism/demos/isf_entry_event_efl.cpp:151
+msgid "entry event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:220
+msgid "label event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:250
+msgid "ise event demo"
+msgstr ""
+
+#: ism/demos/isf_imcontrol_efl.cpp:375
+msgid "isfimcontrol api"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "キー選択"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Option"
+msgstr "オプション"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+#, fuzzy
+msgid "Auto capitalization"
+msgstr "自動スプリット:"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+#, fuzzy
+msgid "Auto period"
+msgstr "自動スプリット:"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "全般"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "英語/キーボード"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "キー選択"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "キー選択"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "英語/キーボード"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "オプション"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "英語/キーボード"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "アムハラ語"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "常に"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "オプション"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "英語/キーボード"
+
+#~ msgid "English/European"
+#~ msgstr "英語/ヨーロッパ言語"
+
+#~ msgid "RAW CODE"
+#~ msgstr "RAW CODE"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "ホットキー:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " マルチバイトエンコード/ユニコードの切替え\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " 入力メソッドをリセット\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "現在の入力モード。変更するにはここをクリックして下さい。"
+
+#~ msgid "Unicode"
+#~ msgstr "ユニコード"
+
+#~ msgid "Global Setup"
+#~ msgstr "全体設定"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "全てのフロントエンドモジュール(X11 FrontEnd/GTK-Immoduele/Qt-Immoduleを含"
+#~ "む)で使用する全体オプションを設定"
+
+#~ msgid "_Trigger:"
+#~ msgstr "開始/終了(_T):"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "開始/終了キーの設定"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "入力メソッドを開始/終了するキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "Turn _On:"
+#~ msgstr "開始(_O):"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "開始キーの設定"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "入力メソッドを開始するキー。変更する場合は\n"
+#~ "右のボタンをクリックして下さい。"
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "終了(_F):"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "終了キーの設定"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "入力メソッドを終了するキー。変更する場合は\n"
+#~ "右のボタンをクリックして下さい。"
+
+#~ msgid "_Next input method:"
+#~ msgstr "次の入力メソッド(_N):"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "次の入力メソッドキーの設定"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "次の入力メソッドに切替えるキー。変更する場合は\n"
+#~ "右のボタンをクリックして下さい。"
+
+#~ msgid "_Previous input method:"
+#~ msgstr "前の入力メソッド(_P):"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "前の入力メソッドキーの設定"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "前の入力メソッドに切替えるキー。変更する場合は\n"
+#~ "右のボタンをクリックして下さい。"
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "入力メソッドメニューを表示(_M):"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "入力メソッドメニュー表示キーの設定"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "入力メソッドメニューを表示させるキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "キーボード配列(_K):"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "キーボード配列を認識する入力メソッドが正しく動作するように、現在使用されて"
+#~ "いるキーボード配列を選んでください。"
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "未確定文字列を入力対象クライアントのウィンドウに表示(_E)"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "このオプションを有効にすると、未確定文字列は独立した入力ウィンドウにではな"
+#~ "く入力対象クライアントに直接表示されます。"
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "全てのアプリケーションで同一入力メソッドを使用(_S)"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "このオプションを有効にすると、同一の入力メソッドを全てのアプリケーションで"
+#~ "使用できるようになります。アプリケーションごとに別々の入力メソッドを使用す"
+#~ "る場合はこのオプションを無効にして下さい。"
+
+#~ msgid "Hotkeys"
+#~ msgstr "ホットキー"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr "入力メソッドの有効/無効とホットキーの設定を行います。"
+
+#~ msgid "The installed input method services:"
+#~ msgstr "インストールされている入力メソッド:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "ホットキー(_H)"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "この入力メソッドに切り替えるホットキーを編集"
+
+#~ msgid "Select _Filters"
+#~ msgstr "フィルター(_F)"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "この入力メソッドで使用するフィルターを選択"
+
+#~ msgid "_Expand"
+#~ msgstr "開く(_E)"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "全ての言語グループを展開する"
+
+#~ msgid "_Collapse"
+#~ msgstr "閉じる(_C)"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "全ての言語グループを閉じる"
+
+#~ msgid "E_nable All"
+#~ msgstr "全て有効(_N)"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "全ての入力メソッドを有効にする"
+
+#~ msgid "_Disable All"
+#~ msgstr "全て無効(_D)"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "全ての入力メソッドを無効にする"
+
+#~ msgid "Filters"
+#~ msgstr "フィルター"
+
+#~ msgid "Languages"
+#~ msgstr "言語"
+
+#~ msgid "Description"
+#~ msgstr "説明"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "%s のホットキーを編集"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "%s のフィルターを編集"
+
+#~ msgid "Move _Up"
+#~ msgstr "上に移動(_U)"
+
+#~ msgid "Move _Down"
+#~ msgstr "下に移動(_D)"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "GTK+-2.xライブラリによるパネルデーモン"
+
+#~ msgid "On demand"
+#~ msgstr "開始時に"
+
+#~ msgid "Never"
+#~ msgstr "しない"
+
+#~ msgid "ToolBar"
+#~ msgstr "ツールバー"
+
+#~ msgid "_Show:"
+#~ msgstr "表示(_S):"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "オートスナップ(_N)"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "入力メソッドのアイコンを表示(_I)"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "入力メソッドの名称を表示(_U)"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "オートハイド(_O):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "スティックアイコンを表示(_T)"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "メニューアイコンを表示(_E)"
+
+#~ msgid "Show _help icon"
+#~ msgstr "ヘルプアイコンを表示(_H)"
+
+#~ msgid "Show _property label"
+#~ msgstr "プロパティーラベルを表示(_P)"
+
+#~ msgid "Input window"
+#~ msgstr "入力ウィンドウ"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "候補ウィンドウを埋め込む(_M)"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "候補ウィンドウを縦に表示(_V)"
+
+#~ msgid "Misc"
+#~ msgstr "その他"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "トレーアイコンを表示(_Y)"
+
+#~ msgid "Stick _windows"
+#~ msgstr "ウィンドウを固定(_W)"
+
+#~ msgid "_Font:"
+#~ msgstr "フォント(_F):"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "\"常に\"を選ぶと、SCIMがアクティブでない時もツールバーが表示されます。\"開"
+#~ "始時に\"を選ぶと、SCIMがアクティブな時だけ表示されます。\"しない\"を選ぶ"
+#~ "と、SCIMがアクティブな時もツールバーは表示されません。"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "このオプションを有効にするとツールバーが\n"
+#~ "自動的にスクリーンの端に移動します。"
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "ここで設定した時間が経過するとツールバーは自動的に消えます。このオプション"
+#~ "は表示に\"常に\"が選択されている場合にのみ有効です。オートハイドを無効にす"
+#~ "るには値をゼロにして下さい。"
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にすると入力メソッドの\n"
+#~ "アイコンがツールバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にすると入力メソッドの\n"
+#~ "名称がツールバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にするとスティックアイコンが\n"
+#~ "ツールバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にするとメニューアイコンが\n"
+#~ "ツールバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にするとヘルプアイコンが\n"
+#~ "ツールバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "このオプションを有効にすると入力メソッドの\n"
+#~ "プロパティーがツールバーにテキスト表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "このオプションを有効にすると候補ウィンドウが\n"
+#~ "入力ウィンドウの中に表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "このオプションを有効にすると候補ウィンドウが\n"
+#~ "縦に表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "このオプションを有効にするとトレーアイコンが\n"
+#~ "タスクバーに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "このオプションを有効にするとツールバーと入力/候補ウィンドウが\n"
+#~ "本来の表示位置に固定されます。"
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr "このフォント設定は入力/候補ウィンドウに適用されます。"
+
+#~ msgid "Select Interface Font"
+#~ msgstr "インターフェイスのフォントを選択"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "フロントエンド"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMエンジン"
+
+#~ msgid "Panel"
+#~ msgstr "パネル"
+
+#~ msgid "Extra"
+#~ msgstr "その他"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "SCIM入力メソッドの設定"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI セットアップユーティリティ</"
+#~ "span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">%s モジュールの設定</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "SCIMの設定を終了しますか?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "すぐに有効にならない設定項目があります。\n"
+#~ "すべての変更を有効にするにはSCIMを再起動して下さい。"
+
+#~ msgid "SCIM Setup"
+#~ msgstr "SCIMを設定"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "GTK Widget library に基づく統合設定ユーティリティ"
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "Smart Common Input Method platform セットアップユーティリティ"
+
+#~ msgid "SCIM Help"
+#~ msgstr "SCIMヘルプ"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Input Method"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "入力ウィンドウ・ツールバーを固定する/固定しない"
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "SCIMと現在の入力メソッドについて簡単なヘルプを表示します"
+
+#~ msgid "Show command menu."
+#~ msgstr "コマンドメニューを表示"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "設定をリロード"
+
+#~ msgid "Stick Windows"
+#~ msgstr "ウィンドウを固定"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "ツールバーを隠す"
+
+#~ msgid "Help ..."
+#~ msgstr "ヘルプ..."
+
+#~ msgid "Exit"
+#~ msgstr "終了"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "En"
+
+#~ msgid "Preedit String mode"
+#~ msgstr "未確定文字列の表示モード"
+
+#~ msgid "X Window"
+#~ msgstr "Xウィンドウ"
+
+#~ msgid "A FrontEnd module for X11R6 Window System, using XIM Protocol."
+#~ msgstr ""
+#~ "XIMプロトコルによるX11R6ウィンドウシステム用フロントエンドモジュール"
+
+#~ msgid "XIM Settings"
+#~ msgstr "XIMの設定"
+
+#~ msgid "_On The Spot"
+#~ msgstr "_On The Spot"
+
+#~ msgid "_Dynamic Event Flow"
+#~ msgstr "_Dynamic Event Flow"
+
+#~ msgid ""
+#~ "If this option is checked, the OnTheSpot input style will be used when "
+#~ "the client supports it."
+#~ msgstr ""
+#~ "このオプションを有効にするとOn The Spot入力スタイルが適用されます。但し、"
+#~ "クライアント側のサポートが必要です。"
+
+#~ msgid ""
+#~ "If this option is checked, then dynamic event flow will be used.This can "
+#~ "speed up the key event response, especially in remote X11 environment.But "
+#~ "SCIM may become unstable."
+#~ msgstr ""
+#~ "このオプションを有効にすると、特にリモートX11環境においてキーイベントのレ"
+#~ "スポンスを向上させることができます。但し、SCIMが不安定になる場合がありま"
+#~ "す。"
+
+#, fuzzy
+#~ msgid "Slovene"
+#~ msgstr "スロベニア語"
+
+#, fuzzy
+#~ msgid "Global"
+#~ msgstr "全体設定"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>"
+
+#, fuzzy
+#~ msgid "Hot Keys"
+#~ msgstr ""
+#~ "ショートカットキー:\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ "Hot keys:\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ "ショートカットキー:\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " open/close the input method.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ ":\n"
+#~ " 入力メソッドを開始/終了する\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " switch to the next input method.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ ":\n"
+#~ " 次の入力メソッドに切替える\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " switch to the previous input method.\n"
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ " 前の入力メソッドに切替える\n"
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Full/Half Letter"
+#~ msgstr "全角/半角文字"
+
+#~ msgid "Full/Half Punct"
+#~ msgstr "全角/半角句読点"
+
+#~ msgid ""
+#~ "The input mode of the letters. Click to toggle between half and full."
+#~ msgstr ""
+#~ "文字入力モード。全角/半角文字に切替えるにはここをクリックして下さい。"
+
+#~ msgid ""
+#~ "The input mode of the puncutations. Click to toggle between half and full."
+#~ msgstr "句読点入力モード。全角/半角に切替えるにはここをクリックして下さい。"
+
+#~ msgid ""
+#~ " Switch between full/half width letter mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " 全角/半角文字切替\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Switch between full/half width punctuation mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " 全角/半角句読点切替\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Switch between Forward/Input mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr "直接入力/変換入力モードに切替"
+
+#~ msgid ""
+#~ " Add a new phrase.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " 新しいフレーズを追加する\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Delete the selected phrase.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " 選択されたフレーズを削除する\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Control+Down:\n"
+#~ " Move lookup cursor to next shorter phrase\n"
+#~ " Only available when LongPhraseFirst option is set.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Control+Down:\n"
+#~ " カーソルを次のより短いフレーズに移動する\n"
+#~ " \"長いフレーズを優先的に表示\"が有効な場合のみ使用できます。\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Control+Up:\n"
+#~ " Move lookup cursor to previous longer phrase\n"
+#~ " Only available when LongPhraseFirst option is set.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Control+Up:\n"
+#~ " カーソルを前のより長いフレーズに移動する\n"
+#~ " \"長いフレーズを優先的に表示\"が有効な場合のみ使用できます。\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Esc:\n"
+#~ " 入力メソッドをリセット\n"
+#~ "\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "How to add a phrase:\n"
+#~ " Input the new phrase as normal, then press the\n"
+#~ " hot key. A hint will be shown to let you input a key\n"
+#~ " for this phrase.\n"
+#~ " Input a key then press the space bar.\n"
+#~ " A hint will be shown to indicate whether\n"
+#~ " the phrase was added sucessfully.\n"
+#~ msgstr ""
+#~ "フレーズの追加方法:\n"
+#~ " 新しいフレーズを普通に入力しショートカットキーを押します。\n"
+#~ " ヒントが表示され、そのフレーズを入力する際に使うキーの入力\n"
+#~ " を促します。\n"
+#~ " キーを入力しスペースを押して下さい。\n"
+#~ " ヒントにフレーズが正しく登録されたかどうか表示されますので\n"
+#~ " 確認して下さい。\n"
+
+#~ msgid "Input a key string for phrase: "
+#~ msgstr "このフレーズに使うキーを入力して下さい: "
+
+#~ msgid "Success."
+#~ msgstr "登録完了"
+
+#~ msgid "Failed."
+#~ msgstr "登録に失敗しました"
+
+#~ msgid "option -no cannot be used with -o\n"
+#~ msgstr "-noオプションは-oオプションと同時には使用できません\n"
+
+#~ msgid "option -o cannot be used with -no\n"
+#~ msgstr "-oオプションは-noオプションと同時には使用できません\n"
+
+#~ msgid "No argument for option "
+#~ msgstr "オプション引数がありません"
+
+#~ msgid "Invalid option: "
+#~ msgstr "オプションが無効です:"
+
+#~ msgid "Loading table file "
+#~ msgstr "テーブルを読込中"
+
+#~ msgid " ...\n"
+#~ msgstr " ...\n"
+
+#~ msgid "table file load failed!"
+#~ msgstr "テーブルの読込に失敗!"
+
+#~ msgid "Saving frequency table file "
+#~ msgstr "頻度テーブルを保存中"
+
+#~ msgid "frequency table file load failed!"
+#~ msgstr "頻度テーブルの読込に失敗!"
+
+#~ msgid "Saving table file "
+#~ msgstr "テーブルを保存中"
+
+#~ msgid "Table file save failed!"
+#~ msgstr "テーブルの保存に失敗!"
+
+#~ msgid "Generic Table"
+#~ msgstr "汎用テーブル"
+
+#~ msgid "An IMEngine Module which uses generic table input method file."
+#~ msgstr "汎用テーブル入力メソッドを使用するIMエンジンモジュール"
+
+#~ msgid "Full width _punctuation:"
+#~ msgstr "全角/半角句読点(_P):"
+
+#~ msgid "Select full width puncutation keys"
+#~ msgstr "全角/半角句読点切替キーの設定"
+
+#~ msgid ""
+#~ "The key events to switch full/half width punctuation input mode. Click on "
+#~ "the button on the right to edit it."
+#~ msgstr ""
+#~ "全角/半角句読点を切替えるキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "Full width _letter:"
+#~ msgstr "全角/半角文字(_L):"
+
+#~ msgid "Select full width letter keys"
+#~ msgstr "全角/半角文字切替キーの設定"
+
+#~ msgid ""
+#~ "The key events to switch full/half width letter input mode. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "全角/半角文字を切替えるキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "_Mode switch:"
+#~ msgstr "入力モード切替(_M):"
+
+#~ msgid "Select mode switch keys"
+#~ msgstr "入力モード切替キーの設定"
+
+#~ msgid ""
+#~ "The key events to change current input mode. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "入力モードを切替えるキー。変更する場合は\n"
+#~ "右のボタンをクリックして下さい。"
+
+#~ msgid "_Add phrase:"
+#~ msgstr "フレーズ追加(_A):"
+
+#~ msgid "Select add phrase keys."
+#~ msgstr "フレーズ追加キーの設定"
+
+#~ msgid ""
+#~ "The key events to add a new user defined phrase. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "新しいフレーズを追加するキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "_Delete phrase:"
+#~ msgstr "フレーズ削除(_D):"
+
+#~ msgid "Select delete phrase keys."
+#~ msgstr "フレーズ削除キーの設定"
+
+#~ msgid ""
+#~ "The key events to delete a selected phrase. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "選択されたフレーズを削除するキー。変更する\n"
+#~ "場合は右のボタンをクリックして下さい。"
+
+#~ msgid "Show _prompt"
+#~ msgstr "プロンプトを表示(_P)"
+
+#~ msgid "Show key _hint"
+#~ msgstr "ヒントキーを表示(_H)"
+
+#~ msgid "Save _user table in binary format"
+#~ msgstr "ユーザーテーブルをバイナリー形式で保存(_U)"
+
+#~ msgid "Show the u_ser defined phrases first"
+#~ msgstr "ユーザー定義フレーズを優先的に表示(_S)"
+
+#~ msgid "Show the _longer phrases first"
+#~ msgstr "長いフレーズを優先的に表示(_L)"
+
+#~ msgid ""
+#~ "If this option is checked, the key prompt of the currently selected "
+#~ "phrase will be shown."
+#~ msgstr ""
+#~ "このオプションを有効にすると選択された\n"
+#~ "フレーズのキープロンプトが表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the remaining keystrokes of the phraseswill be "
+#~ "shown on the lookup table."
+#~ msgstr ""
+#~ "このオプションを有効にするとフレーズの残りの\n"
+#~ "キーストロークが候補ウィンドウに表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the user table will be stored with binary "
+#~ "format, this will increase the loading speed."
+#~ msgstr ""
+#~ "このオプションを有効にするとユーザー定義テーブルがバイナリー\n"
+#~ "形式で保存されます。テーブルの読込が速くなります。"
+
+#~ msgid ""
+#~ "If this option is checked, the user defined phrases will be shown in "
+#~ "front of others. "
+#~ msgstr ""
+#~ "このオプションを有効にするとユーザー定義フレーズ\n"
+#~ "が優先的に表示されます。"
+
+#~ msgid ""
+#~ "If this option is checked, the longer phrase will be shown in front of "
+#~ "others. "
+#~ msgstr ""
+#~ "このオプションを有効にすると長いフレーズが\n"
+#~ "優先的に表示されます。"
+
+#~ msgid "The installed tables:"
+#~ msgstr "インストール済みのテーブル:"
+
+#~ msgid "_Install"
+#~ msgstr "インストール(_I)"
+
+#~ msgid "Install a new table."
+#~ msgstr "新しいテーブルをインストール"
+
+#~ msgid "_Delete"
+#~ msgstr "削除(_D)"
+
+#~ msgid "Delete the selected table."
+#~ msgstr "選択されたテーブルを削除"
+
+#~ msgid "_Properties"
+#~ msgstr "プロパティー(_P)"
+
+#~ msgid "Edit the properties of the selected table."
+#~ msgstr "選択されたテーブルのプロパティーを編集"
+
+#~ msgid "Table Management"
+#~ msgstr "テーブル管理"
+
+#~ msgid "Select an icon file"
+#~ msgstr "アイコンファイルを選択"
+
+#~ msgid "User"
+#~ msgstr "ユーザー"
+
+#~ msgid "System"
+#~ msgstr "システム"
+
+#~ msgid "Please select the table file to be installed."
+#~ msgstr "インストールするテーブルファイルを選択して下さい。"
+
+#~ msgid "Failed to install the table! It's already in table file directory."
+#~ msgstr "テーブルのインストールに失敗!すでにインストールされています。"
+
+#~ msgid "Failed to load the table file!"
+#~ msgstr "テーブルファイルの読込に失敗!"
+
+#~ msgid ""
+#~ "Failed to install the table! Another version of this table was already "
+#~ "installed."
+#~ msgstr ""
+#~ "テーブルのインストールに失敗!他のバージョンが\n"
+#~ "すでにインストールされています。"
+
+#~ msgid ""
+#~ "Another version of this table was already installed. Do you want to "
+#~ "replace it with the new one?"
+#~ msgstr ""
+#~ "このテーブルの他のバージョンがすでにインストールされています。\n"
+#~ "新しいバージョンに置き換えますか?"
+
+#~ msgid ""
+#~ "Failed to install the table! A table with the same file name was already "
+#~ "installed."
+#~ msgstr ""
+#~ "テーブルのインストールに失敗!同じ名前のテーブルが\n"
+#~ "すでにインストールされています。"
+
+#~ msgid ""
+#~ "A table with the same file name was already installed. Do you want to "
+#~ "overwrite it?"
+#~ msgstr ""
+#~ "同じ名前のテーブルがすでにインストールされています。\n"
+#~ "上書きしますか?"
+
+#~ msgid "Failed to install the table to %s!"
+#~ msgstr "%sにテーブルをインストールできませんでした!"
+
+#~ msgid "Can not delete the file %s!"
+#~ msgstr "ファイル%sを削除できません!"
+
+#~ msgid "Are you sure to delete this table file?"
+#~ msgstr "このテーブルを削除しますか?"
+
+#~ msgid "Failed to delete the table file!"
+#~ msgstr "テーブルの削除に失敗!"
+
+#~ msgid "True"
+#~ msgstr "True"
+
+#~ msgid "False"
+#~ msgstr "False"
+
+#~ msgid "Split Keys:"
+#~ msgstr "スプリットキー:"
+
+#~ msgid "The key strokes to split inputed string."
+#~ msgstr "入力済みの文字列を分割するキー"
+
+#~ msgid "Commit Keys:"
+#~ msgstr "変換確定キー:"
+
+#~ msgid "The key strokes to commit converted result to client."
+#~ msgstr "変換結果をクライアントに送るキー"
+
+#~ msgid "Forward Keys:"
+#~ msgstr "直接入力キー:"
+
+#~ msgid "The key strokes to forward inputed string to client."
+#~ msgstr "入力された文字列を変換せずに直接クライアントに送るキー"
+
+#~ msgid "The key strokes to select candidate phrases in lookup table."
+#~ msgstr "候補ウィンドウからフレーズを選択するキー"
+
+#~ msgid "Page Up Keys:"
+#~ msgstr "前ページキー:"
+
+#~ msgid "The lookup table page up keys"
+#~ msgstr "候補ウィンドウで前のページに戻るキー"
+
+#~ msgid "Page Down Keys:"
+#~ msgstr "次ページキー:"
+
+#~ msgid "The lookup table page down keys"
+#~ msgstr "候補ウィンドウで次のページに進むキー"
+
+#~ msgid "Table Properties"
+#~ msgstr "テーブルのプロパティー"
+
+#~ msgid "Name:"
+#~ msgstr "名称:"
+
+#~ msgid "The name of this table."
+#~ msgstr "このテーブルの名称"
+
+#~ msgid "Author:"
+#~ msgstr "作者:"
+
+#~ msgid "The author of this table."
+#~ msgstr "このテーブルの作者"
+
+#~ msgid "UUID:"
+#~ msgstr "UUID:"
+
+#~ msgid "The unique ID of this table."
+#~ msgstr "このテーブルのID"
+
+#~ msgid "Serial Number:"
+#~ msgstr "バージョン:"
+
+#~ msgid "The serial number of this table."
+#~ msgstr "このテーブルのバージョン"
+
+#~ msgid "Icon File:"
+#~ msgstr "アイコンファイル:"
+
+#~ msgid "The icon file of this table."
+#~ msgstr "このテーブルのアイコンファイル"
+
+#~ msgid "Supported Languages:"
+#~ msgstr "サポート言語:"
+
+#~ msgid "The languages supported by this table."
+#~ msgstr "このテーブルがサポートする言語"
+
+#~ msgid "Status Prompt:"
+#~ msgstr "ステイタスプロンプト:"
+
+#~ msgid "A prompt string to be shown in status area."
+#~ msgstr "ステイタスに表示される文字列"
+
+#~ msgid "Valid Input Chars:"
+#~ msgstr "有効な文字:"
+
+#~ msgid "The valid input chars of this table."
+#~ msgstr "このテーブルで使用できる文字"
+
+#~ msgid "Multi Wildcard Char:"
+#~ msgstr "マルチワイルドカード文字:"
+
+#~ msgid ""
+#~ "The multi wildcard chars of this table. These chars can be used to match "
+#~ "one or more arbitrary chars."
+#~ msgstr ""
+#~ "このテーブルのマルチワイルドカード文字。\n"
+#~ "複数の文字の代わりに使用できます。"
+
+#~ msgid "Single Wildcard Char:"
+#~ msgstr "シングルワイルドカード文字:"
+
+#~ msgid ""
+#~ "The single wildcard chars of this table.These chars can be used to match "
+#~ "one arbitrary char."
+#~ msgstr ""
+#~ "このテーブルのシングルワイルドカード文字。\n"
+#~ "任意の一文字の代わりに使用できます。"
+
+#~ msgid "Max Key Length:"
+#~ msgstr "最大キー数:"
+
+#~ msgid "The maxmium length of key strings."
+#~ msgstr "文字列の最大キー数"
+
+#~ msgid "Show Key Prompt:"
+#~ msgstr "キープロンプトを表示:"
+
+#~ msgid "If true then the key prompts will be shown instead of the raw keys."
+#~ msgstr "Trueの場合は入力された文字の代わりにキープロンプトが表示されます。"
+
+#~ msgid "Auto Select:"
+#~ msgstr "自動選択:"
+
+#~ msgid ""
+#~ "If true then the first candidate phrase will be selected automatically "
+#~ "when inputing the next key."
+#~ msgstr ""
+#~ "Trueの場合は次のフレーズの入力を開始すると同時に入力済みの\n"
+#~ "フレーズに対してその第一変換候補が自動的に選択されます。"
+
+#~ msgid "Auto Wildcard:"
+#~ msgstr "自動ワイルドカード:"
+
+#~ msgid ""
+#~ "If true then a multi wildcard char will be append to the end of inputed "
+#~ "key string when searching phrases."
+#~ msgstr ""
+#~ "Trueの場合は検索時にマルチワイルドカード文字が\n"
+#~ "入力された文字列の最後に自動的に付加されます。"
+
+#~ msgid "Auto Commit:"
+#~ msgstr "自動コミット:"
+
+#~ msgid ""
+#~ "If true then the converted result string will be committed to client "
+#~ "automatically."
+#~ msgstr "Trueの場合は変換結果が自動的にコミットされます。"
+
+#~ msgid ""
+#~ "If true then the inputed key string will be splitted automatically when "
+#~ "necessary."
+#~ msgstr "Trueの場合は、入力された文字列が必要に応じて自動的に分割されます。"
+
+#~ msgid "Discard Invalid Key:"
+#~ msgstr "無効な文字列を排除:"
+
+#~ msgid ""
+#~ "If true then the invalid key will be discarded automatically.This option "
+#~ "is only valid when Auto Select and Auto Commit is true."
+#~ msgstr ""
+#~ "Trueの場合は、入力された無効な文字列を自動的に排除します。このオプションは"
+#~ "自動選択と自動コミットがTrueの場合のみ有効になります。"
+
+#~ msgid "Dynamic Adjust:"
+#~ msgstr "動的アップデート:"
+
+#~ msgid "If true then the phrases' frequencies will be adjusted dynamically."
+#~ msgstr "Trueの場合は、使用頻度情報が動的にアップデートされます。"
+
+#~ msgid "Auto Fill Preedit Area:"
+#~ msgstr "プリエディットの自動補完:"
+
+#~ msgid ""
+#~ "If true then the preedit string will be filled up with the current "
+#~ "candiate phrase automatically.This option is only valid when Auto Select "
+#~ "is TRUE."
+#~ msgstr ""
+#~ "Trueの場合は、自動的にプリエディットが変換候補によって補完されます。\n"
+#~ "このオプションは自動選択がTrueの場合のみ有効になります。"
+
+#~ msgid "Always Show Lookup Table:"
+#~ msgstr "候補リストを常に表示:"
+
+#~ msgid ""
+#~ "If true then the lookup table will always be shown when any candidate "
+#~ "phrase is available. Otherwise the lookup table will only be shown when "
+#~ "necessary.\n"
+#~ "If Auto Fill is false, then this option will be no effect, and always be "
+#~ "true."
+#~ msgstr ""
+#~ "Trueの場合は変換候補があれば常に候補ウィンドウが表示されます。\n"
+#~ "Falseの場合は必要な時のみ表示されます。\n"
+#~ "但し、自動補完が無効の場合は常に表示されます。"
+
+#~ msgid "Default Full Width Punct:"
+#~ msgstr "デフォルト句読点を全角に設定:"
+
+#~ msgid "If true then full width punctuations will be inputed by default."
+#~ msgstr "Trueの場合は、指定のない限り全角句読点が入力されます。"
+
+#~ msgid "Default Full Width Letter:"
+#~ msgstr "デフォルト文字幅を全角に設定:"
+
+#~ msgid "If true then full width letters will be inputed by default."
+#~ msgstr "Trueの場合は、指定のない限り全角文字が入力されます。"
+
+#~ msgid "Invalid icon file."
+#~ msgstr "アイコンファイルが無効です。"
+
+#~ msgid "Invalid languages."
+#~ msgstr "言語が無効です。"
+
+#~ msgid "Invalid status prompt."
+#~ msgstr "ステイタスプロンプトが無効です。"
+
+#~ msgid "Invalid multi wildcard chars."
+#~ msgstr "マルチワイルドカード文字が無効です。"
+
+#~ msgid "Invalid single wildcard chars."
+#~ msgstr "シングルワイルドカード文字が無効です。"
+
+#~ msgid "Invalid commit keys."
+#~ msgstr "コミットキーが無効です。"
+
+#~ msgid "Invalid select keys."
+#~ msgstr "選択キーが無効です。"
+
+#~ msgid "Invalid page up keys."
+#~ msgstr "次ページキーが無効です。"
+
+#~ msgid "Invalid page down keys."
+#~ msgstr "前ページキーが無効です。"
+
+#~ msgid "Invalid max key length."
+#~ msgstr "最大キー数が無効です。"
+
+#~ msgid "Failed to save table %s!"
+#~ msgstr "テーブル%sの保存に失敗!"
+
+#~ msgid "Failed to load any Config Modules!"
+#~ msgstr "設定モジュールの読込に失敗!"
+
+#~ msgid "_Current Config Module:"
+#~ msgstr "現在の設定モジュール(_C):"
+
+#~ msgid "<Not found>"
+#~ msgstr "<見つかりません>"
+
+#~ msgid "Current Config Module has been changed to %s."
+#~ msgstr "現在の設定モジュールを%sに変更しました。"
+
+#~ msgid "Start the SCIM Setup Utility."
+#~ msgstr "SCIMセットアップユーティリティを開く"
+
+#~ msgid "Setup ..."
+#~ msgstr "設定..."
--- /dev/null
+# translation of ko.
+# Copyright (C) 2004 THE ko'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the ko package.
+#
+# Kitae <bluetux@gmail.com>, 2005.
+# Choe Hwanjin <choe.hwanjin@gmail.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: SCIM\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 15:30+0900\n"
+"PO-Revision-Date: 2005-07-08 18:16+0900\n"
+"Last-Translator: Choe Hwanjin <choe.hwanjin@gmail.com>\n"
+"Language-Team: Korean <en@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/src/scim_compose_key.cpp:127 ism/src/scim_imengine.cpp:659
+#: ism/src/scim_panel_agent.cpp:345 ism/src/scim_panel_agent.cpp:4334
+#: ism/src/scim_utility.cpp:701
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1740
+msgid "English/Keyboard"
+msgstr "영어/키보드"
+
+#. return WideString ();
+#: ism/src/scim_compose_key.cpp:146
+msgid "English input service"
+msgstr "영어 입력 서비스"
+
+#: ism/src/scim_utility.cpp:702
+msgid "Amharic"
+msgstr "암하라어"
+
+#: ism/src/scim_utility.cpp:703
+msgid "Arabic"
+msgstr "아랍어"
+
+#: ism/src/scim_utility.cpp:704 ism/src/scim_utility.cpp:893
+msgid "Arabic (Egypt)"
+msgstr "아랍어 (이집트)"
+
+#: ism/src/scim_utility.cpp:705 ism/src/scim_utility.cpp:902
+msgid "Arabic (Lebanon)"
+msgstr "아랍어 (레바논)"
+
+#: ism/src/scim_utility.cpp:706
+msgid "Assamese"
+msgstr "아삼어"
+
+#: ism/src/scim_utility.cpp:707 ism/src/scim_utility.cpp:918
+msgid "Azerbaijani"
+msgstr "아제르바이잔어"
+
+#: ism/src/scim_utility.cpp:708
+msgid "Belarusian"
+msgstr "벨로루시어"
+
+#: ism/src/scim_utility.cpp:709 ism/src/scim_utility.cpp:874
+msgid "Bulgarian"
+msgstr "불가리어"
+
+#: ism/src/scim_utility.cpp:710 ism/src/scim_utility.cpp:711
+#: ism/src/scim_utility.cpp:913
+msgid "Bengali"
+msgstr "벵갈어"
+
+#: ism/src/scim_utility.cpp:712
+msgid "Bengali (India)"
+msgstr "뱅갈어 (인도)"
+
+#: ism/src/scim_utility.cpp:713
+msgid "Tibetan"
+msgstr "티벳어"
+
+#: ism/src/scim_utility.cpp:714
+msgid "Bosnian"
+msgstr "보스니아어"
+
+#: ism/src/scim_utility.cpp:715 ism/src/scim_utility.cpp:853
+msgid "Catalan"
+msgstr "카탈로니아어"
+
+#: ism/src/scim_utility.cpp:716 ism/src/scim_utility.cpp:863
+#: ism/src/scim_keyboard_layout_data.h:4596
+msgid "Czech"
+msgstr "체코어"
+
+#: ism/src/scim_utility.cpp:717 ism/src/scim_utility.cpp:923
+msgid "Welsh"
+msgstr "웨일즈어"
+
+#: ism/src/scim_utility.cpp:718 ism/src/scim_utility.cpp:854
+#: ism/src/scim_keyboard_layout_data.h:4598
+msgid "Danish"
+msgstr "덴마크어"
+
+#: ism/src/scim_utility.cpp:719 ism/src/scim_keyboard_layout_data.h:4606
+msgid "German"
+msgstr "독일어"
+
+#: ism/src/scim_utility.cpp:720
+msgid "Divehi"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:721 ism/src/scim_utility.cpp:873
+#: ism/src/scim_keyboard_layout_data.h:4609
+msgid "Greek"
+msgstr "그리스어"
+
+#: ism/src/scim_utility.cpp:722
+msgid "English"
+msgstr "영어"
+
+#: ism/src/scim_utility.cpp:723 ism/src/scim_utility.cpp:808
+msgid "English (Australian)"
+msgstr "영어 (호주)"
+
+#: ism/src/scim_utility.cpp:724 ism/src/scim_utility.cpp:809
+msgid "English (Canadian)"
+msgstr "영어 (캐나다)"
+
+#: ism/src/scim_utility.cpp:725
+msgid "English (British)"
+msgstr "영어 (영국)"
+
+#: ism/src/scim_utility.cpp:726
+msgid "English (Ireland)"
+msgstr "영어 (아일랜드)"
+
+#: ism/src/scim_utility.cpp:727
+msgid "English (American)"
+msgstr "영어 (미국)"
+
+#: ism/src/scim_utility.cpp:728 ism/src/scim_utility.cpp:729
+#: ism/src/scim_keyboard_layout_data.h:4622
+msgid "Spanish"
+msgstr "스페인어"
+
+#: ism/src/scim_utility.cpp:730
+msgid "Spanish (Mexico)"
+msgstr "스페인어 (멕시코)"
+
+#: ism/src/scim_utility.cpp:731 ism/src/scim_utility.cpp:870
+#: ism/src/scim_keyboard_layout_data.h:4601
+msgid "Estonian"
+msgstr "에스토니아어"
+
+#: ism/src/scim_utility.cpp:732 ism/src/scim_utility.cpp:852
+msgid "Basque"
+msgstr "바스크어"
+
+#: ism/src/scim_utility.cpp:733
+msgid "Persian"
+msgstr "페르시아어"
+
+#: ism/src/scim_utility.cpp:734 ism/src/scim_utility.cpp:857
+#: ism/src/scim_keyboard_layout_data.h:4602
+msgid "Finnish"
+msgstr "핀란드어"
+
+#: ism/src/scim_utility.cpp:735 ism/src/scim_keyboard_layout_data.h:4603
+msgid "French"
+msgstr "프랑스어"
+
+#: ism/src/scim_utility.cpp:736 ism/src/scim_utility.cpp:921
+msgid "Irish"
+msgstr "아일랜드어"
+
+#: ism/src/scim_utility.cpp:737 ism/src/scim_utility.cpp:919
+msgid "Galician"
+msgstr "갈리시아어"
+
+#: ism/src/scim_utility.cpp:738 ism/src/scim_utility.cpp:914
+msgid "Gujarati"
+msgstr "구자라트어"
+
+#: ism/src/scim_utility.cpp:739 ism/src/scim_utility.cpp:748
+#: ism/src/scim_utility.cpp:890
+msgid "Hebrew"
+msgstr "히브리어"
+
+#: ism/src/scim_utility.cpp:740 ism/src/scim_utility.cpp:909
+msgid "Hindi"
+msgstr "힌두어"
+
+#: ism/src/scim_utility.cpp:741 ism/src/scim_keyboard_layout_data.h:4595
+msgid "Croatian"
+msgstr "크로아티아어"
+
+#: ism/src/scim_utility.cpp:742 ism/src/scim_utility.cpp:864
+#: ism/src/scim_keyboard_layout_data.h:4610
+msgid "Hungarian"
+msgstr "헝가리어"
+
+#: ism/src/scim_utility.cpp:743
+msgid "Armenian"
+msgstr "아르메니아어"
+
+#: ism/src/scim_utility.cpp:744
+msgid "Interlingua"
+msgstr "국제어"
+
+#: ism/src/scim_utility.cpp:745
+msgid "Indonesian"
+msgstr "인도네시아어"
+
+#: ism/src/scim_utility.cpp:746 ism/src/scim_utility.cpp:856
+#: ism/src/scim_keyboard_layout_data.h:4628
+msgid "Icelandic"
+msgstr "아이슬란드어"
+
+#: ism/src/scim_utility.cpp:747 ism/src/scim_keyboard_layout_data.h:4611
+msgid "Italian"
+msgstr "이탈리아어"
+
+#: ism/src/scim_utility.cpp:749 ism/src/scim_utility.cpp:882
+#: ism/src/scim_keyboard_layout_data.h:4612
+msgid "Japanese"
+msgstr "일본어"
+
+#: ism/src/scim_utility.cpp:750 ism/src/scim_utility.cpp:917
+msgid "Georgian"
+msgstr "그루지아어"
+
+#: ism/src/scim_utility.cpp:751 ism/src/scim_utility.cpp:875
+msgid "Kazakh"
+msgstr "카자흐어"
+
+#: ism/src/scim_utility.cpp:752
+msgid "Cambodian"
+msgstr "캄보디아어"
+
+#: ism/src/scim_utility.cpp:753
+msgid "Kannada"
+msgstr "칸나다어"
+
+#: ism/src/scim_utility.cpp:754 ism/src/scim_utility.cpp:883
+msgid "Korean"
+msgstr "한국어"
+
+#: ism/src/scim_utility.cpp:755
+msgid "Laothian"
+msgstr "라오스어"
+
+#: ism/src/scim_utility.cpp:756 ism/src/scim_utility.cpp:872
+#: ism/src/scim_keyboard_layout_data.h:4629
+msgid "Lithuanian"
+msgstr "리투아니아어"
+
+#: ism/src/scim_utility.cpp:757 ism/src/scim_utility.cpp:871
+msgid "Latvian"
+msgstr "라트비아어"
+
+#: ism/src/scim_utility.cpp:758 ism/src/scim_utility.cpp:876
+msgid "Macedonian"
+msgstr "마케도니아어"
+
+#: ism/src/scim_utility.cpp:759 ism/src/scim_utility.cpp:915
+msgid "Malayalam"
+msgstr "말라얄람어"
+
+#: ism/src/scim_utility.cpp:760
+msgid "Mongolian"
+msgstr "몽골어"
+
+#: ism/src/scim_utility.cpp:761 ism/src/scim_utility.cpp:911
+msgid "Marathi"
+msgstr "마라타어"
+
+#: ism/src/scim_utility.cpp:762
+msgid "Malay"
+msgstr "말레이어"
+
+#: ism/src/scim_utility.cpp:763
+msgid "Burmese"
+msgstr "버마어"
+
+#: ism/src/scim_utility.cpp:764
+msgid "Nepali"
+msgstr "네팔어"
+
+#: ism/src/scim_utility.cpp:765 ism/src/scim_keyboard_layout_data.h:4599
+msgid "Dutch"
+msgstr "네델란드어"
+
+#: ism/src/scim_utility.cpp:766
+msgid "Norwegian (Nynorsk)"
+msgstr "노르웨이어 (뉘노르스크)"
+
+#: ism/src/scim_utility.cpp:767
+msgid "Norwegian (Bokmal)"
+msgstr "노르웨이어 (부크말)"
+
+#: ism/src/scim_utility.cpp:768
+msgid "Oriya"
+msgstr "오리야어"
+
+#: ism/src/scim_utility.cpp:769 ism/src/scim_utility.cpp:916
+msgid "Punjabi"
+msgstr "펀자브어"
+
+#: ism/src/scim_utility.cpp:770 ism/src/scim_utility.cpp:865
+#: ism/src/scim_keyboard_layout_data.h:4614
+msgid "Polish"
+msgstr "폴란드어"
+
+#: ism/src/scim_utility.cpp:771 ism/src/scim_utility.cpp:773
+#: ism/src/scim_keyboard_layout_data.h:4615
+msgid "Portuguese"
+msgstr "포루투갈어"
+
+#: ism/src/scim_utility.cpp:772 ism/src/scim_keyboard_layout_data.h:4616
+msgid "Portuguese (Brazil)"
+msgstr "포루투갈어 (브라질)"
+
+#: ism/src/scim_utility.cpp:774 ism/src/scim_utility.cpp:866
+msgid "Romanian"
+msgstr "루마니아어"
+
+#: ism/src/scim_utility.cpp:775 ism/src/scim_utility.cpp:877
+#: ism/src/scim_keyboard_layout_data.h:4618
+msgid "Russian"
+msgstr "러시아어"
+
+#: ism/src/scim_utility.cpp:776 ism/src/scim_utility.cpp:922
+msgid "Sinhala"
+msgstr "싱할라어"
+
+#: ism/src/scim_utility.cpp:777 ism/src/scim_utility.cpp:868
+#: ism/src/scim_keyboard_layout_data.h:4619
+msgid "Slovak"
+msgstr "슬로바키아어"
+
+#: ism/src/scim_utility.cpp:778 ism/src/scim_utility.cpp:869
+#: ism/src/scim_keyboard_layout_data.h:4621
+msgid "Slovenian"
+msgstr "슬로베니아어"
+
+#: ism/src/scim_utility.cpp:779
+msgid "Albanian"
+msgstr "알바니아어"
+
+#: ism/src/scim_utility.cpp:780 ism/src/scim_utility.cpp:781
+#: ism/src/scim_utility.cpp:782
+msgid "Serbian"
+msgstr "세르비아어"
+
+#: ism/src/scim_utility.cpp:783 ism/src/scim_utility.cpp:785
+#: ism/src/scim_utility.cpp:861 ism/src/scim_keyboard_layout_data.h:4625
+msgid "Swedish"
+msgstr "스웨덴어"
+
+#: ism/src/scim_utility.cpp:784 ism/src/scim_utility.cpp:862
+msgid "Swedish (Finland)"
+msgstr "스웨덴어 (핀란드)"
+
+#: ism/src/scim_utility.cpp:786 ism/src/scim_utility.cpp:912
+msgid "Tamil"
+msgstr "타밀어"
+
+#: ism/src/scim_utility.cpp:787 ism/src/scim_utility.cpp:910
+msgid "Telugu"
+msgstr "텔루구어"
+
+#: ism/src/scim_utility.cpp:788 ism/src/scim_utility.cpp:889
+msgid "Thai"
+msgstr "타이어"
+
+#: ism/src/scim_utility.cpp:789 ism/src/scim_utility.cpp:880
+#: ism/src/scim_keyboard_layout_data.h:4626
+msgid "Turkish"
+msgstr "터키어"
+
+#: ism/src/scim_utility.cpp:790
+msgid "Uighur"
+msgstr "위그루어"
+
+#: ism/src/scim_utility.cpp:791 ism/src/scim_utility.cpp:879
+#: ism/src/scim_keyboard_layout_data.h:4630
+msgid "Ukrainian"
+msgstr "우크라이나어"
+
+#: ism/src/scim_utility.cpp:792 ism/src/scim_utility.cpp:907
+msgid "Urdu"
+msgstr "우르두어"
+
+#: ism/src/scim_utility.cpp:793
+msgid "Uzbek"
+msgstr "우즈베키스탄어"
+
+#: ism/src/scim_utility.cpp:794 ism/src/scim_utility.cpp:908
+msgid "Vietnamese"
+msgstr "베트남어"
+
+#: ism/src/scim_utility.cpp:795
+msgid "Walloon"
+msgstr "와론어"
+
+#: ism/src/scim_utility.cpp:796 ism/src/scim_utility.cpp:797
+msgid "Yiddish"
+msgstr "이디시어"
+
+#: ism/src/scim_utility.cpp:798
+msgid "Chinese"
+msgstr "중국어"
+
+#: ism/src/scim_utility.cpp:799 ism/src/scim_utility.cpp:801
+msgid "Chinese (Simplified)"
+msgstr "중국어 (간체)"
+
+#: ism/src/scim_utility.cpp:800 ism/src/scim_utility.cpp:802
+msgid "Chinese (Traditional)"
+msgstr "중국어 (번체)"
+
+#: ism/src/scim_utility.cpp:804
+msgid "Dutch (Standard)"
+msgstr "네덜란드어"
+
+#: ism/src/scim_utility.cpp:805
+msgid "Dutch (Belgian)"
+msgstr "네덜란드어 (벨기에)"
+
+#: ism/src/scim_utility.cpp:806
+msgid "English (United States)"
+msgstr "영어 (미국)"
+
+#: ism/src/scim_utility.cpp:807
+msgid "English (United Kingdom)"
+msgstr "영어 (캐나다)"
+
+#: ism/src/scim_utility.cpp:810
+msgid "English (New Zealand)"
+msgstr "영어 (뉴질랜드)"
+
+#: ism/src/scim_utility.cpp:811
+msgid "English (Irish)"
+msgstr "영어 (아일랜드)"
+
+#: ism/src/scim_utility.cpp:812
+msgid "English (South Africa)"
+msgstr "영어 (남아프리카)"
+
+#: ism/src/scim_utility.cpp:813
+msgid "English (Jamaica)"
+msgstr "영어 (자메이카)"
+
+#: ism/src/scim_utility.cpp:814
+msgid "English (Belize)"
+msgstr "영어 (벨리즈)"
+
+#: ism/src/scim_utility.cpp:815
+msgid "English (Trinidad)"
+msgstr "영어 (트리니다드)"
+
+#: ism/src/scim_utility.cpp:816
+msgid "English (Zimbabwe)"
+msgstr "영어 (짐바브웨)"
+
+#: ism/src/scim_utility.cpp:817
+msgid "English (Philippines)"
+msgstr "영어 (필리핀)"
+
+#: ism/src/scim_utility.cpp:818
+msgid "French (Standard)"
+msgstr "프랑스어"
+
+#: ism/src/scim_utility.cpp:819
+msgid "French (Belgian)"
+msgstr "프랑스어 (벨기에)"
+
+#: ism/src/scim_utility.cpp:820 ism/src/scim_keyboard_layout_data.h:4604
+msgid "French (Canadian)"
+msgstr "프랑스어 (캐나다)"
+
+#: ism/src/scim_utility.cpp:821
+msgid "French (Swiss)"
+msgstr "독일어 (스위스)"
+
+#: ism/src/scim_utility.cpp:822
+msgid "French (Luxembourg)"
+msgstr "프랑스어 (룩셈부르크)"
+
+#: ism/src/scim_utility.cpp:823
+msgid "French (Monaco)"
+msgstr "프랑스어 (모나코)"
+
+#: ism/src/scim_utility.cpp:824
+msgid "German (Standard)"
+msgstr "독일어"
+
+#: ism/src/scim_utility.cpp:825 ism/src/scim_keyboard_layout_data.h:4608
+msgid "German (Swiss)"
+msgstr "독일어 (스위스)"
+
+#: ism/src/scim_utility.cpp:826
+msgid "German (Austrian)"
+msgstr "영어 (호주)"
+
+#: ism/src/scim_utility.cpp:827
+msgid "German (Luxembourg)"
+msgstr "독일 (룩셈부르크)"
+
+#: ism/src/scim_utility.cpp:828
+msgid "German (Liechtenstein)"
+msgstr "독일어 (리히텐슈타인)"
+
+#: ism/src/scim_utility.cpp:829
+msgid "Italian (Standard)"
+msgstr "이탈리아어"
+
+#: ism/src/scim_utility.cpp:830
+msgid "Italian (Swiss)"
+msgstr "이탈리아어 (스위스)"
+
+#: ism/src/scim_utility.cpp:831
+msgid "Portuguese (Brazilian)"
+msgstr "포루투갈어 (브라질)"
+
+#: ism/src/scim_utility.cpp:832
+msgid "Portuguese (Standard)"
+msgstr "포루투갈어"
+
+#: ism/src/scim_utility.cpp:833
+msgid "Spanish (Traditional Sort)"
+msgstr "스페인어 (전통 정렬)"
+
+#: ism/src/scim_utility.cpp:834
+msgid "Spanish (Mexican)"
+msgstr "스페인어 (멕시코)"
+
+#: ism/src/scim_utility.cpp:835
+msgid "Spanish (Guatemala)"
+msgstr "스페인어 (과테말라)"
+
+#: ism/src/scim_utility.cpp:836
+msgid "Spanish (Costa Rica)"
+msgstr "스페인어 (코스타리카)"
+
+#: ism/src/scim_utility.cpp:837
+msgid "Spanish (Panama)"
+msgstr "스페인어 (파나마)"
+
+#: ism/src/scim_utility.cpp:838
+msgid "Spanish (Dominican Republic)"
+msgstr "스페인어 (도미니카)"
+
+#: ism/src/scim_utility.cpp:839
+msgid "Spanish (Venezuela)"
+msgstr "스페인어 (베네수엘라)"
+
+#: ism/src/scim_utility.cpp:840
+msgid "Spanish (Colombia)"
+msgstr "스페인어 (콜롬비아)"
+
+#: ism/src/scim_utility.cpp:841
+msgid "Spanish (Peru)"
+msgstr "스페인어 (페루)"
+
+#: ism/src/scim_utility.cpp:842
+msgid "Spanish (Argentina)"
+msgstr "스페인어 (아르헨티나)"
+
+#: ism/src/scim_utility.cpp:843
+msgid "Spanish (Ecuador)"
+msgstr "스페인어 (에콰도르)"
+
+#: ism/src/scim_utility.cpp:844
+msgid "Spanish (Chile)"
+msgstr "스페인어 (칠레)"
+
+#: ism/src/scim_utility.cpp:845
+msgid "Spanish (Uruguay)"
+msgstr "스페인어 (우루과이)"
+
+#: ism/src/scim_utility.cpp:846
+msgid "Spanish (Paraguay)"
+msgstr "스페인어 (파라과이)"
+
+#: ism/src/scim_utility.cpp:847
+msgid "Spanish (Bolivia)"
+msgstr "스페인어 (볼리비아)"
+
+#: ism/src/scim_utility.cpp:848
+msgid "Spanish (El Salvador)"
+msgstr "스페인어 (엘사바도르)"
+
+#: ism/src/scim_utility.cpp:849
+msgid "Spanish (Honduras)"
+msgstr "스페인어 (온두라스)"
+
+#: ism/src/scim_utility.cpp:850
+msgid "Spanish (Nicaragua)"
+msgstr "스페인어 (니카라과)"
+
+#: ism/src/scim_utility.cpp:851
+msgid "Spanish (Puerto Rico)"
+msgstr "스페인어 (푸에르토리코)"
+
+#: ism/src/scim_utility.cpp:855
+msgid "Afrikaans"
+msgstr "아프리칸스어"
+
+#: ism/src/scim_utility.cpp:858
+msgid "Malay (Malaysia)"
+msgstr "말레이어 (말레이시아)"
+
+#: ism/src/scim_utility.cpp:859
+msgid "Malay (Brunei Darussalam)"
+msgstr "말레이어 (브루나이)"
+
+#: ism/src/scim_utility.cpp:860 ism/src/scim_keyboard_layout_data.h:4613
+msgid "Norwegian"
+msgstr "노르웨이어"
+
+#: ism/src/scim_utility.cpp:867
+msgid "Serbian (Latin)"
+msgstr "세르비아어 (라틴)"
+
+#: ism/src/scim_utility.cpp:878
+msgid "Serbian (Cyrillic)"
+msgstr "세르비아어 (키릴)"
+
+#: ism/src/scim_utility.cpp:881
+msgid "Uzbek (Latin)"
+msgstr "우즈벡어 (라틴)"
+
+#: ism/src/scim_utility.cpp:884
+msgid "Chinese (Taiwan)"
+msgstr "중국어 (대만)"
+
+#: ism/src/scim_utility.cpp:885
+msgid "Chinese (Hongkong)"
+msgstr "중국어 (홍콩)"
+
+#: ism/src/scim_utility.cpp:886
+msgid "Chinese (Macau)"
+msgstr "중국어 (마카오)"
+
+#: ism/src/scim_utility.cpp:887
+msgid "Chinese (PRC)"
+msgstr "중국어 (중국)"
+
+#: ism/src/scim_utility.cpp:888
+msgid "Chinese (Singapore)"
+msgstr "중국어 (싱가폴)"
+
+#: ism/src/scim_utility.cpp:891
+msgid "Arabic (Saudi Arabia)"
+msgstr "아랍어 (사우디 아라비아)"
+
+#: ism/src/scim_utility.cpp:892
+msgid "Arabic (Iraq)"
+msgstr "아랍어 (이라크)"
+
+#: ism/src/scim_utility.cpp:894
+msgid "Arabic (Libya)"
+msgstr "아랍어 (리비아)"
+
+#: ism/src/scim_utility.cpp:895
+msgid "Arabic (Algeria)"
+msgstr "아랍어 (알제리)"
+
+#: ism/src/scim_utility.cpp:896
+msgid "Arabic (Morocco)"
+msgstr "아랍어 (모로코)"
+
+#: ism/src/scim_utility.cpp:897
+msgid "Arabic (Tunisia)"
+msgstr "아랍어 (튀니지)"
+
+#: ism/src/scim_utility.cpp:898
+msgid "Arabic (Oman)"
+msgstr "아랍어 (오만)"
+
+#: ism/src/scim_utility.cpp:899
+msgid "Arabic (Yemen)"
+msgstr "아랍어 (예멘)"
+
+#: ism/src/scim_utility.cpp:900
+msgid "Arabic (Syria)"
+msgstr "아랍어 (시리아)"
+
+#: ism/src/scim_utility.cpp:901
+msgid "Arabic (Jordan)"
+msgstr "아랍어 (요르단)"
+
+#: ism/src/scim_utility.cpp:903
+msgid "Arabic (Kuwait)"
+msgstr "아랍어 (쿠웨이트)"
+
+#: ism/src/scim_utility.cpp:904
+msgid "Arabic (UAE)"
+msgstr "아랍어 (아랍에미레이트)"
+
+#: ism/src/scim_utility.cpp:905
+msgid "Arabic (Bahrain)"
+msgstr "아랍어 (바레인)"
+
+#: ism/src/scim_utility.cpp:906
+msgid "Arabic (Qatar)"
+msgstr "아랍어 (카타르)"
+
+#: ism/src/scim_utility.cpp:920
+msgid "Hausa"
+msgstr "하우사어"
+
+#: ism/src/scim_utility.cpp:924
+msgid "Xhosa"
+msgstr "호사족어"
+
+#: ism/src/scim_utility.cpp:925
+msgid "Yoruba"
+msgstr "요루바어"
+
+#: ism/src/scim_utility.cpp:926
+msgid "Zulu"
+msgstr "줄루어"
+
+#: ism/src/scim_utility.cpp:1024
+msgid "Other"
+msgstr "기타"
+
+#: ism/src/scim_keyboard_layout_data.h:4592
+#: ism/modules/imengine/scim_socket_imengine.cpp:408
+#: ism/modules/imengine/scim_socket_imengine.cpp:438
+#: ism/modules/imengine/scim_socket_imengine.cpp:523
+#: ism/modules/imengine/scim_socket_imengine.cpp:553
+#: ism/modules/imengine/scim_socket_imengine.cpp:583
+msgid "Unknown"
+msgstr "알수없는"
+
+#: ism/src/scim_keyboard_layout_data.h:4593
+msgid "English (US)"
+msgstr "영어 (미국)"
+
+#: ism/src/scim_keyboard_layout_data.h:4594
+msgid "Belgian"
+msgstr "벨기에어"
+
+#: ism/src/scim_keyboard_layout_data.h:4597
+msgid "Czech (qwerty)"
+msgstr "체코어 (쿼티)"
+
+#: ism/src/scim_keyboard_layout_data.h:4600
+msgid "Dvorak"
+msgstr "드보락"
+
+#: ism/src/scim_keyboard_layout_data.h:4605
+msgid "French (Switzerland)"
+msgstr "프랑스어 (스위스)"
+
+#: ism/src/scim_keyboard_layout_data.h:4607
+msgid "German (with deadkeys)"
+msgstr "독일어 (데드키 포함)"
+
+#: ism/src/scim_keyboard_layout_data.h:4617
+msgid "Portuguese (Brazil US accents)"
+msgstr "포루투갈어 (브라질 미국 엑센트)"
+
+#: ism/src/scim_keyboard_layout_data.h:4620
+msgid "Slovak (qwerty)"
+msgstr "슬로바키아어 (쿼티)"
+
+#: ism/src/scim_keyboard_layout_data.h:4623
+msgid "Spanish (CP 850)"
+msgstr "스페인어 (CP 850)"
+
+#: ism/src/scim_keyboard_layout_data.h:4624
+msgid "Spanish (Latin America)"
+msgstr "스페인어 (라틴 아메리카)"
+
+#: ism/src/scim_keyboard_layout_data.h:4627
+msgid "English (UK)"
+msgstr "영어 (영국)"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:57
+msgid "Simplified-Traditional Chinese Conversion"
+msgstr "중국어 간체-번체 변환"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:60
+msgid "Convert between Simplified Chinese and Traditional Chinese"
+msgstr "중국어를 간체와 번체로 변환"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:71
+msgid "SC-TC"
+msgstr "간체-번체"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:73
+#: ism/modules/filter/scim_sctc_filter.cpp:78
+msgid "Simplified-Traditional Chinese conversion"
+msgstr "중국어 간체-번체 변환"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:76
+msgid "No Conversion"
+msgstr "변환 하지 않음"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:81
+msgid "Simplified to Traditional"
+msgstr "간체에서 번체로"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:83
+msgid "Convert Simplified Chinese to Traditional Chinese"
+msgstr "간체에서 번체로 변환"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:86
+msgid "Traditional to Simplified"
+msgstr "번체에서 간체로"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:88
+msgid "Convert Traditional Chinese to Simplified Chinese"
+msgstr "번체에서 간체로 변환"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:300
+msgid "James Su <suzhe@tsinghua.org.cn>"
+msgstr "제임스 수 <suzhe@tsinghua.org.cn>"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:425
+#: ism/modules/filter/scim_sctc_filter.cpp:555
+#: ism/modules/filter/scim_sctc_filter.cpp:571
+msgid "SC->TC"
+msgstr "간체->번체"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:431
+#: ism/modules/filter/scim_sctc_filter.cpp:559
+#: ism/modules/filter/scim_sctc_filter.cpp:575
+msgid "TC->SC"
+msgstr "번체->간체"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1693
+msgid "Smart Common Input Method platform "
+msgstr "똑똑한 일반 입력 방식 플랫폼 "
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1695
+msgid ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+msgstr ""
+"\n"
+"(C) 2002-2005 제임스 수 <suzhe@tsinghua.org.cn>\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1700
+msgid ""
+":\n"
+"\n"
+msgstr ""
+":\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1703
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:963
+msgid "Enable"
+msgstr "활성화"
+
+#. gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+#. gtk_tree_view_column_set_fixed_width (column, 232);
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:984
+msgid "Name"
+msgstr "이름"
+
+#: ism/utils/scimstringview.c:201
+msgid "Cursor Position"
+msgstr "커서 위치"
+
+#: ism/utils/scimstringview.c:202
+msgid "The current position of the insertion cursor in chars."
+msgstr "문자열에서 커서의 현재 위치."
+
+#: ism/utils/scimstringview.c:211
+msgid "Maximum length"
+msgstr "최대 길이"
+
+#: ism/utils/scimstringview.c:212
+msgid "Maximum number of characters for this string view. Zero if no maximum."
+msgstr "문자열를 보기 위한 최대 문자수, 0은 제한 없음."
+
+#: ism/utils/scimstringview.c:221
+msgid "Maximum width"
+msgstr "최대폭"
+
+#: ism/utils/scimstringview.c:222
+msgid "Maximum width of this string view."
+msgstr "문자열 보기의 최대 넓이."
+
+#: ism/utils/scimstringview.c:231
+msgid "Has Frame"
+msgstr "프레임을 가짐"
+
+#: ism/utils/scimstringview.c:232
+msgid "FALSE removes outside bevel from string view."
+msgstr "거짓으로 설정하면 문자열 보기의 외각 경사가 없어집니다."
+
+#: ism/utils/scimstringview.c:239
+msgid "Draw cursor"
+msgstr "커서 그리기"
+
+#: ism/utils/scimstringview.c:240
+msgid "TRUE draw blinking cursor."
+msgstr "참으로 설정하면 커서를 깜빡이게 합니다."
+
+#: ism/utils/scimstringview.c:247
+msgid "Auto move cursor"
+msgstr "자동 커서 이동"
+
+#: ism/utils/scimstringview.c:248
+msgid "TRUE auto move cursor position when mouse clicking."
+msgstr "참으로 설정하면 마우스 클릭시 자동 커서가 이동합니다."
+
+#: ism/utils/scimstringview.c:255
+msgid "Forward button press/release event"
+msgstr "전달 버튼 프레스 이벤트를 전달함"
+
+#: ism/utils/scimstringview.c:256
+msgid "TRUE forward button press/release event to user program."
+msgstr "참으로 설정하면 버튼 프레스 이벤트를 사용자 프로그램에 전달."
+
+#: ism/utils/scimstringview.c:263
+msgid "Auto resize the widget to fit the string"
+msgstr "문자열에 크기에 따라 위젯 크기 자동 조절"
+
+#: ism/utils/scimstringview.c:264
+msgid "TRUE Auto resize on."
+msgstr "참으로 설정하면 자동으로 크기가 변합니다."
+
+#: ism/utils/scimstringview.c:271
+msgid "Emit move_cursor signal when press/release the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:272
+msgid "TRUE Emit move_cursor signal when press the string."
+msgstr "참으로 설정하면 마우스 클릭시 자동 커서가 이동합니다."
+
+#: ism/utils/scimstringview.c:279
+msgid "Width in chars"
+msgstr "폭(글자 단위)"
+
+#: ism/utils/scimstringview.c:280
+msgid "Number of characters to leave space for in the string view."
+msgstr "문자열 보기에서 공간을 만들기위해 사용할 글자수."
+
+#: ism/utils/scimstringview.c:289
+msgid "Scroll offset"
+msgstr "스크롤 단위"
+
+#: ism/utils/scimstringview.c:290
+msgid "Number of pixels of the string view scrolled off the screen to the left"
+msgstr "화면 좌측으로 부터 문자열 보기에서 스크롤을 위한 픽셀수"
+
+#: ism/utils/scimstringview.c:299
+msgid "Text"
+msgstr "본문"
+
+#: ism/utils/scimstringview.c:300
+msgid "The contents of the string view"
+msgstr "문자열 보기의 내용"
+
+#: ism/utils/scimkeyselection.cpp:161
+msgid "Selected _Keys:"
+msgstr "선택된 키(_K):"
+
+#: ism/utils/scimkeyselection.cpp:206
+msgid "Key Code:"
+msgstr "키 코드:"
+
+#: ism/utils/scimkeyselection.cpp:224
+msgid "....."
+msgstr "....."
+
+#: ism/utils/scimkeyselection.cpp:229
+msgid "Modifiers:"
+msgstr "수정:"
+
+#: ism/utils/scimkeyselection.cpp:242
+msgid "_Ctrl"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:246
+msgid "A_lt"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:250
+msgid "_Shift"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:254
+msgid "_Release"
+msgstr "놓음(_R)"
+
+#: ism/utils/scimkeyselection.cpp:264
+msgid "_Meta"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:268
+msgid "S_uper"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:272
+msgid "_Hyper"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:337
+msgid "Please enter a Key Code first."
+msgstr "키 코드를 입력하십시오"
+
+#: ism/utils/scimkeyselection.cpp:391
+msgid ""
+"Press a key (or a key combination).\n"
+"This dialog will be closed \n"
+"when the key is released."
+msgstr ""
+"키를 누르십시오(또는 키의 조합을).\n"
+"키 선택 후 이창은 자동으로 닫힙니다."
+
+#: ism/utils/scimkeyselection.cpp:395
+msgid "Grabbing a key."
+msgstr "키를 기록합니다."
+
+#: ism/utils/scimkeyselection.cpp:686
+msgid "Key Selection"
+msgstr "키 선택"
+
+#: ism/utils/scimtrayicon.c:108
+msgid "Orientation"
+msgstr "방향"
+
+#: ism/utils/scimtrayicon.c:109
+msgid "The orientation of the tray."
+msgstr "트레이의 방향."
+
+#. Normal Layout
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "NORMAL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "click to enter TEXT"
+msgstr ""
+
+#. Number Layout
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "NUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "click to enter NUMBER"
+msgstr ""
+
+#. Email Layout
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "EMAIL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "click to enter EMAIL"
+msgstr ""
+
+#. URL Layout
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "URL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "click to enter URL"
+msgstr ""
+
+#. Phonenumber Layout
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "PHONENUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "click to enter PHONENUMBER"
+msgstr ""
+
+#. IP Layout
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "IP LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "click to enter IP"
+msgstr ""
+
+#. Month Layout
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "MONTH LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "click to enter MONTH"
+msgstr ""
+
+#. Number Only Layout
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "NUMBERONLY LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "click to enter NUMBERONLY"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:220
+msgid "ise layout"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:51
+msgid "Application template"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:52
+msgid "Click to exit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:156
+msgid "Previous"
+msgstr "이전"
+
+#. bundle_add(ad->data, "navi_btn_left", NULL);
+#: ism/demos/isf_demo_efl.cpp:158
+msgid "Next"
+msgstr "다음"
+
+#: ism/demos/isf_demo_efl.cpp:171
+msgid "Quit"
+msgstr "종료"
+
+#: ism/demos/isf_demo_efl.cpp:203
+msgid "isf demo"
+msgstr ""
+
+#: ism/demos/isf_entry_event_efl.cpp:151
+msgid "entry event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:220
+msgid "label event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:250
+msgid "ise event demo"
+msgstr ""
+
+#: ism/demos/isf_imcontrol_efl.cpp:375
+msgid "isfimcontrol api"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr "설정"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+msgid "Selection"
+msgstr "키보드 선택"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, c-format
+msgid "Option"
+msgstr "옵션"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr "자동 대문자"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr "\".\" 단축키"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+msgid "General"
+msgstr "일반"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+msgid "S/W keyboard"
+msgstr "소프트 키보드"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+msgid "Keyboard selection"
+msgstr "키보드 선택"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+msgid "Keyboard option"
+msgstr "키보드 옵션"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+msgid "H/W keyboard"
+msgstr "하드웨어 키보드"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+msgid "option"
+msgstr "옵션"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr "이전"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+msgid "Keyboard"
+msgstr "키보드"
+
+#~ msgid "Automatic"
+#~ msgstr "자동"
+
+#~ msgid "Always used"
+#~ msgstr "항상"
+
+#~ msgid "Done"
+#~ msgstr "완료"
+
+#~ msgid "Qwerty keyboard"
+#~ msgstr "Qwerty 키보드"
+
+#~ msgid "Phone keypad"
+#~ msgstr "폰 키보드"
+
+#~ msgid "%s Option"
+#~ msgstr "%s 옵션"
+
+#~ msgid "S/W keyboard connection"
+#~ msgstr "소프트웨어 키보드 연결"
+
+# msgid "MoAKey Korean"
+# msgstr "모아키 한국어"
+# msgid "MoAKey Chinese"
+# msgstr "모아키 중국어"
+# msgid "MoAKey Indic"
+# msgstr "모아키 인도어"
+# msgid "Indic"
+# msgstr "인도어"
+# msgid "Western Europe 1 & US"
+# msgstr "서유럽어 및 영어 키보드"
+#~ msgid "Keyboards"
+#~ msgstr "키보드"
+
+#~ msgid "Add new Keyboard"
+#~ msgstr "키보드 추가"
+
+#~ msgid "Supporting keyboard"
+#~ msgstr "지원 키보드"
+
+#~ msgid "Cancel"
+#~ msgstr "취소"
+
+#~ msgid "Keyboard Types"
+#~ msgstr "키보드 타입"
+
+#~ msgid "Writing languages"
+#~ msgstr "입력언어"
+
+#~ msgid "language"
+#~ msgstr "언어"
+
+#~ msgid "ISE selection"
+#~ msgstr "ISE 선택"
+
+#~ msgid "Text input"
+#~ msgstr "문자 입력 설정"
+
+#~ msgid "RAW CODE"
+#~ msgstr "RAW CODE"
+
+#~ msgid "(C) 2002-2006 Ja/mes Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 제임스 수 <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "단축키:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " 멀티바이트 인코딩과 유니코드간 전환.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " 입력기 초기화.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "현재 입력 상태입니다. 바꾸길 원하시면 클릭하십시오."
+
+#~ msgid "Unicode"
+#~ msgstr "유니코드"
+
+#~ msgid "Global Setup"
+#~ msgstr "전체 설정"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "X11, GTK 입력모듈, QT 입력모듈 등 모든 프론트엔드에대한 전체 설정을 합니"
+#~ "다."
+
+#~ msgid "_Trigger:"
+#~ msgstr "전환키(_T):"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "전환키 선택"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "SCIM 입력방식을 끄고/켜기 위한 키 설정입니다. 우측 단추를 클릭하고 수정하"
+#~ "세요."
+
+#~ msgid "Turn _On:"
+#~ msgstr "활성화(_O):"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "활성화키 선택"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "SCIM 입력방식을 켜기 위한 키 설정. 우측 단추를 클릭하고 수정하세요."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "끄기(_f):"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "끄기 키 선택"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "SCIM 입력방식을 끄기 위한 키 설정. 우측 단추를 클릭하고 수정하세요."
+
+#~ msgid "_Next input method:"
+#~ msgstr "다음 입력방식(_N):"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "다음 입력 방식으로 바꾸는데 사용할 키 선택"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "다음 입력방식으로 전환을 위한 키설정. 오를쪽 단추를 클릭하고 수정하세요."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "이전 입력방식(_P):"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "이전 입력방식을 선택"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "이전 입력방식으로 전환을 위한 키 설정. 우측 단추를 클릭하고 수정하세요."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "입력방식 방법 보여줌(_M)"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "입력 방식 보여줌 메뉴 키 선택"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "입력방식 메뉴를 보여줌 설정. 오를쪽 단추를 클릭하고 수정하세요."
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "현재 사용하는 키보드 레이아웃을 선택하세요, 그래야만 사용하려는 입력방법들"
+#~ "이 정확히 작동할수 있습니다."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "조합중인 글자를 클라이언트 윈도우에서 보여줌(_E)"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "이 옵션을 켜면, 조합중인 글자가 독립된 창에서 보이지 않고 입력창에서 바로 "
+#~ "보이게됩니다."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "모든 프로그램에 같은 입력 방법을 공유(_S)"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "이 옵션을 켜면 단하나의 입력 방법을 모든 프로그램에서 동시에 사용하게됩니"
+#~ "다. 선택하지 않으면 각각의 프로그램에서 다른 입력 방법이 적용됩니다."
+
+#~ msgid "Hotkeys"
+#~ msgstr "단축키"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr "각 입력 방법들과 단축키를 활성화하거나, 비활성화 할수 있습니다."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "설치된 입력기 서비스들:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "단축키 수정(_H)"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "선택된 입력 방식에 관련된 단축키 수정."
+
+#~ msgid "Select _Filters"
+#~ msgstr "필터 선택"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "현재 입력 방법에 연결될 필터 선택."
+
+#~ msgid "_Expand"
+#~ msgstr "확장(_E)"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "모든 언어 카테고리를 확장 "
+
+#~ msgid "_Collapse"
+#~ msgstr "축소(_C)"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "모든 언어 카테고리를 축소."
+
+#~ msgid "E_nable All"
+#~ msgstr "모두 활성화(_n)"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "모든 입력 방법을 활성화 "
+
+#~ msgid "_Disable All"
+#~ msgstr "모두 비활성(_D)"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "모든 입력 모듈 비활성화"
+
+#~ msgid "Filters"
+#~ msgstr "필터"
+
+#~ msgid "Description"
+#~ msgstr "설명"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "%s 단축기 수정"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "%s(을)를 위한 필터 선택"
+
+#~ msgid "Move _Up"
+#~ msgstr "위로(_U)"
+
+#~ msgid "Move _Down"
+#~ msgstr "아래로(_D)"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "GTK+-2.x 라이브러리를 기반으로 한 패널 디먼"
+
+#~ msgid "On demand"
+#~ msgstr "필요할때"
+
+#~ msgid "Never"
+#~ msgstr "전혀안함"
+
+#~ msgid "ToolBar"
+#~ msgstr "도구바"
+
+#~ msgid "_Show:"
+#~ msgstr "보이기(_S):"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "자동 스냅(_n)"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "입력방식 아이콘 보임(_i)"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "입력방식 이름 보임(_u)"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "숨기기 시간 제한(_o):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "고정 아이콘 보임(_t)"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "메뉴 아이콘 보임(_e)"
+
+#~ msgid "Show _help icon"
+#~ msgstr "도움말 아이콘 보임(_h)"
+
+#~ msgid "Show _property label"
+#~ msgstr "속성 상태 보임(_p)"
+
+#~ msgid "Input window"
+#~ msgstr "입력창"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "내장된 미리보기 테이블 사용(_m)"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "미리보기 테이블 세로로 보기(_V)"
+
+#~ msgid "Misc"
+#~ msgstr "기타"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "트레이 아이콘 보이기(_y)"
+
+#~ msgid "Stick _windows"
+#~ msgstr "창 고정(_w)"
+
+#~ msgid "_Font:"
+#~ msgstr "글꼴(_F):"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "\"항상\" 옵션이 선택되면 도구상자는 항상 화면에 보이게 됩니다. \"필요할때"
+#~ "\" 옵션이 선택되면 SCIM이 활성화 됐을 때만 보이게 됩니다. \"전혀안함\" 옵"
+#~ "션을 선택하면 전혀 보이지 않게 됩니다."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "이 설정을 선택하면, 도구상자가 화면 가장자리에 맞춰 움직이게 됩니다."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "일정 시간이 지나면 도구상자가 사라질 것입니다. 이 옵션은 \"항상 보임\" 옵"
+#~ "션이 선택 되어 있을때 작동합니다. 0으로 설정하면 작동하지 않습니다."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr "이 옵션을 선택하면, 입력방법 아이콘이 도구상자에 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr "이 옵션을 선택하면, 입력방법의 이름이 도구상자에 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr "이 옵션을 선택하면, 고정 아이콘이 도구상자에 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr "이 옵션을 선택하면, 메뉴 아이콘이 도구상자에 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr "이 옵션을 선택하면, 도구창에 도움말 아이콘이 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "이 옵션을 선택하면, 입력 방식의 속성들을 도구상자에서 볼 수 있습니다."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr "이 옵션을 선택하면, 미리보기 테이블이 입력창에 바로 붙을 것입니다."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr "이 옵션을 선택하면, 미리보기 테이블이 세로로 나타납니다."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "이 옵션을 선택하면, 트레이 아이콘이 데스크탑 테스크바에 보이게 됩니다."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "이 옵션을 선택하면, 도구상자, 입력창과 미리보기창들의 위치가 고정됩니다."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr "글꼴 설정은 입력창과 미리보기 테이블 창에 사용됩니다."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "글꼴 선택"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "프론트엔드"
+
+#~ msgid "IMEngine"
+#~ msgstr "입력기엔진"
+
+#~ msgid "Extra"
+#~ msgstr "기타"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "SCIM 입력기 설정"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">똑똑한 공통 입력 방법</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI 설정 프로그램</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, 제임스 수 <suzhe@tsinghua."
+#~ "org.cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">%s 모듈을 위한 설정.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "SCIM 설정을 종료하시겠습니까?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "모든 환경 설정을 새로 불러오진 못 합니다. 새로운 환경설정을 모두 적용 하"
+#~ "기 위해서는 SCIM을 다시 시작해야 합니다."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "SCIM 설정"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "GTK 라이브러리 기반의 설정 프로그램"
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "똑똑한 공통 입력 방법 (SCIM)을 위한 설정 프로그램"
+
+#~ msgid "SCIM Help"
+#~ msgstr "SCIM 도움말"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "똑똑한 공통 입력 방법"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "입력창과 도구상자 고정/비고정."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "SCIM 과 현재 입력 방법에 대한 간단한 도움말을 보여줌."
+
+#~ msgid "Show command menu."
+#~ msgstr "명령 메뉴를 보임."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 제임스 수 <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "설정 새로 불러오기"
+
+#~ msgid "Stick Windows"
+#~ msgstr "윈도우 고정"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "도구바 숨김"
+
+#~ msgid "Help ..."
+#~ msgstr "도움말 ..."
+
+#~ msgid "Exit"
+#~ msgstr "끝내기"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "En"
--- /dev/null
+# translation of nl.po to Nederlands
+# This file is distributed under the same license as the scim package.
+# Copyright (C) 2004 THE scim'S COPYRIGHT HOLDER.
+#
+#
+# Ronald Stroethoff <stroet43@zonnet.nl>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: nl\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 15:30+0900\n"
+"PO-Revision-Date: 2007-03-17 18:54+0100\n"
+"Last-Translator: Ronald Stroethoff <stroet43@zonnet.nl>\n"
+"Language-Team: Nederlands\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: ism/src/scim_compose_key.cpp:127 ism/src/scim_imengine.cpp:659
+#: ism/src/scim_panel_agent.cpp:345 ism/src/scim_panel_agent.cpp:4334
+#: ism/src/scim_utility.cpp:701
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1740
+msgid "English/Keyboard"
+msgstr "Nederlands/toetsenbord"
+
+#. return WideString ();
+#: ism/src/scim_compose_key.cpp:146
+#, fuzzy
+msgid "English input service"
+msgstr "Engels (USA)"
+
+#: ism/src/scim_utility.cpp:702
+msgid "Amharic"
+msgstr "Amhaars"
+
+#: ism/src/scim_utility.cpp:703
+msgid "Arabic"
+msgstr "Arabisch"
+
+#: ism/src/scim_utility.cpp:704 ism/src/scim_utility.cpp:893
+msgid "Arabic (Egypt)"
+msgstr "Arabisch (Egyptisch)"
+
+#: ism/src/scim_utility.cpp:705 ism/src/scim_utility.cpp:902
+msgid "Arabic (Lebanon)"
+msgstr "Arabisch (Libanees)"
+
+#: ism/src/scim_utility.cpp:706
+msgid "Assamese"
+msgstr "Assamitisch"
+
+#: ism/src/scim_utility.cpp:707 ism/src/scim_utility.cpp:918
+msgid "Azerbaijani"
+msgstr "Azerbeidzjaans"
+
+#: ism/src/scim_utility.cpp:708
+msgid "Belarusian"
+msgstr "Witrussisch"
+
+#: ism/src/scim_utility.cpp:709 ism/src/scim_utility.cpp:874
+msgid "Bulgarian"
+msgstr "Bulgaars"
+
+#: ism/src/scim_utility.cpp:710 ism/src/scim_utility.cpp:711
+#: ism/src/scim_utility.cpp:913
+msgid "Bengali"
+msgstr "Bengaals"
+
+#: ism/src/scim_utility.cpp:712
+msgid "Bengali (India)"
+msgstr "Bengaals (India)"
+
+#: ism/src/scim_utility.cpp:713
+msgid "Tibetan"
+msgstr "Tibetaans"
+
+#: ism/src/scim_utility.cpp:714
+msgid "Bosnian"
+msgstr "Bosnisch"
+
+#: ism/src/scim_utility.cpp:715 ism/src/scim_utility.cpp:853
+msgid "Catalan"
+msgstr "Catalaans"
+
+#: ism/src/scim_utility.cpp:716 ism/src/scim_utility.cpp:863
+#: ism/src/scim_keyboard_layout_data.h:4596
+msgid "Czech"
+msgstr "Tschechisch"
+
+#: ism/src/scim_utility.cpp:717 ism/src/scim_utility.cpp:923
+msgid "Welsh"
+msgstr "Welsh"
+
+#: ism/src/scim_utility.cpp:718 ism/src/scim_utility.cpp:854
+#: ism/src/scim_keyboard_layout_data.h:4598
+msgid "Danish"
+msgstr "Deens"
+
+#: ism/src/scim_utility.cpp:719 ism/src/scim_keyboard_layout_data.h:4606
+msgid "German"
+msgstr "Duits"
+
+#: ism/src/scim_utility.cpp:720
+msgid "Divehi"
+msgstr "Divehi"
+
+#: ism/src/scim_utility.cpp:721 ism/src/scim_utility.cpp:873
+#: ism/src/scim_keyboard_layout_data.h:4609
+msgid "Greek"
+msgstr "Grieks"
+
+#: ism/src/scim_utility.cpp:722
+msgid "English"
+msgstr "Engels"
+
+#: ism/src/scim_utility.cpp:723 ism/src/scim_utility.cpp:808
+msgid "English (Australian)"
+msgstr "Engels (Australie)"
+
+#: ism/src/scim_utility.cpp:724 ism/src/scim_utility.cpp:809
+msgid "English (Canadian)"
+msgstr "Engels (Canada)"
+
+#: ism/src/scim_utility.cpp:725
+msgid "English (British)"
+msgstr "Engels (Groot Britannie)"
+
+#: ism/src/scim_utility.cpp:726
+msgid "English (Ireland)"
+msgstr "Engels (Ierland)"
+
+#: ism/src/scim_utility.cpp:727
+msgid "English (American)"
+msgstr "Engels (USA)"
+
+#: ism/src/scim_utility.cpp:728 ism/src/scim_utility.cpp:729
+#: ism/src/scim_keyboard_layout_data.h:4622
+msgid "Spanish"
+msgstr "Spaans"
+
+#: ism/src/scim_utility.cpp:730
+msgid "Spanish (Mexico)"
+msgstr "Spaans (Mexico)"
+
+#: ism/src/scim_utility.cpp:731 ism/src/scim_utility.cpp:870
+#: ism/src/scim_keyboard_layout_data.h:4601
+msgid "Estonian"
+msgstr "Estlands"
+
+#: ism/src/scim_utility.cpp:732 ism/src/scim_utility.cpp:852
+msgid "Basque"
+msgstr "Baskisch"
+
+#: ism/src/scim_utility.cpp:733
+msgid "Persian"
+msgstr "Perzisch"
+
+#: ism/src/scim_utility.cpp:734 ism/src/scim_utility.cpp:857
+#: ism/src/scim_keyboard_layout_data.h:4602
+msgid "Finnish"
+msgstr "Fins"
+
+#: ism/src/scim_utility.cpp:735 ism/src/scim_keyboard_layout_data.h:4603
+msgid "French"
+msgstr "Frans"
+
+#: ism/src/scim_utility.cpp:736 ism/src/scim_utility.cpp:921
+msgid "Irish"
+msgstr "Iers"
+
+#: ism/src/scim_utility.cpp:737 ism/src/scim_utility.cpp:919
+msgid "Galician"
+msgstr "Galicisch"
+
+#: ism/src/scim_utility.cpp:738 ism/src/scim_utility.cpp:914
+msgid "Gujarati"
+msgstr "Gujarati"
+
+#: ism/src/scim_utility.cpp:739 ism/src/scim_utility.cpp:748
+#: ism/src/scim_utility.cpp:890
+msgid "Hebrew"
+msgstr "Hebreeuws"
+
+#: ism/src/scim_utility.cpp:740 ism/src/scim_utility.cpp:909
+msgid "Hindi"
+msgstr "Hindi"
+
+#: ism/src/scim_utility.cpp:741 ism/src/scim_keyboard_layout_data.h:4595
+msgid "Croatian"
+msgstr "Kroatisch"
+
+#: ism/src/scim_utility.cpp:742 ism/src/scim_utility.cpp:864
+#: ism/src/scim_keyboard_layout_data.h:4610
+msgid "Hungarian"
+msgstr "Hongaars"
+
+#: ism/src/scim_utility.cpp:743
+msgid "Armenian"
+msgstr "Armeens"
+
+#: ism/src/scim_utility.cpp:744
+msgid "Interlingua"
+msgstr "Interlingua"
+
+#: ism/src/scim_utility.cpp:745
+msgid "Indonesian"
+msgstr "Indonesisch"
+
+#: ism/src/scim_utility.cpp:746 ism/src/scim_utility.cpp:856
+#: ism/src/scim_keyboard_layout_data.h:4628
+msgid "Icelandic"
+msgstr "IJslands"
+
+#: ism/src/scim_utility.cpp:747 ism/src/scim_keyboard_layout_data.h:4611
+msgid "Italian"
+msgstr "Italiaans"
+
+#: ism/src/scim_utility.cpp:749 ism/src/scim_utility.cpp:882
+#: ism/src/scim_keyboard_layout_data.h:4612
+msgid "Japanese"
+msgstr "Japans"
+
+#: ism/src/scim_utility.cpp:750 ism/src/scim_utility.cpp:917
+msgid "Georgian"
+msgstr "Georgisch"
+
+#: ism/src/scim_utility.cpp:751 ism/src/scim_utility.cpp:875
+msgid "Kazakh"
+msgstr "Kazachs"
+
+#: ism/src/scim_utility.cpp:752
+msgid "Cambodian"
+msgstr "Cambojaans"
+
+#: ism/src/scim_utility.cpp:753
+msgid "Kannada"
+msgstr "Kannada"
+
+#: ism/src/scim_utility.cpp:754 ism/src/scim_utility.cpp:883
+msgid "Korean"
+msgstr "Koreaans"
+
+#: ism/src/scim_utility.cpp:755
+msgid "Laothian"
+msgstr "Laothian"
+
+#: ism/src/scim_utility.cpp:756 ism/src/scim_utility.cpp:872
+#: ism/src/scim_keyboard_layout_data.h:4629
+msgid "Lithuanian"
+msgstr "Litouws"
+
+#: ism/src/scim_utility.cpp:757 ism/src/scim_utility.cpp:871
+msgid "Latvian"
+msgstr "Lets"
+
+#: ism/src/scim_utility.cpp:758 ism/src/scim_utility.cpp:876
+msgid "Macedonian"
+msgstr "Macedonisch"
+
+#: ism/src/scim_utility.cpp:759 ism/src/scim_utility.cpp:915
+msgid "Malayalam"
+msgstr "Malayalam"
+
+#: ism/src/scim_utility.cpp:760
+msgid "Mongolian"
+msgstr "Mongools"
+
+#: ism/src/scim_utility.cpp:761 ism/src/scim_utility.cpp:911
+msgid "Marathi"
+msgstr "Marathi"
+
+#: ism/src/scim_utility.cpp:762
+msgid "Malay"
+msgstr "Maleis"
+
+#: ism/src/scim_utility.cpp:763
+msgid "Burmese"
+msgstr "Birmaans"
+
+#: ism/src/scim_utility.cpp:764
+msgid "Nepali"
+msgstr "Nepalees"
+
+#: ism/src/scim_utility.cpp:765 ism/src/scim_keyboard_layout_data.h:4599
+msgid "Dutch"
+msgstr "Nederlands"
+
+#: ism/src/scim_utility.cpp:766
+#, fuzzy
+msgid "Norwegian (Nynorsk)"
+msgstr "Noors (Nynorsk)"
+
+#: ism/src/scim_utility.cpp:767
+#, fuzzy
+msgid "Norwegian (Bokmal)"
+msgstr "Noors (Bokmal)"
+
+#: ism/src/scim_utility.cpp:768
+msgid "Oriya"
+msgstr "Oriya"
+
+#: ism/src/scim_utility.cpp:769 ism/src/scim_utility.cpp:916
+msgid "Punjabi"
+msgstr "Punjabi"
+
+#: ism/src/scim_utility.cpp:770 ism/src/scim_utility.cpp:865
+#: ism/src/scim_keyboard_layout_data.h:4614
+msgid "Polish"
+msgstr "Pools"
+
+#: ism/src/scim_utility.cpp:771 ism/src/scim_utility.cpp:773
+#: ism/src/scim_keyboard_layout_data.h:4615
+msgid "Portuguese"
+msgstr "Portugees"
+
+#: ism/src/scim_utility.cpp:772 ism/src/scim_keyboard_layout_data.h:4616
+msgid "Portuguese (Brazil)"
+msgstr "Portugees (Brazilie)"
+
+#: ism/src/scim_utility.cpp:774 ism/src/scim_utility.cpp:866
+msgid "Romanian"
+msgstr "Roemeens"
+
+#: ism/src/scim_utility.cpp:775 ism/src/scim_utility.cpp:877
+#: ism/src/scim_keyboard_layout_data.h:4618
+msgid "Russian"
+msgstr "Russisch"
+
+#: ism/src/scim_utility.cpp:776 ism/src/scim_utility.cpp:922
+msgid "Sinhala"
+msgstr "Singalees"
+
+#: ism/src/scim_utility.cpp:777 ism/src/scim_utility.cpp:868
+#: ism/src/scim_keyboard_layout_data.h:4619
+msgid "Slovak"
+msgstr "Slowaaks"
+
+#: ism/src/scim_utility.cpp:778 ism/src/scim_utility.cpp:869
+#: ism/src/scim_keyboard_layout_data.h:4621
+msgid "Slovenian"
+msgstr "Sloveens"
+
+#: ism/src/scim_utility.cpp:779
+msgid "Albanian"
+msgstr "Albanees"
+
+#: ism/src/scim_utility.cpp:780 ism/src/scim_utility.cpp:781
+#: ism/src/scim_utility.cpp:782
+msgid "Serbian"
+msgstr "Servisch"
+
+#: ism/src/scim_utility.cpp:783 ism/src/scim_utility.cpp:785
+#: ism/src/scim_utility.cpp:861 ism/src/scim_keyboard_layout_data.h:4625
+msgid "Swedish"
+msgstr "Zweeds"
+
+#: ism/src/scim_utility.cpp:784 ism/src/scim_utility.cpp:862
+msgid "Swedish (Finland)"
+msgstr "Zweeds (Finland)"
+
+#: ism/src/scim_utility.cpp:786 ism/src/scim_utility.cpp:912
+msgid "Tamil"
+msgstr "Tamil"
+
+#: ism/src/scim_utility.cpp:787 ism/src/scim_utility.cpp:910
+msgid "Telugu"
+msgstr "Telugu"
+
+#: ism/src/scim_utility.cpp:788 ism/src/scim_utility.cpp:889
+msgid "Thai"
+msgstr "Thais"
+
+#: ism/src/scim_utility.cpp:789 ism/src/scim_utility.cpp:880
+#: ism/src/scim_keyboard_layout_data.h:4626
+msgid "Turkish"
+msgstr "Turks"
+
+#: ism/src/scim_utility.cpp:790
+msgid "Uighur"
+msgstr "Oeigoers"
+
+#: ism/src/scim_utility.cpp:791 ism/src/scim_utility.cpp:879
+#: ism/src/scim_keyboard_layout_data.h:4630
+msgid "Ukrainian"
+msgstr "Oekraïens"
+
+#: ism/src/scim_utility.cpp:792 ism/src/scim_utility.cpp:907
+msgid "Urdu"
+msgstr "Urdu"
+
+#: ism/src/scim_utility.cpp:793
+msgid "Uzbek"
+msgstr "Oezbeeks"
+
+#: ism/src/scim_utility.cpp:794 ism/src/scim_utility.cpp:908
+msgid "Vietnamese"
+msgstr "Vietnamees"
+
+#: ism/src/scim_utility.cpp:795
+msgid "Walloon"
+msgstr "Waals"
+
+#: ism/src/scim_utility.cpp:796 ism/src/scim_utility.cpp:797
+msgid "Yiddish"
+msgstr "Jiddisch"
+
+#: ism/src/scim_utility.cpp:798
+msgid "Chinese"
+msgstr "Chinees"
+
+#: ism/src/scim_utility.cpp:799 ism/src/scim_utility.cpp:801
+#, fuzzy
+msgid "Chinese (Simplified)"
+msgstr "Chinees (versimpeld)"
+
+#: ism/src/scim_utility.cpp:800 ism/src/scim_utility.cpp:802
+#, fuzzy
+msgid "Chinese (Traditional)"
+msgstr "Chinees (traditioneell)"
+
+#: ism/src/scim_utility.cpp:804
+msgid "Dutch (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:805
+#, fuzzy
+msgid "Dutch (Belgian)"
+msgstr "Belgisch"
+
+#: ism/src/scim_utility.cpp:806
+#, fuzzy
+msgid "English (United States)"
+msgstr "Engels (US)"
+
+#: ism/src/scim_utility.cpp:807
+#, fuzzy
+msgid "English (United Kingdom)"
+msgstr "Engels (Canada)"
+
+#: ism/src/scim_utility.cpp:810
+#, fuzzy
+msgid "English (New Zealand)"
+msgstr "Engels (Ierland)"
+
+#: ism/src/scim_utility.cpp:811
+#, fuzzy
+msgid "English (Irish)"
+msgstr "Engels (Groot Britannie)"
+
+#: ism/src/scim_utility.cpp:812
+#, fuzzy
+msgid "English (South Africa)"
+msgstr "Engels (USA)"
+
+#: ism/src/scim_utility.cpp:813
+#, fuzzy
+msgid "English (Jamaica)"
+msgstr "Engels (Canada)"
+
+#: ism/src/scim_utility.cpp:814
+#, fuzzy
+msgid "English (Belize)"
+msgstr "Engels (Groot Britannie)"
+
+#: ism/src/scim_utility.cpp:815
+#, fuzzy
+msgid "English (Trinidad)"
+msgstr "Engels (Groot Britannie)"
+
+#: ism/src/scim_utility.cpp:816
+#, fuzzy
+msgid "English (Zimbabwe)"
+msgstr "Engels (Canada)"
+
+#: ism/src/scim_utility.cpp:817
+#, fuzzy
+msgid "English (Philippines)"
+msgstr "Engels (Groot Britannie)"
+
+#: ism/src/scim_utility.cpp:818
+#, fuzzy
+msgid "French (Standard)"
+msgstr "Frans (Canada)"
+
+#: ism/src/scim_utility.cpp:819
+#, fuzzy
+msgid "French (Belgian)"
+msgstr "Frans (Canada)"
+
+#: ism/src/scim_utility.cpp:820 ism/src/scim_keyboard_layout_data.h:4604
+msgid "French (Canadian)"
+msgstr "Frans (Canada)"
+
+#: ism/src/scim_utility.cpp:821
+#, fuzzy
+msgid "French (Swiss)"
+msgstr "Duits (Schwitsers)"
+
+#: ism/src/scim_utility.cpp:822
+msgid "French (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:823
+#, fuzzy
+msgid "French (Monaco)"
+msgstr "Frans (Canada)"
+
+#: ism/src/scim_utility.cpp:824
+#, fuzzy
+msgid "German (Standard)"
+msgstr "Duits (met deadkeys)"
+
+#: ism/src/scim_utility.cpp:825 ism/src/scim_keyboard_layout_data.h:4608
+msgid "German (Swiss)"
+msgstr "Duits (Schwitsers)"
+
+#: ism/src/scim_utility.cpp:826
+#, fuzzy
+msgid "German (Austrian)"
+msgstr "Engels (Australie)"
+
+#: ism/src/scim_utility.cpp:827
+msgid "German (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:828
+#, fuzzy
+msgid "German (Liechtenstein)"
+msgstr "Duits (Schwitsers)"
+
+#: ism/src/scim_utility.cpp:829
+msgid "Italian (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:830
+#, fuzzy
+msgid "Italian (Swiss)"
+msgstr "Duits (Schwitsers)"
+
+#: ism/src/scim_utility.cpp:831
+#, fuzzy
+msgid "Portuguese (Brazilian)"
+msgstr "Portugees (Brazilie)"
+
+#: ism/src/scim_utility.cpp:832
+#, fuzzy
+msgid "Portuguese (Standard)"
+msgstr "Portugees (Brazilie)"
+
+#: ism/src/scim_utility.cpp:833
+#, fuzzy
+msgid "Spanish (Traditional Sort)"
+msgstr "Spaans (Latijns Amerika)"
+
+#: ism/src/scim_utility.cpp:834
+#, fuzzy
+msgid "Spanish (Mexican)"
+msgstr "Spaans (Mexico)"
+
+#: ism/src/scim_utility.cpp:835
+#, fuzzy
+msgid "Spanish (Guatemala)"
+msgstr "Spaans (Latijns Amerika)"
+
+#: ism/src/scim_utility.cpp:836
+#, fuzzy
+msgid "Spanish (Costa Rica)"
+msgstr "Spaans (Latijns Amerika)"
+
+#: ism/src/scim_utility.cpp:837
+#, fuzzy
+msgid "Spanish (Panama)"
+msgstr "Spaans (Latijns Amerika)"
+
+#: ism/src/scim_utility.cpp:838
+#, fuzzy
+msgid "Spanish (Dominican Republic)"
+msgstr "Spaans (Latijns Amerika)"
+
+#: ism/src/scim_utility.cpp:839
+#, fuzzy
+msgid "Spanish (Venezuela)"
+msgstr "Spaans (Mexico)"
+
+#: ism/src/scim_utility.cpp:840
+#, fuzzy
+msgid "Spanish (Colombia)"
+msgstr "Spaans (Mexico)"
+
+#: ism/src/scim_utility.cpp:841
+#, fuzzy
+msgid "Spanish (Peru)"
+msgstr "Spaans (Mexico)"
+
+#: ism/src/scim_utility.cpp:842
+#, fuzzy
+msgid "Spanish (Argentina)"
+msgstr "Spaans (Mexico)"
+
+#: ism/src/scim_utility.cpp:843
+#, fuzzy
+msgid "Spanish (Ecuador)"
+msgstr "Spaans (Mexico)"
+
+#: ism/src/scim_utility.cpp:844
+#, fuzzy
+msgid "Spanish (Chile)"
+msgstr "Spaans (Mexico)"
+
+#: ism/src/scim_utility.cpp:845
+#, fuzzy
+msgid "Spanish (Uruguay)"
+msgstr "Spaans (Mexico)"
+
+#: ism/src/scim_utility.cpp:846
+#, fuzzy
+msgid "Spanish (Paraguay)"
+msgstr "Spaans (CP 850)"
+
+#: ism/src/scim_utility.cpp:847
+#, fuzzy
+msgid "Spanish (Bolivia)"
+msgstr "Spaans (Mexico)"
+
+#: ism/src/scim_utility.cpp:848
+msgid "Spanish (El Salvador)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:849
+#, fuzzy
+msgid "Spanish (Honduras)"
+msgstr "Spaans (Mexico)"
+
+#: ism/src/scim_utility.cpp:850
+#, fuzzy
+msgid "Spanish (Nicaragua)"
+msgstr "Spaans (Mexico)"
+
+#: ism/src/scim_utility.cpp:851
+#, fuzzy
+msgid "Spanish (Puerto Rico)"
+msgstr "Spaans (Mexico)"
+
+#: ism/src/scim_utility.cpp:855
+msgid "Afrikaans"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:858
+#, fuzzy
+msgid "Malay (Malaysia)"
+msgstr "Malayalam"
+
+#: ism/src/scim_utility.cpp:859
+msgid "Malay (Brunei Darussalam)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:860 ism/src/scim_keyboard_layout_data.h:4613
+msgid "Norwegian"
+msgstr "Noors"
+
+#: ism/src/scim_utility.cpp:867
+#, fuzzy
+msgid "Serbian (Latin)"
+msgstr "Servisch"
+
+#: ism/src/scim_utility.cpp:878
+msgid "Serbian (Cyrillic)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:881
+msgid "Uzbek (Latin)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:884
+#, fuzzy
+msgid "Chinese (Taiwan)"
+msgstr "Chinees (traditioneell)"
+
+#: ism/src/scim_utility.cpp:885
+#, fuzzy
+msgid "Chinese (Hong Kong)"
+msgstr "Chinees (traditioneell)"
+
+#: ism/src/scim_utility.cpp:886
+#, fuzzy
+msgid "Chinese (Macau)"
+msgstr "Chinees (traditioneell)"
+
+#: ism/src/scim_utility.cpp:887
+#, fuzzy
+msgid "Chinese (PRC)"
+msgstr "Chinees"
+
+#: ism/src/scim_utility.cpp:888
+#, fuzzy
+msgid "Chinese (Singapore)"
+msgstr "Chinees (versimpeld)"
+
+#: ism/src/scim_utility.cpp:891
+msgid "Arabic (Saudi Arabia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:892
+#, fuzzy
+msgid "Arabic (Iraq)"
+msgstr "Arabisch (Libanees)"
+
+#: ism/src/scim_utility.cpp:894
+#, fuzzy
+msgid "Arabic (Libya)"
+msgstr "Arabisch (Libanees)"
+
+#: ism/src/scim_utility.cpp:895
+#, fuzzy
+msgid "Arabic (Algeria)"
+msgstr "Arabisch (Libanees)"
+
+#: ism/src/scim_utility.cpp:896
+#, fuzzy
+msgid "Arabic (Morocco)"
+msgstr "Arabisch (Libanees)"
+
+#: ism/src/scim_utility.cpp:897
+#, fuzzy
+msgid "Arabic (Tunisia)"
+msgstr "Arabisch (Libanees)"
+
+#: ism/src/scim_utility.cpp:898
+#, fuzzy
+msgid "Arabic (Oman)"
+msgstr "Arabisch (Libanees)"
+
+#: ism/src/scim_utility.cpp:899
+#, fuzzy
+msgid "Arabic (Yemen)"
+msgstr "Arabisch (Libanees)"
+
+#: ism/src/scim_utility.cpp:900
+#, fuzzy
+msgid "Arabic (Syria)"
+msgstr "Arabisch (Egyptisch)"
+
+#: ism/src/scim_utility.cpp:901
+#, fuzzy
+msgid "Arabic (Jordan)"
+msgstr "Arabisch (Libanees)"
+
+#: ism/src/scim_utility.cpp:903
+#, fuzzy
+msgid "Arabic (Kuwait)"
+msgstr "Arabisch (Egyptisch)"
+
+#: ism/src/scim_utility.cpp:904
+#, fuzzy
+msgid "Arabic (UAE)"
+msgstr "Arabisch (Egyptisch)"
+
+#: ism/src/scim_utility.cpp:905
+#, fuzzy
+msgid "Arabic (Bahrain)"
+msgstr "Arabisch (Libanees)"
+
+#: ism/src/scim_utility.cpp:906
+#, fuzzy
+msgid "Arabic (Qatar)"
+msgstr "Arabisch (Egyptisch)"
+
+#: ism/src/scim_utility.cpp:920
+msgid "Hausa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:924
+msgid "Xhosa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:925
+msgid "Yoruba"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:926
+msgid "Zulu"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:1024
+msgid "Other"
+msgstr "Overige"
+
+#: ism/src/scim_keyboard_layout_data.h:4592
+#: ism/modules/imengine/scim_socket_imengine.cpp:408
+#: ism/modules/imengine/scim_socket_imengine.cpp:438
+#: ism/modules/imengine/scim_socket_imengine.cpp:523
+#: ism/modules/imengine/scim_socket_imengine.cpp:553
+#: ism/modules/imengine/scim_socket_imengine.cpp:583
+msgid "Unknown"
+msgstr "Onbekend"
+
+#: ism/src/scim_keyboard_layout_data.h:4593
+msgid "English (US)"
+msgstr "Engels (US)"
+
+#: ism/src/scim_keyboard_layout_data.h:4594
+msgid "Belgian"
+msgstr "Belgisch"
+
+#: ism/src/scim_keyboard_layout_data.h:4597
+msgid "Czech (qwerty)"
+msgstr "Tsjechisch (qwerty)"
+
+#: ism/src/scim_keyboard_layout_data.h:4600
+msgid "Dvorak"
+msgstr "Dvorak"
+
+#: ism/src/scim_keyboard_layout_data.h:4605
+msgid "French (Switzerland)"
+msgstr "Frans (Schwitsers) "
+
+#: ism/src/scim_keyboard_layout_data.h:4607
+msgid "German (with deadkeys)"
+msgstr "Duits (met deadkeys)"
+
+#: ism/src/scim_keyboard_layout_data.h:4617
+msgid "Portuguese (Brazil US accents)"
+msgstr "Portugees (Brazilie, US, accent)"
+
+#: ism/src/scim_keyboard_layout_data.h:4620
+msgid "Slovak (qwerty)"
+msgstr "Slowaaks (qwerty)"
+
+#: ism/src/scim_keyboard_layout_data.h:4623
+msgid "Spanish (CP 850)"
+msgstr "Spaans (CP 850)"
+
+#: ism/src/scim_keyboard_layout_data.h:4624
+msgid "Spanish (Latin America)"
+msgstr "Spaans (Latijns Amerika)"
+
+#: ism/src/scim_keyboard_layout_data.h:4627
+msgid "English (UK)"
+msgstr "Engels (UK)"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:57
+msgid "Simplified-Traditional Chinese Conversion"
+msgstr "Omzetten versimpeld/traditioneel Chinees"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:60
+msgid "Convert between Simplified Chinese and Traditional Chinese"
+msgstr "Versimpeld naar traditioneel Chinees omzetten en omgekeert."
+
+#: ism/modules/filter/scim_sctc_filter.cpp:71
+#, fuzzy
+msgid "SC-TC"
+msgstr "VC-TC"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:73
+#: ism/modules/filter/scim_sctc_filter.cpp:78
+msgid "Simplified-Traditional Chinese conversion"
+msgstr "Omzetting versimpeld naar traditioneel Chinees"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:76
+msgid "No Conversion"
+msgstr "Geen omzetting"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:81
+msgid "Simplified to Traditional"
+msgstr "Versimpeld naar traditioneel"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:83
+msgid "Convert Simplified Chinese to Traditional Chinese"
+msgstr "Versimpeld Chinees naar triditioneel Chinees omzetten"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:86
+msgid "Traditional to Simplified"
+msgstr "Traditioneel naar versimpeld"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:88
+msgid "Convert Traditional Chinese to Simplified Chinese"
+msgstr "Traditioneel Chinees naar versimpeld Chinees omzetten"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:300
+msgid "James Su <suzhe@tsinghua.org.cn>"
+msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:425
+#: ism/modules/filter/scim_sctc_filter.cpp:555
+#: ism/modules/filter/scim_sctc_filter.cpp:571
+msgid "SC->TC"
+msgstr "VC->TC"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:431
+#: ism/modules/filter/scim_sctc_filter.cpp:559
+#: ism/modules/filter/scim_sctc_filter.cpp:575
+msgid "TC->SC"
+msgstr "TC->VC"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1693
+msgid "Smart Common Input Method platform "
+msgstr "Smart Common Invoer-methode Plattform "
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1695
+msgid ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+msgstr ""
+"\n"
+"(c) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1700
+msgid ""
+":\n"
+"\n"
+msgstr ""
+":\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1703
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:963
+msgid "Enable"
+msgstr "Aanzetten"
+
+#. gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+#. gtk_tree_view_column_set_fixed_width (column, 232);
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:984
+msgid "Name"
+msgstr "Naam"
+
+#: ism/utils/scimstringview.c:201
+msgid "Cursor Position"
+msgstr "Cursor positie"
+
+#: ism/utils/scimstringview.c:202
+msgid "The current position of the insertion cursor in chars."
+msgstr "De huidige positie van de cursor (in karakters)."
+
+#: ism/utils/scimstringview.c:211
+msgid "Maximum length"
+msgstr "Maximale lengte"
+
+#: ism/utils/scimstringview.c:212
+msgid "Maximum number of characters for this string view. Zero if no maximum."
+msgstr "Maximale aantal getoonde karakters. »0« betekend onbegrenst."
+
+#: ism/utils/scimstringview.c:221
+msgid "Maximum width"
+msgstr "Maximale Breedte"
+
+#: ism/utils/scimstringview.c:222
+msgid "Maximum width of this string view."
+msgstr "Maximale Breedte van de getoonde letterreeks."
+
+#: ism/utils/scimstringview.c:231
+msgid "Has Frame"
+msgstr "Met kader"
+
+#: ism/utils/scimstringview.c:232
+msgid "FALSE removes outside bevel from string view."
+msgstr "\"Nee\" verwijdert de buitenste rand van de getoonde letter-reeks."
+
+#: ism/utils/scimstringview.c:239
+msgid "Draw cursor"
+msgstr "Cursor tonen"
+
+#: ism/utils/scimstringview.c:240
+msgid "TRUE draw blinking cursor."
+msgstr "Met \"JA\" wordt een knipperende cursor getoond."
+
+#: ism/utils/scimstringview.c:247
+msgid "Auto move cursor"
+msgstr "Cursor automatisch verplaatsen"
+
+#: ism/utils/scimstringview.c:248
+msgid "TRUE auto move cursor position when mouse clicking."
+msgstr "Bij »ja«, wordt de cursor automatisch verschoven."
+
+#: ism/utils/scimstringview.c:255
+#, fuzzy
+msgid "Forward button press/release event"
+msgstr "Drukknop voor het doorgeven"
+
+#: ism/utils/scimstringview.c:256
+#, fuzzy
+msgid "TRUE forward button press/release event to user program."
+msgstr ""
+"Bij »ja«, wordt de gekozen uitdrukking met elke druk op een toets aan het "
+"programma doorgegeven."
+
+#: ism/utils/scimstringview.c:263
+msgid "Auto resize the widget to fit the string"
+msgstr "Venster-formaat automatisch aan teken-lengte aanpassen"
+
+#: ism/utils/scimstringview.c:264
+msgid "TRUE Auto resize on."
+msgstr "Bei »ja« is de automatische grootte-aanpassing ingeschakeld."
+
+#: ism/utils/scimstringview.c:271
+msgid "Emit move_cursor signal when press/release the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:272
+#, fuzzy
+msgid "TRUE Emit move_cursor signal when press the string."
+msgstr "Bij »ja«, wordt de cursor automatisch verschoven."
+
+#: ism/utils/scimstringview.c:279
+msgid "Width in chars"
+msgstr "Breedte in tekens"
+
+#: ism/utils/scimstringview.c:280
+msgid "Number of characters to leave space for in the string view."
+msgstr "Aantal tekens waarvoor ruimte gelaten wordt."
+
+#: ism/utils/scimstringview.c:289
+msgid "Scroll offset"
+msgstr "Scroll-instelling"
+
+#: ism/utils/scimstringview.c:290
+msgid "Number of pixels of the string view scrolled off the screen to the left"
+msgstr ""
+"Aantal pixels, waarmee de tekenreeks weergave buiten het scherm naar links "
+"verschoven wordt"
+
+#: ism/utils/scimstringview.c:299
+msgid "Text"
+msgstr "Tekst"
+
+#: ism/utils/scimstringview.c:300
+msgid "The contents of the string view"
+msgstr "Inhoud van de tekenreeks weergave"
+
+#: ism/utils/scimkeyselection.cpp:161
+msgid "Selected _Keys:"
+msgstr "Gekozen toetsen:"
+
+#: ism/utils/scimkeyselection.cpp:206
+msgid "Key Code:"
+msgstr "Toetsen Code:"
+
+#: ism/utils/scimkeyselection.cpp:224
+#, fuzzy
+msgid "....."
+msgstr "..."
+
+#: ism/utils/scimkeyselection.cpp:229
+msgid "Modifiers:"
+msgstr "Wizigings-toetsen:"
+
+#: ism/utils/scimkeyselection.cpp:242
+msgid "_Ctrl"
+msgstr "_Ctrl"
+
+#: ism/utils/scimkeyselection.cpp:246
+msgid "A_lt"
+msgstr "_Alt"
+
+#: ism/utils/scimkeyselection.cpp:250
+msgid "_Shift"
+msgstr "_Shift"
+
+#: ism/utils/scimkeyselection.cpp:254
+msgid "_Release"
+msgstr "_Vrijgeven"
+
+#: ism/utils/scimkeyselection.cpp:264
+msgid "_Meta"
+msgstr "_Meta"
+
+#: ism/utils/scimkeyselection.cpp:268
+msgid "S_uper"
+msgstr "Su_per"
+
+#: ism/utils/scimkeyselection.cpp:272
+msgid "_Hyper"
+msgstr "_Hyper"
+
+#: ism/utils/scimkeyselection.cpp:337
+msgid "Please enter a Key Code first."
+msgstr "Geef eerst een toets-code op."
+
+#: ism/utils/scimkeyselection.cpp:391
+#, fuzzy
+msgid ""
+"Press a key (or a key combination).\n"
+"This dialog will be closed \n"
+"when the key is released."
+msgstr ""
+"Druk eerst een toets in (of een toetscombinatie).\n"
+" Dit dialoog sluit zich, wanneer de toets wordt losgelaten."
+
+#: ism/utils/scimkeyselection.cpp:395
+msgid "Grabbing a key."
+msgstr "Een toets pakken."
+
+#: ism/utils/scimkeyselection.cpp:686
+msgid "Key Selection"
+msgstr "Toetsen selectie"
+
+#: ism/utils/scimtrayicon.c:108
+msgid "Orientation"
+msgstr "Oriëntatie"
+
+#: ism/utils/scimtrayicon.c:109
+msgid "The orientation of the tray."
+msgstr "De richting van de werkbalk."
+
+#. Normal Layout
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "NORMAL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "click to enter TEXT"
+msgstr ""
+
+#. Number Layout
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "NUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "click to enter NUMBER"
+msgstr ""
+
+#. Email Layout
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "EMAIL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "click to enter EMAIL"
+msgstr ""
+
+#. URL Layout
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "URL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "click to enter URL"
+msgstr ""
+
+#. Phonenumber Layout
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "PHONENUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "click to enter PHONENUMBER"
+msgstr ""
+
+#. IP Layout
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "IP LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "click to enter IP"
+msgstr ""
+
+#. Month Layout
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "MONTH LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "click to enter MONTH"
+msgstr ""
+
+#. Number Only Layout
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "NUMBERONLY LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "click to enter NUMBERONLY"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:220
+msgid "ise layout"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:51
+msgid "Application template"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:52
+msgid "Click to exit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:156
+msgid "Previous"
+msgstr ""
+
+#. bundle_add(ad->data, "navi_btn_left", NULL);
+#: ism/demos/isf_demo_efl.cpp:158
+#, fuzzy
+msgid "Next"
+msgstr "Tekst"
+
+#: ism/demos/isf_demo_efl.cpp:171
+msgid "Quit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:203
+msgid "isf demo"
+msgstr ""
+
+#: ism/demos/isf_entry_event_efl.cpp:151
+msgid "entry event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:220
+msgid "label event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:250
+msgid "ise event demo"
+msgstr ""
+
+#: ism/demos/isf_imcontrol_efl.cpp:375
+msgid "isfimcontrol api"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "Toetsen selectie"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Option"
+msgstr "Opties"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "Duits"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "Nederlands/toetsenbord"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Toetsen selectie"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "Toetsen selectie"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "Nederlands/toetsenbord"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "Opties"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "Nederlands/toetsenbord"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amhaars"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Altijd"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Opties"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Nederlands/toetsenbord"
+
+#~ msgid "English/European"
+#~ msgstr "Nederlands/Europeesch"
+
+#, fuzzy
+#~ msgid "RAW CODE"
+#~ msgstr "Unicode RAW CODE"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(c) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Sneltoetsen:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " Omschakelen tussen Multibyte-Codering en Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " Invoer-methode terug zetten.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr ""
+#~ "De status van de huidige invoer-methode. Klik op deze om het te "
+#~ "veranderen."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Algemene instellingen"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Algemene instellingen die door alle FrontEnd-modules gebruikt worden, "
+#~ "inclusief de X11 FrontEnd, GKT IMModule, QT IMModule, enz."
+
+#, fuzzy
+#~ msgid "_Trigger:"
+#~ msgstr "_Trigger:"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Trigger-toetsen kiezen"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Toets-combinaties, waarmee de SCIM-invoer-methode wordt IN- en UIT-"
+#~ "geschakeld. Om dit te veranderen, klik op de rechterknop."
+
+#~ msgid "Turn _On:"
+#~ msgstr "_Inschakelen:"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Kies de inschakel toets."
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Toetscombinatie om de invoer-methode SCIM inteschakelen.Klik op de "
+#~ "rechterknop om te veranderen."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "U_itschakelen"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "UIT-schakeltoetsen uitkiezen"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Toetscombinatie waarmee de invoer-methode SCIM uitgeschakeld wordt. Klik "
+#~ "op de rechterknop om te veranderen."
+
+#~ msgid "_Next input method:"
+#~ msgstr "_Volgende invoer-methode:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr ""
+#~ "Kies een toetscombinatie om naar de volgende invoer-methode te gaan."
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Met deze toetscombinatie, gaat men naar de volgende invoer-methode. klik "
+#~ "op de rechterknop om te veranderen."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "_Vorige invoer-methode:"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Kies de toetscombinatie om naar de vorige invoer-methode te gaan"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Met deze toetscombinatie gaat men naar de vorige invoer-methode. Klik op "
+#~ "de rechterknop om te veranderen."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "Toon het keuze-menu voor invoer-methoden:"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "Kies de toetsen voor het tonen van het invoer-methode kies-menu"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Toetscombinatie's voor het tonen van het invoer-methode kies-menu. Klik "
+#~ "rechts voor het instellen."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "_Toetsenbord layout:"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Kies hier de huidige gebruikte toetsenbord-layout, zodat invoer-methoden, "
+#~ "die van het toetsenbord-layout afhankelijk zijn, goed werken."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "Invoer direkt in programma-venster tonen."
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Wanneer voor deze optie gekozen is, wordt de invoer direkt in het "
+#~ "programma-venster getoond, in plaats van een extra invoer-venster."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "Dezelfde invoer-methode voor alle programma's gebruiken."
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Wanneer dit gekozen is, wordt een en dezelfde invoer-methode voor alle "
+#~ "programma's gebruikt. Wanneer dit niet gekozen is, kan voor elke "
+#~ "programma een andere invoer-methode gekozen worden."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Sneltoetsen"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Hier kunnen de geïnstalleerde invoer-methoden IN- en UIT-geschakeld "
+#~ "worden en hiervoor sneltoetsen gekozen worden."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Geïnstalleerde invoer-methoden:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "_Sneltoetsen instellen"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "Sneltoetsen voor de gekozen invoer-methode instellen."
+
+#~ msgid "Select _Filters"
+#~ msgstr "_Filter selecteren"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "Kies de filter, die aan deze invoer-methode verbonden moet worden."
+
+#~ msgid "_Expand"
+#~ msgstr "Uitbreiden"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Alle taalgroepen uitbreiden."
+
+#~ msgid "_Collapse"
+#~ msgstr "Samenvouwen"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Alle taalgroepen samenvouwen."
+
+#~ msgid "E_nable All"
+#~ msgstr "Alles _inschakelen"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Alle invoer-methoden inschakelen."
+
+#~ msgid "_Disable All"
+#~ msgstr "Alles _uitschakelen"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Alle invoer-methoden uitschakelen."
+
+#~ msgid "Filters"
+#~ msgstr "Filter"
+
+#~ msgid "Languages"
+#~ msgstr "Talen"
+
+#~ msgid "Description"
+#~ msgstr "Omschrijving"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Sneltoetsen voor %s instellen"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Filter voor %s selecteren"
+
+#~ msgid "Move _Up"
+#~ msgstr "Naar _boven"
+
+#~ msgid "Move _Down"
+#~ msgstr "Naar _onderen"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr ""
+#~ "Een hulp-programma met panelen, gebaseert op de GTK+-2.x-bibliotheek."
+
+#~ msgid "On demand"
+#~ msgstr "Op verzoek"
+
+#~ msgid "Never"
+#~ msgstr "Nooit"
+
+#~ msgid "ToolBar"
+#~ msgstr "Werkbalk"
+
+#~ msgid "_Show:"
+#~ msgstr "_Toon:"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Auto s_nap"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Icoon voor invoer-methode tonen"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "_Namen van de invoer-methoden tonen"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "Ontzichtbaar maken na (sec):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Icoon altijd tonen"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "»_Menü« -icoon tonen"
+
+#~ msgid "Show _help icon"
+#~ msgstr "»_Help«-icoon tonen"
+
+#~ msgid "Show _property label"
+#~ msgstr "Eigenschappen-label tonen"
+
+#~ msgid "Input window"
+#~ msgstr "Invoer-venster"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "Interne opzoek-tabel"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "_Vertikale opzoek-tabel"
+
+#~ msgid "Misc"
+#~ msgstr "Diversen"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Toon tra_y icoon"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Venster op plaats vastzetten"
+
+#~ msgid "_Font:"
+#~ msgstr "_Lettertype:"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Wanneer \"Altijd\" is gekozen, wordt de werkbalk altijd op het scherm "
+#~ "getoond. Wanneer \"op verzoek\" is gekozen, wordt de werkbalk alleen "
+#~ "getoond wanneer SCIM aktief is. Wanneer \"Nooit\" is gekozen, wordt de "
+#~ "werkbalk nooit getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt de werkbalk aan de rand van het "
+#~ "beeldscherm vastgeklikt"
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "De werkbalk wordt ontzichtbaar na afloop van de ingestelde tijd. Deze "
+#~ "optie is alleen beschikbaar wanneer \"altijd tonen\" is gekozen.Zet de "
+#~ "tijd op nul (0) om dit gedrag uit te schakelen."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt het icoon van de huidige invoer-"
+#~ "methode in de werkbalk getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt de naam van de huidige invoer-"
+#~ "methode in de werkbalk getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt het sticky-icoon op de werkbalk "
+#~ "getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt het menu in de werkbalk getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt het hulp-icoon in de werkbalk "
+#~ "getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt naam van de invoer-methode getoond "
+#~ "in de werkbalk."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, wordt de opzoek-tabel in het invoer-"
+#~ "venster getoond"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen wordt de opzoek-tabel vertikaal getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, zal het icoon van de werkbalk in het "
+#~ "systeemvak getoond."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Wanneer deze optie is gekozen, worden de werkbalk, het invoer-venster en "
+#~ "de opzoektabel op deze plaats vastgezet."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "Dit gekozen lettertype wordt in het invoer-venster en in het opzoek-tabel "
+#~ "gebruikt."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Interface-lettertype kiezen"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "FrontEnd"
+
+#~ msgid "IMEngine"
+#~ msgstr "Invoer-methode"
+
+#~ msgid "Panel"
+#~ msgstr "Paneel"
+
+#~ msgid "Extra"
+#~ msgstr "Extra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Instellingen voor de SCIM-invoer-methode"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Smart Common Input Method-Plattform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI instellingen</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Instellen van de %s-Module.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Wilt U de setup van SCIM werkelijk verlaten?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Niet alle instellingen kunnen geladen worden. SCIM moet opnieuw gestart "
+#~ "worden om alle nieuwe instellingen te laden."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Instellen van SCIM"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "Geïntegreerde setup dat op de GTK-widget bibiotheek is gebaseerd."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "Setup voor de Smart Common Invoer-methode-Plattform"
+
+#~ msgid "SCIM Help"
+#~ msgstr "SCIM handboek"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Smart Common Invoer-methode"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Invoer-venster en de werkbalk vastzetten/verschuifbaar maken."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "Toepasselijke help voor SCIM en de huidige invoer-methode tonen."
+
+#~ msgid "Show command menu."
+#~ msgstr "Commandoregel tonen."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(c) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Instellingen opnieuw laden"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Venster vastzetten"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Werkbalk ontzichtbaar maken"
+
+#~ msgid "Help ..."
+#~ msgstr "Help ..."
+
+#~ msgid "Exit"
+#~ msgstr "Afsluiten"
--- /dev/null
+# translation of pa.po to Punjabi
+# translation of scim.NEW.po to Punjabi
+# translation of scim.po to Punjabi
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Amanpreet Singh Alam <amanpreetalam@yahoo.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pa\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 15:30+0900\n"
+"PO-Revision-Date: 2005-12-13 08:28+0530\n"
+"Last-Translator: Amanpreet Singh Alam <amanpreetalam@yahoo.com>\n"
+"Language-Team: Punjabi <fedora-trans-pa@redhat.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ism/src/scim_compose_key.cpp:127 ism/src/scim_imengine.cpp:659
+#: ism/src/scim_panel_agent.cpp:345 ism/src/scim_panel_agent.cpp:4334
+#: ism/src/scim_utility.cpp:701
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1740
+msgid "English/Keyboard"
+msgstr "ਅੰਗਰੇਜ਼ੀ/ਕੀ-ਬੋਰਡ"
+
+#. return WideString ();
+#: ism/src/scim_compose_key.cpp:146
+#, fuzzy
+msgid "English input service"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਮਰੀਕੀ)"
+
+#: ism/src/scim_utility.cpp:702
+msgid "Amharic"
+msgstr "ਅਮਹੀਕਿਨ"
+
+#: ism/src/scim_utility.cpp:703
+msgid "Arabic"
+msgstr "ਅਰਬੀ"
+
+#: ism/src/scim_utility.cpp:704 ism/src/scim_utility.cpp:893
+msgid "Arabic (Egypt)"
+msgstr "ਅਰਬੀ (ਮਿਸਰ)"
+
+#: ism/src/scim_utility.cpp:705 ism/src/scim_utility.cpp:902
+msgid "Arabic (Lebanon)"
+msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#: ism/src/scim_utility.cpp:706
+msgid "Assamese"
+msgstr "ਆਸਾਮੀ"
+
+#: ism/src/scim_utility.cpp:707 ism/src/scim_utility.cpp:918
+msgid "Azerbaijani"
+msgstr "ਅਜ਼ਰਬਾਈਜਾਨ"
+
+#: ism/src/scim_utility.cpp:708
+msgid "Belarusian"
+msgstr "ਬੇਲਾਰੂਸੀ"
+
+#: ism/src/scim_utility.cpp:709 ism/src/scim_utility.cpp:874
+msgid "Bulgarian"
+msgstr "ਬੁਲਗਾਰੀਅਨ"
+
+#: ism/src/scim_utility.cpp:710 ism/src/scim_utility.cpp:711
+#: ism/src/scim_utility.cpp:913
+msgid "Bengali"
+msgstr "ਬੰਗਾਲੀ"
+
+#: ism/src/scim_utility.cpp:712
+msgid "Bengali (India)"
+msgstr "ਬੰਗਾਲੀ (ਭਾਰਤ)"
+
+#: ism/src/scim_utility.cpp:713
+msgid "Tibetan"
+msgstr "ਤਿੱਬਤੀ"
+
+#: ism/src/scim_utility.cpp:714
+msgid "Bosnian"
+msgstr "ਬੋਸਨੀਅਨ"
+
+#: ism/src/scim_utility.cpp:715 ism/src/scim_utility.cpp:853
+msgid "Catalan"
+msgstr "ਕੇਟੇਲਨ"
+
+#: ism/src/scim_utility.cpp:716 ism/src/scim_utility.cpp:863
+#: ism/src/scim_keyboard_layout_data.h:4596
+msgid "Czech"
+msgstr "ਚੈੱਕ"
+
+#: ism/src/scim_utility.cpp:717 ism/src/scim_utility.cpp:923
+msgid "Welsh"
+msgstr "ਵਾਲਿਸ਼"
+
+#: ism/src/scim_utility.cpp:718 ism/src/scim_utility.cpp:854
+#: ism/src/scim_keyboard_layout_data.h:4598
+msgid "Danish"
+msgstr "ਡੈਨਿਸ਼"
+
+#: ism/src/scim_utility.cpp:719 ism/src/scim_keyboard_layout_data.h:4606
+msgid "German"
+msgstr "ਜਰਮਨ"
+
+#: ism/src/scim_utility.cpp:720
+msgid "Divehi"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:721 ism/src/scim_utility.cpp:873
+#: ism/src/scim_keyboard_layout_data.h:4609
+msgid "Greek"
+msgstr "ਗਰੀਕ"
+
+#: ism/src/scim_utility.cpp:722
+msgid "English"
+msgstr "ਅੰਗਰੇਜ਼ੀ"
+
+#: ism/src/scim_utility.cpp:723 ism/src/scim_utility.cpp:808
+msgid "English (Australian)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਸਟਰੇਲੀਅਨ)"
+
+#: ism/src/scim_utility.cpp:724 ism/src/scim_utility.cpp:809
+msgid "English (Canadian)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਕੈਨੇਡੀ)"
+
+#: ism/src/scim_utility.cpp:725
+msgid "English (British)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#: ism/src/scim_utility.cpp:726
+msgid "English (Ireland)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਆਇਰਲੈਂਡ)"
+
+#: ism/src/scim_utility.cpp:727
+msgid "English (American)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਮਰੀਕੀ)"
+
+#: ism/src/scim_utility.cpp:728 ism/src/scim_utility.cpp:729
+#: ism/src/scim_keyboard_layout_data.h:4622
+msgid "Spanish"
+msgstr "ਸਪੇਨੀ"
+
+#: ism/src/scim_utility.cpp:730
+msgid "Spanish (Mexico)"
+msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#: ism/src/scim_utility.cpp:731 ism/src/scim_utility.cpp:870
+#: ism/src/scim_keyboard_layout_data.h:4601
+msgid "Estonian"
+msgstr "ਈਸਟੋਨੀਅਨ"
+
+#: ism/src/scim_utility.cpp:732 ism/src/scim_utility.cpp:852
+msgid "Basque"
+msgstr "ਬਸਕਿਉ"
+
+#: ism/src/scim_utility.cpp:733
+msgid "Persian"
+msgstr "ਪਰਸੀਅਨ"
+
+#: ism/src/scim_utility.cpp:734 ism/src/scim_utility.cpp:857
+#: ism/src/scim_keyboard_layout_data.h:4602
+msgid "Finnish"
+msgstr "ਫੈਨਿਸ਼"
+
+#: ism/src/scim_utility.cpp:735 ism/src/scim_keyboard_layout_data.h:4603
+msgid "French"
+msgstr "ਫਰੈਂਚ"
+
+#: ism/src/scim_utility.cpp:736 ism/src/scim_utility.cpp:921
+msgid "Irish"
+msgstr "ਆਇਰਸ਼"
+
+#: ism/src/scim_utility.cpp:737 ism/src/scim_utility.cpp:919
+msgid "Galician"
+msgstr "ਗਾਲੇਸ਼ੀਅਨ"
+
+#: ism/src/scim_utility.cpp:738 ism/src/scim_utility.cpp:914
+msgid "Gujarati"
+msgstr "ਗੁਜਰਾਤੀ"
+
+#: ism/src/scim_utility.cpp:739 ism/src/scim_utility.cpp:748
+#: ism/src/scim_utility.cpp:890
+msgid "Hebrew"
+msgstr "ਹੈਬਰਿਊ"
+
+#: ism/src/scim_utility.cpp:740 ism/src/scim_utility.cpp:909
+msgid "Hindi"
+msgstr "ਹਿੰਦੀ"
+
+#: ism/src/scim_utility.cpp:741 ism/src/scim_keyboard_layout_data.h:4595
+msgid "Croatian"
+msgstr "ਕਰੋਆਟੀਅਨ"
+
+#: ism/src/scim_utility.cpp:742 ism/src/scim_utility.cpp:864
+#: ism/src/scim_keyboard_layout_data.h:4610
+msgid "Hungarian"
+msgstr "ਹੰਗਰੀਅਨ"
+
+#: ism/src/scim_utility.cpp:743
+#, fuzzy
+msgid "Armenian"
+msgstr "ਰੋਮਾਨੀਆਈ"
+
+#: ism/src/scim_utility.cpp:744
+msgid "Interlingua"
+msgstr "ਇੰਟਰਲਿੰਗੂਆ"
+
+#: ism/src/scim_utility.cpp:745
+msgid "Indonesian"
+msgstr "ਇੰਡੋਨੇਸ਼ੀਆਈ"
+
+#: ism/src/scim_utility.cpp:746 ism/src/scim_utility.cpp:856
+#: ism/src/scim_keyboard_layout_data.h:4628
+msgid "Icelandic"
+msgstr "ਆਈਸਲੈਂਡੀ"
+
+#: ism/src/scim_utility.cpp:747 ism/src/scim_keyboard_layout_data.h:4611
+msgid "Italian"
+msgstr "ਇਤਾਲਵੀ"
+
+#: ism/src/scim_utility.cpp:749 ism/src/scim_utility.cpp:882
+#: ism/src/scim_keyboard_layout_data.h:4612
+msgid "Japanese"
+msgstr "ਜਾਪਾਨੀ"
+
+#: ism/src/scim_utility.cpp:750 ism/src/scim_utility.cpp:917
+#, fuzzy
+msgid "Georgian"
+msgstr "ਜਰਮਨ"
+
+#: ism/src/scim_utility.cpp:751 ism/src/scim_utility.cpp:875
+msgid "Kazakh"
+msgstr "ਕਾਜ਼ਕ"
+
+#: ism/src/scim_utility.cpp:752
+msgid "Cambodian"
+msgstr "ਕੰਬੋਡੀਅਨ"
+
+#: ism/src/scim_utility.cpp:753
+msgid "Kannada"
+msgstr "ਕੰਨੜ"
+
+#: ism/src/scim_utility.cpp:754 ism/src/scim_utility.cpp:883
+msgid "Korean"
+msgstr "ਕੋਰੀਅਨ"
+
+#: ism/src/scim_utility.cpp:755
+msgid "Laothian"
+msgstr "ਲਿਊਥੀਅਨ"
+
+#: ism/src/scim_utility.cpp:756 ism/src/scim_utility.cpp:872
+#: ism/src/scim_keyboard_layout_data.h:4629
+msgid "Lithuanian"
+msgstr "ਲੀਥੂਵਨੀਅਨ"
+
+#: ism/src/scim_utility.cpp:757 ism/src/scim_utility.cpp:871
+msgid "Latvian"
+msgstr "ਲਾਟਵੀਅਨ"
+
+#: ism/src/scim_utility.cpp:758 ism/src/scim_utility.cpp:876
+msgid "Macedonian"
+msgstr "ਮੈਕਡੋਨੀਅਨ"
+
+#: ism/src/scim_utility.cpp:759 ism/src/scim_utility.cpp:915
+msgid "Malayalam"
+msgstr "ਮਾਲਿਆਲਮ"
+
+#: ism/src/scim_utility.cpp:760
+msgid "Mongolian"
+msgstr "ਮੰਗੋਲੀਅਨ"
+
+#: ism/src/scim_utility.cpp:761 ism/src/scim_utility.cpp:911
+msgid "Marathi"
+msgstr "ਮਰਾਠੀ"
+
+#: ism/src/scim_utility.cpp:762
+msgid "Malay"
+msgstr "ਮਲਾਇਆ"
+
+#: ism/src/scim_utility.cpp:763
+msgid "Burmese"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:764
+msgid "Nepali"
+msgstr "ਨੇਪਾਲੀ"
+
+#: ism/src/scim_utility.cpp:765 ism/src/scim_keyboard_layout_data.h:4599
+msgid "Dutch"
+msgstr "ਡੱਚ"
+
+#: ism/src/scim_utility.cpp:766
+#, fuzzy
+msgid "Norwegian (Nynorsk)"
+msgstr "ਨਾਰਵੇਗੀਅਨ (ਨਿਉਰਸਕ)"
+
+#: ism/src/scim_utility.cpp:767
+#, fuzzy
+msgid "Norwegian (Bokmal)"
+msgstr "ਨਾਰਵੇਗੀਅਨ (ਬੋਕਮਾਲ)"
+
+#: ism/src/scim_utility.cpp:768
+msgid "Oriya"
+msgstr "ਓੜੀਆ"
+
+#: ism/src/scim_utility.cpp:769 ism/src/scim_utility.cpp:916
+msgid "Punjabi"
+msgstr "ਪੰਜਾਬੀ"
+
+#: ism/src/scim_utility.cpp:770 ism/src/scim_utility.cpp:865
+#: ism/src/scim_keyboard_layout_data.h:4614
+msgid "Polish"
+msgstr "ਪੋਲਿਸ਼"
+
+#: ism/src/scim_utility.cpp:771 ism/src/scim_utility.cpp:773
+#: ism/src/scim_keyboard_layout_data.h:4615
+msgid "Portuguese"
+msgstr "ਪੁਰਤਗਾਲੀ"
+
+#: ism/src/scim_utility.cpp:772 ism/src/scim_keyboard_layout_data.h:4616
+msgid "Portuguese (Brazil)"
+msgstr "ਪੁਰਤਗਾਲੀ (ਬਰਾਜ਼ੀਲ)"
+
+#: ism/src/scim_utility.cpp:774 ism/src/scim_utility.cpp:866
+msgid "Romanian"
+msgstr "ਰੋਮਾਨੀਆਈ"
+
+#: ism/src/scim_utility.cpp:775 ism/src/scim_utility.cpp:877
+#: ism/src/scim_keyboard_layout_data.h:4618
+msgid "Russian"
+msgstr "ਰੂਸੀ"
+
+#: ism/src/scim_utility.cpp:776 ism/src/scim_utility.cpp:922
+msgid "Sinhala"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:777 ism/src/scim_utility.cpp:868
+#: ism/src/scim_keyboard_layout_data.h:4619
+msgid "Slovak"
+msgstr "ਸਲੋਵਾਕ"
+
+#: ism/src/scim_utility.cpp:778 ism/src/scim_utility.cpp:869
+#: ism/src/scim_keyboard_layout_data.h:4621
+msgid "Slovenian"
+msgstr "ਸਲੋਵੀਅਨ"
+
+#: ism/src/scim_utility.cpp:779
+msgid "Albanian"
+msgstr "ਅਲਬਾਈਅਨ"
+
+#: ism/src/scim_utility.cpp:780 ism/src/scim_utility.cpp:781
+#: ism/src/scim_utility.cpp:782
+msgid "Serbian"
+msgstr "ਸਰਬੀਅਨ"
+
+#: ism/src/scim_utility.cpp:783 ism/src/scim_utility.cpp:785
+#: ism/src/scim_utility.cpp:861 ism/src/scim_keyboard_layout_data.h:4625
+msgid "Swedish"
+msgstr "ਸਵੀਡਸ਼"
+
+#: ism/src/scim_utility.cpp:784 ism/src/scim_utility.cpp:862
+msgid "Swedish (Finland)"
+msgstr "ਸਵਡਿਸ਼ (ਫਿਨਲੈਂਡ)"
+
+#: ism/src/scim_utility.cpp:786 ism/src/scim_utility.cpp:912
+msgid "Tamil"
+msgstr "ਤਾਮਿਲ"
+
+#: ism/src/scim_utility.cpp:787 ism/src/scim_utility.cpp:910
+msgid "Telugu"
+msgstr "ਤੇਲਗੂ"
+
+#: ism/src/scim_utility.cpp:788 ism/src/scim_utility.cpp:889
+msgid "Thai"
+msgstr "ਥਾਈ"
+
+#: ism/src/scim_utility.cpp:789 ism/src/scim_utility.cpp:880
+#: ism/src/scim_keyboard_layout_data.h:4626
+msgid "Turkish"
+msgstr "ਤੁਰਕੀ"
+
+#: ism/src/scim_utility.cpp:790
+msgid "Uighur"
+msgstr "ਊਘਰ"
+
+#: ism/src/scim_utility.cpp:791 ism/src/scim_utility.cpp:879
+#: ism/src/scim_keyboard_layout_data.h:4630
+msgid "Ukrainian"
+msgstr "ਯੂਕਰੇਨੀ"
+
+#: ism/src/scim_utility.cpp:792 ism/src/scim_utility.cpp:907
+msgid "Urdu"
+msgstr "ਊਰਦੂ"
+
+#: ism/src/scim_utility.cpp:793
+msgid "Uzbek"
+msgstr "ਉਜੇਬਕ"
+
+#: ism/src/scim_utility.cpp:794 ism/src/scim_utility.cpp:908
+msgid "Vietnamese"
+msgstr "ਵੀਅਤਨਾਮੀ"
+
+#: ism/src/scim_utility.cpp:795
+msgid "Walloon"
+msgstr "ਵਾਲਿਸ਼"
+
+#: ism/src/scim_utility.cpp:796 ism/src/scim_utility.cpp:797
+msgid "Yiddish"
+msgstr "ਯਿਡਿੱਸ਼"
+
+#: ism/src/scim_utility.cpp:798
+msgid "Chinese"
+msgstr "ਚੀਨੀ"
+
+#: ism/src/scim_utility.cpp:799 ism/src/scim_utility.cpp:801
+#, fuzzy
+msgid "Chinese (Simplified)"
+msgstr "ਚੀਨੀ (ਸਧਾਰਨ)"
+
+#: ism/src/scim_utility.cpp:800 ism/src/scim_utility.cpp:802
+#, fuzzy
+msgid "Chinese (Traditional)"
+msgstr "ਚੀਨੀ (ਮੂਲ)"
+
+#: ism/src/scim_utility.cpp:804
+msgid "Dutch (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:805
+#, fuzzy
+msgid "Dutch (Belgian)"
+msgstr "ਬੈਲਜੀਅਨ"
+
+#: ism/src/scim_utility.cpp:806
+#, fuzzy
+msgid "English (United States)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਮਰੀਕੀ)"
+
+#: ism/src/scim_utility.cpp:807
+#, fuzzy
+msgid "English (United Kingdom)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਕੈਨੇਡੀ)"
+
+#: ism/src/scim_utility.cpp:810
+#, fuzzy
+msgid "English (New Zealand)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਆਇਰਲੈਂਡ)"
+
+#: ism/src/scim_utility.cpp:811
+#, fuzzy
+msgid "English (Irish)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#: ism/src/scim_utility.cpp:812
+#, fuzzy
+msgid "English (South Africa)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਮਰੀਕੀ)"
+
+#: ism/src/scim_utility.cpp:813
+#, fuzzy
+msgid "English (Jamaica)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਕੈਨੇਡੀ)"
+
+#: ism/src/scim_utility.cpp:814
+#, fuzzy
+msgid "English (Belize)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#: ism/src/scim_utility.cpp:815
+#, fuzzy
+msgid "English (Trinidad)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#: ism/src/scim_utility.cpp:816
+#, fuzzy
+msgid "English (Zimbabwe)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਕੈਨੇਡੀ)"
+
+#: ism/src/scim_utility.cpp:817
+#, fuzzy
+msgid "English (Philippines)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#: ism/src/scim_utility.cpp:818
+#, fuzzy
+msgid "French (Standard)"
+msgstr "ਫਰੈਂਚ (ਕੈਨੇਡੀ)"
+
+#: ism/src/scim_utility.cpp:819
+#, fuzzy
+msgid "French (Belgian)"
+msgstr "ਫਰੈਂਚ (ਕੈਨੇਡੀ)"
+
+#: ism/src/scim_utility.cpp:820 ism/src/scim_keyboard_layout_data.h:4604
+msgid "French (Canadian)"
+msgstr "ਫਰੈਂਚ (ਕੈਨੇਡੀ)"
+
+#: ism/src/scim_utility.cpp:821
+#, fuzzy
+msgid "French (Swiss)"
+msgstr "ਜਰਮਨ (ਸਵਿੱਸ)"
+
+#: ism/src/scim_utility.cpp:822
+msgid "French (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:823
+#, fuzzy
+msgid "French (Monaco)"
+msgstr "ਫਰੈਂਚ (ਕੈਨੇਡੀ)"
+
+#: ism/src/scim_utility.cpp:824
+#, fuzzy
+msgid "German (Standard)"
+msgstr "ਜਰਮਨ (ਡਿੱਡ ਸਵਿੱਚਾਂ ਨਾਲ)"
+
+#: ism/src/scim_utility.cpp:825 ism/src/scim_keyboard_layout_data.h:4608
+msgid "German (Swiss)"
+msgstr "ਜਰਮਨ (ਸਵਿੱਸ)"
+
+#: ism/src/scim_utility.cpp:826
+#, fuzzy
+msgid "German (Austrian)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਸਟਰੇਲੀਅਨ)"
+
+#: ism/src/scim_utility.cpp:827
+msgid "German (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:828
+#, fuzzy
+msgid "German (Liechtenstein)"
+msgstr "ਜਰਮਨ (ਸਵਿੱਸ)"
+
+#: ism/src/scim_utility.cpp:829
+msgid "Italian (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:830
+#, fuzzy
+msgid "Italian (Swiss)"
+msgstr "ਜਰਮਨ (ਸਵਿੱਸ)"
+
+#: ism/src/scim_utility.cpp:831
+#, fuzzy
+msgid "Portuguese (Brazilian)"
+msgstr "ਪੁਰਤਗਾਲੀ (ਬਰਾਜ਼ੀਲ)"
+
+#: ism/src/scim_utility.cpp:832
+#, fuzzy
+msgid "Portuguese (Standard)"
+msgstr "ਪੁਰਤਗਾਲੀ (ਬਰਾਜ਼ੀਲ)"
+
+#: ism/src/scim_utility.cpp:833
+#, fuzzy
+msgid "Spanish (Traditional Sort)"
+msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#: ism/src/scim_utility.cpp:834
+#, fuzzy
+msgid "Spanish (Mexican)"
+msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#: ism/src/scim_utility.cpp:835
+#, fuzzy
+msgid "Spanish (Guatemala)"
+msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#: ism/src/scim_utility.cpp:836
+#, fuzzy
+msgid "Spanish (Costa Rica)"
+msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#: ism/src/scim_utility.cpp:837
+#, fuzzy
+msgid "Spanish (Panama)"
+msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#: ism/src/scim_utility.cpp:838
+#, fuzzy
+msgid "Spanish (Dominican Republic)"
+msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#: ism/src/scim_utility.cpp:839
+#, fuzzy
+msgid "Spanish (Venezuela)"
+msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#: ism/src/scim_utility.cpp:840
+#, fuzzy
+msgid "Spanish (Colombia)"
+msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#: ism/src/scim_utility.cpp:841
+#, fuzzy
+msgid "Spanish (Peru)"
+msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#: ism/src/scim_utility.cpp:842
+#, fuzzy
+msgid "Spanish (Argentina)"
+msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#: ism/src/scim_utility.cpp:843
+#, fuzzy
+msgid "Spanish (Ecuador)"
+msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#: ism/src/scim_utility.cpp:844
+#, fuzzy
+msgid "Spanish (Chile)"
+msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#: ism/src/scim_utility.cpp:845
+#, fuzzy
+msgid "Spanish (Uruguay)"
+msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#: ism/src/scim_utility.cpp:846
+#, fuzzy
+msgid "Spanish (Paraguay)"
+msgstr "ਸਪੇਨੀ (CP 850)"
+
+#: ism/src/scim_utility.cpp:847
+#, fuzzy
+msgid "Spanish (Bolivia)"
+msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#: ism/src/scim_utility.cpp:848
+msgid "Spanish (El Salvador)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:849
+#, fuzzy
+msgid "Spanish (Honduras)"
+msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#: ism/src/scim_utility.cpp:850
+#, fuzzy
+msgid "Spanish (Nicaragua)"
+msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#: ism/src/scim_utility.cpp:851
+#, fuzzy
+msgid "Spanish (Puerto Rico)"
+msgstr "ਸਪੇਨੀ (ਮੈਕਸਿਕੋ)"
+
+#: ism/src/scim_utility.cpp:855
+msgid "Afrikaans"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:858
+#, fuzzy
+msgid "Malay (Malaysia)"
+msgstr "ਮਾਲਿਆਲਮ"
+
+#: ism/src/scim_utility.cpp:859
+msgid "Malay (Brunei Darussalam)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:860 ism/src/scim_keyboard_layout_data.h:4613
+msgid "Norwegian"
+msgstr "ਨਾਰਵੇਗੀਅਨ"
+
+#: ism/src/scim_utility.cpp:867
+#, fuzzy
+msgid "Serbian (Latin)"
+msgstr "ਸਰਬੀਅਨ"
+
+#: ism/src/scim_utility.cpp:878
+msgid "Serbian (Cyrillic)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:881
+msgid "Uzbek (Latin)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:884
+#, fuzzy
+msgid "Chinese (Taiwan)"
+msgstr "ਚੀਨੀ (ਮੂਲ)"
+
+#: ism/src/scim_utility.cpp:885
+#, fuzzy
+msgid "Chinese (Hong Kong)"
+msgstr "ਚੀਨੀ (ਮੂਲ)"
+
+#: ism/src/scim_utility.cpp:886
+#, fuzzy
+msgid "Chinese (Macau)"
+msgstr "ਚੀਨੀ (ਮੂਲ)"
+
+#: ism/src/scim_utility.cpp:887
+#, fuzzy
+msgid "Chinese (PRC)"
+msgstr "ਚੀਨੀ"
+
+#: ism/src/scim_utility.cpp:888
+#, fuzzy
+msgid "Chinese (Singapore)"
+msgstr "ਚੀਨੀ (ਸਧਾਰਨ)"
+
+#: ism/src/scim_utility.cpp:891
+msgid "Arabic (Saudi Arabia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:892
+#, fuzzy
+msgid "Arabic (Iraq)"
+msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#: ism/src/scim_utility.cpp:894
+#, fuzzy
+msgid "Arabic (Libya)"
+msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#: ism/src/scim_utility.cpp:895
+#, fuzzy
+msgid "Arabic (Algeria)"
+msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#: ism/src/scim_utility.cpp:896
+#, fuzzy
+msgid "Arabic (Morocco)"
+msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#: ism/src/scim_utility.cpp:897
+#, fuzzy
+msgid "Arabic (Tunisia)"
+msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#: ism/src/scim_utility.cpp:898
+#, fuzzy
+msgid "Arabic (Oman)"
+msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#: ism/src/scim_utility.cpp:899
+#, fuzzy
+msgid "Arabic (Yemen)"
+msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#: ism/src/scim_utility.cpp:900
+#, fuzzy
+msgid "Arabic (Syria)"
+msgstr "ਅਰਬੀ (ਮਿਸਰ)"
+
+#: ism/src/scim_utility.cpp:901
+#, fuzzy
+msgid "Arabic (Jordan)"
+msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#: ism/src/scim_utility.cpp:903
+#, fuzzy
+msgid "Arabic (Kuwait)"
+msgstr "ਅਰਬੀ (ਮਿਸਰ)"
+
+#: ism/src/scim_utility.cpp:904
+#, fuzzy
+msgid "Arabic (UAE)"
+msgstr "ਅਰਬੀ (ਮਿਸਰ)"
+
+#: ism/src/scim_utility.cpp:905
+#, fuzzy
+msgid "Arabic (Bahrain)"
+msgstr "ਅਰਬੀ (ਲਿਬਨਾਨ)"
+
+#: ism/src/scim_utility.cpp:906
+#, fuzzy
+msgid "Arabic (Qatar)"
+msgstr "ਅਰਬੀ (ਮਿਸਰ)"
+
+#: ism/src/scim_utility.cpp:920
+msgid "Hausa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:924
+msgid "Xhosa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:925
+msgid "Yoruba"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:926
+msgid "Zulu"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:1024
+msgid "Other"
+msgstr "ਹੋਰ"
+
+#: ism/src/scim_keyboard_layout_data.h:4592
+#: ism/modules/imengine/scim_socket_imengine.cpp:408
+#: ism/modules/imengine/scim_socket_imengine.cpp:438
+#: ism/modules/imengine/scim_socket_imengine.cpp:523
+#: ism/modules/imengine/scim_socket_imengine.cpp:553
+#: ism/modules/imengine/scim_socket_imengine.cpp:583
+msgid "Unknown"
+msgstr "ਅਣਜਾਣ"
+
+#: ism/src/scim_keyboard_layout_data.h:4593
+msgid "English (US)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਅਮਰੀਕੀ)"
+
+#: ism/src/scim_keyboard_layout_data.h:4594
+msgid "Belgian"
+msgstr "ਬੈਲਜੀਅਨ"
+
+#: ism/src/scim_keyboard_layout_data.h:4597
+msgid "Czech (qwerty)"
+msgstr "ਚੈੱਕ(ਕਿਉਵਰਟੀ)"
+
+#: ism/src/scim_keyboard_layout_data.h:4600
+msgid "Dvorak"
+msgstr "ਡਵੋਰਿਕ"
+
+#: ism/src/scim_keyboard_layout_data.h:4605
+msgid "French (Switzerland)"
+msgstr "ਫਰੈਂਚ (ਸਵਟਿਜ਼ਰਲੈਂਡ)"
+
+#: ism/src/scim_keyboard_layout_data.h:4607
+msgid "German (with deadkeys)"
+msgstr "ਜਰਮਨ (ਡਿੱਡ ਸਵਿੱਚਾਂ ਨਾਲ)"
+
+#: ism/src/scim_keyboard_layout_data.h:4617
+msgid "Portuguese (Brazil US accents)"
+msgstr "ਪੁਰਤਗਾਲੀ (ਬਰਾਜ਼ੀਲ ਅਮਰੀਕੀ ਢੰਗ)"
+
+#: ism/src/scim_keyboard_layout_data.h:4620
+msgid "Slovak (qwerty)"
+msgstr "ਸਲੋਵਾਕ(ਕਿਉਵਰਟੀ)"
+
+#: ism/src/scim_keyboard_layout_data.h:4623
+msgid "Spanish (CP 850)"
+msgstr "ਸਪੇਨੀ (CP 850)"
+
+#: ism/src/scim_keyboard_layout_data.h:4624
+msgid "Spanish (Latin America)"
+msgstr "ਸਪੇਨੀ (ਲੈਟਿਨ ਅਮਰੀਕੀ)"
+
+#: ism/src/scim_keyboard_layout_data.h:4627
+msgid "English (UK)"
+msgstr "ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨੀਵੀਂ)"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:57
+msgid "Simplified-Traditional Chinese Conversion"
+msgstr "ਸਧਾਰਨ-ਮੂਲ ਚੀਨੀ ਤਬਦੀਲੀ"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:60
+msgid "Convert between Simplified Chinese and Traditional Chinese"
+msgstr "ਸਧਾਰਨ ਚੀਨੀ ਅਤੇ ਮੂਲ ਚੀਨੀ ਵਿੱਚ ਤਬਦੀਲੀ"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:71
+msgid "SC-TC"
+msgstr "SC-TC"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:73
+#: ism/modules/filter/scim_sctc_filter.cpp:78
+msgid "Simplified-Traditional Chinese conversion"
+msgstr "ਸਧਾਰਨ-ਮੂਲ ਚੀਨੀ ਤਬਦੀਲੀ"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:76
+msgid "No Conversion"
+msgstr "ਕੋਈ ਤਬਦੀਲੀ ਨਹੀਂ"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:81
+msgid "Simplified to Traditional"
+msgstr "ਸਧਾਰਨ ਤੋਂ ਮੂਲ"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:83
+msgid "Convert Simplified Chinese to Traditional Chinese"
+msgstr "ਸਧਾਰਨ ਚੀਨੀ ਤੋਂ ਮੂਲ ਚੀਨੀ ਤਬਦੀਲ"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:86
+msgid "Traditional to Simplified"
+msgstr "ਮੂਲ ਤੋਂ ਸਧਾਰਨ"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:88
+msgid "Convert Traditional Chinese to Simplified Chinese"
+msgstr "ਮੂਲ ਚੀਨੀ ਤੋਂ ਸਧਾਰਨ ਚੀਨੀ ਅਨੁਵਾਦ"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:300
+msgid "James Su <suzhe@tsinghua.org.cn>"
+msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:425
+#: ism/modules/filter/scim_sctc_filter.cpp:555
+#: ism/modules/filter/scim_sctc_filter.cpp:571
+msgid "SC->TC"
+msgstr "SC->TC"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:431
+#: ism/modules/filter/scim_sctc_filter.cpp:559
+#: ism/modules/filter/scim_sctc_filter.cpp:575
+msgid "TC->SC"
+msgstr "TC->SC"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1693
+msgid "Smart Common Input Method platform "
+msgstr "ਸਮਾਰਟ ਕਾਮਨ ਇੰਪੁੱਟ ਮੈਥਡ ਪਲੇਟਫਾਰਮ"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1695
+msgid ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+msgstr ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1700
+msgid ""
+":\n"
+"\n"
+msgstr ""
+":\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1703
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:963
+msgid "Enable"
+msgstr "ਯੋਗ"
+
+#. gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+#. gtk_tree_view_column_set_fixed_width (column, 232);
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:984
+msgid "Name"
+msgstr "ਨਾਂ"
+
+#: ism/utils/scimstringview.c:201
+msgid "Cursor Position"
+msgstr "ਕਰਸਰ ਸਥਿਤੀ"
+
+#: ism/utils/scimstringview.c:202
+msgid "The current position of the insertion cursor in chars."
+msgstr "ਕਰਸਰ ਦੀ ਮੌਜੂਦਾ ਸਥਿਤੀ ਅੱਖਰਾਂ ਵਿੱਚ।"
+
+#: ism/utils/scimstringview.c:211
+msgid "Maximum length"
+msgstr "ਵੱਧ ਤੋ ਵੱਧ ਲੰਬਾਈ"
+
+#: ism/utils/scimstringview.c:212
+msgid "Maximum number of characters for this string view. Zero if no maximum."
+msgstr "ਇਸ ਸਤਰ ਝਲਕ ਲਈ ਵੱਧ ਤੋਂ ਵੱਧ ਅੱਖਰਾਂ ਦੀ ਗਿਣਤੀ। ਜੇਕਰ ਵੱਧ ਤੋਂ ਵੱਧ ਨਾ ਹੋਇਆ ਤਾਂ ਸਿਫ਼ਰ ਹੋਵੇਗਾ।"
+
+#: ism/utils/scimstringview.c:221
+msgid "Maximum width"
+msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਚੌੜਾਈ"
+
+#: ism/utils/scimstringview.c:222
+msgid "Maximum width of this string view."
+msgstr "ਇਸ ਸਤਰ ਝਲਕ ਦੀ ਵੱਧ ਤੋਂ ਵੱਧ ਚੌੜਾਈ ਹੈ।"
+
+#: ism/utils/scimstringview.c:231
+msgid "Has Frame"
+msgstr "ਫਰੇਮ ਹੈ"
+
+#: ism/utils/scimstringview.c:232
+msgid "FALSE removes outside bevel from string view."
+msgstr "FALSE ਨਾਲ ਸਤਰ ਝਲਕ ਤੋਂ ਬਾਹਰੀ bevel ਹਟਾਏ ਜਾਏਗਾ।"
+
+#: ism/utils/scimstringview.c:239
+msgid "Draw cursor"
+msgstr "ਕਰਸਰ ਬਣਾਓ"
+
+#: ism/utils/scimstringview.c:240
+msgid "TRUE draw blinking cursor."
+msgstr "TRUE ਝਪਕਦੀ ਕਰਸਰ ਬਣਾਏਗਾ।"
+
+#: ism/utils/scimstringview.c:247
+msgid "Auto move cursor"
+msgstr "ਸਵੈ ਏਧਰ ਓਧਰ ਕਰਸਰ"
+
+#: ism/utils/scimstringview.c:248
+msgid "TRUE auto move cursor position when mouse clicking."
+msgstr "TRUE ਮਾਊਸ ਦਬਾਉਣ ਨਾਲ ਕਰਸਰ ਨੂੰ ਸਵੈ-ਚਾਲਤ ਏਧਰ ਓਧਰ ਕੀਤਾ ਜਾਵੇਗਾ।"
+
+#: ism/utils/scimstringview.c:255
+#, fuzzy
+msgid "Forward button press/release event"
+msgstr "ਅੱਗੇ ਬਟਨ ਦਬਾਉਣ ਘਟਨਾ"
+
+#: ism/utils/scimstringview.c:256
+#, fuzzy
+msgid "TRUE forward button press/release event to user program."
+msgstr "TRUE ਉਪਭੋਗੀ ਪਰੋਗਰਾਮ ਲਈ ਅੱਗੇ ਬਟਨ ਦਬਾਉਣ ਘਟਨਾ ਹੈ।"
+
+#: ism/utils/scimstringview.c:263
+msgid "Auto resize the widget to fit the string"
+msgstr "ਸਤਰ ਫਿੱਟ ਕਰਨ ਲਈ ਵਿਦਗਿਟ ਸਵੈ ਮੁੜ-ਅਕਾਰ"
+
+#: ism/utils/scimstringview.c:264
+msgid "TRUE Auto resize on."
+msgstr "TRUE ਸਵੈ ਮੁੜ-ਅਕਾਰ ਚਾਲੂ ਹੈ।"
+
+#: ism/utils/scimstringview.c:271
+msgid "Emit move_cursor signal when press/release the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:272
+#, fuzzy
+msgid "TRUE Emit move_cursor signal when press the string."
+msgstr "TRUE ਮਾਊਸ ਦਬਾਉਣ ਨਾਲ ਕਰਸਰ ਨੂੰ ਸਵੈ-ਚਾਲਤ ਏਧਰ ਓਧਰ ਕੀਤਾ ਜਾਵੇਗਾ।"
+
+#: ism/utils/scimstringview.c:279
+msgid "Width in chars"
+msgstr "ਅੱਖਰਾਂ ਵਿੱਚ ਚੌਡ਼ਾਈ"
+
+#: ism/utils/scimstringview.c:280
+msgid "Number of characters to leave space for in the string view."
+msgstr "ਸਤਰ ਝਲਕ ਵਿੱਚ ਖਾਲੀ ਥਾਂ ਛੱਡਣ ਲਈ ਅੱਖਰਾਂ ਦੀ ਗਿਣਤੀ ਹੈ।"
+
+#: ism/utils/scimstringview.c:289
+msgid "Scroll offset"
+msgstr "ਸੰਤੁਲਨ ਸਕਰੋਲ"
+
+#: ism/utils/scimstringview.c:290
+msgid "Number of pixels of the string view scrolled off the screen to the left"
+msgstr "ਖੱਬੇ ਤੋਂ ਸਕਰੀਨ ਨੂੰ ਸਤਰ ਝਲਕ ਸਮੇਟਣ ਲਈ ਪਿਕਸਲਾਂ ਦੀ ਗਿਣਤੀ"
+
+#: ism/utils/scimstringview.c:299
+msgid "Text"
+msgstr "ਪਾਠ"
+
+#: ism/utils/scimstringview.c:300
+msgid "The contents of the string view"
+msgstr "ਸਤਰ ਝਲਕ ਦਾ ਪਰਸੰਗ"
+
+#: ism/utils/scimkeyselection.cpp:161
+msgid "Selected _Keys:"
+msgstr "ਚੁਣੀਆਂ ਸਵਿੱਚਾਂ(_K):"
+
+#: ism/utils/scimkeyselection.cpp:206
+msgid "Key Code:"
+msgstr "ਸਵਿੱਚ ਕੋਡ:"
+
+#: ism/utils/scimkeyselection.cpp:224
+#, fuzzy
+msgid "....."
+msgstr "..."
+
+#: ism/utils/scimkeyselection.cpp:229
+msgid "Modifiers:"
+msgstr "ਸੋਧਕ:"
+
+#: ism/utils/scimkeyselection.cpp:242
+msgid "_Ctrl"
+msgstr "_Ctrl"
+
+#: ism/utils/scimkeyselection.cpp:246
+msgid "A_lt"
+msgstr "A_lt"
+
+#: ism/utils/scimkeyselection.cpp:250
+msgid "_Shift"
+msgstr "_Shift"
+
+#: ism/utils/scimkeyselection.cpp:254
+msgid "_Release"
+msgstr "ਜਾਰੀ(_R)"
+
+#: ism/utils/scimkeyselection.cpp:264
+msgid "_Meta"
+msgstr "ਮੈਟਾ(_M)"
+
+#: ism/utils/scimkeyselection.cpp:268
+msgid "S_uper"
+msgstr "ਸੁਪਰ(_u)"
+
+#: ism/utils/scimkeyselection.cpp:272
+msgid "_Hyper"
+msgstr "ਹਾਈਪਰ(_H)"
+
+#: ism/utils/scimkeyselection.cpp:337
+msgid "Please enter a Key Code first."
+msgstr "ਪਹਿਲਾਂ ਇੱਕ ਸਵਿੱਚ ਕੋਡ ਦਿਓ।"
+
+#: ism/utils/scimkeyselection.cpp:391
+#, fuzzy
+msgid ""
+"Press a key (or a key combination).\n"
+"This dialog will be closed \n"
+"when the key is released."
+msgstr ""
+"ਇੱਕ ਸਵਿੱਚ (ਜਾਂ ਇੱਕ ਸਵਿੱਚ ਜੋੜ) ਦਬਾਉ।\n"
+"ਇਹ ਵਾਰਤਾਲਾਪ ਇੱਕ ਸਵਿੱਚ ਦਬਾਉਣ ਨਾਲ ਬੰਦ ਹੋ ਜਾਵੇਗਾ।"
+
+#: ism/utils/scimkeyselection.cpp:395
+msgid "Grabbing a key."
+msgstr "ਇੱਕ ਸਵਿੱਚ ਫੜੋ।"
+
+#: ism/utils/scimkeyselection.cpp:686
+msgid "Key Selection"
+msgstr "ਸਵਿੱਚ ਚੋਣ"
+
+#: ism/utils/scimtrayicon.c:108
+msgid "Orientation"
+msgstr "ਸਥਿਤੀ"
+
+#: ism/utils/scimtrayicon.c:109
+msgid "The orientation of the tray."
+msgstr "ਟਰੇ ਦੀ ਸਥਿਤੀ ਹੈ।"
+
+#. Normal Layout
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "NORMAL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "click to enter TEXT"
+msgstr ""
+
+#. Number Layout
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "NUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "click to enter NUMBER"
+msgstr ""
+
+#. Email Layout
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "EMAIL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "click to enter EMAIL"
+msgstr ""
+
+#. URL Layout
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "URL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "click to enter URL"
+msgstr ""
+
+#. Phonenumber Layout
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "PHONENUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "click to enter PHONENUMBER"
+msgstr ""
+
+#. IP Layout
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "IP LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "click to enter IP"
+msgstr ""
+
+#. Month Layout
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "MONTH LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "click to enter MONTH"
+msgstr ""
+
+#. Number Only Layout
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "NUMBERONLY LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "click to enter NUMBERONLY"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:220
+msgid "ise layout"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:51
+msgid "Application template"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:52
+msgid "Click to exit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:156
+msgid "Previous"
+msgstr ""
+
+#. bundle_add(ad->data, "navi_btn_left", NULL);
+#: ism/demos/isf_demo_efl.cpp:158
+#, fuzzy
+msgid "Next"
+msgstr "ਪਾਠ"
+
+#: ism/demos/isf_demo_efl.cpp:171
+msgid "Quit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:203
+msgid "isf demo"
+msgstr ""
+
+#: ism/demos/isf_entry_event_efl.cpp:151
+msgid "entry event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:220
+msgid "label event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:250
+msgid "ise event demo"
+msgstr ""
+
+#: ism/demos/isf_imcontrol_efl.cpp:375
+msgid "isfimcontrol api"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "ਸਵਿੱਚ ਚੋਣ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Option"
+msgstr "ਚੋਣ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "ਜਰਮਨ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "ਅੰਗਰੇਜ਼ੀ/ਕੀ-ਬੋਰਡ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "ਸਵਿੱਚ ਚੋਣ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "ਸਵਿੱਚ ਚੋਣ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "ਅੰਗਰੇਜ਼ੀ/ਕੀ-ਬੋਰਡ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "ਚੋਣ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "ਅੰਗਰੇਜ਼ੀ/ਕੀ-ਬੋਰਡ"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "ਅਮਹੀਕਿਨ"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "ਹਮੇਸ਼ਾ"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "ਚੋਣ"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ/ਕੀ-ਬੋਰਡ"
+
+#~ msgid "English/European"
+#~ msgstr "ਅੰਗਰੇਜ਼ੀ/ਯੂਰਪ"
+
+#~ msgid "RAW CODE"
+#~ msgstr "ਕੱਚਾ ਕੋਡ"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "ਹਾਟ ਸਵਿੱਚਾਂ:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " ਬਹੁ-ਬਾਈਟ ਇੰਕੋਡਿੰਗ ਅਤੇ ਯੂਨੀਕਰੋਡ ਵਿੱਚ ਤਬਦੀਲ ਹੋਣ ਲਈ।\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " ਇੰਪੁੱਟ ਢੰਗ ਮੁੜ-ਸੈਟ ਕਰਨ ਲਈ।\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "ਮੌਜੂਦਾ ਇੰਪੁੱਟ ਢੰਗ ਦੀ ਸਥਿਤੀ ਹੈ। ਤਬਦੀਲ ਕਰਨ ਲਈ ਦਬਾਉ।"
+
+#~ msgid "Unicode"
+#~ msgstr "ਯੂਨੀਕੋਡ"
+
+#~ msgid "Global Setup"
+#~ msgstr "ਗਲੋਬਲ ਸੈਟਅੱਪ"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "ਸਭ ਮੁੱਖ ਮੈਡੀਊਲ ਰਾਹੀਂ ਵਰਤੇ ਜਾਦੇ ਗਲੋਬਲ ਚੋਣ ਸੈਟਅੱਪ, ਜਿਸ ਵਿੱਚ X11 ਮੁੱਖ ਭੂਮੀ, GTK IMModule, "
+#~ "QT IMModule ਆਦਿ"
+
+#~ msgid "_Trigger:"
+#~ msgstr "ਤਬਦੀਲ(_T):"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "ਤਬਦੀਲੀ ਸਵਿੱਚ ਚੁਣੋ"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "SCIM ਇੰਪੁੱਟ ਢੰਗ ਨੂੰ ਚਾਲੂ/ਬੰਦ ਕਰਨ ਲਈ ਕੁੰਜੀ ਘਟਨਾ ਹੈ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "Turn _On:"
+#~ msgstr "ਚਾਲੂ ਕਰੋ(_O):"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "ਚਾਲੂ ਕਰਨ ਵਾਲੀਆਂ ਕੁੰਜੀਆਂ ਚੁਣੋ"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "SCIM ਇੰਪੁੱਟ ਢੰਗ ਚਾਲੂ ਕਰਨ ਲਈ ਕੁੰਜੀਆਂ ਦੀ ਚੋਣ ਕਰੋ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਦੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "ਬੰਦ ਕਰੋ(_f):"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "ਬੰਦ ਕਰਨ ਵਾਲੀਆਂ ਕੁੰਜੀਆਂ"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "SCIM ਇੰਪੁੱਟ ਢੰਗ ਬੰਦ ਕਰਨ ਲਈ ਕੁੰਜੀਆਂ ਦੀ ਚੋਣ ਕਰੋ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਦੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "_Next input method:"
+#~ msgstr "ਅੱਗੇ ਇੰਪੁੱਟ ਢੰਗ(_N):"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "ਅੱਗੇ ਇੰਪੁੱਟ ਢੰਗ ਦੀ ਚੋਣ ਕਰਨ ਲਈ ਕੁੰਜੀਆਂ ਚੁਣੋ"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "ਅੱਗੇ ਇੰਪੁੱਟ ਢੰਗ ਦੀ ਚੋਣ ਕਰਨ ਲਈ ਕੁੰਜੀਆਂ ਦੀ ਚੋਣ ਕਰੋ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਦੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "_Previous input method:"
+#~ msgstr "ਪਿੱਛੇ ਇੰਪੁੱਟ ਢੰਗ(_P):"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "ਪਿਛਲਾ ਇੰਪੁੱਟ ਢੰਗ ਕੁੰਜੀਆਂ ਚੁਣੋ"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "ਪਿਛਲਾ ਇੰਪੁੱਟ ਢੰਗ ਚਾਲੂ ਕਰਨ ਲਈ ਕੁੰਜੀਆਂ ਦੀ ਚੋਣ ਕਰੋ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਦੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "ਇੰਪੁੱਟ ਢੰਗ ਮੇਨੂ ਵੇਖਾਓ(_m):"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "ਇੰਪੁੱਟ ਢੰਗ ਮੇਨੂ ਵੇਖਾਉਣ ਲਈ ਕੁੰਜੀਆਂ ਚੁਣੋ"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "ਇੰਪੁੱਟ ਢੰਗ ਮੇਨੂ ਵੇਖਾਉਣ ਲਈ ਕੁੰਜੀਆਂ ਦੀ ਚੋਣ ਕਰੋ। ਇਸ ਨੂੰ ਸੋਧਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਦੇ ਬਟਨ ਨੂੰ ਦਬਾਉ।"
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "ਕੀ-ਬੋਰਡ ਖਾਕਾ(_K):"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "ਤੁਹਾਨੂੰ ਇੱਥੇ ਆਪਣਾ ਮੌਜੂਦਾ ਕੀ-ਬੋਰਡ ਖਾਕੇ ਦੀ ਚੋਣ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ, ਤਾਂ ਕਿ ਇੰਪੁੱਟ ਢੰਗ, ਜੋ ਕਿ ਕੀ-"
+#~ "ਬੋਰਡ ਖਾਕੇ ਦਾ ਖਿਆਲ ਰੱਖਦਾ ਹੈ, ਠੀਕ ਤਰਾਂ ਕੰਮ ਕਰ ਸਕੇ।"
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "ਕਲਾਂਇਟ ਝਰੋਖੇ 'ਚ ਪਹਿਲਾਂ-ਸੋਧ ਸਤਰ(_E)"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਕਲਾਂਇਟ ਇੰਪੁੱਟ ਝਰੋਖੇ ਵਿੱਚ ਪਹਿਲਾਂ-ਸੋਧ ਸਤਰ ਸਿੱਧੀ ਵਿਖਾਈ ਜਾਵੇਗਾ, ਨਾ "
+#~ "ਕਿ ਇੱਕ ਆਜ਼ਾਦ ਤਰਦੇ ਝਰੋਖਾ।"
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "ਸਭ ਕਾਰਜਾਂ 'ਚ ਇੱਕੋ ਹੀ ਇੰਪੁੱਟ ਢੰਗ ਵਰਤੋਂ(_S)"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਸਿਰਫ਼ ਇੱਕ ਹੀ ਇੰਪੁੱਟ ਢੰਗ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਾਵੇਗੀ, ਜੋ ਕਿ ਇੱਕ ਸਮੇਂ ਸਭ "
+#~ "ਕਾਰਜਾਂ ਲਈ ਵਰਤਿਆ ਜਾਵੇਗਾ। ਨਹੀਂ ਤਾਂ ਹਰ ਕਾਰਜ ਲਈ ਵੱਖਰਾ ਢੰਗ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਸੀ।"
+
+#~ msgid "Hotkeys"
+#~ msgstr "ਹਾਟ-ਸਵਿੱਚ"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr "ਤੁਸੀਂ ਇੱਥੇ ਇੰਪੁੱਟ ਢੰਗ ਯੋਗ/ਅਯੋਗ ਕਰ ਅਤੇ ਇੰਪੁੱਟ ਢੰਗ ਲਈ ਹਾਟ-ਸਵਿੱਚਾਂ ਸੈਟ ਕਰ ਸਕਦੇ ਹੋ।"
+
+#~ msgid "The installed input method services:"
+#~ msgstr "ਇੰਸਟਾਲ ਹੋਏ ਇੰਪੁੱਟ ਢੰਗ ਸੇਵਾਵਾਂ:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "ਹਾਟ-ਸਵਿੱਚ ਸੋਧ(_H)"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "ਚੁਣੇ ਇੰਪੁੱਟ ਢੰਗ ਨਾਲ ਸਬੰਧਤ ਹਾਟ-ਕੁੰਜੀਆਂ ਦੀ ਸੋਧ ਕਰੋ।"
+
+#~ msgid "Select _Filters"
+#~ msgstr "ਫਿਲਟਰ ਚੁਣੋ(_F)"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "ਫਿਲਟਰ ਦੀ ਚੋਣ ਕਰੋ, ਜੋ ਕਿ ਇਸ ਇੰਪੁੱਟ ਢੰਗ ਨਾਲ ਜੋੜਿਆ ਜਾਵੇਗਾ।"
+
+#~ msgid "_Expand"
+#~ msgstr "ਫੈਲਾਓ(_E)"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "ਸਭ ਭਾਸ਼ਾ ਵਰਗ ਫੈਲਾਓ।"
+
+#~ msgid "_Collapse"
+#~ msgstr "ਸਮੇਟੋ(_C)"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "ਸਭ ਭਾਸ਼ਾ ਵਰਗ ਸਮੇਟੋ।"
+
+#~ msgid "E_nable All"
+#~ msgstr "ਸਭ ਯੋਗ(_n)"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "ਸਭ ਇੰਪੁੱਟ ਢੰਗ ਯੋਗ ਕਰਦਾ ਹੈ।"
+
+#~ msgid "_Disable All"
+#~ msgstr "ਸਭ ਆਯੋਗ(_D)"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "ਸਭ ਇੰਪੁੱਟ ਢੰਗ ਆਯੋਗ ਹਨ।"
+
+#~ msgid "Filters"
+#~ msgstr "ਫਿਲਟਰ"
+
+#~ msgid "Languages"
+#~ msgstr "ਭਾਸ਼ਾਵਾਂ"
+
+#~ msgid "Description"
+#~ msgstr "ਵੇਰਵਾ"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "%s ਲਈ ਹਾਟ-ਸਵਿੱਚ ਸੋਧ"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "%s ਲਈ ਫਿਲਟਰ ਚੁਣੋ"
+
+#~ msgid "Move _Up"
+#~ msgstr "ਉੱਪਰ ਜਾਓ(_U)"
+
+#~ msgid "Move _Down"
+#~ msgstr "ਹੇਠਾਂ ਜਾਓ(_D)"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "GTK+-2.x ਲਾਇਬਰੇਰੀ 'ਤੇ ਪੈਨਲ ਡਾਈਮੋਨ ਹੈ।"
+
+#~ msgid "On demand"
+#~ msgstr "ਲੋੜ ਸਮੇਂ"
+
+#~ msgid "Never"
+#~ msgstr "ਕਦੇ ਨਹੀਂ"
+
+#~ msgid "ToolBar"
+#~ msgstr "ਸੰਦ-ਪੱਟੀ"
+
+#~ msgid "_Show:"
+#~ msgstr "ਵੇਖਾਓ(_S):"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "ਸਵੈ ਸਨੈਪ(_n)"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "ਇੰਪੁੱਟ ਆਈਕਾਨ ਢੰਗ ਆਈਕਾਨ ਵੇਖਾਓ(_i)"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "ਇੰਪੁੱਟ ਢੰਗ ਨਾਂ ਵੇਖਾਓ(_u)"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "ਸਮਾਂ-ਅੰਤਰਾਲ ਓਹਲੇ(_o):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "ਟਿੱਕ ਆਈਕਾਨ ਵੇਖਾਓ(_t)"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "ਮੇਨੂ ਆਈਕਾਨ ਵੇਖਾਓ(_e)"
+
+#~ msgid "Show _help icon"
+#~ msgstr "ਸਹਾਇਤਾ ਆਈਕਾਨ ਵੇਖਾਓ(_h)"
+
+#~ msgid "Show _property label"
+#~ msgstr "ਵਿਸ਼ੇਸ਼ਤਾ ਲੇਬਲ ਵੇਖਾਓ(_p)"
+
+#~ msgid "Input window"
+#~ msgstr "ਇੰਪੁੱਟ ਝਰੋਖਾ"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "ਸ਼ਾਮਲ ਖੋਜ ਸਾਰਣੀ(_m)"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "ਲੰਬਕਾਰੀ ਖੋਜ ਸਾਰਣੀ(_V)"
+
+#~ msgid "Misc"
+#~ msgstr "ਫੁਟਕਲ"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "ਟਰੇ ਆਈਕਾਨ ਵੇਖਾਓ(_y)"
+
+#~ msgid "Stick _windows"
+#~ msgstr "ਝਰੋਖੇ ਚੇਪੋ(_w)"
+
+#~ msgid "_Font:"
+#~ msgstr "ਫੋਂਟ(_F):"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "ਜੇਕਰ \"ਹਮੇਸ਼ਾ\" ਚੋਣ ਯੋਗ ਕੀਤੀ ਗਈ ਤਾਂ, ਸੰਦ-ਪੱਟੀ ਨੂੰ ਹਮੇਸ਼ਾ ਪਰਦੇ 'ਤੇ ਵਿਖਾਇਆ ਜਾਵੇਗਾ। ਜੇਕਰ "
+#~ "\"ਲੋੜ ਸਮੇਂ\" ਦੀ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਹੀ ਵੇਖਾਇਆ ਜਾਵੇਗਾ, ਜਦੋਂ SCIM ਦੇ ਸਰਗਰਮ ਹੋਵੇਗਾ। ਜੇਕਰ \"ਕਦੇ "
+#~ "ਨਹੀਂ\" ਦੀ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਇਸ ਨੂੰ ਕਦੇ ਨਹੀਂ ਵੇਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਸੰਦ-ਪੱਟੀ ਸਕਰੀਨ ਹਾਸ਼ੀਏ 'ਚ ਸਮੇਟੀ ਜਾਵੇਗੀ।"
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "ਇਸ ਅੰਤਰਾਲ ਖਤਮ ਹੋਣ ਦੇ ਬਾਅਦ ਸੰਦ-ਪੱਟੀ ਨੂੰ ਓਹਲੇ ਕੀਤਾ ਜਾਵੇਗਾ। ਇਹ ਚੋਣ ਸਿਰਫ਼ ਤਾਂ ਹੀ ਠੀਕ ਹੈ, "
+#~ "ਜੇਕਰ \"ਹਮੇਸ਼ਾ ਵੇਖਾਓ\" ਦੀ ਚੋਣ ਕੀਤੀ ਹੈ। ਇਸ ਵਿਹਾਰ ਨੂੰ ਅਯੋਗ ਕਰਨ ਲਈ ਜ਼ੀਰੋ (0) ਬਣਾਓ।"
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਇੰਪੁੱਟ ਢੰਗ ਆਈਕਾਨ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਇੰਪੁੱਟ ਢੰਗ ਨਾਂ ਨੂੰ ਸੰਦ-ਪੱਟੀ 'ਚ ਚੁਣਿਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਸਟਿੱਕੀ ਆਈਕਾਨ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਮੇਨੂ ਆਈਕਾਨ ਨੂੰ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਸਹਾਇਤਾ ਆਈਕਾਨ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਇਆ ਜਾਦਾ ਹੈ।"
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਇੰਪੁੱਟ ਢੰਗ ਵਿਸ਼ੇਸ਼ਤਾ ਦਾ ਪਾਠ ਲੇਬਲ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਖੋਜ ਸਾਰਣੀ ਨੂੰ ਇੰਪੁੱਟ ਝਰੋਖੇ 'ਚ ਹੀ ਸ਼ਾਮਲ ਕੀਤਾ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਖੋਜ ਸਾਰਣੀ ਨੂੰ ਲੰਬਕਾਰੀ ਰੂਪ 'ਚ ਵਿਖਾਇਆ ਜਾਵੇਗਾ।"
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ ਟਰੇ ਆਈਕਾਨ ਨੂੰ ਵੇਹੜੇ ਦੀ ਸੰਦ-ਪੱਟੀ 'ਚ ਵਿਖਾਉ।"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "ਜੇਕਰ ਇਹ ਚੋਣ ਕੀਤੀ ਗਈ ਤਾਂ, ਸੰਦ-ਪੱਟੀ, ਇੰਪੁੱਟ ਅਤੇ ਖੋਜ ਸਾਰਣੀ ਝਰੋਖੇ ਨੂੰ ਇਸ ਦੀ ਅਸਲੀ ਸਥਿਤੀ ਨਾਲ "
+#~ "ਹੀ ਜੋੜੀ ਰੱਖਿਆ ਜਾਵੇਗਾ।"
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr "ਇੰਪੁੱਟ ਅਤੇ ਖੋਜ ਸਾਰਣੀ ਝਰੋਖੇ ਵਿੱਚ ਫੋਂਟ ਸੈਟਿੰਗ ਵਰਤੀ ਜਾਵੇਗੀ।"
+
+#~ msgid "Select Interface Font"
+#~ msgstr "ਇੰਟਰਫੇਸ ਫੋਂਟ ਚੁਣੋ"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "ਮੁੱਖ-ਭਾਗ"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMEngine"
+
+#~ msgid "Panel"
+#~ msgstr "ਪੈਨਲ"
+
+#~ msgid "Extra"
+#~ msgstr "ਹੋਰ"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "SCIM ਇੰਪੁੱਟ ਢੰਗ ਸੈਟਅੱਪ"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">ਸਮਾਰਟ ਕਾਮਨ ਇੰਪੁੱਟ ਮੈਂਥਡ ਪਲੇਟਫਾਰਮ</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI ਸੈਟਅੱਪ ਸਹੂਲਤ</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">ਕਾਪੀਰਾਈਟ 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">%s ਮੈਡੀਊਲ ਲਈ ਸੈਟਅੱਪ ਹੈ।</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "ਕੀ ਤੁਸੀਂ SCIM ਸੈਟਅੱਪ ਨੂੰ ਬੰਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "ਸਭ ਸੰਰਚਨਾ ਨੂੰ ਯਕਦਮ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। ਨਵੀਂ ਸੰਰਚਨਾ ਨੂੰ ਪਰਭਾਵੀ ਹੋਣ ਲਈ SCIM ਨੂੰ ਮੁੜ-"
+#~ "ਚਾਲੂ ਕਰਨਾ ਨਾ ਭੁੱਲੋ।"
+
+#~ msgid "SCIM Setup"
+#~ msgstr "SCIM ਸੈਟਅੱਪ"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "GTK ਵਿਦਗਿਟ ਲਾਇਬਰੇਰੀ 'ਤੇ ਅਧਾਰਤ ਸੈਟਅੱਪ ਸਹੂਲਤ ਹੈ।"
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "ਸਮਾਰਟ ਕਾਮਨ ਇੰਪੁੱਟ ਮੈਂਥਸਡ ਪਲੇਟਫਾਰਮ ਲਈ ਸੈਟਅੱਪ ਸਹੂਲਤ"
+
+#~ msgid "SCIM Help"
+#~ msgstr "SCIM ਸਹਾਇਤਾ"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "ਸਮਾਰਟ ਕਾਮਨ ਇੰਪੁੱਟ ਮੈਂਥਡ"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "ਇੰਪੁੱਟ ਝਰੋਖਾ ਅਤੇ ਸੰਦ-ਪੱਟੀ ਸਟਿੱਕੀ/ਨਾ-ਸਟਿੱਕੀ ਹੈ।"
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "SCIM ਅਤੇ ਮੌਜੂਦਾ ਇੰਪੁੱਟ ਢੰਗ ਬਾਰੇ ਸੰਖੇਪ ਸਹਾਇਤਾ ਵਿਖਾਓ।"
+
+#~ msgid "Show command menu."
+#~ msgstr "ਕਮਾਂਡ ਮੇਨ ਵੇਖਾਓ।"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "ਸੰਰਚਨਾ ਮੁੜ-ਲੋਡ"
+
+#~ msgid "Stick Windows"
+#~ msgstr "ਸਟਿੱਕੀ ਝਰੋਖੇ"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "ਸੰਦ-ਪੱਟੀ ਓਹਲੇ"
+
+#~ msgid "Help ..."
+#~ msgstr "ਸਹਾਇਤਾ ..."
+
+#~ msgid "Exit"
+#~ msgstr "ਬਾਹਰ"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "En"
--- /dev/null
+# Swedish translation for scim
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the scim package.
+# <>, 2006.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: scim\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 15:30+0900\n"
+"PO-Revision-Date: 2006-09-09 21:37+0200\n"
+"Last-Translator: <>\n"
+"Language-Team: Swedish <sv@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/src/scim_compose_key.cpp:127 ism/src/scim_imengine.cpp:659
+#: ism/src/scim_panel_agent.cpp:345 ism/src/scim_panel_agent.cpp:4334
+#: ism/src/scim_utility.cpp:701
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1740
+msgid "English/Keyboard"
+msgstr "Latinsk teckeninmatning"
+
+#. return WideString ();
+#: ism/src/scim_compose_key.cpp:146
+#, fuzzy
+msgid "English input service"
+msgstr "Engelska (amerikansk)"
+
+#: ism/src/scim_utility.cpp:702
+msgid "Amharic"
+msgstr "Amhariska"
+
+#: ism/src/scim_utility.cpp:703
+msgid "Arabic"
+msgstr "Arabiska"
+
+#: ism/src/scim_utility.cpp:704 ism/src/scim_utility.cpp:893
+msgid "Arabic (Egypt)"
+msgstr "Arabiska (Egypten)"
+
+#: ism/src/scim_utility.cpp:705 ism/src/scim_utility.cpp:902
+msgid "Arabic (Lebanon)"
+msgstr "Arabiska (Libanon)"
+
+#: ism/src/scim_utility.cpp:706
+msgid "Assamese"
+msgstr "Assamesiska"
+
+#: ism/src/scim_utility.cpp:707 ism/src/scim_utility.cpp:918
+msgid "Azerbaijani"
+msgstr "Azerbajdzjanska"
+
+#: ism/src/scim_utility.cpp:708
+msgid "Belarusian"
+msgstr "Vitryska"
+
+#: ism/src/scim_utility.cpp:709 ism/src/scim_utility.cpp:874
+msgid "Bulgarian"
+msgstr "Bulgariska"
+
+#: ism/src/scim_utility.cpp:710 ism/src/scim_utility.cpp:711
+#: ism/src/scim_utility.cpp:913
+msgid "Bengali"
+msgstr "Bengali"
+
+#: ism/src/scim_utility.cpp:712
+msgid "Bengali (India)"
+msgstr "Bengali (Indien)"
+
+#: ism/src/scim_utility.cpp:713
+msgid "Tibetan"
+msgstr "Tibetanska"
+
+#: ism/src/scim_utility.cpp:714
+msgid "Bosnian"
+msgstr "Bosniska"
+
+#: ism/src/scim_utility.cpp:715 ism/src/scim_utility.cpp:853
+msgid "Catalan"
+msgstr "Katalanska"
+
+#: ism/src/scim_utility.cpp:716 ism/src/scim_utility.cpp:863
+#: ism/src/scim_keyboard_layout_data.h:4596
+msgid "Czech"
+msgstr "Tjeckiska"
+
+#: ism/src/scim_utility.cpp:717 ism/src/scim_utility.cpp:923
+msgid "Welsh"
+msgstr "Kymriska"
+
+#: ism/src/scim_utility.cpp:718 ism/src/scim_utility.cpp:854
+#: ism/src/scim_keyboard_layout_data.h:4598
+msgid "Danish"
+msgstr "Danska"
+
+#: ism/src/scim_utility.cpp:719 ism/src/scim_keyboard_layout_data.h:4606
+msgid "German"
+msgstr "Tyska"
+
+#: ism/src/scim_utility.cpp:720
+msgid "Divehi"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:721 ism/src/scim_utility.cpp:873
+#: ism/src/scim_keyboard_layout_data.h:4609
+msgid "Greek"
+msgstr "Grekiska"
+
+#: ism/src/scim_utility.cpp:722
+msgid "English"
+msgstr "Engelska"
+
+#: ism/src/scim_utility.cpp:723 ism/src/scim_utility.cpp:808
+msgid "English (Australian)"
+msgstr "Engelska (australiensisk)"
+
+#: ism/src/scim_utility.cpp:724 ism/src/scim_utility.cpp:809
+msgid "English (Canadian)"
+msgstr "Engelska (kanadensisk)"
+
+#: ism/src/scim_utility.cpp:725
+msgid "English (British)"
+msgstr "Engelska (brittisk)"
+
+#: ism/src/scim_utility.cpp:726
+msgid "English (Ireland)"
+msgstr "Engelska (irländsk)"
+
+#: ism/src/scim_utility.cpp:727
+msgid "English (American)"
+msgstr "Engelska (amerikansk)"
+
+#: ism/src/scim_utility.cpp:728 ism/src/scim_utility.cpp:729
+#: ism/src/scim_keyboard_layout_data.h:4622
+msgid "Spanish"
+msgstr "Spanska"
+
+#: ism/src/scim_utility.cpp:730
+msgid "Spanish (Mexico)"
+msgstr "Spanska (Mexiko)"
+
+#: ism/src/scim_utility.cpp:731 ism/src/scim_utility.cpp:870
+#: ism/src/scim_keyboard_layout_data.h:4601
+msgid "Estonian"
+msgstr "Estniska"
+
+#: ism/src/scim_utility.cpp:732 ism/src/scim_utility.cpp:852
+msgid "Basque"
+msgstr "Baskiska"
+
+#: ism/src/scim_utility.cpp:733
+msgid "Persian"
+msgstr "Persiska"
+
+#: ism/src/scim_utility.cpp:734 ism/src/scim_utility.cpp:857
+#: ism/src/scim_keyboard_layout_data.h:4602
+msgid "Finnish"
+msgstr "Finska"
+
+#: ism/src/scim_utility.cpp:735 ism/src/scim_keyboard_layout_data.h:4603
+msgid "French"
+msgstr "Franska"
+
+#: ism/src/scim_utility.cpp:736 ism/src/scim_utility.cpp:921
+msgid "Irish"
+msgstr "Irländska"
+
+#: ism/src/scim_utility.cpp:737 ism/src/scim_utility.cpp:919
+msgid "Galician"
+msgstr "Galiciska"
+
+#: ism/src/scim_utility.cpp:738 ism/src/scim_utility.cpp:914
+msgid "Gujarati"
+msgstr "Gujarati"
+
+#: ism/src/scim_utility.cpp:739 ism/src/scim_utility.cpp:748
+#: ism/src/scim_utility.cpp:890
+msgid "Hebrew"
+msgstr "Hebreiska"
+
+#: ism/src/scim_utility.cpp:740 ism/src/scim_utility.cpp:909
+msgid "Hindi"
+msgstr "Hindi"
+
+#: ism/src/scim_utility.cpp:741 ism/src/scim_keyboard_layout_data.h:4595
+msgid "Croatian"
+msgstr "Kroatiska"
+
+#: ism/src/scim_utility.cpp:742 ism/src/scim_utility.cpp:864
+#: ism/src/scim_keyboard_layout_data.h:4610
+msgid "Hungarian"
+msgstr "Ungerska"
+
+#: ism/src/scim_utility.cpp:743
+#, fuzzy
+msgid "Armenian"
+msgstr "Rumänska"
+
+#: ism/src/scim_utility.cpp:744
+msgid "Interlingua"
+msgstr "Interlingua"
+
+#: ism/src/scim_utility.cpp:745
+msgid "Indonesian"
+msgstr "Indonesiska"
+
+#: ism/src/scim_utility.cpp:746 ism/src/scim_utility.cpp:856
+#: ism/src/scim_keyboard_layout_data.h:4628
+msgid "Icelandic"
+msgstr "Isländska"
+
+#: ism/src/scim_utility.cpp:747 ism/src/scim_keyboard_layout_data.h:4611
+msgid "Italian"
+msgstr "Italienska"
+
+#: ism/src/scim_utility.cpp:749 ism/src/scim_utility.cpp:882
+#: ism/src/scim_keyboard_layout_data.h:4612
+msgid "Japanese"
+msgstr "Japanska"
+
+#: ism/src/scim_utility.cpp:750 ism/src/scim_utility.cpp:917
+#, fuzzy
+msgid "Georgian"
+msgstr "Tyska"
+
+#: ism/src/scim_utility.cpp:751 ism/src/scim_utility.cpp:875
+msgid "Kazakh"
+msgstr "Kazakisk"
+
+#: ism/src/scim_utility.cpp:752
+msgid "Cambodian"
+msgstr "Kambodjanska"
+
+#: ism/src/scim_utility.cpp:753
+msgid "Kannada"
+msgstr "Kannada"
+
+#: ism/src/scim_utility.cpp:754 ism/src/scim_utility.cpp:883
+msgid "Korean"
+msgstr "Koreanska"
+
+#: ism/src/scim_utility.cpp:755
+msgid "Laothian"
+msgstr "Laotiska"
+
+#: ism/src/scim_utility.cpp:756 ism/src/scim_utility.cpp:872
+#: ism/src/scim_keyboard_layout_data.h:4629
+msgid "Lithuanian"
+msgstr "Litauiska"
+
+#: ism/src/scim_utility.cpp:757 ism/src/scim_utility.cpp:871
+msgid "Latvian"
+msgstr "Lettiska"
+
+#: ism/src/scim_utility.cpp:758 ism/src/scim_utility.cpp:876
+msgid "Macedonian"
+msgstr "Makedonska"
+
+#: ism/src/scim_utility.cpp:759 ism/src/scim_utility.cpp:915
+msgid "Malayalam"
+msgstr "Malayalam"
+
+#: ism/src/scim_utility.cpp:760
+msgid "Mongolian"
+msgstr "Mongolska"
+
+#: ism/src/scim_utility.cpp:761 ism/src/scim_utility.cpp:911
+msgid "Marathi"
+msgstr "Marathi"
+
+#: ism/src/scim_utility.cpp:762
+msgid "Malay"
+msgstr "Malay"
+
+#: ism/src/scim_utility.cpp:763
+msgid "Burmese"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:764
+msgid "Nepali"
+msgstr "Nepali (Khaskura)"
+
+#: ism/src/scim_utility.cpp:765 ism/src/scim_keyboard_layout_data.h:4599
+msgid "Dutch"
+msgstr "Holländska"
+
+#: ism/src/scim_utility.cpp:766
+#, fuzzy
+msgid "Norwegian (Nynorsk)"
+msgstr "Norska (nynorsk)"
+
+#: ism/src/scim_utility.cpp:767
+#, fuzzy
+msgid "Norwegian (Bokmal)"
+msgstr "Norska (bokmål)"
+
+#: ism/src/scim_utility.cpp:768
+msgid "Oriya"
+msgstr "Oriya"
+
+#: ism/src/scim_utility.cpp:769 ism/src/scim_utility.cpp:916
+msgid "Punjabi"
+msgstr "Punjabi"
+
+#: ism/src/scim_utility.cpp:770 ism/src/scim_utility.cpp:865
+#: ism/src/scim_keyboard_layout_data.h:4614
+msgid "Polish"
+msgstr "Polska"
+
+#: ism/src/scim_utility.cpp:771 ism/src/scim_utility.cpp:773
+#: ism/src/scim_keyboard_layout_data.h:4615
+msgid "Portuguese"
+msgstr "Portugisiska"
+
+#: ism/src/scim_utility.cpp:772 ism/src/scim_keyboard_layout_data.h:4616
+msgid "Portuguese (Brazil)"
+msgstr "Portugisiska (Brasilien)"
+
+#: ism/src/scim_utility.cpp:774 ism/src/scim_utility.cpp:866
+msgid "Romanian"
+msgstr "Rumänska"
+
+#: ism/src/scim_utility.cpp:775 ism/src/scim_utility.cpp:877
+#: ism/src/scim_keyboard_layout_data.h:4618
+msgid "Russian"
+msgstr "Ryska"
+
+#: ism/src/scim_utility.cpp:776 ism/src/scim_utility.cpp:922
+msgid "Sinhala"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:777 ism/src/scim_utility.cpp:868
+#: ism/src/scim_keyboard_layout_data.h:4619
+msgid "Slovak"
+msgstr "Slovakiska"
+
+#: ism/src/scim_utility.cpp:778 ism/src/scim_utility.cpp:869
+#: ism/src/scim_keyboard_layout_data.h:4621
+msgid "Slovenian"
+msgstr "Slovenska"
+
+#: ism/src/scim_utility.cpp:779
+msgid "Albanian"
+msgstr "Albanska"
+
+#: ism/src/scim_utility.cpp:780 ism/src/scim_utility.cpp:781
+#: ism/src/scim_utility.cpp:782
+msgid "Serbian"
+msgstr "Serbiska"
+
+#: ism/src/scim_utility.cpp:783 ism/src/scim_utility.cpp:785
+#: ism/src/scim_utility.cpp:861 ism/src/scim_keyboard_layout_data.h:4625
+msgid "Swedish"
+msgstr "Svenska"
+
+#: ism/src/scim_utility.cpp:784 ism/src/scim_utility.cpp:862
+msgid "Swedish (Finland)"
+msgstr "Svenska (Finland)"
+
+#: ism/src/scim_utility.cpp:786 ism/src/scim_utility.cpp:912
+msgid "Tamil"
+msgstr "Tamil"
+
+#: ism/src/scim_utility.cpp:787 ism/src/scim_utility.cpp:910
+msgid "Telugu"
+msgstr "Telagu"
+
+#: ism/src/scim_utility.cpp:788 ism/src/scim_utility.cpp:889
+msgid "Thai"
+msgstr "Thai"
+
+#: ism/src/scim_utility.cpp:789 ism/src/scim_utility.cpp:880
+#: ism/src/scim_keyboard_layout_data.h:4626
+msgid "Turkish"
+msgstr "Turkiska"
+
+#: ism/src/scim_utility.cpp:790
+msgid "Uighur"
+msgstr "Uiguriska"
+
+#: ism/src/scim_utility.cpp:791 ism/src/scim_utility.cpp:879
+#: ism/src/scim_keyboard_layout_data.h:4630
+msgid "Ukrainian"
+msgstr "Ukrainska"
+
+#: ism/src/scim_utility.cpp:792 ism/src/scim_utility.cpp:907
+msgid "Urdu"
+msgstr "Urdu"
+
+#: ism/src/scim_utility.cpp:793
+msgid "Uzbek"
+msgstr "Uzbekiska"
+
+#: ism/src/scim_utility.cpp:794 ism/src/scim_utility.cpp:908
+msgid "Vietnamese"
+msgstr "Vietnamesiska"
+
+#: ism/src/scim_utility.cpp:795
+msgid "Walloon"
+msgstr "Vallonska"
+
+#: ism/src/scim_utility.cpp:796 ism/src/scim_utility.cpp:797
+msgid "Yiddish"
+msgstr "Jiddish"
+
+#: ism/src/scim_utility.cpp:798
+msgid "Chinese"
+msgstr "Kinesiska"
+
+#: ism/src/scim_utility.cpp:799 ism/src/scim_utility.cpp:801
+#, fuzzy
+msgid "Chinese (Simplified)"
+msgstr "Kinesiska (förenklad)"
+
+#: ism/src/scim_utility.cpp:800 ism/src/scim_utility.cpp:802
+#, fuzzy
+msgid "Chinese (Traditional)"
+msgstr "Kinesiska (traditionell)"
+
+#: ism/src/scim_utility.cpp:804
+msgid "Dutch (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:805
+#, fuzzy
+msgid "Dutch (Belgian)"
+msgstr "Belgisk"
+
+#: ism/src/scim_utility.cpp:806
+#, fuzzy
+msgid "English (United States)"
+msgstr "Engelsk (US)"
+
+#: ism/src/scim_utility.cpp:807
+#, fuzzy
+msgid "English (United Kingdom)"
+msgstr "Engelska (kanadensisk)"
+
+#: ism/src/scim_utility.cpp:810
+#, fuzzy
+msgid "English (New Zealand)"
+msgstr "Engelska (irländsk)"
+
+#: ism/src/scim_utility.cpp:811
+#, fuzzy
+msgid "English (Irish)"
+msgstr "Engelska (brittisk)"
+
+#: ism/src/scim_utility.cpp:812
+#, fuzzy
+msgid "English (South Africa)"
+msgstr "Engelska (amerikansk)"
+
+#: ism/src/scim_utility.cpp:813
+#, fuzzy
+msgid "English (Jamaica)"
+msgstr "Engelska (kanadensisk)"
+
+#: ism/src/scim_utility.cpp:814
+#, fuzzy
+msgid "English (Belize)"
+msgstr "Engelska (brittisk)"
+
+#: ism/src/scim_utility.cpp:815
+#, fuzzy
+msgid "English (Trinidad)"
+msgstr "Engelska (brittisk)"
+
+#: ism/src/scim_utility.cpp:816
+#, fuzzy
+msgid "English (Zimbabwe)"
+msgstr "Engelska (kanadensisk)"
+
+#: ism/src/scim_utility.cpp:817
+#, fuzzy
+msgid "English (Philippines)"
+msgstr "Engelska (brittisk)"
+
+#: ism/src/scim_utility.cpp:818
+#, fuzzy
+msgid "French (Standard)"
+msgstr "Fransk (kanadensisk)"
+
+#: ism/src/scim_utility.cpp:819
+#, fuzzy
+msgid "French (Belgian)"
+msgstr "Fransk (kanadensisk)"
+
+#: ism/src/scim_utility.cpp:820 ism/src/scim_keyboard_layout_data.h:4604
+msgid "French (Canadian)"
+msgstr "Fransk (kanadensisk)"
+
+#: ism/src/scim_utility.cpp:821
+#, fuzzy
+msgid "French (Swiss)"
+msgstr "Tysk (Schweizisk)"
+
+#: ism/src/scim_utility.cpp:822
+msgid "French (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:823
+#, fuzzy
+msgid "French (Monaco)"
+msgstr "Fransk (kanadensisk)"
+
+#: ism/src/scim_utility.cpp:824
+#, fuzzy
+msgid "German (Standard)"
+msgstr "Tysk (med 'Tottaste')"
+
+#: ism/src/scim_utility.cpp:825 ism/src/scim_keyboard_layout_data.h:4608
+msgid "German (Swiss)"
+msgstr "Tysk (Schweizisk)"
+
+#: ism/src/scim_utility.cpp:826
+#, fuzzy
+msgid "German (Austrian)"
+msgstr "Engelska (australiensisk)"
+
+#: ism/src/scim_utility.cpp:827
+msgid "German (Luxembourg)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:828
+#, fuzzy
+msgid "German (Liechtenstein)"
+msgstr "Tysk (Schweizisk)"
+
+#: ism/src/scim_utility.cpp:829
+msgid "Italian (Standard)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:830
+#, fuzzy
+msgid "Italian (Swiss)"
+msgstr "Tysk (Schweizisk)"
+
+#: ism/src/scim_utility.cpp:831
+#, fuzzy
+msgid "Portuguese (Brazilian)"
+msgstr "Portugisiska (Brasilien)"
+
+#: ism/src/scim_utility.cpp:832
+#, fuzzy
+msgid "Portuguese (Standard)"
+msgstr "Portugisiska (Brasilien)"
+
+#: ism/src/scim_utility.cpp:833
+#, fuzzy
+msgid "Spanish (Traditional Sort)"
+msgstr "Spansk (Latinamerika)"
+
+#: ism/src/scim_utility.cpp:834
+#, fuzzy
+msgid "Spanish (Mexican)"
+msgstr "Spanska (Mexiko)"
+
+#: ism/src/scim_utility.cpp:835
+#, fuzzy
+msgid "Spanish (Guatemala)"
+msgstr "Spansk (Latinamerika)"
+
+#: ism/src/scim_utility.cpp:836
+#, fuzzy
+msgid "Spanish (Costa Rica)"
+msgstr "Spansk (Latinamerika)"
+
+#: ism/src/scim_utility.cpp:837
+#, fuzzy
+msgid "Spanish (Panama)"
+msgstr "Spansk (Latinamerika)"
+
+#: ism/src/scim_utility.cpp:838
+#, fuzzy
+msgid "Spanish (Dominican Republic)"
+msgstr "Spansk (Latinamerika)"
+
+#: ism/src/scim_utility.cpp:839
+#, fuzzy
+msgid "Spanish (Venezuela)"
+msgstr "Spanska (Mexiko)"
+
+#: ism/src/scim_utility.cpp:840
+#, fuzzy
+msgid "Spanish (Colombia)"
+msgstr "Spanska (Mexiko)"
+
+#: ism/src/scim_utility.cpp:841
+#, fuzzy
+msgid "Spanish (Peru)"
+msgstr "Spanska (Mexiko)"
+
+#: ism/src/scim_utility.cpp:842
+#, fuzzy
+msgid "Spanish (Argentina)"
+msgstr "Spanska (Mexiko)"
+
+#: ism/src/scim_utility.cpp:843
+#, fuzzy
+msgid "Spanish (Ecuador)"
+msgstr "Spanska (Mexiko)"
+
+#: ism/src/scim_utility.cpp:844
+#, fuzzy
+msgid "Spanish (Chile)"
+msgstr "Spanska (Mexiko)"
+
+#: ism/src/scim_utility.cpp:845
+#, fuzzy
+msgid "Spanish (Uruguay)"
+msgstr "Spanska (Mexiko)"
+
+#: ism/src/scim_utility.cpp:846
+#, fuzzy
+msgid "Spanish (Paraguay)"
+msgstr "Spansk (CP 850)"
+
+#: ism/src/scim_utility.cpp:847
+#, fuzzy
+msgid "Spanish (Bolivia)"
+msgstr "Spanska (Mexiko)"
+
+#: ism/src/scim_utility.cpp:848
+msgid "Spanish (El Salvador)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:849
+#, fuzzy
+msgid "Spanish (Honduras)"
+msgstr "Spanska (Mexiko)"
+
+#: ism/src/scim_utility.cpp:850
+#, fuzzy
+msgid "Spanish (Nicaragua)"
+msgstr "Spanska (Mexiko)"
+
+#: ism/src/scim_utility.cpp:851
+#, fuzzy
+msgid "Spanish (Puerto Rico)"
+msgstr "Spanska (Mexiko)"
+
+#: ism/src/scim_utility.cpp:855
+msgid "Afrikaans"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:858
+#, fuzzy
+msgid "Malay (Malaysia)"
+msgstr "Malayalam"
+
+#: ism/src/scim_utility.cpp:859
+msgid "Malay (Brunei Darussalam)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:860 ism/src/scim_keyboard_layout_data.h:4613
+msgid "Norwegian"
+msgstr "Norsk"
+
+#: ism/src/scim_utility.cpp:867
+#, fuzzy
+msgid "Serbian (Latin)"
+msgstr "Serbiska"
+
+#: ism/src/scim_utility.cpp:878
+msgid "Serbian (Cyrillic)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:881
+msgid "Uzbek (Latin)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:884
+#, fuzzy
+msgid "Chinese (Taiwan)"
+msgstr "Kinesiska (traditionell)"
+
+#: ism/src/scim_utility.cpp:885
+#, fuzzy
+msgid "Chinese (Hong Kong)"
+msgstr "Kinesiska (traditionell)"
+
+#: ism/src/scim_utility.cpp:886
+#, fuzzy
+msgid "Chinese (Macau)"
+msgstr "Kinesiska (traditionell)"
+
+#: ism/src/scim_utility.cpp:887
+#, fuzzy
+msgid "Chinese (PRC)"
+msgstr "Kinesiska"
+
+#: ism/src/scim_utility.cpp:888
+#, fuzzy
+msgid "Chinese (Singapore)"
+msgstr "Kinesiska (förenklad)"
+
+#: ism/src/scim_utility.cpp:891
+msgid "Arabic (Saudi Arabia)"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:892
+#, fuzzy
+msgid "Arabic (Iraq)"
+msgstr "Arabiska (Libanon)"
+
+#: ism/src/scim_utility.cpp:894
+#, fuzzy
+msgid "Arabic (Libya)"
+msgstr "Arabiska (Libanon)"
+
+#: ism/src/scim_utility.cpp:895
+#, fuzzy
+msgid "Arabic (Algeria)"
+msgstr "Arabiska (Libanon)"
+
+#: ism/src/scim_utility.cpp:896
+#, fuzzy
+msgid "Arabic (Morocco)"
+msgstr "Arabiska (Libanon)"
+
+#: ism/src/scim_utility.cpp:897
+#, fuzzy
+msgid "Arabic (Tunisia)"
+msgstr "Arabiska (Libanon)"
+
+#: ism/src/scim_utility.cpp:898
+#, fuzzy
+msgid "Arabic (Oman)"
+msgstr "Arabiska (Libanon)"
+
+#: ism/src/scim_utility.cpp:899
+#, fuzzy
+msgid "Arabic (Yemen)"
+msgstr "Arabiska (Libanon)"
+
+#: ism/src/scim_utility.cpp:900
+#, fuzzy
+msgid "Arabic (Syria)"
+msgstr "Arabiska (Egypten)"
+
+#: ism/src/scim_utility.cpp:901
+#, fuzzy
+msgid "Arabic (Jordan)"
+msgstr "Arabiska (Libanon)"
+
+#: ism/src/scim_utility.cpp:903
+#, fuzzy
+msgid "Arabic (Kuwait)"
+msgstr "Arabiska (Egypten)"
+
+#: ism/src/scim_utility.cpp:904
+#, fuzzy
+msgid "Arabic (UAE)"
+msgstr "Arabiska (Egypten)"
+
+#: ism/src/scim_utility.cpp:905
+#, fuzzy
+msgid "Arabic (Bahrain)"
+msgstr "Arabiska (Libanon)"
+
+#: ism/src/scim_utility.cpp:906
+#, fuzzy
+msgid "Arabic (Qatar)"
+msgstr "Arabiska (Egypten)"
+
+#: ism/src/scim_utility.cpp:920
+msgid "Hausa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:924
+msgid "Xhosa"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:925
+msgid "Yoruba"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:926
+msgid "Zulu"
+msgstr ""
+
+#: ism/src/scim_utility.cpp:1024
+msgid "Other"
+msgstr "Annat"
+
+#: ism/src/scim_keyboard_layout_data.h:4592
+#: ism/modules/imengine/scim_socket_imengine.cpp:408
+#: ism/modules/imengine/scim_socket_imengine.cpp:438
+#: ism/modules/imengine/scim_socket_imengine.cpp:523
+#: ism/modules/imengine/scim_socket_imengine.cpp:553
+#: ism/modules/imengine/scim_socket_imengine.cpp:583
+msgid "Unknown"
+msgstr "Okänd"
+
+#: ism/src/scim_keyboard_layout_data.h:4593
+msgid "English (US)"
+msgstr "Engelsk (US)"
+
+#: ism/src/scim_keyboard_layout_data.h:4594
+msgid "Belgian"
+msgstr "Belgisk"
+
+#: ism/src/scim_keyboard_layout_data.h:4597
+msgid "Czech (qwerty)"
+msgstr "Tjeckisk (qwerty)"
+
+#: ism/src/scim_keyboard_layout_data.h:4600
+msgid "Dvorak"
+msgstr "Dvorak"
+
+#: ism/src/scim_keyboard_layout_data.h:4605
+msgid "French (Switzerland)"
+msgstr "Fransk (schweizisk)"
+
+#: ism/src/scim_keyboard_layout_data.h:4607
+msgid "German (with deadkeys)"
+msgstr "Tysk (med 'Tottaste')"
+
+#: ism/src/scim_keyboard_layout_data.h:4617
+msgid "Portuguese (Brazil US accents)"
+msgstr "Portugisisk (Brazilien, am. diakriter)"
+
+#: ism/src/scim_keyboard_layout_data.h:4620
+msgid "Slovak (qwerty)"
+msgstr "Slovakisk (qwerty)"
+
+#: ism/src/scim_keyboard_layout_data.h:4623
+msgid "Spanish (CP 850)"
+msgstr "Spansk (CP 850)"
+
+#: ism/src/scim_keyboard_layout_data.h:4624
+msgid "Spanish (Latin America)"
+msgstr "Spansk (Latinamerika)"
+
+#: ism/src/scim_keyboard_layout_data.h:4627
+msgid "English (UK)"
+msgstr "Engelsk (UK)"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:57
+msgid "Simplified-Traditional Chinese Conversion"
+msgstr "Omvandling förenklad/traditionell kinesiska"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:60
+msgid "Convert between Simplified Chinese and Traditional Chinese"
+msgstr "Omvandla förenklad kinesiska till traditionell och vice versa"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:71
+msgid "SC-TC"
+msgstr "SC-TC"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:73
+#: ism/modules/filter/scim_sctc_filter.cpp:78
+msgid "Simplified-Traditional Chinese conversion"
+msgstr "Omvandling förenklad/traditionell kinesiska"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:76
+msgid "No Conversion"
+msgstr "Ingen omvandling"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:81
+msgid "Simplified to Traditional"
+msgstr "Förenklad till traditionell"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:83
+msgid "Convert Simplified Chinese to Traditional Chinese"
+msgstr "Omvandla förenklad kinesiska till traditionell"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:86
+msgid "Traditional to Simplified"
+msgstr "Traditionell till förenklad"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:88
+msgid "Convert Traditional Chinese to Simplified Chinese"
+msgstr "Omvandla traditionell kinesiska till förenklad"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:300
+msgid "James Su <suzhe@tsinghua.org.cn>"
+msgstr "James Su <suzhe@tsinghua.org.cn>"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:425
+#: ism/modules/filter/scim_sctc_filter.cpp:555
+#: ism/modules/filter/scim_sctc_filter.cpp:571
+msgid "SC->TC"
+msgstr "SC->TC"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:431
+#: ism/modules/filter/scim_sctc_filter.cpp:559
+#: ism/modules/filter/scim_sctc_filter.cpp:575
+msgid "TC->SC"
+msgstr "TC->SC"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1693
+msgid "Smart Common Input Method platform "
+msgstr "Scim-plattformen (Smart Common Input Method)"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1695
+msgid ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+msgstr ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1700
+msgid ""
+":\n"
+"\n"
+msgstr ""
+":\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1703
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:963
+msgid "Enable"
+msgstr "Aktivera"
+
+#. gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+#. gtk_tree_view_column_set_fixed_width (column, 232);
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:984
+msgid "Name"
+msgstr "Namn"
+
+#: ism/utils/scimstringview.c:201
+msgid "Cursor Position"
+msgstr "Markörens position"
+
+#: ism/utils/scimstringview.c:202
+msgid "The current position of the insertion cursor in chars."
+msgstr "Markörens läge i texten, räknat i tecken."
+
+#: ism/utils/scimstringview.c:211
+msgid "Maximum length"
+msgstr "Maxlängd"
+
+#: ism/utils/scimstringview.c:212
+msgid "Maximum number of characters for this string view. Zero if no maximum."
+msgstr ""
+"Högsta antal tecken att visa i den här teckenraden. Välj 0 för att inte "
+"begränsa längden."
+
+#: ism/utils/scimstringview.c:221
+msgid "Maximum width"
+msgstr "Maxbredd"
+
+#: ism/utils/scimstringview.c:222
+msgid "Maximum width of this string view."
+msgstr "Maximal bredd för att visa den här teckenraden."
+
+#: ism/utils/scimstringview.c:231
+msgid "Has Frame"
+msgstr "Med ram"
+
+#: ism/utils/scimstringview.c:232
+msgid "FALSE removes outside bevel from string view."
+msgstr "Om FALSK tas ytterkanten bort från strängvyn."
+
+#: ism/utils/scimstringview.c:239
+msgid "Draw cursor"
+msgstr "Visa markör"
+
+#: ism/utils/scimstringview.c:240
+msgid "TRUE draw blinking cursor."
+msgstr "Om SANT använd blinkande markör."
+
+#: ism/utils/scimstringview.c:247
+msgid "Auto move cursor"
+msgstr "Flytta markören automatiskt"
+
+#: ism/utils/scimstringview.c:248
+msgid "TRUE auto move cursor position when mouse clicking."
+msgstr "Flytta markören automatiskt vid musklick."
+
+#: ism/utils/scimstringview.c:255
+#, fuzzy
+msgid "Forward button press/release event"
+msgstr "Direktmata tangenter"
+
+#: ism/utils/scimstringview.c:256
+#, fuzzy
+msgid "TRUE forward button press/release event to user program."
+msgstr "Skicka tangentnedtryckningar till användarprogrammet."
+
+#: ism/utils/scimstringview.c:263
+msgid "Auto resize the widget to fit the string"
+msgstr "Anpassa storleken automatiskt till teckenraden."
+
+#: ism/utils/scimstringview.c:264
+msgid "TRUE Auto resize on."
+msgstr "Storleken anpassas automatiskt."
+
+#: ism/utils/scimstringview.c:271
+msgid "Emit move_cursor signal when press/release the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:272
+#, fuzzy
+msgid "TRUE Emit move_cursor signal when press the string."
+msgstr "Flytta markören automatiskt vid musklick."
+
+#: ism/utils/scimstringview.c:279
+msgid "Width in chars"
+msgstr "Bredd (antal tecken)"
+
+#: ism/utils/scimstringview.c:280
+msgid "Number of characters to leave space for in the string view."
+msgstr "Antal tecken att göra rum för i teckenraden."
+
+#: ism/utils/scimstringview.c:289
+msgid "Scroll offset"
+msgstr "Mjuk rullning"
+
+#: ism/utils/scimstringview.c:290
+msgid "Number of pixels of the string view scrolled off the screen to the left"
+msgstr "Antal pixlar i teckenraden som rullat över vänsterkanten på skärmen"
+
+#: ism/utils/scimstringview.c:299
+msgid "Text"
+msgstr "Text"
+
+#: ism/utils/scimstringview.c:300
+msgid "The contents of the string view"
+msgstr "Innehållet i teckenraden"
+
+#: ism/utils/scimkeyselection.cpp:161
+msgid "Selected _Keys:"
+msgstr "Valda _kortkommandon:"
+
+#: ism/utils/scimkeyselection.cpp:206
+msgid "Key Code:"
+msgstr "Tangentkod:"
+
+#: ism/utils/scimkeyselection.cpp:224
+#, fuzzy
+msgid "....."
+msgstr "..."
+
+#: ism/utils/scimkeyselection.cpp:229
+msgid "Modifiers:"
+msgstr "Specialtangenter:"
+
+#: ism/utils/scimkeyselection.cpp:242
+msgid "_Ctrl"
+msgstr "_Ctrl"
+
+#: ism/utils/scimkeyselection.cpp:246
+msgid "A_lt"
+msgstr "A_lt"
+
+#: ism/utils/scimkeyselection.cpp:250
+msgid "_Shift"
+msgstr "_Shift"
+
+#: ism/utils/scimkeyselection.cpp:254
+msgid "_Release"
+msgstr "_Release"
+
+#: ism/utils/scimkeyselection.cpp:264
+msgid "_Meta"
+msgstr "_Meta"
+
+#: ism/utils/scimkeyselection.cpp:268
+msgid "S_uper"
+msgstr "S_uper"
+
+#: ism/utils/scimkeyselection.cpp:272
+msgid "_Hyper"
+msgstr "_Hyper"
+
+#: ism/utils/scimkeyselection.cpp:337
+msgid "Please enter a Key Code first."
+msgstr "Ange tangentkod först."
+
+#: ism/utils/scimkeyselection.cpp:391
+#, fuzzy
+msgid ""
+"Press a key (or a key combination).\n"
+"This dialog will be closed \n"
+"when the key is released."
+msgstr ""
+"Tryck på en tangent eller på en tangentkombination.\n"
+"Den här rutan försvinner när du släpper tangenten."
+
+#: ism/utils/scimkeyselection.cpp:395
+msgid "Grabbing a key."
+msgstr "Plockar tangent"
+
+#: ism/utils/scimkeyselection.cpp:686
+msgid "Key Selection"
+msgstr "Tangentval"
+
+#: ism/utils/scimtrayicon.c:108
+msgid "Orientation"
+msgstr "Riktning"
+
+#: ism/utils/scimtrayicon.c:109
+msgid "The orientation of the tray."
+msgstr "Panelens riktning."
+
+#. Normal Layout
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "NORMAL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:139
+msgid "click to enter TEXT"
+msgstr ""
+
+#. Number Layout
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "NUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:158
+msgid "click to enter NUMBER"
+msgstr ""
+
+#. Email Layout
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "EMAIL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:162
+msgid "click to enter EMAIL"
+msgstr ""
+
+#. URL Layout
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "URL LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:166
+msgid "click to enter URL"
+msgstr ""
+
+#. Phonenumber Layout
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "PHONENUMBER LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:170
+msgid "click to enter PHONENUMBER"
+msgstr ""
+
+#. IP Layout
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "IP LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:174
+msgid "click to enter IP"
+msgstr ""
+
+#. Month Layout
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "MONTH LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:178
+msgid "click to enter MONTH"
+msgstr ""
+
+#. Number Only Layout
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "NUMBERONLY LAYOUT"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:182
+msgid "click to enter NUMBERONLY"
+msgstr ""
+
+#: ism/demos/isf_layout_efl.cpp:220
+msgid "ise layout"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:51
+msgid "Application template"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:52
+msgid "Click to exit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:156
+msgid "Previous"
+msgstr ""
+
+#. bundle_add(ad->data, "navi_btn_left", NULL);
+#: ism/demos/isf_demo_efl.cpp:158
+#, fuzzy
+msgid "Next"
+msgstr "Text"
+
+#: ism/demos/isf_demo_efl.cpp:171
+msgid "Quit"
+msgstr ""
+
+#: ism/demos/isf_demo_efl.cpp:203
+msgid "isf demo"
+msgstr ""
+
+#: ism/demos/isf_entry_event_efl.cpp:151
+msgid "entry event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:220
+msgid "label event demo"
+msgstr ""
+
+#: ism/demos/isf_event_efl.cpp:250
+msgid "ise event demo"
+msgstr ""
+
+#: ism/demos/isf_imcontrol_efl.cpp:375
+msgid "isfimcontrol api"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:432
+#: ism/extras/efl_setting/isf_setting_efl.cpp:713
+msgid "Set"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:441
+#: ism/extras/efl_setting/isf_setting_efl.cpp:443
+#: ism/extras/efl_setting/isf_setting_efl.cpp:722
+#, fuzzy
+msgid "Selection"
+msgstr "Tangentval"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:636
+#: ism/extras/efl_setting/isf_setting_efl.cpp:830
+#, fuzzy, c-format
+msgid "Option"
+msgstr "Alternativ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto capitalization"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:953
+msgid "Auto period"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:963
+#, fuzzy
+msgid "General"
+msgstr "Tyska"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:998
+#, fuzzy
+msgid "S/W keyboard"
+msgstr "Latinsk teckeninmatning"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1004
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1079
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:254
+#: ism/extras/efl_setting/isf_setting_wizard.cpp:257
+#, fuzzy
+msgid "Keyboard selection"
+msgstr "Tangentval"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1016
+#, fuzzy
+msgid "Keyboard option"
+msgstr "Tangentval"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1052
+#, fuzzy
+msgid "H/W keyboard"
+msgstr "Latinsk teckeninmatning"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1065
+#, fuzzy
+msgid "option"
+msgstr "Alternativ"
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1110
+msgid "Back"
+msgstr ""
+
+#: ism/extras/efl_setting/isf_setting_efl.cpp:1118
+#, fuzzy
+msgid "Keyboard"
+msgstr "Latinsk teckeninmatning"
+
+#, fuzzy
+#~ msgid "Automatic"
+#~ msgstr "Amhariska"
+
+#, fuzzy
+#~ msgid "Always used"
+#~ msgstr "Alltid"
+
+#, fuzzy
+#~ msgid "%s Option"
+#~ msgstr "Alternativ"
+
+#, fuzzy
+#~ msgid "Keyboards"
+#~ msgstr "Latinsk teckeninmatning"
+
+#~ msgid "English/European"
+#~ msgstr "Västerländsk"
+
+#~ msgid "RAW CODE"
+#~ msgstr "TANGENTKOD"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "Snabbtangenter:\n"
+#~ "\n"
+#~ " Ctrl+u:\n"
+#~ " Växla mellan multibytekodning and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " återställ inmatningsmetod.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "Aktuell inmatningsmetod. Klicka för att ändra."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "Allmänna inställningar"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "Allmänna inställningar som gäller alla användargränssnitt, t.ex. X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+
+#~ msgid "_Trigger:"
+#~ msgstr "Ak_tiveringstangent"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "Välj aktiveringstangenter"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som öppnar och stänger SCIM-inmatningen. Klicka "
+#~ "påknappen till höger för att ändra."
+
+#~ msgid "Turn _On:"
+#~ msgstr "Slå på (_o):"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "Välj på-kommando"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som öppnar SCIM-inmatningen. Klicka påknappen till "
+#~ "höger för att ändra."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "Stäng av (_f):"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "Välj på-kommando"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som stänger SCIM-inmatningen. Klicka påknappen till "
+#~ "höger för att ändra."
+
+#~ msgid "_Next input method:"
+#~ msgstr "_Nästa inmatningsmetod:"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "Välj kommando för att hoppa till nästa"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som växlar till nästa inmatningsmetod. Klicka "
+#~ "påknappen till höger för att ändra."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "Föregående inmatningsmetod (_p):"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "Välj kommando för att hoppa till föregående"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som växlar till föregående inmatningsmetod. Klicka "
+#~ "påknappen till höger för att ändra."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "Visa _meny med inmatningsmetoder:"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "Välj kommando för att visa menyn med inmatningsmetoder"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr ""
+#~ "Tangentkombinationer som visar menyn med inmatningsmetoder. Klicka "
+#~ "påknappen till höger för att ändra."
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "Tangentbordslayout (_k):"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "Här väljer du vilket slags tangentbord du har. Det är nödvändigt föratt "
+#~ "vissa inmatningsmetoder skall fungera."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "Visa okonverterad_e latinska tecken i ditt arbetsfönster."
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "Med det här alternativet förbockat kommer de latinska bokstäver du "
+#~ "skriveratt visas direkt i fönstret du arbetar i. Annars visas de i ett "
+#~ "popup-fönster."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "Använd _samma inmatningsmetod i alla program"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "Med det här alternativet förbockat kommer bara en inmatningsmetod att "
+#~ "användasi taget. Annars kan varje program använda olika metoder."
+
+#~ msgid "Hotkeys"
+#~ msgstr "Kortkommandon"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr ""
+#~ "Slå av och på inmatningsmetoder och ange kortkommandon för olika "
+#~ "inmatningsmetoder här."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "Installerade inmatningsmetoder:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "Redigera kortkommandon (_h)"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "Välj kortkommandon för vald inmatningsmetod."
+
+#~ msgid "Select _Filters"
+#~ msgstr "Välj _filter"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "Välj filter att använda till den här inmatningsmetoden."
+
+#~ msgid "_Expand"
+#~ msgstr "Visa allt (_e)"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "Visa alla inmatningsmetoder"
+
+#~ msgid "_Collapse"
+#~ msgstr "Göm allt (_c)"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "Göm alla inmatningsmetoder."
+
+#~ msgid "E_nable All"
+#~ msgstr "Markera alla (_n)"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "Gör alla inmatningsmetoder tillgängliga för användning."
+
+#~ msgid "_Disable All"
+#~ msgstr "Avmarkera alla (_d)"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "Gör alla inmatningsmetoder otillgängliga för användning."
+
+#~ msgid "Filters"
+#~ msgstr "Filter"
+
+#~ msgid "Languages"
+#~ msgstr "Språk"
+
+#~ msgid "Description"
+#~ msgstr "Beskrivning"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "Välj kortkommando för %s"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "Välj filter för %s"
+
+#~ msgid "Move _Up"
+#~ msgstr "Flytta _uppåt"
+
+#~ msgid "Move _Down"
+#~ msgstr "Flytta ne_dåt"
+
+#~ msgid "GTK"
+#~ msgstr "GTK"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "Paneldemon byggd på GTK+-2.x-biblioteket."
+
+#~ msgid "On demand"
+#~ msgstr "På begäran"
+
+#~ msgid "Never"
+#~ msgstr "Aldrig"
+
+#~ msgid "ToolBar"
+#~ msgstr "Verktygsfält"
+
+#~ msgid "_Show:"
+#~ msgstr "Vi_sa"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "Fäst vid skärmka_nt"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "Visa ikon för aktuell inmatningsmetod"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "Visa namn på akt_uell inmatningsmetod"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "Time_out för att dölja:"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "Vi_sa fixeringsikonen"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "Visa m_enyikonen"
+
+#~ msgid "Show _help icon"
+#~ msgstr "Visa _hjälpikonen"
+
+#~ msgid "Show _property label"
+#~ msgstr "Visa inmatningsalternativ"
+
+#~ msgid "Input window"
+#~ msgstr "Inmatningsfönster"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "Infälld teckenväljare (_m)"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "_Vertikal teckenväljare"
+
+#~ msgid "Misc"
+#~ msgstr "Diverse"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "Visa ikon i s_ystempanelen"
+
+#~ msgid "Stick _windows"
+#~ msgstr "Fäst fönster (_w)"
+
+#~ msgid "_Font:"
+#~ msgstr "Typsnitt (_f)"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "Välj \"Alltid\" för att ständigt visa verktygsfältet på skärmen. Välj\"På "
+#~ "begäran\" för att bara visa verktygsfältet när Scim är aktivt.Välj \"Never"
+#~ "\" för att aldrig visa verktygsfältet."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr ""
+#~ "Med det här alternativet förbockat är verktygsfältet alltid fäst mot "
+#~ "skärmkanten."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "Verktygsfältet döljs efter så här lång tid. Den här inställningen används "
+#~ "baranär du har valt \"Alltid\" i menyn till vänster. Välj 0 för att "
+#~ "aldrig döljaverktygsfältet."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas alltid ikonen för "
+#~ "aktuellinmatningsmetod i verktygsfältet."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas alltid namnet på "
+#~ "aktuellinmatningsmetod i verktygsfältet."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas häftstiftsikonen i "
+#~ "verktygsfältet"
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas menyikonen i verktygsfältet"
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas hjälpikonen i verktygsfältet."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas en textlapp med "
+#~ "inmatningsalternativi verktygsfältet"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat, visas teckenväljaren infälld "
+#~ "iinmatningsfönstret."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat används en vertikal teckenväljare."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat visas panelikonen i "
+#~ "skrivbordetssystempanel."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr ""
+#~ "Med det här alternativet förkryssat fixeras verktygsfält, "
+#~ "inmatningsfönsteroch teckenväljare på en given plats."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr ""
+#~ "Det typsnitt som kommer att användas i inmatnings- och teckenväljarfönster"
+
+#~ msgid "Select Interface Font"
+#~ msgstr "Välj typsnitt för användargränssnittet"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "FrontEnd"
+
+#~ msgid "IMEngine"
+#~ msgstr "IMEngine"
+
+#~ msgid "Panel"
+#~ msgstr "Panel"
+
+#~ msgid "Extra"
+#~ msgstr "Extra"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "Inställningar för Scim"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">Scim-plattformen (Smart Common Input Method)</"
+#~ "span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">Grafiskt inställningsverktyg</"
+#~ "span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">Inställningar för %s-moduler.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "Vill du avsluta inställningsverktyget för Scim?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "Många inställningar kräver att du startar om Scim innan du fortsätter,för "
+#~ "att de skall börja verka."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "Inställningar för Scim"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "Inställningsverktyg byggt på GTK Widget-biblioteket."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr ""
+#~ "Inställningsverktyg för Scim-plattformen (Smart Common Input Method)"
+
+#~ msgid "SCIM Help"
+#~ msgstr "Om Scim"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "Scim (Smart Common Input Method)"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "Fixera/lossa inmatningsfönstret och verktygsfältet"
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "Kortfattad information om Scim och om aktuell inmatningsmetod."
+
+#~ msgid "Show command menu."
+#~ msgstr "Visa kommandomenyn."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "Återhämta inställningar"
+
+#~ msgid "Stick Windows"
+#~ msgstr "Fixera fönster"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "Dölj verktygsfältet"
+
+#~ msgid "Help ..."
+#~ msgstr "Hjälp ..."
+
+#~ msgid "Exit"
+#~ msgstr "Avsluta"
--- /dev/null
+#!/bin/sh
+
+PACKAGE=scim
+SRCROOT=../..
+POTFILES=POTFILES.in
+
+#ALL_LINGUAS= am az be ca cs da de el en_CA en_GB es et fi fr hr hu it ja ko lv mk ml ms nb ne nl pa pl pt pt_BR ru rw sk sl sr sr@Latn sv ta tr uk vi zh_CN zh_TW
+ALL_LINGUAS="en_US en_GB ja ko zh_CN cs de fi fr it nl pa sv zh_TW"
+
+XGETTEXT=/usr/bin/xgettext
+MSGMERGE=/usr/bin/msgmerge
+
+echo -n "Make ${PACKAGE}.pot "
+if [ ! -e $POTFILES ] ; then
+ echo "$POTFILES not found"
+ exit 1
+fi
+
+$XGETTEXT --default-domain=${PACKAGE} --directory=${SRCROOT} \
+ --add-comments --keyword=_ --keyword=N_ --files-from=$POTFILES \
+&& test ! -f ${PACKAGE}.po \
+ || (rm -f ${PACKAGE}.pot && mv ${PACKAGE}.po ${PACKAGE}.pot)
+
+if [ $? -ne 0 ]; then
+ echo "error"
+ exit 1
+else
+ echo "done"
+fi
+
+for LANG in $ALL_LINGUAS; do
+ echo "$LANG : "
+
+ if [ ! -e $LANG.po ] ; then
+ cp ${PACKAGE}.pot ${LANG}.po
+ echo "${LANG}.po created"
+ else
+ if $MSGMERGE ${LANG}.po ${PACKAGE}.pot -o ${LANG}.new.po ; then
+ if cmp ${LANG}.po ${LANG}.new.po > /dev/null 2>&1; then
+ rm -f ${LANG}.new.po
+ else
+ if mv -f ${LANG}.new.po ${LANG}.po; then
+ echo ""
+ else
+ echo "msgmerge for $LANG.po failed: cannot move $LANG.new.po to $LANG.po" 1>&2
+ rm -f ${LANG}.new.po
+ exit 1
+ fi
+ fi
+ else
+ echo "msgmerge for $LANG failed!"
+ rm -f ${LANG}.new.po
+ fi
+ fi
+ echo ""
+done
+
--- /dev/null
+# translation of zh_CN.po to Simplified Chinese
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# James Su <suzhe@tsinghua.org.cn>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: zh_CN\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 15:30+0900\n"
+"PO-Revision-Date: 2004-06-20 14:57+0800\n"
+"Last-Translator: James Su <suzhe@tsinghua.org.cn>\n"
+"Language-Team: Simplified Chinese <zh@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.3.1\n"
+
+#: ism/src/scim_compose_key.cpp:127 ism/src/scim_imengine.cpp:659
+#: ism/src/scim_panel_agent.cpp:345 ism/src/scim_panel_agent.cpp:4334
+#: ism/src/scim_utility.cpp:701
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1740
+msgid "English/Keyboard"
+msgstr "英语键盘"
+
+#. return WideString ();
+#: ism/src/scim_compose_key.cpp:146
+msgid "English input service"
+msgstr "英语输入"
+
+#: ism/src/scim_utility.cpp:702
+msgid "Amharic"
+msgstr "阿姆哈拉语"
+
+#: ism/src/scim_utility.cpp:703
+msgid "Arabic"
+msgstr "阿拉伯语"
+
+#: ism/src/scim_utility.cpp:704 ism/src/scim_utility.cpp:893
+msgid "Arabic (Egypt)"
+msgstr "阿拉伯语(埃及)"
+
+#: ism/src/scim_utility.cpp:705 ism/src/scim_utility.cpp:902
+msgid "Arabic (Lebanon)"
+msgstr "阿拉伯语(黎巴嫩)"
+
+#: ism/src/scim_utility.cpp:706
+msgid "Assamese"
+msgstr "阿萨姆语"
+
+#: ism/src/scim_utility.cpp:707 ism/src/scim_utility.cpp:918
+msgid "Azerbaijani"
+msgstr "阿塞拜疆语"
+
+#: ism/src/scim_utility.cpp:708
+msgid "Belarusian"
+msgstr "白俄罗斯语"
+
+#: ism/src/scim_utility.cpp:709 ism/src/scim_utility.cpp:874
+msgid "Bulgarian"
+msgstr "保加利亚语"
+
+#: ism/src/scim_utility.cpp:710 ism/src/scim_utility.cpp:711
+#: ism/src/scim_utility.cpp:913
+msgid "Bengali"
+msgstr "孟加拉语"
+
+#: ism/src/scim_utility.cpp:712
+msgid "Bengali (India)"
+msgstr "孟加拉语(印度)"
+
+#: ism/src/scim_utility.cpp:713
+msgid "Tibetan"
+msgstr "西藏语"
+
+#: ism/src/scim_utility.cpp:714
+msgid "Bosnian"
+msgstr "波斯尼亚语"
+
+#: ism/src/scim_utility.cpp:715 ism/src/scim_utility.cpp:853
+msgid "Catalan"
+msgstr "加泰罗尼亚语"
+
+#: ism/src/scim_utility.cpp:716 ism/src/scim_utility.cpp:863
+#: ism/src/scim_keyboard_layout_data.h:4596
+msgid "Czech"
+msgstr "捷克语"
+
+#: ism/src/scim_utility.cpp:717 ism/src/scim_utility.cpp:923
+msgid "Welsh"
+msgstr "威尔士语"
+
+#: ism/src/scim_utility.cpp:718 ism/src/scim_utility.cpp:854
+#: ism/src/scim_keyboard_layout_data.h:4598
+msgid "Danish"
+msgstr "丹麦语"
+
+#: ism/src/scim_utility.cpp:719 ism/src/scim_keyboard_layout_data.h:4606
+msgid "German"
+msgstr "德语"
+
+#: ism/src/scim_utility.cpp:720
+msgid "Divehi"
+msgstr "迪维希语"
+
+#: ism/src/scim_utility.cpp:721 ism/src/scim_utility.cpp:873
+#: ism/src/scim_keyboard_layout_data.h:4609
+msgid "Greek"
+msgstr "希腊语"
+
+#: ism/src/scim_utility.cpp:722
+msgid "English"
+msgstr "英语"
+
+#: ism/src/scim_utility.cpp:723 ism/src/scim_utility.cpp:808
+msgid "English (Australian)"
+msgstr "英语(澳大利亚)"
+
+#: ism/src/scim_utility.cpp:724 ism/src/scim_utility.cpp:809
+msgid "English (Canadian)"
+msgstr "英语(加拿大)"
+
+#: ism/src/scim_utility.cpp:725
+msgid "English (British)"
+msgstr "英语(不列颠)"
+
+#: ism/src/scim_utility.cpp:726
+msgid "English (Ireland)"
+msgstr "英语(爱尔兰)"
+
+#: ism/src/scim_utility.cpp:727
+msgid "English (American)"
+msgstr "英语(美国)"
+
+#: ism/src/scim_utility.cpp:728 ism/src/scim_utility.cpp:729
+#: ism/src/scim_keyboard_layout_data.h:4622
+msgid "Spanish"
+msgstr "西班牙语"
+
+#: ism/src/scim_utility.cpp:730
+msgid "Spanish (Mexico)"
+msgstr "西班牙语(墨西哥)"
+
+#: ism/src/scim_utility.cpp:731 ism/src/scim_utility.cpp:870
+#: ism/src/scim_keyboard_layout_data.h:4601
+msgid "Estonian"
+msgstr "爱沙尼亚语"
+
+#: ism/src/scim_utility.cpp:732 ism/src/scim_utility.cpp:852
+msgid "Basque"
+msgstr "巴斯克语"
+
+#: ism/src/scim_utility.cpp:733
+msgid "Persian"
+msgstr "波斯语"
+
+#: ism/src/scim_utility.cpp:734 ism/src/scim_utility.cpp:857
+#: ism/src/scim_keyboard_layout_data.h:4602
+msgid "Finnish"
+msgstr "芬兰语"
+
+#: ism/src/scim_utility.cpp:735 ism/src/scim_keyboard_layout_data.h:4603
+msgid "French"
+msgstr "法语"
+
+#: ism/src/scim_utility.cpp:736 ism/src/scim_utility.cpp:921
+msgid "Irish"
+msgstr "爱尔兰语"
+
+#: ism/src/scim_utility.cpp:737 ism/src/scim_utility.cpp:919
+msgid "Galician"
+msgstr "加利西亚语"
+
+#: ism/src/scim_utility.cpp:738 ism/src/scim_utility.cpp:914
+msgid "Gujarati"
+msgstr "古吉拉特语"
+
+#: ism/src/scim_utility.cpp:739 ism/src/scim_utility.cpp:748
+#: ism/src/scim_utility.cpp:890
+msgid "Hebrew"
+msgstr "希伯来语"
+
+#: ism/src/scim_utility.cpp:740 ism/src/scim_utility.cpp:909
+msgid "Hindi"
+msgstr "印地语"
+
+#: ism/src/scim_utility.cpp:741 ism/src/scim_keyboard_layout_data.h:4595
+msgid "Croatian"
+msgstr "克罗地亚语"
+
+#: ism/src/scim_utility.cpp:742 ism/src/scim_utility.cpp:864
+#: ism/src/scim_keyboard_layout_data.h:4610
+msgid "Hungarian"
+msgstr "匈牙利语"
+
+#: ism/src/scim_utility.cpp:743
+msgid "Armenian"
+msgstr "亚美尼亚语"
+
+#: ism/src/scim_utility.cpp:744
+msgid "Interlingua"
+msgstr "拉丁国际语"
+
+#: ism/src/scim_utility.cpp:745
+msgid "Indonesian"
+msgstr "印度尼西亚语"
+
+#: ism/src/scim_utility.cpp:746 ism/src/scim_utility.cpp:856
+#: ism/src/scim_keyboard_layout_data.h:4628
+msgid "Icelandic"
+msgstr "冰岛语"
+
+#: ism/src/scim_utility.cpp:747 ism/src/scim_keyboard_layout_data.h:4611
+msgid "Italian"
+msgstr "意大利语"
+
+#: ism/src/scim_utility.cpp:749 ism/src/scim_utility.cpp:882
+#: ism/src/scim_keyboard_layout_data.h:4612
+msgid "Japanese"
+msgstr "日语"
+
+#: ism/src/scim_utility.cpp:750 ism/src/scim_utility.cpp:917
+msgid "Georgian"
+msgstr "乔治亚语"
+
+#: ism/src/scim_utility.cpp:751 ism/src/scim_utility.cpp:875
+msgid "Kazakh"
+msgstr "哈萨克语"
+
+#: ism/src/scim_utility.cpp:752
+msgid "Cambodian"
+msgstr "柬埔寨语"
+
+#: ism/src/scim_utility.cpp:753
+msgid "Kannada"
+msgstr "卡纳达语"
+
+#: ism/src/scim_utility.cpp:754 ism/src/scim_utility.cpp:883
+msgid "Korean"
+msgstr "韩语"
+
+#: ism/src/scim_utility.cpp:755
+msgid "Laothian"
+msgstr "老挝语"
+
+#: ism/src/scim_utility.cpp:756 ism/src/scim_utility.cpp:872
+#: ism/src/scim_keyboard_layout_data.h:4629
+msgid "Lithuanian"
+msgstr "立陶宛语"
+
+#: ism/src/scim_utility.cpp:757 ism/src/scim_utility.cpp:871
+msgid "Latvian"
+msgstr "拉脱维亚语"
+
+#: ism/src/scim_utility.cpp:758 ism/src/scim_utility.cpp:876
+msgid "Macedonian"
+msgstr "马其顿语"
+
+#: ism/src/scim_utility.cpp:759 ism/src/scim_utility.cpp:915
+msgid "Malayalam"
+msgstr "马拉雅拉姆语"
+
+#: ism/src/scim_utility.cpp:760
+msgid "Mongolian"
+msgstr "蒙古语"
+
+#: ism/src/scim_utility.cpp:761 ism/src/scim_utility.cpp:911
+msgid "Marathi"
+msgstr "马拉地语"
+
+#: ism/src/scim_utility.cpp:762
+msgid "Malay"
+msgstr "马来语"
+
+#: ism/src/scim_utility.cpp:763
+msgid "Burmese"
+msgstr "缅甸语"
+
+#: ism/src/scim_utility.cpp:764
+msgid "Nepali"
+msgstr "尼泊尔语"
+
+#: ism/src/scim_utility.cpp:765 ism/src/scim_keyboard_layout_data.h:4599
+msgid "Dutch"
+msgstr "荷兰语"
+
+#: ism/src/scim_utility.cpp:766
+msgid "Norwegian (Nynorsk)"
+msgstr "挪威语(尼诺斯克)"
+
+#: ism/src/scim_utility.cpp:767
+msgid "Norwegian (Bokmal)"
+msgstr "挪威语(博克马尔)"
+
+#: ism/src/scim_utility.cpp:768
+msgid "Oriya"
+msgstr "奥里雅语"
+
+#: ism/src/scim_utility.cpp:769 ism/src/scim_utility.cpp:916
+msgid "Punjabi"
+msgstr "旁遮普语"
+
+#: ism/src/scim_utility.cpp:770 ism/src/scim_utility.cpp:865
+#: ism/src/scim_keyboard_layout_data.h:4614
+msgid "Polish"
+msgstr "波兰语"
+
+#: ism/src/scim_utility.cpp:771 ism/src/scim_utility.cpp:773
+#: ism/src/scim_keyboard_layout_data.h:4615
+msgid "Portuguese"
+msgstr "葡萄牙语"
+
+#: ism/src/scim_utility.cpp:772 ism/src/scim_keyboard_layout_data.h:4616
+msgid "Portuguese (Brazil)"
+msgstr "葡萄牙语(巴西)"
+
+#: ism/src/scim_utility.cpp:774 ism/src/scim_utility.cpp:866
+msgid "Romanian"
+msgstr "罗马尼亚语"
+
+#: ism/src/scim_utility.cpp:775 ism/src/scim_utility.cpp:877
+#: ism/src/scim_keyboard_layout_data.h:4618
+msgid "Russian"
+msgstr "俄语"
+
+#: ism/src/scim_utility.cpp:776 ism/src/scim_utility.cpp:922
+msgid "Sinhala"
+msgstr "僧伽罗语"
+
+#: ism/src/scim_utility.cpp:777 ism/src/scim_utility.cpp:868
+#: ism/src/scim_keyboard_layout_data.h:4619
+msgid "Slovak"
+msgstr "斯洛伐克语"
+
+#: ism/src/scim_utility.cpp:778 ism/src/scim_utility.cpp:869
+#: ism/src/scim_keyboard_layout_data.h:4621
+msgid "Slovenian"
+msgstr "斯洛文尼亚语"
+
+#: ism/src/scim_utility.cpp:779
+msgid "Albanian"
+msgstr "阿尔巴尼亚语"
+
+#: ism/src/scim_utility.cpp:780 ism/src/scim_utility.cpp:781
+#: ism/src/scim_utility.cpp:782
+msgid "Serbian"
+msgstr "塞尔维亚语"
+
+#: ism/src/scim_utility.cpp:783 ism/src/scim_utility.cpp:785
+#: ism/src/scim_utility.cpp:861 ism/src/scim_keyboard_layout_data.h:4625
+msgid "Swedish"
+msgstr "瑞典语"
+
+#: ism/src/scim_utility.cpp:784 ism/src/scim_utility.cpp:862
+msgid "Swedish (Finland)"
+msgstr "瑞典语(芬兰)"
+
+#: ism/src/scim_utility.cpp:786 ism/src/scim_utility.cpp:912
+msgid "Tamil"
+msgstr "泰米尔语"
+
+#: ism/src/scim_utility.cpp:787 ism/src/scim_utility.cpp:910
+msgid "Telugu"
+msgstr "泰卢固语"
+
+#: ism/src/scim_utility.cpp:788 ism/src/scim_utility.cpp:889
+msgid "Thai"
+msgstr "泰语"
+
+#: ism/src/scim_utility.cpp:789 ism/src/scim_utility.cpp:880
+#: ism/src/scim_keyboard_layout_data.h:4626
+msgid "Turkish"
+msgstr "土耳其语"
+
+#: ism/src/scim_utility.cpp:790
+msgid "Uighur"
+msgstr "维吾尔语"
+
+#: ism/src/scim_utility.cpp:791 ism/src/scim_utility.cpp:879
+#: ism/src/scim_keyboard_layout_data.h:4630
+msgid "Ukrainian"
+msgstr "乌克兰语"
+
+#: ism/src/scim_utility.cpp:792 ism/src/scim_utility.cpp:907
+msgid "Urdu"
+msgstr "乌尔都语"
+
+#: ism/src/scim_utility.cpp:793
+msgid "Uzbek"
+msgstr "乌兹别克语"
+
+#: ism/src/scim_utility.cpp:794 ism/src/scim_utility.cpp:908
+msgid "Vietnamese"
+msgstr "越南语"
+
+#: ism/src/scim_utility.cpp:795
+msgid "Walloon"
+msgstr "华隆语"
+
+#: ism/src/scim_utility.cpp:796 ism/src/scim_utility.cpp:797
+msgid "Yiddish"
+msgstr "意第绪语"
+
+#: ism/src/scim_utility.cpp:798
+msgid "Chinese"
+msgstr "中文"
+
+#: ism/src/scim_utility.cpp:799 ism/src/scim_utility.cpp:801
+msgid "Chinese (Simplified)"
+msgstr "简体中文"
+
+#: ism/src/scim_utility.cpp:800 ism/src/scim_utility.cpp:802
+msgid "Chinese (Traditional)"
+msgstr "繁体中文"
+
+#: ism/src/scim_utility.cpp:804
+msgid "Dutch (Standard)"
+msgstr "荷兰语(标准)"
+
+#: ism/src/scim_utility.cpp:805
+msgid "Dutch (Belgian)"
+msgstr "荷兰语(比利时)"
+
+#: ism/src/scim_utility.cpp:806
+msgid "English (United States)"
+msgstr "英语(美国)"
+
+#: ism/src/scim_utility.cpp:807
+msgid "English (United Kingdom)"
+msgstr "英语(加拿大)"
+
+#: ism/src/scim_utility.cpp:810
+msgid "English (New Zealand)"
+msgstr "英语(新西兰)"
+
+#: ism/src/scim_utility.cpp:811
+msgid "English (Irish)"
+msgstr "英语(爱尔兰)"
+
+#: ism/src/scim_utility.cpp:812
+msgid "English (South Africa)"
+msgstr "英语(南非)"
+
+#: ism/src/scim_utility.cpp:813
+msgid "English (Jamaica)"
+msgstr "英语(牙买加)"
+
+#: ism/src/scim_utility.cpp:814
+msgid "English (Belize)"
+msgstr "英语(伯利兹)"
+
+#: ism/src/scim_utility.cpp:815
+msgid "English (Trinidad)"
+msgstr "英语(特立尼达)"
+
+#: ism/src/scim_utility.cpp:816
+msgid "English (Zimbabwe)"
+msgstr "英语(津巴布韦)"
+
+#: ism/src/scim_utility.cpp:817
+msgid "English (Philippines)"
+msgstr "英语(菲律宾)"
+
+#: ism/src/scim_utility.cpp:818
+msgid "French (Standard)"
+msgstr "法语(标准)"
+
+#: ism/src/scim_utility.cpp:819
+msgid "French (Belgian)"
+msgstr "法语(比利时)"
+
+#: ism/src/scim_utility.cpp:820 ism/src/scim_keyboard_layout_data.h:4604
+msgid "French (Canadian)"
+msgstr "法语(加拿大)"
+
+#: ism/src/scim_utility.cpp:821
+msgid "French (Swiss)"
+msgstr "德语(瑞士)"
+
+#: ism/src/scim_utility.cpp:822
+msgid "French (Luxembourg)"
+msgstr "法语(卢森堡)"
+
+#: ism/src/scim_utility.cpp:823
+msgid "French (Monaco)"
+msgstr "法语(摩纳哥)"
+
+#: ism/src/scim_utility.cpp:824
+msgid "German (Standard)"
+msgstr "德语(标准)"
+
+#: ism/src/scim_utility.cpp:825 ism/src/scim_keyboard_layout_data.h:4608
+msgid "German (Swiss)"
+msgstr "德语(瑞士)"
+
+#: ism/src/scim_utility.cpp:826
+msgid "German (Austrian)"
+msgstr "德语(澳大利亚)"
+
+#: ism/src/scim_utility.cpp:827
+msgid "German (Luxembourg)"
+msgstr "德语(卢森堡)"
+
+#: ism/src/scim_utility.cpp:828
+msgid "German (Liechtenstein)"
+msgstr "德语(列支敦士登)"
+
+#: ism/src/scim_utility.cpp:829
+msgid "Italian (Standard)"
+msgstr "意大利语(标准)"
+
+#: ism/src/scim_utility.cpp:830
+msgid "Italian (Swiss)"
+msgstr "意大利语(瑞士)"
+
+#: ism/src/scim_utility.cpp:831
+msgid "Portuguese (Brazilian)"
+msgstr "葡萄牙语(巴西)"
+
+#: ism/src/scim_utility.cpp:832
+msgid "Portuguese (Standard)"
+msgstr "葡萄牙语(标准)"
+
+#: ism/src/scim_utility.cpp:833
+msgid "Spanish (Traditional Sort)"
+msgstr "西班牙语(传统)"
+
+#: ism/src/scim_utility.cpp:834
+msgid "Spanish (Mexican)"
+msgstr "西班牙语(墨西哥)"
+
+#: ism/src/scim_utility.cpp:835
+msgid "Spanish (Guatemala)"
+msgstr "西班牙语(危地马拉)"
+
+#: ism/src/scim_utility.cpp:836
+msgid "Spanish (Costa Rica)"
+msgstr "西班牙语(哥斯达黎加)"
+
+#: ism/src/scim_utility.cpp:837
+msgid "Spanish (Panama)"
+msgstr "西班牙语(巴拿马)"
+
+#: ism/src/scim_utility.cpp:838
+msgid "Spanish (Dominican Republic)"
+msgstr "西班牙语(多米尼加共和国)"
+
+#: ism/src/scim_utility.cpp:839
+msgid "Spanish (Venezuela)"
+msgstr "西班牙语(委内瑞拉)"
+
+#: ism/src/scim_utility.cpp:840
+msgid "Spanish (Colombia)"
+msgstr "西班牙语(哥伦比亚)"
+
+#: ism/src/scim_utility.cpp:841
+msgid "Spanish (Peru)"
+msgstr "西班牙语(秘鲁)"
+
+#: ism/src/scim_utility.cpp:842
+msgid "Spanish (Argentina)"
+msgstr "西班牙语(阿根廷)"
+
+#: ism/src/scim_utility.cpp:843
+msgid "Spanish (Ecuador)"
+msgstr "西班牙语(厄瓜多尔)"
+
+#: ism/src/scim_utility.cpp:844
+msgid "Spanish (Chile)"
+msgstr "西班牙语(智利)"
+
+#: ism/src/scim_utility.cpp:845
+msgid "Spanish (Uruguay)"
+msgstr "西班牙语(乌拉圭)"
+
+#: ism/src/scim_utility.cpp:846
+msgid "Spanish (Paraguay)"
+msgstr "西班牙语(巴拉圭)"
+
+#: ism/src/scim_utility.cpp:847
+msgid "Spanish (Bolivia)"
+msgstr "西班牙语(玻利维亚)"
+
+#: ism/src/scim_utility.cpp:848
+msgid "Spanish (El Salvador)"
+msgstr "西班牙语(萨尔瓦多)"
+
+#: ism/src/scim_utility.cpp:849
+msgid "Spanish (Honduras)"
+msgstr "西班牙语(洪都拉斯)"
+
+#: ism/src/scim_utility.cpp:850
+msgid "Spanish (Nicaragua)"
+msgstr "西班牙语(尼加拉瓜)"
+
+#: ism/src/scim_utility.cpp:851
+msgid "Spanish (Puerto Rico)"
+msgstr "西班牙语(波多黎各)"
+
+#: ism/src/scim_utility.cpp:855
+msgid "Afrikaans"
+msgstr "南非语"
+
+#: ism/src/scim_utility.cpp:858
+msgid "Malay (Malaysia)"
+msgstr "马来语(马来西亚)"
+
+#: ism/src/scim_utility.cpp:859
+msgid "Malay (Brunei Darussalam)"
+msgstr "马来语(文莱)"
+
+#: ism/src/scim_utility.cpp:860 ism/src/scim_keyboard_layout_data.h:4613
+msgid "Norwegian"
+msgstr "挪威语"
+
+#: ism/src/scim_utility.cpp:867
+msgid "Serbian (Latin)"
+msgstr "塞尔维亚语(拉丁)"
+
+#: ism/src/scim_utility.cpp:878
+msgid "Serbian (Cyrillic)"
+msgstr "塞尔维亚语(西里尔)"
+
+#: ism/src/scim_utility.cpp:881
+msgid "Uzbek (Latin)"
+msgstr "乌兹别克语(拉丁)"
+
+#: ism/src/scim_utility.cpp:884
+msgid "Chinese (Taiwan)"
+msgstr "中文(台湾)"
+
+#: ism/src/scim_utility.cpp:885
+msgid "Chinese (Hongkong)"
+msgstr "中文(香港)"
+
+#: ism/src/scim_utility.cpp:886
+msgid "Chinese (Macau)"
+msgstr "中文(澳门)"
+
+#: ism/src/scim_utility.cpp:887
+msgid "Chinese (PRC)"
+msgstr "中文(中国)"
+
+#: ism/src/scim_utility.cpp:888
+msgid "Chinese (Singapore)"
+msgstr "中文(新加坡)"
+
+#: ism/src/scim_utility.cpp:891
+msgid "Arabic (Saudi Arabia)"
+msgstr "阿拉伯语(沙特阿拉伯)"
+
+#: ism/src/scim_utility.cpp:892
+msgid "Arabic (Iraq)"
+msgstr "阿拉伯语(伊拉克)"
+
+#: ism/src/scim_utility.cpp:894
+msgid "Arabic (Libya)"
+msgstr "阿拉伯语(利比亚)"
+
+#: ism/src/scim_utility.cpp:895
+msgid "Arabic (Algeria)"
+msgstr "阿拉伯语(阿尔及利亚)"
+
+#: ism/src/scim_utility.cpp:896
+msgid "Arabic (Morocco)"
+msgstr "阿拉伯语(摩洛哥)"
+
+#: ism/src/scim_utility.cpp:897
+msgid "Arabic (Tunisia)"
+msgstr "阿拉伯语(突尼斯)"
+
+#: ism/src/scim_utility.cpp:898
+msgid "Arabic (Oman)"
+msgstr "阿拉伯语(阿曼)"
+
+#: ism/src/scim_utility.cpp:899
+msgid "Arabic (Yemen)"
+msgstr "阿拉伯语(也门)"
+
+#: ism/src/scim_utility.cpp:900
+msgid "Arabic (Syria)"
+msgstr "阿拉伯语(叙利亚)"
+
+#: ism/src/scim_utility.cpp:901
+msgid "Arabic (Jordan)"
+msgstr "阿拉伯语(约旦)"
+
+#: ism/src/scim_utility.cpp:903
+msgid "Arabic (Kuwait)"
+msgstr "阿拉伯语(科威特)"
+
+#: ism/src/scim_utility.cpp:904
+msgid "Arabic (UAE)"
+msgstr "阿拉伯语(阿联酋)"
+
+#: ism/src/scim_utility.cpp:905
+msgid "Arabic (Bahrain)"
+msgstr "阿拉伯语(巴林)"
+
+#: ism/src/scim_utility.cpp:906
+msgid "Arabic (Qatar)"
+msgstr "阿拉伯语(卡塔尔)"
+
+#: ism/src/scim_utility.cpp:920
+msgid "Hausa"
+msgstr "豪萨语"
+
+#: ism/src/scim_utility.cpp:924
+msgid "Xhosa"
+msgstr "科萨语"
+
+#: ism/src/scim_utility.cpp:925
+msgid "Yoruba"
+msgstr "约鲁巴语"
+
+#: ism/src/scim_utility.cpp:926
+msgid "Zulu"
+msgstr "祖鲁语"
+
+#: ism/src/scim_utility.cpp:1024
+msgid "Other"
+msgstr "其它语言"
+
+#: ism/src/scim_keyboard_layout_data.h:4592
+#: ism/modules/imengine/scim_socket_imengine.cpp:408
+#: ism/modules/imengine/scim_socket_imengine.cpp:438
+#: ism/modules/imengine/scim_socket_imengine.cpp:523
+#: ism/modules/imengine/scim_socket_imengine.cpp:553
+#: ism/modules/imengine/scim_socket_imengine.cpp:583
+msgid "Unknown"
+msgstr "未知"
+
+#: ism/src/scim_keyboard_layout_data.h:4593
+msgid "English (US)"
+msgstr "英语(美国)"
+
+#: ism/src/scim_keyboard_layout_data.h:4594
+msgid "Belgian"
+msgstr "比利时语"
+
+#: ism/src/scim_keyboard_layout_data.h:4597
+msgid "Czech (qwerty)"
+msgstr "捷克语(标准键盘)"
+
+#: ism/src/scim_keyboard_layout_data.h:4600
+msgid "Dvorak"
+msgstr "德沃夏克键盘"
+
+#: ism/src/scim_keyboard_layout_data.h:4605
+msgid "French (Switzerland)"
+msgstr "法语(瑞士)"
+
+#: ism/src/scim_keyboard_layout_data.h:4607
+msgid "German (with deadkeys)"
+msgstr "德语(有deadkeys)"
+
+#: ism/src/scim_keyboard_layout_data.h:4617
+msgid "Portuguese (Brazil US accents)"
+msgstr "葡萄牙语(巴西 美国发音)"
+
+#: ism/src/scim_keyboard_layout_data.h:4620
+msgid "Slovak (qwerty)"
+msgstr "斯洛伐克(标准键盘)"
+
+#: ism/src/scim_keyboard_layout_data.h:4623
+msgid "Spanish (CP 850)"
+msgstr "西班牙语(CP 850)"
+
+#: ism/src/scim_keyboard_layout_data.h:4624
+msgid "Spanish (Latin America)"
+msgstr "西班牙语(拉丁美洲)"
+
+#: ism/src/scim_keyboard_layout_data.h:4627
+msgid "English (UK)"
+msgstr "英语(英国)"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:57
+msgid "Simplified-Traditional Chinese Conversion"
+msgstr "简繁中文转换"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:60
+msgid "Convert between Simplified Chinese and Traditional Chinese"
+msgstr "在简体中文和繁体中文之间进行转换"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:71
+msgid "SC-TC"
+msgstr "简-繁"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:73
+#: ism/modules/filter/scim_sctc_filter.cpp:78
+msgid "Simplified-Traditional Chinese conversion"
+msgstr "简繁中文转换"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:76
+msgid "No Conversion"
+msgstr "不转换"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:81
+msgid "Simplified to Traditional"
+msgstr "简体到繁体"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:83
+msgid "Convert Simplified Chinese to Traditional Chinese"
+msgstr "将简体中文转换为繁体中文"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:86
+msgid "Traditional to Simplified"
+msgstr "繁体到简体"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:88
+msgid "Convert Traditional Chinese to Simplified Chinese"
+msgstr "将繁体中文转换为简体中文"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:300
+msgid "James Su <suzhe@tsinghua.org.cn>"
+msgstr ""
+
+#: ism/modules/filter/scim_sctc_filter.cpp:425
+#: ism/modules/filter/scim_sctc_filter.cpp:555
+#: ism/modules/filter/scim_sctc_filter.cpp:571
+msgid "SC->TC"
+msgstr "简->繁"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:431
+#: ism/modules/filter/scim_sctc_filter.cpp:559
+#: ism/modules/filter/scim_sctc_filter.cpp:575
+msgid "TC->SC"
+msgstr "繁->简"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1693
+msgid "Smart Common Input Method platform "
+msgstr "智能通用输入法平台"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1695
+msgid ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+msgstr ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1700
+msgid ""
+":\n"
+"\n"
+msgstr ""
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1703
+msgid ""
+"\n"
+"\n"
+msgstr ""
+
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:963
+msgid "Enable"
+msgstr "激活"
+
+#. gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+#. gtk_tree_view_column_set_fixed_width (column, 232);
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:984
+msgid "Name"
+msgstr "名称"
+
+#: ism/utils/scimstringview.c:201
+msgid "Cursor Position"
+msgstr ""
+
+#: ism/utils/scimstringview.c:202
+msgid "The current position of the insertion cursor in chars."
+msgstr ""
+
+#: ism/utils/scimstringview.c:211
+msgid "Maximum length"
+msgstr ""
+
+#: ism/utils/scimstringview.c:212
+msgid "Maximum number of characters for this string view. Zero if no maximum."
+msgstr ""
+
+#: ism/utils/scimstringview.c:221
+msgid "Maximum width"
+msgstr ""
+
+#: ism/utils/scimstringview.c:222
+msgid "Maximum width of this string view."
+msgstr ""
+
+#: ism/utils/scimstringview.c:231
+msgid "Has Frame"
+msgstr ""
+
+#: ism/utils/scimstringview.c:232
+msgid "FALSE removes outside bevel from string view."
+msgstr ""
+
+#: ism/utils/scimstringview.c:239
+msgid "Draw cursor"
+msgstr ""
+
+#: ism/utils/scimstringview.c:240
+msgid "TRUE draw blinking cursor."
+msgstr ""
+
+#: ism/utils/scimstringview.c:247
+msgid "Auto move cursor"
+msgstr ""
+
+#: ism/utils/scimstringview.c:248
+msgid "TRUE auto move cursor position when mouse clicking."
+msgstr ""
+
+#: ism/utils/scimstringview.c:255
+msgid "Forward button press/release event"
+msgstr ""
+
+#: ism/utils/scimstringview.c:256
+msgid "TRUE forward button press/release event to user program."
+msgstr ""
+
+#: ism/utils/scimstringview.c:263
+msgid "Auto resize the widget to fit the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:264
+msgid "TRUE Auto resize on."
+msgstr ""
+
+#: ism/utils/scimstringview.c:271
+msgid "Emit move_cursor signal when press/release the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:272
+msgid "TRUE Emit move_cursor signal when press the string."
+msgstr ""
+
+#: ism/utils/scimstringview.c:279
+msgid "Width in chars"
+msgstr ""
+
+#: ism/utils/scimstringview.c:280
+msgid "Number of characters to leave space for in the string view."
+msgstr ""
+
+#: ism/utils/scimstringview.c:289
+msgid "Scroll offset"
+msgstr ""
+
+#: ism/utils/scimstringview.c:290
+msgid "Number of pixels of the string view scrolled off the screen to the left"
+msgstr ""
+
+#: ism/utils/scimstringview.c:299
+msgid "Text"
+msgstr ""
+
+#: ism/utils/scimstringview.c:300
+msgid "The contents of the string view"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:161
+msgid "Selected _Keys:"
+msgstr "选中的按键(_K):"
+
+#: ism/utils/scimkeyselection.cpp:206
+msgid "Key Code:"
+msgstr "键码:"
+
+#: ism/utils/scimkeyselection.cpp:224
+msgid "....."
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:229
+msgid "Modifiers:"
+msgstr "修饰键:"
+
+#: ism/utils/scimkeyselection.cpp:242
+msgid "_Ctrl"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:246
+msgid "A_lt"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:250
+msgid "_Shift"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:254
+msgid "_Release"
+msgstr "释放(_R)"
+
+#: ism/utils/scimkeyselection.cpp:264
+msgid "_Meta"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:268
+msgid "S_uper"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:272
+msgid "_Hyper"
+msgstr ""
+
+#: ism/utils/scimkeyselection.cpp:337
+msgid "Please enter a Key Code first."
+msgstr "请先输入一个键码."
+
+#: ism/utils/scimkeyselection.cpp:391
+msgid ""
+"Press a key (or a key combination).\n"
+"This dialog will be closed \n"
+"when the key is released."
+msgstr ""
+"请按一个键或组合键.\n"
+"本对话窗会在按键释放时关闭."
+
+#: ism/utils/scimkeyselection.cpp:395
+msgid "Grabbing a key."
+msgstr "捕捉按键"
+
+#: ism/utils/scimkeyselection.cpp:686
+msgid "Key Selection"
+msgstr "按键选择"
+
+#: ism/utils/scimtrayicon.c:108
+msgid "Orientation"
+msgstr ""
+
+#: ism/utils/scimtrayicon.c:109
+msgid "The orientation of the tray."
+msgstr ""
+
+#~ msgid "Automatic"
+#~ msgstr "自动"
+
+#~ msgid "Languages"
+#~ msgstr "语言"
+
+#~ msgid "Text Input Setting"
+#~ msgstr "文本输入设置"
+
+#~ msgid "Writing Language"
+#~ msgstr "文本语言"
+
+#~ msgid "Input Text Setting"
+#~ msgstr "设置"
+
+#~ msgid "English/European"
+#~ msgstr "英语/欧洲语"
+
+#~ msgid "RAW CODE"
+#~ msgstr "内码输入"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "热键:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " 切换本地编码和 Unicode 编码模式.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " 复位输入法.\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "当前输入法的状态, 点击切换状态."
+
+#~ msgid "Unicode"
+#~ msgstr "统一码"
+
+#~ msgid "Global Setup"
+#~ msgstr "全局设置"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "设置所有前端模块使用的全局选项,包括 X11前端, GTK 输入法模块, QT 输入法模"
+#~ "块 等."
+
+#~ msgid "_Trigger:"
+#~ msgstr "开关键(_T):"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "选择输入法开关键"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr "用以打开/关闭 SCIM 输入法的按键. 点击右边的按钮进行编辑."
+
+#~ msgid "Turn _On:"
+#~ msgstr "打开键(_O):"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "选择输入法打开键"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "用以打开 SCIM 输入法的按键. 点击右边的按钮进行编辑."
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "关闭键(_F):"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "选择输入法关闭键"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "用以关闭 SCIM 输入法的按键. 点击右边的按钮进行编辑."
+
+#~ msgid "_Next input method:"
+#~ msgstr "后一个输入法(_N):"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "选择后一个输入法按键"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr "用以切换到后一个输入法的按键. 点击右边的按钮进行编辑."
+
+#~ msgid "_Previous input method:"
+#~ msgstr "前一个输入法(_P):"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "选择前一个输入法按键"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr "用以切换到前一个输入法的按键. 点击右边的按钮进行编辑."
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "显示输入法菜单(_M):"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "选择显式输入法菜单按键"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "用以显式输入法菜单的按键. 点击右边的按钮进行编辑."
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr ""
+#~ "你应当在这里选择你正在使用的键盘布局, 以保证那些依赖于键盘布局的输入法能够"
+#~ "正确的运行."
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "将预编辑字符串嵌入到客户窗口中(_E)"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "如果选中这个选项, 预编辑字符串将被直接显示在客户端输入窗口中,而不是在独立"
+#~ "的浮动窗口中."
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "在所有应用程序中共享同一个输入法(_S)"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "如果选中这个选项, 则同一时刻仅能在所有应用程序中使用同一个输入法. 否则各个"
+#~ "应用程序可以使用不同的输入法."
+
+#~ msgid "Hotkeys"
+#~ msgstr "热键"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr "你可以在这里激活/禁止输入法, 并为输入法设置热键."
+
+#~ msgid "The installed input method services:"
+#~ msgstr "已安装的输入法服务:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "编辑热键(_H)"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "编辑与选中的输入法相关联的热键."
+
+#~ msgid "Select _Filters"
+#~ msgstr "选择过滤器(_F)"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "选择要附加到这个输入法上的过滤器."
+
+#~ msgid "_Expand"
+#~ msgstr "展开(_E)"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "展开所有语言分类."
+
+#~ msgid "_Collapse"
+#~ msgstr "折叠(_C)"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "折叠所有语言分类."
+
+#~ msgid "E_nable All"
+#~ msgstr "激活所有(_N)"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "激活所有输入法."
+
+#~ msgid "_Disable All"
+#~ msgstr "禁止所有(_D)"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "禁止所有输入法."
+
+#~ msgid "Filters"
+#~ msgstr "过滤器"
+
+#~ msgid "Description"
+#~ msgstr "描述"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "编辑 %s 的热键"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "为 %s 选择过滤器"
+
+#~ msgid "Move _Up"
+#~ msgstr "向上移动(_U)"
+
+#~ msgid "Move _Down"
+#~ msgstr "向下移动(_D)"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "一个基于 GTK+-2.x 库的面板服务程序."
+
+#~ msgid "On demand"
+#~ msgstr "需要时"
+
+#~ msgid "Never"
+#~ msgstr "从不"
+
+#~ msgid "ToolBar"
+#~ msgstr "工具条"
+
+#~ msgid "_Show:"
+#~ msgstr "显示(_S):"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "自动靠边(_N)"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "显示输入法图标(_I)"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "显示输入法名称(_U)"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "隐藏超时(_O):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "显示粘住图标(_T)"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "显示菜单图标(_E)"
+
+#~ msgid "Show _help icon"
+#~ msgstr "显示帮助图标(_H)"
+
+#~ msgid "Show _property label"
+#~ msgstr "显示属性标签(_P)"
+
+#~ msgid "Input window"
+#~ msgstr "输入窗口"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "嵌入式候选词表(_M)"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "垂直式候选词表(_V)"
+
+#~ msgid "Misc"
+#~ msgstr "其它"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "显示托盘图标(_Y)"
+
+#~ msgid "Stick _windows"
+#~ msgstr "粘住窗口(_W)"
+
+#~ msgid "_Font:"
+#~ msgstr "字体(_F):"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "如果选中 \"永远\" 选项, 工具条将被永远显示在屏幕上. 如果选中 \"需要时\" 选"
+#~ "项, 则只有当SCIM被激活时才会显示工具条. 如果选中 \"从不\" 选项, 则工具条永"
+#~ "远不会被显示."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr "如果选中这个选项, 工具条将粘附在屏幕边缘上."
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "当超时过后, 工具条将被隐藏起来. 该选项只在 \"永远显示\" 被选中时才生效. 设"
+#~ "置成 0 则禁止此功能."
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr "如果选中这个选项, 输入法图标将显示在工具条上."
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr "如果选中这个选项, 输入法名称将显示在工具条上."
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr "如果选中这个选项, 粘住图标将显示在工具条上."
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr "如果选中这个选项, 菜单图标将显示在工具条上."
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr "如果选中这个选项, 帮助图标将显示在工具条上."
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr "如果选中这个选项, 则输入法屬性的文字标签将显示在工具条上."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr "如果选中这个选项, 候选词表将被嵌入到输入窗口中."
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr "如果选中这个选项, 将垂直显示候选词表."
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr "如果选中这个选项, 托盘图标将显示在桌面的任务栏上."
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr "如果选中这个选项, 则输入和候选词表窗口将停在它们的原始位置."
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr "该字体设置将用于输入和候选词表窗口."
+
+#~ msgid "Select Interface Font"
+#~ msgstr "选择界面字体"
+
+#~ msgid "FrontEnd"
+#~ msgstr "前端"
+
+#~ msgid "IMEngine"
+#~ msgstr "输入法引擎"
+
+#~ msgid "Panel"
+#~ msgstr "面板"
+
+#~ msgid "Extra"
+#~ msgstr "附加"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "SCIM 输入法设置"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">智能通用输入法平台</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">图形设置工具</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">版权所有 2002-2004, 苏 哲<suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">%s模块的设置.</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "你确定要退出 SCIM 设置程序么?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr ""
+#~ "不是所有配置都能够直接重新加载. 别忘了重新启动 SCIM 以使所有新的配置生效."
+
+#~ msgid "SCIM Setup"
+#~ msgstr "SCIM 设置"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "基于 GTK 控件库的集成设置工具."
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "智能通用输入法平台的设置工具"
+
+#~ msgid "SCIM Help"
+#~ msgstr "SCIM 帮助"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "智能通用输入法平台"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "粘住/放开 输入窗口和工具条."
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "显示关于 SCIM 和当前输入法的简单帮助."
+
+#~ msgid "Show command menu."
+#~ msgstr "显示命令菜单."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "重新加载配置"
+
+#~ msgid "Stick Windows"
+#~ msgstr "粘住窗口"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "隱藏工具条"
+
+#~ msgid "Help ..."
+#~ msgstr "帮助 ..."
+
+#~ msgid "Exit"
+#~ msgstr "退出"
+
+#~ msgid "En"
+#~ msgstr "英"
+
+#~ msgid "_Switch input method globally"
+#~ msgstr "显示输入法图标(_I)"
+
+#~ msgid "Preedit String mode"
+#~ msgstr "预编辑字符串模式"
+
+#~ msgid "X Window"
+#~ msgstr "X 窗口"
+
+#~ msgid "A FrontEnd module for X11R6 Window System, using XIM Protocol."
+#~ msgstr "一个用于 X11R6 窗口系统的前端模块, 使用 XIM 协议."
+
+#~ msgid "_On The Spot"
+#~ msgstr "在光标处预编辑(_O)"
+
+#~ msgid "_Dynamic Event Flow"
+#~ msgstr "动态事件流(_D)"
+
+#~ msgid ""
+#~ "If this option is checked, the OnTheSpot input style will be used when "
+#~ "the client supports it."
+#~ msgstr ""
+#~ "如果选中这个选项, 当客户端支持时, 预编辑字符串将显示在光标位置上, 即 On "
+#~ "The Spot 模式."
+
+#~ msgid ""
+#~ "If this option is checked, then dynamic event flow will be used.This can "
+#~ "speed up the key event response, especially in remote X11 environment.But "
+#~ "SCIM may become unstable."
+#~ msgstr ""
+#~ "如果选中这个选项, 则会使用动态事件流. 这可以加快按键事件的响应速度, 特别是"
+#~ "在远程 X11 环境中. 但 SCIM 可能会变得不稳定."
+
+#~ msgid "Slovene"
+#~ msgstr "斯洛文尼亚语"
+
+#~ msgid "Global"
+#~ msgstr "全局设置"
+
+#~ msgid "Hot Keys"
+#~ msgstr "热键"
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ "Hot keys:\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ "\n"
+#~ "(C) 2002-2004 James Su <suzhe@tsinghua.org.cn>\n"
+#~ "\n"
+#~ "热键:\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " open/close the input method.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ ":\n"
+#~ " 打开/关闭输入法.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " switch to the next input method.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ ":\n"
+#~ " 切换到下一个输入法.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ ":\n"
+#~ " switch to the previous input method.\n"
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ ":\n"
+#~ " 切换到前一个输入法.\n"
+#~ "\n"
+#~ "\n"
+
+#~ msgid "Full/Half Letter"
+#~ msgstr "全/半角字符"
+
+#~ msgid "Full/Half Punct"
+#~ msgstr "全/半角标点"
+
+#~ msgid ""
+#~ "The input mode of the letters. Click to toggle between half and full."
+#~ msgstr "字母输入模式. 点击以切换全角/半角模式."
+
+#~ msgid ""
+#~ "The input mode of the puncutations. Click to toggle between half and full."
+#~ msgstr "标点输入模式. 点击以切换全角/半角模式."
+
+#~ msgid ""
+#~ " Switch between full/half width letter mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " 切换全角和半角字符状态.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Switch between full/half width punctuation mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " 切换全角和半角标点符号状态.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Switch between Forward/Input mode.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " 切换 转发/输入 模式.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Add a new phrase.\n"
+#~ "\n"
+#~ " "
+#~ msgstr ""
+#~ " 添加一个新词.\n"
+#~ "\n"
+#~ " "
+
+#~ msgid ""
+#~ " Delete the selected phrase.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " 删除选中的词语.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Control+Down:\n"
+#~ " Move lookup cursor to next shorter phrase\n"
+#~ " Only available when LongPhraseFirst option is set.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Control+Down:\n"
+#~ " 将候选词表的光标移动到下一个更短的词\n"
+#~ " 只在打开 LongPhraseFirst 选项的时候才生效.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Control+Up:\n"
+#~ " Move lookup cursor to previous longer phrase\n"
+#~ " Only available when LongPhraseFirst option is set.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Control+Up:\n"
+#~ " 将候选词表的光标移动到前一个更长的词\n"
+#~ " 只在打开 LongPhraseFirst 选项的时候才生效.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Esc:\n"
+#~ " 复位输入法.\n"
+#~ "\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "How to add a phrase:\n"
+#~ " Input the new phrase as normal, then press the\n"
+#~ " hot key. A hint will be shown to let you input a key\n"
+#~ " for this phrase.\n"
+#~ " Input a key then press the space bar.\n"
+#~ " A hint will be shown to indicate whether\n"
+#~ " the phrase was added sucessfully.\n"
+#~ msgstr ""
+#~ "怎样添加一个词语:\n"
+#~ " 首先在正常状态下输入新词, 然后按添加词语快捷键.\n"
+#~ " 将会显示一个提示让你为这个词语输入一个键串.\n"
+#~ " 输入键串后按空格键. 会有一个提示说明加词\n"
+#~ " 是否成功.\n"
+
+#~ msgid "Input a key string for phrase: "
+#~ msgstr "为这个词输入一个键串: "
+
+#~ msgid "Success."
+#~ msgstr "成功."
+
+#~ msgid "Failed."
+#~ msgstr "失败."
+
+#~ msgid "Generic Table"
+#~ msgstr "通用码表"
+
+#~ msgid "An IMEngine Module which uses generic table input method file."
+#~ msgstr "一个使用通用码表输入法文件的输入法引擎模块."
+
+#~ msgid "Full width _punctuation:"
+#~ msgstr "全/半角标点切换(_P):"
+
+#~ msgid "Select full width puncutation keys"
+#~ msgstr "选择全/半角标点状态切换键"
+
+#~ msgid ""
+#~ "The key events to switch full/half width punctuation input mode. Click on "
+#~ "the button on the right to edit it."
+#~ msgstr "用以切换全/半角标点输入模式的按键. 点击右边的按钮进行编辑."
+
+#~ msgid "Full width _letter:"
+#~ msgstr "全/半角字母切换(_L):"
+
+#~ msgid "Select full width letter keys"
+#~ msgstr "选择全/半角字母状态切换键"
+
+#~ msgid ""
+#~ "The key events to switch full/half width letter input mode. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr "用以切换全/半角字母输入模式的按键. 点击右边的按钮进行编辑."
+
+#~ msgid "_Mode switch:"
+#~ msgstr "输入模式切换(_M):"
+
+#~ msgid "Select mode switch keys"
+#~ msgstr "选择输入模式切换键"
+
+#~ msgid ""
+#~ "The key events to change current input mode. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "用以切换当前输入模式的按键. 点击右边的按钮进行编辑."
+
+#~ msgid "_Add phrase:"
+#~ msgstr "添加词语(_A):"
+
+#~ msgid "Select add phrase keys."
+#~ msgstr "选择添加词语键"
+
+#~ msgid ""
+#~ "The key events to add a new user defined phrase. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr "用以添加用户自定义词语的按键. 点击右边的按钮进行编辑."
+
+#~ msgid "_Delete phrase:"
+#~ msgstr "删除词语(_D):"
+
+#~ msgid "Select delete phrase keys."
+#~ msgstr "选择删除词语键"
+
+#~ msgid ""
+#~ "The key events to delete a selected phrase. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "用以删除选中词语的按键. 点击右边的按钮进行编辑."
+
+#~ msgid "Show _prompt"
+#~ msgstr "显示提示(_P)"
+
+#~ msgid "Show key _hint"
+#~ msgstr "显示逐键提示(_H)"
+
+#~ msgid "Save _user table in binary format"
+#~ msgstr "以二进制格式保存用户码表(_U)"
+
+#~ msgid "Show the u_ser defined phrases first"
+#~ msgstr "优先显示用户自定义的词语(_S)"
+
+#~ msgid "Show the _longer phrases first"
+#~ msgstr "优先显示较长的词语(_L)"
+
+#~ msgid ""
+#~ "If this option is checked, the key prompt of the currently selected "
+#~ "phrase will be shown."
+#~ msgstr "如果选中这个选项, 则显示当前词语按键的提示信息."
+
+#~ msgid ""
+#~ "If this option is checked, the remaining keystrokes of the phraseswill be "
+#~ "shown on the lookup table."
+#~ msgstr "如果选中这个选项, 将在候选词表中显示每个词语剩下需要输入的按键."
+
+#~ msgid ""
+#~ "If this option is checked, the user table will be stored with binary "
+#~ "format, this will increase the loading speed."
+#~ msgstr "如果选中这个选项, 用户码表将以二进制格式存储, 这会提高调入速度."
+
+#~ msgid ""
+#~ "If this option is checked, the user defined phrases will be shown in "
+#~ "front of others. "
+#~ msgstr "如果选中这个选项, 将优先显示用户自定义的词语."
+
+#~ msgid ""
+#~ "If this option is checked, the longer phrase will be shown in front of "
+#~ "others. "
+#~ msgstr "如果选中这个选项, 将优先显示较长的词语."
+
+#~ msgid "The installed tables:"
+#~ msgstr "已安装的码表:"
+
+#~ msgid "_Install"
+#~ msgstr "安装(_I)"
+
+#~ msgid "Install a new table."
+#~ msgstr "安装一个新码表."
+
+#~ msgid "_Delete"
+#~ msgstr "删除(_D)"
+
+#~ msgid "Delete the selected table."
+#~ msgstr "删除选中的码表."
+
+#~ msgid "_Properties"
+#~ msgstr "属性(_P)"
+
+#~ msgid "Edit the properties of the selected table."
+#~ msgstr "编辑选中的码表的属性."
+
+#~ msgid "Table Management"
+#~ msgstr "码表管理"
+
+#~ msgid "Select an icon file"
+#~ msgstr "选择一个图标文件"
+
+#~ msgid "User"
+#~ msgstr "用户"
+
+#~ msgid "System"
+#~ msgstr "系统"
+
+#~ msgid "Please select the table file to be installed."
+#~ msgstr "请选择要安装的码表文件."
+
+#~ msgid "Failed to install the table! It's already in table file directory."
+#~ msgstr "码表安装失败! 它已经被安装到码表目录中了."
+
+#~ msgid "Failed to load the table file!"
+#~ msgstr "无法调入码表文件!"
+
+#~ msgid ""
+#~ "Failed to install the table! Another version of this table was already "
+#~ "installed."
+#~ msgstr "码表安装失败! 这个码表的另外一个版本已经被安装过了."
+
+#~ msgid ""
+#~ "Another version of this table was already installed. Do you want to "
+#~ "replace it with the new one?"
+#~ msgstr "已经安装了这个码表的另外一个版本. 你想用新码表替换原来那个么?"
+
+#~ msgid ""
+#~ "Failed to install the table! A table with the same file name was already "
+#~ "installed."
+#~ msgstr "码表安装失败! 一个有相同文件名的码表已经被安装."
+
+#~ msgid ""
+#~ "A table with the same file name was already installed. Do you want to "
+#~ "overwrite it?"
+#~ msgstr "一个有相同文件名的码表已经被安装. 你想覆盖它么?"
+
+#~ msgid "Failed to install the table to %s!"
+#~ msgstr "将码表安装到 %s 失败!"
+
+#~ msgid "Can not delete the file %s!"
+#~ msgstr "无法删除文件 %s!"
+
+#~ msgid "Are you sure to delete this table file?"
+#~ msgstr "你确认删除这个码表文件?"
+
+#~ msgid "Failed to delete the table file!"
+#~ msgstr "码表文件删除失败!"
+
+#~ msgid "True"
+#~ msgstr "真"
+
+#~ msgid "False"
+#~ msgstr "假"
+
+#~ msgid "Split Keys:"
+#~ msgstr "分隔键:"
+
+#~ msgid "The key strokes to split inputed string."
+#~ msgstr "用于分隔输入字符串的按键."
+
+#~ msgid "Commit Keys:"
+#~ msgstr "提交键:"
+
+#~ msgid "The key strokes to commit converted result to client."
+#~ msgstr "用于将转换结果提交给客户程序的按键."
+
+#~ msgid "Forward Keys:"
+#~ msgstr "转发键:"
+
+#~ msgid "The key strokes to forward inputed string to client."
+#~ msgstr "用于将已输入的字符串转发给客户程序的按键."
+
+#~ msgid "The key strokes to select candidate phrases in lookup table."
+#~ msgstr "在候选词表中选择候选词的按键."
+
+#~ msgid "Page Up Keys:"
+#~ msgstr "向上翻页键:"
+
+#~ msgid "The lookup table page up keys"
+#~ msgstr "候选词表向上翻页键"
+
+#~ msgid "Page Down Keys:"
+#~ msgstr "向下翻页键:"
+
+#~ msgid "The lookup table page down keys"
+#~ msgstr "候选词表向下翻页键"
+
+#~ msgid "Table Properties"
+#~ msgstr "码表属性"
+
+#~ msgid "Name:"
+#~ msgstr "名称:"
+
+#~ msgid "The name of this table."
+#~ msgstr "这个码表的名称."
+
+#~ msgid "Author:"
+#~ msgstr "作者:"
+
+#~ msgid "The author of this table."
+#~ msgstr "这个码表的作者."
+
+#~ msgid "UUID:"
+#~ msgstr "唯一号:"
+
+#~ msgid "The unique ID of this table."
+#~ msgstr "这个码表的唯一号."
+
+#~ msgid "Serial Number:"
+#~ msgstr "系列号:"
+
+#~ msgid "The serial number of this table."
+#~ msgstr "这个码表的系列号."
+
+#~ msgid "Icon File:"
+#~ msgstr "图标文件:"
+
+#~ msgid "The icon file of this table."
+#~ msgstr "这个码表的图标文件."
+
+#~ msgid "Supported Languages:"
+#~ msgstr "支持的语言:"
+
+#~ msgid "The languages supported by this table."
+#~ msgstr "这个码表支持的语言."
+
+#~ msgid "Status Prompt:"
+#~ msgstr "状态提示:"
+
+#~ msgid "A prompt string to be shown in status area."
+#~ msgstr "要显示在状态区中的提示字符串."
+
+#~ msgid "Valid Input Chars:"
+#~ msgstr "合法的输入字符:"
+
+#~ msgid "The valid input chars of this table."
+#~ msgstr "这个码表的合法的输入字符."
+
+#~ msgid "Multi Wildcard Char:"
+#~ msgstr "多重扩展字符:"
+
+#~ msgid ""
+#~ "The multi wildcard chars of this table. These chars can be used to match "
+#~ "one or more arbitrary chars."
+#~ msgstr "这个码表的多重扩展字符. 这些字符可以用来匹配一个或多个任意字符."
+
+#~ msgid "Single Wildcard Char:"
+#~ msgstr "单一扩展字符:"
+
+#~ msgid ""
+#~ "The single wildcard chars of this table.These chars can be used to match "
+#~ "one arbitrary char."
+#~ msgstr "这个码表的单一扩展字符. 这些字符可以用于匹配一个任意字符."
+
+#~ msgid "Max Key Length:"
+#~ msgstr "最大键长度:"
+
+#~ msgid "The maxmium length of key strings."
+#~ msgstr "键串的最大长度."
+
+#~ msgid "Show Key Prompt:"
+#~ msgstr "显示键提示:"
+
+#~ msgid "If true then the key prompts will be shown instead of the raw keys."
+#~ msgstr "如果选中这个选项, 则显式键的提示而不是原始的键."
+
+#~ msgid "Auto Select:"
+#~ msgstr "自动选择:"
+
+#~ msgid ""
+#~ "If true then the first candidate phrase will be selected automatically "
+#~ "when inputing the next key."
+#~ msgstr "如果为真, 则在输入下一个键的时候, 第一个候选词将被自动选择."
+
+#~ msgid "Auto Wildcard:"
+#~ msgstr "自动扩展:"
+
+#~ msgid ""
+#~ "If true then a multi wildcard char will be append to the end of inputed "
+#~ "key string when searching phrases."
+#~ msgstr ""
+#~ "如果为真, 则会在搜索词语的时候, 在已输入的键串后附加一个多重扩展字符."
+
+#~ msgid "Auto Commit:"
+#~ msgstr "自动提交:"
+
+#~ msgid ""
+#~ "If true then the converted result string will be committed to client "
+#~ "automatically."
+#~ msgstr "如果为真, 则转换结果字符串将被自动提交到客户程序."
+
+#~ msgid ""
+#~ "If true then the inputed key string will be splitted automatically when "
+#~ "necessary."
+#~ msgstr "如果为真, 则当有需要的时候, 自动分隔输入的键串."
+
+#~ msgid "Discard Invalid Key:"
+#~ msgstr "丢弃无效键:"
+
+#~ msgid ""
+#~ "If true then the invalid key will be discarded automatically.This option "
+#~ "is only valid when Auto Select and Auto Commit is true."
+#~ msgstr ""
+#~ "如果为真, 则无效键将被自动丢弃. 此选项仅在自动选择和自动提交选项开启时有"
+#~ "效."
+
+#~ msgid "Dynamic Adjust:"
+#~ msgstr "动态调整:"
+
+#~ msgid "If true then the phrases' frequencies will be adjusted dynamically."
+#~ msgstr "如果为真, 则会动态调整词语的频率信息."
+
+#~ msgid "Auto Fill Preedit Area:"
+#~ msgstr "自动填充预编辑区:"
+
+#~ msgid ""
+#~ "If true then the preedit string will be filled up with the current "
+#~ "candiate phrase automatically.This option is only valid when Auto Select "
+#~ "is TRUE."
+#~ msgstr ""
+#~ "如果为真, 则预编辑字符串将自动被当前候选词填充. 此选项仅在自动选择选项开启"
+#~ "时有效."
+
+#~ msgid "Always Show Lookup Table:"
+#~ msgstr "一直显示候选词表:"
+
+#~ msgid ""
+#~ "If true then the lookup table will always be shown when any candidate "
+#~ "phrase is available. Otherwise the lookup table will only be shown when "
+#~ "necessary.\n"
+#~ "If Auto Fill is false, then this option will be no effect, and always be "
+#~ "true."
+#~ msgstr ""
+#~ "如果为真,则当有候选词的时候总是显示候选词表. 否则候选词表将只在需要的时候"
+#~ "才被显示.\n"
+#~ "如果自动填充为假, 则该选项不起作用, 该值将永远为真."
+
+#~ msgid "Default Full Width Punct:"
+#~ msgstr "缺省全角标点:"
+
+#~ msgid "If true then full width punctuations will be inputed by default."
+#~ msgstr "如果为真, 则在缺省状态下输入全角标点."
+
+#~ msgid "Default Full Width Letter:"
+#~ msgstr "缺省全角字母:"
+
+#~ msgid "If true then full width letters will be inputed by default."
+#~ msgstr "如果为真, 则在缺省状态下输入全角字符."
+
+#~ msgid "Invalid icon file."
+#~ msgstr "无效的图标文件."
+
+#~ msgid "Invalid languages."
+#~ msgstr "无效的语言."
+
+#~ msgid "Invalid status prompt."
+#~ msgstr "无效的状态提示."
+
+#~ msgid "Invalid multi wildcard chars."
+#~ msgstr "无效的多重扩展字符."
+
+#~ msgid "Invalid single wildcard chars."
+#~ msgstr "无效的单一扩展字符."
+
+#~ msgid "Invalid commit keys."
+#~ msgstr "无效的提交键."
+
+#~ msgid "Invalid select keys."
+#~ msgstr "无效的选择键."
+
+#~ msgid "Invalid page up keys."
+#~ msgstr "无效的向上翻页键."
+
+#~ msgid "Invalid page down keys."
+#~ msgstr "无效的向下翻页键."
+
+#~ msgid "Invalid max key length."
+#~ msgstr "无效的最大键长度."
+
+#~ msgid "Failed to save table %s!"
+#~ msgstr "保存码表 %s 失败!"
+
+#~ msgid "Failed to load any Config Modules!"
+#~ msgstr "无法调入任何配置模块!"
+
+#~ msgid "_Current Config Module:"
+#~ msgstr "当前配置模块(_C):"
+
+#~ msgid "<Not found>"
+#~ msgstr "<没有找到>"
+
+#~ msgid "Current Config Module has been changed to %s."
+#~ msgstr "当前配置模块已经变成 %s."
+
+#~ msgid "Start the SCIM Setup Utility."
+#~ msgstr "启动 SCIM 设置工具."
+
+#~ msgid "Setup ..."
+#~ msgstr "设置 ..."
+
+#~ msgid "Show status _box"
+#~ msgstr "显示状态栏(_B)"
+
+#~ msgid ""
+#~ "If this option is checked, a float status box will be displayed to show "
+#~ "the status of current input module."
+#~ msgstr "如果选中这个选项, 将显示一个浮动的状态栏用以显示当前输入模块的状态."
+
+#~ msgid ""
+#~ "If this option is checked, a status box will be displayed on the lower "
+#~ "left corner of the client window to show the status of the current input "
+#~ "method.This option needs the support of the client application."
+#~ msgstr ""
+#~ "如果选中这个选项, 将在客户程序窗口的左下角显示一个浮动的状态栏, 用以显示当"
+#~ "前输入法的状态. 这个选项需要客户应用程序的支持."
--- /dev/null
+# translation of zh_HK.po to Chinese (Hongkong)
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ISF 2.2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 15:30+0900\n"
+"PO-Revision-Date: 2011-01-01 22:41+0800\n"
+"Last-Translator: Haifeng Deng <haifeng.deng@samsung.com>\n"
+"Language-Team: scim@freedesktop.org\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/src/scim_compose_key.cpp:127 ism/src/scim_imengine.cpp:659
+#: ism/src/scim_panel_agent.cpp:345 ism/src/scim_panel_agent.cpp:4334
+#: ism/src/scim_utility.cpp:701
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1740
+msgid "English/Keyboard"
+msgstr "英文鍵盤"
+
+#. return WideString ();
+#: ism/src/scim_compose_key.cpp:146
+msgid "English input service"
+msgstr "英文輸入"
+
+#: ism/src/scim_utility.cpp:702
+msgid "Amharic"
+msgstr "阿姆哈拉語"
+
+#: ism/src/scim_utility.cpp:703
+msgid "Arabic"
+msgstr "阿拉伯文"
+
+#: ism/src/scim_utility.cpp:704 ism/src/scim_utility.cpp:893
+msgid "Arabic (Egypt)"
+msgstr "阿拉伯文(埃及)"
+
+#: ism/src/scim_utility.cpp:705 ism/src/scim_utility.cpp:902
+msgid "Arabic (Lebanon)"
+msgstr "阿拉伯文(黎巴嫩)"
+
+#: ism/src/scim_utility.cpp:706
+msgid "Assamese"
+msgstr "阿薩姆語"
+
+#: ism/src/scim_utility.cpp:707 ism/src/scim_utility.cpp:918
+msgid "Azerbaijani"
+msgstr "亞賽拜然語"
+
+#: ism/src/scim_utility.cpp:708
+msgid "Belarusian"
+msgstr "白俄羅斯語"
+
+#: ism/src/scim_utility.cpp:709 ism/src/scim_utility.cpp:874
+msgid "Bulgarian"
+msgstr "保加利亞語"
+
+#: ism/src/scim_utility.cpp:710 ism/src/scim_utility.cpp:711
+#: ism/src/scim_utility.cpp:913
+msgid "Bengali"
+msgstr "孟加拉語"
+
+#: ism/src/scim_utility.cpp:712
+msgid "Bengali (India)"
+msgstr "孟加拉語(印度)"
+
+#: ism/src/scim_utility.cpp:713
+msgid "Tibetan"
+msgstr "藏語"
+
+#: ism/src/scim_utility.cpp:714
+msgid "Bosnian"
+msgstr "波斯尼亞語"
+
+#: ism/src/scim_utility.cpp:715 ism/src/scim_utility.cpp:853
+msgid "Catalan"
+msgstr "加泰羅尼亞語"
+
+#: ism/src/scim_utility.cpp:716 ism/src/scim_utility.cpp:863
+#: ism/src/scim_keyboard_layout_data.h:4596
+msgid "Czech"
+msgstr "捷克語"
+
+#: ism/src/scim_utility.cpp:717 ism/src/scim_utility.cpp:923
+msgid "Welsh"
+msgstr "威爾斯語"
+
+#: ism/src/scim_utility.cpp:718 ism/src/scim_utility.cpp:854
+#: ism/src/scim_keyboard_layout_data.h:4598
+msgid "Danish"
+msgstr "丹麥語"
+
+#: ism/src/scim_utility.cpp:719 ism/src/scim_keyboard_layout_data.h:4606
+msgid "German"
+msgstr "德文"
+
+#: ism/src/scim_utility.cpp:720
+msgid "Divehi"
+msgstr "迪韋西語"
+
+#: ism/src/scim_utility.cpp:721 ism/src/scim_utility.cpp:873
+#: ism/src/scim_keyboard_layout_data.h:4609
+msgid "Greek"
+msgstr "希臘文"
+
+#: ism/src/scim_utility.cpp:722
+msgid "English"
+msgstr "英文"
+
+#: ism/src/scim_utility.cpp:723 ism/src/scim_utility.cpp:808
+msgid "English (Australian)"
+msgstr "英文(澳洲)"
+
+#: ism/src/scim_utility.cpp:724 ism/src/scim_utility.cpp:809
+msgid "English (Canadian)"
+msgstr "英文(加拿大)"
+
+#: ism/src/scim_utility.cpp:725
+msgid "English (British)"
+msgstr "英文(英國)"
+
+#: ism/src/scim_utility.cpp:726
+msgid "English (Ireland)"
+msgstr "英文(愛爾蘭)"
+
+#: ism/src/scim_utility.cpp:727
+msgid "English (American)"
+msgstr "英文(美國)"
+
+#: ism/src/scim_utility.cpp:728 ism/src/scim_utility.cpp:729
+#: ism/src/scim_keyboard_layout_data.h:4622
+msgid "Spanish"
+msgstr "西班牙文"
+
+#: ism/src/scim_utility.cpp:730
+msgid "Spanish (Mexico)"
+msgstr "西班牙文(墨西哥)"
+
+#: ism/src/scim_utility.cpp:731 ism/src/scim_utility.cpp:870
+#: ism/src/scim_keyboard_layout_data.h:4601
+msgid "Estonian"
+msgstr "愛沙尼亞語"
+
+#: ism/src/scim_utility.cpp:732 ism/src/scim_utility.cpp:852
+msgid "Basque"
+msgstr "巴斯克語"
+
+#: ism/src/scim_utility.cpp:733
+msgid "Persian"
+msgstr "波斯語"
+
+#: ism/src/scim_utility.cpp:734 ism/src/scim_utility.cpp:857
+#: ism/src/scim_keyboard_layout_data.h:4602
+msgid "Finnish"
+msgstr "芬蘭文"
+
+#: ism/src/scim_utility.cpp:735 ism/src/scim_keyboard_layout_data.h:4603
+msgid "French"
+msgstr "法文"
+
+#: ism/src/scim_utility.cpp:736 ism/src/scim_utility.cpp:921
+msgid "Irish"
+msgstr "愛爾蘭語"
+
+#: ism/src/scim_utility.cpp:737 ism/src/scim_utility.cpp:919
+msgid "Galician"
+msgstr "加利西亞語"
+
+#: ism/src/scim_utility.cpp:738 ism/src/scim_utility.cpp:914
+msgid "Gujarati"
+msgstr "古吉拉特語"
+
+#: ism/src/scim_utility.cpp:739 ism/src/scim_utility.cpp:748
+#: ism/src/scim_utility.cpp:890
+msgid "Hebrew"
+msgstr "希伯來文"
+
+#: ism/src/scim_utility.cpp:740 ism/src/scim_utility.cpp:909
+msgid "Hindi"
+msgstr "北印度文"
+
+#: ism/src/scim_utility.cpp:741 ism/src/scim_keyboard_layout_data.h:4595
+msgid "Croatian"
+msgstr "克羅埃西亞語"
+
+#: ism/src/scim_utility.cpp:742 ism/src/scim_utility.cpp:864
+#: ism/src/scim_keyboard_layout_data.h:4610
+msgid "Hungarian"
+msgstr "匈牙利文"
+
+#: ism/src/scim_utility.cpp:743
+msgid "Armenian"
+msgstr "亞美尼亞語"
+
+#: ism/src/scim_utility.cpp:744
+msgid "Interlingua"
+msgstr "世界語"
+
+#: ism/src/scim_utility.cpp:745
+msgid "Indonesian"
+msgstr "印尼語"
+
+#: ism/src/scim_utility.cpp:746 ism/src/scim_utility.cpp:856
+#: ism/src/scim_keyboard_layout_data.h:4628
+msgid "Icelandic"
+msgstr "冰島語"
+
+#: ism/src/scim_utility.cpp:747 ism/src/scim_keyboard_layout_data.h:4611
+msgid "Italian"
+msgstr "義大利文"
+
+#: ism/src/scim_utility.cpp:749 ism/src/scim_utility.cpp:882
+#: ism/src/scim_keyboard_layout_data.h:4612
+msgid "Japanese"
+msgstr "日文"
+
+#: ism/src/scim_utility.cpp:750 ism/src/scim_utility.cpp:917
+msgid "Georgian"
+msgstr "喬治亚語"
+
+#: ism/src/scim_utility.cpp:751 ism/src/scim_utility.cpp:875
+msgid "Kazakh"
+msgstr "哈薩克語"
+
+#: ism/src/scim_utility.cpp:752
+msgid "Cambodian"
+msgstr "柬埔寨文"
+
+#: ism/src/scim_utility.cpp:753
+msgid "Kannada"
+msgstr "卡納達語"
+
+#: ism/src/scim_utility.cpp:754 ism/src/scim_utility.cpp:883
+msgid "Korean"
+msgstr "韓文"
+
+#: ism/src/scim_utility.cpp:755
+msgid "Laothian"
+msgstr "老撾語"
+
+#: ism/src/scim_utility.cpp:756 ism/src/scim_utility.cpp:872
+#: ism/src/scim_keyboard_layout_data.h:4629
+msgid "Lithuanian"
+msgstr "立陶宛文"
+
+#: ism/src/scim_utility.cpp:757 ism/src/scim_utility.cpp:871
+msgid "Latvian"
+msgstr "拉脫維亞語"
+
+#: ism/src/scim_utility.cpp:758 ism/src/scim_utility.cpp:876
+msgid "Macedonian"
+msgstr "馬其頓語"
+
+#: ism/src/scim_utility.cpp:759 ism/src/scim_utility.cpp:915
+msgid "Malayalam"
+msgstr "馬拉雅拉姆語"
+
+#: ism/src/scim_utility.cpp:760
+msgid "Mongolian"
+msgstr "蒙古文"
+
+#: ism/src/scim_utility.cpp:761 ism/src/scim_utility.cpp:911
+msgid "Marathi"
+msgstr "馬拉地語"
+
+#: ism/src/scim_utility.cpp:762
+msgid "Malay"
+msgstr "馬來語"
+
+#: ism/src/scim_utility.cpp:763
+msgid "Burmese"
+msgstr "緬甸語"
+
+#: ism/src/scim_utility.cpp:764
+msgid "Nepali"
+msgstr "尼泊爾語"
+
+#: ism/src/scim_utility.cpp:765 ism/src/scim_keyboard_layout_data.h:4599
+msgid "Dutch"
+msgstr "荷蘭文"
+
+#: ism/src/scim_utility.cpp:766
+msgid "Norwegian (Nynorsk)"
+msgstr "挪威語(尼諾斯克)"
+
+#: ism/src/scim_utility.cpp:767
+msgid "Norwegian (Bokmal)"
+msgstr "挪威語(博克馬尓)"
+
+#: ism/src/scim_utility.cpp:768
+msgid "Oriya"
+msgstr "奧里雅語"
+
+#: ism/src/scim_utility.cpp:769 ism/src/scim_utility.cpp:916
+msgid "Punjabi"
+msgstr "旁遮普語"
+
+#: ism/src/scim_utility.cpp:770 ism/src/scim_utility.cpp:865
+#: ism/src/scim_keyboard_layout_data.h:4614
+msgid "Polish"
+msgstr "波蘭文"
+
+#: ism/src/scim_utility.cpp:771 ism/src/scim_utility.cpp:773
+#: ism/src/scim_keyboard_layout_data.h:4615
+msgid "Portuguese"
+msgstr "葡萄牙文"
+
+#: ism/src/scim_utility.cpp:772 ism/src/scim_keyboard_layout_data.h:4616
+msgid "Portuguese (Brazil)"
+msgstr "葡萄牙文(巴西)"
+
+#: ism/src/scim_utility.cpp:774 ism/src/scim_utility.cpp:866
+msgid "Romanian"
+msgstr "羅馬尼亞語"
+
+#: ism/src/scim_utility.cpp:775 ism/src/scim_utility.cpp:877
+#: ism/src/scim_keyboard_layout_data.h:4618
+msgid "Russian"
+msgstr "俄文"
+
+#: ism/src/scim_utility.cpp:776 ism/src/scim_utility.cpp:922
+msgid "Sinhala"
+msgstr "僧伽羅語"
+
+#: ism/src/scim_utility.cpp:777 ism/src/scim_utility.cpp:868
+#: ism/src/scim_keyboard_layout_data.h:4619
+msgid "Slovak"
+msgstr "斯洛伐克語"
+
+#: ism/src/scim_utility.cpp:778 ism/src/scim_utility.cpp:869
+#: ism/src/scim_keyboard_layout_data.h:4621
+msgid "Slovenian"
+msgstr "斯洛文尼亞語"
+
+#: ism/src/scim_utility.cpp:779
+msgid "Albanian"
+msgstr "亞爾巴尼亞語"
+
+#: ism/src/scim_utility.cpp:780 ism/src/scim_utility.cpp:781
+#: ism/src/scim_utility.cpp:782
+msgid "Serbian"
+msgstr "塞爾維亞語"
+
+#: ism/src/scim_utility.cpp:783 ism/src/scim_utility.cpp:785
+#: ism/src/scim_utility.cpp:861 ism/src/scim_keyboard_layout_data.h:4625
+msgid "Swedish"
+msgstr "瑞典語"
+
+#: ism/src/scim_utility.cpp:784 ism/src/scim_utility.cpp:862
+msgid "Swedish (Finland)"
+msgstr "瑞典語(芬蘭)"
+
+#: ism/src/scim_utility.cpp:786 ism/src/scim_utility.cpp:912
+msgid "Tamil"
+msgstr "塔米爾語"
+
+#: ism/src/scim_utility.cpp:787 ism/src/scim_utility.cpp:910
+msgid "Telugu"
+msgstr "泰盧固語"
+
+#: ism/src/scim_utility.cpp:788 ism/src/scim_utility.cpp:889
+msgid "Thai"
+msgstr "泰文"
+
+#: ism/src/scim_utility.cpp:789 ism/src/scim_utility.cpp:880
+#: ism/src/scim_keyboard_layout_data.h:4626
+msgid "Turkish"
+msgstr "土耳其文"
+
+#: ism/src/scim_utility.cpp:790
+msgid "Uighur"
+msgstr "維吾爾語"
+
+#: ism/src/scim_utility.cpp:791 ism/src/scim_utility.cpp:879
+#: ism/src/scim_keyboard_layout_data.h:4630
+msgid "Ukrainian"
+msgstr "烏克蘭語"
+
+#: ism/src/scim_utility.cpp:792 ism/src/scim_utility.cpp:907
+msgid "Urdu"
+msgstr "烏爾都語(巴基斯坦)"
+
+#: ism/src/scim_utility.cpp:793
+msgid "Uzbek"
+msgstr "烏玆別克語"
+
+#: ism/src/scim_utility.cpp:794 ism/src/scim_utility.cpp:908
+msgid "Vietnamese"
+msgstr "越南文"
+
+#: ism/src/scim_utility.cpp:795
+msgid "Walloon"
+msgstr "華隆語"
+
+#: ism/src/scim_utility.cpp:796 ism/src/scim_utility.cpp:797
+msgid "Yiddish"
+msgstr "依地語"
+
+#: ism/src/scim_utility.cpp:798
+msgid "Chinese"
+msgstr "中文"
+
+#: ism/src/scim_utility.cpp:799 ism/src/scim_utility.cpp:801
+msgid "Chinese (Simplified)"
+msgstr "簡體中文"
+
+#: ism/src/scim_utility.cpp:800 ism/src/scim_utility.cpp:802
+msgid "Chinese (Traditional)"
+msgstr "繁體中文"
+
+#: ism/src/scim_utility.cpp:804
+msgid "Dutch (Standard)"
+msgstr "荷蘭語(標準)"
+
+#: ism/src/scim_utility.cpp:805
+msgid "Dutch (Belgian)"
+msgstr "荷蘭語(比利時)"
+
+#: ism/src/scim_utility.cpp:806
+msgid "English (United States)"
+msgstr "英文(美國)"
+
+#: ism/src/scim_utility.cpp:807
+msgid "English (United Kingdom)"
+msgstr "英文(加拿大)"
+
+#: ism/src/scim_utility.cpp:810
+msgid "English (New Zealand)"
+msgstr "英文(新西蘭)"
+
+#: ism/src/scim_utility.cpp:811
+msgid "English (Irish)"
+msgstr "英文(愛爾蘭)"
+
+#: ism/src/scim_utility.cpp:812
+msgid "English (South Africa)"
+msgstr "英文(南非)"
+
+#: ism/src/scim_utility.cpp:813
+msgid "English (Jamaica)"
+msgstr "英文(牙買加)"
+
+#: ism/src/scim_utility.cpp:814
+msgid "English (Belize)"
+msgstr "英文(伯利茲)"
+
+#: ism/src/scim_utility.cpp:815
+msgid "English (Trinidad)"
+msgstr "英文(特立尼達)"
+
+#: ism/src/scim_utility.cpp:816
+msgid "English (Zimbabwe)"
+msgstr "英文(津巴布韋)"
+
+#: ism/src/scim_utility.cpp:817
+msgid "English (Philippines)"
+msgstr "英文(菲律賓)"
+
+#: ism/src/scim_utility.cpp:818
+msgid "French (Standard)"
+msgstr "法文(標準)"
+
+#: ism/src/scim_utility.cpp:819
+msgid "French (Belgian)"
+msgstr "法文(比利時)"
+
+#: ism/src/scim_utility.cpp:820 ism/src/scim_keyboard_layout_data.h:4604
+msgid "French (Canadian)"
+msgstr "法文(加拿大)"
+
+#: ism/src/scim_utility.cpp:821
+msgid "French (Swiss)"
+msgstr "德文(瑞士)"
+
+#: ism/src/scim_utility.cpp:822
+msgid "French (Luxembourg)"
+msgstr "法文(盧森堡)"
+
+#: ism/src/scim_utility.cpp:823
+msgid "French (Monaco)"
+msgstr "法文(摩納哥)"
+
+#: ism/src/scim_utility.cpp:824
+msgid "German (Standard)"
+msgstr "德文(標準)"
+
+#: ism/src/scim_utility.cpp:825 ism/src/scim_keyboard_layout_data.h:4608
+msgid "German (Swiss)"
+msgstr "德文(瑞士)"
+
+#: ism/src/scim_utility.cpp:826
+msgid "German (Austrian)"
+msgstr "英文(澳洲)"
+
+#: ism/src/scim_utility.cpp:827
+msgid "German (Luxembourg)"
+msgstr "德文(盧森堡)"
+
+#: ism/src/scim_utility.cpp:828
+msgid "German (Liechtenstein)"
+msgstr "德文(列支敦士登)"
+
+#: ism/src/scim_utility.cpp:829
+msgid "Italian (Standard)"
+msgstr "意大利文(標準)"
+
+#: ism/src/scim_utility.cpp:830
+msgid "Italian (Swiss)"
+msgstr "意大利文(瑞士)"
+
+#: ism/src/scim_utility.cpp:831
+msgid "Portuguese (Brazilian)"
+msgstr "葡萄牙文(巴西)"
+
+#: ism/src/scim_utility.cpp:832
+msgid "Portuguese (Standard)"
+msgstr "葡萄牙文(標準)"
+
+#: ism/src/scim_utility.cpp:833
+msgid "Spanish (Traditional Sort)"
+msgstr "西班牙文(傳統)"
+
+#: ism/src/scim_utility.cpp:834
+msgid "Spanish (Mexican)"
+msgstr "西班牙文(墨西哥)"
+
+#: ism/src/scim_utility.cpp:835
+msgid "Spanish (Guatemala)"
+msgstr "西班牙文(危地馬拉)"
+
+#: ism/src/scim_utility.cpp:836
+msgid "Spanish (Costa Rica)"
+msgstr "西班牙文(哥斯達黎加)"
+
+#: ism/src/scim_utility.cpp:837
+msgid "Spanish (Panama)"
+msgstr "西班牙文(巴拿馬)"
+
+#: ism/src/scim_utility.cpp:838
+msgid "Spanish (Dominican Republic)"
+msgstr "西班牙文(多米尼加共和國)"
+
+#: ism/src/scim_utility.cpp:839
+msgid "Spanish (Venezuela)"
+msgstr "西班牙文(委內瑞拉)"
+
+#: ism/src/scim_utility.cpp:840
+msgid "Spanish (Colombia)"
+msgstr "西班牙文(哥倫比亞)"
+
+#: ism/src/scim_utility.cpp:841
+msgid "Spanish (Peru)"
+msgstr "西班牙文(秘魯)"
+
+#: ism/src/scim_utility.cpp:842
+msgid "Spanish (Argentina)"
+msgstr "西班牙文(阿根廷)"
+
+#: ism/src/scim_utility.cpp:843
+msgid "Spanish (Ecuador)"
+msgstr "西班牙文(厄瓜多爾)"
+
+#: ism/src/scim_utility.cpp:844
+msgid "Spanish (Chile)"
+msgstr "西班牙文(智利)"
+
+#: ism/src/scim_utility.cpp:845
+msgid "Spanish (Uruguay)"
+msgstr "西班牙文(烏拉圭)"
+
+#: ism/src/scim_utility.cpp:846
+msgid "Spanish (Paraguay)"
+msgstr "西班牙文(巴拉圭)"
+
+#: ism/src/scim_utility.cpp:847
+msgid "Spanish (Bolivia)"
+msgstr "西班牙文(玻利維亞)"
+
+#: ism/src/scim_utility.cpp:848
+msgid "Spanish (El Salvador)"
+msgstr "西班牙文(薩爾瓦多)"
+
+#: ism/src/scim_utility.cpp:849
+msgid "Spanish (Honduras)"
+msgstr "西班牙文(洪都拉斯)"
+
+#: ism/src/scim_utility.cpp:850
+msgid "Spanish (Nicaragua)"
+msgstr "西班牙文(尼加拉瓜)"
+
+#: ism/src/scim_utility.cpp:851
+msgid "Spanish (Puerto Rico)"
+msgstr "西班牙文(波多黎各)"
+
+#: ism/src/scim_utility.cpp:855
+msgid "Afrikaans"
+msgstr "南非語"
+
+#: ism/src/scim_utility.cpp:858
+msgid "Malay (Malaysia)"
+msgstr "馬來文(馬來西亞)"
+
+#: ism/src/scim_utility.cpp:859
+msgid "Malay (Brunei Darussalam)"
+msgstr "馬來文(文萊)"
+
+#: ism/src/scim_utility.cpp:860 ism/src/scim_keyboard_layout_data.h:4613
+msgid "Norwegian"
+msgstr "挪威語"
+
+#: ism/src/scim_utility.cpp:867
+msgid "Serbian (Latin)"
+msgstr "塞爾維亞語(拉丁)"
+
+#: ism/src/scim_utility.cpp:878
+msgid "Serbian (Cyrillic)"
+msgstr "塞爾維亞語(西里爾)"
+
+#: ism/src/scim_utility.cpp:881
+msgid "Uzbek (Latin)"
+msgstr "烏茲別克語(拉丁)"
+
+#: ism/src/scim_utility.cpp:884
+msgid "Chinese (Taiwan)"
+msgstr "中文(台灣)"
+
+#: ism/src/scim_utility.cpp:885
+msgid "Chinese (Hongkong)"
+msgstr "中文(香港)"
+
+#: ism/src/scim_utility.cpp:886
+msgid "Chinese (Macau)"
+msgstr "中文(澳門)"
+
+#: ism/src/scim_utility.cpp:887
+msgid "Chinese (PRC)"
+msgstr "中文(中華人民共和國)"
+
+#: ism/src/scim_utility.cpp:888
+msgid "Chinese (Singapore)"
+msgstr "中文(新加坡)"
+
+#: ism/src/scim_utility.cpp:891
+msgid "Arabic (Saudi Arabia)"
+msgstr "阿拉伯文(沙特阿拉伯)"
+
+#: ism/src/scim_utility.cpp:892
+msgid "Arabic (Iraq)"
+msgstr "阿拉伯文(伊拉克)"
+
+#: ism/src/scim_utility.cpp:894
+msgid "Arabic (Libya)"
+msgstr "阿拉伯文(利比亞)"
+
+#: ism/src/scim_utility.cpp:895
+msgid "Arabic (Algeria)"
+msgstr "阿拉伯文(阿爾及利亞)"
+
+#: ism/src/scim_utility.cpp:896
+msgid "Arabic (Morocco)"
+msgstr "阿拉伯文(摩洛哥)"
+
+#: ism/src/scim_utility.cpp:897
+msgid "Arabic (Tunisia)"
+msgstr "阿拉伯文(突尼斯)"
+
+#: ism/src/scim_utility.cpp:898
+msgid "Arabic (Oman)"
+msgstr "阿拉伯文(阿曼)"
+
+#: ism/src/scim_utility.cpp:899
+msgid "Arabic (Yemen)"
+msgstr "阿拉伯文(也門)"
+
+#: ism/src/scim_utility.cpp:900
+msgid "Arabic (Syria)"
+msgstr "阿拉伯文(敘利亞)"
+
+#: ism/src/scim_utility.cpp:901
+msgid "Arabic (Jordan)"
+msgstr "阿拉伯文(約旦)"
+
+#: ism/src/scim_utility.cpp:903
+msgid "Arabic (Kuwait)"
+msgstr "阿拉伯文(科威特)"
+
+#: ism/src/scim_utility.cpp:904
+msgid "Arabic (UAE)"
+msgstr "阿拉伯文(阿聯酋)"
+
+#: ism/src/scim_utility.cpp:905
+msgid "Arabic (Bahrain)"
+msgstr "阿拉伯文(巴林)"
+
+#: ism/src/scim_utility.cpp:906
+msgid "Arabic (Qatar)"
+msgstr "阿拉伯文(卡塔爾)"
+
+#: ism/src/scim_utility.cpp:920
+msgid "Hausa"
+msgstr "豪薩文"
+
+#: ism/src/scim_utility.cpp:924
+msgid "Xhosa"
+msgstr "科薩語"
+
+#: ism/src/scim_utility.cpp:925
+msgid "Yoruba"
+msgstr "約魯巴語"
+
+#: ism/src/scim_utility.cpp:926
+msgid "Zulu"
+msgstr "祖魯語"
+
+#: ism/src/scim_utility.cpp:1024
+msgid "Other"
+msgstr "其它語"
+
+#: ism/src/scim_keyboard_layout_data.h:4592
+#: ism/modules/imengine/scim_socket_imengine.cpp:408
+#: ism/modules/imengine/scim_socket_imengine.cpp:438
+#: ism/modules/imengine/scim_socket_imengine.cpp:523
+#: ism/modules/imengine/scim_socket_imengine.cpp:553
+#: ism/modules/imengine/scim_socket_imengine.cpp:583
+msgid "Unknown"
+msgstr "未知"
+
+#: ism/src/scim_keyboard_layout_data.h:4593
+msgid "English (US)"
+msgstr "英文"
+
+#: ism/src/scim_keyboard_layout_data.h:4594
+msgid "Belgian"
+msgstr "比利時語"
+
+#: ism/src/scim_keyboard_layout_data.h:4597
+msgid "Czech (qwerty)"
+msgstr "捷克(標準鍵盤)"
+
+#: ism/src/scim_keyboard_layout_data.h:4600
+msgid "Dvorak"
+msgstr "德沃夏克鍵盤"
+
+#: ism/src/scim_keyboard_layout_data.h:4605
+msgid "French (Switzerland)"
+msgstr "法文(瑞士)"
+
+#: ism/src/scim_keyboard_layout_data.h:4607
+msgid "German (with deadkeys)"
+msgstr "德文(有deadkeys)"
+
+#: ism/src/scim_keyboard_layout_data.h:4617
+msgid "Portuguese (Brazil US accents)"
+msgstr "葡萄牙文(巴西、美式發音)"
+
+#: ism/src/scim_keyboard_layout_data.h:4620
+msgid "Slovak (qwerty)"
+msgstr "斯洛伐克語(標準鍵盤)"
+
+#: ism/src/scim_keyboard_layout_data.h:4623
+msgid "Spanish (CP 850)"
+msgstr "西班牙文(CP 850)"
+
+#: ism/src/scim_keyboard_layout_data.h:4624
+msgid "Spanish (Latin America)"
+msgstr "西班牙文(拉丁美洲)"
+
+#: ism/src/scim_keyboard_layout_data.h:4627
+msgid "English (UK)"
+msgstr "英式英文"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:57
+msgid "Simplified-Traditional Chinese Conversion"
+msgstr "繁簡體中文轉換"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:60
+msgid "Convert between Simplified Chinese and Traditional Chinese"
+msgstr "繁簡體中文互轉"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:71
+msgid "SC-TC"
+msgstr "繁簡體轉換"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:73
+#: ism/modules/filter/scim_sctc_filter.cpp:78
+msgid "Simplified-Traditional Chinese conversion"
+msgstr "繁簡體中文轉換"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:76
+msgid "No Conversion"
+msgstr "不轉換"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:81
+msgid "Simplified to Traditional"
+msgstr "簡體轉繁體中文"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:83
+msgid "Convert Simplified Chinese to Traditional Chinese"
+msgstr "轉換簡體中文為繁體中文"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:86
+msgid "Traditional to Simplified"
+msgstr "繁體轉簡體中文"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:88
+msgid "Convert Traditional Chinese to Simplified Chinese"
+msgstr "轉換繁體中文為簡體中文"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:300
+msgid "James Su <suzhe@tsinghua.org.cn>"
+msgstr "蘇哲 <suzhe@tsinghua.org.cn>"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:425
+#: ism/modules/filter/scim_sctc_filter.cpp:555
+#: ism/modules/filter/scim_sctc_filter.cpp:571
+msgid "SC->TC"
+msgstr "簡轉繁體"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:431
+#: ism/modules/filter/scim_sctc_filter.cpp:559
+#: ism/modules/filter/scim_sctc_filter.cpp:575
+msgid "TC->SC"
+msgstr "繁轉簡體"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1693
+msgid "Smart Common Input Method platform "
+msgstr "泛用智慧型輸入法平台"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1695
+msgid ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+msgstr ""
+"\n"
+"(C) 2002-2005 蘇哲 <suzhe@tsinghua.org.cn>\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1700
+msgid ""
+":\n"
+"\n"
+msgstr ""
+":\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1703
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:963
+msgid "Enable"
+msgstr "開啟"
+
+#. gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+#. gtk_tree_view_column_set_fixed_width (column, 232);
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:984
+msgid "Name"
+msgstr "名稱"
+
+#: ism/utils/scimstringview.c:201
+msgid "Cursor Position"
+msgstr "游標位置"
+
+#: ism/utils/scimstringview.c:202
+msgid "The current position of the insertion cursor in chars."
+msgstr "在字元中插入的游標的所在位置。"
+
+#: ism/utils/scimstringview.c:211
+msgid "Maximum length"
+msgstr "最大長度"
+
+#: ism/utils/scimstringview.c:212
+msgid "Maximum number of characters for this string view. Zero if no maximum."
+msgstr "這個字串視窗最長可以容衲多少字元。設定值為 0 則表示無限制。"
+
+#: ism/utils/scimstringview.c:221
+msgid "Maximum width"
+msgstr "最大寬度"
+
+#: ism/utils/scimstringview.c:222
+msgid "Maximum width of this string view."
+msgstr "這個字串視窗的最大寬度。"
+
+#: ism/utils/scimstringview.c:231
+msgid "Has Frame"
+msgstr "有外框"
+
+#: ism/utils/scimstringview.c:232
+msgid "FALSE removes outside bevel from string view."
+msgstr "無效時,移除字串視窗的外部斜邊。"
+
+#: ism/utils/scimstringview.c:239
+msgid "Draw cursor"
+msgstr "繪製游標"
+
+#: ism/utils/scimstringview.c:240
+msgid "TRUE draw blinking cursor."
+msgstr "啟用時,繪製閃爍游標"
+
+#: ism/utils/scimstringview.c:247
+msgid "Auto move cursor"
+msgstr "自動移動游標"
+
+#: ism/utils/scimstringview.c:248
+msgid "TRUE auto move cursor position when mouse clicking."
+msgstr "啟用時,當滑鼠點選時會自動移動游標。"
+
+#: ism/utils/scimstringview.c:255
+msgid "Forward button press/release event"
+msgstr "轉送按鍵事件"
+
+#: ism/utils/scimstringview.c:256
+msgid "TRUE forward button press/release event to user program."
+msgstr "啟用時,轉送鍵擊事件給使用者程式。"
+
+#: ism/utils/scimstringview.c:263
+msgid "Auto resize the widget to fit the string"
+msgstr "根據字串自動調整邊框大小"
+
+#: ism/utils/scimstringview.c:264
+msgid "TRUE Auto resize on."
+msgstr "啟用時,自動調整大小。"
+
+#: ism/utils/scimstringview.c:271
+msgid "Emit move_cursor signal when press/release the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:272
+msgid "TRUE Emit move_cursor signal when press the string."
+msgstr "啟用時,當滑鼠點選時會自動移動游標。"
+
+#: ism/utils/scimstringview.c:279
+msgid "Width in chars"
+msgstr "字元寬度"
+
+#: ism/utils/scimstringview.c:280
+msgid "Number of characters to leave space for in the string view."
+msgstr "在字串視窗裡所保留的空白字元數。"
+
+#: ism/utils/scimstringview.c:289
+msgid "Scroll offset"
+msgstr "捲軸位移"
+
+#: ism/utils/scimstringview.c:290
+msgid "Number of pixels of the string view scrolled off the screen to the left"
+msgstr "字串視窗距離螢幕左邊的像素值"
+
+#: ism/utils/scimstringview.c:299
+msgid "Text"
+msgstr "文字"
+
+#: ism/utils/scimstringview.c:300
+msgid "The contents of the string view"
+msgstr "字串視窗的說明"
+
+#: ism/utils/scimkeyselection.cpp:161
+msgid "Selected _Keys:"
+msgstr "選定的按鍵(_K):"
+
+#: ism/utils/scimkeyselection.cpp:206
+msgid "Key Code:"
+msgstr "鍵值:"
+
+#: ism/utils/scimkeyselection.cpp:224
+msgid "....."
+msgstr "..."
+
+#: ism/utils/scimkeyselection.cpp:229
+msgid "Modifiers:"
+msgstr "作用鍵:"
+
+#: ism/utils/scimkeyselection.cpp:242
+msgid "_Ctrl"
+msgstr "_Ctrl"
+
+#: ism/utils/scimkeyselection.cpp:246
+msgid "A_lt"
+msgstr "A_lt"
+
+#: ism/utils/scimkeyselection.cpp:250
+msgid "_Shift"
+msgstr "_Shift"
+
+#: ism/utils/scimkeyselection.cpp:254
+msgid "_Release"
+msgstr "放開(_R)"
+
+#: ism/utils/scimkeyselection.cpp:264
+msgid "_Meta"
+msgstr "_Meta"
+
+#: ism/utils/scimkeyselection.cpp:268
+msgid "S_uper"
+msgstr "S_uper"
+
+#: ism/utils/scimkeyselection.cpp:272
+msgid "_Hyper"
+msgstr "_Hyper"
+
+#: ism/utils/scimkeyselection.cpp:337
+msgid "Please enter a Key Code first."
+msgstr "請先輸入一個鍵值。"
+
+#: ism/utils/scimkeyselection.cpp:391
+msgid ""
+"Press a key (or a key combination).\n"
+"This dialog will be closed \n"
+"when the key is released."
+msgstr ""
+"請按一個按鍵或組合鍵。\n"
+"本對話框會在按鍵釋放時關閉。"
+
+#: ism/utils/scimkeyselection.cpp:395
+msgid "Grabbing a key."
+msgstr "捕捉按鍵"
+
+#: ism/utils/scimkeyselection.cpp:686
+msgid "Key Selection"
+msgstr "選擇按鍵"
+
+#: ism/utils/scimtrayicon.c:108
+msgid "Orientation"
+msgstr "方位"
+
+#: ism/utils/scimtrayicon.c:109
+msgid "The orientation of the tray."
+msgstr "狀態列的方位。"
+
+#~ msgid "Automatic"
+#~ msgstr "自動"
+
+#~ msgid "Always used"
+#~ msgstr "永遠"
+
+#~ msgid "%s Option"
+#~ msgstr "選項設定"
+
+#~ msgid "Keyboards"
+#~ msgstr "英文鍵盤"
+
+#~ msgid "English/European"
+#~ msgstr "英文/歐洲語文"
+
+#~ msgid "RAW CODE"
+#~ msgstr "內碼輸入"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 蘇哲 <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "快捷鍵:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " 切換地區編碼和 Unicode 編碼。\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " 重設輸入法。\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "目前輸入法的模式狀態,滑鼠點選可切換模式。"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "全域設定"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "調整所有介面模組的共通設定,包含 X11 介面、GTK+ IMModule、Qt IMModule 等"
+
+#~ msgid "_Trigger:"
+#~ msgstr "作用鍵(_T):"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "選擇輸入法的作用鍵"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr "用來 開啟/關閉 SCIM 輸入法的作用鍵,點壓該按鈕後可編輯。"
+
+#~ msgid "Turn _On:"
+#~ msgstr "開啟(_O)"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "選擇開啟 SCIM 按鍵"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "用來開啟 SCIM 輸入法,點壓該按鈕後可編輯。"
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "關閉 (_F)"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "選擇關閉 SCIM 按鍵"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "用來關閉 SCIM 輸入法,點壓該按鈕後可編輯。"
+
+#~ msgid "_Next input method:"
+#~ msgstr "下一種輸入法(_N):"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "選擇下一種輸入法按鍵"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr "用來切換至下一種輸入法的按鍵,按鈕上滑鼠點選可編輯。"
+
+#~ msgid "_Previous input method:"
+#~ msgstr "上一種輸入法(_P):"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "選擇上一種輸入法按鍵"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr "用來切換至上一種輸入法的按鍵,點壓按鈕後可編輯。"
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "顯示輸入法選單(_M):"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "選擇顯示輸入法選單按鍵"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "用來顯示輸入法選單的按鍵,點壓按鈕後可編輯。"
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "鍵盤排列(_K):"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr "您應適當挑選鍵盤排列方式,這樣輸入法才能正確運作。"
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "在輸入法客戶端視窗嵌入預先編輯字串(_E)"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "如果勾取這個選項,預先編輯字串將會直接顯示於輸入法客戶端,而非出現於獨立的"
+#~ "浮動視窗"
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "在所有的應用程式共享同樣的輸入法(_S)"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "如果啟用本選項,所有應用程式在一時間將只會有一個輸入法,否則個別的應用程式"
+#~ "可以使用不同的輸入法。"
+
+#~ msgid "Hotkeys"
+#~ msgstr "快速鍵"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr "你可在此開啟或關閉已安裝的輸入法,並設定快速鍵"
+
+#~ msgid "The installed input method services:"
+#~ msgstr "已安裝的輸入法服務:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "編輯快速鍵(_H)"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "編輯所選取輸入法關連的快速鍵"
+
+#~ msgid "Select _Filters"
+#~ msgstr "選定的轉換過濾器(_F)"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "選擇施加到輸入法的轉換過濾器"
+
+#~ msgid "_Expand"
+#~ msgstr "展開(_E)"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "展開所有語言目錄"
+
+#~ msgid "_Collapse"
+#~ msgstr "折疊(_C)"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "折疊所有語言目錄"
+
+#~ msgid "E_nable All"
+#~ msgstr "使用所有的輸入法(_E)"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "使用所有輸入法"
+
+#~ msgid "_Disable All"
+#~ msgstr "停用所有輸入法(_D)"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "停用所有輸入法"
+
+#~ msgid "Filters"
+#~ msgstr "轉換過濾器"
+
+#~ msgid "Languages"
+#~ msgstr "語文"
+
+#~ msgid "Description"
+#~ msgstr "描述"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "編輯 %s 的快速鍵"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "編輯 %s 的轉換過濾器"
+
+#~ msgid "Move _Up"
+#~ msgstr "上移(_U)"
+
+#~ msgid "Move _Down"
+#~ msgstr "下移(_D)"
+
+#~ msgid "GTK"
+#~ msgstr "GTK+"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "一個使用 GTK+-2.x 撰寫的操控面板背景程式。"
+
+#~ msgid "On demand"
+#~ msgstr "需要時"
+
+#~ msgid "Never"
+#~ msgstr "從不"
+
+#~ msgid "ToolBar"
+#~ msgstr "工具列"
+
+#~ msgid "_Show:"
+#~ msgstr "顯示(_S):"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "自動靠邊(_N)"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "顯示輸入法圖示(_I)"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "顯示輸入法名稱(_U)"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "逾時隱藏(_O):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "顯示固定圖示(_T)"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "顯示選單圖示(_E)"
+
+#~ msgid "Show _help icon"
+#~ msgstr "顯示求助圖示(_H)"
+
+#~ msgid "Show _property label"
+#~ msgstr "顯示屬性名稱(_P)"
+
+#~ msgid "Input window"
+#~ msgstr "輸入視窗"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "嵌入式選詞列表(_M)"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "垂直式選詞列表(_V)"
+
+#~ msgid "Misc"
+#~ msgstr "其它"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "顯示系統列圖示(_Y)"
+
+#~ msgid "Stick _windows"
+#~ msgstr "固定視窗(_W)"
+
+#~ msgid "_Font:"
+#~ msgstr "字形(_F):"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "如果選取「永遠」選項,工具列將永遠顯示在螢幕上。如果選取「需要時」選項,則"
+#~ "只有當 SCIM 被啟用時才會顯示工具列。如果選取「從不」選項,則永遠不會顯示工"
+#~ "具列。"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr "如果勾取這個選項,工具列將緊黏在螢幕邊緣。"
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "在經過一定時間後,工具列將被隱藏起來,該選項只在選取「永遠顯示」時才會作"
+#~ "用。當設定值為 0 時,將關閉此功能。"
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr "如果勾取這個選項,輸入法圖示將顯示在工具列上。"
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr "如果勾取這個選項,輸入法名稱將顯示在工具列上。"
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr "如果勾取這個選項,固定圖示將顯示在工具列上。"
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr "如果勾取這個選項,選單圖示將顯示在工具列上。"
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr "如果勾取這個選項,求助圖示將顯示在工具列上。"
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr "如果勾取這個選項,輸入法屬性的名稱將顯示在工具列上。"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr "如果勾取這個選項,選詞列表將出現在輸入視窗中。"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr "如果勾取這個選項,選詞列表將垂直顯示。"
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr "如果勾取這個選項,系統圖示將顯示在桌面的工作列上。"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr "如果勾取這個選項,則輸入和選詞列表視窗將停留在它們的原本位置。"
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr "該字形設定將套用於輸入和選詞列表視窗。"
+
+#~ msgid "Select Interface Font"
+#~ msgstr "選擇介面字形"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "介面(前端)"
+
+#~ msgid "IMEngine"
+#~ msgstr "輸入法引擎"
+
+#~ msgid "Panel"
+#~ msgstr "面板"
+
+#~ msgid "Extra"
+#~ msgstr "附加項目"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "SCIM 輸入法設定"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">泛用智慧型輸入法平台</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">圖形介面設定工具</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">版權所有 2002-2004, 蘇 哲 <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">%s 模組的設定。</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "是否關閉 SCIM 設定程式?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr "並非所有設定都可以立即生效。別忘了重新啟動 SCIM 來讓新的設定生效。"
+
+#~ msgid "SCIM Setup"
+#~ msgstr "SCIM 設定"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "以 GTK+ 撰寫的整合設定工具。"
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "泛用智慧型輸入法平台的設定工具"
+
+#~ msgid "SCIM Help"
+#~ msgstr "求助 SCIM"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "泛用智慧型輸入法平台"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "固定/釋開 輸入視窗和工具列。"
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "顯示關於 SCIM 和目前輸入法的精簡說明。"
+
+#~ msgid "Show command menu."
+#~ msgstr "顯示指令選單."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(c) 2002-2005 蘇哲 <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "重新載入設定值"
+
+#~ msgid "Stick Windows"
+#~ msgstr "固定視窗"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "隱藏工具列"
+
+#~ msgid "Help ..."
+#~ msgstr "求助 ..."
+
+#~ msgid "Exit"
+#~ msgstr "離開"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "英"
--- /dev/null
+# translation of zh_TW.po to Traditional Chinese
+# Jim Huang <jserv@kaffe.org>, 2004, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: scim 0.1.4\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-19 15:30+0900\n"
+"PO-Revision-Date: 2005-07-06 22:41+0800\n"
+"Last-Translator: Jim Huang <jserv@kaffe.org>\n"
+"Language-Team: scim@freedesktop.org\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ism/src/scim_compose_key.cpp:127 ism/src/scim_imengine.cpp:659
+#: ism/src/scim_panel_agent.cpp:345 ism/src/scim_panel_agent.cpp:4334
+#: ism/src/scim_utility.cpp:701
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1740
+msgid "English/Keyboard"
+msgstr "英文鍵盤"
+
+#. return WideString ();
+#: ism/src/scim_compose_key.cpp:146
+msgid "English input service"
+msgstr "英文輸入"
+
+#: ism/src/scim_utility.cpp:702
+msgid "Amharic"
+msgstr "阿姆哈拉語"
+
+#: ism/src/scim_utility.cpp:703
+msgid "Arabic"
+msgstr "阿拉伯文"
+
+#: ism/src/scim_utility.cpp:704 ism/src/scim_utility.cpp:893
+msgid "Arabic (Egypt)"
+msgstr "阿拉伯文(埃及)"
+
+#: ism/src/scim_utility.cpp:705 ism/src/scim_utility.cpp:902
+msgid "Arabic (Lebanon)"
+msgstr "阿拉伯文(黎巴嫩)"
+
+#: ism/src/scim_utility.cpp:706
+msgid "Assamese"
+msgstr "阿薩姆語"
+
+#: ism/src/scim_utility.cpp:707 ism/src/scim_utility.cpp:918
+msgid "Azerbaijani"
+msgstr "亞賽拜然語"
+
+#: ism/src/scim_utility.cpp:708
+msgid "Belarusian"
+msgstr "白俄羅斯語"
+
+#: ism/src/scim_utility.cpp:709 ism/src/scim_utility.cpp:874
+msgid "Bulgarian"
+msgstr "保加利亞語"
+
+#: ism/src/scim_utility.cpp:710 ism/src/scim_utility.cpp:711
+#: ism/src/scim_utility.cpp:913
+msgid "Bengali"
+msgstr "孟加拉語"
+
+#: ism/src/scim_utility.cpp:712
+msgid "Bengali (India)"
+msgstr "孟加拉語(印度)"
+
+#: ism/src/scim_utility.cpp:713
+msgid "Tibetan"
+msgstr "藏語"
+
+#: ism/src/scim_utility.cpp:714
+msgid "Bosnian"
+msgstr "波斯尼亞語"
+
+#: ism/src/scim_utility.cpp:715 ism/src/scim_utility.cpp:853
+msgid "Catalan"
+msgstr "加泰羅尼亞語"
+
+#: ism/src/scim_utility.cpp:716 ism/src/scim_utility.cpp:863
+#: ism/src/scim_keyboard_layout_data.h:4596
+msgid "Czech"
+msgstr "捷克語"
+
+#: ism/src/scim_utility.cpp:717 ism/src/scim_utility.cpp:923
+msgid "Welsh"
+msgstr "威爾斯語"
+
+#: ism/src/scim_utility.cpp:718 ism/src/scim_utility.cpp:854
+#: ism/src/scim_keyboard_layout_data.h:4598
+msgid "Danish"
+msgstr "丹麥語"
+
+#: ism/src/scim_utility.cpp:719 ism/src/scim_keyboard_layout_data.h:4606
+msgid "German"
+msgstr "德文"
+
+#: ism/src/scim_utility.cpp:720
+msgid "Divehi"
+msgstr "迪韋西語"
+
+#: ism/src/scim_utility.cpp:721 ism/src/scim_utility.cpp:873
+#: ism/src/scim_keyboard_layout_data.h:4609
+msgid "Greek"
+msgstr "希臘文"
+
+#: ism/src/scim_utility.cpp:722
+msgid "English"
+msgstr "英文"
+
+#: ism/src/scim_utility.cpp:723 ism/src/scim_utility.cpp:808
+msgid "English (Australian)"
+msgstr "英文(澳洲)"
+
+#: ism/src/scim_utility.cpp:724 ism/src/scim_utility.cpp:809
+msgid "English (Canadian)"
+msgstr "英文(加拿大)"
+
+#: ism/src/scim_utility.cpp:725
+msgid "English (British)"
+msgstr "英文(英國)"
+
+#: ism/src/scim_utility.cpp:726
+msgid "English (Ireland)"
+msgstr "英文(愛爾蘭)"
+
+#: ism/src/scim_utility.cpp:727
+msgid "English (American)"
+msgstr "英文(美國)"
+
+#: ism/src/scim_utility.cpp:728 ism/src/scim_utility.cpp:729
+#: ism/src/scim_keyboard_layout_data.h:4622
+msgid "Spanish"
+msgstr "西班牙文"
+
+#: ism/src/scim_utility.cpp:730
+msgid "Spanish (Mexico)"
+msgstr "西班牙文(墨西哥)"
+
+#: ism/src/scim_utility.cpp:731 ism/src/scim_utility.cpp:870
+#: ism/src/scim_keyboard_layout_data.h:4601
+msgid "Estonian"
+msgstr "愛沙尼亞語"
+
+#: ism/src/scim_utility.cpp:732 ism/src/scim_utility.cpp:852
+msgid "Basque"
+msgstr "巴斯克語"
+
+#: ism/src/scim_utility.cpp:733
+msgid "Persian"
+msgstr "波斯語"
+
+#: ism/src/scim_utility.cpp:734 ism/src/scim_utility.cpp:857
+#: ism/src/scim_keyboard_layout_data.h:4602
+msgid "Finnish"
+msgstr "芬蘭文"
+
+#: ism/src/scim_utility.cpp:735 ism/src/scim_keyboard_layout_data.h:4603
+msgid "French"
+msgstr "法文"
+
+#: ism/src/scim_utility.cpp:736 ism/src/scim_utility.cpp:921
+msgid "Irish"
+msgstr "愛爾蘭語"
+
+#: ism/src/scim_utility.cpp:737 ism/src/scim_utility.cpp:919
+msgid "Galician"
+msgstr "加利西亞語"
+
+#: ism/src/scim_utility.cpp:738 ism/src/scim_utility.cpp:914
+msgid "Gujarati"
+msgstr "古吉拉特語"
+
+#: ism/src/scim_utility.cpp:739 ism/src/scim_utility.cpp:748
+#: ism/src/scim_utility.cpp:890
+msgid "Hebrew"
+msgstr "希伯來文"
+
+#: ism/src/scim_utility.cpp:740 ism/src/scim_utility.cpp:909
+msgid "Hindi"
+msgstr "北印度文"
+
+#: ism/src/scim_utility.cpp:741 ism/src/scim_keyboard_layout_data.h:4595
+msgid "Croatian"
+msgstr "克羅埃西亞語"
+
+#: ism/src/scim_utility.cpp:742 ism/src/scim_utility.cpp:864
+#: ism/src/scim_keyboard_layout_data.h:4610
+msgid "Hungarian"
+msgstr "匈牙利文"
+
+#: ism/src/scim_utility.cpp:743
+msgid "Armenian"
+msgstr "亞美尼亞語"
+
+#: ism/src/scim_utility.cpp:744
+msgid "Interlingua"
+msgstr "世界語"
+
+#: ism/src/scim_utility.cpp:745
+msgid "Indonesian"
+msgstr "印尼語"
+
+#: ism/src/scim_utility.cpp:746 ism/src/scim_utility.cpp:856
+#: ism/src/scim_keyboard_layout_data.h:4628
+msgid "Icelandic"
+msgstr "冰島語"
+
+#: ism/src/scim_utility.cpp:747 ism/src/scim_keyboard_layout_data.h:4611
+msgid "Italian"
+msgstr "義大利文"
+
+#: ism/src/scim_utility.cpp:749 ism/src/scim_utility.cpp:882
+#: ism/src/scim_keyboard_layout_data.h:4612
+msgid "Japanese"
+msgstr "日文"
+
+#: ism/src/scim_utility.cpp:750 ism/src/scim_utility.cpp:917
+msgid "Georgian"
+msgstr "喬治亚語"
+
+#: ism/src/scim_utility.cpp:751 ism/src/scim_utility.cpp:875
+msgid "Kazakh"
+msgstr "哈薩克語"
+
+#: ism/src/scim_utility.cpp:752
+msgid "Cambodian"
+msgstr "柬埔寨文"
+
+#: ism/src/scim_utility.cpp:753
+msgid "Kannada"
+msgstr "卡納達語"
+
+#: ism/src/scim_utility.cpp:754 ism/src/scim_utility.cpp:883
+msgid "Korean"
+msgstr "韓文"
+
+#: ism/src/scim_utility.cpp:755
+msgid "Laothian"
+msgstr "老撾語"
+
+#: ism/src/scim_utility.cpp:756 ism/src/scim_utility.cpp:872
+#: ism/src/scim_keyboard_layout_data.h:4629
+msgid "Lithuanian"
+msgstr "立陶宛文"
+
+#: ism/src/scim_utility.cpp:757 ism/src/scim_utility.cpp:871
+msgid "Latvian"
+msgstr "拉脫維亞語"
+
+#: ism/src/scim_utility.cpp:758 ism/src/scim_utility.cpp:876
+msgid "Macedonian"
+msgstr "馬其頓語"
+
+#: ism/src/scim_utility.cpp:759 ism/src/scim_utility.cpp:915
+msgid "Malayalam"
+msgstr "馬拉雅拉姆語"
+
+#: ism/src/scim_utility.cpp:760
+msgid "Mongolian"
+msgstr "蒙古文"
+
+#: ism/src/scim_utility.cpp:761 ism/src/scim_utility.cpp:911
+msgid "Marathi"
+msgstr "馬拉地語"
+
+#: ism/src/scim_utility.cpp:762
+msgid "Malay"
+msgstr "馬來語"
+
+#: ism/src/scim_utility.cpp:763
+msgid "Burmese"
+msgstr "緬甸語"
+
+#: ism/src/scim_utility.cpp:764
+msgid "Nepali"
+msgstr "尼泊爾語"
+
+#: ism/src/scim_utility.cpp:765 ism/src/scim_keyboard_layout_data.h:4599
+msgid "Dutch"
+msgstr "荷蘭文"
+
+#: ism/src/scim_utility.cpp:766
+msgid "Norwegian (Nynorsk)"
+msgstr "挪威語(尼諾斯克)"
+
+#: ism/src/scim_utility.cpp:767
+msgid "Norwegian (Bokmal)"
+msgstr "挪威語(博克馬尓)"
+
+#: ism/src/scim_utility.cpp:768
+msgid "Oriya"
+msgstr "奧里雅語"
+
+#: ism/src/scim_utility.cpp:769 ism/src/scim_utility.cpp:916
+msgid "Punjabi"
+msgstr "旁遮普語"
+
+#: ism/src/scim_utility.cpp:770 ism/src/scim_utility.cpp:865
+#: ism/src/scim_keyboard_layout_data.h:4614
+msgid "Polish"
+msgstr "波蘭文"
+
+#: ism/src/scim_utility.cpp:771 ism/src/scim_utility.cpp:773
+#: ism/src/scim_keyboard_layout_data.h:4615
+msgid "Portuguese"
+msgstr "葡萄牙文"
+
+#: ism/src/scim_utility.cpp:772 ism/src/scim_keyboard_layout_data.h:4616
+msgid "Portuguese (Brazil)"
+msgstr "葡萄牙文(巴西)"
+
+#: ism/src/scim_utility.cpp:774 ism/src/scim_utility.cpp:866
+msgid "Romanian"
+msgstr "羅馬尼亞語"
+
+#: ism/src/scim_utility.cpp:775 ism/src/scim_utility.cpp:877
+#: ism/src/scim_keyboard_layout_data.h:4618
+msgid "Russian"
+msgstr "俄文"
+
+#: ism/src/scim_utility.cpp:776 ism/src/scim_utility.cpp:922
+msgid "Sinhala"
+msgstr "僧伽羅語"
+
+#: ism/src/scim_utility.cpp:777 ism/src/scim_utility.cpp:868
+#: ism/src/scim_keyboard_layout_data.h:4619
+msgid "Slovak"
+msgstr "斯洛伐克語"
+
+#: ism/src/scim_utility.cpp:778 ism/src/scim_utility.cpp:869
+#: ism/src/scim_keyboard_layout_data.h:4621
+msgid "Slovenian"
+msgstr "斯洛文尼亞語"
+
+#: ism/src/scim_utility.cpp:779
+msgid "Albanian"
+msgstr "亞爾巴尼亞語"
+
+#: ism/src/scim_utility.cpp:780 ism/src/scim_utility.cpp:781
+#: ism/src/scim_utility.cpp:782
+msgid "Serbian"
+msgstr "塞爾維亞語"
+
+#: ism/src/scim_utility.cpp:783 ism/src/scim_utility.cpp:785
+#: ism/src/scim_utility.cpp:861 ism/src/scim_keyboard_layout_data.h:4625
+msgid "Swedish"
+msgstr "瑞典語"
+
+#: ism/src/scim_utility.cpp:784 ism/src/scim_utility.cpp:862
+msgid "Swedish (Finland)"
+msgstr "瑞典語(芬蘭)"
+
+#: ism/src/scim_utility.cpp:786 ism/src/scim_utility.cpp:912
+msgid "Tamil"
+msgstr "塔米爾語"
+
+#: ism/src/scim_utility.cpp:787 ism/src/scim_utility.cpp:910
+msgid "Telugu"
+msgstr "泰盧固語"
+
+#: ism/src/scim_utility.cpp:788 ism/src/scim_utility.cpp:889
+msgid "Thai"
+msgstr "泰文"
+
+#: ism/src/scim_utility.cpp:789 ism/src/scim_utility.cpp:880
+#: ism/src/scim_keyboard_layout_data.h:4626
+msgid "Turkish"
+msgstr "土耳其文"
+
+#: ism/src/scim_utility.cpp:790
+msgid "Uighur"
+msgstr "維吾爾語"
+
+#: ism/src/scim_utility.cpp:791 ism/src/scim_utility.cpp:879
+#: ism/src/scim_keyboard_layout_data.h:4630
+msgid "Ukrainian"
+msgstr "烏克蘭語"
+
+#: ism/src/scim_utility.cpp:792 ism/src/scim_utility.cpp:907
+msgid "Urdu"
+msgstr "烏爾都語(巴基斯坦)"
+
+#: ism/src/scim_utility.cpp:793
+msgid "Uzbek"
+msgstr "烏玆別克語"
+
+#: ism/src/scim_utility.cpp:794 ism/src/scim_utility.cpp:908
+msgid "Vietnamese"
+msgstr "越南文"
+
+#: ism/src/scim_utility.cpp:795
+msgid "Walloon"
+msgstr "華隆語"
+
+#: ism/src/scim_utility.cpp:796 ism/src/scim_utility.cpp:797
+msgid "Yiddish"
+msgstr "依地語"
+
+#: ism/src/scim_utility.cpp:798
+msgid "Chinese"
+msgstr "中文"
+
+#: ism/src/scim_utility.cpp:799 ism/src/scim_utility.cpp:801
+msgid "Chinese (Simplified)"
+msgstr "簡體中文"
+
+#: ism/src/scim_utility.cpp:800 ism/src/scim_utility.cpp:802
+msgid "Chinese (Traditional)"
+msgstr "繁體中文"
+
+#: ism/src/scim_utility.cpp:804
+msgid "Dutch (Standard)"
+msgstr "荷蘭語(標準)"
+
+#: ism/src/scim_utility.cpp:805
+msgid "Dutch (Belgian)"
+msgstr "荷蘭語(比利時)"
+
+#: ism/src/scim_utility.cpp:806
+msgid "English (United States)"
+msgstr "英文(美國)"
+
+#: ism/src/scim_utility.cpp:807
+msgid "English (United Kingdom)"
+msgstr "英文(加拿大)"
+
+#: ism/src/scim_utility.cpp:810
+msgid "English (New Zealand)"
+msgstr "英文(新西蘭)"
+
+#: ism/src/scim_utility.cpp:811
+msgid "English (Irish)"
+msgstr "英文(愛爾蘭)"
+
+#: ism/src/scim_utility.cpp:812
+msgid "English (South Africa)"
+msgstr "英文(南非)"
+
+#: ism/src/scim_utility.cpp:813
+msgid "English (Jamaica)"
+msgstr "英文(牙買加)"
+
+#: ism/src/scim_utility.cpp:814
+msgid "English (Belize)"
+msgstr "英文(伯利茲)"
+
+#: ism/src/scim_utility.cpp:815
+msgid "English (Trinidad)"
+msgstr "英文(特立尼達)"
+
+#: ism/src/scim_utility.cpp:816
+msgid "English (Zimbabwe)"
+msgstr "英文(津巴布韋)"
+
+#: ism/src/scim_utility.cpp:817
+msgid "English (Philippines)"
+msgstr "英文(菲律賓)"
+
+#: ism/src/scim_utility.cpp:818
+msgid "French (Standard)"
+msgstr "法文(標準)"
+
+#: ism/src/scim_utility.cpp:819
+msgid "French (Belgian)"
+msgstr "法文(比利時)"
+
+#: ism/src/scim_utility.cpp:820 ism/src/scim_keyboard_layout_data.h:4604
+msgid "French (Canadian)"
+msgstr "法文(加拿大)"
+
+#: ism/src/scim_utility.cpp:821
+msgid "French (Swiss)"
+msgstr "德文(瑞士)"
+
+#: ism/src/scim_utility.cpp:822
+msgid "French (Luxembourg)"
+msgstr "法文(盧森堡)"
+
+#: ism/src/scim_utility.cpp:823
+msgid "French (Monaco)"
+msgstr "法文(摩納哥)"
+
+#: ism/src/scim_utility.cpp:824
+msgid "German (Standard)"
+msgstr "德文(標準)"
+
+#: ism/src/scim_utility.cpp:825 ism/src/scim_keyboard_layout_data.h:4608
+msgid "German (Swiss)"
+msgstr "德文(瑞士)"
+
+#: ism/src/scim_utility.cpp:826
+msgid "German (Austrian)"
+msgstr "英文(澳洲)"
+
+#: ism/src/scim_utility.cpp:827
+msgid "German (Luxembourg)"
+msgstr "德文(盧森堡)"
+
+#: ism/src/scim_utility.cpp:828
+msgid "German (Liechtenstein)"
+msgstr "德文(列支敦士登)"
+
+#: ism/src/scim_utility.cpp:829
+msgid "Italian (Standard)"
+msgstr "意大利文(標準)"
+
+#: ism/src/scim_utility.cpp:830
+msgid "Italian (Swiss)"
+msgstr "意大利文(瑞士)"
+
+#: ism/src/scim_utility.cpp:831
+msgid "Portuguese (Brazilian)"
+msgstr "葡萄牙文(巴西)"
+
+#: ism/src/scim_utility.cpp:832
+msgid "Portuguese (Standard)"
+msgstr "葡萄牙文(標準)"
+
+#: ism/src/scim_utility.cpp:833
+msgid "Spanish (Traditional Sort)"
+msgstr "西班牙文(傳統)"
+
+#: ism/src/scim_utility.cpp:834
+msgid "Spanish (Mexican)"
+msgstr "西班牙文(墨西哥)"
+
+#: ism/src/scim_utility.cpp:835
+msgid "Spanish (Guatemala)"
+msgstr "西班牙文(危地馬拉)"
+
+#: ism/src/scim_utility.cpp:836
+msgid "Spanish (Costa Rica)"
+msgstr "西班牙文(哥斯達黎加)"
+
+#: ism/src/scim_utility.cpp:837
+msgid "Spanish (Panama)"
+msgstr "西班牙文(巴拿馬)"
+
+#: ism/src/scim_utility.cpp:838
+msgid "Spanish (Dominican Republic)"
+msgstr "西班牙文(多米尼加共和國)"
+
+#: ism/src/scim_utility.cpp:839
+msgid "Spanish (Venezuela)"
+msgstr "西班牙文(委內瑞拉)"
+
+#: ism/src/scim_utility.cpp:840
+msgid "Spanish (Colombia)"
+msgstr "西班牙文(哥倫比亞)"
+
+#: ism/src/scim_utility.cpp:841
+msgid "Spanish (Peru)"
+msgstr "西班牙文(秘魯)"
+
+#: ism/src/scim_utility.cpp:842
+msgid "Spanish (Argentina)"
+msgstr "西班牙文(阿根廷)"
+
+#: ism/src/scim_utility.cpp:843
+msgid "Spanish (Ecuador)"
+msgstr "西班牙文(厄瓜多爾)"
+
+#: ism/src/scim_utility.cpp:844
+msgid "Spanish (Chile)"
+msgstr "西班牙文(智利)"
+
+#: ism/src/scim_utility.cpp:845
+msgid "Spanish (Uruguay)"
+msgstr "西班牙文(烏拉圭)"
+
+#: ism/src/scim_utility.cpp:846
+msgid "Spanish (Paraguay)"
+msgstr "西班牙文(巴拉圭)"
+
+#: ism/src/scim_utility.cpp:847
+msgid "Spanish (Bolivia)"
+msgstr "西班牙文(玻利維亞)"
+
+#: ism/src/scim_utility.cpp:848
+msgid "Spanish (El Salvador)"
+msgstr "西班牙文(薩爾瓦多)"
+
+#: ism/src/scim_utility.cpp:849
+msgid "Spanish (Honduras)"
+msgstr "西班牙文(洪都拉斯)"
+
+#: ism/src/scim_utility.cpp:850
+msgid "Spanish (Nicaragua)"
+msgstr "西班牙文(尼加拉瓜)"
+
+#: ism/src/scim_utility.cpp:851
+msgid "Spanish (Puerto Rico)"
+msgstr "西班牙文(波多黎各)"
+
+#: ism/src/scim_utility.cpp:855
+msgid "Afrikaans"
+msgstr "南非語"
+
+#: ism/src/scim_utility.cpp:858
+msgid "Malay (Malaysia)"
+msgstr "馬來文(馬來西亞)"
+
+#: ism/src/scim_utility.cpp:859
+msgid "Malay (Brunei Darussalam)"
+msgstr "馬來文(文萊)"
+
+#: ism/src/scim_utility.cpp:860 ism/src/scim_keyboard_layout_data.h:4613
+msgid "Norwegian"
+msgstr "挪威語"
+
+#: ism/src/scim_utility.cpp:867
+msgid "Serbian (Latin)"
+msgstr "塞爾維亞語(拉丁)"
+
+#: ism/src/scim_utility.cpp:878
+msgid "Serbian (Cyrillic)"
+msgstr "塞爾維亞語(西里爾)"
+
+#: ism/src/scim_utility.cpp:881
+msgid "Uzbek (Latin)"
+msgstr "烏茲別克語(拉丁)"
+
+#: ism/src/scim_utility.cpp:884
+msgid "Chinese (Taiwan)"
+msgstr "中文(台灣)"
+
+#: ism/src/scim_utility.cpp:885
+msgid "Chinese (Hongkong)"
+msgstr "中文(香港)"
+
+#: ism/src/scim_utility.cpp:886
+msgid "Chinese (Macau)"
+msgstr "中文(澳門)"
+
+#: ism/src/scim_utility.cpp:887
+msgid "Chinese (PRC)"
+msgstr "中文(中華人民共和國)"
+
+#: ism/src/scim_utility.cpp:888
+msgid "Chinese (Singapore)"
+msgstr "中文(新加坡)"
+
+#: ism/src/scim_utility.cpp:891
+msgid "Arabic (Saudi Arabia)"
+msgstr "阿拉伯文(沙特阿拉伯)"
+
+#: ism/src/scim_utility.cpp:892
+msgid "Arabic (Iraq)"
+msgstr "阿拉伯文(伊拉克)"
+
+#: ism/src/scim_utility.cpp:894
+msgid "Arabic (Libya)"
+msgstr "阿拉伯文(利比亞)"
+
+#: ism/src/scim_utility.cpp:895
+msgid "Arabic (Algeria)"
+msgstr "阿拉伯文(阿爾及利亞)"
+
+#: ism/src/scim_utility.cpp:896
+msgid "Arabic (Morocco)"
+msgstr "阿拉伯文(摩洛哥)"
+
+#: ism/src/scim_utility.cpp:897
+msgid "Arabic (Tunisia)"
+msgstr "阿拉伯文(突尼斯)"
+
+#: ism/src/scim_utility.cpp:898
+msgid "Arabic (Oman)"
+msgstr "阿拉伯文(阿曼)"
+
+#: ism/src/scim_utility.cpp:899
+msgid "Arabic (Yemen)"
+msgstr "阿拉伯文(也門)"
+
+#: ism/src/scim_utility.cpp:900
+msgid "Arabic (Syria)"
+msgstr "阿拉伯文(敘利亞)"
+
+#: ism/src/scim_utility.cpp:901
+msgid "Arabic (Jordan)"
+msgstr "阿拉伯文(約旦)"
+
+#: ism/src/scim_utility.cpp:903
+msgid "Arabic (Kuwait)"
+msgstr "阿拉伯文(科威特)"
+
+#: ism/src/scim_utility.cpp:904
+msgid "Arabic (UAE)"
+msgstr "阿拉伯文(阿聯酋)"
+
+#: ism/src/scim_utility.cpp:905
+msgid "Arabic (Bahrain)"
+msgstr "阿拉伯文(巴林)"
+
+#: ism/src/scim_utility.cpp:906
+msgid "Arabic (Qatar)"
+msgstr "阿拉伯文(卡塔爾)"
+
+#: ism/src/scim_utility.cpp:920
+msgid "Hausa"
+msgstr "豪薩文"
+
+#: ism/src/scim_utility.cpp:924
+msgid "Xhosa"
+msgstr "科薩語"
+
+#: ism/src/scim_utility.cpp:925
+msgid "Yoruba"
+msgstr "約魯巴語"
+
+#: ism/src/scim_utility.cpp:926
+msgid "Zulu"
+msgstr "祖魯語"
+
+#: ism/src/scim_utility.cpp:1024
+msgid "Other"
+msgstr "其它語"
+
+#: ism/src/scim_keyboard_layout_data.h:4592
+#: ism/modules/imengine/scim_socket_imengine.cpp:408
+#: ism/modules/imengine/scim_socket_imengine.cpp:438
+#: ism/modules/imengine/scim_socket_imengine.cpp:523
+#: ism/modules/imengine/scim_socket_imengine.cpp:553
+#: ism/modules/imengine/scim_socket_imengine.cpp:583
+msgid "Unknown"
+msgstr "未知"
+
+#: ism/src/scim_keyboard_layout_data.h:4593
+msgid "English (US)"
+msgstr "英文"
+
+#: ism/src/scim_keyboard_layout_data.h:4594
+msgid "Belgian"
+msgstr "比利時語"
+
+#: ism/src/scim_keyboard_layout_data.h:4597
+msgid "Czech (qwerty)"
+msgstr "捷克(標準鍵盤)"
+
+#: ism/src/scim_keyboard_layout_data.h:4600
+msgid "Dvorak"
+msgstr "德沃夏克鍵盤"
+
+#: ism/src/scim_keyboard_layout_data.h:4605
+msgid "French (Switzerland)"
+msgstr "法文(瑞士)"
+
+#: ism/src/scim_keyboard_layout_data.h:4607
+msgid "German (with deadkeys)"
+msgstr "德文(有deadkeys)"
+
+#: ism/src/scim_keyboard_layout_data.h:4617
+msgid "Portuguese (Brazil US accents)"
+msgstr "葡萄牙文(巴西、美式發音)"
+
+#: ism/src/scim_keyboard_layout_data.h:4620
+msgid "Slovak (qwerty)"
+msgstr "斯洛伐克語(標準鍵盤)"
+
+#: ism/src/scim_keyboard_layout_data.h:4623
+msgid "Spanish (CP 850)"
+msgstr "西班牙文(CP 850)"
+
+#: ism/src/scim_keyboard_layout_data.h:4624
+msgid "Spanish (Latin America)"
+msgstr "西班牙文(拉丁美洲)"
+
+#: ism/src/scim_keyboard_layout_data.h:4627
+msgid "English (UK)"
+msgstr "英式英文"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:57
+msgid "Simplified-Traditional Chinese Conversion"
+msgstr "繁簡體中文轉換"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:60
+msgid "Convert between Simplified Chinese and Traditional Chinese"
+msgstr "繁簡體中文互轉"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:71
+msgid "SC-TC"
+msgstr "繁簡體轉換"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:73
+#: ism/modules/filter/scim_sctc_filter.cpp:78
+msgid "Simplified-Traditional Chinese conversion"
+msgstr "繁簡體中文轉換"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:76
+msgid "No Conversion"
+msgstr "不轉換"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:81
+msgid "Simplified to Traditional"
+msgstr "簡體轉繁體中文"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:83
+msgid "Convert Simplified Chinese to Traditional Chinese"
+msgstr "轉換簡體中文為繁體中文"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:86
+msgid "Traditional to Simplified"
+msgstr "繁體轉簡體中文"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:88
+msgid "Convert Traditional Chinese to Simplified Chinese"
+msgstr "轉換繁體中文為簡體中文"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:300
+msgid "James Su <suzhe@tsinghua.org.cn>"
+msgstr "蘇哲 <suzhe@tsinghua.org.cn>"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:425
+#: ism/modules/filter/scim_sctc_filter.cpp:555
+#: ism/modules/filter/scim_sctc_filter.cpp:571
+msgid "SC->TC"
+msgstr "簡轉繁體"
+
+#: ism/modules/filter/scim_sctc_filter.cpp:431
+#: ism/modules/filter/scim_sctc_filter.cpp:559
+#: ism/modules/filter/scim_sctc_filter.cpp:575
+msgid "TC->SC"
+msgstr "繁轉簡體"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1693
+msgid "Smart Common Input Method platform "
+msgstr "泛用智慧型輸入法平台"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1695
+msgid ""
+"\n"
+"(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n"
+"\n"
+msgstr ""
+"\n"
+"(C) 2002-2005 蘇哲 <suzhe@tsinghua.org.cn>\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1700
+msgid ""
+":\n"
+"\n"
+msgstr ""
+":\n"
+"\n"
+
+#: ism/extras/gtk2_immodule/gtkimcontextscim.cpp:1703
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:963
+msgid "Enable"
+msgstr "開啟"
+
+#. gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+#. gtk_tree_view_column_set_fixed_width (column, 232);
+#: ism/extras/gtk_panel/scim_panel_gtk.cpp:984
+msgid "Name"
+msgstr "名稱"
+
+#: ism/utils/scimstringview.c:201
+msgid "Cursor Position"
+msgstr "游標位置"
+
+#: ism/utils/scimstringview.c:202
+msgid "The current position of the insertion cursor in chars."
+msgstr "在字元中插入的游標的所在位置。"
+
+#: ism/utils/scimstringview.c:211
+msgid "Maximum length"
+msgstr "最大長度"
+
+#: ism/utils/scimstringview.c:212
+msgid "Maximum number of characters for this string view. Zero if no maximum."
+msgstr "這個字串視窗最長可以容衲多少字元。設定值為 0 則表示無限制。"
+
+#: ism/utils/scimstringview.c:221
+msgid "Maximum width"
+msgstr "最大寬度"
+
+#: ism/utils/scimstringview.c:222
+msgid "Maximum width of this string view."
+msgstr "這個字串視窗的最大寬度。"
+
+#: ism/utils/scimstringview.c:231
+msgid "Has Frame"
+msgstr "有外框"
+
+#: ism/utils/scimstringview.c:232
+msgid "FALSE removes outside bevel from string view."
+msgstr "無效時,移除字串視窗的外部斜邊。"
+
+#: ism/utils/scimstringview.c:239
+msgid "Draw cursor"
+msgstr "繪製游標"
+
+#: ism/utils/scimstringview.c:240
+msgid "TRUE draw blinking cursor."
+msgstr "啟用時,繪製閃爍游標"
+
+#: ism/utils/scimstringview.c:247
+msgid "Auto move cursor"
+msgstr "自動移動游標"
+
+#: ism/utils/scimstringview.c:248
+msgid "TRUE auto move cursor position when mouse clicking."
+msgstr "啟用時,當滑鼠點選時會自動移動游標。"
+
+#: ism/utils/scimstringview.c:255
+msgid "Forward button press/release event"
+msgstr "轉送按鍵事件"
+
+#: ism/utils/scimstringview.c:256
+msgid "TRUE forward button press/release event to user program."
+msgstr "啟用時,轉送鍵擊事件給使用者程式。"
+
+#: ism/utils/scimstringview.c:263
+msgid "Auto resize the widget to fit the string"
+msgstr "根據字串自動調整邊框大小"
+
+#: ism/utils/scimstringview.c:264
+msgid "TRUE Auto resize on."
+msgstr "啟用時,自動調整大小。"
+
+#: ism/utils/scimstringview.c:271
+msgid "Emit move_cursor signal when press/release the string"
+msgstr ""
+
+#: ism/utils/scimstringview.c:272
+msgid "TRUE Emit move_cursor signal when press the string."
+msgstr "啟用時,當滑鼠點選時會自動移動游標。"
+
+#: ism/utils/scimstringview.c:279
+msgid "Width in chars"
+msgstr "字元寬度"
+
+#: ism/utils/scimstringview.c:280
+msgid "Number of characters to leave space for in the string view."
+msgstr "在字串視窗裡所保留的空白字元數。"
+
+#: ism/utils/scimstringview.c:289
+msgid "Scroll offset"
+msgstr "捲軸位移"
+
+#: ism/utils/scimstringview.c:290
+msgid "Number of pixels of the string view scrolled off the screen to the left"
+msgstr "字串視窗距離螢幕左邊的像素值"
+
+#: ism/utils/scimstringview.c:299
+msgid "Text"
+msgstr "文字"
+
+#: ism/utils/scimstringview.c:300
+msgid "The contents of the string view"
+msgstr "字串視窗的說明"
+
+#: ism/utils/scimkeyselection.cpp:161
+msgid "Selected _Keys:"
+msgstr "選定的按鍵(_K):"
+
+#: ism/utils/scimkeyselection.cpp:206
+msgid "Key Code:"
+msgstr "鍵值:"
+
+#: ism/utils/scimkeyselection.cpp:224
+msgid "....."
+msgstr "..."
+
+#: ism/utils/scimkeyselection.cpp:229
+msgid "Modifiers:"
+msgstr "作用鍵:"
+
+#: ism/utils/scimkeyselection.cpp:242
+msgid "_Ctrl"
+msgstr "_Ctrl"
+
+#: ism/utils/scimkeyselection.cpp:246
+msgid "A_lt"
+msgstr "A_lt"
+
+#: ism/utils/scimkeyselection.cpp:250
+msgid "_Shift"
+msgstr "_Shift"
+
+#: ism/utils/scimkeyselection.cpp:254
+msgid "_Release"
+msgstr "放開(_R)"
+
+#: ism/utils/scimkeyselection.cpp:264
+msgid "_Meta"
+msgstr "_Meta"
+
+#: ism/utils/scimkeyselection.cpp:268
+msgid "S_uper"
+msgstr "S_uper"
+
+#: ism/utils/scimkeyselection.cpp:272
+msgid "_Hyper"
+msgstr "_Hyper"
+
+#: ism/utils/scimkeyselection.cpp:337
+msgid "Please enter a Key Code first."
+msgstr "請先輸入一個鍵值。"
+
+#: ism/utils/scimkeyselection.cpp:391
+msgid ""
+"Press a key (or a key combination).\n"
+"This dialog will be closed \n"
+"when the key is released."
+msgstr ""
+"請按一個按鍵或組合鍵。\n"
+"本對話框會在按鍵釋放時關閉。"
+
+#: ism/utils/scimkeyselection.cpp:395
+msgid "Grabbing a key."
+msgstr "捕捉按鍵"
+
+#: ism/utils/scimkeyselection.cpp:686
+msgid "Key Selection"
+msgstr "選擇按鍵"
+
+#: ism/utils/scimtrayicon.c:108
+msgid "Orientation"
+msgstr "方位"
+
+#: ism/utils/scimtrayicon.c:109
+msgid "The orientation of the tray."
+msgstr "狀態列的方位。"
+
+#~ msgid "Automatic"
+#~ msgstr "自動"
+
+#~ msgid "Always used"
+#~ msgstr "永遠"
+
+#~ msgid "%s Option"
+#~ msgstr "選項設定"
+
+#~ msgid "Keyboards"
+#~ msgstr "英文鍵盤"
+
+#~ msgid "English/European"
+#~ msgstr "英文/歐洲語文"
+
+#~ msgid "RAW CODE"
+#~ msgstr "內碼輸入"
+
+#~ msgid "(C) 2002-2006 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr "(C) 2002-2006 蘇哲 <suzhe@tsinghua.org.cn>"
+
+#~ msgid ""
+#~ "Hot Keys:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " switch between Multibyte encoding and Unicode.\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " reset the input method.\n"
+#~ msgstr ""
+#~ "快捷鍵:\n"
+#~ "\n"
+#~ " Control+u:\n"
+#~ " 切換地區編碼和 Unicode 編碼。\n"
+#~ "\n"
+#~ " Esc:\n"
+#~ " 重設輸入法。\n"
+
+#~ msgid "The status of the current input method. Click to change it."
+#~ msgstr "目前輸入法的模式狀態,滑鼠點選可切換模式。"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Global Setup"
+#~ msgstr "全域設定"
+
+#~ msgid ""
+#~ "Setup the global options used by All FrontEnd modules, including X11 "
+#~ "FrontEnd, GTK IMModule, QT IMModule etc."
+#~ msgstr ""
+#~ "調整所有介面模組的共通設定,包含 X11 介面、GTK+ IMModule、Qt IMModule 等"
+
+#~ msgid "_Trigger:"
+#~ msgstr "作用鍵(_T):"
+
+#~ msgid "Select the trigger keys"
+#~ msgstr "選擇輸入法的作用鍵"
+
+#~ msgid ""
+#~ "The key events to turn on/off SCIM input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr "用來 開啟/關閉 SCIM 輸入法的作用鍵,點壓該按鈕後可編輯。"
+
+#~ msgid "Turn _On:"
+#~ msgstr "開啟(_O)"
+
+#~ msgid "Select the Turn On keys"
+#~ msgstr "選擇開啟 SCIM 按鍵"
+
+#~ msgid ""
+#~ "The key events to turn on SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "用來開啟 SCIM 輸入法,點壓該按鈕後可編輯。"
+
+#~ msgid "Turn O_ff:"
+#~ msgstr "關閉 (_F)"
+
+#~ msgid "Select the Turn Off keys"
+#~ msgstr "選擇關閉 SCIM 按鍵"
+
+#~ msgid ""
+#~ "The key events to turn off SCIM input method. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "用來關閉 SCIM 輸入法,點壓該按鈕後可編輯。"
+
+#~ msgid "_Next input method:"
+#~ msgstr "下一種輸入法(_N):"
+
+#~ msgid "Select the next input method keys"
+#~ msgstr "選擇下一種輸入法按鍵"
+
+#~ msgid ""
+#~ "The key events to switch to the next input method. Click on the button on "
+#~ "the right to edit it."
+#~ msgstr "用來切換至下一種輸入法的按鍵,按鈕上滑鼠點選可編輯。"
+
+#~ msgid "_Previous input method:"
+#~ msgstr "上一種輸入法(_P):"
+
+#~ msgid "Select the previous input method keys"
+#~ msgstr "選擇上一種輸入法按鍵"
+
+#~ msgid ""
+#~ "The key events to switch to the previous input method. Click on the "
+#~ "button on the right to edit it."
+#~ msgstr "用來切換至上一種輸入法的按鍵,點壓按鈕後可編輯。"
+
+#~ msgid "Show input method _menu:"
+#~ msgstr "顯示輸入法選單(_M):"
+
+#~ msgid "Select the show input method menu keys"
+#~ msgstr "選擇顯示輸入法選單按鍵"
+
+#~ msgid ""
+#~ "The key events to show the input method menu. Click on the button on the "
+#~ "right to edit it."
+#~ msgstr "用來顯示輸入法選單的按鍵,點壓按鈕後可編輯。"
+
+#~ msgid "_Keyboard Layout:"
+#~ msgstr "鍵盤排列(_K):"
+
+#~ msgid ""
+#~ "You should choose your currently used keyboard layout here so that input "
+#~ "methods, who care about keyboard layout, could work correctly."
+#~ msgstr "您應適當挑選鍵盤排列方式,這樣輸入法才能正確運作。"
+
+#~ msgid "_Embed Preedit String into client window"
+#~ msgstr "在輸入法客戶端視窗嵌入預先編輯字串(_E)"
+
+#~ msgid ""
+#~ "If this option is checked, the preedit string will be displayed directly "
+#~ "in the client input window, rather than in a independent float window."
+#~ msgstr ""
+#~ "如果勾取這個選項,預先編輯字串將會直接顯示於輸入法客戶端,而非出現於獨立的"
+#~ "浮動視窗"
+
+#~ msgid "_Share the same input method among all applications"
+#~ msgstr "在所有的應用程式共享同樣的輸入法(_S)"
+
+#~ msgid ""
+#~ "If this option is checked, then only one input method could be used by "
+#~ "all applications at the same time.Otherwise different input method could "
+#~ "be used by each application."
+#~ msgstr ""
+#~ "如果啟用本選項,所有應用程式在一時間將只會有一個輸入法,否則個別的應用程式"
+#~ "可以使用不同的輸入法。"
+
+#~ msgid "Hotkeys"
+#~ msgstr "快速鍵"
+
+#~ msgid ""
+#~ "You can enable/disable input methods and set hotkeys for input methods "
+#~ "here."
+#~ msgstr "你可在此開啟或關閉已安裝的輸入法,並設定快速鍵"
+
+#~ msgid "The installed input method services:"
+#~ msgstr "已安裝的輸入法服務:"
+
+#~ msgid "Edit _Hotkeys"
+#~ msgstr "編輯快速鍵(_H)"
+
+#~ msgid "Edit Hotkeys associated with the selected input method."
+#~ msgstr "編輯所選取輸入法關連的快速鍵"
+
+#~ msgid "Select _Filters"
+#~ msgstr "選定的轉換過濾器(_F)"
+
+#~ msgid "Select the Filters which will be attached to this input method."
+#~ msgstr "選擇施加到輸入法的轉換過濾器"
+
+#~ msgid "_Expand"
+#~ msgstr "展開(_E)"
+
+#~ msgid "Expand all language categories."
+#~ msgstr "展開所有語言目錄"
+
+#~ msgid "_Collapse"
+#~ msgstr "折疊(_C)"
+
+#~ msgid "Collapse all language categories."
+#~ msgstr "折疊所有語言目錄"
+
+#~ msgid "E_nable All"
+#~ msgstr "使用所有的輸入法(_E)"
+
+#~ msgid "Enable all input methods."
+#~ msgstr "使用所有輸入法"
+
+#~ msgid "_Disable All"
+#~ msgstr "停用所有輸入法(_D)"
+
+#~ msgid "Disable all input methods."
+#~ msgstr "停用所有輸入法"
+
+#~ msgid "Filters"
+#~ msgstr "轉換過濾器"
+
+#~ msgid "Languages"
+#~ msgstr "語文"
+
+#~ msgid "Description"
+#~ msgstr "描述"
+
+#~ msgid "Edit Hotkeys for %s"
+#~ msgstr "編輯 %s 的快速鍵"
+
+#~ msgid "Select Filters for %s"
+#~ msgstr "編輯 %s 的轉換過濾器"
+
+#~ msgid "Move _Up"
+#~ msgstr "上移(_U)"
+
+#~ msgid "Move _Down"
+#~ msgstr "下移(_D)"
+
+#~ msgid "GTK"
+#~ msgstr "GTK+"
+
+#~ msgid "A panel daemon based on GTK+-2.x library."
+#~ msgstr "一個使用 GTK+-2.x 撰寫的操控面板背景程式。"
+
+#~ msgid "On demand"
+#~ msgstr "需要時"
+
+#~ msgid "Never"
+#~ msgstr "從不"
+
+#~ msgid "ToolBar"
+#~ msgstr "工具列"
+
+#~ msgid "_Show:"
+#~ msgstr "顯示(_S):"
+
+#~ msgid "Auto s_nap"
+#~ msgstr "自動靠邊(_N)"
+
+#~ msgid "Show _input method icon"
+#~ msgstr "顯示輸入法圖示(_I)"
+
+#~ msgid "Show inp_ut method name"
+#~ msgstr "顯示輸入法名稱(_U)"
+
+#~ msgid "Hide time_out:"
+#~ msgstr "逾時隱藏(_O):"
+
+#~ msgid "Show s_tick icon"
+#~ msgstr "顯示固定圖示(_T)"
+
+#~ msgid "Show m_enu icon"
+#~ msgstr "顯示選單圖示(_E)"
+
+#~ msgid "Show _help icon"
+#~ msgstr "顯示求助圖示(_H)"
+
+#~ msgid "Show _property label"
+#~ msgstr "顯示屬性名稱(_P)"
+
+#~ msgid "Input window"
+#~ msgstr "輸入視窗"
+
+#~ msgid "E_mbedded lookup table"
+#~ msgstr "嵌入式選詞列表(_M)"
+
+#~ msgid "_Vertical lookup table"
+#~ msgstr "垂直式選詞列表(_V)"
+
+#~ msgid "Misc"
+#~ msgstr "其它"
+
+#~ msgid "Show tra_y icon"
+#~ msgstr "顯示系統列圖示(_Y)"
+
+#~ msgid "Stick _windows"
+#~ msgstr "固定視窗(_W)"
+
+#~ msgid "_Font:"
+#~ msgstr "字形(_F):"
+
+#~ msgid ""
+#~ "If option \"Always\" is selected, the toolbar will always be shown on the "
+#~ "screen. If option \"On demand\" is selected, it will only be shown when "
+#~ "SCIM is activated. If option \"Never\" is selected, it will never be "
+#~ "shown."
+#~ msgstr ""
+#~ "如果選取「永遠」選項,工具列將永遠顯示在螢幕上。如果選取「需要時」選項,則"
+#~ "只有當 SCIM 被啟用時才會顯示工具列。如果選取「從不」選項,則永遠不會顯示工"
+#~ "具列。"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar will be snapped to the screen "
+#~ "border."
+#~ msgstr "如果勾取這個選項,工具列將緊黏在螢幕邊緣。"
+
+#~ msgid ""
+#~ "The toolbar will be hidden out after this timeout is elapsed. This option "
+#~ "is only valid when \"Always show\" is selected. Set to zero to disable "
+#~ "this behavior."
+#~ msgstr ""
+#~ "在經過一定時間後,工具列將被隱藏起來,該選項只在選取「永遠顯示」時才會作"
+#~ "用。當設定值為 0 時,將關閉此功能。"
+
+#~ msgid ""
+#~ "If this option is checked, the input method icon will be showed on the "
+#~ "toolbar."
+#~ msgstr "如果勾取這個選項,輸入法圖示將顯示在工具列上。"
+
+#~ msgid ""
+#~ "If this option is checked, the input method name will be showed on the "
+#~ "toolbar."
+#~ msgstr "如果勾取這個選項,輸入法名稱將顯示在工具列上。"
+
+#~ msgid ""
+#~ "If this option is checked, the stick icon will be showed on the toolbar."
+#~ msgstr "如果勾取這個選項,固定圖示將顯示在工具列上。"
+
+#~ msgid ""
+#~ "If this option is checked, the menu icon will be showed on the toolbar."
+#~ msgstr "如果勾取這個選項,選單圖示將顯示在工具列上。"
+
+#~ msgid ""
+#~ "If this option is checked, the help icon will be showed on the toolbar."
+#~ msgstr "如果勾取這個選項,求助圖示將顯示在工具列上。"
+
+#~ msgid ""
+#~ "If this option is checked, the text label of input method properties will "
+#~ "be showed on the toolbar."
+#~ msgstr "如果勾取這個選項,輸入法屬性的名稱將顯示在工具列上。"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be embedded into the "
+#~ "input window."
+#~ msgstr "如果勾取這個選項,選詞列表將出現在輸入視窗中。"
+
+#~ msgid ""
+#~ "If this option is checked, the lookup table will be displayed vertically."
+#~ msgstr "如果勾取這個選項,選詞列表將垂直顯示。"
+
+#~ msgid ""
+#~ "If this option is checked, the tray icon will be showed on the desktop's "
+#~ "taskbar."
+#~ msgstr "如果勾取這個選項,系統圖示將顯示在桌面的工作列上。"
+
+#~ msgid ""
+#~ "If this option is checked, the toolbar, input and lookup table windows "
+#~ "will be sticked to its original position."
+#~ msgstr "如果勾取這個選項,則輸入和選詞列表視窗將停留在它們的原本位置。"
+
+#~ msgid "The font setting will be used in the input and lookup table windows."
+#~ msgstr "該字形設定將套用於輸入和選詞列表視窗。"
+
+#~ msgid "Select Interface Font"
+#~ msgstr "選擇介面字形"
+
+#~ msgid "SCIM"
+#~ msgstr "SCIM"
+
+#~ msgid "FrontEnd"
+#~ msgstr "介面(前端)"
+
+#~ msgid "IMEngine"
+#~ msgstr "輸入法引擎"
+
+#~ msgid "Panel"
+#~ msgstr "面板"
+
+#~ msgid "Extra"
+#~ msgstr "附加項目"
+
+#~ msgid "SCIM Input Method Setup"
+#~ msgstr "SCIM 輸入法設定"
+
+#~ msgid ""
+#~ " <span size=\"20000\">Smart Common Input Method platform</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">GUI Setup Utility</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">Copyright 2002-2004, James Su <suzhe@tsinghua.org."
+#~ "cn></span>"
+#~ msgstr ""
+#~ " <span size=\"20000\">泛用智慧型輸入法平台</span> \n"
+#~ "\n"
+#~ "<span size=\"16000\" style=\"italic\">圖形介面設定工具</span>\n"
+#~ "\n"
+#~ "\n"
+#~ "\n"
+#~ "<span size=\"12000\">版權所有 2002-2004, 蘇 哲 <suzhe@tsinghua.org."
+#~ "cn></span>"
+
+#~ msgid "<span size=\"x-large\">The Setup for %s modules.</span>"
+#~ msgstr "<span size=\"x-large\">%s 模組的設定。</span>"
+
+#~ msgid "Are you sure you want to quit SCIM Setup?"
+#~ msgstr "是否關閉 SCIM 設定程式?"
+
+#~ msgid ""
+#~ "Not all configuration can be reloaded on the fly. Don't forget to restart "
+#~ "SCIM in order to let all of the new configuration take effect."
+#~ msgstr "並非所有設定都可以立即生效。別忘了重新啟動 SCIM 來讓新的設定生效。"
+
+#~ msgid "SCIM Setup"
+#~ msgstr "SCIM 設定"
+
+#~ msgid "Integrated Setup Utility based on GTK Widget library."
+#~ msgstr "以 GTK+ 撰寫的整合設定工具。"
+
+#~ msgid "Setup utility for Smart Common Input Method platform"
+#~ msgstr "泛用智慧型輸入法平台的設定工具"
+
+#~ msgid "SCIM Help"
+#~ msgstr "求助 SCIM"
+
+#~ msgid "Smart Common Input Method"
+#~ msgstr "泛用智慧型輸入法平台"
+
+#~ msgid "Stick/unstick the input window and the toolbar."
+#~ msgstr "固定/釋開 輸入視窗和工具列。"
+
+#~ msgid "Show a brief help about SCIM and the current input method."
+#~ msgstr "顯示關於 SCIM 和目前輸入法的精簡說明。"
+
+#~ msgid "Show command menu."
+#~ msgstr "顯示指令選單."
+
+#~ msgid ""
+#~ "\n"
+#~ "(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>"
+#~ msgstr ""
+#~ "\n"
+#~ "(c) 2002-2005 蘇哲 <suzhe@tsinghua.org.cn>"
+
+#~ msgid "Reload Configuration"
+#~ msgstr "重新載入設定值"
+
+#~ msgid "Stick Windows"
+#~ msgstr "固定視窗"
+
+#~ msgid "Hide Toolbar"
+#~ msgstr "隱藏工具列"
+
+#~ msgid "Help ..."
+#~ msgstr "求助 ..."
+
+#~ msgid "Exit"
+#~ msgstr "離開"
+
+#~ msgid "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+#~ msgstr "zh_CN,zh_TW,zh_HK,zh_SG,ja_JP,ko_KR"
+
+#~ msgid "En"
+#~ msgstr "英"
--- /dev/null
+#!/bin/sh
+
+case "$1" in
+update)
+;;
+install)
+echo "install"
+;;
+configure)
+;;
+remove)
+echo "rm -rf @PREFIX@/lib/scim-1.0"
+rm -rf @PREFIX@/lib/scim-1.0
+;;
+*)
+;;
+esac
+
+exit
--- /dev/null
+ISF 2.3.4821 :
+ 1. Initial Release
+
--- /dev/null
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+localedir=@datadir@/locale
+datadir=@datadir@
+sysconfdir=@sysconfdir@
+
+Name: scim-gtkutils
+Description: GTK Utilities for Smart Common Input Method platform
+Version: @SCIM_VERSION@
+Requires: gtk+-2.0 scim
+Libs: -L${libdir} -lscim-gtkutils@SCIM_EPOCH@
+Cflags: -I${includedir}/scim@SCIM_EPOCH@
--- /dev/null
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+localedir=/usr/share/locale
+datadir=@datadir@
+sysconfdir=@sysconfdir@
+
+scimdatadir=@datadir@/scim
+icondir=@datadir@/scim/icons
+moduledir=@libdir@/scim@SCIM_EPOCH@/@SCIM_BINARY_VERSION@
+
+scim_binary_version=@SCIM_BINARY_VERSION@
+
+Name: SCIM
+Description: Smart Common Input Method platform
+Version: @SCIM_VERSION@
+Requires:
+Libs: -L${libdir} -lscim@SCIM_EPOCH@
+Cflags: -I${includedir}/scim@SCIM_EPOCH@
--- /dev/null
+%define nam @PACKAGE@
+%define ver @VERSION@
+%define rel 1
+%define build_config_socket @SCIM_BUILD_CONFIG_SOCKET@
+%define build_config_simple @SCIM_BUILD_CONFIG_SIMPLE@
+%define build_frontend_x11 @SCIM_BUILD_FRONTEND_X11@
+%define build_frontend_socket @SCIM_BUILD_FRONTEND_SOCKET@
+%define build_imengine_rawcode @SCIM_BUILD_IMENGINE_RAWCODE@
+%define build_imengine_socket @SCIM_BUILD_IMENGINE_SOCKET@
+%define build_gtk2_immodule @SCIM_BUILD_GTK2_IMMODULE@
+%define build_scim_setup @SCIM_BUILD_SCIM_SETUP@
+%define build_panel_gtk @SCIM_BUILD_PANEL_GTK@
+%define build_gtk_utils @SCIM_BUILD_GTK_UTILS@
+%define build_x11_utils @SCIM_BUILD_X11_UTILS@
+%define build_filter_sctc @SCIM_BUILD_FILTER_SCTC@
+
+# Something's not quite right with libtool....
+%define __libtoolize echo
+
+Summary: Smart Chinese/Common Input Method platform
+Name: %{nam}
+Version: %{ver}
+Release: %{rel}
+License: LGPL
+Group: System Environment/Libraries
+URL: http://scim.freedesktop.org
+BuildRoot: %{_tmppath}/%{name}-%{version}-root
+
+Source0: %{name}-%{version}.tar.gz
+#NoSource: 0
+
+PreReq: /sbin/ldconfig, /bin/sh
+
+%if %{build_gtk_utils}
+Requires: glib2 >= 2.0.0
+BuildRequires: glib2-devel >= 2.0.0
+Requires: gtk2 >= @GTK_VERSION@
+BuildRequires: gtk2-devel >= @GTK_VERSION@
+Requires: pango >= 1.0.0
+BuildRequires: pango-devel >= 1.0.0
+%endif
+
+%if %{build_x11_utils}
+Requires: XFree86-libs >= 4.1.0
+BuildRequires: XFree86-devel >= 4.1.0
+%endif
+
+BuildRequires: pkgconfig >= 0.12
+
+%description
+SCIM is a developing platform to significant reduce the difficulty of
+input method development.
+
+%package devel
+Summary: Smart Chinese/Common Input Method platform
+Group: Development/Libraries
+Requires: %{name} = %{version}
+Requires: pkgconfig >= 0.12
+
+%description devel
+The scim-devel package includes the static libraries and header files
+for the scim package.
+
+Install scim-devel if you want to develop programs which will use
+scim.
+
+#--------------------------------------------------
+
+%prep
+
+%setup -n %{name}-%{version}
+
+%build
+CFLAGS="-O3" CXXFLAGS="-O3" \
+%configure \
+%if ! %{build_config_socket}
+ --disable-config-socket \
+%endif
+%if ! %{build_config_simple}
+ --disable-config-simple \
+%endif
+%if ! %{build_frontend_x11}
+ --disable-frontend-x11 \
+%endif
+%if ! %{build_frontend_socket}
+ --disable-frontend-socket \
+%endif
+%if ! %{build_imengine_rawcode}
+ --disable-im-rawcode \
+%endif
+%if ! %{build_imengine_socket}
+ --disable-im-socket \
+%endif
+%if ! %{build_filter_sctc}
+ --disable-filter-sctc \
+%endif
+%if ! %{build_gtk2_immodule}
+ --disable-gtk2-immodule \
+%endif
+%if ! %{build_scim_setup}
+ -disable-setup-ui \
+%endif
+
+
+make
+
+%install
+[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf $RPM_BUILD_ROOT
+
+make DESTDIR=${RPM_BUILD_ROOT} install
+
+mkdir -p ${RPM_BUILD_ROOT}/%{_libdir}/scim@SCIM_EPOCH@/{Config,FrontEnd,IMEngine,SetupUI,Helper,Filter}
+
+rm -f ${RPM_BUILD_ROOT}/%{_libdir}/scim@SCIM_EPOCH@/*/*/*.{a,la}
+rm -f ${RPM_BUILD_ROOT}/@GTK_LIBDIR@/gtk-2.0/immodules/im-scim.{a,la}
+
+# install user manual
+mkdir -p docs/dist/manual/zh_CN/figures/
+
+cp -a docs/manual/zh_CN/user-manual.{html,xml} docs/dist/manual/zh_CN/
+cp -a docs/manual/zh_CN/figures/*.png docs/dist/manual/zh_CN/figures/
+
+%clean
+[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf $RPM_BUILD_ROOT
+
+%post
+/sbin/ldconfig
+
+%if %{build_gtk2_immodule}
+gtk-query-immodules-2.0 > %{_sysconfdir}/gtk-2.0/gtk.immodules
+%endif
+
+%postun
+/sbin/ldconfig
+
+%if %{build_gtk2_immodule}
+gtk-query-immodules-2.0 > %{_sysconfdir}/gtk-2.0/gtk.immodules
+%endif
+
+
+%files
+%defattr(-, root, root)
+%doc AUTHORS COPYING NEWS README ChangeLog TODO
+%doc docs/dist/manual/zh_CN
+%dir %{_sysconfdir}/scim
+%dir %{_libdir}/scim@SCIM_EPOCH@/*/FrontEnd
+%dir %{_libdir}/scim@SCIM_EPOCH@/*/IMEngine
+%dir %{_libdir}/scim@SCIM_EPOCH@/*/Config
+%dir %{_libdir}/scim@SCIM_EPOCH@/*/SetupUI
+%dir %{_libdir}/scim@SCIM_EPOCH@/*/Helper
+%dir %{_libdir}/scim@SCIM_EPOCH@/*/Filter
+%dir %{_libdir}/scim@SCIM_EPOCH@/Config
+%dir %{_libdir}/scim@SCIM_EPOCH@/FrontEnd
+%dir %{_libdir}/scim@SCIM_EPOCH@/IMEngine
+%dir %{_libdir}/scim@SCIM_EPOCH@/SetupUI
+%dir %{_libdir}/scim@SCIM_EPOCH@/Helper
+%dir %{_libdir}/scim@SCIM_EPOCH@/Filter
+%dir %{_datadir}/scim
+%dir %{_datadir}/scim/icons
+%config %{_sysconfdir}/scim/global
+%{_bindir}/scim
+%{_bindir}/scim-config-agent
+%{_libdir}/libscim*.so.*
+%{_libdir}/scim@SCIM_EPOCH@/scim-launcher
+%{_libdir}/scim@SCIM_EPOCH@/scim-helper-launcher
+%{_libdir}/scim@SCIM_EPOCH@/scim-helper-manager
+%{_datadir}/locale/*/LC_MESSAGES/scim.mo
+%{_datadir}/scim/icons/keyboard.png
+%{_datadir}/scim/icons/up.png
+%{_datadir}/scim/icons/down.png
+%{_datadir}/scim/icons/left.png
+%{_datadir}/scim/icons/right.png
+%{_datadir}/scim/icons/full-letter.png
+%{_datadir}/scim/icons/half-letter.png
+%{_datadir}/scim/icons/full-punct.png
+%{_datadir}/scim/icons/half-punct.png
+%{_datadir}/scim/icons/help.png
+%{_datadir}/scim/icons/pin-up.png
+%{_datadir}/scim/icons/pin-down.png
+%{_datadir}/scim/icons/setup.png
+%{_datadir}/scim/icons/trademark.png
+%{_datadir}/scim/icons/menu.png
+%if %{build_scim_setup}
+%{_bindir}/scim-setup
+%{_datadir}/applications/scim-setup.desktop
+%{_datadir}/control-center-2.0/capplets/scim-setup.desktop
+%{_datadir}/pixmaps/scim-setup.png
+%{_libdir}/scim@SCIM_EPOCH@/*/Helper/setup.so
+%{_libdir}/scim@SCIM_EPOCH@/*/SetupUI/aaa-frontend-setup.so
+%{_libdir}/scim@SCIM_EPOCH@/*/SetupUI/aaa-imengine-setup.so
+%endif
+%if %{build_panel_gtk}
+%{_libdir}/scim@SCIM_EPOCH@/scim-panel-gtk
+%if %{build_scim_setup}
+%{_libdir}/scim@SCIM_EPOCH@/*/SetupUI/panel-gtk-setup.so
+%endif
+%endif
+%if %{build_frontend_x11}
+%{_libdir}/scim@SCIM_EPOCH@/*/FrontEnd/x11.so
+%endif
+%if %{build_imengine_rawcode}
+%{_libdir}/scim@SCIM_EPOCH@/*/IMEngine/rawcode.so
+%{_datadir}/scim/icons/rawcode.png
+%endif
+%if %{build_filter_sctc}
+%{_libdir}/scim@SCIM_EPOCH@/*/Filter/sctc.so
+%{_datadir}/scim/icons/sctc.png
+%{_datadir}/scim/icons/sctc-sc-to-tc.png
+%{_datadir}/scim/icons/sctc-tc-to-sc.png
+%endif
+%if %{build_config_simple}
+%config %{_sysconfdir}/scim/config
+%{_libdir}/scim@SCIM_EPOCH@/*/Config/simple.so
+%endif
+%if %{build_imengine_socket}
+%{_libdir}/scim@SCIM_EPOCH@/*/IMEngine/socket.so
+%endif
+%if %{build_frontend_socket}
+%{_libdir}/scim@SCIM_EPOCH@/*/FrontEnd/socket.so
+%endif
+%if %{build_config_socket}
+%{_libdir}/scim@SCIM_EPOCH@/*/Config/socket.so
+%endif
+%if %{build_gtk2_immodule}
+@GTK_LIBDIR@/gtk-2.0/immodules/im-scim.so
+%endif
+
+%files devel
+%defattr(-, root, root)
+%doc docs/html
+%doc docs/developers
+%{_libdir}/libscim*.so
+%{_libdir}/lib*.a
+%{_libdir}/lib*.la
+%{_libdir}/pkgconfig/*.pc
+%{_includedir}/scim@SCIM_EPOCH@
+
+#--------------------------------------------------
+
+%changelog
+* Sun Jan 9 2005 James Su <suzhe@tsinghua.org.cn>
+- Remove GConf Config module.
+
+* Wed Jan 5 2005 James Su <suzhe@tsinghua.org.cn>
+- Remove table IMEngine.
+
+* Fri Aug 6 2004 James Su <suzhe@tsinghua.org.cn>
+- Move scim-launcher and scim-panel-gtk to /usr/lib/scim-1.0.
+
+* Sun Jun 20 2004 James Su <suzhe@tsinghua.org.cn>
+- Merge all things into one package.
+
+* Sat Jun 19 2004 James Su <suzhe@tsinghua.org.cn>
+- Added /usr/libexec/scim-launcher.
+- Remove setup module for SocketFrontEnd and SocketIMEngine.
+
+* Mon Mar 8 2004 James Su <suzhe@turbolinux.com.cn>
+- Added scim-config-agent.
+
+* Thu Oct 30 2003 James Su <suzhe@turbolinux.com.cn>
+- Added Simplified Chinese User Manual.
+
+* Wed Sep 03 2003 James Su <suzhe@turbolinux.com.cn>
+- cleanup spec.
+
+* Tue Sep 02 2003 James Su <suzhe@turbolinux.com.cn>
+- upto 0.8.0
+
+* Tue Jul 29 2003 James Su <suzhe@turbolinux.com.cn>
+- updated to include scim-panel-gtk.
+
+* Thu Jun 19 2003 James Su <suzhe@turbolinux.com.cn>
+- updated to include scim-setup and its modules.
+
+* Thu Apr 3 2003 James Su <suzhe@turbolinux.com.cn>
+- added suite package, which includes all necessary components of SCIM.
+
+* Tue Mar 25 2003 James Su <suzhe@turbolinux.com.cn>
+- updated to v0.4.0
+
+* Wed Feb 26 2003 James Su <suzhe@turbolinux.com.cn>
+- implemented dynamic adjust feature for generic table module.
+- fixed key handling bug in generic table module.
+
+* Mon Feb 10 2003 James Su <suzhe@turbolinux.com.cn>
+- Replaced highlight_start and highlight_end in scim_server
+ and scim_frontend with AttributeList (scim_attributes.h)
+- Moved icons/* to data/icons and gtkstringview.* to
+ utils/
+
+* Thu Jan 2 2003 James Su <suzhe@turbolinux.com.cn>
+- updated configure.ac and Makefile.am
+- ready to release 0.3.0
+
+* Tue Nov 12 2002 James Su <suzhe@turbolinux.com.cn>
+- merged signal system from libinti.
+- implemented namespace scim.
+- implemented referenced object.
+- version 0.3.0
+
+* Tue Nov 05 2002 James Su <suzhe@turbolinux.com.cn>
+- minor fixes for table IM module.
+
+* Mon Nov 04 2002 James Su <suzhe@turbolinux.com.cn>
+- More IMdkit memory leak fixes.
+- Table input method bugfixes.
+- version 0.2.2
+
+* Fri Nov 01 2002 James Su <suzhe@turbolinux.com.cn>
+- improved table input method.
+- actually fixed the memleaks within IMdkit.
+- pumped the version to 0.2.1
+
+* Thu Oct 31 2002 James Su <suzhe@turbolinux.com.cn>
+- fixed some memory leaks in IMdkit
+- reduced memory usage.
+- upgraded to libtool-1.4.3
+
+* Tue Oct 29 2002 James Su <suzhe@turbolinux.com.cn>
+- finished Generic Table input server module.
+- fixed several bugs in scim-lib.
+
+* Thu Oct 10 2002 James Su <suzhe@turbolinux.com.cn>
+- used gettext to support i18n message.
+- added release info to lib name.
+
+* Mon Sep 30 2002 James Su <suzhe@turbolinux.com.cn>
+- version 0.1.4
+- added Embedded Lookup Table style into X11 FrontEnd.
+- use wchar_t instead of unsigned long if __STDC_ISO_10646__ defined.
+
+* Sun Sep 22 2002 James Su <suzhe@turbolinux.com.cn>
+- version 0.1.3
+- config button of X11 FrontEnd was disabled.
+
+* Fri Sep 6 2002 James Su <suzhe@turbolinux.com.cn>
+- simplified the utilities and lookup table interface.
+
+* Wed Aug 21 2002 James Su <suzhe@turbolinux.com.cn>
+- version 0.1.2
+- added configuration options to disable modules.
+- enhanced X11 FrontEnd.
+
+* Sun Aug 11 2002 James Su <suzhe@turbolinux.com.cn>
+- version 0.1.1
+- X11 FrontEnd was enhanced.
+
+* Sat Aug 10 2002 James Su <suzhe@turbolinux.com.cn>
+- version 0.1.0
+- many bugfixes.
+- Help window of X11 FrontEnd was implemented.
+- scim can exit cleanly.
+
+* Fri Aug 2 2002 James Su <suzhe@turbolinux.com.cn>
+- SCIM 0.0.13.
+- Minor bugfixes.
+
+* Mon Jul 29 2002 James Su <suzhe@turbolinux.com.cn>
+- SCIM 0.0.12.
+- Minor bugfixes.
+
+* Sun Jul 28 2002 James Su <suzhe@turbolinux.com.cn>
+- SCIM 0.0.11.
+- Minor bugfixes.
+
+* Sun Jul 21 2002 James Su <suzhe@turbolinux.com.cn>
+- SCIM 0.0.10.
+- Added Simple Config module.
+
+* Sat Jun 22 2002 James Su <suzhe@turbolinux.com.cn>
+- first public release of SCIM.
+