pax_global_header00006660000000000000000000000064143001245620014507gustar00rootroot0000000000000052 comment=362da66da874ebb2b6e4c2920825ba5ee3094b08 nabi-nabi-1.0.1/000077500000000000000000000000001430012456200133265ustar00rootroot00000000000000nabi-nabi-1.0.1/.cvsignore000066400000000000000000000002431430012456200153250ustar00rootroot00000000000000Makefile Makefile.in aclocal.m4 config.cache config.h config.h.in config.log config.status configure intl stamp-h stamp-h1 stamp-h.in autom4te.cache nabi-*.tar.gz nabi-nabi-1.0.1/.gitignore000066400000000000000000000004651430012456200153230ustar00rootroot00000000000000ChangeLog INSTALL Makefile Makefile.in aclocal.m4 autom4te.cache compile configure config.h config.h.in config.log config.status depcomp install-sh missing mkinstalldirs stamp-h1 po/Makefile.in.in po/POTFILES po/*.gmo po/*.pot src/nabi test/gtk test/xlib *.tar.gz */Makefile */Makefile.in */.deps */*.a */*.o nabi-nabi-1.0.1/ABOUT-NLS000066400000000000000000001131131430012456200145550ustar00rootroot00000000000000Notes 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'. 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 May 2003. 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 am az be bg ca cs da de el en en_GB eo es +-------------------------------------------+ a2ps | [] [] [] [] | aegis | () | anubis | | ap-utils | | bash | [] [] [] | batchelor | | bfd | [] [] | binutils | [] [] | bison | [] [] [] | bluez-pin | [] [] | clisp | | clisp | [] [] [] | coreutils | [] [] [] [] | cpio | [] [] [] | darkstat | () [] | diffutils | [] [] [] [] [] [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] | error | [] [] [] [] [] | fetchmail | [] () [] [] [] [] | fileutils | [] [] [] | findutils | [] [] [] [] [] [] | flex | [] [] [] [] | gas | [] | gawk | [] [] [] [] | gcal | [] | gcc | [] [] | gettext | [] [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] | gimp-print | [] [] [] [] [] | gliv | | glunarclock | [] [] [] | gnucash | () [] | gnucash-glossary | [] () [] | gnupg | [] () [] [] [] [] | gpe-calendar | [] | gpe-conf | [] | gpe-contacts | [] | gpe-edit | | gpe-login | [] | gpe-ownerinfo | [] | gpe-sketchbook | [] | gpe-timesheet | | gpe-today | [] | gpe-todo | [] | gphoto2 | [] [] [] [] | gprof | [] [] | gpsdrive | () () () | grep | [] [] [] [] [] | gretl | [] | hello | [] [] [] [] [] [] | id-utils | [] [] | indent | [] [] [] [] | jpilot | [] [] [] [] | jwhois | [] | kbd | [] [] [] [] [] | ld | [] [] | libc | [] [] [] [] [] [] | libgpewidget | [] | libiconv | [] [] [] [] [] | lifelines | [] () | lilypond | [] | lingoteach | | lingoteach_lessons | () () | lynx | [] [] [] [] | m4 | [] [] [] [] | mailutils | [] [] | make | [] [] [] | man-db | [] () [] [] () | mysecretdiary | [] [] [] | nano | [] () [] [] [] | nano_1_0 | [] () [] [] [] | opcodes | [] [] | parted | [] [] [] [] [] | ptx | [] [] [] [] [] | python | | radius | | recode | [] [] [] [] [] [] | screem | | sed | [] [] [] [] [] | sh-utils | [] [] [] | sharutils | [] [] [] [] [] [] | sketch | [] () [] | soundtracker | [] [] [] | sp | [] | tar | [] [] [] [] | texinfo | [] [] [] [] | textutils | [] [] [] [] | tin | () () | util-linux | [] [] [] [] [] | vorbis-tools | [] [] [] | wastesedge | () | wdiff | [] [] [] [] | wget | [] [] [] [] [] [] [] | xchat | [] [] [] | xpad | | +-------------------------------------------+ am az be bg ca cs da de el en en_GB eo es 0 1 4 2 31 17 54 60 14 1 4 12 56 et fa fi fr ga gl he hr hu id it ja ko +----------------------------------------+ a2ps | [] [] [] () () | aegis | | anubis | [] | ap-utils | [] | bash | [] [] | batchelor | [] | bfd | [] [] | binutils | [] [] | bison | [] [] [] [] | bluez-pin | [] [] [] [] | clisp | | clisp | [] | coreutils | [] [] [] [] | cpio | [] [] [] [] | darkstat | () [] [] [] | diffutils | [] [] [] [] [] [] [] | e2fsprogs | | enscript | [] [] | error | [] [] [] [] | fetchmail | [] | fileutils | [] [] [] [] [] | findutils | [] [] [] [] [] [] [] [] [] [] [] | flex | [] [] | gas | [] | gawk | [] [] | gcal | [] | gcc | [] | gettext | [] [] [] | gettext-runtime | [] [] [] [] | gettext-tools | [] | gimp-print | [] [] | gliv | () | glunarclock | [] [] [] [] | gnucash | [] | gnucash-glossary | [] | gnupg | [] [] [] [] [] [] [] | gpe-calendar | [] | gpe-conf | | gpe-contacts | [] | gpe-edit | [] [] | gpe-login | [] | gpe-ownerinfo | [] [] [] | gpe-sketchbook | [] | gpe-timesheet | [] [] [] | gpe-today | [] [] | gpe-todo | [] [] | gphoto2 | [] [] [] | gprof | [] [] | gpsdrive | () [] () () | grep | [] [] [] [] [] [] [] [] [] [] [] | gretl | [] | hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | id-utils | [] [] [] | indent | [] [] [] [] [] [] [] [] | jpilot | [] () | jwhois | [] [] [] [] | kbd | [] | ld | [] | libc | [] [] [] [] [] [] | libgpewidget | [] [] [] | libiconv | [] [] [] [] [] [] [] [] | lifelines | () | lilypond | [] | lingoteach | [] [] | lingoteach_lessons | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailutils | | make | [] [] [] [] [] [] | man-db | [] () () | mysecretdiary | [] [] | nano | [] [] [] [] | nano_1_0 | [] [] [] [] | opcodes | [] [] | parted | [] [] [] | ptx | [] [] [] [] [] [] [] | python | | radius | | recode | [] [] [] [] [] [] | screem | | sed | [] [] [] [] [] [] [] [] | sh-utils | [] [] [] [] [] [] | sharutils | [] [] [] [] [] | sketch | [] | soundtracker | [] [] [] | sp | [] () | tar | [] [] [] [] [] [] [] [] [] | texinfo | [] [] [] [] | textutils | [] [] [] [] [] | tin | [] () | util-linux | [] [] [] [] () [] | vorbis-tools | [] | wastesedge | () | wdiff | [] [] [] [] [] | wget | [] [] [] [] [] [] [] [] | xchat | [] [] [] | xpad | | +----------------------------------------+ et fa fi fr ga gl he hr hu id it ja ko 20 1 15 73 14 24 8 10 30 31 19 31 9 lg lt lv ms nb nl nn no pl pt pt_BR ro +----------------------------------------+ a2ps | [] [] () () () [] [] | aegis | () | anubis | [] [] | ap-utils | () | bash | [] | batchelor | | bfd | | binutils | | bison | [] [] [] [] | bluez-pin | [] | clisp | | clisp | [] | coreutils | [] | cpio | [] [] [] | darkstat | [] [] [] [] | diffutils | [] [] [] | e2fsprogs | | enscript | [] [] | error | [] [] | fetchmail | () () | fileutils | [] | findutils | [] [] [] [] | flex | [] | gas | | gawk | [] | gcal | | gcc | | gettext | [] | gettext-runtime | [] | gettext-tools | | gimp-print | [] | gliv | [] | glunarclock | [] | gnucash | | gnucash-glossary | [] [] | gnupg | | gpe-calendar | [] [] | gpe-conf | [] [] | gpe-contacts | [] | gpe-edit | [] [] | gpe-login | [] [] | gpe-ownerinfo | [] [] | gpe-sketchbook | [] [] | gpe-timesheet | [] [] | gpe-today | [] [] | gpe-todo | [] [] | gphoto2 | | gprof | [] | gpsdrive | () () () | grep | [] [] [] [] | gretl | | hello | [] [] [] [] [] [] [] [] [] | id-utils | [] [] [] | indent | [] [] [] | jpilot | () () | jwhois | [] [] [] | kbd | | ld | | libc | [] [] [] [] | libgpewidget | [] [] | libiconv | [] [] | lifelines | | lilypond | [] | lingoteach | | lingoteach_lessons | | lynx | [] [] | m4 | [] [] [] [] | mailutils | | make | [] [] | man-db | [] | mysecretdiary | [] | nano | [] [] [] [] | nano_1_0 | [] [] [] [] | opcodes | [] [] [] | parted | [] [] [] | ptx | [] [] [] [] [] [] [] | python | | radius | | recode | [] [] [] | screem | | sed | [] [] | sh-utils | [] | sharutils | [] | sketch | [] | soundtracker | | sp | | tar | [] [] [] [] [] [] | texinfo | [] | textutils | [] | tin | | util-linux | [] [] | vorbis-tools | [] [] | wastesedge | | wdiff | [] [] [] [] | wget | [] [] [] | xchat | [] [] | xpad | [] | +----------------------------------------+ lg lt lv ms nb nl nn no pl pt pt_BR ro 0 0 2 11 7 26 3 4 18 15 34 34 ru sk sl sr sv ta tr uk vi wa zh_CN zh_TW +-------------------------------------------+ a2ps | [] [] [] [] [] | 16 aegis | () | 0 anubis | [] [] | 5 ap-utils | () | 1 bash | [] | 7 batchelor | | 1 bfd | [] [] [] | 7 binutils | [] [] [] | 7 bison | [] [] | 13 bluez-pin | | 7 clisp | | 0 clisp | | 5 coreutils | [] [] [] [] [] | 14 cpio | [] [] [] | 13 darkstat | [] () () | 9 diffutils | [] [] [] [] | 21 e2fsprogs | [] | 3 enscript | [] [] [] | 11 error | [] [] [] | 14 fetchmail | [] | 7 fileutils | [] [] [] [] [] [] | 15 findutils | [] [] [] [] [] [] | 27 flex | [] [] [] | 10 gas | [] | 3 gawk | [] [] | 9 gcal | [] [] | 4 gcc | [] | 4 gettext | [] [] [] [] [] [] | 15 gettext-runtime | [] [] [] [] [] [] | 16 gettext-tools | [] [] | 5 gimp-print | [] [] | 10 gliv | | 1 glunarclock | [] [] [] | 11 gnucash | [] [] | 4 gnucash-glossary | [] [] [] | 8 gnupg | [] [] [] [] | 16 gpe-calendar | [] | 5 gpe-conf | | 3 gpe-contacts | [] | 4 gpe-edit | [] | 5 gpe-login | [] | 5 gpe-ownerinfo | [] | 7 gpe-sketchbook | [] | 5 gpe-timesheet | [] | 6 gpe-today | [] | 6 gpe-todo | [] | 6 gphoto2 | [] [] | 9 gprof | [] [] | 7 gpsdrive | [] [] | 3 grep | [] [] [] [] | 24 gretl | | 2 hello | [] [] [] [] [] | 33 id-utils | [] [] [] | 11 indent | [] [] [] [] | 19 jpilot | [] [] [] [] [] | 10 jwhois | () () [] [] | 10 kbd | [] [] | 8 ld | [] [] | 5 libc | [] [] [] [] | 20 libgpewidget | | 6 libiconv | [] [] [] [] [] [] | 21 lifelines | [] | 2 lilypond | [] | 4 lingoteach | | 2 lingoteach_lessons | () | 0 lynx | [] [] [] [] | 14 m4 | [] [] [] | 15 mailutils | | 2 make | [] [] [] [] | 15 man-db | [] | 6 mysecretdiary | [] [] | 8 nano | [] [] [] | 15 nano_1_0 | [] [] [] | 15 opcodes | [] [] | 9 parted | [] [] | 13 ptx | [] [] [] | 22 python | | 0 radius | | 0 recode | [] [] [] [] | 19 screem | [] | 1 sed | [] [] [] [] [] | 20 sh-utils | [] [] [] | 13 sharutils | [] [] [] [] | 16 sketch | [] | 5 soundtracker | [] | 7 sp | [] | 3 tar | [] [] [] [] [] | 24 texinfo | [] [] [] [] | 13 textutils | [] [] [] [] [] | 15 tin | | 1 util-linux | [] [] | 14 vorbis-tools | [] | 7 wastesedge | | 0 wdiff | [] [] [] [] | 17 wget | [] [] [] [] [] [] [] | 25 xchat | [] [] [] | 11 xpad | | 1 +-------------------------------------------+ 50 teams ru sk sl sr sv ta tr uk vi wa zh_CN zh_TW 97 domains 32 19 16 0 56 0 48 10 1 1 12 23 913 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 May 2003 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. nabi-nabi-1.0.1/AUTHORS000066400000000000000000000000531430012456200143740ustar00rootroot00000000000000Choe Hwanjin nabi-nabi-1.0.1/COPYING000066400000000000000000000431101430012456200143600ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, 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 or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's 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 give any other recipients of the Program a copy of this License along with the Program. 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. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, 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 Program, 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 Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) 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; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, 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 executable. However, as a special exception, the source code 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. If distribution of executable or 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 counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program 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. 5. 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 Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program 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 to this License. 7. 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 Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program 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 Program. 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. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program 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. 9. The Free Software Foundation may publish revised and/or new versions of the 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 Program 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 Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, 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 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. 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. Copyright (C) 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 Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. nabi-nabi-1.0.1/ChangeLog.0000066400000000000000000000406421430012456200152440ustar00rootroot000000000000002006-05-11 Choe Hwanjin * nabi.png: 새로운 아이콘에 맞게 수정 * src/ui.c: nabi.svg 로딩에 실패할경우 nabi.png를 아이콘으로 사용 2006-04-23 Choe Hwanjin * src/ui.c: 키입력 통계창 출력 루틴 개선 2005-07-17 Choe Hwanjin * test 디렉토리 추가 - 여러가지 toolkit을 위한 테스트 코드 2005-01-13 Choe Hwanjin * src/ic.c: PreeditArea에서 preedit window의 위치를 제대로 잡음 2005-01-08 Choe Hwanjin * src/ic.c: reset할때 preedit window 숨김 gtk1 text widget에서 preedit string이 안나오던 문제 수정(over the spot(PreeditPostion) 방식에서 foreground, background값을 client가 보내주는 값대신 nabi의 설정값을 따름) 2004-12-05 Choe Hwanjin * release 0.15 2004-12-04 Choe Hwanjin * About 창 업데이트 2004-12-03 Choe Hwanjin * 나비 아이콘 새로 올림 (bluetux님의 작품) 2004-12-02 Choe Hwanjin * 자판에서 자모 빈도를 $HOME/.nabi/nabi.log에 기록함 2004-11-26 Choe Hwanjin * 설정창에서 한글/한자로 메뉴를 나눔 2004-11-21 Choe Hwanjin * 한영 전환키와 한자 키 설정을 보강 * 옛글 compose table 추가 * 순아래 자판 추가 2004-11-09 Choe Hwanjin * tray의 크기에 맞춰 size-allocate 시그널에서 자동으로 크기를 수정함 * 아이콘 크기 설정 옵션을 없앰 2004-11-03 Choe Hwanjin * 키 입력 통계를 다른 창으로 띄움 * 하드코딩된 locale 스트링을 제거 * Qt immodule의 XIM에서 preedit window 위치를 잘못 찾던 버그 수정 2004-10-05 Choe Hwanjin * full compose map 추가(엣글 입력에 필요함) * 세벌식 옛글 자판 추가 2004-10-04 Choe Hwanjin * compose table을 제대로 로딩하지 못하던 버그 수정 2004-08-30 Choe Hwanjin * Tux 테마 추가 (박준철님에게 감사드립니다) 2004-08-28 Choe Hwanjin * release 0.14 2004-08-28 Choe Hwanjin * ko이외에 ja_JP.UTF-8, zh_CN.UTF-8, zh_HK.UTF-8, zh_TW.UTF-8, en_US.UTF-8을 지원하도록 함 * candidate list의 글꼴 설정 옵션도 설정창에 추가 * candidate list의 갯수를 9개로 변경 2004-08-01 Choe Hwanjin * XIMPreeditArea 지원 2004-07-31 Choe Hwanjin * XIMPreeditNothing을 지원하기 위해 ic.c에서 gdk 함수를 직접 부르는 방식으로 변경함 2004-07-25 Choe Hwanjin * 설정창 구현 2004-06-23 Choe Hwanjin * src/ic.c: nabi_ic_commit_keyval() 함수에서 더이상 XIM_COMMIT을 사용 하지 않고, 바로 key event를 forwarding하도록 수정함. 일부 프로그램에서 하나의 이벤트에서 두번 commit하는 것을 받아들이지 못하는 듯함. ex) wine 2004-06-05 Choe Hwanjin * src/server.h src/server/c src/ui.c src/nabi.h src/automata.h src/keyboard tables/compose/default configure.in: 키보드 테이블과 컴포우즈 테이블을 위한 함수 nabi_server_load_keyboard_table(), nabi_server_load_compose_table()을 구현함. 더이상 ui.c에서 키보드와 컴포우즈 테이블을 관리하지 않음. keyboard_map, compose_map에서 keyboard_table, compose_table로 이름을 바꿈. compose table 포맷을 변경 2004-04-23 Choe Hwanjin * src/handler.c src/ic.c src/ic.h src/server.c src/server.h: status window 콜백 함수를 구현함 * src/server.c: 한영 전환키로 오른쪽 Alt를 추가 2004-04-19 Choe Hwanjin * src/server.c: charset 체크하면서 ko로 시작하지 않으면 워닝을 출력하도록 함 2004-03-15 Choe Hwanjin * release 0.13 2004-03-07 Choe Hwanjin * src/ui.c: about 창 모양 개선 * po/ko.po: 번역 업데이트 2004-03-05 Choe Hwanjin * src/nabi.h src/main.c src/server.h src/server.c src/ui.c: xim_name이라는 컨피그 옵션과 --xim-name 이라는 커맨드 라인 옵션을 추가함. 이것을 지정하면 XMODIFIER값을 다른 것을 사용할 수 있음 2004-03-01 Choe Hwanjin * src/ui.c: GtkTextView를 사용하게 되면 GtkIMContext를 생성하게 되어 XIM 서버가 멈추는 위험한 상황이 자주 발생하므로 About 창에서 GtkTextView대신 GtkLabel를 사용하도록 수정함 2004-02-29 Choe Hwanjin * IMdkit/i18nIc.c IMdkit/i18nMethod.c IMdkit/i18nPtHdr.c: 바이트 오더 문제를 해결하기 위한 수정 2004-02-18 Choe Hwanjin * GNU gettext 대신 glib gettext를 사용하도록 수정 2004-02-16 Choe Hwanjin * src/candidate.c: 한자 선택창 페이지를 바꾸면서 화면에서 벗어나는 문제를 수정 (#300256) 2004-02-10 Choe Hwanjin * IMdkit/Makefile.am src/Makefile.am: -Wall 컴파일 옵션 제거(#300245) 2004-02-02 Choe Hwanjin * src/ui.c: 위젯을 만들기 전에 XMODIFIERS 환경변수를 지움 2004-01-29 Choe Hwanjin * src/candidate.c src/nabi.h src/server.c src/server.h src/ui.c: 설정값 candidate_font 추가, candidate 글자에 사용할 폰트 지정 2004-01-27 Choe Hwanjin * src/candidate.h src/candidate.c src/ic.c src/ic.h src/handler.c: candidate window에서 한자의 뜻을 보여주기 위해 GtkTable대신 GtkTreeView를 사용함 2004-01-09 Choe Hwanjin * src/candidate.c src/candidate.h src/ic.c src/nabi.h src/server.c src/server.h src/ui.c tables/Makefile.am tables/candidate/nabi.txt: 기존에 사용하던 static array를 버리고 외부의 파일로 저장된 candidate table을 사용하는 기능을 구현 2003-12-29 Choe Hwanjin * IMdkit/i18nIc.c,IMdkit/i18nPtHdr.c: 메모리 leak 문제 몇가지 해결 2003-12-23 Choe Hwanjin * src/server.h,src/server.c,src/automata.c: backspace정보를 통계 정보 구조체에 남기는 코드의 버그를 해결 2003-12-20 Choe Hwanjin * src/nabi.h,src/session.h,src/session.c,src/ui.c,src/main.c: 세션 기능을 구현, 세션저장만 하면 다음번에 제대로 다시 뜨게함, 또 프로그램이 죽게되면 자동으로 다시 띄우도록 기본값을 줌 2003-12-18 Choe Hwanjin * release 0.12 2003-12-16 Choe Hwanjin * src/ic.c: PreeditCallback 방식의 preedit style을 Underline에서 Reverse로 바꿈 트레이 아이콘이 사라지면서 죽던 문제 수정 2003-12-15 Choe Hwanjin * src/ui.c: icon의 크기를 좀더 똑똑하게 처리 메뉴의 위치를 마우스가 아닌 아이콘 위치 기준으로 설정 2003-12-14 Choe Hwanjin * src/server.h,src/server.c: iconv를 직접 쓰지 않고 g_iconv를 사용 * icon들 업데이트 (김석진님에게 감사드립니다) 2003-12-09 Choe Hwanjin * configure.in, themes/MSWindows2000/Makefile.am, themes/MSWindows2000/english.png, themes/MSWindows2000/hangul.png, themes/MSWindows2000/none.png, themes/Makefile.am: MSWindows2000 테마 추가 2003-12-05 Choe Hwanjin * src/handler.c, src/ic.c, src/ic.h: add utf8_to_compound_text() func. do not commit on ICReset, just send last preedit string 2003-12-03 Choe Hwanjin * src/ic.c: PreeditPosition에서 preedit window를 spot location보다 한픽셀 뒤로 밂 (커서위치를 보이게 하기 위함) 2003-12-02 Choe Hwanjin * src/ic.c: set overide-redirect to show preedit window correctly on Qt app 2003-11-29 Choe Hwanjin * po/ko.po: update po * ChangeLog: update ChangeLog * src/ui.c: set dialog variable to NULL when about window closed * src/ui.c: about window가 하나만 뜨게 함 * release 0.11 2003-11-28 Choe Hwanjin * src/ic.c, src/server.c, src/server.h: gc를 ic별로 관리하는 대신 server에 기본 gc를 하나 만들고 그걸 사용하도록 함 * AUTHORS, NEWS, TODO: 문서 업데이트 * configure.in: prepare for version up * po/ko.po: 번역 업데이트 * src/main.c, src/server.c, src/server.h, src/ui.c: xim 서버 종료시 gtk2 application들이 죽던 문제 해결, xim서버를 정상적으로 종료함 * po/Makevars: set variable MSGID_BUGS_ADDRESS * src/ui.c: update comment for parsing command line args routine 2003-11-27 Choe Hwanjin * src/candidate.c: candidate window에서 . 제거 2003-11-26 Choe Hwanjin * src/ui.c: rename function for root window event filtering 2003-11-25 Choe Hwanjin * src/main.c, src/nabi.h, src/server.c, src/ui.c: -s(--status-only) 옵션 추가(디버깅용도, 또는 상태 정보만 보여주기) 2003-11-24 Choe Hwanjin * src/main.c: 실수로 추가한 코드 제거 (server start 루틴 작동함) * src/main.c, src/ui.c: update main window * src/automata.c: 세벌식 오토마타에서 잘못돼 있던 goto update를 goto insert로 수정, OUTPUT_JAMO의 경우만 순서를 고려하지 않는 코드(모아치기)를 사용 2003-11-15 Choe Hwanjin * src/server.c: argument check, 안전한 프로그램을 위해 2003-11-13 Choe Hwanjin * src/ui.c: add tooltips on tray icon 2003-11-10 Choe Hwanjin * src/candidate.c: candidate window의 memory leak 2003-11-09 Choe Hwanjin * src/ic.c: PreeditPosition에서 preedit window 위치 조정 (xterm에서) * src/candidate.c: 각 글자를 x 방향도 맞추도록 함 2003-11-07 Choe Hwanjin * src/handler.c: candidate window에서 잘못된 인덱스 수정 * configure.in, po/ko.po: version up 0.10 2003-11-05 Choe Hwanjin * src/candidate.c, src/handler.c, src/ic.c: 단축키를 알파벳대신 숫자로 변경함 2003-11-04 Choe Hwanjin * src/handler.c: on focus out event close the candidate window * src/candidate.c: always show full window on screen * src/ic.c, src/symboltable.h, src/candidate.c, src/candidate.h, src/hanjatable.h: candidate selection window의 기본형을 wchar_t에서 unsigned short int로 변경 * src/Makefile.am: add symboltable.h to source list * src/handler.c: change default keymapping on symbol selection window 2003-11-03 Choe Hwanjin * src/candidate.c, src/candidate.h, src/handler.c, src/hanjatable.h, src/ic.c, src/symboltable.h: add symbol selection function 2003-11-02 Choe Hwanjin * ChangeLog, src/Makefile.am, src/candidate.c, src/candidate.h, src/handler.c, src/ic.c, src/ic.h, src/ui.c: Add new candidate window routine 2003-11-02 Choe Hwanjin * src/Makefile.am, src/candidate.c, src/candidate.h, src/handler.c, src/ic.c, src/ic.h, src/ui.c: Add new candidate window routine 2003-10-30 Choe Hwanjin * 텍스트 파일들의 인코딩을 UTF-8로 변환 2003-10-22 Choe Hwanjin * src/ic.c,src/nabi.h,src/ui.c,src/server.h,src/server.c: output_mode 옵션 추가 (syllable, jamo 가능) 2003-10-20 Choe Hwanjin * src/ui.c: gcc 3.3.2 에서 strict alias warning 안나게 2003-10-19 Choe Hwanjin * src/ic.c: unicode 범위의 keyval은 forwarding하지 않고 바로 commit 함 2003-10-15 Choe Hwanjin * src/automata.c,src/handler.c,src/ic.c,src/ic.h: 한글자모 이외의 글자를 처리하는 루틴을 개선 2003-10-14 Choe Hwanjin * release 0.9 2003-10-13 Choe Hwanjin * src/ic.c,src/hangul.c,src/hangul.h,src/server.c: XwcXXX 함수를 모두 Xutf8XXX 함수로 바꿈, UCS 코드를 UTF8 스트링으로 만드는 자체 루틴 추가, charset 체크에서도 WCHAR_T 대신 UTF-8 사용 (BSD 지원을 위해) BSD 서버 사용을 지원해주신 Perky(http://openlook.org/)님께 감사드립니다. 2003-10-10 Choe Hwanjin * src/ic.c: qt에서 한자 변환시 안보이던 문제 해결 2003-10-08 Choe Hwanjin * release 0.8 2003-10-08 Choe Hwanjin * src/automata.c: charset을 체크하는 부분을 더 추가 (ㅃㅞㄹㄱ의 경우 고려), 세벌식 자판에서도 charset 체크 강화 * src/automata.c, src/server.h, src/server.c, src/ui.c: 각 키별로 눌린 횟수를 저장해두는 기능을 추가함(about 창에서 볼수 있음) 2003-10-01 Choe Hwanjin * src/ic.c: XIMPreeditPosition 모드의 경우에는 commit한후에 preedit clear 하도록 수정함(Eterm의 경우는 preedit string을 지우고 commit 해도 정상적으로 입력이 되지만, gtk+1 app의 경우는 입력순서가 뒤바뀌는 경우가 있어서 XIMPreeditPosition의 경우는 기존의 방식대로 처리하도록 함, 따라서 XUnmapWindow()를 사용해도 입력순서에 영향을 미치지 않음 #284) 2003-09-26 Choe Hwanjin * release 0.7 2003-09-18 Choe Hwanjin * src/ic.c: XIM spec에 맞게 preedit clear 한후 commit 함 * src/handler.c: 한자 변환 기능을 "Hanja"키 말고 F9도 작동하게 함 2003-09-17 Choe Hwanjin * src/ui.c: set default icon 2003-09-16 Choe Hwanjin * release 0.6 * src/session.c,src/main.c,src/ui.c: session 종료시 같이 종료 2003-09-14 Choe Hwanjin * src/session.h,src/session.c: session 관련 코드 추가 2003-09-10 Choe Hwanjin * src/handler.c: 특수키들을 포워딩 함 * src/automata.c: 세벌식 오토마타의 잘못된 곳 수정 2003-09-09 Choe Hwanjin * src/server.h,src/server.c,src/ui.c: iconv를 이용한 charset 체크루틴 추가 * src/hangul.h,src/hangul.c: hangul_ucs_to_ksc 함수를 제거 2003-09-08 Choe Hwanjin * src/ui.c,src/ic.c,src/ic.h,src/nabi.h,src/hanjatable.h,src/handler.c: 한자 입력 기능 추가 * src/handler.c: preedit start/done을 제때에 맞게 호출하도록 수정 mozilla에서 한글 상태에서 창을 닫으면 죽던 문제 해결(#248) 2003-09-07 Choe Hwanjin * release 0.5 2003-08-31 Choe Hwanjin * src/ui.c,main.c: system tray가 닫혀도 프로그램을 종료하지 않음 * src/ui.c: dvorak 자판을 위한 설정을 메뉴에 추가 2003-08-29 Choe Hwanjin * src/ucs2ksc.h,src/hangul.c: usc_to_ksc 테이블을 wchar_t에서 uint16_t 형으로 바꿔서 크기를 줄임 2003-08-27 Choe Hwanjin * src/server.h,server.c,automata.c: dvorak 자판 지원 * src/server.h,server.c,nabi.h,ui.c: dvorak 설정 지원 * src/ui.c: 메뉴 아이콘 추가 2003-08-25 Choe Hwanjin * release 0.4 * src/ui.c,configure.in: 키보드 기본값을 DEFAULT_KEYBOARD로 사용 2003-08-23 Choe Hwanjin * src/handler.c,ic.c,ic.h,server.c,server.h: NabiConnect를 추가해서 connect_id 별로 한영 상태를 관리하도록 함 2003-08-21 Choe Hwanjin * src/main.c,server.h,server.c: nabi_server_stop 함수 추가 * src/fontset.h,fontset.c: fontset 관련 루틴 추가 * src/ic.c: nabi_fontset 관련 함수 사용하도록 수정 2003-08-11 Choe Hwanjin * src/ic.h,ic.c: preedit start 플래그 추가, preedit_start된 경우만 preedit_done 메세지를 보냄(mozilla flash player와 관련된 문제점) * src/ui.c: about 창에서 버젼 넘버 볼 수 있게 2003-08-09 Choe Hwanjin * configure.in: gtk+ 2.2를 필요로 하도록 함 2003-08-07 Choe Hwanjin * src/handler.c: vi 사용자를 위해 esc키일때 영문 상태로 자동 전환 2003-08-06 Choe Hwanjin * src/handler.c: CapsLock, NumLock 처리 못하는 버그 수정 * src/ui.c: NabiKeyboardMap.map을 free 하는 버그 수정 * IMdkit/IMConn.c: malloc.h 대신 stdlib.h 를 include 2003-08-05 Choe Hwanjin * Release nabi-nabi-1.0.1/IMdkit/000077500000000000000000000000001430012456200145075ustar00rootroot00000000000000nabi-nabi-1.0.1/IMdkit/.cvsignore000066400000000000000000000000331430012456200165030ustar00rootroot00000000000000Makefile Makefile.in .deps nabi-nabi-1.0.1/IMdkit/FrameMgr.c000066400000000000000000001670531430012456200163670ustar00rootroot00000000000000/****************************************************************** Copyright 1993, 1994 by Digital Equipment Corporation, Maynard, Massachusetts, All Rights Reserved 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. Author: Hiroyuki Miyamoto Digital Equipment Corporation miyamoto@jrd.dec.com This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include #include "FrameMgr.h" /* Convenient macro */ #define _UNIT(n) ((int)(n) & 0xFF) #define _NUMBER(n) (((int)(n) >> 8) & 0xFF) /* For byte swapping */ #define Swap16(p, n) ((p)->byte_swap ? \ (((n) << 8 & 0xFF00) | \ ((n) >> 8 & 0xFF) \ ) : n) #define Swap32(p, n) ((p)->byte_swap ? \ (((n) << 24 & 0xFF000000) | \ ((n) << 8 & 0xFF0000) | \ ((n) >> 8 & 0xFF00) | \ ((n) >> 24 & 0xFF) \ ) : n) #define Swap64(p, n) ((p)->byte_swap ? \ (((n) << 56 & 0xFF00000000000000) | \ ((n) << 40 & 0xFF000000000000) | \ ((n) << 24 & 0xFF0000000000) | \ ((n) << 8 & 0xFF00000000) | \ ((n) >> 8 & 0xFF000000) | \ ((n) >> 24 & 0xFF0000) | \ ((n) >> 40 & 0xFF00) | \ ((n) >> 56 & 0xFF) \ ) : n) /* Type definition */ typedef struct _Iter *Iter; typedef struct _FrameInst *FrameInst; typedef union { int num; /* For BARRAY */ FrameInst fi; /* For POINTER */ Iter iter; /* For ITER */ } ExtraDataRec, *ExtraData; typedef struct _Chain { ExtraDataRec d; int frame_no; struct _Chain *next; } ChainRec, *Chain; typedef struct _ChainMgr { Chain top; Chain tail; } ChainMgrRec, *ChainMgr; typedef struct _ChainIter { Chain cur; } ChainIterRec, *ChainIter; typedef struct _FrameIter { Iter iter; Bool counting; unsigned int counter; int end; struct _FrameIter* next; } FrameIterRec, *FrameIter; typedef struct _FrameInst { XimFrame template; ChainMgrRec cm; int cur_no; } FrameInstRec; typedef void (*IterStartWatchProc) (Iter it, void *client_data); typedef struct _Iter { XimFrame template; int max_count; Bool allow_expansion; ChainMgrRec cm; int cur_no; IterStartWatchProc start_watch_proc; void *client_data; Bool start_counter; } IterRec; typedef struct _FrameMgr { XimFrame frame; FrameInst fi; char *area; int idx; Bool byte_swap; int total_size; FrameIter iters; } FrameMgrRec; typedef union { int num; /* For BARRAY and PAD */ struct { /* For COUNTER_* */ Iter iter; Bool is_byte_len; } counter; } XimFrameTypeInfoRec, *XimFrameTypeInfo; /* Special values */ #define NO_VALUE -1 #define NO_VALID_FIELD -2 static FrameInst FrameInstInit(XimFrame frame); static void FrameInstFree(FrameInst fi); static XimFrameType FrameInstGetNextType(FrameInst fi, XimFrameTypeInfo info); static XimFrameType FrameInstPeekNextType(FrameInst fi, XimFrameTypeInfo info); static FmStatus FrameInstSetSize(FrameInst fi, int num); static FmStatus FrameInstSetIterCount(FrameInst fi, int num); static int FrameInstGetTotalSize(FrameInst fi); static void FrameInstReset(FrameInst fi); static Iter IterInit(XimFrame frame, int count); static void IterFree(Iter it); static int FrameInstGetSize(FrameInst fi); static int IterGetSize(Iter it); static XimFrameType IterGetNextType(Iter it, XimFrameTypeInfo info); static XimFrameType IterPeekNextType(Iter it, XimFrameTypeInfo info); static FmStatus IterSetSize(Iter it, int num); static FmStatus IterSetIterCount(Iter it, int num); static int IterGetTotalSize(Iter it); static void IterReset(Iter it); static Bool IterIsLoopEnd(Iter it, Bool* myself); static void IterSetStartWatch(Iter it, IterStartWatchProc proc, void* client_data); static void _IterStartWatch(Iter it, void* client_data); static ExtraData ChainMgrGetExtraData(ChainMgr cm, int frame_no); static ExtraData ChainMgrSetData(ChainMgr cm, int frame_no, ExtraDataRec data); static Bool ChainIterGetNext(ChainIter ci, int* frame_no, ExtraData d); static int _FrameInstIncrement(XimFrame frame, int count); static int _FrameInstDecrement(XimFrame frame, int count); static int _FrameInstGetItemSize(FrameInst fi, int cur_no); static Bool FrameInstIsIterLoopEnd(FrameInst fi); static FrameIter _FrameMgrAppendIter(FrameMgr fm, Iter it, int end); static FrameIter _FrameIterCounterIncr(FrameIter fitr, int i); static void _FrameMgrRemoveIter(FrameMgr fm, FrameIter it); static Bool _FrameMgrIsIterLoopEnd(FrameMgr fm); static Bool _FrameMgrProcessPadding(FrameMgr fm, FmStatus* status); #define IterGetIterCount(it) ((it)->allow_expansion ? \ NO_VALUE : (it)->max_count) #define IterFixIteration(it) ((it)->allow_expansion = False) #define IterSetStarter(it) ((it)->start_counter = True) #define ChainMgrInit(cm) (cm)->top = (cm)->tail = NULL #define ChainMgrFree(cm) \ { \ Chain tmp; \ Chain cur = (cm)->top; \ \ while (cur) \ { \ tmp = cur->next; \ Xfree (cur); \ cur = tmp; \ } \ } #define ChainIterInit(ci, cm) \ { \ (ci)->cur = (cm)->top; \ } /* ChainIterFree has nothing to do. */ #define ChainIterFree(ci) #define FrameInstIsEnd(fi) ((fi)->template[(fi)->cur_no].type == EOL) FrameMgr FrameMgrInit (XimFrame frame, char* area, Bool byte_swap) { FrameMgr fm; fm = (FrameMgr) Xmalloc (sizeof (FrameMgrRec)); fm->frame = frame; fm->fi = FrameInstInit (frame); fm->area = (char *) area; fm->idx = 0; fm->byte_swap = byte_swap; fm->total_size = NO_VALUE; fm->iters = NULL; return fm; } void FrameMgrInitWithData (FrameMgr fm, XimFrame frame, void * area, Bool byte_swap) { fm->frame = frame; fm->fi = FrameInstInit (frame); fm->area = (char *) area; fm->idx = 0; fm->byte_swap = byte_swap; fm->total_size = NO_VALUE; } void FrameMgrFree (FrameMgr fm) { FrameIter p, cur; p = fm->iters; cur = p; while (p != NULL) { p = p->next; Xfree(cur); cur = p; } FrameInstFree (fm->fi); Xfree (fm); } FmStatus FrameMgrSetBuffer (FrameMgr fm, void* area) { if (fm->area) return FmBufExist; fm->area = (char *) area; return FmSuccess; } FmStatus _FrameMgrPutToken (FrameMgr fm, void *data, int data_size) { XimFrameType type; XimFrameTypeInfoRec info; if (fm->total_size != NO_VALUE && fm->idx >= fm->total_size) return FmNoMoreData; /*endif*/ type = FrameInstGetNextType(fm->fi, &info); if (type & COUNTER_MASK) { unsigned long input_length; if (info.counter.is_byte_len) { if ((input_length = IterGetTotalSize (info.counter.iter)) == NO_VALUE) { return FmCannotCalc; } /*endif*/ } else { if ((input_length = IterGetIterCount (info.counter.iter)) == NO_VALUE) { return FmCannotCalc; } /*endif*/ } /*endif*/ switch (type) { case COUNTER_BIT8: *(CARD8 *) (fm->area + fm->idx) = input_length; fm->idx++; break; case COUNTER_BIT16: *(CARD16 *) (fm->area + fm->idx) = Swap16 (fm, input_length); fm->idx += 2; break; case COUNTER_BIT32: *(CARD32 *) (fm->area + fm->idx) = Swap32 (fm, input_length); fm->idx += 4; break; #if defined(_NEED64BIT) case COUNTER_BIT64: *(CARD64 *) (fm->area + fm->idx) = Swap64 (fm, input_length); fm->idx += 8; break; #endif default: break; } /*endswitch*/ _FrameMgrPutToken(fm, data, data_size); return FmSuccess; } /*endif*/ switch (type) { case BIT8: if (data_size == sizeof (unsigned char)) { unsigned long num = *(unsigned char *) data; *(CARD8 *) (fm->area + fm->idx) = num; } else if (data_size == sizeof (unsigned short)) { unsigned long num = *(unsigned short *) data; *(CARD8 *) (fm->area + fm->idx) = num; } else if (data_size == sizeof (unsigned int)) { unsigned long num = *(unsigned int *) data; *(CARD8 *) (fm->area + fm->idx) = num; } else if (data_size == sizeof (unsigned long)) { unsigned long num = *(unsigned long *) data; *(CARD8 *) (fm->area + fm->idx) = num; } else { ; /* Should never be reached */ } /*endif*/ fm->idx++; return FmSuccess; case BIT16: if (data_size == sizeof (unsigned char)) { unsigned long num = *(unsigned char *) data; *(CARD16*)(fm->area + fm->idx) = Swap16 (fm, num); } else if (data_size == sizeof (unsigned short)) { unsigned long num = *(unsigned short *) data; *(CARD16 *) (fm->area + fm->idx) = Swap16 (fm, num); } else if (data_size == sizeof (unsigned int)) { unsigned long num = *(unsigned int *) data; *(CARD16 *) (fm->area + fm->idx) = Swap16 (fm, num); } else if (data_size == sizeof (unsigned long)) { unsigned long num = *(unsigned long *) data; *(CARD16 *) (fm->area + fm->idx) = Swap16 (fm, num); } else { ; /* Should never reached */ } /*endif*/ fm->idx += 2; return FmSuccess; case BIT32: if (data_size == sizeof (unsigned char)) { unsigned long num = *(unsigned char *) data; *(CARD32 *) (fm->area + fm->idx) = Swap32 (fm, num); } else if (data_size == sizeof (unsigned short)) { unsigned long num = *(unsigned short *) data; *(CARD32 *) (fm->area + fm->idx) = Swap32 (fm, num); } else if (data_size == sizeof (unsigned int)) { unsigned long num = *(unsigned int *) data; *(CARD32 *) (fm->area + fm->idx) = Swap32 (fm, num); } else if (data_size == sizeof (unsigned long)) { unsigned long num = *(unsigned long *) data; *(CARD32 *) (fm->area + fm->idx) = Swap32 (fm, num); } else { ; /* Should never reached */ } /*endif*/ fm->idx += 4; return FmSuccess; #if defined(_NEED64BIT) case BIT64: if (data_size == sizeof (unsigned char)) { unsigned long num = *(unsigned char *) data; *(CARD64 *) (fm->area + fm->idx) = Swap64 (fm, num); } else if (data_size == sizeof (unsigned short)) { unsigned long num = *(unsigned short *) data; *(CARD64 *) (fm->area + fm->idx) = Swap64 (fm, num); } else if (data_size == sizeof (unsigned int)) { unsigned long num = *(unsigned int *) data; *(CARD64 *) (fm->area + fm->idx) = Swap64 (fm, num); } else if (data_size == sizeof (unsigned long)) { unsigned long num = *(unsigned long *) data; *(CARD64 *) (fm->area + fm->idx) = Swap64 (fm, num); } else { ; /* Should never reached */ } /*endif*/ fm->idx += 4; return FmSuccess; #endif case BARRAY: if (info.num == NO_VALUE) return FmInvalidCall; /*endif*/ if (info.num > 0) { bcopy (*(char **) data, fm->area + fm->idx, info.num); fm->idx += info.num; } /*endif*/ return FmSuccess; case PADDING: if (info.num == NO_VALUE) return FmInvalidCall; /*endif*/ fm->idx += info.num; return _FrameMgrPutToken(fm, data, data_size); case ITER: return FmInvalidCall; case EOL: return FmEOD; default: break; } /*endswitch*/ return (FmStatus) NULL; /* Should never be reached */ } FmStatus _FrameMgrGetToken (FrameMgr fm , void* data, int data_size) { XimFrameType type; static XimFrameTypeInfoRec info; /* memory */ FrameIter fitr; if (fm->total_size != NO_VALUE && fm->idx >= fm->total_size) return FmNoMoreData; /*endif*/ type = FrameInstGetNextType(fm->fi, &info); if (type & COUNTER_MASK) { int end=0; FrameIter client_data; type &= ~COUNTER_MASK; switch (type) { case BIT8: end = *(CARD8 *) (fm->area + fm->idx); break; case BIT16: end = Swap16 (fm, *(CARD16 *) (fm->area + fm->idx)); break; case BIT32: end = Swap32 (fm, *(CARD32 *) (fm->area + fm->idx)); break; #if defined(_NEED64BIT) case BIT64: end = Swap64 (fm, *(CARD64 *) (fm->area + fm->idx)); break; #endif default: break; } /*endswitch*/ if ((client_data = _FrameMgrAppendIter (fm, info.counter.iter, end))) { IterSetStarter (info.counter.iter); IterSetStartWatch (info.counter.iter, _IterStartWatch, (void *) client_data); } /*endif*/ } /*endif*/ type &= ~COUNTER_MASK; switch (type) { case BIT8: if (data_size == sizeof (unsigned char)) { *(unsigned char*) data = *(CARD8 *) (fm->area + fm->idx); } else if (data_size == sizeof (unsigned short)) { *(unsigned short *) data = *(CARD8 *) (fm->area + fm->idx); } else if (data_size == sizeof (unsigned int)) { *(unsigned int *) data = *(CARD8 *) (fm->area + fm->idx); } else if (data_size == sizeof (unsigned long)) { *(unsigned long *) data = *(CARD8 *) (fm->area + fm->idx); } else { ; /* Should never reached */ } /*endif*/ fm->idx++; if ((fitr = _FrameIterCounterIncr (fm->iters, 1/*BIT8*/))) _FrameMgrRemoveIter (fm, fitr); /*endif*/ return FmSuccess; case BIT16: if (data_size == sizeof (unsigned char)) { *(unsigned char *) data = Swap16 (fm, *(CARD16 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned short)) { *(unsigned short *) data = Swap16 (fm, *(CARD16 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned int)) { *(unsigned int *) data = Swap16 (fm, *(CARD16 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned long)) { *(unsigned long *) data = Swap16 (fm, *(CARD16 *) (fm->area + fm->idx)); } else { ; /* Should never reached */ } /*endif*/ fm->idx += 2; if ((fitr = _FrameIterCounterIncr (fm->iters, 2/*BIT16*/))) _FrameMgrRemoveIter(fm, fitr); /*endif*/ return FmSuccess; case BIT32: if (data_size == sizeof (unsigned char)) { *(unsigned char *) data = Swap32 (fm, *(CARD32 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned short)) { *(unsigned short *) data = Swap32 (fm, *(CARD32 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned int)) { *(unsigned int *) data = Swap32 (fm, *(CARD32 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned long)) { *(unsigned long *) data = Swap32 (fm, *(CARD32 *) (fm->area + fm->idx)); } else { ; /* Should never reached */ } /*endif*/ fm->idx += 4; if ((fitr = _FrameIterCounterIncr (fm->iters, 4/*BIT32*/))) _FrameMgrRemoveIter (fm, fitr); /*endif*/ return FmSuccess; #if defined(_NEED64BIT) case BIT64: if (data_size == sizeof (unsigned char)) { *(unsigned char *) data = Swap64 (fm, *(CARD64 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned short)) { *(unsigned short *) data = Swap64 (fm, *(CARD64 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned int)) { *(unsigned int *) data = Swap64 (fm, *(CARD64 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned long)) { *(unsigned long *) data = Swap64 (fm, *(CARD64 *) (fm->area + fm->idx)); } else { ; /* Should never reached */ } /*endif*/ fm->idx += 8; if ((fitr = _FrameIterCounterIncr (fm->iters, 8/*BIT64*/))) _FrameMgrRemoveIter (fm, fitr); /*endif*/ return FmSuccess; #endif case BARRAY: if (info.num == NO_VALUE) return FmInvalidCall; /*endif*/ if (info.num > 0) { *(char **) data = fm->area + fm->idx; fm->idx += info.num; if ((fitr = _FrameIterCounterIncr (fm->iters, info.num))) _FrameMgrRemoveIter (fm, fitr); /*endif*/ } else { *(char **) data = NULL; } /*endif*/ return FmSuccess; case PADDING: if (info.num == NO_VALUE) return FmInvalidCall; /*endif*/ fm->idx += info.num; if ((fitr = _FrameIterCounterIncr (fm->iters, info.num))) _FrameMgrRemoveIter (fm, fitr); /*endif*/ return _FrameMgrGetToken (fm, data, data_size); case ITER: return FmInvalidCall; /* if comes here, it's a bug! */ case EOL: return FmEOD; default: break; } /*endswitch*/ return (FmStatus) NULL; /* Should never be reached */ } FmStatus FrameMgrSetSize (FrameMgr fm, int barray_size) { if (FrameInstSetSize (fm->fi, barray_size) == FmSuccess) return FmSuccess; /*endif*/ return FmNoMoreData; } FmStatus FrameMgrSetIterCount (FrameMgr fm, int count) { if (FrameInstSetIterCount (fm->fi, count) == FmSuccess) return FmSuccess; /*endif*/ return FmNoMoreData; } FmStatus FrameMgrSetTotalSize (FrameMgr fm, int total_size) { fm->total_size = total_size; return FmSuccess; } int FrameMgrGetTotalSize (FrameMgr fm) { return FrameInstGetTotalSize (fm->fi); } int FrameMgrGetSize (FrameMgr fm) { register int ret_size; ret_size = FrameInstGetSize (fm->fi); if (ret_size == NO_VALID_FIELD) return NO_VALUE; /*endif*/ return ret_size; } FmStatus FrameMgrSkipToken (FrameMgr fm, int skip_count) { XimFrameType type; XimFrameTypeInfoRec info; register int i; if (fm->total_size != NO_VALUE && fm->idx >= fm->total_size) return FmNoMoreData; /*endif*/ for (i = 0; i < skip_count; i++) { type = FrameInstGetNextType (fm->fi, &info); type &= ~COUNTER_MASK; switch (type) { case BIT8: fm->idx++; break; case BIT16: fm->idx += 2; break; case BIT32: fm->idx += 4; break; case BIT64: fm->idx += 8; break; case BARRAY: if (info.num == NO_VALUE) return FmInvalidCall; /*endif*/ fm->idx += info.num; break; case PADDING: if (info.num == NO_VALUE) return FmInvalidCall; /*endif*/ fm->idx += info.num; return FrameMgrSkipToken (fm, skip_count); case ITER: return FmInvalidCall; case EOL: return FmEOD; default: break; } /*endswitch*/ } /*endfor*/ return FmSuccess; } void FrameMgrReset (FrameMgr fm) { fm->idx = 0; FrameInstReset (fm->fi); } Bool FrameMgrIsIterLoopEnd (FrameMgr fm, FmStatus* status) { do { if (_FrameMgrIsIterLoopEnd (fm)) return True; /*endif*/ } while (_FrameMgrProcessPadding (fm, status)); return False; } /* Internal routines */ static Bool _FrameMgrIsIterLoopEnd (FrameMgr fm) { return FrameInstIsIterLoopEnd (fm->fi); } static Bool _FrameMgrProcessPadding (FrameMgr fm, FmStatus* status) { XimFrameTypeInfoRec info; XimFrameType next_type = FrameInstPeekNextType (fm->fi, &info); FrameIter fitr; if (next_type == PADDING) { if (info.num == NO_VALUE) { *status = FmInvalidCall; return True; } /*endif*/ next_type = FrameInstGetNextType (fm->fi, &info); fm->idx += info.num; if ((fitr = _FrameIterCounterIncr (fm->iters, info.num))) _FrameMgrRemoveIter (fm, fitr); /*endif*/ *status = FmSuccess; return True; } /*endif*/ *status = FmSuccess; return False; } static FrameInst FrameInstInit (XimFrame frame) { FrameInst fi; fi = (FrameInst) Xmalloc (sizeof (FrameInstRec)); fi->template = frame; fi->cur_no = 0; ChainMgrInit (&fi->cm); return fi; } static void FrameInstFree (FrameInst fi) { ChainIterRec ci; int frame_no; ExtraDataRec d; ChainIterInit (&ci, &fi->cm); while (ChainIterGetNext (&ci, &frame_no, &d)) { register XimFrameType type; type = fi->template[frame_no].type; if (type == ITER) { if (d.iter) IterFree (d.iter); /*endif*/ } else if (type == POINTER) { if (d.fi) FrameInstFree (d.fi); /*endif*/ } /*endif*/ } /*endwhile*/ ChainIterFree (&ci); ChainMgrFree (&fi->cm); Xfree (fi); } static XimFrameType FrameInstGetNextType(FrameInst fi, XimFrameTypeInfo info) { XimFrameType ret_type; ret_type = fi->template[fi->cur_no].type; switch (ret_type) { case BIT8: case BIT16: case BIT32: case BIT64: case EOL: fi->cur_no = _FrameInstIncrement(fi->template, fi->cur_no); break; case COUNTER_BIT8: case COUNTER_BIT16: case COUNTER_BIT32: case COUNTER_BIT64: if (info) { register int offset, iter_idx; info->counter.is_byte_len = (((long) fi->template[fi->cur_no].data & 0xFF)) == FmCounterByte; offset = ((long) fi->template[fi->cur_no].data) >> 8; iter_idx = fi->cur_no + offset; if (fi->template[iter_idx].type == ITER) { ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData (&fi->cm, iter_idx)) == NULL) { dr.iter = IterInit (&fi->template[iter_idx + 1], NO_VALUE); d = ChainMgrSetData (&fi->cm, iter_idx, dr); } /*endif*/ info->counter.iter = d->iter; } else { /* Should never reach here */ } /*endif*/ } /*endif*/ fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); break; case BARRAY: if (info) { ExtraData d; if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) info->num = NO_VALUE; else info->num = d->num; /*endif*/ } /*endif*/ fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); break; case PADDING: if (info) { register int unit; register int number; register int size; register int i; unit = _UNIT ((long) fi->template[fi->cur_no].data); number = _NUMBER ((long) fi->template[fi->cur_no].data); i = fi->cur_no; size = 0; while (number > 0) { i = _FrameInstDecrement (fi->template, i); size += _FrameInstGetItemSize (fi, i); number--; } /*endwhile*/ info->num = (unit - (size%unit))%unit; } /*endif*/ fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); break; case ITER: { ExtraData d; ExtraDataRec dr; XimFrameType sub_type; if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) { dr.iter = IterInit (&fi->template[fi->cur_no + 1], NO_VALUE); d = ChainMgrSetData (&fi->cm, fi->cur_no, dr); } /*endif*/ sub_type = IterGetNextType (d->iter, info); if (sub_type == EOL) { fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); ret_type = FrameInstGetNextType (fi, info); } else { ret_type = sub_type; } /*endif*/ } break; case POINTER: { ExtraData d; ExtraDataRec dr; XimFrameType sub_type; if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) { dr.fi = FrameInstInit (fi->template[fi->cur_no + 1].data); d = ChainMgrSetData (&fi->cm, fi->cur_no, dr); } /*endif*/ sub_type = FrameInstGetNextType (d->fi, info); if (sub_type == EOL) { fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); ret_type = FrameInstGetNextType (fi, info); } else { ret_type = sub_type; } /*endif*/ } break; default: break; } /*endswitch*/ return ret_type; } static XimFrameType FrameInstPeekNextType (FrameInst fi, XimFrameTypeInfo info) { XimFrameType ret_type; ret_type = fi->template[fi->cur_no].type; switch (ret_type) { case BIT8: case BIT16: case BIT32: case BIT64: case EOL: break; case COUNTER_BIT8: case COUNTER_BIT16: case COUNTER_BIT32: case COUNTER_BIT64: if (info) { register int offset; register int iter_idx; info->counter.is_byte_len = (((long) fi->template[fi->cur_no].data) & 0xFF) == FmCounterByte; offset = ((long)fi->template[fi->cur_no].data) >> 8; iter_idx = fi->cur_no + offset; if (fi->template[iter_idx].type == ITER) { ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData (&fi->cm, iter_idx)) == NULL) { dr.iter = IterInit (&fi->template[iter_idx + 1], NO_VALUE); d = ChainMgrSetData (&fi->cm, iter_idx, dr); } /*endif*/ info->counter.iter = d->iter; } else { /* Should not be reached here */ } /*endif*/ } /*endif*/ break; case BARRAY: if (info) { ExtraData d; if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) info->num = NO_VALUE; else info->num = d->num; /*endif*/ } /*endif*/ break; case PADDING: if (info) { register int unit; register int number; register int size; register int i; unit = _UNIT ((long) fi->template[fi->cur_no].data); number = _NUMBER ((long) fi->template[fi->cur_no].data); i = fi->cur_no; size = 0; while (number > 0) { i = _FrameInstDecrement (fi->template, i); size += _FrameInstGetItemSize (fi, i); number--; } /*endwhile*/ info->num = (unit - (size%unit))%unit; } /*endif*/ break; case ITER: { ExtraData d; ExtraDataRec dr; XimFrameType sub_type; if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) { dr.iter = IterInit (&fi->template[fi->cur_no + 1], NO_VALUE); d = ChainMgrSetData (&fi->cm, fi->cur_no, dr); } /*endif*/ sub_type = IterPeekNextType (d->iter, info); if (sub_type == EOL) ret_type = FrameInstPeekNextType (fi, info); else ret_type = sub_type; /*endif*/ } break; case POINTER: { ExtraData d; ExtraDataRec dr; XimFrameType sub_type; if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) { dr.fi = FrameInstInit (fi->template[fi->cur_no + 1].data); d = ChainMgrSetData (&fi->cm, fi->cur_no, dr); } /*endif*/ sub_type = FrameInstPeekNextType (d->fi, info); if (sub_type == EOL) ret_type = FrameInstPeekNextType (fi, info); else ret_type = sub_type; /*endif*/ default: break; } break; } /*endswitch*/ return ret_type; } static Bool FrameInstIsIterLoopEnd (FrameInst fi) { Bool ret = False; if (fi->template[fi->cur_no].type == ITER) { ExtraData d = ChainMgrGetExtraData (&fi->cm, fi->cur_no); Bool yourself; if (d) { ret = IterIsLoopEnd (d->iter, &yourself); if (ret && yourself) fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); /*endif*/ } /*endif*/ } /*endif*/ return (ret); } static FrameIter _FrameMgrAppendIter (FrameMgr fm, Iter it, int end) { FrameIter p = fm->iters; while (p && p->next) p = p->next; /*endwhile*/ if (!p) { fm->iters = p = (FrameIter) Xmalloc (sizeof (FrameIterRec)); } else { p->next = (FrameIter) Xmalloc (sizeof (FrameIterRec)); p = p->next; } /*endif*/ if (p) { p->iter = it; p->counting = False; p->counter = 0; p->end = end; p->next = NULL; } /*endif*/ return (p); } static void _FrameMgrRemoveIter (FrameMgr fm, FrameIter it) { FrameIter prev; FrameIter p; prev = NULL; p = fm->iters; while (p) { if (p == it) { if (prev) prev->next = p->next; else fm->iters = p->next; /*endif*/ Xfree (p); break; } /*endif*/ prev = p; p = p->next; } /*endwhile*/ } static FrameIter _FrameIterCounterIncr (FrameIter fitr, int i) { FrameIter p = fitr; while (p) { if (p->counting) { p->counter += i; if (p->counter >= p->end) { IterFixIteration (p->iter); return (p); } /*endif*/ } /*endif*/ p = p->next; } /*endwhile*/ return (NULL); } static void _IterStartWatch (Iter it, void *client_data) { FrameIter p = (FrameIter) client_data; p->counting = True; } static FmStatus FrameInstSetSize (FrameInst fi, int num) { ExtraData d; ExtraDataRec dr; XimFrameType type; register int i; i = 0; while ((type = fi->template[i].type) != EOL) { switch (type) { case BARRAY: if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) { dr.num = -1; d = ChainMgrSetData (&fi->cm, i, dr); } /*endif*/ if (d->num == NO_VALUE) { d->num = num; return FmSuccess; } /*endif*/ break; case ITER: if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) { dr.iter = IterInit (&fi->template[i + 1], NO_VALUE); d = ChainMgrSetData (&fi->cm, i, dr); } /*endif*/ if (IterSetSize (d->iter, num) == FmSuccess) return FmSuccess; /*endif*/ break; case POINTER: if ((d = ChainMgrGetExtraData(&fi->cm, i)) == NULL) { dr.fi = FrameInstInit(fi->template[i + 1].data); d = ChainMgrSetData(&fi->cm, i, dr); } /*endif*/ if (FrameInstSetSize(d->fi, num) == FmSuccess) return FmSuccess; /*endif*/ break; default: break; } /*endswitch*/ i = _FrameInstIncrement(fi->template, i); } /*endwhile*/ return FmNoMoreData; } static int FrameInstGetSize (FrameInst fi) { XimFrameType type; register int i; ExtraData d; ExtraDataRec dr; int ret_size; i = fi->cur_no; while ((type = fi->template[i].type) != EOL) { switch (type) { case BARRAY: if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) return NO_VALUE; /*endif*/ return d->num; case ITER: if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) { dr.iter = IterInit (&fi->template[i + 1], NO_VALUE); d = ChainMgrSetData (&fi->cm, i, dr); } /*endif*/ ret_size = IterGetSize(d->iter); if (ret_size != NO_VALID_FIELD) return ret_size; /*endif*/ break; case POINTER: if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) { dr.fi = FrameInstInit (fi->template[i + 1].data); d = ChainMgrSetData (&fi->cm, i, dr); } /*endif*/ ret_size = FrameInstGetSize (d->fi); if (ret_size != NO_VALID_FIELD) return ret_size; /*endif*/ break; default: break; } /*endswitch*/ i = _FrameInstIncrement (fi->template, i); } /*endwhile*/ return NO_VALID_FIELD; } static FmStatus FrameInstSetIterCount (FrameInst fi, int num) { ExtraData d; ExtraDataRec dr; register int i; XimFrameType type; i = 0; while ((type = fi->template[i].type) != EOL) { switch (type) { case ITER: if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) { dr.iter = IterInit (&fi->template[i + 1], num); (void)ChainMgrSetData (&fi->cm, i, dr); return FmSuccess; } /*endif*/ if (IterSetIterCount (d->iter, num) == FmSuccess) return FmSuccess; /*endif*/ break; case POINTER: if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) { dr.fi = FrameInstInit (fi->template[i + 1].data); d = ChainMgrSetData (&fi->cm, i, dr); } /*endif*/ if (FrameInstSetIterCount (d->fi, num) == FmSuccess) return FmSuccess; /*endif*/ break; default: break; } /*endswitch*/ i = _FrameInstIncrement (fi->template, i); } /*endwhile*/ return FmNoMoreData; } static int FrameInstGetTotalSize (FrameInst fi) { register int size; register int i; size = 0; i = 0; while (fi->template[i].type != EOL) { size += _FrameInstGetItemSize (fi, i); i = _FrameInstIncrement (fi->template, i); } /*endwhile*/ return size; } static void FrameInstReset (FrameInst fi) { ChainIterRec ci; int frame_no; ExtraDataRec d; ChainIterInit (&ci, &fi->cm); while (ChainIterGetNext (&ci, &frame_no, &d)) { register XimFrameType type; type = fi->template[frame_no].type; if (type == ITER) { if (d.iter) IterReset (d.iter); /*endif*/ } else if (type == POINTER) { if (d.fi) FrameInstReset (d.fi); /*endif*/ } /*endif*/ } /*endwhile*/ ChainIterFree (&ci); fi->cur_no = 0; } static Iter IterInit (XimFrame frame, int count) { Iter it; register XimFrameType type; it = (Iter) Xmalloc (sizeof (IterRec)); it->template = frame; it->max_count = (count == NO_VALUE) ? 0 : count; it->allow_expansion = (count == NO_VALUE); it->cur_no = 0; it->start_watch_proc = NULL; it->client_data = NULL; it->start_counter = False; type = frame->type; if (type & COUNTER_MASK) { /* COUNTER_XXX cannot be an item of a ITER */ Xfree (it); return NULL; } /*endif*/ switch (type) { case BIT8: case BIT16: case BIT32: case BIT64: /* Do nothing */ break; case BARRAY: case ITER: case POINTER: ChainMgrInit (&it->cm); break; default: Xfree (it); return NULL; /* This should never occur */ } /*endswitch*/ return it; } static void IterFree (Iter it) { switch (it->template->type) { case BARRAY: ChainMgrFree (&it->cm); break; case ITER: { ChainIterRec ci; int count; ExtraDataRec d; ChainIterInit (&ci, &it->cm); while (ChainIterGetNext (&ci, &count, &d)) IterFree (d.iter); /*endwhile*/ ChainIterFree (&ci); ChainMgrFree (&it->cm); } break; case POINTER: { ChainIterRec ci; int count; ExtraDataRec dr; ChainIterInit (&ci, &it->cm); while (ChainIterGetNext (&ci, &count, &dr)) FrameInstFree (dr.fi); /*endwhile*/ ChainIterFree (&ci); ChainMgrFree (&it->cm); } break; default: break; } /*endswitch*/ Xfree (it); } static Bool IterIsLoopEnd (Iter it, Bool *myself) { Bool ret = False; *myself = False; if (!it->allow_expansion && (it->cur_no == it->max_count)) { *myself = True; return True; } /*endif*/ if (it->template->type == POINTER) { ExtraData d = ChainMgrGetExtraData (&it->cm, it->cur_no); if (d) { if (FrameInstIsIterLoopEnd (d->fi)) { ret = True; } else { if (FrameInstIsEnd (d->fi)) { it->cur_no++; if (!it->allow_expansion && it->cur_no == it->max_count) { *myself = True; ret = True; } /*endif*/ } /*endif*/ } /*endif*/ } /*endif*/ } else if (it->template->type == ITER) { ExtraData d = ChainMgrGetExtraData (&it->cm, it->cur_no); if (d) { Bool yourself; if (IterIsLoopEnd (d->iter, &yourself)) ret = True; /*endif*/ } /*endif*/ } /*endif*/ return ret; } static XimFrameType IterGetNextType (Iter it, XimFrameTypeInfo info) { XimFrameType type = it->template->type; if (it->start_counter) { (*it->start_watch_proc) (it, it->client_data); it->start_counter = False; } /*endif*/ if (it->cur_no >= it->max_count) { if (it->allow_expansion) it->max_count = it->cur_no + 1; else return EOL; /*endif*/ } /*endif*/ switch (type) { case BIT8: case BIT16: case BIT32: case BIT64: it->cur_no++; return type; case BARRAY: if (info) { ExtraData d; if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) info->num = NO_VALUE; else info->num = d->num; /*endif*/ } /*endif*/ it->cur_no++; return BARRAY; case ITER: { XimFrameType ret_type; ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) { dr.iter = IterInit (it->template + 1, NO_VALUE); d = ChainMgrSetData (&it->cm, it->cur_no, dr); } /*endif*/ ret_type = IterGetNextType (d->iter, info); if (ret_type == EOL) { it->cur_no++; ret_type = IterGetNextType (it, info); } /*endif*/ return ret_type; } case POINTER: { XimFrameType ret_type; ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) { dr.fi = FrameInstInit (it->template[1].data); d = ChainMgrSetData (&it->cm, it->cur_no, dr); } /*endif*/ ret_type = FrameInstGetNextType (d->fi, info); if (ret_type == EOL) { it->cur_no++; ret_type = IterGetNextType (it, info); } /*endif*/ return ret_type; } default: return (XimFrameType) NULL; } /*endswitch*/ return (XimFrameType) NULL; /* This should never occur */ } static XimFrameType IterPeekNextType (Iter it, XimFrameTypeInfo info) { XimFrameType type = it->template->type; if (!it->allow_expansion && it->cur_no >= it->max_count) return (EOL); /*endif*/ switch (type) { case BIT8: case BIT16: case BIT32: case BIT64: return type; case BARRAY: if (info) { ExtraData d; if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) info->num = NO_VALUE; else info->num = d->num; /*endif*/ } /*endif*/ return BARRAY; case ITER: { XimFrameType ret_type; ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) { dr.iter = IterInit (it->template + 1, NO_VALUE); d = ChainMgrSetData (&it->cm, it->cur_no, dr); } /*endif*/ ret_type = IterPeekNextType (d->iter, info); if (ret_type == EOL) ret_type = IterPeekNextType (it, info); /*endif*/ return ret_type; } case POINTER: { XimFrameType ret_type; ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) { dr.fi = FrameInstInit (it->template[1].data); d = ChainMgrSetData (&it->cm, it->cur_no, dr); } /*endif*/ ret_type = FrameInstPeekNextType (d->fi, info); if (ret_type == EOL) ret_type = IterPeekNextType (it, info); /*endif*/ return (ret_type); } default: break; } /*endswitch*/ /* Reaching here is a bug! */ return (XimFrameType) NULL; } static FmStatus IterSetSize (Iter it, int num) { XimFrameType type; register int i; if (!it->allow_expansion && it->max_count == 0) return FmNoMoreData; /*endif*/ type = it->template->type; switch (type) { case BARRAY: { ExtraData d; ExtraDataRec dr; for (i = 0; i < it->max_count; i++) { if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) { dr.num = NO_VALUE; d = ChainMgrSetData (&it->cm, i, dr); } /*endif*/ if (d->num == NO_VALUE) { d->num = num; return FmSuccess; } /*endif*/ } /*endfor*/ if (it->allow_expansion) { ExtraDataRec dr; dr.num = num; ChainMgrSetData (&it->cm, it->max_count, dr); it->max_count++; return FmSuccess; } /*endif*/ } return FmNoMoreData; case ITER: { ExtraData d; ExtraDataRec dr; for (i = 0; i < it->max_count; i++) { if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) { dr.iter = IterInit (it->template + 1, NO_VALUE); d = ChainMgrSetData (&it->cm, i, dr); } /*endif*/ if (IterSetSize (d->iter, num) == FmSuccess) return FmSuccess; /*endif*/ } /*endfor*/ if (it->allow_expansion) { ExtraDataRec dr; dr.iter = IterInit (it->template + 1, NO_VALUE); ChainMgrSetData (&it->cm, it->max_count, dr); it->max_count++; if (IterSetSize(dr.iter, num) == FmSuccess) return FmSuccess; /*endif*/ } /*endif*/ } return FmNoMoreData; case POINTER: { ExtraData d; ExtraDataRec dr; for (i = 0; i < it->max_count; i++) { if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) { dr.fi = FrameInstInit (it->template[1].data); d = ChainMgrSetData (&it->cm, i, dr); } /*endif*/ if (FrameInstSetSize (d->fi, num) == FmSuccess) return FmSuccess; /*endif*/ } /*endfor*/ if (it->allow_expansion) { ExtraDataRec dr; dr.fi = FrameInstInit (it->template[1].data); ChainMgrSetData (&it->cm, it->max_count, dr); it->max_count++; if (FrameInstSetSize (dr.fi, num) == FmSuccess) return FmSuccess; /*endif*/ } /*endif*/ } return FmNoMoreData; default: break; } /*endswitch*/ return FmNoMoreData; } static int IterGetSize (Iter it) { register int i; ExtraData d; ExtraDataRec dr; if (it->cur_no >= it->max_count) return NO_VALID_FIELD; /*endif*/ switch (it->template->type) { case BARRAY: if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) return NO_VALUE; /*endif*/ return d->num; case ITER: for (i = it->cur_no; i < it->max_count; i++) { int ret_size; if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) { dr.iter = IterInit (it->template + 1, NO_VALUE); d = ChainMgrSetData (&it->cm, i, dr); } /*endif*/ ret_size = IterGetSize (d->iter); if (ret_size != NO_VALID_FIELD) return ret_size; /*endif*/ } /*endfor*/ return NO_VALID_FIELD; case POINTER: for (i = it->cur_no; i < it->max_count; i++) { int ret_size; if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) { dr.fi = FrameInstInit (it->template[1].data); d = ChainMgrSetData (&it->cm, i, dr); } /*endif*/ ret_size = FrameInstGetSize (d->fi); if (ret_size != NO_VALID_FIELD) return ret_size; /*endif*/ } /*endfor*/ return NO_VALID_FIELD; default: break; } /*endswitch*/ return NO_VALID_FIELD; } static FmStatus IterSetIterCount (Iter it, int num) { register int i; if (it->allow_expansion) { it->max_count = num; it->allow_expansion = False; return FmSuccess; } /*endif*/ if (it->max_count == 0) return FmNoMoreData; /*endif*/ switch (it->template->type) { case ITER: for (i = 0; i < it->max_count; i++) { ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData(&it->cm, i)) == NULL) { dr.iter = IterInit(it->template + 1, num); (void)ChainMgrSetData(&it->cm, i, dr); return FmSuccess; } /*endif*/ if (IterSetIterCount(d->iter, num) == FmSuccess) return FmSuccess; /*endif*/ } /*endfor*/ if (it->allow_expansion) { ExtraDataRec dr; dr.iter = IterInit (it->template + 1, num); ChainMgrSetData (&it->cm, it->max_count, dr); it->max_count++; return FmSuccess; } /*endif*/ break; case POINTER: for (i = 0; i < it->max_count; i++) { ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) { dr.fi = FrameInstInit (it->template[1].data); d = ChainMgrSetData (&it->cm, i, dr); } /*endif*/ if (FrameInstSetIterCount (d->fi, num) == FmSuccess) return FmSuccess; /*endif*/ } /*endfor*/ if (it->allow_expansion) { ExtraDataRec dr; dr.fi = FrameInstInit (it->template[1].data); ChainMgrSetData (&it->cm, it->max_count, dr); it->max_count++; if (FrameInstSetIterCount (dr.fi, num) == FmSuccess) return FmSuccess; /*endif*/ } /*endif*/ break; default: break; } /*endswitch*/ return FmNoMoreData; } static int IterGetTotalSize (Iter it) { register int size, i; XimFrameType type; if (it->allow_expansion) return NO_VALUE; /*endif*/ if (it->max_count == 0) return 0; /*endif*/ size = 0; type = it->template->type; switch (type) { case BIT8: size = it->max_count; break; case BIT16: size = it->max_count*2; break; case BIT32: size = it->max_count*4; break; case BIT64: size = it->max_count*8; break; case BARRAY: for (i = 0; i < it->max_count; i++) { register int num; ExtraData d; if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) return NO_VALUE; /*endif*/ if ((num = d->num) == NO_VALUE) return NO_VALUE; /*endif*/ size += num; } /*endfor*/ break; case ITER: for (i = 0; i < it->max_count; i++) { register int num; ExtraData d; if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) return NO_VALUE; /*endif*/ if ((num = IterGetTotalSize (d->iter)) == NO_VALUE) return NO_VALUE; /*endif*/ size += num; } /*endfor*/ break; case POINTER: for (i = 0; i < it->max_count; i++) { register int num; ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) { dr.fi = FrameInstInit (it->template[1].data); d = ChainMgrSetData (&it->cm, i, dr); } /*endif*/ if ((num = FrameInstGetTotalSize (d->fi)) == NO_VALUE) return NO_VALUE; /*endif*/ size += num; } /*endfor*/ break; default: break; } /*endswitch*/ return size; } static void IterReset (Iter it) { ChainIterRec ci; int count; ExtraDataRec d; switch (it->template->type) { case ITER: ChainIterInit (&ci, &it->cm); while (ChainIterGetNext (&ci, &count, &d)) IterReset (d.iter); /*endwhile*/ ChainIterFree (&ci); break; case POINTER: ChainIterInit (&ci, &it->cm); while (ChainIterGetNext (&ci, &count, &d)) FrameInstReset (d.fi); /*endwhile*/ ChainIterFree (&ci); break; default: break; } /*endswitch*/ it->cur_no = 0; } static void IterSetStartWatch (Iter it, IterStartWatchProc proc, void *client_data) { it->start_watch_proc = proc; it->client_data = client_data; } static ExtraData ChainMgrSetData (ChainMgr cm, int frame_no, ExtraDataRec data) { Chain cur = (Chain) Xmalloc (sizeof (ChainRec)); cur->frame_no = frame_no; cur->d = data; cur->next = NULL; if (cm->top == NULL) { cm->top = cm->tail = cur; } else { cm->tail->next = cur; cm->tail = cur; } /*endif*/ return &cur->d; } static ExtraData ChainMgrGetExtraData (ChainMgr cm, int frame_no) { Chain cur; cur = cm->top; while (cur) { if (cur->frame_no == frame_no) return &cur->d; /*endif*/ cur = cur->next; } /*endwhile*/ return NULL; } static Bool ChainIterGetNext (ChainIter ci, int *frame_no, ExtraData d) { if (ci->cur == NULL) return False; /*endif*/ *frame_no = ci->cur->frame_no; *d = ci->cur->d; ci->cur = ci->cur->next; return True; } static int _FrameInstIncrement (XimFrame frame, int count) { XimFrameType type; type = frame[count].type; type &= ~COUNTER_MASK; switch (type) { case BIT8: case BIT16: case BIT32: case BIT64: case BARRAY: case PADDING: return count + 1; case POINTER: return count + 2; case ITER: return _FrameInstIncrement (frame, count + 1); default: break; } /*endswitch*/ return - 1; /* Error */ } static int _FrameInstDecrement (XimFrame frame, int count) { register int i; XimFrameType type; if (count == 0) return - 1; /* cannot decrement */ /*endif*/ if (count == 1) return 0; /* BOGUS - It should check the contents of data */ /*endif*/ type = frame[count - 2].type; type &= ~COUNTER_MASK; switch (type) { case BIT8: case BIT16: case BIT32: case BIT64: case BARRAY: case PADDING: case PTR_ITEM: return count - 1; case POINTER: case ITER: i = count - 3; while (i >= 0) { if (frame[i].type != ITER) return i + 1; /*endif*/ i--; } /*endwhile*/ return 0; default: break; } /*enswitch*/ return - 1; /* Error */ } static int _FrameInstGetItemSize (FrameInst fi, int cur_no) { XimFrameType type; type = fi->template[cur_no].type; type &= ~COUNTER_MASK; switch (type) { case BIT8: return 1; case BIT16: return 2; case BIT32: return 4; case BIT64: return 8; case BARRAY: { ExtraData d; if ((d = ChainMgrGetExtraData (&fi->cm, cur_no)) == NULL) return NO_VALUE; /*endif*/ if (d->num == NO_VALUE) return NO_VALUE; /*endif*/ return d->num; } case PADDING: { register int unit; register int number; register int size; register int i; unit = _UNIT ((long) fi->template[cur_no].data); number = _NUMBER ((long) fi->template[cur_no].data); i = cur_no; size = 0; while (number > 0) { i = _FrameInstDecrement (fi->template, i); size += _FrameInstGetItemSize (fi, i); number--; } /*endwhile*/ size = (unit - (size%unit))%unit; return size; } case ITER: { ExtraData d; int sub_size; if ((d = ChainMgrGetExtraData (&fi->cm, cur_no)) == NULL) return NO_VALUE; /*endif*/ sub_size = IterGetTotalSize (d->iter); if (sub_size == NO_VALUE) return NO_VALUE; /*endif*/ return sub_size; } case POINTER: { ExtraData d; int sub_size; if ((d = ChainMgrGetExtraData (&fi->cm, cur_no)) == NULL) return NO_VALUE; /*endif*/ sub_size = FrameInstGetTotalSize (d->fi); if (sub_size == NO_VALUE) return NO_VALUE; /*endif*/ return sub_size; } default: break; } /*endswitch*/ return NO_VALUE; } nabi-nabi-1.0.1/IMdkit/FrameMgr.h000066400000000000000000000107271430012456200163670ustar00rootroot00000000000000/****************************************************************** Copyright 1993, 1994 by Digital Equipment Corporation, Maynard, Massachusetts, All Rights Reserved 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. Author: Hiroyuki Miyamoto Digital Equipment Corporation miyamoto@jrd.dec.com This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #ifndef FRAMEMGR_H #define FRAMEMGR_H #include #include #include #if defined(VAXC) && !defined(__DECC) #define xim_externalref globalref #define xim_externaldef globaldef #else #define xim_externalref extern #define xim_externaldef #endif /* Definitions for FrameMgr */ #define COUNTER_MASK 0x10 typedef enum { BIT8 = 0x1, /* {CARD8* | INT8*} */ BIT16 = 0x2, /* {CARD16* | INT16*} */ BIT32 = 0x3, /* {CARD32* | INT32*} */ BIT64 = 0x4, /* {CARD64* | INT64*} */ BARRAY = 0x5, /* int*, void* */ ITER = 0x6, /* int* */ POINTER = 0x7, /* specifies next item is a PTR_ITEM */ PTR_ITEM = 0x8, /* specifies the item has a pointer */ /* BOGUS - POINTER and PTR_ITEM * In the current implementation, PTR_ITEM should be lead by * POINTER. But actually, it's just redundant logically. Someone * may remove this redundancy and POINTER from the enum member but he * should also modify the logic in FrameMgr program. */ PADDING = 0x9, /* specifies that a padding is needed. * This requires extra data in data field. */ EOL = 0xA, /* specifies the end of list */ COUNTER_BIT8 = COUNTER_MASK | 0x1, COUNTER_BIT16 = COUNTER_MASK | 0x2, COUNTER_BIT32 = COUNTER_MASK | 0x3, COUNTER_BIT64 = COUNTER_MASK | 0x4 } XimFrameType; /* Convenient macro */ #define _FRAME(a) {a, NULL} #define _PTR(p) {PTR_ITEM, (void *)p} /* PADDING's usage of data field * B15-B8 : Shows the number of effective items. * B7-B0 : Shows padding unit. ex) 04 shows 4 unit padding. */ #define _PAD2(n) {PADDING, (void*)((n)<<8|2)} #define _PAD4(n) {PADDING, (void*)((n)<<8|4)} #define FmCounterByte 0 #define FmCounterNumber 1 #define _BYTE_COUNTER(type, offset) \ {(COUNTER_MASK|type), (void*)((offset)<<8|FmCounterByte)} #define _NUMBER_COUNTER(type, offset) \ {(COUNTER_MASK|type), (void*)((offset)<<8|FmCounterNumber)} typedef struct _XimFrame { XimFrameType type; void* data; /* For PTR_ITEM and PADDING */ } XimFrameRec, *XimFrame; typedef enum { FmSuccess, FmEOD, FmInvalidCall, FmBufExist, FmCannotCalc, FmNoMoreData } FmStatus; typedef struct _FrameMgr *FrameMgr; FrameMgr FrameMgrInit(XimFrame frame, char* area, Bool byte_swap); void FrameMgrInitWithData(FrameMgr fm, XimFrame frame, void* area, Bool byte_swap); void FrameMgrFree(FrameMgr fm); FmStatus FrameMgrSetBuffer(FrameMgr, void*); FmStatus _FrameMgrPutToken(FrameMgr, void*, int); FmStatus _FrameMgrGetToken(FrameMgr, void*, int); FmStatus FrameMgrSetSize(FrameMgr, int); FmStatus FrameMgrSetIterCount(FrameMgr, int); FmStatus FrameMgrSetTotalSize(FrameMgr, int); int FrameMgrGetTotalSize(FrameMgr); int FrameMgrGetSize(FrameMgr); FmStatus FrameMgrSkipToken(FrameMgr, int); void FrameMgrReset(FrameMgr); Bool FrameMgrIsIterLoopEnd(FrameMgr, FmStatus*); #define FrameMgrPutToken(fm, obj) _FrameMgrPutToken((fm), &(obj), sizeof(obj)) #define FrameMgrGetToken(fm, obj) _FrameMgrGetToken((fm), &(obj), sizeof(obj)) #endif /* FRAMEMGR_H */ nabi-nabi-1.0.1/IMdkit/IMConn.c000066400000000000000000000102011430012456200157700ustar00rootroot00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by 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. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include #include #include "IMdkit.h" #include #define Va_start(a,b) va_start(a,b) static void _IMCountVaList(va_list var, int *total_count) { char *attr; *total_count = 0; for (attr = va_arg (var, char*); attr; attr = va_arg (var, char*)) { (void)va_arg (var, XIMArg *); ++(*total_count); } /*endfor*/ } static void _IMVaToNestedList(va_list var, int max_count, XIMArg **args_return) { XIMArg *args; char *attr; if (max_count <= 0) { *args_return = (XIMArg *) NULL; return; } /*endif*/ args = (XIMArg *) malloc ((unsigned) (max_count + 1)*sizeof (XIMArg)); *args_return = args; if (!args) return; /*endif*/ for (attr = va_arg (var, char*); attr; attr = va_arg (var, char *)) { args->name = attr; args->value = va_arg (var, XPointer); args++; } /*endfor*/ args->name = (char*)NULL; } static char *_FindModifiers (XIMArg *args) { char *modifiers; while (args->name) { if (strcmp (args->name, IMModifiers) == 0) { modifiers = args->value; return modifiers; } else { args++; } /*endif*/ } /*endwhile*/ return NULL; } XIMS _GetIMS (char *modifiers) { XIMS ims; extern IMMethodsRec Xi18n_im_methods; if ((ims = (XIMS) malloc (sizeof (XIMProtocolRec))) == (XIMS) NULL) return ((XIMS) NULL); /*endif*/ memset ((void *) ims, 0, sizeof (XIMProtocolRec)); if (modifiers == NULL || modifiers[0] == '\0' || strcmp (modifiers, "Xi18n") == 0) { ims->methods = &Xi18n_im_methods; return ims; } /*endif*/ free (ims); return (XIMS) NULL; } XIMS IMOpenIM (Display *display, ...) { va_list var; int total_count; XIMArg *args; XIMS ims; char *modifiers; Status ret; Va_start (var, display); _IMCountVaList (var, &total_count); va_end (var); Va_start (var, display); _IMVaToNestedList (var, total_count, &args); va_end (var); modifiers = _FindModifiers (args); ims = _GetIMS (modifiers); if (ims == (XIMS) NULL) return (XIMS) NULL; /*endif*/ ims->core.display = display; ims->protocol = (*ims->methods->setup) (display, args); XFree (args); if (ims->protocol == (void *) NULL) { XFree (ims); return (XIMS) NULL; } /*endif*/ ret = (ims->methods->openIM) (ims); if (ret == False) { XFree (ims); return (XIMS) NULL; } /*endif*/ return (XIMS) ims; } Status IMCloseIM (XIMS ims) { (ims->methods->closeIM) (ims); XFree (ims); return True; } nabi-nabi-1.0.1/IMdkit/IMMethod.c000066400000000000000000000044301430012456200163220ustar00rootroot00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by 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. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include "IMdkit.h" /* Public Function */ void IMForwardEvent (XIMS ims, XPointer call_data) { (ims->methods->forwardEvent) (ims, call_data); } void IMCommitString (XIMS ims, XPointer call_data) { (ims->methods->commitString) (ims, call_data); } int IMCallCallback (XIMS ims, XPointer call_data) { return (ims->methods->callCallback) (ims, call_data); } int IMPreeditStart (XIMS ims, XPointer call_data) { return (ims->methods->preeditStart) (ims, call_data); } int IMPreeditEnd (XIMS ims, XPointer call_data) { return (ims->methods->preeditEnd) (ims, call_data); } int IMSyncXlib(XIMS ims, XPointer call_data) { ims->sync = True; return (ims->methods->syncXlib) (ims, call_data); } nabi-nabi-1.0.1/IMdkit/IMValues.c000066400000000000000000000064451430012456200163510ustar00rootroot00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by 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. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include #include "IMdkit.h" #include #define Va_start(a,b) va_start(a,b) static void _IMCountVaList (va_list var, int *total_count) { char *attr; *total_count = 0; for (attr = va_arg (var, char *); attr; attr = va_arg (var, char *)) { (void)va_arg (var, XIMArg *); ++(*total_count); } /*endfor*/ } static void _IMVaToNestedList (va_list var, int max_count, XIMArg **args_return) { XIMArg *args; char *attr; if (max_count <= 0) { *args_return = (XIMArg *) NULL; return; } /*endif*/ args = (XIMArg *) malloc ((unsigned) (max_count + 1)*sizeof (XIMArg)); *args_return = args; if (!args) return; /*endif*/ for (attr = va_arg (var, char *); attr; attr = va_arg (var, char *)) { args->name = attr; args->value = va_arg (var, XPointer); args++; } /*endfor*/ args->name = (char *) NULL; } char *IMGetIMValues (XIMS ims, ...) { va_list var; int total_count; XIMArg *args; char *ret; Va_start (var, ims); _IMCountVaList (var, &total_count); va_end (var); Va_start (var, ims); _IMVaToNestedList (var, total_count, &args); va_end (var); ret = (*ims->methods->getIMValues) (ims, args); if (args) XFree ((char *) args); /*endif*/ return ret; } char *IMSetIMValues (XIMS ims, ...) { va_list var; int total_count; XIMArg *args; char *ret; Va_start (var, ims); _IMCountVaList (var, &total_count); va_end (var); Va_start (var, ims); _IMVaToNestedList (var, total_count, &args); va_end (var); ret = (*ims->methods->setIMValues) (ims, args); if (args) XFree ((char *) args); /*endif*/ return ret; } nabi-nabi-1.0.1/IMdkit/IMdkit.h000066400000000000000000000102661430012456200160460ustar00rootroot00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by 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. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #ifndef _IMdkit_h #define _IMdkit_h #include /* IM Attributes Name */ #define IMModifiers "modifiers" #define IMServerWindow "serverWindow" #define IMServerName "serverName" #define IMServerTransport "serverTransport" #define IMLocale "locale" #define IMInputStyles "inputStyles" #define IMProtocolHandler "protocolHandler" #define IMOnKeysList "onKeysList" #define IMOffKeysList "offKeysList" #define IMEncodingList "encodingList" #define IMFilterEventMask "filterEventMask" #define IMProtocolDepend "protocolDepend" /* Masks for IM Attributes Name */ #define I18N_IMSERVER_WIN 0x0001 /* IMServerWindow */ #define I18N_IM_NAME 0x0002 /* IMServerName */ #define I18N_IM_LOCALE 0x0004 /* IMLocale */ #define I18N_IM_ADDRESS 0x0008 /* IMServerTransport */ #define I18N_INPUT_STYLES 0x0010 /* IMInputStyles */ #define I18N_ON_KEYS 0x0020 /* IMOnKeysList */ #define I18N_OFF_KEYS 0x0040 /* IMOffKeysList */ #define I18N_IM_HANDLER 0x0080 /* IMProtocolHander */ #define I18N_ENCODINGS 0x0100 /* IMEncodingList */ #define I18N_FILTERMASK 0x0200 /* IMFilterEventMask */ #define I18N_PROTO_DEPEND 0x0400 /* IMProtoDepend */ typedef struct { char *name; XPointer value; } XIMArg; typedef struct { CARD32 keysym; CARD32 modifier; CARD32 modifier_mask; } XIMTriggerKey; typedef struct { unsigned short count_keys; XIMTriggerKey *keylist; } XIMTriggerKeys; typedef char *XIMEncoding; typedef struct { unsigned short count_encodings; XIMEncoding *supported_encodings; } XIMEncodings; typedef struct _XIMS *XIMS; typedef struct { void* (*setup) (Display *, XIMArg *); Status (*openIM) (XIMS); Status (*closeIM) (XIMS); char* (*setIMValues) (XIMS, XIMArg *); char* (*getIMValues) (XIMS, XIMArg *); Status (*forwardEvent) (XIMS, XPointer); Status (*commitString) (XIMS, XPointer); int (*callCallback) (XIMS, XPointer); int (*preeditStart) (XIMS, XPointer); int (*preeditEnd) (XIMS, XPointer); int (*syncXlib) (XIMS, XPointer); } IMMethodsRec, *IMMethods; typedef struct { Display *display; int screen; } IMCoreRec, *IMCore; typedef struct _XIMS { IMMethods methods; IMCoreRec core; Bool sync; void *protocol; } XIMProtocolRec; /* * X function declarations. */ extern XIMS IMOpenIM (Display *, ...); extern Status IMCloseIM (XIMS); extern char *IMSetIMValues (XIMS, ...); extern char *IMGetIMValues (XIMS, ...); void IMForwardEvent (XIMS, XPointer); void IMCommitString (XIMS, XPointer); int IMCallCallback (XIMS, XPointer); int IMPreeditStart (XIMS, XPointer); int IMPreeditEnd (XIMS, XPointer); int IMSyncXlib (XIMS, XPointer); #endif /* IMdkit_h */ nabi-nabi-1.0.1/IMdkit/Makefile.am000066400000000000000000000010551430012456200165440ustar00rootroot00000000000000 noinst_LIBRARIES = libXimd.a libXimd_a_CFLAGS = $(X_CFLAGS) libXimd_a_SOURCES = \ FrameMgr.c \ FrameMgr.h \ IMConn.c \ IMMethod.c \ IMValues.c \ IMdkit.h \ Xi18n.h \ Xi18nX.h \ XimFunc.h \ XimProto.h \ i18nAttr.c \ i18nClbk.c \ i18nIMProto.c \ i18nIc.c \ i18nMethod.c \ i18nPtHdr.c \ i18nUtil.c \ i18nX.c EXTRA_DIST = \ doc/Xi18n_sample/Imakefile \ doc/Xi18n_sample/IC.c \ doc/Xi18n_sample/IC.h \ doc/Xi18n_sample/Makefile.pu \ doc/Xi18n_sample/README \ doc/Xi18n_sample/sampleIM.c \ doc/API.text \ doc/CHANGELOG \ doc/README nabi-nabi-1.0.1/IMdkit/Xi18n.h000066400000000000000000000253611430012456200155760ustar00rootroot00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by 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. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #ifndef _Xi18n_h #define _Xi18n_h #include #include #include #include "XimProto.h" /* * Minor Protocol Number for Extension Protocol */ #define XIM_EXTENSION 128 #define XIM_EXT_SET_EVENT_MASK (0x30) #define XIM_EXT_FORWARD_KEYEVENT (0x32) #define XIM_EXT_MOVE (0x33) #define COMMON_EXTENSIONS_NUM 3 #include #include "IMdkit.h" /* XI18N Valid Attribute Name Definition */ #define ExtForwardKeyEvent "extForwardKeyEvent" #define ExtMove "extMove" #define ExtSetEventMask "extSetEventMask" /* * Padding macro */ #define IMPAD(length) ((4 - ((length)%4))%4) /* * Target Atom for Transport Connection */ #define LOCALES "LOCALES" #define TRANSPORT "TRANSPORT" #define I18N_OPEN 0 #define I18N_SET 1 #define I18N_GET 2 typedef struct { char *transportname; int namelen; Bool (*checkAddr) (); } TransportSW; typedef struct _XIMPending { unsigned char *p; struct _XIMPending *next; } XIMPending; typedef struct _XimProtoHdr { CARD8 major_opcode; CARD8 minor_opcode; CARD16 length; } XimProtoHdr; typedef struct { CARD16 attribute_id; CARD16 type; CARD16 length; char *name; } XIMAttr; typedef struct { CARD16 attribute_id; CARD16 type; CARD16 length; char *name; } XICAttr; typedef struct { int attribute_id; CARD16 name_length; char *name; int value_length; void *value; int type; } XIMAttribute; typedef struct { int attribute_id; CARD16 name_length; char *name; int value_length; void *value; int type; } XICAttribute; typedef struct { int length; char *name; } XIMStr; typedef struct { CARD16 major_opcode; CARD16 minor_opcode; CARD16 length; char *name; } XIMExt; typedef struct _Xi18nClient { int connect_id; CARD8 byte_order; /* '?': initial value 'B': for Big-Endian 'l': for little-endian */ int sync; XIMPending *pending; void *trans_rec; /* contains transport specific data */ struct _Xi18nClient *next; } Xi18nClient; typedef struct _Xi18nCore *Xi18n; /* * Callback Struct for XIM Protocol */ typedef struct { int major_code; int minor_code; CARD16 connect_id; } IMAnyStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD8 byte_order; CARD16 major_version; CARD16 minor_version; } IMConnectStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; } IMDisConnectStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; XIMStr lang; } IMOpenStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; } IMCloseStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 number; XIMStr *extension; } IMQueryExtensionStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 number; char **im_attr_list; } IMGetIMValuesStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; CARD16 preedit_attr_num; CARD16 status_attr_num; CARD16 ic_attr_num; XICAttribute *preedit_attr; XICAttribute *status_attr; XICAttribute *ic_attr; } IMChangeICStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; } IMDestroyICStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; CARD16 length; char *commit_string; } IMResetICStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; } IMChangeFocusStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; BITMASK16 sync_bit; CARD16 serial_number; XEvent event; } IMForwardEventStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; CARD16 flag; KeySym keysym; char *commit_string; } IMCommitStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; CARD32 flag; CARD32 key_index; CARD32 event_mask; } IMTriggerNotifyStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 encoding_number; XIMStr *encoding; /* name information */ CARD16 encoding_info_number; XIMStr *encodinginfo; /* detailed information */ CARD16 category; /* #0 for name, #1 for detail */ INT16 enc_index; /* index of the encoding determined */ } IMEncodingNegotiationStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; CARD32 flag; CARD32 forward_event_mask; CARD32 sync_event_mask; } IMSetEventMaskStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; CARD32 filter_event_mask; CARD32 intercept_event_mask; CARD32 select_event_mask; CARD32 forward_event_mask; CARD32 sync_event_mask; } IMExtSetEventMaskStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; CARD16 x; CARD16 y; } IMMoveStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; BITMASK16 flag; CARD16 error_code; CARD16 str_length; CARD16 error_type; char *error_detail; } IMErrorStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; } IMPreeditStateStruct; /* Callbacks */ typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; } IMGeometryCBStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; union { int return_value; /* PreeditStart */ XIMPreeditDrawCallbackStruct draw; /* PreeditDraw */ XIMPreeditCaretCallbackStruct caret; /* PreeditCaret */ } todo; } IMPreeditCBStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; union { XIMStatusDrawCallbackStruct draw; /* StatusDraw */ } todo; } IMStatusCBStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; XIMStringConversionCallbackStruct strconv; } IMStrConvCBStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; } IMSyncXlibStruct; typedef union _IMProtocol { int major_code; IMAnyStruct any; IMConnectStruct imconnect; IMDisConnectStruct imdisconnect; IMOpenStruct imopen; IMCloseStruct imclose; IMQueryExtensionStruct queryext; IMGetIMValuesStruct getim; IMEncodingNegotiationStruct encodingnego; IMExtSetEventMaskStruct extsetevent; IMMoveStruct extmove; IMSetEventMaskStruct setevent; IMChangeICStruct changeic; IMDestroyICStruct destroyic; IMResetICStruct resetic; IMChangeFocusStruct changefocus; IMCommitStruct commitstring; IMForwardEventStruct forwardevent; IMTriggerNotifyStruct triggernotify; IMPreeditStateStruct preedit_state; IMErrorStruct imerror; IMGeometryCBStruct geometry_callback; IMPreeditCBStruct preedit_callback; IMStatusCBStruct status_callback; IMStrConvCBStruct strconv_callback; IMSyncXlibStruct sync_xlib; long pad[32]; } IMProtocol; typedef int (*IMProtoHandler) (XIMS, IMProtocol*); #define DEFAULT_FILTER_MASK (KeyPressMask) /* Xi18nAddressRec structure */ typedef struct _Xi18nAddressRec { Display *dpy; CARD8 im_byteOrder; /* byte order 'B' or 'l' */ /* IM Values */ long imvalue_mask; Window im_window; /* IMServerWindow */ char *im_name; /* IMServerName */ char *im_locale; /* IMLocale */ char *im_addr; /* IMServerTransport */ XIMStyles input_styles; /* IMInputStyles */ XIMTriggerKeys on_keys; /* IMOnKeysList */ XIMTriggerKeys off_keys; /* IMOffKeysList */ XIMEncodings encoding_list; /* IMEncodingList */ IMProtoHandler improto; /* IMProtocolHander */ long filterevent_mask; /* IMFilterEventMask */ /* XIM_SERVERS target Atoms */ Atom selection; Atom Localename; Atom Transportname; /* XIM/XIC Attr */ int im_attr_num; XIMAttr *xim_attr; int ic_attr_num; XICAttr *xic_attr; CARD16 preeditAttr_id; CARD16 statusAttr_id; CARD16 separatorAttr_id; /* XIMExtension List */ int ext_num; XIMExt extension[COMMON_EXTENSIONS_NUM]; /* transport specific connection address */ void *connect_addr; /* actual data is defined: XSpecRec in Xi18nX.h for X-based connection. TransSpecRec in Xi18nTr.h for Socket-based connection. */ /* clients table */ Xi18nClient *clients; Xi18nClient *free_clients; } Xi18nAddressRec; typedef struct _Xi18nMethodsRec { Bool (*begin) (XIMS); Bool (*end) (XIMS); Bool (*send) (XIMS, CARD16, unsigned char*, long); Bool (*wait) (XIMS, CARD16, CARD8, CARD8); Bool (*disconnect) (XIMS, CARD16); } Xi18nMethodsRec; typedef struct _Xi18nCore { Xi18nAddressRec address; Xi18nMethodsRec methods; } Xi18nCore; #endif nabi-nabi-1.0.1/IMdkit/Xi18nX.h000066400000000000000000000036541430012456200157270ustar00rootroot00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by 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. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #ifndef _Xi18nTrX_h #define _Xi18nTrX_h #define _XIM_PROTOCOL "_XIM_PROTOCOL" #define _XIM_XCONNECT "_XIM_XCONNECT" #define XCM_DATA_LIMIT 20 typedef struct _XClient { Window client_win; /* client window */ Window accept_win; /* accept window */ } XClient; typedef struct { Atom xim_request; Atom connect_request; } XSpecRec; #endif nabi-nabi-1.0.1/IMdkit/XimFunc.h000066400000000000000000000066501430012456200162400ustar00rootroot00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by 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. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #ifndef _XimFunc_h #define _XimFunc_h /* i18nAttr.c */ void _Xi18nInitAttrList (Xi18n i18n_core); void _Xi18nInitExtension(Xi18n i18n_core); /* i18nClbk.c */ int _Xi18nGeometryCallback (XIMS ims, IMProtocol *call_data); int _Xi18nPreeditStartCallback (XIMS ims, IMProtocol *call_data); int _Xi18nPreeditDrawCallback (XIMS ims, IMProtocol *call_data); int _Xi18nPreeditCaretCallback (XIMS ims, IMProtocol *call_data); int _Xi18nPreeditDoneCallback (XIMS ims, IMProtocol *call_data); int _Xi18nStatusStartCallback (XIMS ims, IMProtocol *call_data); int _Xi18nStatusDrawCallback (XIMS ims, IMProtocol *call_data); int _Xi18nStatusDoneCallback (XIMS ims, IMProtocol *call_data); int _Xi18nStringConversionCallback (XIMS ims, IMProtocol *call_data); /* i18nIc.c */ void _Xi18nChangeIC (XIMS ims, IMProtocol *call_data, unsigned char *p, int create_flag); void _Xi18nGetIC (XIMS ims, IMProtocol *call_data, unsigned char *p); /* i18nUtil.c */ int _Xi18nNeedSwap (Xi18n i18n_core, CARD16 connect_id); Xi18nClient *_Xi18nNewClient(Xi18n i18n_core); Xi18nClient *_Xi18nFindClient (Xi18n i18n_core, CARD16 connect_id); void _Xi18nDeleteClient (Xi18n i18n_core, CARD16 connect_id); void _Xi18nDeleteAllClients (Xi18n i18n_core); void _Xi18nDeleteFreeClients (Xi18n i18n_core); void _Xi18nSendMessage (XIMS ims, CARD16 connect_id, CARD8 major_opcode, CARD8 minor_opcode, unsigned char *data, long length); void _Xi18nSendTriggerKey (XIMS ims, CARD16 connect_id); void _Xi18nSetEventMask (XIMS ims, CARD16 connect_id, CARD16 im_id, CARD16 ic_id, CARD32 forward_mask, CARD32 sync_mask); /* Xlib internal */ void _XRegisterFilterByType(Display*, Window, int, int, Bool (*filter)(Display*, Window, XEvent*, XPointer), XPointer); void _XUnregisterFilter(Display*, Window, Bool (*filter)(Display*, Window, XEvent*, XPointer), XPointer); #endif nabi-nabi-1.0.1/IMdkit/XimProto.h000066400000000000000000000142671430012456200164530ustar00rootroot00000000000000/* $XConsortium: XimProto.h,v 1.2 94/01/20 18:02:24 rws Exp $ */ /****************************************************************** Copyright 1992, 1993, 1994 by 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. Author: Takashi Fujiwara FUJITSU LIMITED fujiwara@a80.tech.yk.fujitsu.co.jp This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #ifndef _XIMPROTO_H #define _XIMPROTO_H /* * Default Preconnection selection target */ #define XIM_SERVERS "XIM_SERVERS" #define XIM_LOCALES "LOCALES" #define XIM_TRANSPORT "TRANSPORT" /* * categories in XIM_SERVERS */ #define XIM_SERVER_CATEGORY "@server=" #define XIM_LOCAL_CATEGORY "@locale=" #define XIM_TRANSPORT_CATEGORY "@transport=" /* * Xim implementation revision */ #define PROTOCOLMAJORVERSION 0 #define PROTOCOLMINORVERSION 0 /* * Major Protocol number */ #define XIM_CONNECT 1 #define XIM_CONNECT_REPLY 2 #define XIM_DISCONNECT 3 #define XIM_DISCONNECT_REPLY 4 #define XIM_AUTH_REQUIRED 10 #define XIM_AUTH_REPLY 11 #define XIM_AUTH_NEXT 12 #define XIM_AUTH_SETUP 13 #define XIM_AUTH_NG 14 #define XIM_ERROR 20 #define XIM_OPEN 30 #define XIM_OPEN_REPLY 31 #define XIM_CLOSE 32 #define XIM_CLOSE_REPLY 33 #define XIM_REGISTER_TRIGGERKEYS 34 #define XIM_TRIGGER_NOTIFY 35 #define XIM_TRIGGER_NOTIFY_REPLY 36 #define XIM_SET_EVENT_MASK 37 #define XIM_ENCODING_NEGOTIATION 38 #define XIM_ENCODING_NEGOTIATION_REPLY 39 #define XIM_QUERY_EXTENSION 40 #define XIM_QUERY_EXTENSION_REPLY 41 #define XIM_SET_IM_VALUES 42 #define XIM_SET_IM_VALUES_REPLY 43 #define XIM_GET_IM_VALUES 44 #define XIM_GET_IM_VALUES_REPLY 45 #define XIM_CREATE_IC 50 #define XIM_CREATE_IC_REPLY 51 #define XIM_DESTROY_IC 52 #define XIM_DESTROY_IC_REPLY 53 #define XIM_SET_IC_VALUES 54 #define XIM_SET_IC_VALUES_REPLY 55 #define XIM_GET_IC_VALUES 56 #define XIM_GET_IC_VALUES_REPLY 57 #define XIM_SET_IC_FOCUS 58 #define XIM_UNSET_IC_FOCUS 59 #define XIM_FORWARD_EVENT 60 #define XIM_SYNC 61 #define XIM_SYNC_REPLY 62 #define XIM_COMMIT 63 #define XIM_RESET_IC 64 #define XIM_RESET_IC_REPLY 65 #define XIM_GEOMETRY 70 #define XIM_STR_CONVERSION 71 #define XIM_STR_CONVERSION_REPLY 72 #define XIM_PREEDIT_START 73 #define XIM_PREEDIT_START_REPLY 74 #define XIM_PREEDIT_DRAW 75 #define XIM_PREEDIT_CARET 76 #define XIM_PREEDIT_CARET_REPLY 77 #define XIM_PREEDIT_DONE 78 #define XIM_STATUS_START 79 #define XIM_STATUS_DRAW 80 #define XIM_STATUS_DONE 81 /* * values for the flag of XIM_ERROR */ #define XIM_IMID_VALID 0x0001 #define XIM_ICID_VALID 0x0002 /* * XIM Error Code */ #define XIM_BadAlloc 1 #define XIM_BadStyle 2 #define XIM_BadClientWindow 3 #define XIM_BadFocusWindow 4 #define XIM_BadArea 5 #define XIM_BadSpotLocation 6 #define XIM_BadColormap 7 #define XIM_BadAtom 8 #define XIM_BadPixel 9 #define XIM_BadPixmap 10 #define XIM_BadName 11 #define XIM_BadCursor 12 #define XIM_BadProtocol 13 #define XIM_BadForeground 14 #define XIM_BadBackground 15 #define XIM_LocaleNotSupported 16 #define XIM_BadSomething 999 /* * byte order */ #define BIGENDIAN (CARD8) 0x42 /* MSB first */ #define LITTLEENDIAN (CARD8) 0x6c /* LSB first */ /* * values for the type of XIMATTR & XICATTR */ #define XimType_SeparatorOfNestedList 0 #define XimType_CARD8 1 #define XimType_CARD16 2 #define XimType_CARD32 3 #define XimType_STRING8 4 #define XimType_Window 5 #define XimType_XIMStyles 10 #define XimType_XRectangle 11 #define XimType_XPoint 12 #define XimType_XFontSet 13 #define XimType_XIMOptions 14 #define XimType_XIMHotKeyTriggers 15 #define XimType_XIMHotKeyState 16 #define XimType_XIMStringConversion 17 #define XimType_XIMPreeditState 18 #define XimType_XIMResetState 19 #define XimType_XIMValuesList 20 #define XimType_NEST 0x7FFF /* * values for the category of XIM_ENCODING_NEGOTIATON_REPLY */ #define XIM_Encoding_NameCategory 0 #define XIM_Encoding_DetailCategory 1 /* * value for the index of XIM_ENCODING_NEGOTIATON_REPLY */ #define XIM_Default_Encoding_IDX -1 /* * value for the flag of XIM_FORWARD_EVENT, XIM_COMMIT */ #define XimSYNCHRONUS 0x0001 #define XimLookupChars 0x0002 #define XimLookupKeySym 0x0004 #define XimLookupBoth 0x0006 /* * request packet header size */ #define XIM_HEADER_SIZE \ sizeof(CARD8) /* sizeof mejor-opcode */ \ + sizeof(CARD8) /* sizeof minor-opcode */ \ + sizeof(INT16) /* sizeof length */ /* * Client Message data size */ #define XIM_CM_DATA_SIZE 20 /* * XIM data structure */ typedef CARD16 BITMASK16; typedef CARD32 BITMASK32; typedef CARD32 EVENTMASK; typedef CARD16 XIMID; /* Input Method ID */ typedef CARD16 XICID; /* Input Context ID */ /* * Padding macro */ #define XIM_PAD(length) ((4 - ((length) % 4)) % 4) #define XIM_SET_PAD(ptr, length) \ { \ register int Counter = XIM_PAD((int)length); \ if (Counter) { \ register char *Ptr = (char *)(ptr) + (length); \ length += Counter; \ for (; Counter; --Counter, ++Ptr) \ *Ptr = '\0'; \ } \ } #endif nabi-nabi-1.0.1/IMdkit/doc/000077500000000000000000000000001430012456200152545ustar00rootroot00000000000000nabi-nabi-1.0.1/IMdkit/doc/API.text000066400000000000000000000733141430012456200166030ustar00rootroot00000000000000 IM Server Developers Kit - C Language Interface Hidetoshi Tajima X11R6 Xi18n Implementation Group May 15, 1994 1. Functions List 1.1. Open IM Servive XIMS IMOpenIM(Display display,...) display specifies the connection to the X server. ... specifies the variable length argument list to set IMValues. For further information, see the Section 2 "IMValues". IMOpenIM initializes the connection for the Input Method Service, and also sets one or more IMValues which are specified by a variable length argument list programming interface, and when succeeding to open the connection, IMOpenIM allocates a new XIMS structure and returns it, otherwise IMOpenIM returns NULL. XIMS is an opaque data structure to abstract the Input Method Service. First, IMOpenIM initializes a preconnection method by which clients can search for the IMserver. The convention of the preconnection varies with the IMProtocol model as below, however, you don't have to pay much attention to such difference, because IMOpenIM encapsulates it. Preconnection for R5 Ximp IMserver must create the selection owner window of the ATOM for the string, such as "_XIMP_%locale" or something, which are used by clients to search for the IMserver. Preconnection for R6 IMProtocol IMserver must create the selection owner window of the ATOM for the string, such as "@server=%im_name", and registers the ATOM with the list of "XIM_SERVERS" property of the default root window, which contains a list of ATOMs, each of which represents each available IMservers on the display. Second, IMOpenIM initialize a transport connection on which clients and the IMserver can send and receive IMProtocols with each other. The procedures to initialize the transport connection varies with the transport mechanism as below, however, you don't have to pay any attention to such difference, either, because IMOpenIM also encapsulates it. Transport connection for X IMserver must intern a number of ATOMs for the properties which are used to set some IMserver specific feature and characteristic. Transport connection for TCP/IP IMserver must open a listening socket to wait for connection request from clients. 1.2. Set IM Attributes char *IMSetIMValues(XIMS ims,...) ims specifies the input method service. ... specifies the variable length argument list to set IMValues. IMSetIMValues registers one or more IMValues, which are specified by a variable length argument list programming interface, with the XIMS structure. Note that IMOpenIM is also used to set all IMValues, and some IMValues must be set when IMOpenIM is called. IMSetIMValues returns NULL if it succeeds to set all the IMValues, otherwise, it returns the name of the first argument whose value could not be registered. 1.3. Get IM Attributes char *IMGetIMValues(XIMS ims,...) ims specifies the input method service. ... specifies the variable length argument list to get IMValues. IMGetIMValues gets one or more IMValues, which are specified by a variable length argument list programming interface, from the XIMS structure. IMGetIMValues returns NULL if it succeeds to get all the IMValues, otherwise, it returns the name of the first argument whose value could not be obtained. 1.4. Close IM Service void IMCloseIM(XIMS ims) ims specifies the input method service to be closed. IMCloseIM closes the connection which was opened by IMOpenIM. IMCloseIM frees all the allocated data in the XIMS structure, then frees the XIMS itself. 1.5. Start Preediting int IMPreeditStart(XIMS ims, XPointer im_protocol) ims specifies the input method service. im_protocol specifies the Input Protocol data. IMPreeditStart is used to start preeditting in case of Dynamic Event Flow. The structure for im_protocol varies with the IMProtocol models: /* R5 Ximp */ typedef struct { INT32 type; CARD32 icid; Window focus_win; long fwin_sel_mask; CARD32 ximp_type_mask; Window client_win; } XIMPPreeditStateStruct; /* R6 IMProtocol */ typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; } IMPreeditStateStruct; 1.6. Stop Preediting int IMPreeditEnd(XIMS ims, XPointer im_protocol) ims specifies the input method service. im_protocol specifies the Input Protocol data. IMPreeditEnd is used to stop preeditting in case of Dynamic Event Flow. However, if you registered off-keys list using IMOffKeysList IMValue, you might not need to use IMPreeditEnd, because IMdkit calls IMPreeditEnd internally when it receives a key event matching one of the registered off-keys. So, you are greatly encouraged to use IMPreeditEnd only when you did *NOT* register any off-keys list. 1.7. Forward back KeyEvent void IMForwardEvent(XIMS ims, XPointer im_protocol) ims specifies the input method service. im_protocol specifies the Input Protocol data. IMForwardEvent is used to send back a non-filtered KeyPress/KeyRelease Event. The structure for im_protocol varies with the IMProtocol models: /* R5 Ximp */ typedef struct { INT32 type; CARD32 icid; Window focus_win; long fwin_sel_mask; CARD32 ximp_type_mask; Window client_win; CARD32 keycode; CARD32 state; CARD32 time; } XIMPKeyEventStruct; /* R6 IMProtocol */ typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; /* input context ID */ BITMASK16 sync_bit; /* precessed synchronously or not */ CARD16 serial_number; XEvent event; /* X event to be filtered */ } IMForwardEventStruct; 1.8. Commit Conversion String void IMCommitString(XIMS ims, XPointer im_protocol) ims specifies the input method service. im_protocol specifies the Input Protocol data. IMCommitString is used to send a committed string, which may contain a localized text converted by the IMserver. The structure for im_protocol varies with the IMProtocol models: /* R5 Ximp */ typedef struct { INT32 type; CARD32 icid; Window focus_win; long fwin_sel_mask; CARD32 ximp_type_mask; Window client_win; char *ctext; } XIMPCommitStringStruct; /* R6 IMProtocol */ typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; /* input context ID */ CARD16 flag; /* bit combination to tell the receiver what to do */ #0001 : process it synchroously, return XIM_SYNC_REPLY #0002 : Lookup Chars #0004 : Lookup KeySym #0006 : Lookup Both = Lookup Chars and KeySym */ KeySym keysym; /* returned keysym */ char *commit_string; /* string to commit to XIM client */ } IMCommitStruct; 1.9. Call Callback int IMCallCallback(XIMS ims, XPointer im_protocol) ims specifies the input method service. im_protocol specifies the Input Protocol data. IMCallCallback is used for your IMserver to send a callback request asynchronously with the previous IMProtocol request. The type of the callback request must be set in the proper members of the im_protocol data structure by your IMserver. In addition, it's up to you to declare a new IMProtocol structure before you begin the callback requests. The structures for im_protocol varies with the IMProtocol models: /* R6 IMProtocol */ The type of the callback request must be set in major_code and minor_code members in the IMProtocol structure, e.g., you can start geometry management callback as follows; IMGeometryCBStruct geometry; ... geometry.major_code = XIM_GEOMETRY; geometry.connect_id = previous_request->any.connect_id; ... IMCallCallback(ims, (IMProtocol)&geometry); The structures for R6 IMProtocol callbacks contain: /* for Geometry Callback */ typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; } IMGeometryCBStruct; /* for Preedit Callback */ typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; union { int return_value; /* PreeditStart */ XIMPreeditDrawCallbackStruct draw; /* PreeditDraw */ XIMPreeditCaretCallbackStruct caret; /* PreeditCaret */ } todo; } IMPreeditCBStruct; /* for Status Callback */ typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; union { XIMStatusDrawCallbackStruct draw; } todo; } IMStatusCBStruct; The structures for R5 Ximp callbacks contain: /* for Geometry Callback */ typedef struct { INT32 type; CARD32 icid; Window focus_win; long fwin_sel_mask; CARD32 ximp_type_mask; Window client_win; } XIMPAnyStruct; /* for Preedit Callback */ typedef struct { INT32 type; CARD32 icid; Window focus_win; long fwin_sel_mask; CARD32 ximp_type_mask; Window client_win; union { int return_value; /* PreeditStart */ XIMPreeditDrawCallbackStruct draw; /* PreeditDraw */ XIMPreeditCaretCallbackStruct caret; /* PreeditCaret */ } todo; } XIMPPreeditCBStruct; /* for Status Callback */ typedef struct { INT32 type; CARD32 icid; Window focus_win; long fwin_sel_mask; CARD32 ximp_type_mask; Window client_win; union { XIMStatusDrawCallbackStruct draw; /* StatusDraw */ } todo; } XIMPStatusCBStruct; 2. IMValues 2.1. IMModifiers The IMModifiers argument, of type string, specifies the name of the IMProtocol model. At the current release, only three names are accepted by IMdkit. "Xi18n" specifies the R6 standard IMProtocol model "XIMP" specifies the R5 Ximp model. The IMModifiers argument must be set only once when IMOpenIM is called, and never be changed on the fly. 2.2. IMServerWindow The IMServerWindow argument, of type Window, specifies the window which identifies a method of preconnection with XIM clients. In addition to this primary purpose, the IMServerWindow might be used for any other purposes, which depends on the IMProtocol model to be used. If this argument is unspecified, a default window might be provided by IMdkit, which depends on the IMProtocol model to be used, and if it is specified, it must be done only once by either IMOpenIM or IMSetIMValues, and never be changed on the fly. 2.3. IMServerName The IMServerName argument, of type string, specifies the name of the IMserver. This argument might be a part of the IMserver identifiers by which XIM clients will search for the IMserver. The IMServerName argument must be set only once when IMOpenIM is called, and never be changed on the fly. 2.4. IMLocale The IMLocale argument, of type string, specifies a list of locales the IMserver supports. This argument might be a part of the IMserver identifiers which is used for XIM clients to search for the IMserver. The IMLocale argument must be set only once when IMOpenIM is called, and never be changed on the fly. 2.5. IMServerTransport The IMServerTransport argument, of type string, specifies the name for the transport connection mechanism the IMserver uses. This argument might be a part of the IMserver identifiers which is used for XIM clients to search for the IMserver. The preregistered formats for this argument are as follows.(*1) (*1) Reter to "The Input Method Protocol", Appendix B: The list of transport specific IM Server address format registered TCP/IP Names ------------ Syntax for Internet domain names: ::= "tcp/"":" where is either symbolic or numeric decimal form of the host machine name, and is the port on which the IMserver is listening for connections. Syntax for system internal domain names: ::= "locale/"":" where is a path name of socket address. DECnet Names ------------ Syntax for DECnet names: ::= "decnet/""::IMSERVER$" where is either symbolic or numeric decimal form of the DECnet address, and is normal, case-insensitive DECnet object name. X Names ------- Syntax for X names: ::= "X/" The IMServerTransport argument must be set only once when IMOpenIM is called, and never be changed on the fly. 2.6. IMInputStyles The IMInputStyles argument, of type XIMStyles, specifies a list of the input styles the IMserver supports. If this argument is unspecified, a default list might be provided by IMdkit, which depends on the IMProtocol model to be used, and it can be set by either IMOpenIM or IMSetIMValues, but should not be changed on the fly. 2.7. IMProtocolHandler The IMProtocolHandler argument, of type IMProtoHandler, specifies the callback function which is called each time when IMMainLoop receives an IMProtocol input from XIM clients. The generic prototype of the IMProtocolHandler function is; typedef int (*IMProtoHandler)(); int ProtocolHandlerProc(ims, call_data) XIMS ims; XPointer call_data; call_data points to a IMProtocol structure. 2.8. IMOnKeysList The IMOnKeysList argument, of type XIMTriggerKeys, specifies the list of preediting start-keys for Dynamic Event Flow model. The IMOnKeysList IMValue is mandatary for IMserver to support Dynamic Event Flow Model, so that the IMlibrary can send the IMserver a request to start preediting with the apperance of one of these registered on-keys. If the IMOnKeysList is left unspecified, no default will be provided, and Static Event Flow model will be used. XIMTriggerKeys structure is defined by IMdkit as follows: typedef struct { CARD32 keysym; CARD32 modifier; CARD32 modifier_mask; } XIMTriggerKey; typedef struct { unsigned short count_keys; XIMTriggerKey *keylist; } XIMTriggerKeys; 2.9. IMOffKeysList The IMOnKeysList argument, of type XIMTriggerKeys, specifies the list of preediing end-keys for Dynamic Event Flow model. The IMOffKeysList IMValue is optional for IMserver to support Dynamic Event Flow Model. When it is specified, the IMlibrary can send the IMserver a request to stop preediting with the apperance of one of these registered off-keys, while it's unspecified, the IMserver calls IMPreeditEnd to notify the IMlibrary to stop preeditting when the IMserver would like to stop preeditring. If the IMOffKeysList is left unspecified, no default will be provided. 2.10. IMEncodingList The IMEncodingList argument, of type XIMEncodings, specifies the list of encodings the IMserver supports. XIM client will be notified of this argument immediately after it makes a connection with the IMserver. The IMEncdoingList argument is used to specify which encodings can be used to exchange localized-text between the IMserver and XIM clients. If it's left unspecified, only "COMPOUND_TEXT" encoding will be used as a fallback default. XIMEncodings structure is defined by IMdkit as follows: typedef char *XIMEncoding; typedef struct { unsigned short count_encodings; XIMEncoding *supported_encodings; } XIMEncodings; 2.11. IMFilterEventMask The IMFilterEventMask argument, of type long, specifies the events which should be filtered by the IMserver during the preeditting is on going. If it's left unspecified, KeyPressMask (1L<<0) will be fallback default. 2.12. IMProtocolDepend The IMProtocolDepend argument is used to specify special IM values for each IMProtocol model, if any. This attribute is passed to IMOpenIM, IMSetIMValues or IMGetIMValues as a nested variable length list generated with XVaCreateNestedList(). At this release, the names in the IMProtocolDepend list are defined only for R5 Ximp model, as below. 2.12.1. R5 Ximp dependent IM Values XIMPVersion The XIMPVersion argument, of type string, specifies the version of R5 Ximp model. value meaning --------------------------------------------- "3.5" supports Ximp version 3.5 model "4.0" supports Ximp version 4.0 model XIMPType The XIMPVersion argument, pointer to a list of type unsigned long, specifies a list of bitmask combinations, each of which indicates the event flow model your IMserver supports. All possible values to be appeared in the list are defined as follows.(*) (*) Refer to "Protocol Specification for the Distributes Input System on the X Window System, Version 11", which contains in X11R5 contribuion. XIMP_BE_TYPE1 back-end type, which IMlibrary recognizes registered keys and notifies a server to start processing key events. XIMP_FE_TYPE1 front-end type, which IMlibrary recognizes registered keys and notifies a server to start processing key events. XIMP_BE_TYPE2 back-end type, which IMlibrary does not recognize any registered keys and. IMserver will always the first to process key events. XIMP_FE_TYPE2 front-end type, which IMlibrary does not recognize any registered keys and. IMserver will always the first to process key events. XIMP_FE_TYPE3 front-end type, which key events are always passed to both IMserver and IMlibrary. Both of them recognize registered keys. XIMP_SYNC_BE_TYPE1 XIMP_BE_TYPE1 & KeyPress is transfered synchronously. XIMP_SYNC_BE_TYPE2 XIMP_BE_TYPE2 & KeyPress is transfered synchronously. XIMPExtension The XIMPExtension argument is used to set/unset the pre-registered extensions to be valid. This list is also a nested variable length list generated with XVaCreateNestedList(). At this release, the pre-registered extensins appeared in the XIMPExtension list are defined as below. XIMPExtStatusWin If it is appeared in the list, the XNExtXimp_StatusWindow input context attribute is valid to set the status window. The attribute value isn't evaluated. XIMPExtBackFront If it is appeared in the list, the XNExtXimp_Backfront input context is valid to select the front-end method or back-end method. The attribute value isn't evaluated. XIMPExtConversion If it is appeared in the list, the XNExtXimp_Conversion input context is valid to set the input mode. The attribute value isn't evaluated. 3. X IMProtocol Strucutures For each X IMProtocol input, a corresponding structure is defined in public header files of IMdkit. defines all IMProtocol structures for R6 standard IMProtocol model, and defines all for R5 Ximp model. 3.1. R6 IMProtocol 3.1.1. IMProtocol union data structure In R6 standard IMProtocol model, all the event structures have the following common members: typedef struct { int major_code; /* major code of last IMProtocol */ int minor_code; /* minor code of last IMProtocol */ CARD16 connect_id; /* client connection ID */ } IMAnyStruct; The major_code and minor_code specify the IMProtocol type constant name that uniquely identifies itself. In addition to the individual structures declared for each IMProtocol type, the IMProtocol structure is a union of the individual structures declared for each IMProtocol type. Depending on the type, you should access members of each IMProtocol by using the IMProtocol union. typedef union _IMProtocol { int major_code; IMAnyStruct any; IMConnectStruct imconnect; IMDisConnectStruct imdisconnect; IMOpenStruct imopen; IMCloseStruct imclose; IMQueryExtensionStruct queryext; IMGetIMValuesStruct getim; IMEncodingNegotiationStruct encodingnego; IMExtSetEventMaskStruct extsetevent; IMExtForwardKeyEventStruct extforward; IMExtMoveStruct extmove; IMSetEventMaskStruct setevent; IMChangeICStruct changeic; IMDestroyICStruct destroyic; IMResetICStruct resetic; IMChangeFocusStruct changefocus; IMCommitStruct commitstring; IMForwardEventStruct forwardevent; IMTriggerNotifyStruct triggernotify; IMErrorStruct imerror; IMGeometryCBStruct geometry_callback; IMPreeditCBStruct preedit_callback; IMStatusCBStruct status_callback; long pad[32]; } IMProtocol; The first two entries of any IMProtocol structure are always the major_code and minor_code members, which specifies the IMProtocol type. The third member is the connect_id member, just provided for IMdkit internal use to distinguish a client from each other. 3.1.2. Protocol Processing Some of IMProtocol requests sent by the IMlibrary are processed internally by IMdkit without passing them to your IMservers, because IMdkit can determin the answer to such IMProtocol requests only by using the IMValues which you have set in the XIMS structure. At this release, the following four IMProtocol requests is processed in IMdkit itself, and wouldn't forward to your IMserver: o XIM_CONNECT -> XIM_CONNECT_REPLY o XIM_DISCONNECT -> XIM_DISCONNECT_REPLY o XIM_QUERY_EXTENSION -> XIM_QUERY_EXTENSION_REPLY o XIM_GET_IM_VALUES -> XIM_GET_IM_VALUES_REPLY So, you don't have to know the details of the corresponding IMProtocol structures for these IMProtocol requests. On the other hand, you will need to deal with the following requests for yourselves: o XIM_OPEN o XIM_CLOSE o XIM_SET_IC_FOCUS and XIM_UNSET_IC_FOCUS o XIM_DESTROY_IC o XIM_RESET_IC o XIM_CREATE_IC, XIM_SET_IC_VALUES and XIM_GET_IC_VALUES o XIM_TRIGGER_NOTIFY o XIM_FORWARD_EVENT However, you don't have to receive any raw packets, but can receive the corresponding IMProtocol structures in your IMProtocolHandler callback function. Further, you don't have to send a reply for yourselves, but IMdkit will send a reply soon after your IMProtocolHandler returns. If your IMProtocolHandler returns True, IMdkit will send the proper reply to the previous request, and if it returns False, IMdkit will send XIM_ERROR reply to the XIM client. The following IMProtocol structures are what you will actually receive instead of IMProtocol requests in your IMProtocolHandler function. IMOpenStruct ------------ The IMOpenStruct structure is used for XIM_OPEN and XIM_OPEN_REPLY requests. The structure contains: typedef struct { int length; char *name; } XIMStr; typedef struct { int major_code; int minor_code; CARD16 connect_id; XIMStr lang; } IMOpenStruct; Your IMserver should check lang field to know which language service is required by the new client, which is identified with connect_id member. IMCloseStruct ------------- The IMCloseStruct structure is used for XIM_CLOSE and XIM_CLOSE_REPLY requests. The structure contains: typedef struct { int major_code; int minor_code; CARD16 connect_id; } IMCloseStruct; Your IMserver should check connect_id member to know which input method connection should be closed. IMChangeFocusStruct ------------------- The IMChangeFocusStruct structure is used for XIM_SET_IC_FOCUS and XIM_UNSET_IC_FOCUS requests. The structure contains: typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; /* input context ID to change focus */ } IMChangeFocusStruct; Your IMserver should check icid member to know which input context should be focusd or unfocusd. IMDestroyICStruct ----------------- The IMDestroyICStruct structure is used for XIM_DESTROY_IC and request. The structure contains: typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; /* input context ID to destroy */ } IMDestroyICStruct; Your IMserver should check icid member to know which input context should be destroyed. IMResetICStruct --------------- The IMResetICStruct structure is used for XIM_RESET_IC request. The structure contains: typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; /* input context ID to reset */ CARD16 length; /* length of committed string below */ char *commit_string; /* string to commit to XIM client */ } IMResetICStruct; Your IMserver should check icid member to know which input context should be reset. IMChangeICStruct ---------------- The IMChangeICStruct structure is used for XIM_CREATE_IC, XIM_SET_IC_VALUES and XIM_GET_IC_VALUES requests. The structures contain: /* * value type for IC defined in XimProto.h */ #define XimType_SeparatorOfNestedList 0 #define XimType_CARD8 1 #define XimType_CARD16 2 #define XimType_CARD32 3 #define XimType_STRING8 4 #define XimType_Window 5 #define XimType_XIMStyles 10 #define XimType_XRectangle 11 #define XimType_XPoint 12 #define XimType_XFontSet 13 #define XimType_XIMOptions 14 #define XimType_XIMHotKeyTriggers 15 #define XimType_XIMHotKeyState 16 #define XimType_XIMStringConversion 17 #define XimType_NEST 0x7fff typedef struct { int attribute_id; /* ID for this IC */ CARD16 name_length; /* length of IC name below */ char *name; /* IC name */ int value_length; /* length of IC value below */ void *value; /* IC value */ int type; /* value type for IC, see above */ } XICAttribute; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; /* input context ID: for each CREATE, different ID is expected to be returned. for each SET, it shows the ID to set. for each GET, it shows the ID to get. */ CARD16 preedit_attr_num; /* number of preedit_attr list below */ CARD16 status_attr_num; /* number of preedit_attr list below */ CARD16 ic_attr_num; /* number of ic_attr list below */ XICAttribute *preedit_attr; /* IC values for preedit attribute */ XICAttribute *status_attr; /* IC values for status attribute */ XICAttribute *ic_attr; /* IC values for other attributes */ } IMChangeICStruct; When XIM_SET_IC_VALUES or XIM_GET_IC_VALUES, your IMserver should check icid member to know which input context should be specified. When XIM_CREATE_IC, your IMserver should set icid member to identify the input context newly created. IMTriggerNotifyStruct --------------------- The IMTriggerNotifyStruct structure is used for XIM_TRIGGER_NOTIFY request. The structure contains: typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; CARD32 flag; CARD32 key_index; CARD32 event_mask; } IMTriggerNotifyStruct; IMForwardEventStruct -------------------- The IMForwardEventStruct structure is used for XIM_FORWARD_EVENT request. The structure contains: typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; /* input context ID */ BITMASK16 sync_bit; /* precessed synchronously or not */ CARD16 serial_number; XEvent event; /* X event to be filtered */ } IMForwardEventStruct; 3.2. R5 Ximp IMProtocol 3.2.1. XIMProtocol union data structure In R5 Ximp IMProtocol model, all the event structures have the following common members: typedef struct { INT32 type; /* message type */ CARD32 icid; /* input context ID */ Window focus_win; /* focus window */ long fwin_sel_mask; /* focus window select-mask */ CARD32 ximp_type_mask; /* Ximp event flow type */ Window client_win; /* client window */ } XIMPAnyStruct; The type member specifies the Ximp IMProtocol type constant name that uniquely identies itself. In addition to the individual structures declared for each Ximp XIMProtocol type, the Ximp IMProtocol structure is a union of the individual structures declared for each Ximp IMProtocol type. Depending on the type, you should access members of each Ximp IMProtocol by using the XIMProtocol union. typedef union _IMPProtocol { int type; XIMPAnyStruct any; XIMPKeyEventStruct keyevent; XIMPICValuesStruct create; XIMPICValuesStruct setvalue; XIMPICValuesStruct getvalue; XIMPAnyStruct destroy; XIMPAnyStruct regkey; XIMPAnyStruct setfocus; XIMPAnyStruct unsetfocus; XIMPClientWindowStruct clientwin; XIMPFocusWindowStruct focuswin; XIMPMoveStruct move; XIMPEventMaskNotifyStruct evmasknotify; XIMPExtensionStruct extension; XIMPReadPropStruct readprop; XIMPResetStruct reset; XIMPCommitStringStruct commitstring; XIMPErrorStruct error; XIMPAnyStruct geometry_cb; XIMPPreeditCBStruct preedit_cb; XIMPStatusCBStruct status_cb; long pad[24]; } IMPProtocol; The first entry of any XIMProtocol structure is always the type member, which specifies the Ximp IMProtocol type. 4. Writing IMservers When writing an IMserver that uses the IMdkit, you should make sure that your IMserver performs the following: 1. Include in your IMserver programs. 2. Include . This header file defines all the necessary data types and IMdkit functions that you need to use. 3. Include for R6 standard IMProtocol, or for R5 Ximp IMProtocol, respectively. 4. Call the IMOpenIM function with all the necessary IMValues to initialize the connection. The names of each IMValues have a global symbol that begins with IM to help catch spelling errors. For example, IMModifiers is defined for the XIMProtocol model, and IMLocale is defined for the locale resource. For further information, see "Section 1.1 Open IM Service" and Section 2 "IMValues" 5. To set additional IMValues or override the existing IMValues you set by IMOpenIM, use IMSetIMValues. You can also use IMGetIMValues to look up at existing IMValues. Note that some of IMValues must be set at the IM service creation time, and never be changed by IMSetIMValues. 6. You must set the IMProtocol callback routine by the IMProtocolHandler argument with IMOpenIM or IMSetIMValues functions. This callback is called whenever the IMProtocol is delivered by XIM clients. 7. Now you should select all the necessary X events for your windows with XSelectInput function, and map the windows with XMapWindow function, then sit in a loop processing events as follows. for (;;) { XEvent event; XNextEvent(your_display, &event); if (XFilterEvent(&event, NULL) == True) continue; YourXEventHandler(&event); } Here, all the IMProtocols you need are passed to your IMProtocol callback routine by X Filtering mechanism of XFilterEvent function, and all unfiltered X events you want are passed to YourXEventHandler function above. 8. Link your IMserver with libXimd (the IMdkit library) and libX11 (the core X library). The following provides a sample command line: cc -o sampleIM sampleIM.c -lXimd -lX11 nabi-nabi-1.0.1/IMdkit/doc/CHANGELOG000066400000000000000000000007671430012456200165000ustar00rootroot00000000000000By Tung-Han Hsieh, 2000/02/07 Fix many possible memory leaks. Fix several incorrect protocols. Change the Makefiles to be integrated to xcin-2.5. These changes are according to ami-1.0.1. This version by Steve Underwood, 1999/05/08 The first stage of a clean up and bug fix for IMdkit. This version removes the obsolete and buggy XIMP support. It fixes a number of memory leaks in Xi18n support. It has been tidied up somewhat. The clean up is far from complete There are still memory leaks. nabi-nabi-1.0.1/IMdkit/doc/README000066400000000000000000000100021430012456200161250ustar00rootroot00000000000000 IM Server Developers Kit Release Notes Hidetoshi Tajima X11R6 Xi18n Implementation Group May 15, 1995 Here is an introduction of IMserver Developers Kit, in short IMdkit, which is distributed with X11R6 contributions. 1. Scope of IMdkit IMdkit has the following six primary features. 1.1. Providing C language Interface IMdkit provides a low level interface to IMProtocol. It binds each IMProtocol operation to the interface for C language, so that you will take less efforts to make your IMservers communicable with XIM clients rather than handling IMProtocol directly. An XIM client is defined as an application program which is internationalized by using XIM API defined in X11R6. 1.2. Encapsulating actual IMProtocol operations IMdkit is designed to encapsulate the details of IMProtocol model. Using this kit, you don't have to deal with the actual byte-stream packets for yourselves, instead, you can use a set of data structures, each of which is corresponding to each actual IMProtocols, and you can deal with them in the same way as you deal with XEvent data structures. 1.3. Encapsulating Transport mechanism difference IMdkit is designed to encapsulate the transport mechanism, such as X Protocol, TCP/IP, Decnet, which are used in transmission of IMProtocol packets between Input Method library(IMlibrary, a part of Xlib) and IMserver. 1.4. Encapsulating Byte Order difference IMdkit is designed to encapsulate the difference in Byte Order between IMserver and clients, so IMservers using IMdkit can serve both little endian clients and Big endian clients at the same time, without taking care of the difference for themselves. 1.5. Encapsulating multiple IMProtocol models IMdkit is designed to be, to some extent, independent of IMProtocol model. At the current release, it deals with two different IMProtocol models, Ximp model, one of R5 sample IMProtocol models, and the R6 standard IMProtocol model. 1.6. Modeled after XIM APIs IMdkit is to IMserver Developers what XIM is to I18N application Developers, so IMdkit is modeled after XIM APIs. For example: XIM has XOpenIM and XCloseIM, and IMdkit has IMOpenIM and IMCloseIM. XIM has a concept of IMValues and provides XSetIMValues and XGetIMValues to set and get them, and IMdkit also uses IMValues and provides IMSetIMValues and IMGetIMValues to set and get them. 2. Building There is one special build instruction. Please use xmkmf with -a option, and with the top directory(path to xc) and the path to the current directory from the top directory in order to make a Makefile, include all the necessary files and check dependency. Type: xmkmf -a path_to_top(xc)_directory \ path_from_top(xc)_to_current_directory This is because IMdkit refers to some files in xc/lib/xtrans directory to support X TransportServer mechinism. 3. Documents For any detailed information, please refer to the documentation in the doc/ subdirectory. 4. Testing The IMdkit has been built and tested with the current X11R6 release (patchlevel 1) on the following systems: FUJITSU DS 7742 UXP/DS V10L20 IBM RS/6000 320H AIX 3.2.5 Sony NWS-5000 NEWS-OS 6.0.2 SPARCstation SunOS 4.1 SPARCstation Solaris 2.3 SPARCstation Solaris 2.4 HP9000 S700 HP-UX9.01 5. Bug Reports If you find a reproducible bug in this software or the documentation, please send a bug report to the following destination address: tajima@Eng.Sun.Com 6. Acknowledgements I would like to thank all the members in xi18n sample implementation group for giving useful comments and suggestions and partcipating in tests of IMdkit: Takashi Fujiwara, Hideki Hiura, Yoshio Horiuchi, Makoto Inada, Hiromu Inukai, Hiroyuki Miyamoto, Makoto Wakamatsu, Masaki Wakao, Nobuyuki Tanaka, Shigeru Yamada and Katsuhisa Yano. And I would like to make special thanks to Hiromu Inukai, who is the principal author of the Ximp facilities, and special thanks to Makoto Inada and Hiroyuki Miyamoto for providing the Frame Manager Interfaces. nabi-nabi-1.0.1/IMdkit/doc/Xi18n_sample/000077500000000000000000000000001430012456200175245ustar00rootroot00000000000000nabi-nabi-1.0.1/IMdkit/doc/Xi18n_sample/IC.c000066400000000000000000000246331430012456200201730ustar00rootroot00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by 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. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. ******************************************************************/ #include #include #include #include "IC.h" #include static IC *ic_list = (IC *)NULL; static IC *free_list = (IC *)NULL; static IC *NewIC() { static CARD16 icid = 0; IC *rec; if (free_list != NULL) { rec = free_list; free_list = free_list->next; } else { rec = (IC *)malloc(sizeof(IC)); } memset(rec, 0, sizeof(IC)); rec->id = ++icid; rec->next = ic_list; ic_list = rec; return rec; } IC *FindIC(icid) CARD16 icid; { IC *rec = ic_list; while (rec != NULL) { if (rec->id == icid) return rec; rec = rec->next; } return NULL; } static void DeleteIC(icid) CARD16 icid; { IC *rec, *last; last = NULL; for (rec = ic_list; rec != NULL; last = rec, rec = rec->next) { if (rec->id == icid) { if (last != NULL) last->next = rec->next; else ic_list = rec->next; rec->next = free_list; free_list = rec; return; } } return; } static int Is(char *attr, XICAttribute *attr_list) { return !strcmp(attr, attr_list->name); } static void StoreIC(rec, call_data) IC *rec; IMChangeICStruct *call_data; { XICAttribute *ic_attr = call_data->ic_attr; XICAttribute *pre_attr = call_data->preedit_attr; XICAttribute *sts_attr = call_data->status_attr; register int i; for (i = 0; i < (int)call_data->ic_attr_num; i++, ic_attr++) { if (Is (XNInputStyle, ic_attr)) rec->input_style = *(INT32*)ic_attr->value; else if (Is (XNClientWindow, ic_attr)) rec->client_win = *(Window*)ic_attr->value; else if (Is (XNFocusWindow, ic_attr)) rec->focus_win = *(Window*)ic_attr->value; else fprintf(stderr, "Unknown attr: %s\n", ic_attr->name); } for (i = 0; i < (int)call_data->preedit_attr_num; i++, pre_attr++) { if (Is (XNArea, pre_attr)) rec->pre_attr.area = *(XRectangle*)pre_attr->value; else if (Is (XNAreaNeeded, pre_attr)) rec->pre_attr.area_needed = *(XRectangle*)pre_attr->value; else if (Is (XNSpotLocation, pre_attr)) rec->pre_attr.spot_location = *(XPoint*)pre_attr->value; else if (Is (XNColormap, pre_attr)) rec->pre_attr.cmap = *(Colormap*)pre_attr->value; else if (Is (XNStdColormap, pre_attr)) rec->pre_attr.cmap = *(Colormap*)pre_attr->value; else if (Is (XNForeground, pre_attr)) rec->pre_attr.foreground = *(CARD32*)pre_attr->value; else if (Is (XNBackground, pre_attr)) rec->pre_attr.background = *(CARD32*)pre_attr->value; else if (Is (XNBackgroundPixmap, pre_attr)) rec->pre_attr.bg_pixmap = *(Pixmap*)pre_attr->value; else if (Is (XNFontSet, pre_attr)) { int str_length = strlen(pre_attr->value); if (rec->pre_attr.base_font != NULL) { if (Is (rec->pre_attr.base_font, pre_attr)) continue; XFree(rec->pre_attr.base_font); } rec->pre_attr.base_font = malloc(str_length + 1); strcpy(rec->pre_attr.base_font, pre_attr->value); } else if (Is (XNLineSpace, pre_attr)) rec->pre_attr.line_space = *(CARD32*)pre_attr->value; else if (Is (XNCursor, pre_attr)) rec->pre_attr.cursor = *(Cursor*)pre_attr->value; else fprintf(stderr, "Unknown attr: %s\n", ic_attr->name); } for (i = 0; i < (int)call_data->status_attr_num; i++, sts_attr++) { if (Is (XNArea, sts_attr)) rec->sts_attr.area = *(XRectangle*)sts_attr->value; else if (Is (XNAreaNeeded, sts_attr)) rec->sts_attr.area_needed = *(XRectangle*)sts_attr->value; else if (Is (XNColormap, sts_attr)) rec->sts_attr.cmap = *(Colormap*)sts_attr->value; else if (Is (XNStdColormap, sts_attr)) rec->sts_attr.cmap = *(Colormap*)sts_attr->value; else if (Is (XNForeground, sts_attr)) rec->sts_attr.foreground = *(CARD32*)sts_attr->value; else if (Is (XNBackground, sts_attr)) rec->sts_attr.background = *(CARD32*)sts_attr->value; else if (Is (XNBackgroundPixmap, sts_attr)) rec->sts_attr.bg_pixmap = *(Pixmap*)sts_attr->value; else if (Is (XNFontSet, sts_attr)) { int str_length = strlen(sts_attr->value); if (rec->sts_attr.base_font != NULL) { if (Is (rec->sts_attr.base_font, sts_attr)) continue; XFree(rec->sts_attr.base_font); } rec->sts_attr.base_font = malloc(str_length + 1); strcpy(rec->sts_attr.base_font, sts_attr->value); } else if (Is (XNLineSpace, sts_attr)) rec->sts_attr.line_space= *(CARD32*)sts_attr->value; else if (Is (XNCursor, sts_attr)) rec->sts_attr.cursor = *(Cursor*)sts_attr->value; else fprintf(stderr, "Unknown attr: %s\n", ic_attr->name); } } void CreateIC(call_data) IMChangeICStruct *call_data; { IC *rec; rec = NewIC(); if (rec == NULL) return; StoreIC(rec, call_data); call_data->icid = rec->id; return; } void DestroyIC(call_data) IMChangeICStruct *call_data; { DeleteIC(call_data->icid); return; } void SetIC(call_data) IMChangeICStruct *call_data; { IC *rec = FindIC(call_data->icid); if (rec == NULL) return; StoreIC(rec, call_data); return; } void GetIC(call_data) IMChangeICStruct *call_data; { XICAttribute *ic_attr = call_data->ic_attr; XICAttribute *pre_attr = call_data->preedit_attr; XICAttribute *sts_attr = call_data->status_attr; register int i; IC *rec = FindIC(call_data->icid); if (rec == NULL) return; for (i = 0; i < (int)call_data->ic_attr_num; i++, ic_attr++) { if (Is (XNFilterEvents, ic_attr)) { ic_attr->value = (void *)malloc(sizeof(CARD32)); *(CARD32*)ic_attr->value = KeyPressMask|KeyReleaseMask; ic_attr->value_length = sizeof(CARD32); } } /* preedit attributes */ for (i = 0; i < (int)call_data->preedit_attr_num; i++, pre_attr++) { if (Is (XNArea, pre_attr)) { pre_attr->value = (void *)malloc(sizeof(XRectangle)); *(XRectangle*)pre_attr->value = rec->pre_attr.area; pre_attr->value_length = sizeof(XRectangle); } else if (Is (XNAreaNeeded, pre_attr)) { pre_attr->value = (void *)malloc(sizeof(XRectangle)); *(XRectangle*)pre_attr->value = rec->pre_attr.area_needed; pre_attr->value_length = sizeof(XRectangle); } else if (Is (XNSpotLocation, pre_attr)) { pre_attr->value = (void *)malloc(sizeof(XPoint)); *(XPoint*)pre_attr->value = rec->pre_attr.spot_location; pre_attr->value_length = sizeof(XPoint); } else if (Is (XNFontSet, pre_attr)) { CARD16 base_len = (CARD16)strlen(rec->pre_attr.base_font); int total_len = sizeof(CARD16) + (CARD16)base_len; char *p; pre_attr->value = (void *)malloc(total_len); p = (char *)pre_attr->value; memmove(p, &base_len, sizeof(CARD16)); p += sizeof(CARD16); strncpy(p, rec->pre_attr.base_font, base_len); pre_attr->value_length = total_len; } else if (Is (XNForeground, pre_attr)) { pre_attr->value = (void *)malloc(sizeof(long)); *(long*)pre_attr->value = rec->pre_attr.foreground; pre_attr->value_length = sizeof(long); } else if (Is (XNBackground, pre_attr)) { pre_attr->value = (void *)malloc(sizeof(long)); *(long*)pre_attr->value = rec->pre_attr.background; pre_attr->value_length = sizeof(long); } else if (Is (XNLineSpace, pre_attr)) { pre_attr->value = (void *)malloc(sizeof(long)); #if 0 *(long*)pre_attr->value = rec->pre_attr.line_space; #endif *(long*)pre_attr->value = 18; pre_attr->value_length = sizeof(long); } } /* status attributes */ for (i = 0; i < (int)call_data->status_attr_num; i++, sts_attr++) { if (Is (XNArea, sts_attr)) { sts_attr->value = (void *)malloc(sizeof(XRectangle)); *(XRectangle*)sts_attr->value = rec->sts_attr.area; sts_attr->value_length = sizeof(XRectangle); } else if (Is (XNAreaNeeded, sts_attr)) { sts_attr->value = (void *)malloc(sizeof(XRectangle)); *(XRectangle*)sts_attr->value = rec->sts_attr.area_needed; sts_attr->value_length = sizeof(XRectangle); } else if (Is (XNFontSet, sts_attr)) { CARD16 base_len = (CARD16)strlen(rec->sts_attr.base_font); int total_len = sizeof(CARD16) + (CARD16)base_len; char *p; sts_attr->value = (void *)malloc(total_len); p = (char *)sts_attr->value; memmove(p, &base_len, sizeof(CARD16)); p += sizeof(CARD16); strncpy(p, rec->sts_attr.base_font, base_len); sts_attr->value_length = total_len; } else if (Is (XNForeground, sts_attr)) { sts_attr->value = (void *)malloc(sizeof(long)); *(long*)sts_attr->value = rec->sts_attr.foreground; sts_attr->value_length = sizeof(long); } else if (Is (XNBackground, sts_attr)) { sts_attr->value = (void *)malloc(sizeof(long)); *(long*)sts_attr->value = rec->sts_attr.background; sts_attr->value_length = sizeof(long); } else if (Is (XNLineSpace, sts_attr)) { sts_attr->value = (void *)malloc(sizeof(long)); #if 0 *(long*)sts_attr->value = rec->sts_attr.line_space; #endif *(long*)sts_attr->value = 18; sts_attr->value_length = sizeof(long); } } } nabi-nabi-1.0.1/IMdkit/doc/Xi18n_sample/IC.h000066400000000000000000000053311430012456200201720ustar00rootroot00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by 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. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. ******************************************************************/ typedef struct { XRectangle area; /* area */ XRectangle area_needed; /* area needed */ XPoint spot_location; /* spot location */ Colormap cmap; /* colormap */ CARD32 foreground; /* foreground */ CARD32 background; /* background */ Pixmap bg_pixmap; /* background pixmap */ char *base_font; /* base font of fontset */ CARD32 line_space; /* line spacing */ Cursor cursor; /* cursor */ } PreeditAttributes; typedef struct { XRectangle area; /* area */ XRectangle area_needed; /* area needed */ Colormap cmap; /* colormap */ CARD32 foreground; /* foreground */ CARD32 background; /* background */ Pixmap bg_pixmap; /* background pixmap */ char *base_font; /* base font of fontset */ CARD32 line_space; /* line spacing */ Cursor cursor; /* cursor */ } StatusAttributes; typedef struct _IC { CARD16 id; /* ic id */ INT32 input_style; /* input style */ Window client_win; /* client window */ Window focus_win; /* focus window */ char *resource_name; /* resource name */ char *resource_class; /* resource class */ PreeditAttributes pre_attr; /* preedit attributes */ StatusAttributes sts_attr; /* status attributes */ struct _IC *next; } IC; nabi-nabi-1.0.1/IMdkit/doc/Xi18n_sample/Imakefile000066400000000000000000000004041430012456200213330ustar00rootroot00000000000000IMDLIB = -L../IMdkit -lXimd DEPLIBS = $(DEPXONLYLIB) INCLUDES = -I../IMdkit LOCAL_LIBRARIES = $(IMDLIB) $(XONLYLIB) SRCS = sampleIM.c IC.c OBJS = sampleIM.o IC.o #CDEBUGFLAGS = -g -DX_LOCALE CDEBUGFLAGS = -g PROGRAM = sampleIM ComplexProgramTarget(sampleIM) nabi-nabi-1.0.1/IMdkit/doc/Xi18n_sample/Makefile.pu000066400000000000000000000345601430012456200216170ustar00rootroot00000000000000# Makefile generated by imake - do not edit! # $XConsortium: imake.c,v 1.91 95/01/12 16:15:47 kaleb Exp $ # ---------------------------------------------------------------------- # Makefile generated from "Imake.tmpl" and # $XConsortium: Imake.tmpl,v 1.224 94/12/27 03:57:50 gildea Exp $ # .SUFFIXES: .i # $XConsortium: Imake.cf,v 1.19 95/01/05 19:24:32 kaleb Exp $ # ----------------------------------------------------------------------- # site-specific configuration parameters that need to come before # the platform-specific parameters - edit site.def to change # site: $XConsortium: site.sample,v 1.9 94/04/08 17:02:06 rws Exp $ # ----------------------------------------------------------------------- # platform-specific configuration parameters - edit sun.cf to change # platform: $XConsortium: sun.cf,v 1.139 95/01/12 15:30:26 kaleb Exp $ # operating system: SunOS 5.3 # $XConsortium: svr4.cf,v 1.11 95/01/25 16:32:39 kaleb Exp $ # $XConsortium: sv4Lib.rules,v 1.14 94/04/09 12:00:10 rws Exp $ # ----------------------------------------------------------------------- # site-specific configuration parameters that go after # the platform-specific parameters - edit site.def to change # site: $XConsortium: site.sample,v 1.9 94/04/08 17:02:06 rws Exp $ # ----------------------------------------------------------------------- # Imake rules for building libraries, programs, scripts, and data files # rules: $XConsortium: Imake.rules,v 1.197 94/12/05 19:30:41 gildea Exp $ PATHSEP = / SHELL = /bin/sh TOP = ../../../../xc CURRENT_DIR = ../contrib/lib/IMdkit/Xi18n_sample IMAKE = $(IMAKESRC)/imake DEPEND = $(DEPENDSRC)/makedepend MKDIRHIER = $(SHELL) $(CONFIGSRC)/util/mkdirhier.sh CONFIGSRC = $(TOP)/config IMAKESRC = $(CONFIGSRC)/imake DEPENDSRC = $(CONFIGSRC)/makedepend IXXSRC = $(UNSUPPORTEDSRC)/programs/ixx IXX = $(IXXSRC)/ixx IXXFLAGS = -s BaseObject -m TypeObj -r RequestObj -p Xf IXXINCLUDES = -i '' INCROOT = /usr/X11R6/include USRLIBDIR = /usr/X11R6/lib SHLIBDIR = /usr/X11R6/lib LINTLIBDIR = $(USRLIBDIR)/lint MANPATH = /usr/X11R6/man MANSOURCEPATH = $(MANPATH)/man MANDIR = $(MANSOURCEPATH)1 LIBMANDIR = $(MANSOURCEPATH)3 FILEMANDIR = $(MANSOURCEPATH)$(FILEMANSUFFIX) AR = /usr/ccs/bin/ar cq BOOTSTRAPCFLAGS = -DSVR4 CC = cc AS = /usr/ccs/bin/as COMPRESS = compress CPP = /usr/ccs/lib/cpp $(STD_CPP_DEFINES) PREPROCESSCMD = cc -E $(STD_CPP_DEFINES) INSTALL = $(SHELL) $(CONFIGSRC)/util/bsdinst.sh INSTALLFLAGS = -c LD = /usr/ccs/bin/ld LEX = /usr/ccs/bin/lex LEXLIB = -ll YACC = /usr/ccs/bin/yacc CCYACC = /usr/ccs/bin/yacc LINT = lint LINTLIBFLAG = -o LINTOPTS = -bh LN = ln -s MAKE = /usr/ccs/bin/make MV = mv CP = cp RM = rm -f MANSUFFIX = 1x LIBMANSUFFIX = 3x FILEMANSUFFIX = 4 TROFF = psroff MSMACROS = -ms TBL = tbl EQN = eqn DVIPS = dvips LATEX = latex STD_INCLUDES = STD_CPP_DEFINES = -Dsun -DSVR4 STD_DEFINES = -Dsun -DSVR4 EXTRA_LOAD_FLAGS = EXTRA_LDOPTIONS = EXTRA_LIBRARIES = -lsocket -lnsl TAGS = ctags SHAREDCODEDEF = SHLIBDEF = SHLIBLDFLAGS = -G -z text PICFLAGS = -Kpic CXXPICFLAGS = -K PIC PROTO_DEFINES = INSTPGMFLAGS = INSTBINFLAGS = -m 0755 INSTUIDFLAGS = -m 4755 INSTLIBFLAGS = -m 0644 INSTINCFLAGS = -m 0444 INSTMANFLAGS = -m 0444 INSTDATFLAGS = -m 0444 INSTKMEMFLAGS = -g sys -m 2755 PROJECTROOT = /usr/X11R6 TOP_INCLUDES = -I$(TOP) CDEBUGFLAGS = -O CCOPTIONS = -Xc ALLINCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) $(TOP_INCLUDES) $(STD_INCLUDES) ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(EXTRA_DEFINES) $(PROTO_DEFINES) $(THREADS_DEFINES) $(DEFINES) CFLAGS = $(CDEBUGFLAGS) $(CCOPTIONS) $(THREADS_CFLAGS) $(ALLDEFINES) LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES) $(DEPEND_DEFINES) LDPRELIB = -L$(BUILDLIBDIR) LDPOSTLIB = LDOPTIONS = $(CDEBUGFLAGS) $(CCOPTIONS) $(EXTRA_LDOPTIONS) $(THREADS_LDFLAGS) $(LOCAL_LDFLAGS) $(LDPRELIB) CXXLDOPTIONS = $(CXXDEBUGFLAGS) $(CXXOPTIONS) $(EXTRA_LDOPTIONS) $(THREADS_CXXLDFLAGS) $(LOCAL_LDFLAGS) $(LDPRELIB) LDLIBS = $(LDPOSTLIB) $(THREADS_LIBS) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES) CCENVSETUP = LD_RUN_PATH=$(USRLIBDIR) CCLINK = $(CCENVSETUP) purify $(CC) CXXENVSETUP = LD_RUN_PATH=$(USRLIBDIR) CXXLINK = $(CXXENVSETUP) $(CXX) LDSTRIPFLAGS = -x LDCOMBINEFLAGS = -r DEPENDFLAGS = MACROFILE = sun.cf RM_CMD = $(RM) IMAKE_DEFINES = IRULESRC = $(CONFIGSRC)/cf IMAKE_CMD = $(IMAKE) -I$(IRULESRC) $(IMAKE_DEFINES) ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/Project.tmpl \ $(IRULESRC)/site.def $(IRULESRC)/$(MACROFILE) \ $(EXTRA_ICONFIGFILES) # ---------------------------------------------------------------------- # X Window System Build Parameters and Rules # $XConsortium: Project.tmpl,v 1.248 95/01/06 19:12:51 gildea Exp $ # ----------------------------------------------------------------------- # X Window System make variables; these need to be coordinated with rules BINDIR = /usr/X11R6/bin BUILDINCROOT = $(TOP) BUILDINCDIR = $(BUILDINCROOT)/X11 BUILDINCTOP = .. BUILDLIBDIR = $(TOP)/usrlib BUILDLIBTOP = .. INCDIR = $(INCROOT)/X11 ADMDIR = /usr/adm LIBDIR = $(USRLIBDIR)/X11 FONTDIR = $(LIBDIR)/fonts XINITDIR = $(LIBDIR)/xinit XDMDIR = $(LIBDIR)/xdm TWMDIR = $(LIBDIR)/twm XSMDIR = $(LIBDIR)/xsm NLSDIR = $(LIBDIR)/nls XLOCALEDIR = $(LIBDIR)/locale PEXAPIDIR = $(LIBDIR)/PEX XAPPLOADDIR = $(LIBDIR)/app-defaults FONTCFLAGS = -t INSTAPPFLAGS = $(INSTDATFLAGS) RGB = $(RGBSRC)/rgb FONTC = $(BDFTOPCFSRC)/bdftopcf MKFONTDIR = $(MKFONTDIRSRC)/mkfontdir DOCUTILSRC = $(TOP)/doc/util XDOCMACROS = $(DOCUTILSRC)/macros.t XIDXMACROS = $(DOCUTILSRC)/indexmacros.t PROGRAMSRC = $(TOP)/programs LIBSRC = $(TOP)/lib FONTSRC = $(TOP)/fonts INCLUDESRC = $(TOP)/X11 SERVERSRC = $(TOP)/programs/Xserver CONTRIBSRC = $(TOP)/../contrib UNSUPPORTEDSRC = $(TOP)/unsupported DOCSRC = $(TOP)/doc RGBSRC = $(TOP)/programs/rgb BDFTOPCFSRC = $(PROGRAMSRC)/bdftopcf MKFONTDIRSRC = $(PROGRAMSRC)/mkfontdir FONTSERVERSRC = $(PROGRAMSRC)/xfs FONTINCSRC = $(TOP)/include/fonts EXTINCSRC = $(TOP)/include/extensions TRANSCOMMSRC = $(LIBSRC)/xtrans TRANS_INCLUDES = -I$(TRANSCOMMSRC) # $XConsortium: sunLib.tmpl,v 1.36 94/04/08 19:13:50 rws Exp $ # $XConsortium: sv4Lib.tmpl,v 1.19 93/12/03 10:48:36 kaleb Exp $ XMULIBONLY = -lXmu XLIBSRC = $(LIBSRC)/X11 SOXLIBREV = 6.0 DEPXONLYLIB = XONLYLIB = -lX11 LINTXONLY = $(XLIBSRC)/llib-X11.ln XLIBONLY = $(XONLYLIB) XEXTLIBSRC = $(LIBSRC)/Xext SOXEXTREV = 6.0 DEPEXTENSIONLIB = EXTENSIONLIB = -lXext LINTEXTENSION = $(XEXTLIBSRC)/llib-Xext.ln LINTEXTENSIONLIB = $(LINTEXTENSION) DEPXLIB = $(DEPEXTENSIONLIB) $(DEPXONLYLIB) XLIB = $(EXTENSIONLIB) $(XONLYLIB) LINTXLIB = $(LINTXONLYLIB) XAUTHSRC = $(LIBSRC)/Xau DEPXAUTHLIB = $(BUILDLIBDIR)/libXau.a XAUTHLIB = -lXau LINTXAUTH = $(XAUTHSRC)/llib-Xau.ln XDMCPLIBSRC = $(LIBSRC)/Xdmcp DEPXDMCPLIB = $(BUILDLIBDIR)/libXdmcp.a XDMCPLIB = -lXdmcp LINTXDMCP = $(XDMCPLIBSRC)/llib-Xdmcp.ln XMUSRC = $(LIBSRC)/Xmu SOXMUREV = 6.0 DEPXMULIB = XMULIB = -lXmu LINTXMU = $(XMUSRC)/llib-Xmu.ln OLDXLIBSRC = $(LIBSRC)/oldX SOOLDXREV = 6.0 DEPOLDXLIB = OLDXLIB = -loldX LINTOLDX = $(OLDXLIBSRC)/llib-oldX.ln TOOLKITSRC = $(LIBSRC)/Xt SOXTREV = 6.0 DEPXTOOLONLYLIB = XTOOLONLYLIB = -lXt LINTXTOOLONLY = $(TOOLKITSRC)/llib-Xt.ln DEPXTOOLLIB = $(DEPXTOOLONLYLIB) $(DEPSMLIB) $(DEPICELIB) XTOOLLIB = $(XTOOLONLYLIB) $(SMLIB) $(ICELIB) LINTXTOOLLIB = $(LINTXTOOLONLYLIB) AWIDGETSRC = $(LIBSRC)/Xaw SOXAWREV = 6.0 DEPXAWLIB = XAWLIB = -lXaw LINTXAW = $(AWIDGETSRC)/llib-Xaw.ln XTFSRC = $(TOP)/workInProgress/Xtf SOXTFREV = 0.7 DEPXTFLIB = XTFLIB = -lXtf LINTXTF = $(XTFSRC)/llib-Xtf.ln FRESCOSRC = $(TOP)/workInProgress/Fresco SOFRESCOREV = 0.7 DEPFRESCOLIB = FRESCOLIB = -lFresco LINTFRESCO = $(FRESCOSRC)/src/llib-Fresco.ln XILIBSRC = $(LIBSRC)/Xi SOXINPUTREV = 6.0 DEPXILIB = XILIB = -lXi LINTXI = $(XILIBSRC)/llib-Xi.ln XTESTLIBSRC = $(LIBSRC)/Xtst SOXTESTREV = 6.0 DEPXTESTLIB = XTESTLIB = -lXtst LINTXTEST = $(XTESTLIBSRC)/llib-Xtst.ln PEXLIBSRC = $(LIBSRC)/PEX5 SOPEXREV = 6.0 DEPPEXLIB = PEXLIB = -lPEX5 LINTPEX = $(PEXLIBSRC)/llib-PEX5.ln XIELIBSRC = $(LIBSRC)/XIE SOXIEREV = 6.0 DEPXIELIB = XIELIB = -lXIE LINTXIE = $(XIELIBSRC)/llib-XIE.ln PHIGSLIBSRC = $(LIBSRC)/PHIGS DEPPHIGSLIB = $(BUILDLIBDIR)/libphigs.a PHIGSLIB = -lphigs LINTPHIGS = $(PHIGSLIBSRC)/llib-phigs.ln DEPXBSDLIB = $(BUILDLIBDIR)/libXbsd.a XBSDLIB = -lXbsd LINTXBSD = $(LIBSRC)/Xbsd/llib-Xbsd.ln ICESRC = $(LIBSRC)/ICE SOICEREV = 6.0 DEPICELIB = ICELIB = -lICE LINTICE = $(ICESRC)/llib-ICE.ln SMSRC = $(LIBSRC)/SM SOSMREV = 6.0 DEPSMLIB = SMLIB = -lSM LINTSM = $(SMSRC)/llib-SM.ln FSLIBSRC = $(LIBSRC)/FS DEPFSLIB = $(BUILDLIBDIR)/libFS.a FSLIB = -lFS LINTFS = $(FSLIBSRC)/llib-FS.ln FONTLIBSRC = $(LIBSRC)/font DEPFONTLIB = $(BUILDLIBDIR)/libfont.a FONTLIB = -lfont LINTFONT = $(FONTLIBSRC)/llib-font.ln DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB) DEPLIBS1 = $(DEPLIBS) DEPLIBS2 = $(DEPLIBS) DEPLIBS3 = $(DEPLIBS) CONFIGDIR = $(LIBDIR)/config # ----------------------------------------------------------------------- # start of Imakefile IMDLIB = -L../IMdkit -lXimd DEPLIBS = $(DEPXONLYLIB) INCLUDES = -I../IMdkit LOCAL_LIBRARIES = $(IMDLIB) $(XONLYLIB) SRCS = sampleIM.c IC.c OBJS = sampleIM.o IC.o CDEBUGFLAGS = -g PROGRAM = sampleIM PROGRAM = sampleIM all:: sampleIM sampleIM: $(OBJS) $(DEPLIBS) $(RM) $@ $(CCLINK) -o $@ $(LDOPTIONS) $(OBJS) $(LOCAL_LIBRARIES) $(LDLIBS) $(EXTRA_LOAD_FLAGS) install:: sampleIM @if [ -d $(DESTDIR)$(BINDIR) ]; then set +x; \ else (set -x; $(MKDIRHIER) $(DESTDIR)$(BINDIR)); fi $(INSTALL) $(INSTALLFLAGS) $(INSTPGMFLAGS) sampleIM $(DESTDIR)$(BINDIR)/sampleIM install.man:: sampleIM.man @if [ -d $(DESTDIR)$(MANDIR) ]; then set +x; \ else (set -x; $(MKDIRHIER) $(DESTDIR)$(MANDIR)); fi $(INSTALL) $(INSTALLFLAGS) $(INSTMANFLAGS) sampleIM.man $(DESTDIR)$(MANDIR)/sampleIM.$(MANSUFFIX) depend:: $(DEPEND) $(DEPEND): @echo "checking $@ over in $(DEPENDSRC) first..."; \ cd $(DEPENDSRC); $(MAKE); \ echo "okay, continuing in $(CURRENT_DIR)" depend:: $(DEPEND) $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- $(SRCS) lint: $(LINT) $(LINTFLAGS) $(SRCS) $(LINTLIBS) lint1: $(LINT) $(LINTFLAGS) $(FILE) $(LINTLIBS) clean:: $(RM) sampleIM # ----------------------------------------------------------------------- # common rules for all Makefiles - do not edit .c.i: $(RM) $@ $(CC) -E $(CFLAGS) $(_NOOP_) $*.c > $@ emptyrule:: clean:: $(RM_CMD) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut "#"* Makefile:: $(IMAKE) $(IMAKE): -@(cd $(IMAKESRC); if [ -f Makefile ]; then \ echo "checking $@ in $(IMAKESRC) first..."; $(MAKE) all; else \ echo "bootstrapping $@ from Makefile.ini in $(IMAKESRC) first..."; \ $(MAKE) -f Makefile.ini BOOTSTRAPCFLAGS="$(BOOTSTRAPCFLAGS)"; fi; \ echo "okay, continuing in $(CURRENT_DIR)") Makefile:: -@if [ -f Makefile ]; then set -x; \ $(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \ else exit 0; fi $(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR) tags:: $(TAGS) -w *.[ch] $(TAGS) -xw *.[ch] > TAGS # ----------------------------------------------------------------------- # empty rules for directories that do not have SUBDIRS - do not edit install:: @echo "install in $(CURRENT_DIR) done" install.man:: @echo "install.man in $(CURRENT_DIR) done" install.linkkit:: @echo "install.linkkit in $(CURRENT_DIR) done" Makefiles:: includes:: depend:: # ----------------------------------------------------------------------- # dependencies generated by makedepend # DO NOT DELETE sampleIM.o: /usr/include/stdio.h /usr/include/sys/feature_tests.h sampleIM.o: /usr/include/locale.h ../../../../xc/X11/Xlib.h sampleIM.o: /usr/include/sys/types.h /usr/include/sys/isa_defs.h sampleIM.o: /usr/include/sys/machtypes.h /usr/include/sys/select.h sampleIM.o: /usr/include/sys/time.h /usr/include/sys/time.h sampleIM.o: ../../../../xc/X11/X.h ../../../../xc/X11/Xfuncproto.h sampleIM.o: ../../../../xc/X11/Xosdefs.h /usr/include/stddef.h sampleIM.o: ../../../../xc/X11/Xutil.h ../../../../xc/X11/keysym.h sampleIM.o: ../../../../xc/X11/keysymdef.h ../../../../xc/X11/Ximd/IMdkit.h sampleIM.o: ../../../../xc/X11/Xmd.h ../../../../xc/X11/Ximd/Xi18n.h sampleIM.o: ../../../../xc/X11/Xfuncs.h /usr/include/string.h sampleIM.o: ../../../../xc/X11/Xos.h /usr/include/fcntl.h sampleIM.o: /usr/include/sys/fcntl.h /usr/include/unistd.h sampleIM.o: /usr/include/sys/unistd.h ../IMdkit/XimProto.h sampleIM.o: /usr/include/stdlib.h ../../../../xc/X11/Ximd/IMdkit.h IC.o: ../../../../xc/X11/Xlib.h /usr/include/sys/types.h IC.o: /usr/include/sys/feature_tests.h /usr/include/sys/isa_defs.h IC.o: /usr/include/sys/machtypes.h /usr/include/sys/select.h IC.o: /usr/include/sys/time.h /usr/include/sys/time.h ../../../../xc/X11/X.h IC.o: ../../../../xc/X11/Xfuncproto.h ../../../../xc/X11/Xosdefs.h IC.o: /usr/include/stddef.h ../../../../xc/X11/Ximd/IMdkit.h IC.o: ../../../../xc/X11/Xmd.h ../../../../xc/X11/Ximd/Xi18n.h IC.o: ../../../../xc/X11/Xfuncs.h /usr/include/string.h IC.o: ../../../../xc/X11/Xos.h /usr/include/fcntl.h /usr/include/sys/fcntl.h IC.o: /usr/include/unistd.h /usr/include/sys/unistd.h ../IMdkit/XimProto.h IC.o: /usr/include/stdlib.h ../../../../xc/X11/Ximd/IMdkit.h IC.h nabi-nabi-1.0.1/IMdkit/doc/Xi18n_sample/README000066400000000000000000000052201430012456200204030ustar00rootroot00000000000000NAME sampleIM - sample Japanese Input Method Server using IMdkit SYNOPSIS sampleIM [-display displayname] [-name imname] [-static] [-dynamic] [-tcp] [-local] [-offkey] [-kl] DESCRIPTION SampleIM you see here is an sample Input Method Server which utilizes the IM Server Developers Kit so that it can connect with XIM client applications through the X Input Method Protocol(XIM Protocol) which is standardized in the X Window System, Version 11, Release 6. The sampleIM is just sample, so remember that it can be used just for test of IMServer Developers Kit, and note that it should be invoked under Japanese EUC locale such as "ja_JP.eucJP", because it contains the Japanese EUC localized characters for the sample committed string: for csh family % env LC_ALL=ja_JP.eucJP sampleIM for ksh family $ LC_ALL=ja_JP.eucJP sampleIM OPTIONS The sampleIM accepts the following options: -display displayname This options specifies the display name. -name imname This options specifies the name which is used as a part of the sampleIM identifiers by which XIM clients will search for the sampleIM. The default is "sampleIM". -static | -dynamic Each of these options specifies the type of the XIM Protocol event flow model, static or dynamic. Either of these should be given at the same time if any. The default is dynamic event flow model. For more information for event flow model, see "the X Input Method Protocol" document. -tcp | -local Each of these options changes the type of the transport connection mechanism. When -tcp is given, TCP/IP Internet domain will be used, while -local is given, TCP/IP internal domain will be used. Either of these should be given at the same time if any. If neither of these specifies, the default is X-based transport mechanism. -offkey This option indicates that the sampleIM should inform the IM library of off keys, as well as on keys, by which the input conversion will be terminated. (For more information, refer to the XIM_REGISTER_TRIGGERKEYS message in the IM Protocol document.) This option has an effect in case of the dynamic event flow model. When this option is specified, both on/off operation is kicked from the IM library, while unspecified, the off operation is kicked from the sampleIM and this is the default. -kl This option indicates that KeyRelease events should be also filtered by the sampleIM. OPERATIONS Shift-Space start and stop filtering key events. While filtering, the sampleIM just prints the string into the standard out instead of preediting. Ctrl-k commit the sample Japanese EUC characters: " IM γʸǤ" nabi-nabi-1.0.1/IMdkit/doc/Xi18n_sample/sampleIM.c000066400000000000000000000326031430012456200214030ustar00rootroot00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by 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. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. ******************************************************************/ #include #include #include #include #include #include #include #define DEFAULT_IMNAME "sampleIM" #define DEFAULT_LOCALE "zh_TW,ja_JP" /* flags for debugging */ Bool use_trigger = True; /* Dynamic Event Flow is default */ Bool use_offkey = False; /* Register OFF Key for Dynamic Event Flow */ Bool use_tcp = False; /* Using TCP/IP Transport or not */ Bool use_local = False; /* Using Unix domain Tranport or not */ long filter_mask = KeyPressMask; /* Supported Inputstyles */ static XIMStyle Styles[] = { XIMPreeditCallbacks|XIMStatusCallbacks, XIMPreeditPosition|XIMStatusArea, XIMPreeditPosition|XIMStatusNothing, XIMPreeditArea|XIMStatusArea, XIMPreeditNothing|XIMStatusNothing, 0 }; /* Trigger Keys List */ static XIMTriggerKey Trigger_Keys[] = { {XK_space, ShiftMask, ShiftMask}, {0L, 0L, 0L} }; /* Conversion Keys List */ static XIMTriggerKey Conversion_Keys[] = { {XK_k, ControlMask, ControlMask}, {0L, 0L, 0L} }; /* Forward Keys List */ static XIMTriggerKey Forward_Keys[] = { {XK_Return, 0, 0}, {XK_Tab, 0, 0}, {0L, 0L, 0L} }; /* Supported Taiwanese Encodings */ static XIMEncoding zhEncodings[] = { "COMPOUND_TEXT", NULL }; MyGetICValuesHandler(ims, call_data) XIMS ims; IMChangeICStruct *call_data; { GetIC(call_data); return True; } MySetICValuesHandler(ims, call_data) XIMS ims; IMChangeICStruct *call_data; { SetIC(call_data); return True; } MyOpenHandler(ims, call_data) XIMS ims; IMOpenStruct *call_data; { #ifdef DEBUG printf("new_client lang = %s\n", call_data->lang.name); printf(" connect_id = 0x%x\n", (int)call_data->connect_id); #endif return True; } MyCloseHandler(ims, call_data) XIMS ims; IMOpenStruct *call_data; { #ifdef DEBUG printf("closing connect_id 0x%x\n", (int)call_data->connect_id); #endif return True; } MyCreateICHandler(ims, call_data) XIMS ims; IMChangeICStruct *call_data; { CreateIC(call_data); return True; } MyDestroyICHandler(ims, call_data) XIMS ims; IMChangeICStruct *call_data; { DestroyIC(call_data); return True; } #define STRBUFLEN 64 IsKey(ims, call_data, trigger) XIMS ims; IMForwardEventStruct *call_data; XIMTriggerKey *trigger; /* Searching for these keys */ { char strbuf[STRBUFLEN]; KeySym keysym; int i; int modifier; int modifier_mask; XKeyEvent *kev; memset(strbuf, 0, STRBUFLEN); kev = (XKeyEvent*)&call_data->event; XLookupString(kev, strbuf, STRBUFLEN, &keysym, NULL); for (i = 0; trigger[i].keysym != 0; i++) { modifier = trigger[i].modifier; modifier_mask = trigger[i].modifier_mask; if (((KeySym)trigger[i].keysym == keysym) && ((kev->state & modifier_mask) == modifier)) return True; } return False; } ProcessKey(ims, call_data) XIMS ims; IMForwardEventStruct *call_data; { char strbuf[STRBUFLEN]; KeySym keysym; XKeyEvent *kev; int count; fprintf(stderr, "Processing \n"); memset(strbuf, 0, STRBUFLEN); kev = (XKeyEvent*)&call_data->event; count = XLookupString(kev, strbuf, STRBUFLEN, &keysym, NULL); if (count > 0) { fprintf(stdout, "[%s] ", strbuf); } } MyForwardEventHandler(ims, call_data) XIMS ims; IMForwardEventStruct *call_data; { /* Lookup KeyPress Events only */ fprintf(stderr, "ForwardEventHandler\n"); if (call_data->event.type != KeyPress) { fprintf(stderr, "bogus event type, ignored\n"); return True; } /* In case of Static Event Flow */ if (!use_trigger) { static Bool preedit_state_flag = False; if (IsKey(ims, call_data, Trigger_Keys)) { preedit_state_flag = !preedit_state_flag; return True; } } /* In case of Dynamic Event Flow without registering OFF keys, the end of preediting must be notified from IMserver to IMlibrary. */ if (use_trigger && !use_offkey) { if (IsKey(ims, call_data, Trigger_Keys)) { return IMPreeditEnd(ims, (XPointer)call_data); } } if (IsKey(ims, call_data, Conversion_Keys)) { XTextProperty tp; Display *display = ims->core.display; /* char *text = "oO@ IM A"; */ char *text = "üy"; char **list_return; /* [20]; */ int count_return; /* [20]; */ fprintf(stderr, "matching ctrl-k...\n"); XmbTextListToTextProperty(display, (char **)&text, 1, XCompoundTextStyle, &tp); ((IMCommitStruct*)call_data)->flag |= XimLookupChars; ((IMCommitStruct*)call_data)->commit_string = (char *)tp.value; fprintf(stderr, "commiting string...(%s)\n", tp.value); IMCommitString(ims, (XPointer)call_data); #if 0 XmbTextPropertyToTextList(display, &tp, &list_return, &count_return); fprintf(stderr, "converted back: %s\n", *list_return); #endif XFree(tp.value); fprintf(stderr, "survived so far..\n"); } else if (IsKey(ims, call_data, Forward_Keys)) { IMForwardEventStruct forward_ev = *((IMForwardEventStruct *)call_data); fprintf(stderr, "TAB and RETURN forwarded...\n"); IMForwardEvent(ims, (XPointer)&forward_ev); } else { ProcessKey(ims, call_data); } return True; } MyTriggerNotifyHandler(ims, call_data) XIMS ims; IMTriggerNotifyStruct *call_data; { if (call_data->flag == 0) { /* on key */ /* Here, the start of preediting is notified from IMlibrary, which is the only way to start preediting in case of Dynamic Event Flow, because ON key is mandatary for Dynamic Event Flow. */ return True; } else if (use_offkey && call_data->flag == 1) { /* off key */ /* Here, the end of preediting is notified from the IMlibrary, which happens only if OFF key, which is optional for Dynamic Event Flow, has been registered by IMOpenIM or IMSetIMValues, otherwise, the end of preediting must be notified from the IMserver to the IMlibrary. */ return True; } else { /* never happens */ return False; } } MyPreeditStartReplyHandler(ims, call_data) XIMS ims; IMPreeditCBStruct *call_data; { } MyPreeditCaretReplyHandler(ims, call_data) XIMS ims; IMPreeditCBStruct *call_data; { } MyProtoHandler(ims, call_data) XIMS ims; IMProtocol *call_data; { switch (call_data->major_code) { case XIM_OPEN: fprintf(stderr, "XIM_OPEN:\n"); return MyOpenHandler(ims, call_data); case XIM_CLOSE: fprintf(stderr, "XIM_CLOSE:\n"); return MyCloseHandler(ims, call_data); case XIM_CREATE_IC: fprintf(stderr, "XIM_CREATE_IC:\n"); return MyCreateICHandler(ims, call_data); case XIM_DESTROY_IC: fprintf(stderr, "XIM_DESTROY_IC.\n"); return MyDestroyICHandler(ims, call_data); case XIM_SET_IC_VALUES: fprintf(stderr, "XIM_SET_IC_VALUES:\n"); return MySetICValuesHandler(ims, call_data); case XIM_GET_IC_VALUES: fprintf(stderr, "XIM_GET_IC_VALUES:\n"); return MyGetICValuesHandler(ims, call_data); case XIM_FORWARD_EVENT: return MyForwardEventHandler(ims, call_data); case XIM_SET_IC_FOCUS: fprintf(stderr, "XIM_SET_IC_FOCUS()\n"); return True; case XIM_UNSET_IC_FOCUS: fprintf(stderr, "XIM_UNSET_IC_FOCUS:\n"); return True; case XIM_RESET_IC: fprintf(stderr, "XIM_RESET_IC_FOCUS:\n"); return True; case XIM_TRIGGER_NOTIFY: fprintf(stderr, "XIM_TRIGGER_NOTIFY:\n"); return MyTriggerNotifyHandler(ims, call_data); case XIM_PREEDIT_START_REPLY: fprintf(stderr, "XIM_PREEDIT_START_REPLY:\n"); return MyPreeditStartReplyHandler(ims, call_data); case XIM_PREEDIT_CARET_REPLY: fprintf(stderr, "XIM_PREEDIT_CARET_REPLY:\n"); return MyPreeditCaretReplyHandler(ims, call_data); default: fprintf(stderr, "Unknown IMDKit Protocol message type\n"); break; } } void MyXEventHandler(im_window, event) Window im_window; XEvent *event; { fprintf(stderr, "Local Event\n"); switch (event->type) { case DestroyNotify: break; case ButtonPress: switch (event->xbutton.button) { case Button3: if (event->xbutton.window == im_window) goto Exit; break; } default: break; } return; Exit: XDestroyWindow(event->xbutton.display, im_window); exit(0); } main(argc, argv) int argc; char **argv; { char *display_name = NULL; Display *dpy; char *imname = NULL; XIMS ims; XIMStyles *input_styles, *styles2; XIMTriggerKeys *on_keys, *trigger2; XIMEncodings *encodings, *encoding2; Window im_window; register int i; char transport[80]; /* enough */ for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-name")) { imname = argv[++i]; } else if (!strcmp(argv[i], "-display")) { display_name = argv[++i]; } else if (!strcmp(argv[i], "-dynamic")) { use_trigger = True; } else if (!strcmp(argv[i], "-static")) { use_trigger = False; } else if (!strcmp(argv[i], "-tcp")) { use_tcp = True; } else if (!strcmp(argv[i], "-local")) { use_local = True; } else if (!strcmp(argv[i], "-offkey")) { use_offkey = True; } else if (!strcmp(argv[i], "-kl")) { filter_mask = (KeyPressMask|KeyReleaseMask); } } if (!imname) imname = DEFAULT_IMNAME; setlocale(LC_CTYPE, "zh_TW"); if ((dpy = XOpenDisplay(display_name)) == NULL) { fprintf(stderr, "Can't Open Display: %s\n", display_name); exit(1); } im_window = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 700, 400, 800-700, 0, WhitePixel(dpy, DefaultScreen(dpy)), WhitePixel(dpy, DefaultScreen(dpy))); if (im_window == (Window)NULL) { fprintf(stderr, "Can't Create Window\n"); exit(1); } XStoreName(dpy, im_window, "sampleIM"); XSetTransientForHint(dpy, im_window, im_window); if ((input_styles = (XIMStyles *)malloc(sizeof(XIMStyles))) == NULL) { fprintf(stderr, "Can't allocate\n"); exit(1); } input_styles->count_styles = sizeof(Styles)/sizeof(XIMStyle) - 1; input_styles->supported_styles = Styles; if ((on_keys = (XIMTriggerKeys *) malloc(sizeof(XIMTriggerKeys))) == NULL) { fprintf(stderr, "Can't allocate\n"); exit(1); } on_keys->count_keys = sizeof(Trigger_Keys)/sizeof(XIMTriggerKey) - 1; on_keys->keylist = Trigger_Keys; if ((encodings = (XIMEncodings *)malloc(sizeof(XIMEncodings))) == NULL) { fprintf(stderr, "Can't allocate\n"); exit(1); } encodings->count_encodings = sizeof(zhEncodings)/sizeof(XIMEncoding) - 1; encodings->supported_encodings = zhEncodings; if (use_local) { char hostname[64]; char *address = "/tmp/.ximsock"; gethostname(hostname, 64); sprintf(transport, "local/%s:%s", hostname, address); } else if (use_tcp) { char hostname[64]; int port_number = 9010; gethostname(hostname, 64); sprintf(transport, "tcp/%s:%d", hostname, port_number); } else { strcpy(transport, "X/"); } ims = IMOpenIM(dpy, IMModifiers, "Xi18n", IMServerWindow, im_window, IMServerName, imname, IMLocale, DEFAULT_LOCALE, IMServerTransport, transport, IMInputStyles, input_styles, NULL); if (ims == (XIMS)NULL) { fprintf(stderr, "Can't Open Input Method Service:\n"); fprintf(stderr, "\tInput Method Name :%s\n", imname); fprintf(stderr, "\tTranport Address:%s\n", transport); exit(1); } if (use_trigger) { if (use_offkey) IMSetIMValues(ims, IMOnKeysList, on_keys, IMOffKeysList, on_keys, NULL); else IMSetIMValues(ims, IMOnKeysList, on_keys, NULL); } IMSetIMValues(ims, IMEncodingList, encodings, IMProtocolHandler, MyProtoHandler, IMFilterEventMask, filter_mask, NULL); IMGetIMValues(ims, IMInputStyles, &styles2, IMOnKeysList, &trigger2, IMOffKeysList, &trigger2, IMEncodingList, &encoding2, NULL); XSelectInput(dpy, im_window, StructureNotifyMask|ButtonPressMask); XMapWindow(dpy, im_window); XFlush(dpy); /* necessary flush for tcp/ip connection */ for (;;) { XEvent event; XNextEvent(dpy, &event); if (XFilterEvent(&event, None) == True) { fprintf(stderr, "window %ld\n",event.xany.window); continue; } MyXEventHandler(im_window, &event); } } nabi-nabi-1.0.1/IMdkit/i18nAttr.c000066400000000000000000000137411430012456200162730ustar00rootroot00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by 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. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include #include "IMdkit.h" #include "Xi18n.h" #include "XimFunc.h" typedef struct { char *name; CARD16 type; } IMListOfAttr; typedef struct { char *name; CARD8 major_opcode; CARD8 minor_opcode; } IMExtList; IMListOfAttr Default_IMattr[] = { {XNQueryInputStyle, XimType_XIMStyles}, {XNQueryIMValuesList, XimType_XIMValuesList}, {XNQueryICValuesList, XimType_XIMValuesList}, {(char *) NULL, (CARD16) 0} }; IMListOfAttr Default_ICattr[] = { {XNInputStyle, XimType_CARD32}, {XNClientWindow, XimType_Window}, {XNFocusWindow, XimType_Window}, {XNFilterEvents, XimType_CARD32}, {XNPreeditAttributes, XimType_NEST}, {XNStatusAttributes, XimType_NEST}, {XNFontSet, XimType_XFontSet}, {XNArea, XimType_XRectangle}, {XNAreaNeeded, XimType_XRectangle}, {XNColormap, XimType_CARD32}, {XNStdColormap, XimType_CARD32}, {XNForeground, XimType_CARD32}, {XNBackground, XimType_CARD32}, {XNBackgroundPixmap, XimType_CARD32}, {XNSpotLocation, XimType_XPoint}, {XNLineSpace, XimType_CARD32}, {XNPreeditState, XimType_CARD32}, {XNPreeditStartCallback, XimType_CARD32}, {XNPreeditDoneCallback, XimType_CARD32}, {XNPreeditDrawCallback, XimType_CARD32}, {XNStringConversionCallback, XimType_CARD32}, {XNStringConversion, XimType_CARD32}, {XNSeparatorofNestedList, XimType_SeparatorOfNestedList}, {(char *) NULL, (CARD16) 0} }; IMExtList Default_Extension[] = { {"XIM_EXT_MOVE", XIM_EXTENSION, XIM_EXT_MOVE}, {"XIM_EXT_SET_EVENT_MASK", XIM_EXTENSION, XIM_EXT_SET_EVENT_MASK}, {"XIM_EXT_FORWARD_KEYEVENT", XIM_EXTENSION, XIM_EXT_FORWARD_KEYEVENT}, {(char *) NULL, (CARD8) 0, (CARD8) 0} }; static void CountAttrList(IMListOfAttr *attr, int *total_count) { *total_count = 0; while (attr->name != NULL) { attr++; ++(*total_count); } } static XIMAttr *CreateAttrList (Xi18n i18n_core, IMListOfAttr *attr, int *total_count) { XIMAttr *args, *p; unsigned int buf_size; CountAttrList(attr, total_count); buf_size = (unsigned) (*total_count + 1)*sizeof (XIMAttr); args = (XIMAttr *) malloc (buf_size); if (!args) return (XIMAttr *) NULL; /*endif*/ memset (args, 0, buf_size); for (p = args; attr->name != NULL; attr++, p++) { p->name = attr->name; p->length = strlen (attr->name); p->type = (CARD16) attr->type; p->attribute_id = XrmStringToQuark (p->name); if (strcmp (p->name, XNPreeditAttributes) == 0) i18n_core->address.preeditAttr_id = p->attribute_id; else if (strcmp (p->name, XNStatusAttributes) == 0) i18n_core->address.statusAttr_id = p->attribute_id; else if (strcmp (p->name, XNSeparatorofNestedList) == 0) i18n_core->address.separatorAttr_id = p->attribute_id; /*endif*/ } /*endfor*/ p->name = (char *) NULL; return args; } void _Xi18nInitAttrList (Xi18n i18n_core) { XIMAttr *args; int total_count; /* init IMAttr list */ if (i18n_core->address.xim_attr) XFree ((char *)i18n_core->address.xim_attr); /*endif*/ args = CreateAttrList (i18n_core, Default_IMattr, &total_count); i18n_core->address.im_attr_num = total_count; i18n_core->address.xim_attr = (XIMAttr *)args; /* init ICAttr list */ if (i18n_core->address.xic_attr) XFree ((char *) i18n_core->address.xic_attr); /*endif*/ args = CreateAttrList (i18n_core, Default_ICattr, &total_count); i18n_core->address.ic_attr_num = total_count; i18n_core->address.xic_attr = (XICAttr *) args; } void _Xi18nInitExtension(Xi18n i18n_core) { register int i; IMExtList *extensions = (IMExtList *) Default_Extension; XIMExt *ext_list = (XIMExt *) i18n_core->address.extension; for (i = 0; extensions->name; i++, ext_list++, extensions++) { ext_list->major_opcode = extensions->major_opcode; ext_list->minor_opcode = extensions->minor_opcode; ext_list->name = extensions->name; ext_list->length = strlen(ext_list->name); } /*endfor*/ i18n_core->address.ext_num = i; } nabi-nabi-1.0.1/IMdkit/i18nClbk.c000066400000000000000000000403561430012456200162360ustar00rootroot00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by 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. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include "IMdkit.h" #include "Xi18n.h" #include "FrameMgr.h" #include "XimFunc.h" int _Xi18nGeometryCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec geometry_fr[]; register int total_size; unsigned char *reply = NULL; IMGeometryCBStruct *geometry_CB = (IMGeometryCBStruct *) &call_data->geometry_callback; CARD16 connect_id = call_data->any.connect_id; fm = FrameMgrInit (geometry_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, geometry_CB->icid); _Xi18nSendMessage (ims, connect_id, XIM_GEOMETRY, 0, reply, total_size); FrameMgrFree (fm); free (reply); /* XIM_GEOMETRY is an asyncronous protocol, so return immediately. */ return True; } int _Xi18nPreeditStartCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec preedit_start_fr[]; register int total_size; unsigned char *reply = NULL; IMPreeditCBStruct *preedit_CB = (IMPreeditCBStruct*) &call_data->preedit_callback; CARD16 connect_id = call_data->any.connect_id; fm = FrameMgrInit (preedit_start_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage(ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, preedit_CB->icid); _Xi18nSendMessage (ims, connect_id, XIM_PREEDIT_START, 0, reply, total_size); FrameMgrFree (fm); free (reply); return True; } int _Xi18nPreeditDrawCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec preedit_draw_fr[]; register int total_size; unsigned char *reply = NULL; IMPreeditCBStruct *preedit_CB = (IMPreeditCBStruct *) &call_data->preedit_callback; XIMPreeditDrawCallbackStruct *draw = (XIMPreeditDrawCallbackStruct *) &preedit_CB->todo.draw; CARD16 connect_id = call_data->any.connect_id; register int feedback_count; register int i; BITMASK32 status = 0x0; if (draw->text->length == 0) status = 0x00000001; else if (draw->text->feedback[0] == 0) status = 0x00000002; /*endif*/ fm = FrameMgrInit (preedit_draw_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); /* set length of preedit string */ FrameMgrSetSize (fm, draw->text->length); /* set iteration count for list of feedback */ for (i = 0; draw->text->feedback[i] != 0; i++) ; /*endfor*/ feedback_count = i; FrameMgrSetIterCount (fm, feedback_count); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, preedit_CB->icid); FrameMgrPutToken (fm, draw->caret); FrameMgrPutToken (fm, draw->chg_first); FrameMgrPutToken (fm, draw->chg_length); FrameMgrPutToken (fm, status); FrameMgrPutToken (fm, draw->text->length); FrameMgrPutToken (fm, draw->text->string); for (i = 0; i < feedback_count; i++) FrameMgrPutToken (fm, draw->text->feedback[i]); /*endfor*/ _Xi18nSendMessage (ims, connect_id, XIM_PREEDIT_DRAW, 0, reply, total_size); FrameMgrFree (fm); free (reply); /* XIM_PREEDIT_DRAW is an asyncronous protocol, so return immediately. */ return True; } int _Xi18nPreeditCaretCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec preedit_caret_fr[]; register int total_size; unsigned char *reply = NULL; IMPreeditCBStruct *preedit_CB = (IMPreeditCBStruct*) &call_data->preedit_callback; XIMPreeditCaretCallbackStruct *caret = (XIMPreeditCaretCallbackStruct *) &preedit_CB->todo.caret; CARD16 connect_id = call_data->any.connect_id; fm = FrameMgrInit (preedit_caret_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, preedit_CB->icid); FrameMgrPutToken (fm, caret->position); FrameMgrPutToken (fm, caret->direction); FrameMgrPutToken (fm, caret->style); _Xi18nSendMessage (ims, connect_id, XIM_PREEDIT_CARET, 0, reply, total_size); FrameMgrFree (fm); free (reply); return True; } int _Xi18nPreeditDoneCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec preedit_done_fr[]; register int total_size; unsigned char *reply = NULL; IMPreeditCBStruct *preedit_CB = (IMPreeditCBStruct *) &call_data->preedit_callback; CARD16 connect_id = call_data->any.connect_id; fm = FrameMgrInit (preedit_done_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, preedit_CB->icid); _Xi18nSendMessage (ims, connect_id, XIM_PREEDIT_DONE, 0, reply, total_size); FrameMgrFree (fm); free (reply); /* XIM_PREEDIT_DONE is an asyncronous protocol, so return immediately. */ return True; } int _Xi18nStatusStartCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec status_start_fr[]; register int total_size; unsigned char *reply = NULL; IMStatusCBStruct *status_CB = (IMStatusCBStruct*) &call_data->status_callback; CARD16 connect_id = call_data->any.connect_id; fm = FrameMgrInit (status_start_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, status_CB->icid); _Xi18nSendMessage (ims, connect_id, XIM_STATUS_START, 0, reply, total_size); FrameMgrFree (fm); free (reply); /* XIM_STATUS_START is an asyncronous protocol, so return immediately. */ return True; } int _Xi18nStatusDrawCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm = (FrameMgr)0; extern XimFrameRec status_draw_text_fr[]; extern XimFrameRec status_draw_bitmap_fr[]; register int total_size = 0; unsigned char *reply = NULL; IMStatusCBStruct *status_CB = (IMStatusCBStruct *) &call_data->status_callback; XIMStatusDrawCallbackStruct *draw = (XIMStatusDrawCallbackStruct *) &status_CB->todo.draw; CARD16 connect_id = call_data->any.connect_id; register int feedback_count; register int i; BITMASK32 status = 0x0; switch (draw->type) { case XIMTextType: fm = FrameMgrInit (status_draw_text_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); if (draw->data.text->length == 0) status = 0x00000001; else if (draw->data.text->feedback[0] == 0) status = 0x00000002; /*endif*/ /* set length of status string */ FrameMgrSetSize(fm, draw->data.text->length); /* set iteration count for list of feedback */ for (i = 0; draw->data.text->feedback[i] != 0; i++) ; /*endfor*/ feedback_count = i; FrameMgrSetIterCount (fm, feedback_count); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, status_CB->icid); FrameMgrPutToken (fm, draw->type); FrameMgrPutToken (fm, status); FrameMgrPutToken (fm, draw->data.text->length); FrameMgrPutToken (fm, draw->data.text->string); for (i = 0; i < feedback_count; i++) FrameMgrPutToken (fm, draw->data.text->feedback[i]); /*endfor*/ break; case XIMBitmapType: fm = FrameMgrInit (status_draw_bitmap_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, status_CB->icid); FrameMgrPutToken (fm, draw->data.bitmap); break; } /*endswitch*/ _Xi18nSendMessage (ims, connect_id, XIM_STATUS_DRAW, 0, reply, total_size); FrameMgrFree (fm); free (reply); /* XIM_STATUS_DRAW is an asyncronous protocol, so return immediately. */ return True; } int _Xi18nStatusDoneCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec status_done_fr[]; register int total_size; unsigned char *reply = NULL; IMStatusCBStruct *status_CB = (IMStatusCBStruct *) &call_data->status_callback; CARD16 connect_id = call_data->any.connect_id; fm = FrameMgrInit (status_done_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, status_CB->icid); _Xi18nSendMessage (ims, connect_id, XIM_STATUS_DONE, 0, reply, total_size); FrameMgrFree (fm); free (reply); /* XIM_STATUS_DONE is an asyncronous protocol, so return immediately. */ return True; } int _Xi18nStringConversionCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec str_conversion_fr[]; register int total_size; unsigned char *reply = NULL; IMStrConvCBStruct *call_back = (IMStrConvCBStruct *) &call_data->strconv_callback; XIMStringConversionCallbackStruct *strconv = (XIMStringConversionCallbackStruct *) &call_back->strconv; CARD16 connect_id = call_data->any.connect_id; fm = FrameMgrInit (str_conversion_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); #if 0 /* set length of preedit string */ FrameMgrSetSize (fm, strconv->text->length); #endif total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, call_back->icid); FrameMgrPutToken (fm, strconv->position); FrameMgrPutToken (fm, strconv->direction); FrameMgrPutToken (fm, strconv->operation); FrameMgrPutToken (fm, strconv->factor); #if 0 FrameMgrPutToken (fm, strconv->text->string); #endif _Xi18nSendMessage (ims, connect_id, XIM_STR_CONVERSION, 0, reply, total_size); FrameMgrFree (fm); free (reply); /* XIM_STR_CONVERSION is a syncronous protocol, so should wait here for XIM_STR_CONVERSION_REPLY. But if XIM waits for a reply here, it would make xim unusable to other clients. So it would be better not to wait here. XIM can deal with it in the IMProtocol handler, when XIM_STR_CONVERSION_REPLY message is received. if (i18n_core->methods.wait (ims, connect_id, XIM_STR_CONVERSION_REPLY, 0) == False) { return False; } */ return True; } nabi-nabi-1.0.1/IMdkit/i18nIMProto.c000066400000000000000000000470521430012456200167140ustar00rootroot00000000000000/****************************************************************** Copyright 1993, 1994 by Digital Equipment Corporation, Maynard, Massachusetts, Copyright 1993, 1994 by Hewlett-Packard Company Copyright 1994, 1995 by Sun Microsystems, Inc. All Rights Reserved 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. Author: Hiroyuki Miyamoto Digital Equipment Corporation miyamoto@jrd.dec.com Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ /* Protocol Packet frames */ #include "FrameMgr.h" /* Data type definitions */ static XimFrameRec ximattr_fr[] = { _FRAME(BIT16), /* attribute ID */ _FRAME(BIT16), /* type of the value */ _FRAME(BIT16), /* length of im-attribute */ _FRAME(BARRAY), /* im-attribute */ _PAD4(2), _FRAME(EOL), }; static XimFrameRec xicattr_fr[] = { _FRAME(BIT16), /* attribute ID */ _FRAME(BIT16), /* type of the value */ _FRAME(BIT16), /* length of ic-attribute */ _FRAME(BARRAY), /* ic-attribute */ _PAD4(2), _FRAME(EOL), }; static XimFrameRec ximattribute_fr[] = { _FRAME(BIT16), /* attribute ID */ _FRAME(BIT16), /* value length */ _FRAME(BARRAY), /* value */ _PAD4(1), _FRAME(EOL), }; static XimFrameRec xicattribute_fr[] = { _FRAME(BIT16), /* attribute ID */ _FRAME(BIT16), /* value length */ _FRAME(BARRAY), /* value */ _PAD4(1), _FRAME(EOL), }; static XimFrameRec ximtriggerkey_fr[] = { _FRAME(BIT32), /* keysym */ _FRAME(BIT32), /* modifier */ _FRAME(BIT32), /* modifier mask */ _FRAME(EOL), }; static XimFrameRec encodinginfo_fr[] = { _FRAME(BIT16), /* length of encoding info */ _FRAME(BARRAY), /* encoding info */ _PAD4(2), _FRAME(EOL), }; static XimFrameRec str_fr[] = { _FRAME(BIT8), /* number of byte */ _FRAME(BARRAY), /* string */ _FRAME(EOL), }; static XimFrameRec xpcs_fr[] = { _FRAME(BIT16), /* length of string in bytes */ _FRAME(BARRAY), /* string */ _PAD4(2), _FRAME(EOL), }; static XimFrameRec ext_fr[] = { _FRAME(BIT16), /* extension major-opcode */ _FRAME(BIT16), /* extension minor-opcode */ _FRAME(BIT16), /* length of extension name */ _FRAME(BARRAY), /* extension name */ _PAD4(2), _FRAME(EOL), }; static XimFrameRec inputstyle_fr[] = { _FRAME(BIT32), /* inputstyle */ _FRAME(EOL), }; /* Protocol definitions */ xim_externaldef XimFrameRec attr_head_fr[] = { _FRAME(BIT16), /* attribute id */ _FRAME(BIT16), /* attribute length */ _FRAME(EOL), }; xim_externaldef XimFrameRec short_fr[] = { _FRAME(BIT16), /* value */ _FRAME(EOL), }; xim_externaldef XimFrameRec long_fr[] = { _FRAME(BIT32), /* value */ _FRAME(EOL), }; xim_externaldef XimFrameRec xrectangle_fr[] = { _FRAME(BIT16), /* x */ _FRAME(BIT16), /* y */ _FRAME(BIT16), /* width */ _FRAME(BIT16), /* height */ _FRAME(EOL), }; xim_externaldef XimFrameRec xpoint_fr[] = { _FRAME(BIT16), /* x */ _FRAME(BIT16), /* y */ _FRAME(EOL), }; xim_externaldef XimFrameRec fontset_fr[] = { _FRAME(BIT16), /* length of base font name */ _FRAME(BARRAY), /* base font name list */ _PAD4(2), /* unused */ _FRAME(EOL), }; xim_externaldef XimFrameRec input_styles_fr[] = { _FRAME(BIT16), /* number of list */ _PAD4(1), /* unused */ _FRAME(ITER), /* XIMStyle list */ _FRAME(POINTER), _PTR(inputstyle_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec values_list_fr[] = { _FRAME(BIT16), /* number of list */ _FRAME(ITER), _FRAME(POINTER), _PTR(xpcs_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec packet_header_fr[] = { _FRAME(BIT8), /* major-opcode */ _FRAME(BIT8), /* minor-opcode */ _FRAME(BIT16), /* length */ _FRAME(EOL), }; xim_externaldef XimFrameRec error_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* flag */ _FRAME(BIT16), /* Error Code */ _FRAME(BIT16), /* length of error detail */ _FRAME(BIT16), /* type of error detail */ _FRAME(BARRAY), /* error detail */ _PAD4(1), _FRAME(EOL), }; xim_externaldef XimFrameRec connect_fr[] = { _FRAME(BIT8), /* byte order */ _PAD2(1), /* unused */ _FRAME(BIT16), /* client-major-protocol-version */ _FRAME(BIT16), /* client-minor-protocol-version */ _BYTE_COUNTER(BIT16, 1), /* length of client-auth-protocol-names */ _FRAME(ITER), /* client-auth-protocol-names */ _FRAME(POINTER), _PTR(xpcs_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec connect_reply_fr[] = { _FRAME(BIT16), /* server-major-protocol-version */ _FRAME(BIT16), /* server-minor-protocol-version */ _FRAME(EOL), }; xim_externaldef XimFrameRec auth_required_fr[] = { _FRAME(BIT8), /* auth-protocol-index */ _FRAME(BIT8), /* auth-data1 */ _FRAME(BARRAY), /* auth-data2 */ _PAD4(3), _FRAME(EOL), }; xim_externaldef XimFrameRec auth_reply_fr[] = { _FRAME(BIT8), _FRAME(BARRAY), _PAD4(2), _FRAME(EOL), }; xim_externaldef XimFrameRec auth_next_fr[] = { _FRAME(BIT8), /* auth-data1 */ _FRAME(BARRAY), /* auth-data2 */ _PAD4(2), _FRAME(EOL), }; xim_externaldef XimFrameRec auth_setup_fr[] = { _BYTE_COUNTER(BIT16, 2), /* number of client-auth-protocol-names */ _PAD4(1), /* unused */ _FRAME(ITER), /* server-auth-protocol-names */ _FRAME(POINTER), _PTR(xpcs_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec auth_ng_fr[] = { _FRAME(EOL), }; xim_externaldef XimFrameRec disconnect_fr[] = { _FRAME(EOL), }; xim_externaldef XimFrameRec disconnect_reply_fr[] = { _FRAME(EOL), }; xim_externaldef XimFrameRec open_fr[] = { _FRAME(POINTER), /* locale name */ _PTR(str_fr), _PAD4(1), _FRAME(EOL), }; xim_externaldef XimFrameRec open_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _BYTE_COUNTER(BIT16, 1), /* byte length of IM attributes supported */ _FRAME(ITER), /* IM attribute supported */ _FRAME(POINTER), _PTR(ximattr_fr), _BYTE_COUNTER(BIT16, 2), /* number of IC attribute supported */ _PAD4(1), /* unused */ _FRAME(ITER), /* IC attribute supported */ _FRAME(POINTER), _PTR(xicattr_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec close_fr[] = { _FRAME(BIT16), /* input-method-ID */ _PAD4(1), /* unused */ _FRAME(EOL), }; xim_externaldef XimFrameRec close_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _PAD4(1), /* unused */ _FRAME(EOL), }; xim_externaldef XimFrameRec register_triggerkeys_fr[] = { _FRAME(BIT16), /* input-method-ID */ _PAD4(1), /* unused */ _BYTE_COUNTER(BIT32, 1), /* byte length of on-keys */ _FRAME(ITER), /* on-keys list */ _FRAME(POINTER), _PTR(ximtriggerkey_fr), _BYTE_COUNTER(BIT32, 1), /* byte length of off-keys */ _FRAME(ITER), /* off-keys list */ _FRAME(POINTER), _PTR(ximtriggerkey_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec trigger_notify_fr[] = { _FRAME(BIT16), /* input-mehotd-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* flag */ _FRAME(BIT32), /* index of keys list */ _FRAME(BIT32), /* client-select-event-mask */ _FRAME(EOL), }; xim_externaldef XimFrameRec trigger_notify_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec set_event_mask_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* forward-event-mask */ _FRAME(BIT32), /* synchronous-event-mask */ _FRAME(EOL), }; xim_externaldef XimFrameRec encoding_negotiation_fr[] = { _FRAME(BIT16), /* input-method-ID */ _BYTE_COUNTER(BIT16, 1), /* byte length of encodings listed by name */ _FRAME(ITER), /* supported list of encoding in IM library */ _FRAME(POINTER), _PTR(str_fr), _PAD4(1), _BYTE_COUNTER(BIT16, 2), /* byte length of encodings listed by detailed data */ _PAD4(1), _FRAME(ITER), /* list of encodings supported in the IM library */ _FRAME(POINTER), _PTR(encodinginfo_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec encoding_negotiation_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* category of the encoding determined */ _FRAME(BIT16), /* index of the encoding dterminated */ _PAD4(1), _FRAME(EOL), }; xim_externaldef XimFrameRec query_extension_fr[] = { _FRAME(BIT16), /* input-method-ID */ _BYTE_COUNTER(BIT16, 1), /* byte length of extensions supported by the IM library */ _FRAME(ITER), /* extensions supported by the IM library */ _FRAME(POINTER), _PTR(str_fr), _PAD4(1), _FRAME(EOL), }; xim_externaldef XimFrameRec query_extension_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _BYTE_COUNTER(BIT16, 1), /* byte length of extensions supported by the IM server */ _FRAME(ITER), /* list of extensions supported by the IM server */ _FRAME(POINTER), _PTR(ext_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec get_im_values_fr[] = { _FRAME(BIT16), /* input-method-ID */ _BYTE_COUNTER(BIT16, 1), /* byte length of im-attribute-id */ _FRAME(ITER), /* im-attribute-id */ _FRAME(BIT16), _PAD4(1), _FRAME(EOL), }; xim_externaldef XimFrameRec get_im_values_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _BYTE_COUNTER(BIT16, 1), /* byte length of im-attribute returned */ _FRAME(ITER), /* im-attribute returned */ _FRAME(POINTER), _PTR(ximattribute_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec create_ic_fr[] = { _FRAME(BIT16), /* input-method-ID */ _BYTE_COUNTER(BIT16, 1), /* byte length of ic-attributes */ _FRAME(ITER), /* ic-attributes */ _FRAME(POINTER), _PTR(xicattribute_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec create_ic_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec destroy_ic_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec destroy_ic_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec set_ic_values_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _BYTE_COUNTER(BIT16, 2), /* byte length of ic-attributes */ _PAD4(1), _FRAME(ITER), /* ic-attribute */ _FRAME(POINTER), _PTR(xicattribute_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec set_ic_values_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec get_ic_values_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _BYTE_COUNTER(BIT16, 1), /* byte length of ic-attribute-id */ _FRAME(ITER), /* ic-attribute */ _FRAME(BIT16), _PAD4(2), _FRAME(EOL), }; xim_externaldef XimFrameRec get_ic_values_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _BYTE_COUNTER(BIT16, 2), /* byte length of ic-attribute */ _PAD4(1), _FRAME(ITER), /* ic-attribute */ _FRAME(POINTER), _PTR(xicattribute_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec set_ic_focus_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec unset_ic_focus_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec forward_event_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* flag */ _FRAME(BIT16), /* sequence number */ _FRAME(EOL), }; xim_externaldef XimFrameRec sync_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec sync_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; #if 0 xim_externaldef XimFrameRec commit_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* flag */ _FRAME(BIT16), /* byte length of committed string */ _FRAME(BARRAY), /* committed string */ _PAD4(1), _BYTE_COUNTER(BIT16, 1), /* byte length of keysym */ _FRAME(ITER), /* keysym */ _FRAME(BIT32), _PAD4(1), _FRAME(EOL), }; #endif xim_externaldef XimFrameRec commit_chars_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* flag */ _FRAME(BIT16), /* byte length of committed string */ _FRAME(BARRAY), /* committed string */ _PAD4(1), _FRAME(EOL), }; xim_externaldef XimFrameRec commit_both_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* flag */ _PAD4(1), /* unused */ _FRAME(BIT32), /* keysym */ _FRAME(BIT16), /* byte length of committed string */ _FRAME(BARRAY), /* committed string */ _PAD4(2), _FRAME(EOL), }; xim_externaldef XimFrameRec reset_ic_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec reset_ic_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* byte length of committed string */ _FRAME(BARRAY), /* committed string */ _PAD4(2), _FRAME(EOL), }; xim_externaldef XimFrameRec geometry_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec str_conversion_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* XIMStringConversionPosition */ _FRAME(BIT32), /* XIMStringConversionType */ _FRAME(BIT32), /* XIMStringConversionOperation */ _FRAME(BIT16), /* length to multiply the XIMStringConversionType */ _FRAME(BIT16), /* length of the string to be substituted */ #if 0 _FRAME(BARRAY), /* string */ _PAD4(1), #endif _FRAME(EOL), }; xim_externaldef XimFrameRec str_conversion_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* length of the retrieved string */ _FRAME(BARRAY), /* retrieved string */ _PAD4(2), _BYTE_COUNTER(BIT16, 2), /* number of feedback array */ _PAD4(1), _FRAME(ITER), /* feedback array */ _FRAME(BIT32), _FRAME(EOL), }; xim_externaldef XimFrameRec preedit_start_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec preedit_start_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* return value */ _FRAME(EOL), }; xim_externaldef XimFrameRec preedit_draw_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* caret */ _FRAME(BIT32), /* chg_first */ _FRAME(BIT32), /* chg_length */ _FRAME(BIT32), /* status */ _FRAME(BIT16), /* length of preedit string */ _FRAME(BARRAY), /* preedit string */ _PAD4(2), _BYTE_COUNTER(BIT16, 2), /* number of feedback array */ _PAD4(1), _FRAME(ITER), /* feedback array */ _FRAME(BIT32), _FRAME(EOL), }; xim_externaldef XimFrameRec preedit_caret_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* position */ _FRAME(BIT32), /* direction */ _FRAME(BIT32), /* style */ _FRAME(EOL), }; xim_externaldef XimFrameRec preedit_caret_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* position */ _FRAME(EOL), }; xim_externaldef XimFrameRec preedit_done_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec status_start_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec status_draw_text_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* type */ _FRAME(BIT32), /* status */ _FRAME(BIT16), /* length of status string */ _FRAME(BARRAY), /* status string */ _PAD4(2), _BYTE_COUNTER(BIT16, 2), /* number of feedback array */ _PAD4(1), _FRAME(ITER), /* feedback array */ _FRAME(BIT32), _FRAME(EOL), }; xim_externaldef XimFrameRec status_draw_bitmap_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* type */ _FRAME(BIT32), /* pixmap data */ _FRAME(EOL), }; xim_externaldef XimFrameRec status_done_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec ext_set_event_mask_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* filter-event-mask */ _FRAME(BIT32), /* intercept-event-mask */ _FRAME(BIT32), /* select-event-mask */ _FRAME(BIT32), /* forward-event-mask */ _FRAME(BIT32), /* synchronous-event-mask */ _FRAME(EOL), }; xim_externaldef XimFrameRec ext_forward_keyevent_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* flag */ _FRAME(BIT16), /* sequence number */ _FRAME(BIT8), /* xEvent.u.u.type */ _FRAME(BIT8), /* keycode */ _FRAME(BIT16), /* state */ _FRAME(BIT32), /* time */ _FRAME(BIT32), /* window */ _FRAME(EOL), }; xim_externaldef XimFrameRec ext_move_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* X */ _FRAME(BIT16), /* Y */ _FRAME(EOL), }; nabi-nabi-1.0.1/IMdkit/i18nIc.c000066400000000000000000000774001430012456200157160ustar00rootroot00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by 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. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include "IMdkit.h" #include "Xi18n.h" #include "FrameMgr.h" #include "XimFunc.h" #define IC_SIZE 64 /* Set IC values */ static void SetCardAttribute (XICAttribute *value_ret, char *p, XICAttr *ic_attr, int value_length, int need_swap) { char *buf; FrameMgr fm; if ((buf = (char *) malloc (value_length)) == NULL) return; /*endif*/ if (value_length == sizeof (CARD8)) { memmove (buf, p, value_length); } else if (value_length == sizeof (CARD16)) { INT16 value; extern XimFrameRec short_fr[]; fm = FrameMgrInit (short_fr, (char *) p, need_swap); /* get data */ FrameMgrGetToken (fm, value); FrameMgrFree (fm); memmove (buf, &value, value_length); } else if (value_length == sizeof(CARD32)) { INT32 value; extern XimFrameRec long_fr[]; fm = FrameMgrInit (long_fr, (char *) p, need_swap); /* get data */ FrameMgrGetToken (fm, value); FrameMgrFree (fm); memmove (buf, &value, value_length); } /*endif*/ value_ret->attribute_id = ic_attr->attribute_id; value_ret->name = ic_attr->name; value_ret->name_length = ic_attr->length; value_ret->type = ic_attr->type; value_ret->value_length = value_length; value_ret->value = buf; } static void SetFontAttribute (XICAttribute *value_ret, char *p, XICAttr *ic_attr, int value_length, int need_swap) { char *buf; char *base_name; CARD16 base_length; FrameMgr fm; extern XimFrameRec fontset_fr[]; fm = FrameMgrInit (fontset_fr, (char *) p, need_swap); /* get data */ FrameMgrGetToken (fm, base_length); FrameMgrSetSize (fm, base_length); if ((buf = (char *) malloc (base_length + 1)) == NULL) return; /*endif*/ FrameMgrGetToken (fm, base_name); FrameMgrFree(fm); strncpy (buf, base_name, base_length); buf[base_length] = (char) 0; value_ret->attribute_id = ic_attr->attribute_id; value_ret->name = ic_attr->name; value_ret->name_length = ic_attr->length; value_ret->type = ic_attr->type; value_ret->value_length = value_length; value_ret->value = buf; } static void SetPointAttribute (XICAttribute *value_ret, char *p, XICAttr *ic_attr, int value_length, int need_swap) { XPoint *buf; FrameMgr fm; extern XimFrameRec xpoint_fr[]; if ((buf = (XPoint *) malloc (sizeof (XPoint))) == NULL) return; /*endif*/ fm = FrameMgrInit (xpoint_fr, (char *) p, need_swap); /* get data */ FrameMgrGetToken (fm, buf->x); FrameMgrGetToken (fm, buf->y); FrameMgrFree (fm); value_ret->attribute_id = ic_attr->attribute_id; value_ret->name = ic_attr->name; value_ret->name_length = ic_attr->length; value_ret->type = ic_attr->type; value_ret->value_length = value_length; value_ret->value = (char *) buf; } static void SetRectAttribute (XICAttribute *value_ret, char *p, XICAttr *ic_attr, int value_length, int need_swap) { XRectangle *buf; FrameMgr fm; extern XimFrameRec xrectangle_fr[]; if ((buf = (XRectangle *) malloc (sizeof (XRectangle))) == NULL) return; /*endif*/ fm = FrameMgrInit (xrectangle_fr, (char *) p, need_swap); /* get data */ FrameMgrGetToken (fm, buf->x); FrameMgrGetToken (fm, buf->y); FrameMgrGetToken (fm, buf->width); FrameMgrGetToken (fm, buf->height); FrameMgrFree (fm); value_ret->attribute_id = ic_attr->attribute_id; value_ret->name = ic_attr->name; value_ret->name_length = ic_attr->length; value_ret->type = ic_attr->type; value_ret->value_length = value_length; value_ret->value = (char *) buf; return; } #if 0 static void SetHotKeyAttribute (XICAttribute *value_ret, char *p, XICAttr *ic_attr, int value_length, int need_swap) { INT32 list_number; XIMTriggerKey *hotkeys; memmove (&list_number, p, sizeof(INT32)); p += sizeof(INT32); hotkeys = (XIMTriggerKey *) malloc (list_number*sizeof (XIMTriggerKey)); if (hotkeys == NULL) return; /*endif*/ memmove (hotkeys, p, list_number*sizeof (XIMTriggerKey)); value_ret->attribute_id = ic_attr->attribute_id; value_ret->name = ic_attr->name; value_ret->name_length = ic_attr->length; value_ret->type = ic_attr->type; value_ret->value_length = value_length; value_ret->value = (char *) hotkeys; } #endif /* get IC values */ static void GetAttrHeader (unsigned char *rec, XICAttribute *list, int need_swap) { FrameMgr fm; extern XimFrameRec attr_head_fr[]; fm = FrameMgrInit (attr_head_fr, (char *) rec, need_swap); /* put data */ FrameMgrPutToken (fm, list->attribute_id); FrameMgrPutToken (fm, list->value_length); FrameMgrFree (fm); } static void GetCardAttribute (char *rec, XICAttribute *list, int need_swap) { FrameMgr fm; unsigned char *recp = (unsigned char *) rec; GetAttrHeader (recp, list, need_swap); recp += sizeof (CARD16)*2; if (list->value_length == sizeof (CARD8)) { memmove (recp, list->value, list->value_length); } else if (list->value_length == sizeof (CARD16)) { INT16 *value = (INT16 *) list->value; extern XimFrameRec short_fr[]; fm = FrameMgrInit (short_fr, (char *) recp, need_swap); /* put data */ FrameMgrPutToken (fm, *value); FrameMgrFree (fm); } else if (list->value_length == sizeof (CARD32)) { INT32 *value = (INT32 *) list->value; extern XimFrameRec long_fr[]; fm = FrameMgrInit (long_fr, (char *) recp, need_swap); /* put data */ FrameMgrPutToken (fm, *value); FrameMgrFree (fm); } /*endif*/ } static void GetFontAttribute(char *rec, XICAttribute *list, int need_swap) { FrameMgr fm; extern XimFrameRec fontset_fr[]; char *base_name = (char *) list->value; unsigned char *recp = (unsigned char *) rec; GetAttrHeader (recp, list, need_swap); recp += sizeof (CARD16)*2; fm = FrameMgrInit (fontset_fr, (char *)recp, need_swap); /* put data */ FrameMgrSetSize (fm, list->value_length); FrameMgrPutToken (fm, list->value_length); FrameMgrPutToken (fm, base_name); FrameMgrFree (fm); } static void GetRectAttribute (char *rec, XICAttribute *list, int need_swap) { FrameMgr fm; extern XimFrameRec xrectangle_fr[]; XRectangle *rect = (XRectangle *) list->value; unsigned char *recp = (unsigned char *) rec; GetAttrHeader (recp, list, need_swap); recp += sizeof(CARD16)*2; fm = FrameMgrInit (xrectangle_fr, (char *) recp, need_swap); /* put data */ FrameMgrPutToken (fm, rect->x); FrameMgrPutToken (fm, rect->y); FrameMgrPutToken (fm, rect->width); FrameMgrPutToken (fm, rect->height); FrameMgrFree (fm); } static void GetPointAttribute (char *rec, XICAttribute *list, int need_swap) { FrameMgr fm; extern XimFrameRec xpoint_fr[]; XPoint *rect = (XPoint *) list->value; unsigned char *recp = (unsigned char *) rec; GetAttrHeader (recp, list, need_swap); recp += sizeof(CARD16)*2; fm = FrameMgrInit (xpoint_fr, (char *) recp, need_swap); /* put data */ FrameMgrPutToken (fm, rect->x); FrameMgrPutToken (fm, rect->y); FrameMgrFree (fm); } static int ReadICValue (Xi18n i18n_core, CARD16 icvalue_id, int value_length, void *p, XICAttribute *value_ret, CARD16 *number_ret, int need_swap) { XICAttr *ic_attr = i18n_core->address.xic_attr; int i; *number_ret = (CARD16) 0; for (i = 0; i < i18n_core->address.ic_attr_num; i++, ic_attr++) { if (ic_attr->attribute_id == icvalue_id) break; /*endif*/ } /*endfor*/ switch (ic_attr->type) { case XimType_NEST: { int total_length = 0; CARD16 attribute_ID; INT16 attribute_length; unsigned char *p1 = (unsigned char *) p; CARD16 ic_len = 0; CARD16 number; FrameMgr fm; extern XimFrameRec attr_head_fr[]; while (total_length < value_length) { fm = FrameMgrInit (attr_head_fr, (char *) p1, need_swap); /* get data */ FrameMgrGetToken (fm, attribute_ID); FrameMgrGetToken (fm, attribute_length); FrameMgrFree (fm); p1 += sizeof (CARD16)*2; ReadICValue (i18n_core, attribute_ID, attribute_length, p1, (value_ret + ic_len), &number, need_swap); ic_len++; *number_ret += number; p1 += attribute_length; p1 += IMPAD (attribute_length); total_length += (CARD16) sizeof(CARD16)*2 + (INT16) attribute_length + IMPAD (attribute_length); } /*endwhile*/ return ic_len; } case XimType_CARD8: case XimType_CARD16: case XimType_CARD32: case XimType_Window: SetCardAttribute (value_ret, p, ic_attr, value_length, need_swap); *number_ret = (CARD16) 1; return *number_ret; case XimType_XFontSet: SetFontAttribute (value_ret, p, ic_attr, value_length, need_swap); *number_ret = (CARD16) 1; return *number_ret; case XimType_XRectangle: SetRectAttribute (value_ret, p, ic_attr, value_length, need_swap); *number_ret = (CARD16) 1; return *number_ret; case XimType_XPoint: SetPointAttribute(value_ret, p, ic_attr, value_length, need_swap); *number_ret = (CARD16) 1; return *number_ret; #if 0 case XimType_XIMHotKeyTriggers: SetHotKeyAttribute (value_ret, p, ic_attr, value_length, need_swap); *number_ret = (CARD16) 1; return *number_ret; #endif } /*endswitch*/ return 0; } static void UpdateICAttributeList(XICAttribute *list, int number, int need_swap) { register int i; FrameMgr fm; unsigned char rec[sizeof(CARD32)]; for (i = 0; i < number; i++) { switch (list[i].type) { case XimType_CARD8: case XimType_CARD16: case XimType_CARD32: case XimType_Window: memmove(rec, list[i].value, list[i].value_length); if (list[i].value_length == sizeof (CARD16)) { INT16 *value = (INT16 *) list[i].value; extern XimFrameRec short_fr[]; fm = FrameMgrInit (short_fr, (char *)rec, need_swap); FrameMgrPutToken (fm, *value); FrameMgrFree (fm); } else if (list->value_length == sizeof (CARD32)) { INT32 *value = (INT32 *) list[i].value; extern XimFrameRec long_fr[]; fm = FrameMgrInit (long_fr, (char *)rec, need_swap); FrameMgrPutToken (fm, *value); FrameMgrFree (fm); } break; } } } static XICAttribute *CreateNestedList (CARD16 attr_id, XICAttribute *list, int number, int need_swap) { XICAttribute *nest_list = NULL; register int i; char *values = NULL; char *valuesp; int value_length = 0; if (number == 0) return NULL; /*endif*/ for (i = 0; i < number; i++) { value_length += sizeof (CARD16)*2; value_length += list[i].value_length; value_length += IMPAD (list[i].value_length); } /*endfor*/ if ((values = (char *) malloc (value_length)) == NULL) return NULL; /*endif*/ memset (values, 0, value_length); valuesp = values; for (i = 0; i < number; i++) { switch (list[i].type) { case XimType_CARD8: case XimType_CARD16: case XimType_CARD32: case XimType_Window: GetCardAttribute (valuesp, &list[i], need_swap); break; case XimType_XFontSet: GetFontAttribute (valuesp, &list[i], need_swap); break; case XimType_XRectangle: GetRectAttribute (valuesp, &list[i], need_swap); break; case XimType_XPoint: GetPointAttribute (valuesp, &list[i], need_swap); break; #if 0 case XimType_XIMHotKeyTriggers: GetHotKeyAttribute (valuesp, &list[i], need_swap); break; #endif } /*endswitch*/ valuesp += sizeof (CARD16)*2; valuesp += list[i].value_length; valuesp += IMPAD(list[i].value_length); } /*endfor*/ nest_list = (XICAttribute *) malloc (sizeof (XICAttribute)); if (nest_list == NULL) return NULL; /*endif*/ memset (nest_list, 0, sizeof (XICAttribute)); nest_list->value = (void *) malloc (value_length); if (nest_list->value == NULL) return NULL; /*endif*/ memset (nest_list->value, 0, sizeof (value_length)); nest_list->attribute_id = attr_id; nest_list->value_length = value_length; memmove (nest_list->value, values, value_length); XFree (values); return nest_list; } static Bool IsNestedList (Xi18n i18n_core, CARD16 icvalue_id) { XICAttr *ic_attr = i18n_core->address.xic_attr; int i; for (i = 0; i < i18n_core->address.ic_attr_num; i++, ic_attr++) { if (ic_attr->attribute_id == icvalue_id) { if (ic_attr->type == XimType_NEST) return True; /*endif*/ return False; } /*endif*/ } /*endfor*/ return False; } static Bool IsSeparator (Xi18n i18n_core, CARD16 icvalue_id) { return (i18n_core->address.separatorAttr_id == icvalue_id); } static int GetICValue (Xi18n i18n_core, XICAttribute *attr_ret, CARD16 *id_list, int list_num) { XICAttr *xic_attr = i18n_core->address.xic_attr; register int i; register int j; register int n; i = n = 0; if (IsNestedList (i18n_core, id_list[i])) { i++; while (i < list_num && !IsSeparator (i18n_core, id_list[i])) { for (j = 0; j < i18n_core->address.ic_attr_num; j++) { if (xic_attr[j].attribute_id == id_list[i]) { attr_ret[n].attribute_id = xic_attr[j].attribute_id; attr_ret[n].name_length = xic_attr[j].length; attr_ret[n].name = malloc (xic_attr[j].length + 1); strcpy(attr_ret[n].name, xic_attr[j].name); attr_ret[n].type = xic_attr[j].type; n++; i++; break; } /*endif*/ } /*endfor*/ } /*endwhile*/ } else { for (j = 0; j < i18n_core->address.ic_attr_num; j++) { if (xic_attr[j].attribute_id == id_list[i]) { attr_ret[n].attribute_id = xic_attr[j].attribute_id; attr_ret[n].name_length = xic_attr[j].length; attr_ret[n].name = malloc (xic_attr[j].length + 1); strcpy(attr_ret[n].name, xic_attr[j].name); attr_ret[n].type = xic_attr[j].type; n++; break; } /*endif*/ } /*endfor*/ } /*endif*/ return n; } /* called from CreateICMessageProc and SetICValueMessageProc */ void _Xi18nChangeIC (XIMS ims, IMProtocol *call_data, unsigned char *p, int create_flag) { Xi18n i18n_core = ims->protocol; FrameMgr fm; FmStatus status; CARD16 byte_length; register int total_size; unsigned char *reply = NULL; register int i; register int attrib_num; XICAttribute *attrib_list; XICAttribute pre_attr[IC_SIZE]; XICAttribute sts_attr[IC_SIZE]; XICAttribute ic_attr[IC_SIZE]; CARD16 preedit_ic_num = 0; CARD16 status_ic_num = 0; CARD16 ic_num = 0; CARD16 connect_id = call_data->any.connect_id; IMChangeICStruct *changeic = (IMChangeICStruct *) &call_data->changeic; extern XimFrameRec create_ic_fr[]; extern XimFrameRec create_ic_reply_fr[]; extern XimFrameRec set_ic_values_fr[]; extern XimFrameRec set_ic_values_reply_fr[]; CARD16 input_method_ID; memset (pre_attr, 0, sizeof (XICAttribute)*IC_SIZE); memset (sts_attr, 0, sizeof (XICAttribute)*IC_SIZE); memset (ic_attr, 0, sizeof (XICAttribute)*IC_SIZE); if (create_flag == True) { fm = FrameMgrInit (create_ic_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, byte_length); } else { fm = FrameMgrInit (set_ic_values_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, changeic->icid); FrameMgrGetToken (fm, byte_length); } /*endif*/ attrib_list = (XICAttribute *) malloc (sizeof (XICAttribute)*IC_SIZE); if (!attrib_list) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (attrib_list, 0, sizeof(XICAttribute)*IC_SIZE); attrib_num = 0; while (FrameMgrIsIterLoopEnd (fm, &status) == False) { void *value; int value_length; FrameMgrGetToken (fm, attrib_list[attrib_num].attribute_id); FrameMgrGetToken (fm, value_length); FrameMgrSetSize (fm, value_length); attrib_list[attrib_num].value_length = value_length; FrameMgrGetToken (fm, value); attrib_list[attrib_num].value = (void *) malloc (value_length + 1); memmove (attrib_list[attrib_num].value, value, value_length); ((char *)attrib_list[attrib_num].value)[value_length] = '\0'; attrib_num++; } /*endwhile*/ for (i = 0; i < attrib_num; i++) { CARD16 number; if (IsNestedList (i18n_core, attrib_list[i].attribute_id)) { if (attrib_list[i].attribute_id == i18n_core->address.preeditAttr_id) { ReadICValue (i18n_core, attrib_list[i].attribute_id, attrib_list[i].value_length, attrib_list[i].value, &pre_attr[preedit_ic_num], &number, _Xi18nNeedSwap(i18n_core, connect_id)); preedit_ic_num += number; } else if (attrib_list[i].attribute_id == i18n_core->address.statusAttr_id) { ReadICValue (i18n_core, attrib_list[i].attribute_id, attrib_list[i].value_length, attrib_list[i].value, &sts_attr[status_ic_num], &number, _Xi18nNeedSwap (i18n_core, connect_id)); status_ic_num += number; } else { /* another nested list.. possible? */ } /*endif*/ } else { ReadICValue (i18n_core, attrib_list[i].attribute_id, attrib_list[i].value_length, attrib_list[i].value, &ic_attr[ic_num], &number, _Xi18nNeedSwap (i18n_core, connect_id)); ic_num += number; } /*endif*/ } /*endfor*/ for (i = 0; i < attrib_num; i++) free (attrib_list[i].value); /*endfor*/ free (attrib_list); FrameMgrFree (fm); changeic->preedit_attr_num = preedit_ic_num; changeic->status_attr_num = status_ic_num; changeic->ic_attr_num = ic_num; changeic->preedit_attr = pre_attr; changeic->status_attr = sts_attr; changeic->ic_attr = ic_attr; if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ /* Here, we must free value of ic_attr, pre_attr and sts_attr */ for (i = 0; i < ic_num; i++) free (ic_attr[i].value); for (i = 0; i < preedit_ic_num; i++) free (pre_attr[i].value); for (i = 0; i < status_ic_num; i++) free (sts_attr[i].value); if (create_flag == True) { fm = FrameMgrInit (create_ic_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); } else { fm = FrameMgrInit (set_ic_values_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); } /*endif*/ total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); FrameMgrPutToken (fm, changeic->icid); if (create_flag == True) { _Xi18nSendMessage (ims, connect_id, XIM_CREATE_IC_REPLY, 0, reply, total_size); } else { _Xi18nSendMessage (ims, connect_id, XIM_SET_IC_VALUES_REPLY, 0, reply, total_size); } /*endif*/ if (create_flag == True) { int on_key_num = i18n_core->address.on_keys.count_keys; int off_key_num = i18n_core->address.off_keys.count_keys; if (on_key_num == 0 && off_key_num == 0) { long mask; if (i18n_core->address.imvalue_mask & I18N_FILTERMASK) mask = i18n_core->address.filterevent_mask; else mask = DEFAULT_FILTER_MASK; /*endif*/ /* static event flow is default */ _Xi18nSetEventMask (ims, connect_id, input_method_ID, changeic->icid, mask, ~mask); } /*endif*/ } /*endif*/ FrameMgrFree (fm); free (reply); } /* called from GetICValueMessageProc */ void _Xi18nGetIC (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; FmStatus status; extern XimFrameRec get_ic_values_fr[]; extern XimFrameRec get_ic_values_reply_fr[]; CARD16 byte_length; register int total_size; unsigned char *reply = NULL; XICAttribute *preedit_ret = NULL; XICAttribute *status_ret = NULL; register int i; register int number; int iter_count; int need_swap; CARD16 *attrID_list; XICAttribute pre_attr[IC_SIZE]; XICAttribute sts_attr[IC_SIZE]; XICAttribute ic_attr[IC_SIZE]; CARD16 pre_count = 0; CARD16 sts_count = 0; CARD16 ic_count = 0; IMChangeICStruct *getic = (IMChangeICStruct *) &call_data->changeic; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; memset (pre_attr, 0, sizeof (XICAttribute)*IC_SIZE); memset (sts_attr, 0, sizeof (XICAttribute)*IC_SIZE); memset (ic_attr, 0, sizeof (XICAttribute)*IC_SIZE); fm = FrameMgrInit (get_ic_values_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, getic->icid); FrameMgrGetToken (fm, byte_length); attrID_list = (CARD16 *) malloc (sizeof (CARD16)*IC_SIZE); /* bogus */ memset (attrID_list, 0, sizeof (CARD16)*IC_SIZE); number = 0; while (FrameMgrIsIterLoopEnd (fm, &status) == False) FrameMgrGetToken (fm, attrID_list[number++]); /*endwhile*/ FrameMgrFree (fm); i = 0; while (i < number) { int read_number; if (IsNestedList (i18n_core, attrID_list[i])) { if (attrID_list[i] == i18n_core->address.preeditAttr_id) { read_number = GetICValue (i18n_core, &pre_attr[pre_count], &attrID_list[i], number); i += read_number + 1; pre_count += read_number; } else if (attrID_list[i] == i18n_core->address.statusAttr_id) { read_number = GetICValue (i18n_core, &sts_attr[sts_count], &attrID_list[i], number); i += read_number + 1; sts_count += read_number; } else { /* another nested list.. possible? */ } /*endif*/ } else { read_number = GetICValue (i18n_core, &ic_attr[ic_count], &attrID_list[i], number); i += read_number; ic_count += read_number; } /*endif*/ } /*endwhile*/ getic->preedit_attr_num = pre_count; getic->status_attr_num = sts_count; getic->ic_attr_num = ic_count; getic->preedit_attr = pre_attr; getic->status_attr = sts_attr; getic->ic_attr = ic_attr; if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ need_swap = _Xi18nNeedSwap (i18n_core, connect_id); UpdateICAttributeList(getic->ic_attr, getic->ic_attr_num, need_swap); iter_count = getic->ic_attr_num; preedit_ret = CreateNestedList (i18n_core->address.preeditAttr_id, getic->preedit_attr, getic->preedit_attr_num, need_swap); if (preedit_ret) iter_count++; /*endif*/ status_ret = CreateNestedList (i18n_core->address.statusAttr_id, getic->status_attr, getic->status_attr_num, need_swap); if (status_ret) iter_count++; /*endif*/ fm = FrameMgrInit (get_ic_values_reply_fr, NULL, need_swap); /* set iteration count for list of ic_attribute */ FrameMgrSetIterCount (fm, iter_count); /* set length of BARRAY item in xicattribute_fr */ for (i = 0; i < (int) getic->ic_attr_num; i++) FrameMgrSetSize (fm, ic_attr[i].value_length); /*endfor*/ if (preedit_ret) FrameMgrSetSize (fm, preedit_ret->value_length); /*endif*/ if (status_ret) FrameMgrSetSize (fm, status_ret->value_length); /*endif*/ total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (reply == NULL) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); FrameMgrPutToken (fm, getic->icid); for (i = 0; i < (int) getic->ic_attr_num; i++) { FrameMgrPutToken (fm, ic_attr[i].attribute_id); FrameMgrPutToken (fm, ic_attr[i].value_length); FrameMgrPutToken (fm, ic_attr[i].value); } /*endfor*/ if (preedit_ret) { FrameMgrPutToken (fm, preedit_ret->attribute_id); FrameMgrPutToken (fm, preedit_ret->value_length); FrameMgrPutToken (fm, preedit_ret->value); } /*endif*/ if (status_ret) { FrameMgrPutToken (fm, status_ret->attribute_id); FrameMgrPutToken (fm, status_ret->value_length); FrameMgrPutToken (fm, status_ret->value); } /*endif*/ _Xi18nSendMessage (ims, connect_id, XIM_GET_IC_VALUES_REPLY, 0, reply, total_size); free (reply); free (attrID_list); for (i = 0; i < (int) getic->ic_attr_num; i++) { if (getic->ic_attr[i].name) free (getic->ic_attr[i].name); /*endif*/ if (getic->ic_attr[i].value) free (getic->ic_attr[i].value); /*endif*/ } /*endfor*/ for (i = 0; i < (int) getic->preedit_attr_num; i++) { if (getic->preedit_attr[i].name) free (getic->preedit_attr[i].name); /*endif*/ if (getic->preedit_attr[i].value) free (getic->preedit_attr[i].value); /*endif*/ } /*endfor*/ for (i = 0; i < (int) getic->status_attr_num; i++) { if (getic->status_attr[i].name) free (getic->status_attr[i].name); /*endif*/ if (getic->status_attr[i].value) free (getic->status_attr[i].value); /*endif*/ } /*endfor*/ if (preedit_ret) { free (preedit_ret->value); free (preedit_ret); } /*endif*/ if (status_ret) { free (status_ret->value); free (status_ret); } /*endif*/ FrameMgrFree (fm); } nabi-nabi-1.0.1/IMdkit/i18nMethod.c000066400000000000000000001133221430012456200165750ustar00rootroot00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by 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. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include #ifndef NEED_EVENTS #define NEED_EVENTS #endif #include #undef NEED_EVENTS #include "FrameMgr.h" #include "IMdkit.h" #include "Xi18n.h" #include "XimFunc.h" extern Xi18nClient *_Xi18nFindClient (Xi18n, CARD16); static void *xi18n_setup (Display *, XIMArg *); static Status xi18n_openIM (XIMS); static Status xi18n_closeIM (XIMS); static char *xi18n_setIMValues (XIMS, XIMArg *); static char *xi18n_getIMValues (XIMS, XIMArg *); static Status xi18n_forwardEvent (XIMS, XPointer); static Status xi18n_commit (XIMS, XPointer); static int xi18n_callCallback (XIMS, XPointer); static int xi18n_preeditStart (XIMS, XPointer); static int xi18n_preeditEnd (XIMS, XPointer); static int xi18n_syncXlib (XIMS, XPointer); #ifndef XIM_SERVERS #define XIM_SERVERS "XIM_SERVERS" #endif static Atom XIM_Servers = None; IMMethodsRec Xi18n_im_methods = { xi18n_setup, xi18n_openIM, xi18n_closeIM, xi18n_setIMValues, xi18n_getIMValues, xi18n_forwardEvent, xi18n_commit, xi18n_callCallback, xi18n_preeditStart, xi18n_preeditEnd, xi18n_syncXlib, }; extern Bool _Xi18nCheckXAddress (Xi18n, TransportSW *, char *); extern Bool _Xi18nCheckTransAddress (Xi18n, TransportSW *, char *); TransportSW _TransR[] = { {"X", 1, _Xi18nCheckXAddress}, #ifdef TCPCONN {"tcp", 3, _Xi18nCheckTransAddress}, {"local", 5, _Xi18nCheckTransAddress}, #endif #ifdef DNETCONN {"decnet", 6, _Xi18nCheckTransAddress}, #endif {(char *) NULL, 0, (Bool (*) ()) NULL} }; static Bool GetInputStyles (Xi18n i18n_core, XIMStyles **p_style) { Xi18nAddressRec *address = (Xi18nAddressRec *) &i18n_core->address; XIMStyles *p; int i; p = &address->input_styles; if ((*p_style = (XIMStyles *) malloc (sizeof (XIMStyles) + p->count_styles*sizeof (XIMStyle))) == NULL) { return False; } /*endif*/ (*p_style)->count_styles = p->count_styles; (*p_style)->supported_styles = (XIMStyle *) ((XPointer) *p_style + sizeof (XIMStyles)); for (i = 0; i < (int) p->count_styles; i++) (*p_style)->supported_styles[i] = p->supported_styles[i]; /*endfor*/ return True; } static Bool GetOnOffKeys (Xi18n i18n_core, long mask, XIMTriggerKeys **p_key) { Xi18nAddressRec *address = (Xi18nAddressRec *) &i18n_core->address; XIMTriggerKeys *p; int i; if (mask & I18N_ON_KEYS) p = &address->on_keys; else p = &address->off_keys; /*endif*/ if ((*p_key = (XIMTriggerKeys *) malloc (sizeof(XIMTriggerKeys) + p->count_keys*sizeof(XIMTriggerKey))) == NULL) { return False; } /*endif*/ (*p_key)->count_keys = p->count_keys; (*p_key)->keylist = (XIMTriggerKey *) ((XPointer) *p_key + sizeof(XIMTriggerKeys)); for (i = 0; i < (int) p->count_keys; i++) { (*p_key)->keylist[i].keysym = p->keylist[i].keysym; (*p_key)->keylist[i].modifier = p->keylist[i].modifier; (*p_key)->keylist[i].modifier_mask = p->keylist[i].modifier_mask; } /*endfor*/ return True; } static Bool GetEncodings(Xi18n i18n_core, XIMEncodings **p_encoding) { Xi18nAddressRec *address = (Xi18nAddressRec *) &i18n_core->address; XIMEncodings *p; int i; p = &address->encoding_list; if ((*p_encoding = (XIMEncodings *) malloc (sizeof (XIMEncodings) + p->count_encodings*sizeof(XIMEncoding))) == NULL) { return False; } /*endif*/ (*p_encoding)->count_encodings = p->count_encodings; (*p_encoding)->supported_encodings = (XIMEncoding *) ((XPointer)*p_encoding + sizeof (XIMEncodings)); for (i = 0; i < (int) p->count_encodings; i++) { (*p_encoding)->supported_encodings[i] = (char *) malloc (strlen (p->supported_encodings[i]) + 1); strcpy ((*p_encoding)->supported_encodings[i], p->supported_encodings[i]); } /*endif*/ return True; } static char *ParseArgs (Xi18n i18n_core, int mode, XIMArg *args) { Xi18nAddressRec *address = (Xi18nAddressRec *) &i18n_core->address; XIMArg *p; if (mode == I18N_OPEN || mode == I18N_SET) { for (p = args; p->name != NULL; p++) { if (strcmp (p->name, IMLocale) == 0) { if (address->imvalue_mask & I18N_IM_LOCALE) return IMLocale; /*endif*/ address->im_locale = (char *) malloc (strlen (p->value) + 1); if (!address->im_locale) return IMLocale; /*endif*/ strcpy (address->im_locale, p->value); address->imvalue_mask |= I18N_IM_LOCALE; } else if (strcmp (p->name, IMServerTransport) == 0) { if (address->imvalue_mask & I18N_IM_ADDRESS) return IMServerTransport; /*endif*/ address->im_addr = (char *) malloc (strlen (p->value) + 1); if (!address->im_addr) return IMServerTransport; /*endif*/ strcpy(address->im_addr, p->value); address->imvalue_mask |= I18N_IM_ADDRESS; } else if (strcmp (p->name, IMServerName) == 0) { if (address->imvalue_mask & I18N_IM_NAME) return IMServerName; /*endif*/ address->im_name = (char *) malloc (strlen (p->value) + 1); if (!address->im_name) return IMServerName; /*endif*/ strcpy (address->im_name, p->value); address->imvalue_mask |= I18N_IM_NAME; } else if (strcmp (p->name, IMServerWindow) == 0) { if (address->imvalue_mask & I18N_IMSERVER_WIN) return IMServerWindow; /*endif*/ address->im_window = (Window) p->value; address->imvalue_mask |= I18N_IMSERVER_WIN; } else if (strcmp (p->name, IMInputStyles) == 0) { if (address->imvalue_mask & I18N_INPUT_STYLES) return IMInputStyles; /*endif*/ address->input_styles.count_styles = ((XIMStyles*)p->value)->count_styles; address->input_styles.supported_styles = (XIMStyle *) malloc (sizeof (XIMStyle)*address->input_styles.count_styles); if (address->input_styles.supported_styles == (XIMStyle *) NULL) return IMInputStyles; /*endif*/ memmove (address->input_styles.supported_styles, ((XIMStyles *) p->value)->supported_styles, sizeof (XIMStyle)*address->input_styles.count_styles); address->imvalue_mask |= I18N_INPUT_STYLES; } else if (strcmp (p->name, IMProtocolHandler) == 0) { address->improto = (IMProtoHandler) p->value; address->imvalue_mask |= I18N_IM_HANDLER; } else if (strcmp (p->name, IMOnKeysList) == 0) { if (address->on_keys.keylist != NULL) free(address->on_keys.keylist); address->on_keys.count_keys = ((XIMTriggerKeys *) p->value)->count_keys; address->on_keys.keylist = (XIMTriggerKey *) malloc (sizeof (XIMTriggerKey)*address->on_keys.count_keys); if (address->on_keys.keylist == (XIMTriggerKey *) NULL) return IMOnKeysList; /*endif*/ memmove (address->on_keys.keylist, ((XIMTriggerKeys *) p->value)->keylist, sizeof (XIMTriggerKey)*address->on_keys.count_keys); address->imvalue_mask |= I18N_ON_KEYS; } else if (strcmp (p->name, IMOffKeysList) == 0) { if (address->imvalue_mask & I18N_OFF_KEYS) return IMOffKeysList; /*endif*/ address->off_keys.count_keys = ((XIMTriggerKeys *) p->value)->count_keys; address->off_keys.keylist = (XIMTriggerKey *) malloc (sizeof (XIMTriggerKey)*address->off_keys.count_keys); if (address->off_keys.keylist == (XIMTriggerKey *) NULL) return IMOffKeysList; /*endif*/ memmove (address->off_keys.keylist, ((XIMTriggerKeys *) p->value)->keylist, sizeof (XIMTriggerKey)*address->off_keys.count_keys); address->imvalue_mask |= I18N_OFF_KEYS; } else if (strcmp (p->name, IMEncodingList) == 0) { if (address->imvalue_mask & I18N_ENCODINGS) return IMEncodingList; /*endif*/ address->encoding_list.count_encodings = ((XIMEncodings *) p->value)->count_encodings; address->encoding_list.supported_encodings = (XIMEncoding *) malloc (sizeof (XIMEncoding)*address->encoding_list.count_encodings); if (address->encoding_list.supported_encodings == (XIMEncoding *) NULL) { return IMEncodingList; } /*endif*/ memmove (address->encoding_list.supported_encodings, ((XIMEncodings *) p->value)->supported_encodings, sizeof (XIMEncoding)*address->encoding_list.count_encodings); address->imvalue_mask |= I18N_ENCODINGS; } else if (strcmp (p->name, IMFilterEventMask) == 0) { if (address->imvalue_mask & I18N_FILTERMASK) return IMFilterEventMask; /*endif*/ address->filterevent_mask = (long) p->value; address->imvalue_mask |= I18N_FILTERMASK; } /*endif*/ } /*endfor*/ if (mode == I18N_OPEN) { /* check mandatory IM values */ if (!(address->imvalue_mask & I18N_IM_LOCALE)) { /* locales must be set in IMOpenIM */ return IMLocale; } /*endif*/ if (!(address->imvalue_mask & I18N_IM_ADDRESS)) { /* address must be set in IMOpenIM */ return IMServerTransport; } /*endif*/ } /*endif*/ } else if (mode == I18N_GET) { for (p = args; p->name != NULL; p++) { if (strcmp (p->name, IMLocale) == 0) { p->value = (char *) malloc (strlen (address->im_locale) + 1); if (!p->value) return IMLocale; /*endif*/ strcpy (p->value, address->im_locale); } else if (strcmp (p->name, IMServerTransport) == 0) { p->value = (char *) malloc (strlen (address->im_addr) + 1); if (!p->value) return IMServerTransport; /*endif*/ strcpy (p->value, address->im_addr); } else if (strcmp (p->name, IMServerName) == 0) { if (address->imvalue_mask & I18N_IM_NAME) { p->value = (char *) malloc (strlen (address->im_name) + 1); if (!p->value) return IMServerName; /*endif*/ strcpy (p->value, address->im_name); } else { return IMServerName; } /*endif*/ } else if (strcmp (p->name, IMServerWindow) == 0) { if (address->imvalue_mask & I18N_IMSERVER_WIN) *((Window *) (p->value)) = address->im_window; else return IMServerWindow; /*endif*/ } else if (strcmp (p->name, IMInputStyles) == 0) { if (GetInputStyles (i18n_core, (XIMStyles **) p->value) == False) { return IMInputStyles; } /*endif*/ } else if (strcmp (p->name, IMProtocolHandler) == 0) { if (address->imvalue_mask & I18N_IM_HANDLER) *((IMProtoHandler *) (p->value)) = address->improto; else return IMProtocolHandler; /*endif*/ } else if (strcmp (p->name, IMOnKeysList) == 0) { if (address->imvalue_mask & I18N_ON_KEYS) { if (GetOnOffKeys (i18n_core, I18N_ON_KEYS, (XIMTriggerKeys **) p->value) == False) { return IMOnKeysList; } /*endif*/ } else { return IMOnKeysList; } /*endif*/ } else if (strcmp (p->name, IMOffKeysList) == 0) { if (address->imvalue_mask & I18N_OFF_KEYS) { if (GetOnOffKeys (i18n_core, I18N_OFF_KEYS, (XIMTriggerKeys **) p->value) == False) { return IMOffKeysList; } /*endif*/ } else { return IMOffKeysList; } /*endif*/ } else if (strcmp (p->name, IMEncodingList) == 0) { if (address->imvalue_mask & I18N_ENCODINGS) { if (GetEncodings (i18n_core, (XIMEncodings **) p->value) == False) { return IMEncodingList; } /*endif*/ } else { return IMEncodingList; } /*endif*/ } else if (strcmp (p->name, IMFilterEventMask) == 0) { if (address->imvalue_mask & I18N_FILTERMASK) *((long *) (p->value)) = address->filterevent_mask; else return IMFilterEventMask; /*endif*/ } /*endif*/ } /*endfor*/ } /*endif*/ return NULL; } static int CheckIMName (Xi18n i18n_core) { char *address = i18n_core->address.im_addr; int i; for (i = 0; _TransR[i].transportname; i++) { while (*address == ' ' || *address == '\t') address++; /*endwhile*/ if (strncmp (address, _TransR[i].transportname, _TransR[i].namelen) == 0 && address[_TransR[i].namelen] == '/') { if (_TransR[i].checkAddr (i18n_core, &_TransR[i], address + _TransR[i].namelen + 1) == True) { return True; } /*endif*/ return False; } /*endif*/ } /*endfor*/ return False; } static int SetXi18nSelectionOwner(Xi18n i18n_core) { Display *dpy = i18n_core->address.dpy; Window ims_win = i18n_core->address.im_window; Window root = RootWindow (dpy, DefaultScreen (dpy)); Atom realtype; int realformat; unsigned long bytesafter; long *data=NULL; unsigned long length; Atom atom; int i; int found; int forse = False; char buf[256]; (void)snprintf(buf, sizeof(buf), "@server=%s", i18n_core->address.im_name); buf[sizeof(buf) - 1] = '\0'; if ((atom = XInternAtom(dpy, buf, False)) == 0) return False; i18n_core->address.selection = atom; if (XIM_Servers == None) XIM_Servers = XInternAtom (dpy, XIM_SERVERS, False); /*endif*/ XGetWindowProperty (dpy, root, XIM_Servers, 0L, 1000000L, False, XA_ATOM, &realtype, &realformat, &length, &bytesafter, (unsigned char **) (&data)); if (realtype != None && (realtype != XA_ATOM || realformat != 32)) { if (data != NULL) XFree ((char *) data); return False; } found = False; for (i = 0; i < length; i++) { if (data[i] == atom) { Window owner; found = True; if ((owner = XGetSelectionOwner (dpy, atom)) != ims_win) { if (owner == None || forse == True) XSetSelectionOwner (dpy, atom, ims_win, CurrentTime); else return False; } break; } } if (found == False) { XSetSelectionOwner (dpy, atom, ims_win, CurrentTime); XChangeProperty (dpy, root, XIM_Servers, XA_ATOM, 32, PropModePrepend, (unsigned char *) &atom, 1); } else { /* * We always need to generate the PropertyNotify to the Root Window */ XChangeProperty (dpy, root, XIM_Servers, XA_ATOM, 32, PropModePrepend, (unsigned char *) data, 0); } if (data != NULL) XFree ((char *) data); /* Intern "LOCALES" and "TRANSOPORT" Target Atoms */ i18n_core->address.Localename = XInternAtom (dpy, LOCALES, False); i18n_core->address.Transportname = XInternAtom (dpy, TRANSPORT, False); return (XGetSelectionOwner (dpy, atom) == ims_win); } static int DeleteXi18nAtom(Xi18n i18n_core) { Display *dpy = i18n_core->address.dpy; Window root = RootWindow (dpy, DefaultScreen (dpy)); Atom realtype; int realformat; unsigned long bytesafter; long *data=NULL; unsigned long length; Atom atom; int i, ret; int found; char buf[256]; (void)snprintf(buf, sizeof(buf), "@server=%s", i18n_core->address.im_name); buf[sizeof(buf) - 1] = '\0'; if ((atom = XInternAtom(dpy, buf, False)) == 0) return False; i18n_core->address.selection = atom; if (XIM_Servers == None) XIM_Servers = XInternAtom (dpy, XIM_SERVERS, False); XGetWindowProperty (dpy, root, XIM_Servers, 0L, 1000000L, False, XA_ATOM, &realtype, &realformat, &length, &bytesafter, (unsigned char **) (&data)); if (realtype != XA_ATOM || realformat != 32) { if (data != NULL) XFree ((char *) data); return False; } found = False; for (i = 0; i < length; i++) { if (data[i] == atom) { found = True; break; } } if (found == True) { for (i=i+1; iaddress.dpy = dpy; if (ParseArgs (i18n_core, I18N_OPEN, args) != NULL) { free (i18n_core); return NULL; } /*endif*/ if (*(char *) &endian) i18n_core->address.im_byteOrder = 'l'; else i18n_core->address.im_byteOrder = 'B'; /*endif*/ /* install IMAttr and ICAttr list in i18n_core */ _Xi18nInitAttrList (i18n_core); /* install IMExtension list in i18n_core */ _Xi18nInitExtension (i18n_core); return i18n_core; } static void ReturnSelectionNotify (Xi18n i18n_core, XSelectionRequestEvent *ev) { XEvent event; Display *dpy = i18n_core->address.dpy; char buf[4096]; event.type = SelectionNotify; event.xselection.requestor = ev->requestor; event.xselection.selection = ev->selection; event.xselection.target = ev->target; event.xselection.time = ev->time; event.xselection.property = ev->property; if (ev->target == i18n_core->address.Localename) { snprintf (buf, sizeof(buf), "@locale=%s", i18n_core->address.im_locale); buf[sizeof(buf) - 1] = '\0'; } else if (ev->target == i18n_core->address.Transportname) { snprintf (buf, sizeof(buf), "@transport=%s", i18n_core->address.im_addr); buf[sizeof(buf) - 1] = '\0'; } /*endif*/ XChangeProperty (dpy, event.xselection.requestor, ev->target, ev->target, 8, PropModeReplace, (unsigned char *) buf, strlen (buf)); XSendEvent (dpy, event.xselection.requestor, False, NoEventMask, &event); XFlush (i18n_core->address.dpy); } static Bool WaitXSelectionRequest (Display *dpy, Window win, XEvent *ev, XPointer client_data) { XIMS ims = (XIMS) client_data; Xi18n i18n_core = ims->protocol; if (((XSelectionRequestEvent *) ev)->selection == i18n_core->address.selection) { ReturnSelectionNotify (i18n_core, (XSelectionRequestEvent *) ev); return True; } /*endif*/ return False; } static Status xi18n_openIM(XIMS ims) { Xi18n i18n_core = ims->protocol; Display *dpy = i18n_core->address.dpy; if (!CheckIMName (i18n_core) || !SetXi18nSelectionOwner (i18n_core) || !i18n_core->methods.begin (ims)) { free (i18n_core->address.im_name); free (i18n_core->address.im_locale); free (i18n_core->address.im_addr); free (i18n_core); return False; } /*endif*/ _XRegisterFilterByType (dpy, i18n_core->address.im_window, SelectionRequest, SelectionRequest, WaitXSelectionRequest, (XPointer)ims); XFlush(dpy); return True; } static Status xi18n_closeIM(XIMS ims) { Xi18n i18n_core = ims->protocol; Display *dpy = i18n_core->address.dpy; /* remove all client connections */ while (i18n_core->address.clients != NULL) { int connect_id = i18n_core->address.clients->connect_id; i18n_core->methods.disconnect(ims, connect_id); } DeleteXi18nAtom(i18n_core); if (!i18n_core->methods.end (ims)) return False; _XUnregisterFilter (dpy, i18n_core->address.im_window, WaitXSelectionRequest, (XPointer)ims); _Xi18nDeleteAllClients(i18n_core); _Xi18nDeleteFreeClients(i18n_core); free (i18n_core->address.im_name); free (i18n_core->address.im_locale); free (i18n_core->address.im_addr); free (i18n_core->address.input_styles.supported_styles); free (i18n_core->address.on_keys.keylist); free (i18n_core->address.off_keys.keylist); free (i18n_core->address.encoding_list.supported_encodings); free (i18n_core->address.xim_attr); free (i18n_core->address.xic_attr); free (i18n_core->address.connect_addr); free (i18n_core); return True; } static char *xi18n_setIMValues (XIMS ims, XIMArg *args) { Xi18n i18n_core = ims->protocol; char *ret; if ((ret = ParseArgs (i18n_core, I18N_SET, args)) != NULL) return ret; /*endif*/ return NULL; } static char *xi18n_getIMValues (XIMS ims, XIMArg *args) { Xi18n i18n_core = ims->protocol; char *ret; if ((ret = ParseArgs (i18n_core, I18N_GET, args)) != NULL) return ret; /*endif*/ return NULL; } /* For byte swapping */ #define Swap16(n) \ (((n) << 8 & 0xFF00) | \ ((n) >> 8 & 0xFF) \ ) #define Swap32(n) \ (((n) << 24 & 0xFF000000) | \ ((n) << 8 & 0xFF0000) | \ ((n) >> 8 & 0xFF00) | \ ((n) >> 24 & 0xFF) \ ) #define Swap64(n) \ (((n) << 56 & 0xFF00000000000000) | \ ((n) << 40 & 0xFF000000000000) | \ ((n) << 24 & 0xFF0000000000) | \ ((n) << 8 & 0xFF00000000) | \ ((n) >> 8 & 0xFF000000) | \ ((n) >> 24 & 0xFF0000) | \ ((n) >> 40 & 0xFF00) | \ ((n) >> 56 & 0xFF) \ ) static void EventToWireEvent (XEvent *ev, xEvent *event, CARD16 *serial, Bool need_swap) { *serial = (CARD16) (ev->xany.serial >> 16); event->u.u.sequenceNumber = (CARD16) (ev->xany.serial & (unsigned long) 0xFFFF); switch (ev->type) { case KeyPress: case KeyRelease: { XKeyEvent *kev = (XKeyEvent *) ev; if (need_swap) { event->u.u.type = ev->type; event->u.keyButtonPointer.root = Swap32(kev->root); event->u.keyButtonPointer.state = Swap16(kev->state); event->u.keyButtonPointer.time = Swap32(kev->time); event->u.keyButtonPointer.event = Swap32(kev->window); event->u.keyButtonPointer.child = Swap32(kev->subwindow); event->u.keyButtonPointer.eventX = Swap16(kev->x); event->u.keyButtonPointer.eventY = Swap16(kev->y); event->u.keyButtonPointer.rootX = Swap16(kev->x_root); event->u.keyButtonPointer.rootY = Swap16(kev->y_root); event->u.keyButtonPointer.sameScreen = kev->same_screen; event->u.u.detail = kev->keycode; } else { event->u.u.type = ev->type; event->u.keyButtonPointer.root = kev->root; event->u.keyButtonPointer.state = kev->state; event->u.keyButtonPointer.time = kev->time; event->u.keyButtonPointer.event = kev->window; event->u.keyButtonPointer.child = kev->subwindow; event->u.keyButtonPointer.eventX = kev->x; event->u.keyButtonPointer.eventY = kev->y; event->u.keyButtonPointer.rootX = kev->x_root; event->u.keyButtonPointer.rootY = kev->y_root; event->u.keyButtonPointer.sameScreen = kev->same_screen; event->u.u.detail = kev->keycode; } } } /*endswitch*/ } static Status xi18n_forwardEvent (XIMS ims, XPointer xp) { Xi18n i18n_core = ims->protocol; IMForwardEventStruct *call_data = (IMForwardEventStruct *)xp; FrameMgr fm; extern XimFrameRec forward_event_fr[]; register int total_size; unsigned char *reply = NULL; unsigned char *replyp; CARD16 serial; int event_size; Xi18nClient *client; Bool need_swap; client = (Xi18nClient *) _Xi18nFindClient (i18n_core, call_data->connect_id); /* create FrameMgr */ need_swap = _Xi18nNeedSwap (i18n_core, call_data->connect_id); fm = FrameMgrInit (forward_event_fr, NULL, need_swap); total_size = FrameMgrGetTotalSize (fm); event_size = sizeof (xEvent); reply = (unsigned char *) malloc (total_size + event_size); if (!reply) { _Xi18nSendMessage (ims, call_data->connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size + event_size); FrameMgrSetBuffer (fm, reply); replyp = reply; call_data->sync_bit = 1; /* always sync */ client->sync = True; FrameMgrPutToken (fm, call_data->connect_id); FrameMgrPutToken (fm, call_data->icid); FrameMgrPutToken (fm, call_data->sync_bit); replyp += total_size; EventToWireEvent (&(call_data->event), (xEvent *) replyp, &serial, need_swap); FrameMgrPutToken (fm, serial); _Xi18nSendMessage (ims, call_data->connect_id, XIM_FORWARD_EVENT, 0, reply, total_size + event_size); free (reply); FrameMgrFree (fm); return True; } static Status xi18n_commit (XIMS ims, XPointer xp) { Xi18n i18n_core = ims->protocol; IMCommitStruct *call_data = (IMCommitStruct *)xp; FrameMgr fm; extern XimFrameRec commit_chars_fr[]; extern XimFrameRec commit_both_fr[]; register int total_size; unsigned char *reply = NULL; CARD16 str_length; call_data->flag |= XimSYNCHRONUS; /* always sync */ if (!(call_data->flag & XimLookupKeySym) && (call_data->flag & XimLookupChars)) { fm = FrameMgrInit (commit_chars_fr, NULL, _Xi18nNeedSwap (i18n_core, call_data->connect_id)); /* set length of STRING8 */ str_length = strlen (call_data->commit_string); FrameMgrSetSize (fm, str_length); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, call_data->connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); str_length = FrameMgrGetSize (fm); FrameMgrPutToken (fm, call_data->connect_id); FrameMgrPutToken (fm, call_data->icid); FrameMgrPutToken (fm, call_data->flag); FrameMgrPutToken (fm, str_length); FrameMgrPutToken (fm, call_data->commit_string); } else { fm = FrameMgrInit (commit_both_fr, NULL, _Xi18nNeedSwap (i18n_core, call_data->connect_id)); /* set length of STRING8 */ str_length = strlen (call_data->commit_string); if (str_length > 0) FrameMgrSetSize (fm, str_length); /*endif*/ total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, call_data->connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, call_data->connect_id); FrameMgrPutToken (fm, call_data->icid); FrameMgrPutToken (fm, call_data->flag); FrameMgrPutToken (fm, call_data->keysym); if (str_length > 0) { str_length = FrameMgrGetSize (fm); FrameMgrPutToken (fm, str_length); FrameMgrPutToken (fm, call_data->commit_string); } /*endif*/ } /*endif*/ _Xi18nSendMessage (ims, call_data->connect_id, XIM_COMMIT, 0, reply, total_size); FrameMgrFree (fm); free (reply); return True; } static int xi18n_callCallback (XIMS ims, XPointer xp) { IMProtocol *call_data = (IMProtocol *)xp; switch (call_data->major_code) { case XIM_GEOMETRY: return _Xi18nGeometryCallback (ims, call_data); case XIM_PREEDIT_START: return _Xi18nPreeditStartCallback (ims, call_data); case XIM_PREEDIT_DRAW: return _Xi18nPreeditDrawCallback (ims, call_data); case XIM_PREEDIT_CARET: return _Xi18nPreeditCaretCallback (ims, call_data); case XIM_PREEDIT_DONE: return _Xi18nPreeditDoneCallback (ims, call_data); case XIM_STATUS_START: return _Xi18nStatusStartCallback (ims, call_data); case XIM_STATUS_DRAW: return _Xi18nStatusDrawCallback (ims, call_data); case XIM_STATUS_DONE: return _Xi18nStatusDoneCallback (ims, call_data); case XIM_STR_CONVERSION: return _Xi18nStringConversionCallback (ims, call_data); } /*endswitch*/ return False; } /* preeditStart and preeditEnd are used only for Dynamic Event Flow. */ static int xi18n_preeditStart (XIMS ims, XPointer xp) { IMProtocol *call_data = (IMProtocol *)xp; Xi18n i18n_core = ims->protocol; IMPreeditStateStruct *preedit_state = (IMPreeditStateStruct *) &call_data->preedit_state; long mask; int on_key_num = i18n_core->address.on_keys.count_keys; int off_key_num = i18n_core->address.off_keys.count_keys; if (on_key_num == 0 && off_key_num == 0) return False; /*endif*/ if (i18n_core->address.imvalue_mask & I18N_FILTERMASK) mask = i18n_core->address.filterevent_mask; else mask = DEFAULT_FILTER_MASK; /*endif*/ _Xi18nSetEventMask (ims, preedit_state->connect_id, preedit_state->connect_id, preedit_state->icid, mask, ~mask); return True; } static int xi18n_preeditEnd (XIMS ims, XPointer xp) { IMProtocol *call_data = (IMProtocol *)xp; Xi18n i18n_core = ims->protocol; int on_key_num = i18n_core->address.on_keys.count_keys; int off_key_num = i18n_core->address.off_keys.count_keys; IMPreeditStateStruct *preedit_state; preedit_state = (IMPreeditStateStruct *) &call_data->preedit_state; if (on_key_num == 0 && off_key_num == 0) return False; /*endif*/ _Xi18nSetEventMask (ims, preedit_state->connect_id, preedit_state->connect_id, preedit_state->icid, 0, 0); return True; } static int xi18n_syncXlib (XIMS ims, XPointer xp) { IMProtocol *call_data = (IMProtocol *)xp; Xi18n i18n_core = ims->protocol; IMSyncXlibStruct *sync_xlib; extern XimFrameRec sync_fr[]; FrameMgr fm; CARD16 connect_id = call_data->any.connect_id; int total_size; unsigned char *reply; sync_xlib = (IMSyncXlibStruct *) &call_data->sync_xlib; fm = FrameMgrInit (sync_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize(fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); /* input input-method ID */ FrameMgrPutToken (fm, connect_id); /* input input-context ID */ FrameMgrPutToken (fm, sync_xlib->icid); _Xi18nSendMessage (ims, connect_id, XIM_SYNC, 0, reply, total_size); FrameMgrFree (fm); free(reply); return True; } nabi-nabi-1.0.1/IMdkit/i18nPtHdr.c000066400000000000000000001676111430012456200164100ustar00rootroot00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by 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. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef DEBUG extern int verbose; extern void DebugLog(int deflevel, int inplevel, char *fmt, ...); #endif #include "../src/debug.h" #include #include #include #include #ifndef NEED_EVENTS #define NEED_EVENTS #endif #include #undef NEED_EVENTS #include "FrameMgr.h" #include "IMdkit.h" #include "Xi18n.h" #include "XimFunc.h" extern Xi18nClient *_Xi18nFindClient (Xi18n, CARD16); static void DiscardQueue (XIMS ims, CARD16 connect_id) { Xi18n i18n_core = ims->protocol; Xi18nClient *client = (Xi18nClient *) _Xi18nFindClient (i18n_core, connect_id); if (client != NULL) { client->sync = False; while (client->pending != NULL) { XIMPending* pending = client->pending; client->pending = pending->next; XFree(pending->p); XFree(pending); } } } static void DiscardAllQueue(XIMS ims) { Xi18n i18n_core = ims->protocol; Xi18nClient* client = i18n_core->address.clients; while (client != NULL) { if (client->sync) { DiscardQueue(ims, client->connect_id); } client = client->next; } } static void GetProtocolVersion (CARD16 client_major, CARD16 client_minor, CARD16 *server_major, CARD16 *server_minor) { *server_major = client_major; *server_minor = client_minor; } static void ConnectMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec connect_fr[], connect_reply_fr[]; register int total_size; CARD16 server_major_version, server_minor_version; unsigned char *reply = NULL; IMConnectStruct *imconnect = (IMConnectStruct*) &call_data->imconnect; CARD16 connect_id = call_data->any.connect_id; fm = FrameMgrInit (connect_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, imconnect->byte_order); FrameMgrGetToken (fm, imconnect->major_version); FrameMgrGetToken (fm, imconnect->minor_version); FrameMgrFree (fm); GetProtocolVersion (imconnect->major_version, imconnect->minor_version, &server_major_version, &server_minor_version); #ifdef PROTOCOL_RICH if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ #endif /* PROTOCOL_RICH */ fm = FrameMgrInit (connect_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, server_major_version); FrameMgrPutToken (fm, server_minor_version); _Xi18nSendMessage (ims, connect_id, XIM_CONNECT_REPLY, 0, reply, total_size); FrameMgrFree (fm); free (reply); } static void DisConnectMessageProc (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; unsigned char *reply = NULL; CARD16 connect_id = call_data->any.connect_id; #ifdef PROTOCOL_RICH if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ #endif /* PROTOCOL_RICH */ _Xi18nSendMessage (ims, connect_id, XIM_DISCONNECT_REPLY, 0, reply, 0); i18n_core->methods.disconnect (ims, connect_id); } static void OpenMessageProc(XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec open_fr[]; extern XimFrameRec open_reply_fr[]; unsigned char *reply = NULL; int str_size; register int i, total_size; CARD16 connect_id = call_data->any.connect_id; int str_length; char *name; IMOpenStruct *imopen = (IMOpenStruct *) &call_data->imopen; fm = FrameMgrInit (open_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, str_length); FrameMgrSetSize (fm, str_length); FrameMgrGetToken (fm, name); imopen->lang.length = str_length; imopen->lang.name = malloc (str_length + 1); strncpy (imopen->lang.name, name, str_length); imopen->lang.name[str_length] = (char) 0; FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ if ((i18n_core->address.imvalue_mask & I18N_ON_KEYS) || (i18n_core->address.imvalue_mask & I18N_OFF_KEYS)) { _Xi18nSendTriggerKey (ims, connect_id); } /*endif*/ free (imopen->lang.name); fm = FrameMgrInit (open_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); /* set iteration count for list of imattr */ FrameMgrSetIterCount (fm, i18n_core->address.im_attr_num); /* set length of BARRAY item in ximattr_fr */ for (i = 0; i < i18n_core->address.im_attr_num; i++) { str_size = strlen (i18n_core->address.xim_attr[i].name); FrameMgrSetSize (fm, str_size); } /*endfor*/ /* set iteration count for list of icattr */ FrameMgrSetIterCount (fm, i18n_core->address.ic_attr_num); /* set length of BARRAY item in xicattr_fr */ for (i = 0; i < i18n_core->address.ic_attr_num; i++) { str_size = strlen (i18n_core->address.xic_attr[i].name); FrameMgrSetSize (fm, str_size); } /*endfor*/ total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); /* input input-method ID */ FrameMgrPutToken (fm, connect_id); for (i = 0; i < i18n_core->address.im_attr_num; i++) { str_size = FrameMgrGetSize (fm); FrameMgrPutToken (fm, i18n_core->address.xim_attr[i].attribute_id); FrameMgrPutToken (fm, i18n_core->address.xim_attr[i].type); FrameMgrPutToken (fm, str_size); FrameMgrPutToken (fm, i18n_core->address.xim_attr[i].name); } /*endfor*/ for (i = 0; i < i18n_core->address.ic_attr_num; i++) { str_size = FrameMgrGetSize (fm); FrameMgrPutToken (fm, i18n_core->address.xic_attr[i].attribute_id); FrameMgrPutToken (fm, i18n_core->address.xic_attr[i].type); FrameMgrPutToken (fm, str_size); FrameMgrPutToken (fm, i18n_core->address.xic_attr[i].name); } /*endfor*/ _Xi18nSendMessage (ims, connect_id, XIM_OPEN_REPLY, 0, reply, total_size); FrameMgrFree (fm); free (reply); } static void CloseMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec close_fr[]; extern XimFrameRec close_reply_fr[]; unsigned char *reply = NULL; register int total_size; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (close_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); FrameMgrGetToken (fm, input_method_ID); FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ fm = FrameMgrInit (close_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); _Xi18nSendMessage (ims, connect_id, XIM_CLOSE_REPLY, 0, reply, total_size); FrameMgrFree (fm); free (reply); } static XIMExt *MakeExtensionList (Xi18n i18n_core, XIMStr *lib_extension, int number, int *reply_number) { XIMExt *ext_list; XIMExt *im_ext = (XIMExt *) i18n_core->address.extension; int im_ext_len = i18n_core->address.ext_num; int i; int j; *reply_number = 0; if (number == 0) { /* query all extensions */ *reply_number = im_ext_len; } else { for (i = 0; i < im_ext_len; i++) { for (j = 0; j < (int) number; j++) { if (strcmp (lib_extension[j].name, im_ext[i].name) == 0) { (*reply_number)++; break; } /*endif*/ } /*endfor*/ } /*endfor*/ } /*endif*/ if (!(*reply_number)) return NULL; /*endif*/ ext_list = (XIMExt *) malloc (sizeof (XIMExt)*(*reply_number)); if (!ext_list) return NULL; /*endif*/ memset (ext_list, 0, sizeof (XIMExt)*(*reply_number)); if (number == 0) { /* query all extensions */ for (i = 0; i < im_ext_len; i++) { ext_list[i].major_opcode = im_ext[i].major_opcode; ext_list[i].minor_opcode = im_ext[i].minor_opcode; ext_list[i].length = im_ext[i].length; ext_list[i].name = malloc (im_ext[i].length + 1); strcpy (ext_list[i].name, im_ext[i].name); } /*endfor*/ } else { int n = 0; for (i = 0; i < im_ext_len; i++) { for (j = 0; j < (int)number; j++) { if (strcmp (lib_extension[j].name, im_ext[i].name) == 0) { ext_list[n].major_opcode = im_ext[i].major_opcode; ext_list[n].minor_opcode = im_ext[i].minor_opcode; ext_list[n].length = im_ext[i].length; ext_list[n].name = malloc (im_ext[i].length + 1); strcpy (ext_list[n].name, im_ext[i].name); n++; break; } /*endif*/ } /*endfor*/ } /*endfor*/ } /*endif*/ return ext_list; } static void QueryExtensionMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; FmStatus status; extern XimFrameRec query_extension_fr[]; extern XimFrameRec query_extension_reply_fr[]; unsigned char *reply = NULL; int str_size; register int i; register int number; register int total_size; int byte_length; int reply_number = 0; XIMExt *ext_list; IMQueryExtensionStruct *query_ext = (IMQueryExtensionStruct *) &call_data->queryext; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (query_extension_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, byte_length); query_ext->extension = (XIMStr *) malloc (sizeof (XIMStr)*10); memset (query_ext->extension, 0, sizeof (XIMStr)*10); number = 0; while (FrameMgrIsIterLoopEnd (fm, &status) == False) { char *name; int str_length; FrameMgrGetToken (fm, str_length); FrameMgrSetSize (fm, str_length); query_ext->extension[number].length = str_length; FrameMgrGetToken (fm, name); query_ext->extension[number].name = malloc (str_length + 1); strncpy (query_ext->extension[number].name, name, str_length); query_ext->extension[number].name[str_length] = (char) 0; number++; } /*endwhile*/ query_ext->number = number; #ifdef PROTOCOL_RICH if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ #endif /* PROTOCOL_RICH */ FrameMgrFree (fm); ext_list = MakeExtensionList (i18n_core, query_ext->extension, number, &reply_number); for (i = 0; i < number; i++) free (query_ext->extension[i].name); /*endfor*/ free (query_ext->extension); fm = FrameMgrInit (query_extension_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); /* set iteration count for list of extensions */ FrameMgrSetIterCount (fm, reply_number); /* set length of BARRAY item in ext_fr */ for (i = 0; i < reply_number; i++) { str_size = strlen (ext_list[i].name); FrameMgrSetSize (fm, str_size); } /*endfor*/ total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); for (i = 0; i < reply_number; i++) { str_size = FrameMgrGetSize (fm); FrameMgrPutToken (fm, ext_list[i].major_opcode); FrameMgrPutToken (fm, ext_list[i].minor_opcode); FrameMgrPutToken (fm, str_size); FrameMgrPutToken (fm, ext_list[i].name); } /*endfor*/ _Xi18nSendMessage (ims, connect_id, XIM_QUERY_EXTENSION_REPLY, 0, reply, total_size); FrameMgrFree (fm); free (reply); for (i = 0; i < reply_number; i++) free (ext_list[i].name); /*endfor*/ free (ext_list); } static void SyncReplyMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec sync_reply_fr[]; CARD16 connect_id = call_data->any.connect_id; Xi18nClient *client; CARD16 input_method_ID; CARD16 input_context_ID; client = (Xi18nClient *)_Xi18nFindClient (i18n_core, connect_id); fm = FrameMgrInit (sync_reply_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, input_context_ID); FrameMgrFree (fm); client->sync = False; if (ims->sync == True) { ims->sync = False; if (i18n_core->address.improto) { call_data->sync_xlib.major_code = XIM_SYNC_REPLY; call_data->sync_xlib.minor_code = 0; call_data->sync_xlib.connect_id = input_method_ID; call_data->sync_xlib.icid = input_context_ID; i18n_core->address.improto(ims, call_data); } } } static void GetIMValueFromName (Xi18n i18n_core, CARD16 connect_id, char *buf, char *name, int *length) { register int i; if (strcmp (name, XNQueryInputStyle) == 0) { XIMStyles *styles = (XIMStyles *) &i18n_core->address.input_styles; *length = sizeof (CARD16)*2; /* count_styles, unused */ *length += styles->count_styles*sizeof (CARD32); if (buf != NULL) { FrameMgr fm; extern XimFrameRec input_styles_fr[]; unsigned char *data = NULL; int total_size; fm = FrameMgrInit (input_styles_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); /* set iteration count for list of input_style */ FrameMgrSetIterCount (fm, styles->count_styles); total_size = FrameMgrGetTotalSize (fm); data = (unsigned char *) malloc (total_size); if (!data) return; /*endif*/ memset (data, 0, total_size); FrameMgrSetBuffer (fm, data); FrameMgrPutToken (fm, styles->count_styles); for (i = 0; i < (int) styles->count_styles; i++) FrameMgrPutToken (fm, styles->supported_styles[i]); /*endfor*/ memmove (buf, data, total_size); FrameMgrFree (fm); free(data); } /*endif*/ } /*endif*/ else if (strcmp (name, XNQueryIMValuesList) == 0) { FrameMgr fm; extern XimFrameRec values_list_fr[]; unsigned char *data = NULL; unsigned int i; int str_size; int total_size; XIMAttr *im_attr; unsigned int count_values; count_values = i18n_core->address.im_attr_num; im_attr = i18n_core->address.xim_attr; fm = FrameMgrInit (values_list_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); /* set iteration count for ic values list */ FrameMgrSetIterCount (fm, count_values); /* set length of BARRAY item in ic_values_list_fr */ for (i = 0; i < count_values; i++) { str_size = im_attr[i].length; FrameMgrSetSize (fm, str_size); } total_size = FrameMgrGetTotalSize (fm); *length = total_size; if (buf != NULL) { data = (unsigned char *) malloc (total_size); if (data == NULL) return; memset (data, 0, total_size); FrameMgrSetBuffer (fm, data); FrameMgrPutToken (fm, count_values); for (i = 0; i < count_values; i++) { str_size = FrameMgrGetSize (fm); FrameMgrPutToken (fm, str_size); FrameMgrPutToken (fm, im_attr[i].name); } memmove (buf, data, total_size); FrameMgrFree (fm); free(data); } } else if (strcmp (name, XNQueryICValuesList) == 0) { FrameMgr fm; extern XimFrameRec values_list_fr[]; unsigned char *data = NULL; unsigned int i; int str_size; int total_size; XICAttr *ic_attr; unsigned int count_values; count_values = i18n_core->address.ic_attr_num; ic_attr = i18n_core->address.xic_attr; fm = FrameMgrInit (values_list_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); /* set iteration count for ic values list */ FrameMgrSetIterCount (fm, count_values); /* set length of BARRAY item in ic_values_list_fr */ for (i = 0; i < count_values; i++) { str_size = ic_attr[i].length; FrameMgrSetSize (fm, str_size); } total_size = FrameMgrGetTotalSize (fm); *length = total_size; if (buf != NULL) { data = (unsigned char *) malloc (total_size); if (data == NULL) return; memset (data, 0, total_size); FrameMgrSetBuffer (fm, data); FrameMgrPutToken (fm, count_values); for (i = 0; i < count_values; i++) { str_size = FrameMgrGetSize (fm); FrameMgrPutToken (fm, str_size); FrameMgrPutToken (fm, ic_attr[i].name); } memmove (buf, data, total_size); free(data); } FrameMgrFree (fm); } } static XIMAttribute *MakeIMAttributeList (Xi18n i18n_core, CARD16 connect_id, CARD16 *list, int *number, int *length) { XIMAttribute *attrib_list; int list_num; XIMAttr *attr = i18n_core->address.xim_attr; int list_len = i18n_core->address.im_attr_num; register int i; register int j; int value_length; int number_ret = 0; *length = 0; list_num = 0; for (i = 0; i < *number; i++) { for (j = 0; j < list_len; j++) { if (attr[j].attribute_id == list[i]) { list_num++; break; } /*endif*/ } /*endfor*/ } /*endfor*/ attrib_list = (XIMAttribute *) malloc (sizeof (XIMAttribute)*list_num); if (!attrib_list) return NULL; /*endif*/ memset (attrib_list, 0, sizeof (XIMAttribute)*list_num); number_ret = list_num; list_num = 0; for (i = 0; i < *number; i++) { for (j = 0; j < list_len; j++) { if (attr[j].attribute_id == list[i]) { attrib_list[list_num].attribute_id = attr[j].attribute_id; attrib_list[list_num].name_length = attr[j].length; attrib_list[list_num].name = attr[j].name; attrib_list[list_num].type = attr[j].type; GetIMValueFromName (i18n_core, connect_id, NULL, attr[j].name, &value_length); attrib_list[list_num].value_length = value_length; attrib_list[list_num].value = (void *) malloc (value_length); memset(attrib_list[list_num].value, 0, value_length); GetIMValueFromName (i18n_core, connect_id, attrib_list[list_num].value, attr[j].name, &value_length); *length += sizeof (CARD16)*2; *length += value_length; *length += IMPAD (value_length); list_num++; break; } /*endif*/ } /*endfor*/ } /*endfor*/ *number = number_ret; return attrib_list; } static void GetIMValuesMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; FmStatus status; extern XimFrameRec get_im_values_fr[]; extern XimFrameRec get_im_values_reply_fr[]; CARD16 byte_length; int list_len, total_size; unsigned char *reply = NULL; int iter_count; register int i; register int j; int number; CARD16 *im_attrID_list; char **name_list; CARD16 name_number; XIMAttribute *im_attribute_list; IMGetIMValuesStruct *getim = (IMGetIMValuesStruct *)&call_data->getim; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; /* create FrameMgr */ fm = FrameMgrInit (get_im_values_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, byte_length); im_attrID_list = (CARD16 *) malloc (sizeof (CARD16)*20); memset (im_attrID_list, 0, sizeof (CARD16)*20); name_list = (char **)malloc(sizeof(char *) * 20); memset(name_list, 0, sizeof(char *) * 20); number = 0; while (FrameMgrIsIterLoopEnd (fm, &status) == False) { FrameMgrGetToken (fm, im_attrID_list[number]); number++; } FrameMgrFree (fm); name_number = 0; for (i = 0; i < number; i++) { for (j = 0; j < i18n_core->address.im_attr_num; j++) { if (i18n_core->address.xim_attr[j].attribute_id == im_attrID_list[i]) { name_list[name_number++] = i18n_core->address.xim_attr[j].name; break; } } } getim->number = name_number; getim->im_attr_list = name_list; #ifdef PROTOCOL_RICH if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; } #endif /* PROTOCOL_RICH */ free (name_list); im_attribute_list = MakeIMAttributeList (i18n_core, connect_id, im_attrID_list, &number, &list_len); if (im_attrID_list) free (im_attrID_list); /*endif*/ fm = FrameMgrInit (get_im_values_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); iter_count = number; /* set iteration count for list of im_attribute */ FrameMgrSetIterCount (fm, iter_count); /* set length of BARRAY item in ximattribute_fr */ for (i = 0; i < iter_count; i++) FrameMgrSetSize (fm, im_attribute_list[i].value_length); /*endfor*/ total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); for (i = 0; i < iter_count; i++) { FrameMgrPutToken (fm, im_attribute_list[i].attribute_id); FrameMgrPutToken (fm, im_attribute_list[i].value_length); FrameMgrPutToken (fm, im_attribute_list[i].value); } /*endfor*/ _Xi18nSendMessage (ims, connect_id, XIM_GET_IM_VALUES_REPLY, 0, reply, total_size); FrameMgrFree (fm); free (reply); for (i = 0; i < iter_count; i++) free (im_attribute_list[i].value); free (im_attribute_list); } static void CreateICMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { _Xi18nChangeIC (ims, call_data, p, True); } static void SetICValuesMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { _Xi18nChangeIC (ims, call_data, p, False); } static void GetICValuesMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { _Xi18nGetIC (ims, call_data, p); } static void SetICFocusMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec set_ic_focus_fr[]; IMChangeFocusStruct *setfocus; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; /* some buggy xim clients do not send XIM_SYNC_REPLY for synchronous * events. In such case, xim server is waiting for XIM_SYNC_REPLY * forever. So the xim server is blocked to waiting sync reply. * It prevents further input. * Usually it happens when a client calls XSetICFocus() with another ic * before passing an event to XFilterEvent(), where the event is need * by the old focused ic to sync its state. * To avoid such problem, remove the whole clients queue and set them * as asynchronous. * * See: * http://kldp.net/tracker/index.php?func=detail&aid=300802&group_id=275&atid=100275 * http://bugs.freedesktop.org/show_bug.cgi?id=7869 */ nabi_log(6, "set focus: discard all client queue: %d\n", connect_id); DiscardAllQueue(ims); setfocus = (IMChangeFocusStruct *) &call_data->changefocus; fm = FrameMgrInit (set_ic_focus_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, setfocus->icid); FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ } static void UnsetICFocusMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec unset_ic_focus_fr[]; IMChangeFocusStruct *unsetfocus; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id); /* some buggy clients unset focus ic before the ic answer the sync reply, * so the xim server may be blocked to waiting sync reply. To avoid * this problem, remove the client queue and set it asynchronous * * See: SetICFocusMessageProc */ if (client != NULL && client->sync) { nabi_log(6, "unset focus: discard client queue: %d\n", connect_id); DiscardQueue(ims, client->connect_id); } unsetfocus = (IMChangeFocusStruct *) &call_data->changefocus; fm = FrameMgrInit (unset_ic_focus_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, unsetfocus->icid); FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ } static void DestroyICMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec destroy_ic_fr[]; extern XimFrameRec destroy_ic_reply_fr[]; register int total_size; unsigned char *reply = NULL; IMDestroyICStruct *destroy = (IMDestroyICStruct *) &call_data->destroyic; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (destroy_ic_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, destroy->icid); FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ fm = FrameMgrInit (destroy_ic_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); FrameMgrPutToken (fm, destroy->icid); _Xi18nSendMessage (ims, connect_id, XIM_DESTROY_IC_REPLY, 0, reply, total_size); free (reply); FrameMgrFree (fm); } static void ResetICMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec reset_ic_fr[]; extern XimFrameRec reset_ic_reply_fr[]; register int total_size; unsigned char *reply = NULL; IMResetICStruct *resetic = (IMResetICStruct *) &call_data->resetic; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (reset_ic_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, resetic->icid); FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ /* create FrameMgr */ fm = FrameMgrInit (reset_ic_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); /* set length of STRING8 */ FrameMgrSetSize (fm, resetic->length); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); FrameMgrPutToken (fm, resetic->icid); FrameMgrPutToken(fm, resetic->length); FrameMgrPutToken (fm, resetic->commit_string); _Xi18nSendMessage (ims, connect_id, XIM_RESET_IC_REPLY, 0, reply, total_size); FrameMgrFree (fm); if (resetic->commit_string) XFree(resetic->commit_string); free (reply); } /* For byte swapping */ #define Swap16(n) \ (((n) << 8 & 0xFF00) | \ ((n) >> 8 & 0xFF) \ ) #define Swap32(n) \ (((n) << 24 & 0xFF000000) | \ ((n) << 8 & 0xFF0000) | \ ((n) >> 8 & 0xFF00) | \ ((n) >> 24 & 0xFF) \ ) #define Swap64(n) \ (((n) << 56 & 0xFF00000000000000) | \ ((n) << 40 & 0xFF000000000000) | \ ((n) << 24 & 0xFF0000000000) | \ ((n) << 8 & 0xFF00000000) | \ ((n) >> 8 & 0xFF000000) | \ ((n) >> 24 & 0xFF0000) | \ ((n) >> 40 & 0xFF00) | \ ((n) >> 56 & 0xFF) \ ) static int WireEventToEvent (Xi18n i18n_core, xEvent *event, CARD16 serial, XEvent *ev, Bool need_swap) { ev->xany.serial = event->u.u.sequenceNumber & ((unsigned long) 0xFFFF); ev->xany.serial |= serial << 16; ev->xany.send_event = False; ev->xany.display = i18n_core->address.dpy; switch (ev->type = event->u.u.type & 0x7F) { case KeyPress: case KeyRelease: if (need_swap) { ((XKeyEvent *) ev)->keycode = event->u.u.detail; ((XKeyEvent *) ev)->window = Swap32(event->u.keyButtonPointer.event); ((XKeyEvent *) ev)->state = Swap16(event->u.keyButtonPointer.state); ((XKeyEvent *) ev)->time = Swap32(event->u.keyButtonPointer.time); ((XKeyEvent *) ev)->root = Swap32(event->u.keyButtonPointer.root); ((XKeyEvent *) ev)->x = Swap16(event->u.keyButtonPointer.eventX); ((XKeyEvent *) ev)->y = Swap16(event->u.keyButtonPointer.eventY); ((XKeyEvent *) ev)->x_root = 0; ((XKeyEvent *) ev)->y_root = 0; } else { ((XKeyEvent *) ev)->keycode = event->u.u.detail; ((XKeyEvent *) ev)->window = event->u.keyButtonPointer.event; ((XKeyEvent *) ev)->state = event->u.keyButtonPointer.state; ((XKeyEvent *) ev)->time = event->u.keyButtonPointer.time; ((XKeyEvent *) ev)->root = event->u.keyButtonPointer.root; ((XKeyEvent *) ev)->x = event->u.keyButtonPointer.eventX; ((XKeyEvent *) ev)->y = event->u.keyButtonPointer.eventY; ((XKeyEvent *) ev)->x_root = 0; ((XKeyEvent *) ev)->y_root = 0; } return True; } return False; } static void ForwardEventMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec forward_event_fr[]; xEvent wire_event; IMForwardEventStruct *forward = (IMForwardEventStruct*) &call_data->forwardevent; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; Bool need_swap; need_swap = _Xi18nNeedSwap (i18n_core, connect_id); fm = FrameMgrInit (forward_event_fr, (char *) p, need_swap); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, forward->icid); FrameMgrGetToken (fm, forward->sync_bit); FrameMgrGetToken (fm, forward->serial_number); p += sizeof (CARD16)*4; memmove (&wire_event, p, sizeof (xEvent)); FrameMgrFree (fm); if (WireEventToEvent (i18n_core, &wire_event, forward->serial_number, &forward->event, need_swap) == True) { if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ } /*endif*/ } static void ExtForwardKeyEventMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec ext_forward_keyevent_fr[]; CARD8 type, keycode; CARD16 state; CARD32 ev_time, window; IMForwardEventStruct *forward = (IMForwardEventStruct *) &call_data->forwardevent; XEvent *ev = (XEvent *) &forward->event; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (ext_forward_keyevent_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, forward->icid); FrameMgrGetToken (fm, forward->sync_bit); FrameMgrGetToken (fm, forward->serial_number); FrameMgrGetToken (fm, type); FrameMgrGetToken (fm, keycode); FrameMgrGetToken (fm, state); FrameMgrGetToken (fm, ev_time); FrameMgrGetToken (fm, window); FrameMgrFree (fm); if (type != KeyPress) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ /* make a faked keypress event */ ev->type = (int)type; ev->xany.send_event = True; ev->xany.display = i18n_core->address.dpy; ev->xany.serial = (unsigned long) forward->serial_number; ((XKeyEvent *) ev)->keycode = (unsigned int) keycode; ((XKeyEvent *) ev)->state = (unsigned int) state; ((XKeyEvent *) ev)->time = (Time) ev_time; ((XKeyEvent *) ev)->window = (Window) window; ((XKeyEvent *) ev)->root = DefaultRootWindow (ev->xany.display); ((XKeyEvent *) ev)->x = 0; ((XKeyEvent *) ev)->y = 0; ((XKeyEvent *) ev)->x_root = 0; ((XKeyEvent *) ev)->y_root = 0; if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ } static void ExtMoveMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec ext_move_fr[]; IMMoveStruct *extmove = (IMMoveStruct*) & call_data->extmove; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (ext_move_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, extmove->icid); FrameMgrGetToken (fm, extmove->x); FrameMgrGetToken (fm, extmove->y); FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ } static void ExtensionMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { switch (call_data->any.minor_code) { case XIM_EXT_FORWARD_KEYEVENT: ExtForwardKeyEventMessageProc (ims, call_data, p); break; case XIM_EXT_MOVE: ExtMoveMessageProc (ims, call_data, p); break; } /*endswitch*/ } static void TriggerNotifyMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec trigger_notify_fr[], trigger_notify_reply_fr[]; register int total_size; unsigned char *reply = NULL; IMTriggerNotifyStruct *trigger = (IMTriggerNotifyStruct *) &call_data->triggernotify; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; CARD32 flag; fm = FrameMgrInit (trigger_notify_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, trigger->icid); FrameMgrGetToken (fm, trigger->flag); FrameMgrGetToken (fm, trigger->key_index); FrameMgrGetToken (fm, trigger->event_mask); /* In order to support Front End Method, this event_mask must be saved per clients so that it should be restored by an XIM_EXT_SET_EVENT_MASK call when preediting mode is reset to off. */ flag = trigger->flag; FrameMgrFree (fm); fm = FrameMgrInit (trigger_notify_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); FrameMgrPutToken (fm, trigger->icid); /* NOTE: XIM_TRIGGER_NOTIFY_REPLY should be sent before XIM_SET_EVENT_MASK in case of XIM_TRIGGER_NOTIFY(flag == ON), while it should be sent after XIM_SET_EVENT_MASK in case of XIM_TRIGGER_NOTIFY(flag == OFF). */ if (flag == 0) { /* on key */ _Xi18nSendMessage (ims, connect_id, XIM_TRIGGER_NOTIFY_REPLY, 0, reply, total_size); IMPreeditStart (ims, (XPointer)call_data); } /*endif*/ if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ if (flag == 1) { /* off key */ IMPreeditEnd (ims, (XPointer) call_data); _Xi18nSendMessage (ims, connect_id, XIM_TRIGGER_NOTIFY_REPLY, 0, reply, total_size); } /*endif*/ FrameMgrFree (fm); free (reply); } static INT16 ChooseEncoding (Xi18n i18n_core, IMEncodingNegotiationStruct *enc_nego) { Xi18nAddressRec *address = (Xi18nAddressRec *) & i18n_core->address; XIMEncodings *p; int i, j; int enc_index=0; p = (XIMEncodings *) &address->encoding_list; for (i = 0; i < (int) p->count_encodings; i++) { for (j = 0; j < (int) enc_nego->encoding_number; j++) { if (strcmp (p->supported_encodings[i], enc_nego->encoding[j].name) == 0) { enc_index = j; break; } /*endif*/ } /*endfor*/ } /*endfor*/ return (INT16) enc_index; #if 0 return (INT16) XIM_Default_Encoding_IDX; #endif } static void EncodingNegotiatonMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; FmStatus status; CARD16 byte_length; extern XimFrameRec encoding_negotiation_fr[]; extern XimFrameRec encoding_negotiation_reply_fr[]; register int i, total_size; unsigned char *reply = NULL; IMEncodingNegotiationStruct *enc_nego = (IMEncodingNegotiationStruct *) &call_data->encodingnego; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (encoding_negotiation_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); FrameMgrGetToken (fm, input_method_ID); /* get ENCODING STR field */ FrameMgrGetToken (fm, byte_length); if (byte_length > 0) { enc_nego->encoding = (XIMStr *) malloc (sizeof (XIMStr)*10); memset (enc_nego->encoding, 0, sizeof (XIMStr)*10); i = 0; while (FrameMgrIsIterLoopEnd (fm, &status) == False) { char *name; int str_length; FrameMgrGetToken (fm, str_length); FrameMgrSetSize (fm, str_length); enc_nego->encoding[i].length = str_length; FrameMgrGetToken (fm, name); enc_nego->encoding[i].name = malloc (str_length + 1); strncpy (enc_nego->encoding[i].name, name, str_length); enc_nego->encoding[i].name[str_length] = '\0'; i++; } /*endwhile*/ enc_nego->encoding_number = i; } /*endif*/ /* get ENCODING INFO field */ FrameMgrGetToken (fm, byte_length); if (byte_length > 0) { enc_nego->encodinginfo = (XIMStr *) malloc (sizeof (XIMStr)*10); memset (enc_nego->encoding, 0, sizeof (XIMStr)*10); i = 0; while (FrameMgrIsIterLoopEnd (fm, &status) == False) { char *name; int str_length; FrameMgrGetToken (fm, str_length); FrameMgrSetSize (fm, str_length); enc_nego->encodinginfo[i].length = str_length; FrameMgrGetToken (fm, name); enc_nego->encodinginfo[i].name = malloc (str_length + 1); strncpy (enc_nego->encodinginfo[i].name, name, str_length); enc_nego->encodinginfo[i].name[str_length] = '\0'; i++; } /*endwhile*/ enc_nego->encoding_info_number = i; } /*endif*/ enc_nego->enc_index = ChooseEncoding (i18n_core, enc_nego); enc_nego->category = 0; #ifdef PROTOCOL_RICH if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ #endif /* PROTOCOL_RICH */ FrameMgrFree (fm); fm = FrameMgrInit (encoding_negotiation_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); FrameMgrPutToken (fm, enc_nego->category); FrameMgrPutToken (fm, enc_nego->enc_index); _Xi18nSendMessage (ims, connect_id, XIM_ENCODING_NEGOTIATION_REPLY, 0, reply, total_size); free (reply); /* free data for encoding list */ if (enc_nego->encoding) { for (i = 0; i < (int) enc_nego->encoding_number; i++) free (enc_nego->encoding[i].name); /*endfor*/ free (enc_nego->encoding); } /*endif*/ if (enc_nego->encodinginfo) { for (i = 0; i < (int) enc_nego->encoding_info_number; i++) free (enc_nego->encodinginfo[i].name); /*endfor*/ free (enc_nego->encodinginfo); } /*endif*/ FrameMgrFree (fm); } void PreeditStartReplyMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec preedit_start_reply_fr[]; IMPreeditCBStruct *preedit_CB = (IMPreeditCBStruct *) &call_data->preedit_callback; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (preedit_start_reply_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, preedit_CB->icid); FrameMgrGetToken (fm, preedit_CB->todo.return_value); FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ } void PreeditCaretReplyMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec preedit_caret_reply_fr[]; IMPreeditCBStruct *preedit_CB = (IMPreeditCBStruct *) &call_data->preedit_callback; XIMPreeditCaretCallbackStruct *caret = (XIMPreeditCaretCallbackStruct *) & preedit_CB->todo.caret; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (preedit_caret_reply_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, preedit_CB->icid); FrameMgrGetToken (fm, caret->position); FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ } static char* ctstombs(Display* display, char* compound_text, size_t len) { char **list = NULL; char *ret = NULL; int count = 0; XTextProperty text_prop; text_prop.value = (unsigned char*)compound_text; text_prop.encoding = XInternAtom(display, "COMPOUND_TEXT", False); text_prop.format = 8; text_prop.nitems = len; XmbTextPropertyToTextList(display, &text_prop, &list, &count); if (list != NULL) ret = strdup(list[0]); XFreeStringList(list); return ret; } void StrConvReplyMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec str_conversion_reply_fr[]; IMStrConvCBStruct *strconv_CB = (IMStrConvCBStruct *) &call_data->strconv_callback; XIMStringConversionText text = { 0, NULL, False, { NULL } }; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; CARD16 length; int i; fm = FrameMgrInit (str_conversion_reply_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, strconv_CB->icid); FrameMgrGetToken (fm, length); if (length > 0) { int feedback_length; char *str; XIMStringConversionFeedback feedback; FrameMgrSetSize (fm, length); FrameMgrGetToken (fm, str); text.encoding_is_wchar = False; text.string.mbs = ctstombs(i18n_core->address.dpy, str, length); text.length = strlen(text.string.mbs); FrameMgrGetToken (fm, feedback_length); feedback_length /= sizeof(CARD32); /* sizeof(XIMStringConversionFeedback) may not 4 */ text.feedback = malloc(feedback_length * sizeof(XIMStringConversionFeedback)); if (text.feedback != NULL) { for (i = 0; i < feedback_length; i++) { FrameMgrGetToken (fm, feedback); text.feedback[i] = feedback; } } } FrameMgrFree (fm); strconv_CB->strconv.text = &text; if (i18n_core->address.improto) { i18n_core->address.improto(ims, call_data); } if (length > 0) { free(text.string.mbs); free(text.feedback); } return; } static void AddQueue (Xi18nClient *client, unsigned char *p) { XIMPending *new; XIMPending *last; if ((new = (XIMPending *) malloc (sizeof (XIMPending))) == NULL) return; /*endif*/ new->p = p; new->next = (XIMPending *) NULL; if (!client->pending) { client->pending = new; } else { for (last = client->pending; last->next; last = last->next) ; /*endfor*/ last->next = new; } /*endif*/ return; } static void ProcessQueue (XIMS ims, CARD16 connect_id) { Xi18n i18n_core = ims->protocol; Xi18nClient *client = (Xi18nClient *) _Xi18nFindClient (i18n_core, connect_id); while (client->sync == False && client->pending) { XimProtoHdr *hdr = (XimProtoHdr *) client->pending->p; unsigned char *p1 = (unsigned char *) (hdr + 1); IMProtocol call_data; call_data.major_code = hdr->major_opcode; call_data.any.minor_code = hdr->minor_opcode; call_data.any.connect_id = connect_id; switch (hdr->major_opcode) { case XIM_FORWARD_EVENT: ForwardEventMessageProc(ims, &call_data, p1); break; } /*endswitch*/ XFree (hdr); { XIMPending *old = client->pending; client->pending = old->next; XFree (old); } } /*endwhile*/ return; } void _Xi18nMessageHandler (XIMS ims, CARD16 connect_id, unsigned char *p, Bool *delete) { XimProtoHdr *hdr = (XimProtoHdr *)p; unsigned char *p1 = (unsigned char *)(hdr + 1); IMProtocol call_data; Xi18n i18n_core = ims->protocol; Xi18nClient *client; client = (Xi18nClient *) _Xi18nFindClient (i18n_core, connect_id); if (hdr == (XimProtoHdr *) NULL) return; /*endif*/ memset (&call_data, 0, sizeof(IMProtocol)); call_data.major_code = hdr->major_opcode; call_data.any.minor_code = hdr->minor_opcode; call_data.any.connect_id = connect_id; switch (call_data.major_code) { case XIM_CONNECT: nabi_log(5, "XIM_CONNECT: cid: %d\n", connect_id); ConnectMessageProc (ims, &call_data, p1); break; case XIM_DISCONNECT: nabi_log(5, "XIM_DISCONNECT: cid: %d\n", connect_id); DisConnectMessageProc (ims, &call_data); break; case XIM_OPEN: nabi_log(5, "XIM_OPEN: cid: %d\n", connect_id); OpenMessageProc (ims, &call_data, p1); break; case XIM_CLOSE: nabi_log(5, "XIM_CLOSE: cid: %d\n", connect_id); CloseMessageProc (ims, &call_data, p1); break; case XIM_QUERY_EXTENSION: nabi_log(5, "XIM_QUERY_EXTENSION: cid: %d\n", connect_id); QueryExtensionMessageProc (ims, &call_data, p1); break; case XIM_GET_IM_VALUES: nabi_log(5, "XIM_GET_IM_VALUES: cid: %d\n", connect_id); GetIMValuesMessageProc (ims, &call_data, p1); break; case XIM_CREATE_IC: nabi_log(5, "XIM_CREATE_IC: cid: %d\n", connect_id); CreateICMessageProc (ims, &call_data, p1); break; case XIM_SET_IC_VALUES: nabi_log(5, "XIM_SET_IC_VALUES: cid: %d\n", connect_id); SetICValuesMessageProc (ims, &call_data, p1); break; case XIM_GET_IC_VALUES: nabi_log(5, "XIM_GET_IC_VALUES: cid: %d\n", connect_id); GetICValuesMessageProc (ims, &call_data, p1); break; case XIM_SET_IC_FOCUS: nabi_log(5, "XIM_SET_IC_FOCUS: cid: %d\n", connect_id); SetICFocusMessageProc (ims, &call_data, p1); break; case XIM_UNSET_IC_FOCUS: nabi_log(5, "XIM_UNSET_IC_FOCUS: cid: %d\n", connect_id); UnsetICFocusMessageProc (ims, &call_data, p1); break; case XIM_DESTROY_IC: nabi_log(5, "XIM_DESTROY_IC: cid: %d\n", connect_id); DestroyICMessageProc (ims, &call_data, p1); break; case XIM_RESET_IC: nabi_log(5, "XIM_RESET_IC: cid: %d\n", connect_id); ResetICMessageProc (ims, &call_data, p1); break; case XIM_FORWARD_EVENT: nabi_log(5, "XIM_FORWARD_EVENT: cid: %d\n", connect_id); if (client->sync == True) { nabi_log(6, "XIM_FORWARD_EVENT(cid=%x: sync, add to queue\n", connect_id); AddQueue (client, p); *delete = False; } else { nabi_log(6, "XIM_FORWARD_EVENT(cid=%x): async, process event\n", connect_id); ForwardEventMessageProc (ims, &call_data, p1); } break; case XIM_EXTENSION: nabi_log(5, "XIM_EXTENSION: cid: %d\n", connect_id); ExtensionMessageProc (ims, &call_data, p1); break; case XIM_SYNC: nabi_log(5, "XIM_SYNC: cid: %d\n", connect_id); break; case XIM_SYNC_REPLY: nabi_log(5, "XIM_SYNC_REPLY: cid: %d, process queue\n", connect_id); SyncReplyMessageProc (ims, &call_data, p1); ProcessQueue (ims, connect_id); break; case XIM_TRIGGER_NOTIFY: nabi_log(5, "XIM_TRIGGER_NOTIFY: cid: %d\n", connect_id); TriggerNotifyMessageProc (ims, &call_data, p1); break; case XIM_ENCODING_NEGOTIATION: nabi_log(5, "XIM_ENCODING_NEGOTIATION: cid: %d\n", connect_id); EncodingNegotiatonMessageProc (ims, &call_data, p1); break; case XIM_PREEDIT_START_REPLY: nabi_log(5, "XIM_PREEDIT_START_REPLY: cid: %d\n", connect_id); PreeditStartReplyMessageProc (ims, &call_data, p1); break; case XIM_PREEDIT_CARET_REPLY: nabi_log(5, "XIM_PREEDIT_CARET_REPLY: cid: %d\n", connect_id); PreeditCaretReplyMessageProc (ims, &call_data, p1); break; case XIM_STR_CONVERSION_REPLY: nabi_log(5, "XIM_STR_CONVERSION_REPLY: cid: %d\n", connect_id); StrConvReplyMessageProc (ims, &call_data, p1); break; case XIM_ERROR: nabi_log(3, "XIM_ERROR: cid: %d\n", connect_id); break; default: nabi_log(3, "unhandled XIM message: %d:%d\n", hdr->major_opcode, hdr->minor_opcode); break; } /*endswitch*/ } nabi-nabi-1.0.1/IMdkit/i18nUtil.c000066400000000000000000000216761430012456200163040ustar00rootroot00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by 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. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include "IMdkit.h" #include "Xi18n.h" #include "FrameMgr.h" #include "XimFunc.h" Xi18nClient *_Xi18nFindClient (Xi18n, CARD16); int _Xi18nNeedSwap (Xi18n i18n_core, CARD16 connect_id) { CARD8 im_byteOrder = i18n_core->address.im_byteOrder; Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id); return (client->byte_order != im_byteOrder); } Xi18nClient *_Xi18nNewClient(Xi18n i18n_core) { static CARD16 connect_id = 0; int new_connect_id; Xi18nClient *client; if (i18n_core->address.free_clients) { client = i18n_core->address.free_clients; i18n_core->address.free_clients = client->next; new_connect_id = client->connect_id; } else { client = (Xi18nClient *) malloc (sizeof (Xi18nClient)); new_connect_id = ++connect_id; } /*endif*/ memset (client, 0, sizeof (Xi18nClient)); client->connect_id = new_connect_id; client->pending = (XIMPending *) NULL; client->sync = False; client->byte_order = '?'; /* initial value */ memset (&client->pending, 0, sizeof (XIMPending *)); client->next = i18n_core->address.clients; i18n_core->address.clients = client; return (Xi18nClient *) client; } Xi18nClient *_Xi18nFindClient (Xi18n i18n_core, CARD16 connect_id) { Xi18nClient *client = i18n_core->address.clients; while (client) { if (client->connect_id == connect_id) return client; /*endif*/ client = client->next; } /*endwhile*/ return NULL; } void _Xi18nDeleteClient (Xi18n i18n_core, CARD16 connect_id) { Xi18nClient *target = _Xi18nFindClient (i18n_core, connect_id); Xi18nClient *ccp; Xi18nClient *ccp0; for (ccp = i18n_core->address.clients, ccp0 = NULL; ccp != NULL; ccp0 = ccp, ccp = ccp->next) { if (ccp == target) { if (ccp0 == NULL) i18n_core->address.clients = ccp->next; else ccp0->next = ccp->next; /*endif*/ /* put it back to free list */ target->next = i18n_core->address.free_clients; i18n_core->address.free_clients = target; return; } /*endif*/ } /*endfor*/ } void _Xi18nDeleteAllClients (Xi18n i18n_core) { Xi18nClient *client = i18n_core->address.clients; while (client != NULL) { Xi18nClient* tmp = client; client = client->next; free (tmp); } i18n_core->address.clients = NULL; } void _Xi18nDeleteFreeClients (Xi18n i18n_core) { Xi18nClient *client = i18n_core->address.free_clients; while (client != NULL) { Xi18nClient* tmp = client; client = client->next; free (tmp); } i18n_core->address.free_clients = NULL; } void _Xi18nSendMessage (XIMS ims, CARD16 connect_id, CARD8 major_opcode, CARD8 minor_opcode, unsigned char *data, long length) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec packet_header_fr[]; unsigned char *reply_hdr = NULL; int header_size; unsigned char *reply = NULL; unsigned char *replyp; int reply_length; long p_len = length/4; fm = FrameMgrInit (packet_header_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); header_size = FrameMgrGetTotalSize (fm); reply_hdr = (unsigned char *) malloc (header_size); if (reply_hdr == NULL) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ FrameMgrSetBuffer (fm, reply_hdr); /* put data */ FrameMgrPutToken (fm, major_opcode); FrameMgrPutToken (fm, minor_opcode); FrameMgrPutToken (fm, p_len); reply_length = header_size + length; reply = (unsigned char *) malloc (reply_length); replyp = reply; memmove (reply, reply_hdr, header_size); replyp += header_size; memmove (replyp, data, length); i18n_core->methods.send (ims, connect_id, reply, reply_length); free (reply); free (reply_hdr); FrameMgrFree (fm); } void _Xi18nSendTriggerKey (XIMS ims, CARD16 connect_id) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec register_triggerkeys_fr[]; XIMTriggerKey *on_keys = i18n_core->address.on_keys.keylist; XIMTriggerKey *off_keys = i18n_core->address.off_keys.keylist; int on_key_num = i18n_core->address.on_keys.count_keys; int off_key_num = i18n_core->address.off_keys.count_keys; unsigned char *reply = NULL; register int i, total_size; CARD16 im_id; if (on_key_num == 0 && off_key_num == 0) return; /*endif*/ fm = FrameMgrInit (register_triggerkeys_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); /* set iteration count for on-keys list */ FrameMgrSetIterCount (fm, on_key_num); /* set iteration count for off-keys list */ FrameMgrSetIterCount (fm, off_key_num); /* get total_size */ total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) return; /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); /* Right now XIM_OPEN_REPLY hasn't been sent to this new client, so the input-method-id is still invalid, and should be set to zero... Reter to $(XC)/lib/X11/imDefLkup.c:_XimRegisterTriggerKeysCallback */ im_id = 0; FrameMgrPutToken (fm, im_id); /* input-method-id */ for (i = 0; i < on_key_num; i++) { FrameMgrPutToken (fm, on_keys[i].keysym); FrameMgrPutToken (fm, on_keys[i].modifier); FrameMgrPutToken (fm, on_keys[i].modifier_mask); } /*endfor*/ for (i = 0; i < off_key_num; i++) { FrameMgrPutToken (fm, off_keys[i].keysym); FrameMgrPutToken (fm, off_keys[i].modifier); FrameMgrPutToken (fm, off_keys[i].modifier_mask); } /*endfor*/ _Xi18nSendMessage (ims, connect_id, XIM_REGISTER_TRIGGERKEYS, 0, reply, total_size); FrameMgrFree (fm); free (reply); } void _Xi18nSetEventMask (XIMS ims, CARD16 connect_id, CARD16 im_id, CARD16 ic_id, CARD32 forward_mask, CARD32 sync_mask) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec set_event_mask_fr[]; unsigned char *reply = NULL; register int total_size; fm = FrameMgrInit (set_event_mask_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) return; /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, im_id); /* input-method-id */ FrameMgrPutToken (fm, ic_id); /* input-context-id */ FrameMgrPutToken (fm, forward_mask); FrameMgrPutToken (fm, sync_mask); _Xi18nSendMessage (ims, connect_id, XIM_SET_EVENT_MASK, 0, reply, total_size); FrameMgrFree (fm); free (reply); } nabi-nabi-1.0.1/IMdkit/i18nX.c000066400000000000000000000411251430012456200155650ustar00rootroot00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by 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. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include #include "FrameMgr.h" #include "IMdkit.h" #include "Xi18n.h" #include "Xi18nX.h" #include "XimFunc.h" extern Xi18nClient *_Xi18nFindClient(Xi18n, CARD16); extern Xi18nClient *_Xi18nNewClient(Xi18n); extern void _Xi18nDeleteClient(Xi18n, CARD16); extern void _Xi18nMessageHandler (XIMS, CARD16, unsigned char *, Bool *); static Bool WaitXConnectMessage(Display*, Window, XEvent*, XPointer); static Bool WaitXIMProtocol(Display*, Window, XEvent*, XPointer); static XClient *NewXClient (Xi18n i18n_core, Window new_client) { Display *dpy = i18n_core->address.dpy; Xi18nClient *client = _Xi18nNewClient (i18n_core); XClient *x_client; x_client = (XClient *) malloc (sizeof (XClient)); x_client->client_win = new_client; x_client->accept_win = XCreateSimpleWindow (dpy, DefaultRootWindow(dpy), 0, 0, 1, 1, 1, 0, 0); client->trans_rec = x_client; return ((XClient *) x_client); } static unsigned char *ReadXIMMessage (XIMS ims, XClientMessageEvent *ev, int *connect_id) { Xi18n i18n_core = ims->protocol; Xi18nClient *client = i18n_core->address.clients; XClient *x_client = NULL; FrameMgr fm; extern XimFrameRec packet_header_fr[]; unsigned char *p = NULL; unsigned char *p1; while (client != NULL) { x_client = (XClient *) client->trans_rec; if (x_client->accept_win == ev->window) { *connect_id = client->connect_id; break; } client = client->next; } if (ev->format == 8) { /* ClientMessage only */ XimProtoHdr *hdr = (XimProtoHdr *) ev->data.b; unsigned char *rec = (unsigned char *) (hdr + 1); register int total_size; CARD8 major_opcode; CARD8 minor_opcode; CARD16 length; extern int _Xi18nNeedSwap (Xi18n, CARD16); if (client->byte_order == '?') { if (hdr->major_opcode != XIM_CONNECT) return (unsigned char *) NULL; /* can do nothing */ client->byte_order = (CARD8) rec[0]; } fm = FrameMgrInit (packet_header_fr, (char *) hdr, _Xi18nNeedSwap (i18n_core, *connect_id)); total_size = FrameMgrGetTotalSize (fm); /* get data */ FrameMgrGetToken (fm, major_opcode); FrameMgrGetToken (fm, minor_opcode); FrameMgrGetToken (fm, length); FrameMgrFree (fm); if ((p = (unsigned char *) malloc (total_size + length * 4)) == NULL) return (unsigned char *) NULL; p1 = p; memmove (p1, &major_opcode, sizeof (CARD8)); p1 += sizeof (CARD8); memmove (p1, &minor_opcode, sizeof (CARD8)); p1 += sizeof (CARD8); memmove (p1, &length, sizeof (CARD16)); p1 += sizeof (CARD16); memmove (p1, rec, length * 4); } else if (ev->format == 32) { /* ClientMessage and WindowProperty */ unsigned long length = (unsigned long) ev->data.l[0]; Atom atom = (Atom) ev->data.l[1]; int return_code; Atom actual_type_ret; int actual_format_ret; unsigned long bytes_after_ret; unsigned char *prop; unsigned long nitems; return_code = XGetWindowProperty (i18n_core->address.dpy, x_client->accept_win, atom, 0L, length, True, AnyPropertyType, &actual_type_ret, &actual_format_ret, &nitems, &bytes_after_ret, &prop); if (return_code != Success || actual_format_ret == 0 || nitems == 0) { if (return_code == Success) XFree (prop); return (unsigned char *) NULL; } if (length != nitems) length = nitems; if (actual_format_ret == 16) length *= 2; else if (actual_format_ret == 32) length *= 4; /* if hit, it might be an error */ if ((p = (unsigned char *) malloc (length)) == NULL) return (unsigned char *) NULL; memmove (p, prop, length); XFree (prop); } return (unsigned char *) p; } static void ReadXConnectMessage (XIMS ims, XClientMessageEvent *ev) { Xi18n i18n_core = ims->protocol; XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; XEvent event; Display *dpy = i18n_core->address.dpy; Window new_client = ev->data.l[0]; CARD32 major_version = ev->data.l[1]; CARD32 minor_version = ev->data.l[2]; XClient *x_client = NewXClient (i18n_core, new_client); if (ev->window != i18n_core->address.im_window) return; /* incorrect connection request */ /*endif*/ if (major_version != 0 || minor_version != 0) { major_version = minor_version = 0; /* Only supporting only-CM & Property-with-CM method */ } /*endif*/ _XRegisterFilterByType (dpy, x_client->accept_win, ClientMessage, ClientMessage, WaitXIMProtocol, (XPointer)ims); event.xclient.type = ClientMessage; event.xclient.display = dpy; event.xclient.window = new_client; event.xclient.message_type = spec->connect_request; event.xclient.format = 32; event.xclient.data.l[0] = x_client->accept_win; event.xclient.data.l[1] = major_version; event.xclient.data.l[2] = minor_version; event.xclient.data.l[3] = XCM_DATA_LIMIT; XSendEvent (dpy, new_client, False, NoEventMask, &event); XFlush (dpy); } static Bool Xi18nXBegin (XIMS ims) { Xi18n i18n_core = ims->protocol; Display *dpy = i18n_core->address.dpy; XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; spec->xim_request = XInternAtom (i18n_core->address.dpy, _XIM_PROTOCOL, False); spec->connect_request = XInternAtom (i18n_core->address.dpy, _XIM_XCONNECT, False); _XRegisterFilterByType (dpy, i18n_core->address.im_window, ClientMessage, ClientMessage, WaitXConnectMessage, (XPointer)ims); return True; } static Bool Xi18nXEnd(XIMS ims) { Xi18n i18n_core = ims->protocol; Display *dpy = i18n_core->address.dpy; _XUnregisterFilter (dpy, i18n_core->address.im_window, WaitXConnectMessage, (XPointer)ims); return True; } static char *MakeNewAtom (CARD16 connect_id, char *atomName, size_t atomNameLen) { static int sequence = 0; snprintf (atomName, atomNameLen - 1, "_server%d_%d", connect_id, ((sequence > 20) ? (sequence = 0) : sequence++)); atomName[atomNameLen - 1] = '\0'; return atomName; } static Bool Xi18nXSend (XIMS ims, CARD16 connect_id, unsigned char *reply, long length) { Xi18n i18n_core = ims->protocol; Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id); XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; XClient *x_client = (XClient *) client->trans_rec; XEvent event; event.type = ClientMessage; event.xclient.window = x_client->client_win; event.xclient.message_type = spec->xim_request; if (length > XCM_DATA_LIMIT) { Atom atom; char atomName[32]; Atom actual_type_ret; int actual_format_ret; int return_code; unsigned long nitems_ret; unsigned long bytes_after_ret; unsigned char *win_data; event.xclient.format = 32; atom = XInternAtom (i18n_core->address.dpy, MakeNewAtom (connect_id, atomName,sizeof(atomName)), False); return_code = XGetWindowProperty (i18n_core->address.dpy, x_client->client_win, atom, 0L, 10000L, False, XA_STRING, &actual_type_ret, &actual_format_ret, &nitems_ret, &bytes_after_ret, &win_data); if (return_code != Success) return False; /*endif*/ if (win_data) XFree ((char *) win_data); /*endif*/ XChangeProperty (i18n_core->address.dpy, x_client->client_win, atom, XA_STRING, 8, PropModeAppend, (unsigned char *) reply, length); event.xclient.data.l[0] = length; event.xclient.data.l[1] = atom; } else { unsigned char buffer[XCM_DATA_LIMIT]; int i; event.xclient.format = 8; /* Clear unused field with NULL */ memmove(buffer, reply, length); for (i = length; i < XCM_DATA_LIMIT; i++) buffer[i] = (char) 0; /*endfor*/ length = XCM_DATA_LIMIT; memmove (event.xclient.data.b, buffer, length); } XSendEvent (i18n_core->address.dpy, x_client->client_win, False, NoEventMask, &event); XFlush (i18n_core->address.dpy); return True; } static Bool CheckCMEvent (Display *display, XEvent *event, XPointer xi18n_core) { Xi18n i18n_core = (Xi18n) ((void *) xi18n_core); XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; if ((event->type == ClientMessage) && (event->xclient.message_type == spec->xim_request)) { return True; } /*endif*/ return False; } static Bool Xi18nXWait (XIMS ims, CARD16 connect_id, CARD8 major_opcode, CARD8 minor_opcode) { Xi18n i18n_core = ims->protocol; XEvent event; Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id); XClient *x_client = (XClient *) client->trans_rec; for (;;) { unsigned char *packet; XimProtoHdr *hdr; int connect_id_ret; XIfEvent (i18n_core->address.dpy, &event, CheckCMEvent, (XPointer) i18n_core); if (event.xclient.window == x_client->accept_win) { if ((packet = ReadXIMMessage (ims, (XClientMessageEvent *) & event, &connect_id_ret)) == (unsigned char*) NULL) { return False; } /*endif*/ hdr = (XimProtoHdr *)packet; if ((hdr->major_opcode == major_opcode) && (hdr->minor_opcode == minor_opcode)) { Bool delete = True; _Xi18nMessageHandler (ims, connect_id_ret, packet, &delete); if (delete) free (packet); return True; } else if (hdr->major_opcode == XIM_ERROR) { return False; } /*endif*/ } /*endif*/ } /*endfor*/ } static Bool Xi18nXDisconnect (XIMS ims, CARD16 connect_id) { Xi18n i18n_core = ims->protocol; Display *dpy = i18n_core->address.dpy; Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id); XClient *x_client = (XClient *) client->trans_rec; XDestroyWindow (dpy, x_client->accept_win); _XUnregisterFilter (dpy, x_client->accept_win, WaitXIMProtocol, (XPointer)ims); free (x_client); _Xi18nDeleteClient (i18n_core, connect_id); return True; } Bool _Xi18nCheckXAddress (Xi18n i18n_core, TransportSW *transSW, char *address) { XSpecRec *spec; if (!(spec = (XSpecRec *) malloc (sizeof (XSpecRec)))) return False; /*endif*/ i18n_core->address.connect_addr = (XSpecRec *) spec; i18n_core->methods.begin = Xi18nXBegin; i18n_core->methods.end = Xi18nXEnd; i18n_core->methods.send = Xi18nXSend; i18n_core->methods.wait = Xi18nXWait; i18n_core->methods.disconnect = Xi18nXDisconnect; return True; } static Bool WaitXConnectMessage (Display *dpy, Window win, XEvent *ev, XPointer client_data) { XIMS ims = (XIMS)client_data; Xi18n i18n_core = ims->protocol; XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; if (((XClientMessageEvent *) ev)->message_type == spec->connect_request) { ReadXConnectMessage (ims, (XClientMessageEvent *) ev); return True; } /*endif*/ return False; } static Bool WaitXIMProtocol (Display *dpy, Window win, XEvent *ev, XPointer client_data) { extern void _Xi18nMessageHandler (XIMS, CARD16, unsigned char *, Bool *); XIMS ims = (XIMS) client_data; Xi18n i18n_core = ims->protocol; XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; Bool delete = True; unsigned char *packet; int connect_id; if (((XClientMessageEvent *) ev)->message_type == spec->xim_request) { if ((packet = ReadXIMMessage (ims, (XClientMessageEvent *) ev, &connect_id)) == (unsigned char *) NULL) { return False; } /*endif*/ _Xi18nMessageHandler (ims, connect_id, packet, &delete); if (delete == True) free (packet); /*endif*/ return True; } /*endif*/ return False; } nabi-nabi-1.0.1/Makefile.am000066400000000000000000000011161430012456200153610ustar00rootroot00000000000000SUBDIRS = IMdkit src tables themes po nabilogodir = @NABI_DATA_DIR@ nabilogo_DATA = nabi.png nabi.svg nabi-about.png testclients = \ test/Makefile \ test/xlib.cpp \ test/gtk.c \ test/gtk1.c \ test/qt.cpp EXTRA_DIST = config.rpath $(nabilogo_DATA) $(testclients) ChangeLog.0 .PHONY: log log: unset LC_ALL; \ export LANG=C ; \ export LC_CTYPE=ko_KR.UTF-8 ; \ git log --name-status --date=iso > ChangeLog dist-hook: if test -d .git; then \ unset LC_ALL; \ export LANG=C ; \ export LC_CTYPE=ko_KR.UTF-8 ; \ git log --name-status --date=iso > $(distdir)/ChangeLog ; \ fi nabi-nabi-1.0.1/NEWS000066400000000000000000000176121430012456200140340ustar00rootroot00000000000000나비 1.0.0 * 기호 입력 목록 업데이트 * 아이콘 테마 추가: malys * 쿼티 자판을 사용하지 않는 경우의 문제 수정 http://code.google.com/p/nabi/issues/detail?id=3 * 한자 선택 창의 크기를 제한 나비 0.99.11 * 드보락과 세벌식을 같이 쓸때 '/'가 'ㅁ'으로 입력되는 문제 수정 * 영문 자판과 시스템 키맵 사용 옵션에 대한 UI 개선 나비 0.99.10 * 오페라 브라우저에서 글자가 두번 입력되는 문제 (#316115) http://kldp.net/projects/nabi/issue/316115 * gtk 2.16 이하에서 컴파일 안되는 문제 수정 (#316453) http://kldp.net/projects/nabi/issue/316453 * 로마자 자판의 대소문자 처리 문제 수정 (libhangul 0.1.0 이상 필요) * 트레이 아이콘이 로딩되지 않으면 팔레트를 숨길수 없게 함 나비 0.99.9 * 버그 수정: #315977 firefox4 에서 backspace로 글자가 안지워지는 문제 * 버그 수정: #315744 wine 1.2에서 한글 상태에서 공백이 뒤에 입력 되는 문제 * GtkStatusIcon 사용 - 우분투 10.10에서 트레이 아이콘 배경이 희게 나오는 문제 수정 나비 0.99.8 * Ubuntu 테마 추가 * Colemak 관련 버그 수정 (#315056, #315058) * 동적 자판 목록 업데이트 (libhangul 0.0.12 이상) 두벌식 옛한글 지원(#315130), 안마태 자판 지원 * Over the spot 모드에서 지정된 fontset을 사용할 수 있도록 하는 옵션 추가 * 기본 동작을 system keymap을 무시하고 내장 keymap으로 작동 (qwerty가 아닌 자판을 기본 자판으로 설정했을때 문제 처리) * 빌드할때 테마를 지정할 수 있는 옵션 추가 * 코드 정리 나비 0.99.7 * 한자 전용 모드 구현 * 어플리케이션과 nabi의 locale이 달라도 UTF-8 이면 한글입력이 가능하도록 함 * X window에서 fontset을 생성할 수 없을때에도 preedit string을 그릴 수 있도록 함 (#315002) * Colemak 자판 지원 (http://kldp.net/projects/nabi/forum/309771) * 버그 수정 나비 0.99.6 * 버그수정: [#305368] 알림영역에 들어가지 않는 문제 최근 버젼의 배포판에서 자동으로 알림영역(Notification Area)에 들어가지 않던 문제를 해결 나비 0.99.5 * 로마자 자판 지원 (libhangul 0.0.10 필요) * pango 1.16 이하 버젼 지원 (Centos 5.3 지원) * 버그수정: [#305339] 나비 입력상태 설정 저장 리셋 버그 나비 0.99.4 * 설정창에 "초기값으로" 변경하는 버튼 추가 * 시작할때 한글 모드로 시작할 수 있는 옵션 추가 * tray icon을 사용하지 않을 수 있는 옵션 추가 * gvim에서 한글 상태에서 커맨드 모드에서 엔터치면 멈추는 문제 해결(#305259) * String conversion 기능 구현(그러나 아직 xlib수준에서 지원하지 않고 있음) * 내부 구현 개선, 버그 수정 나비 0.99.3 * 내부 코드 개선 * off the spot, root window에서 사용하는 입력 중인 글자 글꼴 설정 옵션 추가 * 한글 모드에서 한영 키가 작동하지 않는 문제 수정(#304811) * 자판 변경후 툴팁이 바뀌지 않는 문제 수정(#305100) 나비 0.99.2 * 독일어 번역 업데이트 (Thanks to Niklaus Giger) * 간체자 설정 기본값 버그 수정 (#304722) * 옛글 자판에서 한자 변환 버그 수정 (#304770) * 옛글 자판과 현재글 자판 변환할때 모드 변환 버그 수정(#304770) * 키보드 설정 관련 버그 수정 (#304700) * svg 아이콘을 먼저 사용하도록 함 * 몇가지 메모리 릭 수정 나비 0.99.1 * ic 관리 루틴 개선 * 사용하다가 갑자기 프로그램에 입력이 안되는 문제 해결(#300802,#300723) 참고: http://bugs.freedesktop.org/show_bug.cgi?id=7869 * 입력모드를 영어 상태로 바꾸는 키 설정 기능 추가(#304688) * 몇가지 코드 정리 나비 0.99.0 * 입력 상태 관리 기능을 개선 * 한자를 간체자로 입력하는 기능 추가 * 프랑스어 자판의 버그 수정(#304587) * 패널이 세로 방향으로 있을때 발생하는 버그 수정(#304681) * systray 프로그램이 갑작스럽게 죽는 경우 처리(#300760) 나비 0.19 * 라이센스 문제의 소지가 있는 테마 아이콘 제거(MSWindowS, MSWindowsXP, Mac) * 새로운 테마 추가(KingSejong2, Thanks to Stefan Krämer) * 자음으로 기호 입력하는 기능 구현 * 자잘한 버그 수정 나비 0.18 * 팔레트 모양 개선 * 한자 입력 포맷 지원 * 디버그 메시지 출력 개선 * 단일 한영 모드 옵션 추가 * X 종료시 설정 저장 나비 0.17 * 다이나믹 이벤트 처리 옵션 추가 * 단어 단위 입력 기능 추가 * 자동 순서 교정 옵션 추가 * over the spot에서 preedit string 그리는 루틴 개선 * 한영전환시 마지막 글자가 없어지는 문제 해결 * svg 아이콘을 로딩하지 못할때 발생하던 오류 수정 * EUC-KR 로켈에서 세벌식 기호 일부가 입력되지 않던 문제 해결 * 몇몇 자잘한 버그 수정 나비 0.16 * libhangul 적용 * 유럽어 자판 지원 기능 구현(프랑스, 독일어 자판) * 테스트 코드 추가 * 번역 추가 (독일어: Thanks to Niklaus Giger) 나비 0.15 * 순아래, 옛글자판 추가 * 아이콘 업데이트 (bluetux님 제공) * Tux 테마 추가 (exman님 제공) * 한영 전환, 한자 키 설정 기능 제공 나비 0.14 * 설정창 제공 * java 프로그램에서 한글 입력을 더 자연스럽게 수정 * 한자/심벌 입력리스트에서 갯수를 9개로 수정 * 지원하지 않는 locale의 경우 워닝 출력 * en_US.UTF-8 locale에서도 한글 입력 지원 나비 0.13 * 세션기능 지원 * 한자 입력시 뜻도 보여줌 * 메모리 릭 문제 등 자잘한 버그 수정 나비 0.12 * 트레이 아이콘이 사라지면서 죽는 버그 수정 * 트레이 아이콘 크기를 좀더 똑똑하게 처리함 * MS Windows 2000 테마 추가 * XIM 관련 버그 몇가지 수정 나비 0.11 * 메인 윈도우 제공 (시스템트레이를 제공하지 않는 곳에서도 설정가능) * 세벌식에서 조합중인 글자를 제대로 표현하지 못하던 문제 수정 * 상태정보만 보여주기 위한 -s (--status-only) 옵션 추가 * 나비를 종료하면 gtk2 app가 죽던 문제 수정 * 간단한 몇가지 버그 수정 나비 0.10 * 한자 입력 창 개선 * 심벌 문자 입력 기능 나비 0.9 * NetBSD, FreeBSD의 EUC-KR locale에서 한글 정상 입력 * Qt에서 한자 입력시 안보이던 문제 수정 나비 0.8 * Over the spot 개선 * EUC-KR charset을 좀더 정확히 구분 * About menu에서 키 입력에 대한 간단한 정보 제공 나비 0.7 * QT-3.1.2, 3.2.1 에서 한글 입력 됩니다. 대신 모질라에서 한글 입력할때 깜빡임이 좀 많아집니다. * F9 키도 한자 입력에 사용할 수 있습니다. 나비 0.6 * 세벌식 입력 버그 수정 * 한자 입력 기능 지원 * 세션 관리자 지원 나비 0.5 * 드보락 자판 지원 * system tray가 죽어도 종료하지 않음 나비 0.4 * 폰트셋 로딩 속도가 빨라짐 * 각 프로세스 별로 한영 상태를 따로 저장 * configure 할때에 기본 자판 설정이 가능해짐 나비 0.3 * Mozill3 flash player 에서 가끔 죽던 문제 해결 나비 0.2 - 종료시에 메모리 오류 수정 - NumLock이 켜졌을때 제대로 작동하지 않던 문제점 수정 - vi 사용자들을 위해서 Esc 키를 누른 경우 자동으로 영문 상태로 변환함 나비 0.1 imhangul_status_applet을 대신할수 있는 프로그램입니다. GNOME panel의 Notification Area(System Tray)에 들어가는 프로그램으로 아마도 KDE에서도 도킹이 가능할겁니다. gtk의 input module인 imhangul의 상태 정보를 보여줄수 있으며 XMODIFIER="@im=nabi" 라고 설정하면 한글 입력기로도 사용할수 있습니다. nabi-nabi-1.0.1/README000066400000000000000000000036611430012456200142140ustar00rootroot00000000000000Nabi 나비 ========= nabi는 System Tray(Notification Area)를 지원하는 GTK+로 개발된 X Window의 한글 입력기(XIM)입니다. 프로젝트 사이트: https://github.com/libhangul/nabi/wiki 기능과 특징 * 두벌식, 세벌식최종, 세벌식390 자판 지원 * libhangul을 이용하여 한자의 뜻까지 보여줌 * Notification Area에 embed됨 * imhangul의 한영 상태로 같이 나타냄 소스 nabi의 소스는 여기에서 관리하지 않고 GitHub에서 관리하고 있습니다. 다음 명령으로 소스를 받으실 수 있습니다. $ git clone https://github.com/libhangul/nabi.git nabi 또는 https://github.com/libhangul/nabi 여기서 웹으로 브라우징해 볼 수 있습니다. 빌드 빌드 방법은 보통의 GNU build system을 사용한 오픈 소스 패키지와 동일합니다. (github 에서 소스를 다운 받은 경우 ./autogen.sh를 실행하여 configure를 생성합니다.) $ ./autogen.sh $ ./configure --prefix=$PREFIX $ make # make install XIM으로 사용하기 위해서는 XMODIFIERS 환경 변수가 필요합니다. 아래와 같이 설정하면 사용할 수 있습니다. export XMODIFIERS="@im=nabi" 그러나 이런 환경 변수 설정을 유효하게 하는 것은 일반 사용자에게는 상당히 까다로운 일로 배포판에서 제공하는 설정방법을 사용하시길 추천합니다. 최근의 많은 배포판들은 im-switch를 가지고 있으므로 im-switch를 이용하여 설정하는 것이 편리합니다. $ im-switch -s nabi 이 명령을 실행하여 설정하면 됩니다. ------------------------ For non-korean users. You should set XMODIFIERS environment variable before launching any XIM-aware application. export XMODIFIERS="@im=nabi" Put the line above in xinit script file, ie, ~/.xsession. See xinit man page. If you use debian, it is easy to use im-switcher. Install im-switch, and run it like below: $ im-switch -s nabi nabi-nabi-1.0.1/TODO000066400000000000000000000000311430012456200140100ustar00rootroot00000000000000TODO ----- * 1.0 내기 nabi-nabi-1.0.1/autogen.sh000077500000000000000000000002651430012456200153320ustar00rootroot00000000000000#!/bin/sh touch ChangeLog glib-gettextize --copy --force aclocal autoheader automake --add-missing --copy autoconf echo "Now you should run ./configure script with some argument" nabi-nabi-1.0.1/config.rpath000077500000000000000000000352171430012456200156460ustar00rootroot00000000000000#! /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 , 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 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 | egrep ': 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 | egrep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | egrep ': 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=/' <= 2.4.0,, AC_MSG_ERROR([nabi needs GTK+ 2.4.0 or higher])) # checks for libhangul PKG_CHECK_MODULES(LIBHANGUL, libhangul >= 0.1.0,, AC_MSG_ERROR([nabi needs libhangul 0.1.0 or higher])) dnl gettext stuff ALL_LINGUAS="ko de" AM_GLIB_GNU_GETTEXT GETTEXT_PACKAGE="$PACKAGE" AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", gettext package name) dnl data dir NABI_DATA_DIR="${datadir}/$PACKAGE" NABI_THEMES_DIR="${NABI_DATA_DIR}/themes" AC_SUBST(NABI_DATA_DIR) AC_SUBST(NABI_THEMES_DIR) # configure options AC_ARG_ENABLE(debug, [ --enable-debug include debug code], enable_debug=yes, enable_debug=no) dnl default keyboard AC_ARG_WITH(default-keyboard, [ --with-default-keyboard=2/39/3f default hangul keyboard]) case "$with_default_keyboard" in 2) AC_DEFINE_UNQUOTED(DEFAULT_KEYBOARD, "2", [Define default hangul keyboard]) ;; 39) AC_DEFINE_UNQUOTED(DEFAULT_KEYBOARD, "39", [Define default hangul keyboard]) ;; 3f) AC_DEFINE_UNQUOTED(DEFAULT_KEYBOARD, "3f", [Define default hangul keyboard]) ;; *) AC_DEFINE_UNQUOTED(DEFAULT_KEYBOARD, "2", [Define default hangul keyboard]) ;; esac # default theme AC_MSG_CHECKING([for default theme name]) AC_ARG_WITH(default-theme, [ --with-default-theme=[THEME] default icon theme]) if test -n "$with_default_theme"; then if test ! -d "themes/$with_default_theme"; then AC_MSG_NOTICE([there is no such theme directory: $with_default_theme, use default]) with_default_theme="Jini" fi else with_default_theme="Jini" fi AC_MSG_RESULT([$with_default_theme]) AC_DEFINE_UNQUOTED(DEFAULT_THEME, "$with_default_theme", [Define default icon theme]) if test "$enable_debug" = "yes"; then AC_DEFINE(NABI_DEBUG, 1, [Define to 1 if you want to use debug code]) CFLAGS="$CFLAGS -Wall -g" CXXFLAGS="$CXXFLAGS -Wall -g" fi AC_OUTPUT([ Makefile IMdkit/Makefile src/Makefile tables/Makefile themes/Makefile po/Makefile.in ]) nabi-nabi-1.0.1/nabi-about.png000066400000000000000000000572161430012456200160700ustar00rootroot00000000000000PNG  IHDRjPbKGD pHYsaa?itIME u+ IDATx}wxUsffnv=!@IhR*M@YEP)*H:! f{v~d7LM6}<5W̙3>S ._&Рv]u:^sIKױi7A#N=%ݸᗐ_ӧ=ώ|Xθ.`G<˲1yޗa8.LÔq3fCR(3nZee0e$0  5]mڿecy_Qɱ\aU/J<@?; N?]bwRUyX^۵(6-?dXKX-~@TanvV,B(7+ ~MJ 1Q,-g7戒AsGUvia`׎?# ?Ǡ~<* l[ wD]A{YІ rYe}֬YvUdg^ :R[)7n$\.، Vd+*G!.*(1;H%yvmvf0aBO{cY귗/@_oq$?/_99q(JDGx@*cG;pۥZJJJ$"hI,o#ecЄOV!D;&=?dMUr*p;pۥB"##WUTs lMYlԓ3wMOF_~1((Hm:)*qv qZ/&IC>q@I'Y^YhNO3PN IKv;PۥIcjj$OL|& ٷ/4MmgN% !(,%h1Kv}0`5ݜ:x:(3**d\li~YjexB ׯ~jc-j縕so5 X{x(<NJ<Yo "HQZr~}h˗ {h;}'30u>^` #՗.]g3{ .pzpySVviVJJJ,˾ma$HR=⠊鹅+O>ɓ'O81+BAcUʺpPbԧOZEEwQ9cy! rܧK_Bs`L0@t(f ڳ~忕G\YIɫ Rا~V.WpBb&}wwc 35-*3r8+-%{+ZZE B(-wV9wtMf0F@i_ڒWȲ Q[=8dqUpXEM\k (<"|GK79^}9pw΀pY5m˄fs'w SkϺt^^xSNc?8]EQ@.jZ,)&WKcBpP+?Z)t,jlVkԫjypWVS;6iԮ]tzf 汼bpzFK55:<x|C`hZQg5,yum+gJNރ8W;y=Lzı{riq7bVW4dOB'Z;忆iw[g\ĥYKRUTWW=ztKT*jtAH&O~wFEE}Z2/¸o3 GEjt&$챹5Pf}#W2iqV}23̅I @{#AA.ՠC??e2"344t֟I41qѿ|7_wI\h;tq<WXTj*^[~ڠYm{d?vlldԢKNA6U1e usf=fJjR.B˱e__>yL_P*r{?wϺQݡt蔼~Wt%?n0Lgsn2عBor3;wŊtY3>~k׮u۫p=?/$H9'b͈ P.{`ݺuaRhƟ~TPP@2hT|bG 1 lAjݻ~vy?w<ò5Cu4o޼.zya~pmu:_\(iܸH0 HRYӽgk@Vmh :cNVn;Z7r :E'@_ιgGBBȖW'Y;AzSYebաm< @RFDEkCʍ.qwe9X,s%eNvjQZS~q?!>1~;H$Ymi]}׮YY?ð8>(wsh>r:p[e#HmvuuԩSÇX@*Veؖd<R?3f8&.7JtϫNllf.S3`XgJaa!#*f'Ư8iiKL\IQ:wS/<'ko; G]8ˁv-{а?d /D~zk>ZNRd-Ƽkw>m FFhwb ر{ɰȰ, N׶oc,Kʲ,}t>t:`}+rvSL u#DR@ RPZR"k̝O<1 q!z[Ǝaܰq/]8b 9 58Z٦M<*2SPP0p{}yڵk~^1h{㸞=z<E3\ F(*™s݅4>ʨ=1|0$vU1WG> <3T&|?Kppp7xcu^^ mf eg_$6ͿAz@j"wh*1}tQ{eyQNexPRz¢a?\Ng][7s#2*nw3:G - $qdy096V:vĊ)ZmZԆ[ct D"ܳ:*2aüy<ϷbhpE6 )//w_LgF RW(]dTwLۓO>y ))!**Ju֪ŋZ`󗀶qFO>RVAIF#aXJn޽իСC̯6;|۴oő'O`XQQѿV^ V-{@dC&Lxhmo{I.í 5Up>&>,Խ ͎)e%wcvneɴY,&1._Nb& Xf[jnmv` k=xUr}YWn73c,]iA+vn(T*8IJ crvɓ3f8Zh/2Y;]p%yc|+K}45P$IUnNv1r7<IoZ__ge%0L&!D4M.]bŋq+@nQF)ɐb\^P(:km6+5Ϝ9y/n0o瞽`'1r_8NsWr/H%/<<{ue%IW?heR#gs'k˪_t:>6 rO߮ҒK6tDv*!nG@bT9t[12N7\.p8VU]+,)..VW 0ݦNUL>?p`[PoP׮iƭz|K0ڢ 7,**++Z?0Z-9٧&)BVVzAB|Tr!=={={Խ⋆BQ]TT8hǺ\.D">ko9KrLԩ՚Z\vO_O9k[zwm)&,}㤑c;(\2JLdTmH.k.lv:dQ5=֗ghUåKwOᄡՑ!# DimY]ƨ5U#myiLZE^=Q1<׍k(mG$Bh\D{ ǻx>o=}eSډ)|&cᅀ &<ݬ۟ O>"˥Z@NKVV_$n8q,ciw1;Q(R.O*/˻vZk׮3Ty^qؑ4}}0ۜf0Z@%@Q$VIp Gb= C⣾w8fi{Ie* [dARXi`[>fnEF%tSll'  ²k.}+Ͻԛ9505g.,`@x"V8A Wa̫r:UWU*L"2 c!p9mIIcD13`?6?q _b… ?{VJ㓻%vt:t^4i;8@ BVnp8gkUWIt3/K2}fFXɈo-yU#m.\ !Sfy;PYYYItzǛ\YjaiF U/n0fkiKFţ6`!$Bc̒$Ir$b19 kWEVn'B $ϻۗL*,,Pںz} }c5ƸŹ `y3y!zp9&4"˫6dn^͉CG_(=Mҳ`=HEH&M$ũ[TTTxjb*atu.7M\)xw 49FԵ&1EX Wʱ)%%mZ}*ę#}823zV{" 1d{E__{+~֜|ӪS[g㏪ H2ރ6×+ڄ&ݨ?޶v٣3P(ϼd=xxHzR*'TIqqFw7]8 p}i*XzhGXJ AHL-8ZDLAEDSQ֊%̈́$IlV jYk;vr'Ƹip +*8NcYV ~&q'Jd<^7l3/\sjw=yFRx{rVX[fw}I~z` Jkl*gz톧֦]}ouΆ78t.?xM| Hђ{%$i=/;$0 ?{ejhh0`Yp)4hzqJ`[L&rⵃC{w%p3#p:Q N{1<#$0*٤td=@H 1_2˗s.6AkwKcbbAA<DJXĶOi3J}ĭ?t#tWrCFO=GoCpfOwތ4gF2Xlm-_ze/ OǨe#Y&; }cbM]nnnlhn'}z5o޶=h]u5I:-^bhWt[6>jWUR,m)L=&t1p}BM{f}C+P^^an%3e9D,NMN#4_XQJKK#0kSpOm<l3q $MAAAŅ]@^FHo=`0]k @k İ87N IDATM"τƠ43k5k_5ɋK*UuvE$pdc}{?89Ix&b Lc1Z"9Z)Ν]Ve2{yYh A@&M)۶ UhhSRxdD,(=̊h&C? E!Q$IϠ3H$F@IH 0ƄgB7@[mnݺh Q]RRZc=G-D"X, ^`{;fk%%Ap~(J1Le4ÀG;cID"Q .Z1y&Z1}o7P|a)AD6b&O0 Ai{Ów,g̝эôY#z;¯v_ɯNv ߿ޓ<8g=vdi =؉ϼܧ˗/r"k3/;&*bGvvJu<}]TM*h}3,0HIPx0Kh؋%gQ.L Ƭ&P]]D8iaƆ)DZ(39*r(D rj^ v 8MkjO4!ov'x_#s ɡ={L28鎙v1>K-M= Uܶ bv8:ccOg?=1]ӻ7~f)xaݺu!ǏaC\=wG}`5鉝R2vzgٌfw<G \.;/]-KJHyB0@%pBBYڝd'J6]Nƌc1B躥={ԔWpzaI"js0%4M#1BBB fX&`XmrO +moWK!n,Ǿu3Hvh5KI8?x丫3HbrNZr ҖjѡCw 0+W4fe-"N!פg=6gs3g/J8Sߙ3N̅F<=ੜ=Bߘ{?߼rZ>H= V+J.w|cJ.u8ޟ%4EQ˲|ʤo cN⒚[8!DVEpHD0 z>wt,`[T4ArN!4t:|fN_Xj)+ E^=4stU瞉qvvEMmeY&p_WkXZs1-G}`DlcbϞ=1}}v=0L>Ё>lU# iy䟿b7m8E*]ۯu5i}M1U]yW<{ad]ܙ+HdehmYHPPny!x/OC7~.:t(DR! P0ˢEzZV`vd2 h4rN>!HmiPhhW]]1N'm C[[[8@UUͨ40~skN+W俤2q iن(`<}ڐygϞþ ϼ ##wUmlqEXT!{e qU*UH$bB9ahO14'q!"z&;B,_7|XhQ*sssә VJ%y@o`D3w # SaÆtKإ߾\'i츐m){qCqa /%RϠAÇsIF1 SMz9%%=9 %;̆IZSW )- &r޽]d2YTEEEԩS;<-;;{͕+WpPD ߿ǽ{v6IR  ݒA@@6*bY%TT*b Y75-1,bXV[^/<-)Ja t-YےC~ͪ 3a ZvmFRRRSoXT?r\9o㒢6- $$@&Wç ~;u_]yyY_$WUU sT֨+/dK$Q0 طtLerMiNر#->>>8777GS?^둟"?no|$,Xjժ4M7|+rg?bYŴۭ8:!1[E!E<`2Wh %g96gQ N֘y,[o+uKZ{m3[ul} a߽7޻gϞ1955U{ Fe#Ƣ+cwHL˓njc/ "F؇XqV0rP\-~Mw޾}{'N 1cƌ7T*庺9YYY7}D_cX3b৽'IJ7!bQk$F#JLLPpXXؠaFOp AțX_[[W'ĂD"AAh&Pl-3 p+DqQyAKyXN^ZR2{y{P\o&l v{C%˖ef 3mq…|/xT$e{sJQ}VLGSݺTgXb<s[4pWk̫>Rn3FGGV\ٻ0ҥm6]?}T]]-:DSRUdSt Bˡ෢LN@>lEQH$aXJ$ ؈ս{Uo>RJ,DzLq!$$X,$0ju{KNIIqx9`04T<bɾشǦE<g7H\هHvA66qkA *0h&É5@9 y/vՌW6s}BBC^/ c *S$SYױS Bw$tzФy (62әh mVFdСASL]hQj}$<<|^^ާ@cmԸ&bVS:nܸĪJJ){rFfL7 @6-a8zcx6y6w4/J$5g?֨,Votc$IB޽Fc455 رfB}+5rOڴ%]'$;wgf츯 ~]ϾgFŜJ$(8ѣGfee.]ODpqq񺪪*m)tlKbhSLQ%9VaA_T`OL@e /wY[Q^D4ц.b_QhiP*˸"YF5WEEEQZ6<%cl2_;֟X,*@va3ݸgi`+^uPTTTEQ5,q\q%%%vNGl6f,;t: MԤW1ϫZ.ωֿW0${<zn w$$w9+,*+)P?/rhh(yQKlllh̭j#627Gj:6S%h$Iڬ"#n=YI2O{E׼뇹И'EpE**DVE+XB+K,1 FK^MT*QePL 8i|`YtiɣFWo*`I-E1n{|cV76ɫ-w[VDnr:SF `ο枈 Сp'<=lkUǙJ~|U d!a!:w\d;0s3y璾o&͑9G>l˚UeG5lrp5X`|Ȭs7)`cra{wJHd2yn**nV ρ=j1jB]^yǃVkލᴐ$ b$\!<8?_ױnVĀ>>^`u6;.s+169nzY>u; n}ɲʲeM_x`HfsN"^cƍ)SLFJvw a`?>Ӓ^<8x"Q;I yh XPEL&S=\O>nmGeel6Kr`pA&^&KGPFIy'j@1;,еmhawAp5$$$DZW[H펋;NH(!.,S^V0eIp (8fne9smTo%6=frjRrn\2 kb@I\xqfnV;ίL>61 BTΘG [+6[N[zn!fnjу)bjJ&Z[WWX_u mUܹsmĉi IRBVm (;2ck¸Qs;<)+(1Ŷ!Al "X1 HJ&@TΝUN0` %Hv%*`cd2ټc!jsmcǎu蔜w)WZԹÇ5 Ě{v~A;{0883g3\@*] sHԇ}#X;O^W._{֬=˖./-ZC~뜶=,>^ys uu1r 59968 ajBS&oŮ[>Vzקx?\/ ?BF"DpX3v;W߀ v RE!1[s}WWWeSO/b^K"gi>T Ӧl;9a eoB vMŤP#pryB43Cj4v1Lg/\Usb63aviݫW3u̘1!^xP]S[*w!`!F1^&$$N]5S:}U&Eb`4 62 lA<ϪZ,v[no7&%Vk&sOBJԩܟi-'njDA+iSNpS~f K!OT1I2,4|$4n[ɇGF~'tՅ0ՇN{-,,&sF >x}>BY6pi]9ׂZ - xߎo7AIIIr1 <^aD!B[\NX8M<ۅp;vܹLKK ɹԦԚ&[s}!D<7B{>XWW_#Tid&1x2px10v6,ՠmvS<<c W}'PbqBM+8)Iaq\muxIΞ1BL\|YsvH%_;]NlYښW^y~~dr.ޝoE%֕vsɼkbuNn/%_Ӟ7!(o\yzmȐS'e,+D[ƒ'Dqqq`@d?r˾sn`9"##Wr"ZhKƹ]+mikҿG=x-+)!XGHR/W(r{' 7';\\T4Ĥ}>=#7.Ш 6+8Lt5u)WN8TP)h\G$JiYAIx כrȳDDDHƆF' 2>kiYUQZ/v" :H^ J{Q0o RTfc tW XV)n/ۻwoZ;pW }]Ͻ%9Ȁ a(4gIDATo7h5|'RhT]=xb^sү7}MZv,?c)g)v=Fi(..܄ɓiVD%>mSyu 6NUpBPswBv;+ٍAƘ#<:cF#ZAѳزV/ulG%< Kژ^ {TW'$g5m9>"aq?.]Hh[0ƶH vxZ\DDd"c  %-ac@:n;y @. QWF ԯ{`g7upO"J ۭ֎(pYݷiծ֊͗bɏn9n9u9rdrkIv:D"QMd裃#MoW\/y0-n Ts/өw aWmJhM\{X7nj`~D"r7n Vmʅ9rPUI@YyqJK=$x';y"1LrN(lWF׾eC=r9NP"eئP,Ĝ!w1i2MuDN~ޞ+V%i8 BTʓ9ɖc˾'XΝ;._-̔=Oda?\BTRޗ EA$b jժ~$I۟}X^=]\n .|ò{n*\WJsTٳŴ.͗,C^!OOi,èi=Ip&f}X%`Y۲>37G~-idg̋9'1dE O$ @x9MT=^߇)ƴ9D4y@; ӧ0=z`H,r&…1pg\.vjjjV5??rƩbmћUEEEP&q@w1_yԩ='ڻ(;ګ轠A! 8G1`\b\q$D%è&$.T12FFdihzꥺ;{շnWU͖vwNO5vU~wA K|[mykZ[daoiE VϞp+^҅S+~e*͛W>u0˫)Ib38q良W|MmàTE"bcaOHygBDpҏ '0p0a?" ( fYMLjeYhRk)TI|>[dnu#n8,>>?onOY7$InokG/ʡHy^+n7tiǯXfs>T71Ν;|>_Y]E#ݴ5Dh7k#~ 5l߾O[8_ .iӦB[㸾ݽjk'D._S۰IVEbYj0YS@yCxWo "o\u_y?㢔JKK[ZZdUtwNΊt>B0dYv!.cCCNhj<xq4:>.MM裏_?oE ҈X(^b&[5{s.;;Kם/%t{Oޚ:yJ=}EQ2hYKɚeNHQIɁ%e1oqܹs|>_N4tH!]/(xwbzNק bEWY錱HUJx pcXGZ`xXh4E}tԷDlh$w_D@:~&qXqq1Oo[`"h rO6sgeWWWYԚ獿\Y'kYk'k„ y>؅|n=ٓ;pfQŠlZ=}aU]>i(8@\7_:>uXM} l\TS K,U>3b@kk^Qb!Cp%lYax>բ```r`Q(syNz9 ))Ŝ}kG |:sLԩS+wlXA!]2`o+ p+7ugEE,˗/oظ5u~lBB7o^}7;}o=۾dG[c YU7T]SusҎ ,ʮ@{ك?ni 55ưQ]E&]gϮ.]?ٵݻw^g|,z#TIq9.fWLL( cu-?_Xrjܖ͘8Y'XsBAobItzzztm^r:m׻j9R{ S+WzJcWZrUn+ꪫ?u[ KJީhN ݨO̮|D`6u +&N*7M\L;d£jwjMo^%.3ج{gZj{{́]v]9UƀEE9NQDzcH ,+1?dr7gs~(?%K%=ٸFX9jTƥ***8g-4`mvG-q{9P{|16`8V2,9W{mooϫx◣ho ّ2xX,+I}n:ysBx@1Q$Mp <H4֑Q_P/+ CgI=k„ Ň,_r94a< dY8W;0mA9NgsڂqF?2QEVBy'AZ-6^X:o7qĪ>|gA_\oޮ'7j7-f{ }{^gZ\nO;[sdPc a]R(D#$Gh_q6M9.KXhCrͣR\Z-yF'Q"xggWou:GAVĺ\.Ahxp0;kvOwWkʛb~zb#c.;پmE&j޶1<"`s⼼tSЀoT_}$&DŰ]6M(t |m1!.8JpgSt@5R`[tzHyH$ejDWQclk֬[zm/ LJ>轣&?aZZBn-YppPZ z1Kw:venb_6v(5P9mE.H$[q_~k82L*Ú=5`; ^o/xWٹtE"E?LcU&%35St8Rk,1I'XyLgs41MqԾ#{"XUmMcL'|'=b]Wl=`N%N::8tcYH !2Z <_QQ(J=ԾC===`LKj#JUUsppЙͩ::AjFQU5gSAj !6_/w~A`wY7狻[)Ӧ>o7j/d捯| ㄌ l!"@v欇N6=e5 Ry)"}UHn``G \xf#c8EcY:KL,{Z S}$y"%kX]*++c~'6IC @ƦʙeM^ҢC3TE)UUU>/ƪ=; F*+"A.\uk|N@aVw8͛gVUU-Bx, ͹eOҒwMGwGݪGj-x]ˋm8ޥ%Yb-͈bZy0Xdf}Zh]Ϸk}qnۡbӣ02Ilb{HW40Y5dc9iN4d_'P%k *WTTZ[ ENH̤̓->||^y{KwɲlÝy~៯#4ƥ =}._޺v W^ye3ݱX#/iMvfLFW \1ǚ$6Ȃc0k3 $͟?a kJs/hf hϓ O[09bZ)PgB=eL*&I6uTL9 `  .Z\^1v) CE%o?3o^;/Zq? ͍+W߭]>b u|+ƪrhI<ng#?e،'xfIŀ!qI xŘX Xwo`6cz0INId>O8ai}+&*|>gdhͤP$nyJ65+3g]%8: oH:>=i{e{zjeV2gΜ2Xy=nvnNhPZ%kh荌 _2k̎%؈iYÆ =Ymzw|oaDM\ksbU}tX, 1xOd 醐qM|\.r"f":8iCg&η~@ZA?5]ud Mo'IT4q_M##w\(XWAHh6Z!C֒^t%dԏbl:?+dY,a&#wR7Ȝ>Q35Fp(=l/JFIB ԹBfFVIB!rQM*@ Io-ρwsIAr.c1( ##D:pFKY)<UHج~3g#0{Y_^/㍮BjGJK o(k,]B% l]$S0Ƽ@pjt\# ~g^ j_cF.lZ4MƘA"M.,1*V+o1I+mel/Q+QШs% L5ccR{<-&#H1Q!KL\%}n痹AgK4el6ab,jMɜճjff=fw+HYO(lVIENDB`nabi-nabi-1.0.1/nabi.png000066400000000000000000000257261430012456200147610ustar00rootroot00000000000000PNG  IHDR>asBIT|dtEXtSoftwarewww.inkscape.org< IDATxwxU?}f2@T"(,VE *b[W]{Q, VTPAAW ػ@DJ fɄ P_"X9UloۊAF^Y%ZU^`mC桍x|o̾tMm𲠓Ddhi1fBD#旕] ;Y. s ꐳ]mO|gCQSKMb,eaU(DnKм11fWk? T\z+9D:_ڏZFvs PX CCTx>YV Kb$&/B*LC3]3Z> y)ETS,U̾*Fc%`!zz& s['hD-aںxt}FMj~g{r] w7'ԕz7}2~< ~@xK7@Yٲrn=%ӊNC[Цl#xI~p7vU>^y9Lf6c Ql"Lɓ`+AG"X"7槺4 sx53s \|1t=3"[t]uc?EEd [0\BٜBFEYJ@!BC ĵB+J>Q K}KX gNkJ>޷e, t%s2V-scf#]|g_(Fm3e5*4yD ZKif"7yK,ՙՉ؍!7i <':WrfsTи88;TW#gUuT76@-:bڎd 'z |}/֍! Mg+$bYwl٪:bܫ㛃ߊfaKR%~T]Pe L\Wx'WŽ֦w#7TsuԽ^5gQ4 !y$AH\e:@||G(Ƈ~9akқ qhq^8?t!<聓rޠ Q'ҧA(9o|$!zuU,6~ylJUS+FjtKi͆3xXPu?U Zu5.Fd{BkU[DE[kk! @6=RMxXP?Kᢜ  +yU@ro  H @lrJ'v"j]OVVXzukйl Pρ4N:2a*M  ɓUeR"oo9lܨse@\aAm"޹Tk>T`{m5A"|O~5f~`J|[MX{*z$5bMл,d* _<#",qP iSj=Yi5|Wr0P-skYDEJ1 U%ϫjI۸;wNJ[.5|nb,E2[ZױKY=$\ENB_VfP`'z+2۴UTk*To}Tup~#9ũUDbz'<$J3X*'AWs%h H>?KȠFwI)}-r/BڮL8 HCr hܪhv1x4m4T?Dy #>1A38 XUj{T"3L#<7) yS +pDFFj`(`JYnPJQX,(={5tЦд- P> aU}>v;v0~M6hĉ-W<*Ǫm*˞`ju KVη xSe'QEI4_|gOb vFc v瞅@uTtjb&hf&I||-]wuz}9:*y T s 56~`񍪞W5e m NF?|\TߊL5a2.&jt\>@IWIq7|cbVݱZKXu"m>BTunO)c&qOZ'U܋KNZ=BkvW`Ȼy!IW TSU7c_G?yvw)oB꠪j+tik|h4qNX: \v9AʵN~(r"Q(xq%%ƂYVk/9Et8dy\Vl,~ j`ޱ=!=7ېy2bbup:kG̋qaM4pi X@}$bST,~-̧GG垦OeY~D} SP̛_{4sIQ5>B?5 8 xFzQA>؞˰ (rҐ>ZV:*7, aMkj^ls`q0#! y) ;L'5`ú,_~ (T֔|@'s\5=U,&N$ sM_Wg x_@\ƞhYdiCG]'ac3@H9 8VtVt^Lj^GͿQ%#Rթ5E9_ȻOVM5UKj#LF j;)c\Fb ;|,\:KRQy66gr Mh$KuHl Avkxr R VٕzuMDdUy`V}P"ic8 jTshJiugY^ZP:@_ a.;{l!Bï9OL5`&uj_uu&vѓE(ATǪkJCOp9Q.o\/}) 1@`8CkLC#:ŶD)"b;(ȏMMoDcFPEBWkM @@\.`! ws|\~y㖎r0'n\Gd4=&WhAXph߮ A_+OOhF;ȗWwϏWGO g{{-}:'75 @1n5@T( IJ~㺴 "_ | e, rVv4-nc& }o]鑜^qO?i}w7YK:wQ}cvVJ j4SD5vS:i@6֜d& Bosrj!]ek܇=:lW,~n7>iQ:4x!hK}ʂٷNY8Ȳ]nvm^z8r o5p7J_fs oqh)Vk:+A;er:9eTt4<HԸ}hB|'5@.`rBMk&sšhѣ+Ik3@Dٮ0K42mt@gGWYc 6ڜ>,;=ck[o_yW'7~\ \ȓ:uva}jm2x87sGaMhA3.BUam٩ :`&i||u᝿leo~[qς?Y0Wk呻uٵk42Tiyyc|#^q/i,#|tpfx>؊`*В 0R5* po[';~n>9+ja]iw)]sN|gWbI;c$9WS.Q2.7_Up/KuIB+`6_L ֘)w53D-Kʪ)6Nؖ\Wǟ5Me>`ֽ^qw+:'O4WVE;ݒ?q]B s+xÚ7RÚ>m eR7xuaZcd v<%KX:?sWW`+dGby.דUا^l<`qH#Hq>z(ǻb:9q=y}swX̾ -~qdbY[ ѧ}nk:0qVL VqھycbRGp L i$8Z;w5dy@\{5Zuרة )-7JtlIǐ) Vmpi>O`台޳OŇn-xtU x}o{ 8)b,C݁4`8\e@ 8&rרE[^c.|t\ckY|Ӛػ$z5TfCk404٭CAih4ӡ&en >_f7賩fA;$,.0; cѣcaQQL#ꈝc:63<ׯXW~AWۤObq>h۰ 1Sߝ|JvN L} $#q`qbo˩| A{M|OȆS5d8[,W,x0)!(bj/s.ARK0mtn᎛1\LN#Lp)tbE/n KK4Gb6,_\vN[%Ŝv׽.i zvAu1 'ʚxis#eG @N=fysԅx<HšOFg2#3j$@c("u۞i+zcy0k'Af2%>5p?T2u:71^0 3Ewpة 4P;^M|[:JܘØ9"bUNۆg# ;Ԭcd|/"3X6_hj|'i1uL\@- ՁT$"y"r-CU/nC+qg~4Mvo깛};{Y}B=\YT*l(T』ITۮwJo "yػ]U7Zw19,cyѻѣ&?夜01܌[yPZ#\ Nvg勥EdGY`g8`WC)etՏ<}ɸԫg~؜DDrC usjARm_rZ ޒ#V;s)G86?_2MT!!=MR y~E_(=jgbjw=~7 [ moԅ-~;1r|ɿ.U9NڸqP$E1p"('z;4[}^q/& ~;{qH#{ <_,Яp t6?͟zio?_DTJM=\ӏ=7&kԀ wԅk=by r]H=D~S2B\b,jOҿMAs%ۍYRe{mP AҪR HYL\< /J},.k|y. ky`S̼Wnhd^g}ڗ ۻܻE'Hzf!_Ǐ[5)E"\;kbGsj{pG%1aF;d~UmRɅA4ܟ?`䭫~̒ #y4=ſ\;΀o2Ox;W7k8TW;k9Bq0҉k?c~zɄ LU?[DT+tؚI(H}b;G,$Ǿ҈%H*|bxS?j7 ~o>4ݢ}{d/%J_"XG> k",by;+^999"5FT;"E6 cFDNʜBd([g8id:ň?pQיVH^F)QHۏ|G*>͚&&u@ÞZ4@Uva-j9sV9[S)}P6޿9Mh(@-@V|'"'&]$ywKN>b ^w_O~E3)aÎM~_"ŶΥѫtCK^9,y@Ț2YĀv' ozƻiiiYBfNұjt FL4v,6t7n /Hr/P&?P$,"C"Qu&fBgn"J@4{ND$HFd%A@?S!V_dW>ǖ \Zjb)r73zeby]#42.uXJl<Њu$VHX,}%U ~XlCEDP ް孌9F7aBT>Ra3*ȰgB` եSI,Gr"!jЧ@.e ʦ2Z=+_mgx֟jO[IJ*vF1)#γߛ騳 W8;:#vLǫbn q7 /2d^ ϑ{ÐWo{@οx7bYkƇmy% + /-fM*XT5/2&VT["Z8xu2Hf1\ F,孄|`+M0G*RTS=e^?w޲NMZ"y ܙQ5 5#;^0pjA$.)B)O*)L#zЏ[6V%%M'a_͙|WTAO.&;m۷s(p_s9|BZw{ƀ:.ߠ_<}h_٢.߻)kd8gYy%b i/OtL_W5Iqq>uvS:P\DS%w`ݻ,n]Wئ:8qYѲ ӄ=r|E Wao$Hx֊+X l3b_,ߪpTPo4֠@rű.ܔ&>6l;쵹.QCPo/=Pd4;.|45^lZA"U5-wnGmISA ߳4, P=" h;m@@ݠDđjKx\ÇmGV_ D6&/].U>\VڶxTqN~@a&OkM6" ~հpI |: u f Ut'JX/aHfV6l*Ẓڬ>Y?g9dOUDĝk2v+YAIs:$@ZkVl c{ ڰتv=HSA ]AAV+@P/%6{yjiZDx]W`qp@<;9+!rU Eځr1 цG2@OvjW+@{ "74hoC&>f޷`Ida7Z#7w/0QľҺ@МhqhCˢU nöCp1+QY}IENDB`nabi-nabi-1.0.1/nabi.svg000066400000000000000000000510121430012456200147570ustar00rootroot00000000000000 image/svg+xml nabi-nabi-1.0.1/po/000077500000000000000000000000001430012456200137445ustar00rootroot00000000000000nabi-nabi-1.0.1/po/.cvsignore000066400000000000000000000000701430012456200157410ustar00rootroot00000000000000*.pot *.gmo *.mo Makefile Makefile.in POTFILES stamp-po nabi-nabi-1.0.1/po/ChangeLog000066400000000000000000000010331430012456200155130ustar00rootroot000000000000002004-02-18 Choe Hwanjin * update from GNU gettext to glib gettext 2003-07-28 gettextize * Makefile.in.in: New file, from gettext-0.12.1. * Rules-quot: New file, from gettext-0.12.1. * boldquot.sed: New file, from gettext-0.12.1. * en@boldquot.header: New file, from gettext-0.12.1. * en@quot.header: New file, from gettext-0.12.1. * insert-header.sin: New file, from gettext-0.12.1. * quot.sed: New file, from gettext-0.12.1. * remove-potcdate.sin: New file, from gettext-0.12.1. nabi-nabi-1.0.1/po/LINGUAS000066400000000000000000000000061430012456200147650ustar00rootroot00000000000000de ko nabi-nabi-1.0.1/po/POTFILES.in000066400000000000000000000002071430012456200155200ustar00rootroot00000000000000src/candidate.c src/eggtrayicon.c src/fontset.c src/handler.c src/ic.c src/main.c src/server.c src/session.c src/ui.c src/preference.c nabi-nabi-1.0.1/po/de.po000066400000000000000000000224771430012456200147100ustar00rootroot00000000000000# translation of de.po to # German translation of Nabi korean input method. # Deutsche Übersetzung von Nabi, einer Eingabemethode für koreanische Zeichen # Copyright (C) YEAR Niklaus Giger # This file is distributed under the same license as the PACKAGE package. # # Choe Hwanjin , YEAR. # Niklaus Giger , 2006, 2008. msgid "" msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-01-26 17:31+0900\n" "PO-Revision-Date: 2008-03-23 18:27+0100\n" "Last-Translator: Niklaus Giger \n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" #: src/candidate.c:367 msgid "hanja" msgstr "한자/Hanja" #: src/candidate.c:374 msgid "hanja(hangul)" msgstr "Hanja (Hangul)" #: src/candidate.c:380 msgid "hangul(hanja)" msgstr "Hangul(Hanja)" #: src/eggtrayicon.c:118 msgid "Orientation" msgstr "Ausrichtung" #: src/eggtrayicon.c:119 msgid "The orientation of the tray." msgstr "Ausrichtung. der Ablage." #: src/ui.c:700 msgid "XIM Server is not running" msgstr "XIM Server (Dienst für Eingabe-Methode) läuft nicht" #: src/ui.c:711 msgid "Total" msgstr "Total" #: src/ui.c:712 msgid "Space" msgstr "Grösse" #: src/ui.c:713 msgid "BackSpace" msgstr "Zurücktaste" #: src/ui.c:714 msgid "Shift" msgstr "Grosstelltaste" #. choseong #: src/ui.c:717 msgid "Choseong" msgstr "초성/Choseong" #. jungseong #: src/ui.c:731 msgid "Jungseong" msgstr "중성/Jungseong" #. jongseong #: src/ui.c:752 msgid "Jongseong" msgstr "종성/Jongseong" #: src/ui.c:776 msgid "Nabi keypress statistics" msgstr "Tastenstatistik von Nabi" #: src/ui.c:832 msgid "About Nabi" msgstr "Über Nabi" #: src/ui.c:852 #, fuzzy, c-format msgid "" "An Easy Hangul XIM\n" "version %s\n" "\n" "Copyright (C) 2003-2011 Choe Hwanjin\n" "%s" msgstr "" "Eine einfache Eingabemethode für koreanische Zeichen\n" "Nabi ist das koreanische Wort für Schmetterling.\n" "Version %s\n" "\n" "Copyright © 2003-2008 최환진/Choe Hwanjin\n" "Deutsche Übersetzung: © 2006-2008 Niklaus Giger" #: src/ui.c:870 msgid "XIM name: " msgstr "XIM Name: " #: src/ui.c:876 msgid "Locale: " msgstr "Locale (Ländereinstellung): " #: src/ui.c:882 msgid "Encoding: " msgstr "Encoding (Eingabe-Kodierung): " #: src/ui.c:888 msgid "Connected: " msgstr "Verbunden: " #: src/ui.c:918 msgid "Keypress Statistics" msgstr "Tastaturstatistik" #. palette menu #: src/ui.c:1030 msgid "_Show palette" msgstr "Zeige Hinweis" #. hanja mode #: src/ui.c:1038 #, fuzzy msgid "_Hanja Lock" msgstr "한자/Hanja Zeichensatz" #: src/ui.c:1256 msgid "" "Can't load tray icons\n" "\n" "There are some errors on loading tray icons.\n" "Nabi will use default builtin icons and the theme will be changed to default " "value.\n" "Please change the theme settings." msgstr "" "Kann ein Icon nicht laden\n" "\n" "Es gab Fehler beim Laden der Icons für die Schaltfläche. Nabi wird deshalb " "die eingebauten Icons verwenden und das verwendete Schema wird auf die " "Vorgabe zurückgesetzt.\n" "Bitte ändern Sie das Schema." #: src/ui.c:1263 msgid "Nabi: error message" msgstr "Nabi: Fehlermeldung" #: src/ui.c:1449 #, fuzzy msgid "Hanja Lock" msgstr "한자/Hanja Zeichensatz" #: src/ui.c:1483 msgid "_Hide palette" msgstr "Hinweis ausblenden" #: src/ui.c:1659 src/ui.c:1668 #, c-format msgid "Nabi: %s" msgstr "Nabi: Zeichensatz: %s" #: src/ui.c:1671 msgid "Hangul input method: Nabi - You can input hangul using this program" msgstr "" "Hangul Eingabehilfe: Nabi - Damit können Sie koreanische Zeichen eingeben." #: src/preference.c:271 msgid "Tray icons" msgstr "Icons für die Schaltfläche" #: src/preference.c:334 #, fuzzy msgid "Use tray icon" msgstr "Icons für die Schaltfläche" #: src/preference.c:423 msgid "Hangul keyboard" msgstr "Hangul/koreanische Tastatur" #: src/preference.c:433 msgid "Use system keymap" msgstr "" #: src/preference.c:463 msgid "English keyboard" msgstr "englische Tastatur" #: src/preference.c:619 msgid "" "This key is already registered for trigger key\n" "Please select another key" msgstr "" "Diese Taste wurde schon als Umschalttaste " "gewählt.\n" "Bitte eine andere Taste auswählen." #: src/preference.c:633 msgid "" "This key is already registered for off key\n" "Please select another key" msgstr "" "Diese Taste wurde schon als Ausschalttaste " "gewählt.\n" "Bitte eine andere Taste auswählen." #: src/preference.c:647 msgid "" "This key is already registered for candidate key\n" "Please select another key" msgstr "" "Diese Taste wurde schon als Kandidatauswahltaste gewählt.\n" "Bitte eine andere Taste auswählen." #: src/preference.c:742 msgid "Trigger keys" msgstr "Umschalttasten" #: src/preference.c:764 msgid "Select trigger key" msgstr "Bitte Umschalttaste auswählen" #: src/preference.c:765 msgid "" "Press any key which you want to use as trigger key. The key you pressed is " "displayed below.\n" "If you want to use it, click \"Ok\" or click \"Cancel\"" msgstr "" "Drücken Sie irgendeine Taste, welche Sie zum Umschalten verwenden möchten. " "Die gedrückte Taste wird unten dargestellt.\n" "Falls Sie sie benutzen wollen, drücken Sie \"Ok\" oder \"Abbrechen\"" #: src/preference.c:792 msgid "* You should restart nabi to apply above option" msgstr "* Sie müssen Nabi neu starten, um diese Option zu aktivieren." #: src/preference.c:798 msgid "Off keys" msgstr "Ausschalttaste." #: src/preference.c:818 msgid "Select off key" msgstr "Bitte Ausschalttaste auswählen" #: src/preference.c:819 msgid "" "Press any key which you want to use as off key. The key you pressed is " "displayed below.\n" "If you want to use it, click \"Ok\" or click \"Cancel\"" msgstr "" "Drücken Sie irgendeine Taste, welche Sie zum Umschalten verwenden möchten. " "Die gedrückte Taste wird unten dargestellt.\n" "Falls Sie sie benutzen wollen, drücken Sie \"Ok\" oder \"Abbrechen\"" #: src/preference.c:861 msgid "Select hanja font" msgstr "Wahl 한자/Hanja Zeichensatz" #: src/preference.c:926 msgid "Hanja Font" msgstr "한자/Hanja Zeichensatz" #: src/preference.c:931 msgid "Hanja keys" msgstr "한자/Hanja Tasten" #: src/preference.c:951 msgid "Select candidate key" msgstr "Bitte \"Kandidatauswahl\" Taste auswählen" #: src/preference.c:952 msgid "" "Press any key which you want to use as candidate key. The key you pressed is " "displayed below.\n" "If you want to use it, click \"Ok\", or click \"Cancel\"" msgstr "" "Drücken Sie irgendeine Taste, welche Sie als Kandidatauswahltaste verwenden " "möchten. Die gedrückte Taste wird unten dargestellt.\n" "Falls Sie sie benutzen wollen, drücken Sie \"Ok\" oder \"Abbrechen\"" #. options for candidate option #: src/preference.c:968 msgid "Use simplified chinese" msgstr "Vereinfaches Chinesisch benutzen" #: src/preference.c:975 msgid "Hanja Options" msgstr "한자/Hanja Optionen" #. advanced #: src/preference.c:1113 src/preference.c:1471 msgid "Advanced" msgstr "Feinheiten" #: src/preference.c:1119 msgid "XIM name:" msgstr "XIM Name:" #: src/preference.c:1133 msgid "Use dynamic event flow" msgstr "Dynamischen Ereignisfluss benutzen" #: src/preference.c:1144 msgid "Commit by word" msgstr "Bestätigung nach jedem Wort" #: src/preference.c:1155 msgid "Automatic reordering" msgstr "Automatische Neuanordnung" #: src/preference.c:1166 msgid "Start in hangul mode" msgstr "" #: src/preference.c:1179 msgid "Ignore fontset information from the client" msgstr "" #: src/preference.c:1193 #, fuzzy msgid "Input mode scope: " msgstr "Auswahl des Eingabemodus" #: src/preference.c:1198 msgid "per desktop" msgstr "Pro Desktop" #: src/preference.c:1200 #, fuzzy msgid "per application" msgstr "Pro Programm" #: src/preference.c:1202 msgid "per toplevel" msgstr "Pro höchste Stufe" #: src/preference.c:1204 msgid "per context" msgstr "Pro Kontext" #: src/preference.c:1227 msgid "Preedit string font: " msgstr "" #: src/preference.c:1413 msgid "_Reset" msgstr "" #: src/preference.c:1438 msgid "Nabi Preferences" msgstr "Einstellungen von Nabi" #. icons #: src/preference.c:1450 msgid "Tray" msgstr "Schaltfläche" #. keyboard #: src/preference.c:1456 msgid "Keyboard" msgstr "Tastatur" #. key #: src/preference.c:1461 msgid "Hangul" msgstr "한글/Hangul" #. candidate #: src/preference.c:1466 msgid "Hanja" msgstr "한자/Hanja" #~ msgid "2 set" #~ msgstr "두벌식/ 2-fach belegt" #~ msgid "3 set with 2 set layout" #~ msgstr "세벌식 두벌 자판/ 3-fach belegt mit 2-fach Anordnung" #~ msgid "3 set final" #~ msgstr "세벌식 최종/ 3-fach endgültig" #~ msgid "3 set 390" #~ msgstr "세벌식 390/ 3-fach 390" #~ msgid "3 set no-shift" #~ msgstr "세벌식 순아래/ 3-fach ohne Umschalttaste" #~ msgid "3 set yetguel" #~ msgstr "세벌식 옛글/ 3-fach alte Schrift" nabi-nabi-1.0.1/po/ko.po000066400000000000000000000215721430012456200147240ustar00rootroot00000000000000# Copyright (C) 2007 Choe Hwanjin # This file is distributed under the same license as the Nabi package. # Choe Hwanjin , 2007. # msgid "" msgstr "" "Project-Id-Version: nabi 0.99.11\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-01-26 17:31+0900\n" "PO-Revision-Date: 2004-07-27 22:03+0900\n" "Last-Translator: Choe Hwanjin \n" "Language-Team: Choe Hwanjin \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/candidate.c:367 msgid "hanja" msgstr "漢字" #: src/candidate.c:374 msgid "hanja(hangul)" msgstr "漢字(한자)" #: src/candidate.c:380 msgid "hangul(hanja)" msgstr "한자(漢字)" #: src/eggtrayicon.c:118 msgid "Orientation" msgstr "" #: src/eggtrayicon.c:119 msgid "The orientation of the tray." msgstr "" #: src/ui.c:700 msgid "XIM Server is not running" msgstr "입력기 서버가 작동하지 않습니다" #: src/ui.c:711 msgid "Total" msgstr "전체" #: src/ui.c:712 msgid "Space" msgstr "스페이스" #: src/ui.c:713 msgid "BackSpace" msgstr "백스페이스" #: src/ui.c:714 msgid "Shift" msgstr "쉬프트" #. choseong #: src/ui.c:717 msgid "Choseong" msgstr "초성" #. jungseong #: src/ui.c:731 msgid "Jungseong" msgstr "중성" #. jongseong #: src/ui.c:752 msgid "Jongseong" msgstr "종성" #: src/ui.c:776 msgid "Nabi keypress statistics" msgstr "키입력 통계" #: src/ui.c:832 msgid "About Nabi" msgstr "Nabi에 대해서" #: src/ui.c:852 #, c-format msgid "" "An Easy Hangul XIM\n" "version %s\n" "\n" "Copyright (C) 2003-2011 Choe Hwanjin\n" "%s" msgstr "" "쉬운 한글 입력기\n" "버젼 %s\n" "\n" "Copyright (C) 2003-2011 최환진\n" "%s" #: src/ui.c:870 msgid "XIM name: " msgstr "XIM 이름: " #: src/ui.c:876 msgid "Locale: " msgstr "로캘: " #: src/ui.c:882 msgid "Encoding: " msgstr "인코딩: " #: src/ui.c:888 msgid "Connected: " msgstr "연결된 수: " #: src/ui.c:918 msgid "Keypress Statistics" msgstr "키입력 통계" #. palette menu #: src/ui.c:1030 msgid "_Show palette" msgstr "팔레트 보이기(_S)" #. hanja mode #: src/ui.c:1038 msgid "_Hanja Lock" msgstr "한자 전용(_H)" #: src/ui.c:1256 msgid "" "Can't load tray icons\n" "\n" "There are some errors on loading tray icons.\n" "Nabi will use default builtin icons and the theme will be changed to default " "value.\n" "Please change the theme settings." msgstr "" "상태 아이콘을 로딩할 수 없습니다\n" "\n" "상태 아이콘을 로딩하는데 오류가 있습니다.\n" "내장 아이콘을 사용하겠습니다. 테마는 기본값으로 바뀌게 됩니다.\n" "테마 설정을 바꿔주시기 바랍니다." #: src/ui.c:1263 msgid "Nabi: error message" msgstr "나비: 오류 메시지" #: src/ui.c:1449 msgid "Hanja Lock" msgstr "한자 전용" #: src/ui.c:1483 msgid "_Hide palette" msgstr "팔레트 숨기기(_H)" #: src/ui.c:1659 src/ui.c:1668 #, c-format msgid "Nabi: %s" msgstr "나비: %s" #: src/ui.c:1671 msgid "Hangul input method: Nabi - You can input hangul using this program" msgstr "한글 입력기: 나비 - 이 프로그램으로 한글을 입력할 수 있습니다" #: src/preference.c:271 msgid "Tray icons" msgstr "상태 아이콘" #: src/preference.c:334 msgid "Use tray icon" msgstr "알림 영역 아이콘 사용" #: src/preference.c:423 msgid "Hangul keyboard" msgstr "한글 자판" #: src/preference.c:433 msgid "Use system keymap" msgstr "시스템 키맵 사용" #: src/preference.c:463 msgid "English keyboard" msgstr "영어 자판" #: src/preference.c:619 msgid "" "This key is already registered for trigger key\n" "Please select another key" msgstr "" "이 키는 이미 한영 전환키로 등록되어 있습니다.\n" "다른 키를 선택해 주십시오" #: src/preference.c:633 msgid "" "This key is already registered for off key\n" "Please select another key" msgstr "" "이 키는 이미 영어 전환키로 등록되어 있습니다.\n" "다른 키를 선택해 주십시오" #: src/preference.c:647 msgid "" "This key is already registered for candidate key\n" "Please select another key" msgstr "" "이 키는 이미 한자 변환키로 등록되어 있습니다.\n" "다른 키를 선택해 주십시오" #: src/preference.c:742 msgid "Trigger keys" msgstr "한영 전환키" #: src/preference.c:764 msgid "Select trigger key" msgstr "한영 전환키를 선택합니다" #: src/preference.c:765 msgid "" "Press any key which you want to use as trigger key. The key you pressed is " "displayed below.\n" "If you want to use it, click \"Ok\" or click \"Cancel\"" msgstr "" "한영 전환키로 사용할 키를 누르시면 아래쪽에 누른 키가 표시 됩니다.\n" "그 키를 한영 전환키로 사용하시려면 \"확인\"을 누르시고 아니면 \"취소\"를 누르" "십시오." #: src/preference.c:792 msgid "* You should restart nabi to apply above option" msgstr "※ 위 옵션은 나비를 다시 시작해야 적용됩니다" #: src/preference.c:798 msgid "Off keys" msgstr "영어 전환키" #: src/preference.c:818 msgid "Select off key" msgstr "영어 전환키를 선택합니다" #: src/preference.c:819 msgid "" "Press any key which you want to use as off key. The key you pressed is " "displayed below.\n" "If you want to use it, click \"Ok\" or click \"Cancel\"" msgstr "" "영어 전환키로 사용할 키를 누르시면 아래쪽에 누른 키가 표시 됩니다.\n" "그 키를 영어 전환키로 사용하시려면 \"확인\"을 누르시고 아니면 \"취소\"를 누르" "십시오." #: src/preference.c:861 msgid "Select hanja font" msgstr "한자 선택창에 쓸 글꼴을 선택하십시오" #: src/preference.c:926 msgid "Hanja Font" msgstr "한자 글꼴" #: src/preference.c:931 msgid "Hanja keys" msgstr "한자 변환키" #: src/preference.c:951 msgid "Select candidate key" msgstr "한자 변환키를 선택합니다" #: src/preference.c:952 msgid "" "Press any key which you want to use as candidate key. The key you pressed is " "displayed below.\n" "If you want to use it, click \"Ok\", or click \"Cancel\"" msgstr "" "한자 변환키로 사용할 키를 누르시면 아래쪽에 누른 키가 표시 됩니다.\n" "그 키를 한자 변환키로 사용하시려면 \"확인\"을 누르시고 아니면 \"취소\"를 누르" "십시오." #. options for candidate option #: src/preference.c:968 msgid "Use simplified chinese" msgstr "간체자로 입력" #: src/preference.c:975 msgid "Hanja Options" msgstr "한자 옵션" #. advanced #: src/preference.c:1113 src/preference.c:1471 msgid "Advanced" msgstr "고급" #: src/preference.c:1119 msgid "XIM name:" msgstr "XIM 이름:" #: src/preference.c:1133 msgid "Use dynamic event flow" msgstr "다이나믹 이벤트 처리 사용" #: src/preference.c:1144 msgid "Commit by word" msgstr "단어 단위로 입력" #: src/preference.c:1155 msgid "Automatic reordering" msgstr "자동 순서 교정" #: src/preference.c:1166 msgid "Start in hangul mode" msgstr "시작할때 한글 상태로" #: src/preference.c:1179 msgid "Ignore fontset information from the client" msgstr "프로그램의 폰트셋 정보를 무시함" #: src/preference.c:1193 msgid "Input mode scope: " msgstr "입력 상태 관리: " #: src/preference.c:1198 msgid "per desktop" msgstr "데스크탑 마다 따로" #: src/preference.c:1200 msgid "per application" msgstr "프로그램마다 따로" #: src/preference.c:1202 msgid "per toplevel" msgstr "윈도우마다 따로" #: src/preference.c:1204 msgid "per context" msgstr "입력창마다 따로" #: src/preference.c:1227 msgid "Preedit string font: " msgstr "입력 중인 글자 글꼴: " #: src/preference.c:1413 msgid "_Reset" msgstr "초기값으로(_R)" #: src/preference.c:1438 msgid "Nabi Preferences" msgstr "나비 설정" #. icons #: src/preference.c:1450 msgid "Tray" msgstr "트레이" #. keyboard #: src/preference.c:1456 msgid "Keyboard" msgstr "자판" #. key #: src/preference.c:1461 msgid "Hangul" msgstr "한글" #. candidate #: src/preference.c:1466 msgid "Hanja" msgstr "한자" #~ msgid "2 set" #~ msgstr "두벌식" #~ msgid "3 set with 2 set layout" #~ msgstr "세벌식 두벌 자판" #~ msgid "3 set final" #~ msgstr "세벌식 최종" #~ msgid "3 set 390" #~ msgstr "세벌식 390" #~ msgid "3 set no-shift" #~ msgstr "세벌식 순아래" #~ msgid "3 set yetguel" #~ msgstr "세벌식 옛글" #~ msgid "Romaja" #~ msgstr "로마자" nabi-nabi-1.0.1/src/000077500000000000000000000000001430012456200141155ustar00rootroot00000000000000nabi-nabi-1.0.1/src/.cvsignore000066400000000000000000000000441430012456200161130ustar00rootroot00000000000000.deps Makefile Makefile.in nabi *.o nabi-nabi-1.0.1/src/Makefile.am000066400000000000000000000014161430012456200161530ustar00rootroot00000000000000 bin_PROGRAMS = nabi nabi_CFLAGS = \ $(X_CFLAGS) \ $(GTK_CFLAGS) \ $(LIBHANGUL_CFLAGS) \ -DLOCALEDIR=\"$(localedir)\" \ -DNABI_DATA_DIR=\"$(NABI_DATA_DIR)\" \ -DNABI_THEMES_DIR=\"$(NABI_THEMES_DIR)\" nabi_SOURCES = \ nabi.h \ gettext.h \ xim_protocol.h \ default-icons.h \ debug.h debug.c \ server.h server.c \ ic.h ic.c \ fontset.h fontset.c \ eggtrayicon.h eggtrayicon.c \ session.h session.c \ candidate.h candidate.c \ keycapturedialog.h keycapturedialog.c \ conf.h conf.c \ handler.c \ ui.c \ preference.h preference.c \ handlebox.h handlebox.c \ sctc.h util.h util.c \ ustring.h ustring.c \ keyboard-layout.h keyboard-layout.c \ main.c nabi_LDADD = \ ../IMdkit/libXimd.a \ $(GTK_LIBS) \ $(X_LIBS) \ $(X_PRE_LIBS) \ -lX11 \ $(LIBHANGUL_LIBS) nabi-nabi-1.0.1/src/candidate.c000066400000000000000000000424071430012456200162040ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2009 Choe Hwanjin * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include "debug.h" #include "server.h" #include "candidate.h" #include "gettext.h" #include "util.h" #include "nabi.h" enum { COLUMN_INDEX, COLUMN_CHARACTER, COLUMN_COMMENT, NO_OF_COLUMNS }; static void nabi_candidate_on_format(GtkWidget* widget, gpointer data) { if (data != NULL && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { if (strcmp(nabi->config->candidate_format->str, (const char*)data) != 0) { g_string_assign(nabi->config->candidate_format, (const char*)data); nabi_log(4, "candidate_format_changed: %s\n", nabi->config->candidate_format->str); } } } static void nabi_candidate_on_row_activated(GtkWidget *widget, GtkTreePath *path, GtkTreeViewColumn *column, NabiCandidate *candidate) { const Hanja* hanja; if (path != NULL) { int *indices; indices = gtk_tree_path_get_indices(path); candidate->current = candidate->first + indices[0]; } hanja = nabi_candidate_get_current(candidate); if (hanja != NULL && candidate->commit != NULL && candidate->commit_data != NULL) candidate->commit(candidate, hanja, candidate->commit_data); } static void nabi_candidate_on_cursor_changed(GtkWidget *widget, NabiCandidate *candidate) { GtkTreePath *path; gtk_tree_view_get_cursor(GTK_TREE_VIEW(widget), &path, NULL); if (path != NULL) { int *indices; indices = gtk_tree_path_get_indices(path); candidate->current = candidate->first + indices[0]; gtk_tree_path_free(path); } } static void nabi_candidate_on_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data) { GtkStyle *style; GtkAllocation alloc; style = gtk_widget_get_style(widget); alloc = GTK_WIDGET(widget)->allocation; gdk_draw_rectangle(widget->window, style->black_gc, FALSE, 0, 0, alloc.width - 1, alloc.height - 1); } static gboolean nabi_candidate_on_key_press(GtkWidget *widget, GdkEventKey *event, NabiCandidate *candidate) { const Hanja* hanja = NULL; if (candidate == NULL) return FALSE; switch (event->keyval) { case GDK_Up: case GDK_k: nabi_candidate_prev(candidate); break; case GDK_Down: case GDK_j: nabi_candidate_next(candidate); break; case GDK_Left: case GDK_h: case GDK_Page_Up: case GDK_BackSpace: case GDK_KP_Subtract: nabi_candidate_prev_page(candidate); break; case GDK_Right: case GDK_l: case GDK_space: case GDK_Page_Down: case GDK_KP_Add: case GDK_Tab: nabi_candidate_next_page(candidate); break; case GDK_Escape: nabi_candidate_delete(candidate); candidate = NULL; break; case GDK_Return: case GDK_KP_Enter: hanja = nabi_candidate_get_current(candidate); break; case GDK_0: hanja = nabi_candidate_get_nth(candidate, 9); break; case GDK_1: case GDK_2: case GDK_3: case GDK_4: case GDK_5: case GDK_6: case GDK_7: case GDK_8: case GDK_9: hanja = nabi_candidate_get_nth(candidate, event->keyval - GDK_1); break; case GDK_KP_0: hanja = nabi_candidate_get_nth(candidate, 9); break; case GDK_KP_1: case GDK_KP_2: case GDK_KP_3: case GDK_KP_4: case GDK_KP_5: case GDK_KP_6: case GDK_KP_7: case GDK_KP_8: case GDK_KP_9: hanja = nabi_candidate_get_nth(candidate, event->keyval - GDK_KP_1); break; case GDK_KP_End: hanja = nabi_candidate_get_nth(candidate, 0); break; case GDK_KP_Down: hanja = nabi_candidate_get_nth(candidate, 1); break; case GDK_KP_Next: hanja = nabi_candidate_get_nth(candidate, 2); break; case GDK_KP_Left: hanja = nabi_candidate_get_nth(candidate, 3); break; case GDK_KP_Begin: hanja = nabi_candidate_get_nth(candidate, 4); break; case GDK_KP_Right: hanja = nabi_candidate_get_nth(candidate, 5); break; case GDK_KP_Home: hanja = nabi_candidate_get_nth(candidate, 6); break; case GDK_KP_Up: hanja = nabi_candidate_get_nth(candidate, 7); break; case GDK_KP_Prior: hanja = nabi_candidate_get_nth(candidate, 8); break; case GDK_KP_Insert: hanja = nabi_candidate_get_nth(candidate, 9); break; default: return FALSE; } if (hanja != NULL) { if (candidate->commit != NULL) candidate->commit(candidate, hanja, candidate->commit_data); } return TRUE; } static gboolean nabi_candidate_on_scroll(GtkWidget *widget, GdkEventScroll *event, NabiCandidate *candidate) { if (candidate == NULL) return FALSE; switch (event->direction) { case GDK_SCROLL_UP: nabi_candidate_prev_page(candidate); break; case GDK_SCROLL_DOWN: nabi_candidate_next_page(candidate); break; default: return FALSE; } return TRUE; } static void nabi_candidate_update_cursor(NabiCandidate *candidate) { GtkTreePath *path; if (candidate->treeview == NULL) return; path = gtk_tree_path_new_from_indices(candidate->current - candidate->first, -1); gtk_tree_view_set_cursor(GTK_TREE_VIEW(candidate->treeview), path, NULL, FALSE); gtk_tree_path_free(path); } /* keep the whole window on screen */ static void nabi_candidate_set_window_position(NabiCandidate *candidate) { Window root; Window child; int x = 0, y = 0; unsigned int width = 0, height = 0, border = 0, depth = 0; int absx = 0; int absy = 0; int root_w, root_h, cand_w, cand_h; GtkRequisition requisition; if (candidate == NULL || candidate->parent == 0 || candidate->window == NULL) return; /* move candidate window to focus window below */ XGetGeometry(nabi_server->display, candidate->parent, &root, &x, &y, &width, &height, &border, &depth); XTranslateCoordinates(nabi_server->display, candidate->parent, root, 0, 0, &absx, &absy, &child); root_w = gdk_screen_width(); root_h = gdk_screen_height(); gtk_widget_size_request(GTK_WIDGET(candidate->window), &requisition); cand_w = requisition.width; cand_h = requisition.height; absx += width; /* absy += height; */ if (absy + cand_h > root_h) absy = root_h - cand_h; if (absx + cand_w > root_w) absx = root_w - cand_w; gtk_window_move(GTK_WINDOW(candidate->window), absx, absy); } static void nabi_candidate_update_list(NabiCandidate *candidate) { int i; GtkTreeIter iter; gtk_list_store_clear(candidate->store); for (i = 0; i < candidate->n_per_page && candidate->first + i < candidate->n; i++) { const Hanja* hanja = candidate->data[candidate->first + i]; const char* value = hanja_get_value(hanja); const char* comment = hanja_get_comment(hanja); char* candidate_str; if (nabi_server->use_simplified_chinese) { candidate_str = nabi_traditional_to_simplified(value); } else { candidate_str = g_strdup(value); } gtk_list_store_append(candidate->store, &iter); gtk_list_store_set(candidate->store, &iter, COLUMN_INDEX, (i + 1) % 10, COLUMN_CHARACTER, candidate_str, COLUMN_COMMENT, comment, -1); g_free(candidate_str); } nabi_candidate_set_window_position(candidate); } static void nabi_candidate_on_treeview_realize(GtkWidget* widget, gpointer data) { gtk_widget_modify_fg (widget, GTK_STATE_ACTIVE, &widget->style->fg[GTK_STATE_SELECTED]); gtk_widget_modify_bg (widget, GTK_STATE_ACTIVE, &widget->style->bg[GTK_STATE_SELECTED]); gtk_widget_modify_text(widget, GTK_STATE_ACTIVE, &widget->style->text[GTK_STATE_SELECTED]); gtk_widget_modify_base(widget, GTK_STATE_ACTIVE, &widget->style->base[GTK_STATE_SELECTED]); } static void nabi_candidate_create_window(NabiCandidate *candidate) { GtkWidget *frame; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *label; GtkWidget *button; GtkWidget *treeview; GtkTreeViewColumn *column; GtkCellRenderer *renderer; candidate->window = gtk_window_new(GTK_WINDOW_POPUP); nabi_candidate_update_list(candidate); frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT); gtk_container_add(GTK_CONTAINER(candidate->window), frame); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(frame), vbox); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); label = GTK_WIDGET(candidate->label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 6); button = gtk_radio_button_new_with_label(NULL, _("hanja")); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, TRUE, 6); if (strcmp(nabi->config->candidate_format->str, "hanja") == 0) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(nabi_candidate_on_format), "hanja"); button = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(button), _("hanja(hangul)")); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, TRUE, 6); if (strcmp(nabi->config->candidate_format->str, "hanja(hangul)") == 0) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(nabi_candidate_on_format), "hanja(hangul)"); button = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(button), _("hangul(hanja)")); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, TRUE, 6); if (strcmp(nabi->config->candidate_format->str, "hangul(hanja)") == 0) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(nabi_candidate_on_format), "hangul(hanja)"); treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(candidate->store)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); gtk_box_pack_start(GTK_BOX(vbox), treeview, TRUE, TRUE, 0); candidate->treeview = treeview; g_object_unref(candidate->store); /* number column */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("No", renderer, "text", COLUMN_INDEX, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); /* character column */ renderer = gtk_cell_renderer_text_new(); if (nabi_server->candidate_font != NULL) g_object_set(renderer, "font-desc", nabi_server->candidate_font, NULL); column = gtk_tree_view_column_new_with_attributes("Character", renderer, "text", COLUMN_CHARACTER, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); /* comment column */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("Comment", renderer, "text", COLUMN_COMMENT, NULL); if (gtk_major_version > 2 || (gtk_major_version == 2 && gtk_minor_version >= 8)) { gint wrap_width = 250; g_object_set(G_OBJECT(renderer), "wrap-mode", PANGO_WRAP_WORD_CHAR, "wrap-width", wrap_width, NULL); } gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); nabi_candidate_update_cursor(candidate); g_signal_connect(G_OBJECT(treeview), "row-activated", G_CALLBACK(nabi_candidate_on_row_activated), candidate); g_signal_connect(G_OBJECT(treeview), "cursor-changed", G_CALLBACK(nabi_candidate_on_cursor_changed), candidate); // candidate window는 포커스가 없는 윈도우이므로 treeview에는 // focus가 없는 상태가 되어서 select가 되지 않는다. // 그런데 테마에 따라서 active 색상이 normal 색상과 같은 것들이 있다. // 그런 경우에는 active 상태인 row가 normal과 같이 그려지므로 // 구분이 되지 않는다. 즉 선택된 candidate가 구분이 안되는 경우가 // 있다는 것이다. // 그런 경우를 피하기 위해서 realize된 후(style이 attach된 후) // style을 modify해서 active인 것이 select 된 것과 동일하게 그려지도록 // 처리한다. g_signal_connect_after(G_OBJECT(treeview), "realize", G_CALLBACK(nabi_candidate_on_treeview_realize), NULL); g_signal_connect(G_OBJECT(candidate->window), "key-press-event", G_CALLBACK(nabi_candidate_on_key_press), candidate); g_signal_connect(G_OBJECT(candidate->window), "scroll-event", G_CALLBACK(nabi_candidate_on_scroll), candidate); g_signal_connect_after(G_OBJECT(candidate->window), "expose-event", G_CALLBACK(nabi_candidate_on_expose), candidate); g_signal_connect_swapped(G_OBJECT(candidate->window), "realize", G_CALLBACK(nabi_candidate_set_window_position), candidate); gtk_widget_show_all(candidate->window); gtk_grab_add(candidate->window); } NabiCandidate* nabi_candidate_new(const char *label_str, int n_per_page, HanjaList *list, const Hanja **valid_list, int valid_list_length, Window parent, NabiCandidateCommitFunc commit, gpointer commit_data) { NabiCandidate *candidate; candidate = (NabiCandidate*)g_malloc(sizeof(NabiCandidate)); candidate->first = 0; candidate->current = 0; candidate->n_per_page = n_per_page; candidate->n = 0; candidate->data = NULL; candidate->parent = parent; candidate->label = GTK_LABEL(gtk_label_new(label_str)); candidate->store = NULL; candidate->treeview = NULL; candidate->commit = commit; candidate->commit_data = commit_data; candidate->hanja_list = list; candidate->data = valid_list; candidate->n = valid_list_length; candidate->store = gtk_list_store_new(NO_OF_COLUMNS, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING); if (n_per_page == 0) candidate->n_per_page = candidate->n; nabi_candidate_create_window(candidate); nabi_candidate_update_cursor(candidate); return candidate; } void nabi_candidate_prev(NabiCandidate *candidate) { if (candidate == NULL) return; if (candidate->current > 0) candidate->current--; if (candidate->current < candidate->first) { candidate->first -= candidate->n_per_page; nabi_candidate_update_list(candidate); } nabi_candidate_update_cursor(candidate); } void nabi_candidate_next(NabiCandidate *candidate) { if (candidate == NULL) return; if (candidate->current < candidate->n - 1) candidate->current++; if (candidate->current >= candidate->first + candidate->n_per_page) { candidate->first += candidate->n_per_page; nabi_candidate_update_list(candidate); } nabi_candidate_update_cursor(candidate); } void nabi_candidate_prev_page(NabiCandidate *candidate) { if (candidate == NULL) return; if (candidate->first - candidate->n_per_page >= 0) { candidate->current -= candidate->n_per_page; if (candidate->current < 0) candidate->current = 0; candidate->first -= candidate->n_per_page; nabi_candidate_update_list(candidate); } nabi_candidate_update_cursor(candidate); } void nabi_candidate_next_page(NabiCandidate *candidate) { if (candidate == NULL) return; if (candidate->first + candidate->n_per_page < candidate->n) { candidate->current += candidate->n_per_page; if (candidate->current > candidate->n - 1) candidate->current = candidate->n - 1; candidate->first += candidate->n_per_page; nabi_candidate_update_list(candidate); } nabi_candidate_update_cursor(candidate); } const Hanja* nabi_candidate_get_current(NabiCandidate *candidate) { if (candidate == NULL) return 0; return candidate->data[candidate->current]; } const Hanja* nabi_candidate_get_nth(NabiCandidate *candidate, int n) { if (candidate == NULL) return 0; n += candidate->first; if (n < 0 && n >= candidate->n) return 0; candidate->current = n; return candidate->data[n]; } void nabi_candidate_delete(NabiCandidate *candidate) { if (candidate == NULL) return; hanja_list_delete(candidate->hanja_list); gtk_grab_remove(candidate->window); gtk_widget_destroy(candidate->window); g_free(candidate->data); g_free(candidate); } void nabi_candidate_set_hanja_list(NabiCandidate *candidate, HanjaList* list, const Hanja** valid_list, int valid_list_length) { const char* label; if (candidate == NULL) return; if (list == NULL) return; hanja_list_delete(candidate->hanja_list); g_free(candidate->data); candidate->hanja_list = list; candidate->data = valid_list; candidate->n = valid_list_length; candidate->current = 0; label = hanja_list_get_key(list); gtk_label_set_label(candidate->label, label); nabi_candidate_update_list(candidate); nabi_candidate_update_cursor(candidate); } nabi-nabi-1.0.1/src/candidate.h000066400000000000000000000047251430012456200162120ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2009 Choe Hwanjin * * 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 */ #ifndef _NABICANDIDATE_H_ #define _NABICANDIDATE_H_ #include #include #include typedef struct _NabiCandidate NabiCandidate; typedef void (*NabiCandidateCommitFunc)(NabiCandidate*, const Hanja*, gpointer); struct _NabiCandidate { GtkWidget *window; Window parent; GtkLabel *label; GtkListStore *store; GtkWidget *treeview; const Hanja **data; NabiCandidateCommitFunc commit; gpointer commit_data; int first; int n; int n_per_page; int current; HanjaList *hanja_list; }; NabiCandidate* nabi_candidate_new(const char *label_str, int n_per_page, HanjaList* list, const Hanja** valid_list, int valid_list_length, Window parent, NabiCandidateCommitFunc commit, gpointer commit_data); void nabi_candidate_prev(NabiCandidate *candidate); void nabi_candidate_next(NabiCandidate *candidate); void nabi_candidate_prev_row(NabiCandidate *candidate); void nabi_candidate_next_row(NabiCandidate *candidate); void nabi_candidate_prev_page(NabiCandidate *candidate); void nabi_candidate_next_page(NabiCandidate *candidate); const Hanja* nabi_candidate_get_current(NabiCandidate *candidate); const Hanja* nabi_candidate_get_nth(NabiCandidate *candidate, int n); void nabi_candidate_delete(NabiCandidate *candidate); void nabi_candidate_set_hanja_list(NabiCandidate *candidate, HanjaList* list, const Hanja** valid_list, int valid_list_length); #endif /* _NABICANDIDATE_H_ */ nabi-nabi-1.0.1/src/conf.c000066400000000000000000000236741430012456200152220ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2007-2009 Choe Hwanjin * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include "debug.h" #include "gettext.h" #include "conf.h" enum { CONFIG_BOOL, CONFIG_INT, CONFIG_STR }; struct config_item { gchar* key; gint type; guint offset; }; #define OFFSET(member) offsetof(NabiConfig, member) const static struct config_item config_items[] = { { "xim_name", CONFIG_STR, OFFSET(xim_name) }, { "x", CONFIG_INT, OFFSET(x) }, { "y", CONFIG_INT, OFFSET(y) }, { "show_palette", CONFIG_BOOL, OFFSET(show_palette) }, { "palette_height", CONFIG_INT, OFFSET(palette_height) }, { "use_tray_icon", CONFIG_BOOL, OFFSET(use_tray_icon) }, { "theme", CONFIG_STR, OFFSET(theme) }, { "hangul_keyboard", CONFIG_STR, OFFSET(hangul_keyboard) }, { "latin_keyboard", CONFIG_STR, OFFSET(latin_keyboard) }, { "keyboard_layouts", CONFIG_STR, OFFSET(keyboard_layouts_file) }, { "triggerkeys", CONFIG_STR, OFFSET(trigger_keys) }, { "offkeys", CONFIG_STR, OFFSET(off_keys) }, { "candidatekeys", CONFIG_STR, OFFSET(candidate_keys) }, { "output_mode", CONFIG_STR, OFFSET(output_mode) }, { "default_input_mode", CONFIG_STR, OFFSET(default_input_mode) }, { "input_mode_scope", CONFIG_STR, OFFSET(input_mode_scope) }, { "preedit_font", CONFIG_STR, OFFSET(preedit_font) }, { "preedit_foreground", CONFIG_STR, OFFSET(preedit_fg) }, { "preedit_background", CONFIG_STR, OFFSET(preedit_bg) }, { "candidate_font", CONFIG_STR, OFFSET(candidate_font) }, { "candidate_format", CONFIG_STR, OFFSET(candidate_format) }, { "dynamic_event_flow", CONFIG_BOOL, OFFSET(use_dynamic_event_flow) }, { "commit_by_word", CONFIG_BOOL, OFFSET(commit_by_word) }, { "auto_reorder", CONFIG_BOOL, OFFSET(auto_reorder) }, { "use_simplified_chinese", CONFIG_BOOL, OFFSET(use_simplified_chinese) }, { "hanja_mode", CONFIG_BOOL, OFFSET(hanja_mode) }, { "ignore_app_fontset", CONFIG_BOOL, OFFSET(ignore_app_fontset) }, { "use_system_keymap", CONFIG_BOOL, OFFSET(use_system_keymap) }, { NULL, 0, 0 } }; static inline gboolean* nabi_config_get_bool(NabiConfig* config, size_t offset) { return (gboolean*)((char*)(config) + offset); } static inline int* nabi_config_get_int(NabiConfig* config, size_t offset) { return (int*)((char*)(config) + offset); } static inline GString** nabi_config_get_str(NabiConfig* config, size_t offset) { return (GString**)((char*)(config) + offset); } static void nabi_config_set_bool(NabiConfig* config, guint offset, gchar* value) { if (value != NULL) { gboolean *member = nabi_config_get_bool(config, offset); if (g_ascii_strcasecmp(value, "true") == 0) { *member = TRUE; } else { *member = FALSE; } } } static void nabi_config_set_int(NabiConfig* config, guint offset, gchar* value) { if (value != NULL) { int *member = nabi_config_get_int(config, offset); *member = strtol(value, NULL, 10); } } static void nabi_config_set_str(NabiConfig* config, guint offset, gchar* value) { GString **member = nabi_config_get_str(config, offset); if (value == NULL) g_string_assign(*member, ""); else g_string_assign(*member, value); } static void nabi_config_write_bool(NabiConfig* config, FILE* file, gchar* key, guint offset) { gboolean *member = nabi_config_get_bool(config, offset); if (*member) fprintf(file, "%s=%s\n", key, "true"); else fprintf(file, "%s=%s\n", key, "false"); } static void nabi_config_write_int(NabiConfig* config, FILE* file, gchar* key, guint offset) { int *member = nabi_config_get_int(config, offset); fprintf(file, "%s=%d\n", key, *member); } static void nabi_config_write_str(NabiConfig* config, FILE* file, gchar* key, guint offset) { GString **member = nabi_config_get_str(config, offset); if (*member != NULL) fprintf(file, "%s=%s\n", key, (*member)->str); } static void nabi_config_load_item(NabiConfig* config, gchar* key, gchar* value) { gint i; for (i = 0; config_items[i].key != NULL; i++) { if (strcmp(key, config_items[i].key) == 0) { switch (config_items[i].type) { case CONFIG_BOOL: nabi_config_set_bool(config, config_items[i].offset, value); break; case CONFIG_INT: nabi_config_set_int(config, config_items[i].offset, value); break; case CONFIG_STR: nabi_config_set_str(config, config_items[i].offset, value); break; default: break; } } } } NabiConfig* nabi_config_new() { NabiConfig* config = g_new(NabiConfig, 1); /* set default values */ config->x = 0; config->y = 0; config->show_palette = FALSE; config->palette_height = 24; config->use_tray_icon = TRUE; config->xim_name = g_string_new(PACKAGE); config->theme = g_string_new(DEFAULT_THEME); config->hangul_keyboard = g_string_new(DEFAULT_KEYBOARD); config->latin_keyboard = g_string_new("none"); config->keyboard_layouts_file = g_string_new("keyboard_layouts"); config->trigger_keys = g_string_new("Hangul,Shift+space"); config->off_keys = g_string_new("Escape"); config->candidate_keys = g_string_new("Hangul_Hanja,F9"); config->candidate_font = g_string_new("Sans 14"); config->candidate_format = g_string_new("hanja"); config->output_mode = g_string_new("syllable"); config->default_input_mode = g_string_new("direct"); config->input_mode_scope = g_string_new("per_toplevel"); config->preedit_font = g_string_new("Sans 9"); config->preedit_fg = g_string_new("#000000"); config->preedit_bg = g_string_new("#FFFFFF"); config->use_dynamic_event_flow = TRUE; config->commit_by_word = FALSE; config->auto_reorder = TRUE; config->hanja_mode = FALSE; config->use_simplified_chinese = FALSE; config->ignore_app_fontset = FALSE; config->use_system_keymap = FALSE; return config; } void nabi_config_delete(NabiConfig* config) { g_string_free(config->xim_name, TRUE); g_string_free(config->theme, TRUE); g_string_free(config->hangul_keyboard, TRUE); g_string_free(config->latin_keyboard, TRUE); g_string_free(config->keyboard_layouts_file, TRUE); g_string_free(config->trigger_keys, TRUE); g_string_free(config->off_keys, TRUE); g_string_free(config->candidate_keys, TRUE); g_string_free(config->output_mode, TRUE); g_string_free(config->default_input_mode, TRUE); g_string_free(config->input_mode_scope, TRUE); g_string_free(config->preedit_font, TRUE); g_string_free(config->preedit_fg, TRUE); g_string_free(config->preedit_bg, TRUE); g_string_free(config->candidate_font, TRUE); g_string_free(config->candidate_format, TRUE); g_free(config); } void nabi_config_load(NabiConfig* config) { gchar *line, *saved_position; gchar *key, *value; const gchar* homedir; gchar* config_filename; gchar buf[256]; FILE *file; /* load conf file */ homedir = g_get_home_dir(); config_filename = g_build_filename(homedir, ".nabi", "config", NULL); file = fopen(config_filename, "r"); if (file == NULL) { nabi_log(1, "Can't open config file: %s\n", config_filename); return; } for (line = fgets(buf, sizeof(buf), file); line != NULL; line = fgets(buf, sizeof(buf), file)) { key = strtok_r(line, " =\t\n", &saved_position); value = strtok_r(NULL, "\r\n", &saved_position); if (key == NULL) continue; nabi_config_load_item(config, key, value); } fclose(file); g_free(config_filename); } void nabi_config_save(NabiConfig* config) { gint i; const gchar* homedir; gchar* config_dir; gchar* config_filename; FILE *file; homedir = g_get_home_dir(); config_dir = g_build_filename(homedir, ".nabi", NULL); /* chech for nabi conf dir */ if (!g_file_test(config_dir, G_FILE_TEST_EXISTS)) { int ret; /* we make conf dir */ ret = mkdir(config_dir, S_IRUSR | S_IWUSR | S_IXUSR); if (ret != 0) { perror("nabi"); } } config_filename = g_build_filename(config_dir, "config", NULL); file = fopen(config_filename, "w"); if (file == NULL) { nabi_log(1, "Can't write config file: %s\n", config_filename); return; } for (i = 0; config_items[i].key != NULL; i++) { switch (config_items[i].type) { case CONFIG_BOOL: nabi_config_write_bool(config, file, config_items[i].key, config_items[i].offset); break; case CONFIG_INT: nabi_config_write_int(config, file, config_items[i].key, config_items[i].offset); break; case CONFIG_STR: nabi_config_write_str(config, file, config_items[i].key, config_items[i].offset); break; default: break; } } fclose(file); g_free(config_dir); g_free(config_filename); } nabi-nabi-1.0.1/src/conf.h000066400000000000000000000042701430012456200152160ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2007-2009 Choe Hwanjin * * 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 */ #ifndef nabi_conf_h #define nabi_conf_h #include typedef struct _NabiConfig NabiConfig; struct _NabiConfig { gint x; gint y; GString* theme; gint palette_height; gboolean show_palette; gboolean use_tray_icon; GString* trigger_keys; GString* off_keys; GString* candidate_keys; /* keyboard option */ GString* hangul_keyboard; GString* latin_keyboard; GString* keyboard_layouts_file; /* xim server option */ GString* xim_name; GString* output_mode; GString* default_input_mode; GString* input_mode_scope; gboolean use_dynamic_event_flow; gboolean commit_by_word; gboolean auto_reorder; gboolean use_simplified_chinese; gboolean hanja_mode; gboolean ignore_app_fontset; gboolean use_system_keymap; /* candidate options */ GString* candidate_font; GString* candidate_format; /* preedit attribute */ GString* preedit_font; GString* preedit_fg; GString* preedit_bg; }; NabiConfig* nabi_config_new(); void nabi_config_delete(NabiConfig* config); void nabi_config_load(NabiConfig* config); void nabi_config_save(NabiConfig* config); #endif /* nabi_config_h */ nabi-nabi-1.0.1/src/debug.c000066400000000000000000000030171430012456200153500ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2007-2008 Choe Hwanjin * * 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 */ #include #include #include #include "debug.h" static FILE* output_device = NULL; static int log_level = 0; void nabi_log_set_level(int level) { log_level = level; } int nabi_log_get_level(void) { return log_level; } void nabi_log_set_device(const char* device) { if (strcmp(device, "stdout") == 0) { output_device = stdout; } else if (strcmp(device, "stderr") == 0) { output_device = stderr; } } void nabi_log(int level, const char* format, ...) { if (output_device == NULL) return; if (level <= log_level) { va_list ap; fprintf(output_device, "Nabi(%d): ", level); va_start(ap, format); vfprintf(output_device, format, ap); va_end(ap); fflush(output_device); } } nabi-nabi-1.0.1/src/debug.h000066400000000000000000000020161430012456200153530ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2007-2008 Choe Hwanjin * * 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 */ #ifndef nabi_debug_h #define nabi_debug_h int nabi_log_get_level(void); void nabi_log_set_level(int level); void nabi_log_set_device(const char* device); void nabi_log(int level, const char* format, ...); #endif /* nabi_debug_h */ nabi-nabi-1.0.1/src/default-icons.h000066400000000000000000002612001430012456200170240ustar00rootroot00000000000000/* XPM */ static const char * none_default_xpm[] = { "144 96 149 2", " c None", ". c #4E4E4E", "+ c #181818", "@ c #717171", "# c #5D5D5D", "$ c #616161", "% c #484848", "& c #000000", "* c #6E6E6E", "= c #545454", "- c #161616", "; c #5B5B5B", "> c #505050", ", c #464646", "' c #191919", ") c #ABABAB", "! c #373737", "~ c #8C8C8C", "{ c #121212", "] c #101010", "^ c #080808", "/ c #606060", "( c #272727", "_ c #383838", ": c #696969", "< c #747474", "[ c #636363", "} c #292929", "| c #757575", "1 c #595959", "2 c #1E1E1E", "3 c #878787", "4 c #737373", "5 c #9F9F9F", "6 c #9D9D9D", "7 c #9C9C9C", "8 c #808080", "9 c #565656", "0 c #8A8A8A", "a c #5F5F5F", "b c #A4A4A4", "c c #151515", "d c #535353", "e c #AFAFAF", "f c #929292", "g c #959595", "h c #4A4A4A", "i c #777777", "j c #1D1D1D", "k c #6B6B6B", "l c #404040", "m c #9E9E9E", "n c #494949", "o c #A8A8A8", "p c #686868", "q c #3C3C3C", "r c #797979", "s c #848484", "t c #242424", "u c #939393", "v c #8B8B8B", "w c #4D4D4D", "x c #1B1B1B", "y c #A9A9A9", "z c #0E0E0E", "A c #787878", "B c #828282", "C c #515151", "D c #0C0C0C", "E c #979797", "F c #6F6F6F", "G c #6D6D6D", "H c #7D7D7D", "I c #ADADAD", "J c #5C5C5C", "K c #212121", "L c #424242", "M c #262626", "N c #555555", "O c #4B4B4B", "P c #050505", "Q c #323232", "R c #7A7A7A", "S c #3A3A3A", "T c #7C7C7C", "U c #909090", "V c #8D8D8D", "W c #666666", "X c #8F8F8F", "Y c #767676", "Z c #ACACAC", "` c #898989", " . c #818181", ".. c #303030", "+. c #868686", "@. c #888888", "#. c #2A2A2A", "$. c #454545", "%. c #838383", "&. c #3E3E3E", "*. c #1F1F1F", "=. c #131313", "-. c #A1A1A1", ";. c #5E5E5E", ">. c #676767", ",. c #0A0A0A", "'. c #A3A3A3", "). c #363636", "!. c #919191", "~. c #9A9A9A", "{. c #202020", "]. c #AAAAAA", "^. c #A7A7A7", "/. c #2C2C2C", "(. c #727272", "_. c #313131", ":. c #6C6C6C", "<. c #3F3F3F", "[. c #343434", "}. c #A2A2A2", "|. c #252525", "1. c #1A1A1A", "2. c #585858", "3. c #626262", "4. c #5A5A5A", "5. c #646464", "6. c #989898", "7. c #6A6A6A", "8. c #969696", "9. c #8E8E8E", "0. c #3B3B3B", "a. c #282828", "b. c #4F4F4F", "c. c #7F7F7F", "d. c #474747", "e. c #949494", "f. c #9B9B9B", "g. c #4C4C4C", "h. c #333333", "i. c #414141", "j. c #AEAEAE", "k. c #575757", "l. c #7B7B7B", "m. c #858585", "n. c #999999", "o. c #2F2F2F", "p. c #A5A5A5", "q. c #A6A6A6", "r. c #434343", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " . + + + + + + + + + + @ # # # # # # # # # # # $ 7 ~ ~ ~ ~ ~ ~ o # # # # # # # # # # # $ ", " % & & & & & & & & & & * & & & & & & & & & & & + ..& & & & & & b & & & & & & & & & & & + ", " = - & & & & & & & & & * & & & & & & & & & & & + g & & & & & & $. %./ &.*.P & =.} O : f & & & & & & & & & & & + ", " ; & & & & & & & & * > , ' & & & & & & & & + a & & & & & & 8 -.;.] & & & & & & & & & & & t @ > , ' & & & & & & & & + ", " ) & & & & & & & & * ) ! & & & & & & & + ' & & & & & c >.,.& & & & & & & & & & & & & & & j H ) ! & & & & & & & + ", " & & & & & & & & * ~ & & & & & & & + %.& & & & & & ; '.).& & & & & & & & & & & & & & & & & & & w ~ & & & & & & & + ", " & & & & & & & & * & & & & & & & + h & & & & & & !. ~.{.& & & & & & & & & & & & & & & & & & & & & Q ]. & & & & & & & + ", " & & & & & & & & * & & & & & & & + ^.& & & & & & /. 5 2 & & & & & & & & & & ^ j & & & & & & & & & & & ). & & & & & & & + ", " { { { { { { { { { { { { { { ] & & & & & & & & ^ { { { { { { { { { { { { { { / & & & & & & & + (.& & & & & & * _.& & & & & & & & c :.m !.; & & & & & & & & & = & & & & & & & + ", " & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & # & & & & & & & + _.& & & & & & b $ & & & & & & & & <.^. g t & & & & & & & & [._ _ _ _ _ _ _ _ _ _ _ _ ).& & & & & & & + ", " & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & # & & & & & & & + g & & & & & & $. m P & & & & & & & L }.|.& & & & & & & & & & & & & & & & & & & & & & & & & & & & + ", " & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & # & & & & & & & + / & & & & & & 8 J & & & & & & & {.o f P & & & & & & & & & & & & & & & & & & & & & & & & & & & + ", " & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & # & & & & & & & + 1.& & & & & c c & & & & & & & r ; & & & & & & & & & & & & & & & & & & & & & & & & & & & + ", " { { { { { { { ^ & & & & & & & & & & & & & & & & & & & & & & & ] { { { { { { / & & & & & & & + %.& & & & & & ; X & & & & & & & ' m & & & & & & & & & & & & & & & & & & & & & & & & & & & + ", " ( & & & & & & & & & _ : < [ } & & & & & & & & & | & & & & & & & + O & & & & & & !. < & & & & & & & C /.& & & & & & & & & & & & & & & & & & & & & & & & & & + ", " 1 & & & & & & & & 2 3 4 ^ & & & & & & & ] 5 & & & & & & & + o P & & & & & /. $ & & & & & & & F d & & & & & & & A j.& & & & & & & + ", " 6 & & & & & & & & 2 7 8 & & & & & & & & 9 & & & & & & & + (.& & & & & & * 2.& & & & & & & R $ & & & & & & & @ & & & & & & & + ", " ; & & & & & & & & 0 a & & & & & & & ^ b & & & & & & & & { { { { { { { { 3. _.& & & & & & b 4.& & & & & & & A ;.& & & & & & & (. & & & & & & & + ", " c & & & & & & & d e - & & & & & & & | & & & & & & & & & & & & & & & & / g & & & & & & $. 5.& & & & & & & k . & & & & & & & H & & & & & & & + ", " f & & & & & & & & g / & & & & & & & h & & & & & & & & & & & & & & & & / / & & & & & & 8 r & & & & & & & $. 2 & & & & & & & j M M M M M M M M M M t & & & & & & & + ", " i & & & & & & & j 3 & & & & & & & 2 & & & & & & & & & & & & & & & & / 1.& & & & & c 6.& & & & & & & D ]. U & & & & & & & & & & & & & & & & & & & & & & & & & & & + ", " k & & & & & & & l m & & & & & & & & & & & & & & & & & & & & & & & & / %.& & & & & & ; t & & & & & & & >. , & & & & & & & & & & & & & & & & & & & & & & & & & & & + ", " $ & & & & & & & n o & & & & & & & & & & & & & & & & & & & & & & & & / O & & & & & & !. 7.& & & & & & & ,.8. T & & & & & & & & & & & & & & & & & & & & & & & & & & & & + ", " p & & & & & & & q m & & & & & & & & & & & & & & & - o P & & & & & /. ].=.& & & & & & & } }. V ] & & & & & & & & & & & & & & & & & & & & & & & & & & & & + ", " r & & & & & & & { s & & & & & & & t & & & & & & & + 4 & & & & & & * < & & & & & & & & |.9. A D & & & & & & & & + + + + + + + + + + + + + - & & & & & & & + ", " u & & & & & & & & v ; & & & & & & & w & & & & & & & + Q & & & & & & b % & & & & & & & & & O .~.b 8.Y ! & & & & & & & & & k & & & & & & & + ", " x & & & & & & & % y z & & & & & & & A & & & & & & & + 8.& & & & & & $. I ).& & & & & & & & & & & & & & & & & & & & & & & C & & & & & & & + ", " [ & & & & & & & & B C & & & & & & & z ) & & & & & & & + / & & & & & & 8 ) 0.& & & & & & & & & & & & & & & & & & & & & = & & & & & & & + ", " b D & & & & & & & - E F & & & & & & & & [ & & & & & & & + 1.& & & & & c N & & & & & & & & & & & & & & & & & & ^ (. & & & & & & & + ", " G & & & & & & & & + H I J & & & & & & & & K I & & & & & & & + s & & & & & & ; %.a.& & & & & & & & & & & & & & & L 7 & & & & & & & + ", " L & & & & & & & & & M N / O z & & & & & & & & P ~ & & & & & & & + O & & & & & & !. T S & & & & & & & & & & D b.U & & & & & & & + ", " ) Q & & & & & & & & & & & & & & & & & & & & & R & & & & & & & + o P & & & & & /. }.c.[ . L &.d.= G @. & & & & & & & + ", " y S & & & & & & & & & & & & & & & & & & ^ T & & & & & & & + 4 & & & & & & * & & & & & & & + ", " ; & & & & & & & & & & & & & & & & ( U & & & & & & & + Q & & & & & & b ].e.+. .%.v 6 & & & & & & & + ", " V _ & & & & & & & & & & & & { W & & & & & & & + 8.& & & & & & $. !.$ /.& & & & & & & ] $.i Z & & & & & & & + ", " X J M & & & & & & D L Y Z & & & & & & & + / & & & & & & 8 0 _ & & & & & & & & & & & & & ] 3.) ", " o u ` 3 V 6 & & & & & & & + 1.& & & & & c ) C & & & & & & & & & & & & & & & & & x B ", " & & & & & & & + s & & & & & & ; f.#.& & & & & & & & & & & & & & & & & & & & 5. ", " & & & & & & & + g.& & & & & & !. E 1.& & & & & & & & & & & & & & & & & & & & & & k. ", " & & & & & & & + o P & & & & & /. '.*.& & & & & & & & & |.N 5.;.$.^ & & & & & & & & & [ ", " & & & & & & & + 4 & & & & & & * 0.& & & & & & & & [.~ I p D & & & & & & & & s ", " .K K K K K K K K K K K w & & & & & & & + h.& & & & & & b | & & & & & & & & b. !.x & & & & & & & {. ", " H & & & & & & & & & & & L & & & & & & & + 8.& & & & & & $. 2 & & & & & & & i. !.^ & & & & & & & F ", " H & & & & & & & & & & & L & & & & & & & + $ & & & & & & 8 8 & & & & & & & D b 7.& & & & & & & a. ", " 5 H F ..& & & & & & & & L +.+.+.+.+.+.+.@. x & & & & & c C & & & & & & & J I { & & & & & & & 6. ", " #.& & & & & & & L s & & & & & & ; {.& & & & & & & 0 g.& & & & & & & i ", " :.& & & & & & & L g.& & & & & & !. & & & & & & & & ) F & & & & & & & $ ", " R & & & & & & & L o P & & & & & /. p.& & & & & & & & T & & & & & & & k. ", " l.& & & & & & & L 4 & & & & & & * p.& & & & & & & & T & & & & & & & k. ", " l.& & & & & & & L h.& & & & & & b & & & & & & & & ) F & & & & & & & $ ", " l.& & & & & & & L 8.& & & & & & $. {.& & & & & & & v w & & & & & & & i ", " l.& & & & & & & L $ & & & & & & 8 C & & & & & & & ;. j.=.& & & & & & & 6. ", " l.& & & & & & & L x & & & & & c c.& & & & & & & z q. :.& & & & & & & ( ", " l.& & & & & & & L m.& & & & & & ; j & & & & & & & $. e.,.& & & & & & & F ", " l.& & & & & & & M I w & & & & & & !. < & & & & & & & & d g {.& & & & & & & *. ", " T & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & / y P & & & & & /. S & & & & & & & & _ X :.] & & & & & & & & %. ", " B & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & / < & & & & & & * }.j & & & & & & & & & #.2.>.$ n D & & & & & & & & & $ ", " n.& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & / [.& & & & & & b g ' & & & & & & & & & & & & & & & & & & & & & & N ", " o.& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & / E & & & & & & $. n.a.& & & & & & & & & & & & & & & & & & & & $ ", " f =.& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & / -.@.@.@.@.@.@.5 ].. & & & & & & & & & & & & & & & & & 1.8 ", " -./ Q - ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.$ @.).& & & & & & & & & & & & & z / ]. ", " !.a } & & & & & & & z r.Y ) ", " ].u +.8 %.0 7 ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; /* XPM */ const static char * hangul_default_xpm[] = { "144 96 116 2", " c None", ". c #4F4F4F", "+ c #1B1B1B", "@ c #6F6F6F", "# c #5D5D5D", "$ c #616161", "% c #494949", "& c #000000", "* c #6C6C6C", "= c #555555", "- c #191919", "; c #5B5B5B", "> c #515151", ", c #484848", "' c #1C1C1C", ") c #9F9F9F", "! c #3A3A3A", "~ c #868686", "{ c #151515", "] c #131313", "^ c #0A0A0A", "/ c #606060", "( c #2A2A2A", "_ c #3B3B3B", ": c #686868", "< c #717171", "[ c #626262", "} c #2C2C2C", "| c #727272", "1 c #595959", "2 c #212121", "3 c #818181", "4 c #707070", "5 c #969696", "6 c #949494", "7 c #939393", "8 c #7C7C7C", "9 c #565656", "0 c #848484", "a c #5E5E5E", "b c #9A9A9A", "c c #181818", "d c #545454", "e c #A3A3A3", "f c #5F5F5F", "g c #8A8A8A", "h c #8D8D8D", "i c #4B4B4B", "j c #747474", "k c #202020", "l c #828282", "m c #696969", "n c #424242", "o c #959595", "p c #9D9D9D", "q c #676767", "r c #3F3F3F", "s c #757575", "t c #7F7F7F", "u c #272727", "v c #8C8C8C", "w c #858585", "x c #4E4E4E", "y c #1F1F1F", "z c #9E9E9E", "A c #111111", "B c #7E7E7E", "C c #525252", "D c #A0A0A0", "E c #0F0F0F", "F c #8F8F8F", "G c #6D6D6D", "H c #6B6B6B", "I c #797979", "J c #A2A2A2", "K c #5C5C5C", "L c #252525", "M c #444444", "N c #292929", "O c #4D4D4D", "P c #070707", "Q c #353535", "R c #767676", "S c #3C3C3C", "T c #787878", "U c #898989", "V c #878787", "W c #646464", "X c #888888", "Y c #737373", "Z c #8B8B8B", "` c #7D7D7D", " . c #333333", ".. c #808080", "+. c #2D2D2D", "@. c #6A6A6A", "#. c #777777", "$. c #919191", "%. c #161616", "&. c #979797", "*. c #0D0D0D", "=. c #7B7B7B", "-. c #585858", ";. c #9B9B9B", ">. c #929292", ",. c #666666", "'. c #636363", "). c #454545", "!. c #383838", "~. c #2B2B2B", "{. c #575757", "]. c #999999", "^. c #313131", "/. c #1E1E1E", "(. c #A1A1A1", "_. c #5A5A5A", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " . + + + + + + + + + + @ # # # # # # # # # # # $ ", " % & & & & & & & & & & * & & & & & & & & & & & + ", " = - & & & & & & & & & * & & & & & & & & & & & + ~ # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # [ ", " ; & & & & & & & & * > , ' & & & & & & & & + | & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & J ", " ) & & & & & & & & * ) ! & & & & & & & + | & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & J ", " & & & & & & & & * ~ & & & & & & & + | & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & J ", " & & & & & & & & * & & & & & & & + | & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & J ", " & & & & & & & & * & & & & & & & + | & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & J ", " { { { { { { { { { { { { { { ] & & & & & & & & ^ { { { { { { { { { { { { { { / & & & & & & & + o ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` =.-.& & & & & & & & J ", " & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & # & & & & & & & + ;.& & & & & & & & J ", " & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & # & & & & & & & + z & & & & & & & & J ", " & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & # & & & & & & & + z & & & & & & & & J ", " & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & # & & & & & & & + z & & & & & & & & J ", " { { { { { { { ^ & & & & & & & & & & & & & & & & & & & & & & & ] { { { { { { / & & & & & & & + p & & & & & & & & J ", " ( & & & & & & & & & _ : < [ } & & & & & & & & & | & & & & & & & + ;.& & & & & & & & ", " 1 & & & & & & & & 2 3 4 ^ & & & & & & & ] 5 & & & & & & & + &.& & & & & & & & ", " 6 & & & & & & & & 2 7 8 & & & & & & & & 9 & & & & & & & + >.& & & & & & & & ", " ; & & & & & & & & 0 a & & & & & & & ^ b & & & & & & & & { { { { { { { { $ U & & & & & & & E ", " c & & & & & & & d e - & & & & & & & | & & & & & & & & & & & & & & & & f B & & & & & & & ( ", " g & & & & & & & & h / & & & & & & & i & & & & & & & & & & & & & & & & f H & & & & & & & M ", " j & & & & & & & k l & & & & & & & 2 & & & & & & & & & & & & & & & & f , & & & & & & & ,. ", " m & & & & & & & n o & & & & & & & & & & & & & & & & & & & & & & & & f { & & & & & & & U ", " $ & & & & & & & i p & & & & & & & & & & & & & & & & & & & & & & & & f < & & & & & & & S ", " q & & & & & & & r 6 & & & & & & & & & & & & & & & - '.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.L & & & & & & & ).'.'.'.'.'.'.'.0 ", " s & & & & & & & { t & & & & & & & u & & & & & & & + & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & : ", " v & & & & & & & & w ; & & & & & & & x & & & & & & & + & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & : ", " y & & & & & & & % z A & & & & & & & s & & & & & & & + & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & : ", " [ & & & & & & & & B C & & & & & & & A D & & & & & & & + & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & : ", " b E & & & & & & & - F G & & & & & & & & [ & & & & & & & + & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & : ", " H & & & & & & & & + I J K & & & & & & & & L J & & & & & & & + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X &. ", " M & & & & & & & & & N 9 f O A & & & & & & & & P ~ & & & & & & & + ", " ) Q & & & & & & & & & & & & & & & & & & & & & R & & & & & & & + ", " z S & & & & & & & & & & & & & & & & & & ^ T & & & & & & & + ", " ; & & & & & & & & & & & & & & & & ( U & & & & & & & + ", " V _ & & & & & & & & & & & & { W & & & & & & & + ", " X K N & & & & & & E M Y D & & & & & & & + 0 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * G ) ", " p Z 0 l V 6 & & & & & & & + f & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & t ", " & & & & & & & + f & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & t ", " & & & & & & & + f & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & t ", " & & & & & & & + f & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & t ", " & & & & & & & + W k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k ^ & & & & & & & t ", " ` L L L L L L L L L L L x & & & & & & & + M & & & & & & & t ", " I & & & & & & & & & & & M & & & & & & & + M & & & & & & & t ", " I & & & & & & & & & & & M & & & & & & & + M & & & & & & & t ", " 5 I G .& & & & & & & & M ..............l M & & & & & & & t ", " +.& & & & & & & M Z g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g !.& & & & & & & t ", " @.& & & & & & & M k & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & t ", " #.& & & & & & & M k & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & t ", " #.& & & & & & & M k & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & t ", " #.& & & & & & & M $.. & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & t ", " #.& & & & & & & M ~.& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & A 6 ", " #.& & & & & & & M {.& & & & & & & ; ].].].].].].].].].].].].].].].].].].].].].].].].].].].].].].].]. ", " #.& & & & & & & M f & & & & & & & '. ", " #.& & & & & & & M f & & & & & & & '. ", " #.& & & & & & & N J f & & & & & & & '. ", " T & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & f f & & & & & & & '. ", " B & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & f $ & & & & & & & ' ^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^. ", " $.& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & f @.& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & ", " .& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & f t & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & ", " g %.& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & f /.& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & ", " &./ Q - *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*./ 0 c & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & ", " (.I '._.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; /* XPM */ const static char * english_default_xpm[] = { "144 96 138 2", " c None", ". c #5D5D5D", "+ c #616161", "@ c #000000", "# c #1B1B1B", "$ c #7F7F7F", "% c #606060", "& c #404040", "* c #232323", "= c #070707", "- c #161616", "; c #2C2C2C", "> c #4C4C4C", ", c #686868", "' c #8B8B8B", ") c #979797", "! c #131313", "~ c #272727", "{ c #6F6F6F", "] c #515151", "^ c #484848", "/ c #1C1C1C", "( c #666666", "_ c #0D0D0D", ": c #202020", "< c #797979", "[ c #9F9F9F", "} c #3A3A3A", "| c #999999", "1 c #383838", "2 c #4E4E4E", "3 c #868686", "4 c #919191", "5 c #242424", "6 c #353535", "7 c #9E9E9E", "8 c #969696", "9 c #212121", "0 c #0A0A0A", "a c #343434", "b c #181818", "c c #6A6A6A", "d c #949494", "e c #8A8A8A", "f c #5B5B5B", "g c #555555", "h c #414141", "i c #9C9C9C", "j c #8D8D8D", "k c #373737", "l c #3B3B3B", "m c #959595", "n c #444444", "o c #989898", "p c #282828", "q c #5C5C5C", "r c #9D9D9D", "s c #757575", "t c #898989", "u c #717171", "v c #525252", "w c #2F2F2F", "x c #6D6D6D", "y c #545454", "z c #A2A2A2", "A c #585858", "B c #777777", "C c #5A5A5A", "D c #5E5E5E", "E c #636363", "F c #696969", "G c #4F4F4F", "H c #474747", "I c #292929", "J c #8F8F8F", "K c #0F0F0F", "L c #8E8E8E", "M c #787878", "N c #727272", "O c #878787", "P c #191919", "Q c #4A4A4A", "R c #7C7C7C", "S c #929292", "T c #9A9A9A", "U c #737373", "V c #3D3D3D", "W c #565656", "X c #707070", "Y c #2B2B2B", "Z c #454545", "` c #939393", " . c #3C3C3C", ".. c #505050", "+. c #7B7B7B", "@. c #626262", "#. c #494949", "$. c #6B6B6B", "%. c #828282", "&. c #8C8C8C", "*. c #818181", "=. c #858585", "-. c #747474", ";. c #A0A0A0", ">. c #848484", ",. c #1F1F1F", "'. c #7E7E7E", "). c #2D2D2D", "!. c #1E1E1E", "~. c #3E3E3E", "{. c #676767", "]. c #434343", "^. c #151515", "/. c #4D4D4D", "(. c #9B9B9B", "_. c #111111", ":. c #2A2A2A", "<. c #888888", "[. c #4B4B4B", "}. c #838383", "|. c #5F5F5F", "1. c #808080", "2. c #7A7A7A", "3. c #323232", "4. c #313131", "5. c #333333", "6. c #7D7D7D", "7. c #424242", "8. c #595959", "9. c #303030", "0. c #535353", "a. c #3F3F3F", "b. c #252525", "c. c #363636", "d. c #393939", "e. c #6C6C6C", "f. c #6E6E6E", "g. c #767676", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " . . . . . . . . . . . + 2.. . . . . . . . . . . m ", " @ @ @ @ @ @ @ @ @ @ @ # f @ @ @ @ @ @ @ @ @ @ @ <. ", " $ % & * = @ - ; > , ' @ @ @ @ @ @ @ @ @ @ @ # f @ @ @ @ @ @ @ @ @ @ @ <. ", " ) . ! @ @ @ @ @ @ @ @ @ @ @ ~ { ] ^ / @ @ @ @ @ @ @ @ # -.G 3.@ @ @ @ @ @ @ @ @ <. ", " ( _ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ : < [ } @ @ @ @ @ @ @ # $.@ @ @ @ @ @ @ @ <. ", " | 1 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 2 3 @ @ @ @ @ @ @ # i R + > } 4.5.~.v c >. 4.@ @ @ @ @ @ @ <. ", " 4 5 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 6 7 @ @ @ @ @ @ @ # 6.7.@ @ @ @ @ @ @ @ @ @ @ ^.A L W @ @ @ @ @ @ @ <. ", " 8 9 @ @ @ @ @ @ @ @ @ @ 0 : @ @ @ @ @ @ @ @ @ @ @ 1 @ @ @ @ @ @ @ # >.3.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ..| f @ @ @ @ @ @ @ <. ", " a @ @ @ @ @ @ @ @ b c d e f @ @ @ @ @ @ @ @ @ g @ @ @ @ @ @ @ # 8.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ - < f @ @ @ @ @ @ @ <. ", " % @ @ @ @ @ @ @ @ h i j ~ @ @ @ @ @ @ @ @ k l l l l l l l l l l l l 1 @ @ @ @ @ @ @ # r l @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ % f @ @ @ @ @ @ @ <. ", " m = @ @ @ @ @ @ @ n o p @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # r 9.@ @ @ @ @ @ @ @ @ @ @ / _.@ @ @ @ @ @ @ @ @ @ @ W f @ @ @ @ @ @ @ <. ", " q @ @ @ @ @ @ @ 5 r e = @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # 1 @ @ @ @ @ @ @ @ @ y =. [ +.n @ @ @ @ @ @ @ @ @ + f @ @ @ @ @ @ @ <. ", " b @ @ @ @ @ @ @ s f @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # 0.@ @ @ @ @ @ @ @ ; <. B - @ @ @ @ @ @ @ @ R f @ @ @ @ @ @ @ <. ", " t @ @ @ @ @ @ @ / m @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # $ @ @ @ @ @ @ @ @ w (. O K @ @ @ @ @ @ @ ,.7 f @ @ @ @ @ @ @ <. ", " u @ @ @ @ @ @ @ v w @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # I @ @ @ @ @ @ @ / o 2.@ @ @ @ @ @ @ @ D f @ @ @ @ @ @ @ <. ", " % @ @ @ @ @ @ @ x y @ @ @ @ @ @ @ s z @ @ @ @ @ @ @ # B @ @ @ @ @ @ @ @ +. [.@ @ @ @ @ @ @ _ r f @ @ @ @ @ @ @ <. ", " A @ @ @ @ @ @ @ B % @ @ @ @ @ @ @ { @ @ @ @ @ @ @ # .@ @ @ @ @ @ @ 7. 8 @ @ @ @ @ @ @ @ { f @ @ @ @ @ @ @ <. ", " C @ @ @ @ @ @ @ s D @ @ @ @ @ @ @ { @ @ @ @ @ @ @ # o @ @ @ @ @ @ @ @ *. /.@ @ @ @ @ @ @ a. f @ @ @ @ @ @ @ <. ", " E @ @ @ @ @ @ @ F G @ @ @ @ @ @ @ < @ @ @ @ @ @ @ # 2.@ @ @ @ @ @ @ # $ @ @ @ @ @ @ @ @ f @ @ @ @ @ @ @ <. ", " s @ @ @ @ @ @ @ H 9 @ @ @ @ @ @ @ : I I I I I I I I I I ~ @ @ @ @ @ @ @ # @.@ @ @ @ @ @ @ G r @ @ @ @ @ @ @ @ u >.>.>.>.>.>.>.>.#.@ @ @ @ @ @ @ <. ", " J @ @ @ @ @ @ @ K [ t @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # G @ @ @ @ @ @ @ c b.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ <. ", " ~ @ @ @ @ @ @ @ ( ^ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # n @ @ @ @ @ @ @ -. 1 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ <. ", " , @ @ @ @ @ @ @ _ L M @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # & @ @ @ @ @ @ @ M 7.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ <. ", " [ - @ @ @ @ @ @ @ ; o 3 ! @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # H @ @ @ @ @ @ @ X c.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ <. ", " N @ @ @ @ @ @ @ @ p O s K @ @ @ @ @ @ @ @ # # # # # # # # # # # # # P @ @ @ @ @ @ @ # W @ @ @ @ @ @ @ E ,.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ <. ", " Q @ @ @ @ @ @ @ @ @ > R S T L U } @ @ @ @ @ @ @ @ @ F @ @ @ @ @ @ @ # $.@ @ @ @ @ @ @ a. ) @ @ @ @ @ @ @ @ /.0.0.0.0.0.0.0.0.).@ @ @ @ @ @ @ <. ", " z 1 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ v @ @ @ @ @ @ @ # =.@ @ @ @ @ @ @ = z M @ @ @ @ @ @ @ b. f @ @ @ @ @ @ @ <. ", " [ V @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ g @ @ @ @ @ @ @ # ! @ @ @ @ @ @ @ u ~.@ @ @ @ @ @ @ f f @ @ @ @ @ @ @ <. ", " W @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 0 X @ @ @ @ @ @ @ # W @ @ @ @ @ @ @ ). e @ @ @ @ @ @ @ @ }. f @ @ @ @ @ @ @ <. ", " $ Y @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ Z ` @ @ @ @ @ @ @ # j @ @ @ @ @ @ @ @ , c.@ @ @ @ @ @ @ d. f @ @ @ @ @ @ @ <. ", " M .@ @ @ @ @ @ @ @ @ @ K ..t @ @ @ @ @ @ @ # 2 @ @ @ @ @ @ @ 0 t @.@ @ @ @ @ @ @ @ 1. f @ @ @ @ @ @ @ <. ", " o +.@.G n & #.g $.%. @ @ @ @ @ @ @ # | - @ @ @ @ @ @ @ # J e.@ @ @ @ @ @ @ @ [. f @ @ @ @ @ @ @ <. ", " @ @ @ @ @ @ @ # +.@ @ @ @ @ @ @ @ ! U [ v @ @ @ @ @ @ @ @ p [ f @ @ @ @ @ @ @ <. ", " [ &.*.R $ =.d @ @ @ @ @ @ @ # {.@ @ @ @ @ @ @ @ @ ; F %.L e R g ! @ @ @ @ @ @ @ @ - ' f @ @ @ @ @ @ @ <. ", " e % w @ @ @ @ @ @ @ ! H -.;. @ @ @ @ @ @ @ # E @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # ' f @ @ @ @ @ @ @ <. ", " >.l @ @ @ @ @ @ @ @ @ @ @ @ @ ! + ;. u = @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ; J f @ @ @ @ @ @ @ <. ", " ;.v @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ,.'. e 9.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 8. f @ @ @ @ @ @ @ <. ", " S ).@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ E f.* @ @ @ @ @ @ @ @ @ @ @ @ @ @ H 3 f @ @ @ @ @ @ @ <. ", " J !.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ A R 2 b @ @ @ @ @ @ @ @ c.+ J f @ @ @ @ @ @ @ <. ", " | * @ @ @ @ @ @ @ @ @ p g E . H 0 @ @ @ @ @ @ @ @ @ @. S *.g.N g.$ <.7 f @ @ @ @ @ @ @ <. ", " ~.@ @ @ @ @ @ @ @ k =. z {.K @ @ @ @ @ @ @ @ $ f @ @ @ @ @ @ @ <. ", " N @ @ @ @ @ @ @ @ .. e ,.@ @ @ @ @ @ @ 5 f @ @ @ @ @ @ @ <. ", " 9 @ @ @ @ @ @ @ ]. e 0 @ @ @ @ @ @ @ x f @ @ @ @ @ @ @ <. ", " +.@ @ @ @ @ @ @ K T , @ @ @ @ @ @ @ Y f @ @ @ @ @ @ @ <. ", " v @ @ @ @ @ @ @ q z ^.@ @ @ @ @ @ @ J f @ @ @ @ @ @ @ <. ", " 5 @ @ @ @ @ @ @ >. /.@ @ @ @ @ @ @ -. f @ @ @ @ @ @ @ <. ", " @ @ @ @ @ @ @ @ [ x @ @ @ @ @ @ @ + f @ @ @ @ @ @ @ <. ", " (.@ @ @ @ @ @ @ @ M @ @ @ @ @ @ @ A f @ @ @ @ @ @ @ <. ", " (.@ @ @ @ @ @ @ @ M @ @ @ @ @ @ @ A f @ @ @ @ @ @ @ <. ", " @ @ @ @ @ @ @ @ ;. x @ @ @ @ @ @ @ + f @ @ @ @ @ @ @ <. ", " 5 @ @ @ @ @ @ @ =. 2 @ @ @ @ @ @ @ -. f @ @ @ @ @ @ @ <. ", " v @ @ @ @ @ @ @ . z - @ @ @ @ @ @ @ J f @ @ @ @ @ @ @ <. ", " +.@ @ @ @ @ @ @ _.i c @ @ @ @ @ @ @ :. f @ @ @ @ @ @ @ <. ", " : @ @ @ @ @ @ @ H &._ @ @ @ @ @ @ @ x f @ @ @ @ @ @ @ <. ", " u @ @ @ @ @ @ @ @ y j 5 @ @ @ @ @ @ @ * f @ @ @ @ @ @ @ <. ", " .@ @ @ @ @ @ @ @ l <. c ! @ @ @ @ @ @ @ @ '. f @ @ @ @ @ @ @ <. ", " o : @ @ @ @ @ @ @ @ @ ).A ( + [.K @ @ @ @ @ @ @ @ @ % f @ @ @ @ @ @ @ <. ", " j / @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ g f @ @ @ @ @ @ @ <. ", " 4 Y @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ % f @ @ @ @ @ @ @ <. ", " [ G @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ !.R f @ @ @ @ @ @ @ <. ", " }.1 @ @ @ @ @ @ @ @ @ @ @ @ @ _.|.[ f @ @ @ @ @ @ @ <. ", " e D ; @ @ @ @ @ @ @ _.Z U ;. B A A A A A A A ` ", " 7 ' 1.R '.>.` ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; nabi-nabi-1.0.1/src/eggtrayicon.c000066400000000000000000000301521430012456200165750ustar00rootroot00000000000000/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* eggtrayicon.c * Copyright (C) 2002 Anders Carlsson * * 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 #include #include #include "eggtrayicon.h" #include #include #ifndef EGG_COMPILATION #ifndef _ #define _(x) dgettext (GETTEXT_PACKAGE, x) #define N_(x) x #endif #else #define _(x) x #define N_(x) x #endif #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 egg_tray_icon_init (EggTrayIcon *icon); static void egg_tray_icon_class_init (EggTrayIconClass *klass); static void egg_tray_icon_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static void egg_tray_icon_realize (GtkWidget *widget); static void egg_tray_icon_unrealize (GtkWidget *widget); static void egg_tray_icon_update_manager_window (EggTrayIcon *icon); GType egg_tray_icon_get_type (void) { static GType our_type = 0; if (our_type == 0) { static const GTypeInfo our_info = { sizeof (EggTrayIconClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) egg_tray_icon_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (EggTrayIcon), 0, /* n_preallocs */ (GInstanceInitFunc) egg_tray_icon_init }; our_type = g_type_register_static (GTK_TYPE_PLUG, "EggTrayIcon", &our_info, 0); } return our_type; } static void egg_tray_icon_init (EggTrayIcon *icon) { icon->stamp = 1; icon->orientation = GTK_ORIENTATION_HORIZONTAL; gtk_widget_add_events (GTK_WIDGET (icon), GDK_PROPERTY_CHANGE_MASK); } static void egg_tray_icon_class_init (EggTrayIconClass *klass) { GObjectClass *gobject_class = (GObjectClass *)klass; GtkWidgetClass *widget_class = (GtkWidgetClass *)klass; parent_class = g_type_class_peek_parent (klass); gobject_class->get_property = egg_tray_icon_get_property; widget_class->realize = egg_tray_icon_realize; widget_class->unrealize = egg_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 egg_tray_icon_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { EggTrayIcon *icon = EGG_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 egg_tray_icon_get_orientation_property (EggTrayIcon *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 egg_tray_icon_manager_filter (GdkXEvent *xevent, GdkEvent *event, gpointer user_data) { EggTrayIcon *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) { egg_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) { egg_tray_icon_get_orientation_property (icon); } if (xev->xany.type == DestroyNotify) { egg_tray_icon_update_manager_window (icon); } } return GDK_FILTER_CONTINUE; } static void egg_tray_icon_unrealize (GtkWidget *widget) { EggTrayIcon *icon = EGG_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, egg_tray_icon_manager_filter, icon); } root_window = gdk_screen_get_root_window (gtk_widget_get_screen (widget)); gdk_window_remove_filter (root_window, egg_tray_icon_manager_filter, icon); if (GTK_WIDGET_CLASS (parent_class)->unrealize) (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); } static void egg_tray_icon_send_manager_message (EggTrayIcon *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 egg_tray_icon_send_dock_request (EggTrayIcon *icon) { egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_REQUEST_DOCK, icon->manager_window, gtk_plug_get_id (GTK_PLUG (icon)), 0, 0); } static void egg_tray_icon_update_manager_window (EggTrayIcon *icon) { Display *xdisplay; /* #300760 참조 */ if (!GTK_IS_WIDGET(icon)) return; 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, egg_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, egg_tray_icon_manager_filter, icon); /* Send a request that we'd like to dock */ egg_tray_icon_send_dock_request (icon); egg_tray_icon_get_orientation_property (icon); } } static void egg_tray_icon_realize (GtkWidget *widget) { EggTrayIcon *icon = EGG_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); 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); egg_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, egg_tray_icon_manager_filter, icon); } EggTrayIcon * egg_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 egg_tray_icon_new_for_screen (screen, name); } EggTrayIcon * egg_tray_icon_new_for_screen (GdkScreen *screen, const char *name) { g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); return g_object_new (EGG_TYPE_TRAY_ICON, "screen", screen, "title", name, NULL); } EggTrayIcon* egg_tray_icon_new (const gchar *name) { return g_object_new (EGG_TYPE_TRAY_ICON, "title", name, NULL); } guint egg_tray_icon_send_message (EggTrayIcon *icon, gint timeout, const gchar *message, gint len) { guint stamp; g_return_val_if_fail (EGG_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 */ egg_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 egg_tray_icon_cancel_message (EggTrayIcon *icon, guint id) { g_return_if_fail (EGG_IS_TRAY_ICON (icon)); g_return_if_fail (id > 0); egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_CANCEL_MESSAGE, (Window)gtk_plug_get_id (GTK_PLUG (icon)), id, 0, 0); } GtkOrientation egg_tray_icon_get_orientation (EggTrayIcon *icon) { g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), GTK_ORIENTATION_HORIZONTAL); return icon->orientation; } nabi-nabi-1.0.1/src/eggtrayicon.h000066400000000000000000000047371430012456200166140ustar00rootroot00000000000000/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* eggtrayicon.h * Copyright (C) 2002 Anders Carlsson * * 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 __EGG_TRAY_ICON_H__ #define __EGG_TRAY_ICON_H__ #include #include G_BEGIN_DECLS #define EGG_TYPE_TRAY_ICON (egg_tray_icon_get_type ()) #define EGG_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_TRAY_ICON, EggTrayIcon)) #define EGG_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_TRAY_ICON, EggTrayIconClass)) #define EGG_IS_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_TRAY_ICON)) #define EGG_IS_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_TRAY_ICON)) #define EGG_TRAY_ICON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_TRAY_ICON, EggTrayIconClass)) typedef struct _EggTrayIcon EggTrayIcon; typedef struct _EggTrayIconClass EggTrayIconClass; struct _EggTrayIcon { 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 _EggTrayIconClass { GtkPlugClass parent_class; }; GType egg_tray_icon_get_type (void); EggTrayIcon *egg_tray_icon_new_for_screen (GdkScreen *screen, const gchar *name); EggTrayIcon *egg_tray_icon_new (const gchar *name); guint egg_tray_icon_send_message (EggTrayIcon *icon, gint timeout, const char *message, gint len); void egg_tray_icon_cancel_message (EggTrayIcon *icon, guint id); GtkOrientation egg_tray_icon_get_orientation (EggTrayIcon *icon); G_END_DECLS #endif /* __EGG_TRAY_ICON_H__ */ nabi-nabi-1.0.1/src/fontset.c000066400000000000000000000111111430012456200157360ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include "debug.h" #include "gettext.h" #include "fontset.h" static GHashTable *fontset_hash = NULL; static GSList *fontset_list = NULL; static Display *_display = NULL; static NabiFontSet* nabi_fontset_new(const char *name) { XFontSet xfontset; XFontSetExtents* ext; NabiFontSet *fontset; char **missing_list; int missing_list_count; char *error_message; nabi_log(4, "create fontset: %s\n", name); xfontset = XCreateFontSet(_display, name, &missing_list, &missing_list_count, &error_message); if (missing_list_count > 0) { gchar *name2; XFreeStringList(missing_list); name2 = g_strconcat(name, ",*", NULL); xfontset = XCreateFontSet(_display, name2, &missing_list, &missing_list_count, &error_message); g_free(name2); if (missing_list_count > 0) { int i; nabi_log(1, "missing charset\n"); nabi_log(1, "font: %s\n", name); for (i = 0; i < missing_list_count; i++) nabi_log(1, " %s\n", missing_list[i]); XFreeStringList(missing_list); return NULL; } } ext = XExtentsOfFontSet(xfontset); fontset = g_malloc(sizeof(NabiFontSet)); fontset->name = g_strdup(name); fontset->ref = 1; fontset->xfontset = xfontset; fontset->ascent = ABS(ext->max_logical_extent.y); fontset->descent = ext->max_logical_extent.height - fontset->ascent; g_hash_table_insert(fontset_hash, fontset->name, fontset); fontset_list = g_slist_prepend(fontset_list, fontset); return fontset; } static void nabi_fontset_ref(NabiFontSet *fontset) { if (fontset == NULL) return; fontset->ref++; } static void nabi_fontset_unref(NabiFontSet *fontset) { if (fontset == NULL) return; fontset->ref--; if (fontset->ref <= 0) { g_hash_table_remove(fontset_hash, fontset->name); fontset_list = g_slist_remove(fontset_list, fontset); nabi_log(4, "delete fontset: %s\n", fontset->name); XFreeFontSet(_display, fontset->xfontset); g_free(fontset->name); g_free(fontset); } } static NabiFontSet* nabi_fontset_find_by_xfontset(XFontSet xfontset) { NabiFontSet *fontset; GSList *list; list = fontset_list; while (list != NULL) { fontset = (NabiFontSet*)(list->data); if (fontset->xfontset == xfontset) return fontset; list = list->next; } return NULL; } NabiFontSet* nabi_fontset_create(Display *display, const char *fontset_name) { NabiFontSet *nabi_fontset; _display = display; if (fontset_hash == NULL) fontset_hash = g_hash_table_new(g_str_hash, g_str_equal); nabi_fontset = g_hash_table_lookup(fontset_hash, fontset_name); if (nabi_fontset != NULL) { nabi_fontset_ref(nabi_fontset); return nabi_fontset; } nabi_fontset = nabi_fontset_new(fontset_name); return nabi_fontset; } void nabi_fontset_free(Display *display, XFontSet xfontset) { NabiFontSet *nabi_fontset; _display = display; nabi_fontset = nabi_fontset_find_by_xfontset(xfontset); nabi_fontset_unref(nabi_fontset); } void nabi_fontset_free_all(Display *display) { NabiFontSet *fontset; GSList *list; _display = display; if (fontset_list != NULL) { nabi_log(1, "remaining fontsets will be freed," "this must be an error\n"); list = fontset_list; while (list != NULL) { fontset = (NabiFontSet*)(list->data); XFreeFontSet(_display, fontset->xfontset); g_free(fontset->name); g_free(fontset); list = list->next; } } if (fontset_hash != NULL) g_hash_table_destroy(fontset_hash); if (fontset_list != NULL) g_slist_free(fontset_list); } /* vim: set ts=8 sw=4 : */ nabi-nabi-1.0.1/src/fontset.h000066400000000000000000000023171430012456200157530ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * 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 */ #ifndef _FONTSET_H #define _FONTSET_H struct _NabiFontSet { XFontSet xfontset; char *name; int ascent; int descent; int ref; }; typedef struct _NabiFontSet NabiFontSet; NabiFontSet* nabi_fontset_create (Display *display, const char *fontset_name); void nabi_fontset_free (Display *display, XFontSet xfontset); void nabi_fontset_free_all (Display *display); #endif /* _FONTSET_H */ nabi-nabi-1.0.1/src/gettext.h000066400000000000000000000061351430012456200157570ustar00rootroot00000000000000/* Convenience header for conditional use of GNU . Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library 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 Library General Public License for more details. You should have received a copy of the GNU Library 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. */ #ifndef _LIBGETTEXT_H #define _LIBGETTEXT_H 1 /* NLS can be disabled through the configure --disable-nls option. */ #if ENABLE_NLS /* Get declarations of GNU message catalog functions. */ # include # define _(x) gettext(x) # define N_(String) gettext_noop (String) #else /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. We don't include as well because people using "gettext.h" will not include , and also including would fail on SunOS 4, whereas is OK. */ #if defined(__sun) # include #endif /* Disabled NLS. The casts to 'const char *' serve the purpose of producing warnings for invalid uses of the value returned from these functions. On pre-ANSI systems without 'const', the config.h file is supposed to contain "#define const". */ # define gettext(Msgid) ((const char *) (Msgid)) # define dgettext(Domainname, Msgid) ((const char *) (Msgid)) # define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define dngettext(Domainname, Msgid1, Msgid2, N) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define textdomain(Domainname) ((const char *) (Domainname)) # define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) # define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) # define N_(String) (String) # define _(x) (x) #endif /* A pseudo function call that serves as a marker for the automated extraction of messages, but does not call gettext(). The run-time translation is done at a different place in the code. The argument, String, should be a literal string. Concatenated strings and other string expressions won't work. The macro's expansion is not parenthesized, so that it is suitable as initializer for static 'char[]' or 'const char[]' variables. */ #define gettext_noop(String) String #endif /* _LIBGETTEXT_H */ nabi-nabi-1.0.1/src/handlebox.c000066400000000000000000000141561430012456200162340ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #include #include "handlebox.h" #define HANDLE_SIZE 10 static void nabi_handle_box_class_init (NabiHandleBoxClass *klass); static void nabi_handle_box_init (NabiHandleBox *handle_box); static void nabi_handle_box_size_request (GtkWidget *widget, GtkRequisition *requisition); static void nabi_handle_box_size_allocate (GtkWidget *widget, GtkAllocation *real_allocation); static gint nabi_handle_box_expose (GtkWidget *widget, GdkEventExpose *event); static gboolean nabi_handle_box_button_press(GtkWidget *widget, GdkEventButton *event); static void on_realize(GtkWidget *widget, gpointer data); static GtkWindowClass *parent_class = NULL; GType nabi_handle_box_get_type (void) { static GType handle_box_type = 0; if (!handle_box_type) { static const GTypeInfo handle_box_info = { sizeof (NabiHandleBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) nabi_handle_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (NabiHandleBox), 0, /* n_preallocs */ (GInstanceInitFunc) nabi_handle_box_init, }; handle_box_type = g_type_register_static (GTK_TYPE_WINDOW, "NabiHandleBox", &handle_box_info, 0); } return handle_box_type; } static void nabi_handle_box_class_init (NabiHandleBoxClass *klass) { GtkWidgetClass *widget_class; parent_class = g_type_class_peek_parent(klass); widget_class = GTK_WIDGET_CLASS(klass); widget_class->size_request = nabi_handle_box_size_request; widget_class->size_allocate = nabi_handle_box_size_allocate; widget_class->expose_event = nabi_handle_box_expose; widget_class->button_press_event = nabi_handle_box_button_press; } static void on_realize(GtkWidget *widget, gpointer data) { if (widget != NULL && widget->window != NULL) { int event_mask = gdk_window_get_events(widget->window); gdk_window_set_events(widget->window, event_mask | GDK_BUTTON_PRESS_MASK); } } static void nabi_handle_box_init (NabiHandleBox *handle_box) { gtk_window_set_type_hint(GTK_WINDOW(handle_box), GDK_WINDOW_TYPE_HINT_TOOLBAR); gtk_window_set_decorated(GTK_WINDOW(handle_box), FALSE); gtk_window_set_skip_pager_hint(GTK_WINDOW(handle_box), TRUE); gtk_window_set_skip_taskbar_hint(GTK_WINDOW(handle_box), TRUE); gtk_window_set_resizable(GTK_WINDOW(handle_box), FALSE); gtk_container_set_border_width(GTK_CONTAINER(handle_box), 1); g_signal_connect(G_OBJECT(handle_box), "realize", G_CALLBACK(on_realize), NULL); } GtkWidget* nabi_handle_box_new (void) { GtkWidget* widget = g_object_new (NABI_TYPE_HANDLE_BOX, NULL); GTK_WINDOW(widget)->type = GTK_WINDOW_TOPLEVEL; return widget; } static void nabi_handle_box_size_request (GtkWidget *widget, GtkRequisition *requisition) { if (GTK_WIDGET_CLASS (parent_class)->size_request) GTK_WIDGET_CLASS (parent_class)->size_request (widget, requisition); requisition->width += HANDLE_SIZE; } static void nabi_handle_box_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkBin* bin; widget->allocation = *allocation; bin = GTK_BIN (widget); if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) { GtkAllocation child_allocation; guint border_width; border_width = GTK_CONTAINER (widget)->border_width; child_allocation.x = border_width; child_allocation.y = border_width; child_allocation.x += HANDLE_SIZE; child_allocation.width = MAX (1, (gint)allocation->width - 2 * border_width); child_allocation.height = MAX (1, (gint)allocation->height - 2 * border_width); child_allocation.width -= HANDLE_SIZE; gtk_widget_size_allocate (bin->child, &child_allocation); } } static void nabi_handle_box_paint (GtkWidget *widget, GdkRectangle *area) { gint width = 0; gint height = 0; GdkRectangle rect; GdkRectangle dest; width = widget->allocation.width; height = widget->allocation.height; rect.x = 0; rect.y = 0; rect.width = width; rect.height = height; if (gdk_rectangle_intersect (area, &rect, &dest)) { gtk_paint_shadow(widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, area, widget, "handlebox", 0, 0, width, height); } rect.x = 0; rect.y = 0; rect.width = HANDLE_SIZE; rect.height = height; if (gdk_rectangle_intersect (area, &rect, &dest)) { gtk_paint_handle (widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, area, widget, "handlebox", rect.x, rect.y, rect.width, rect.height, GTK_ORIENTATION_VERTICAL); } } static gint nabi_handle_box_expose (GtkWidget *widget, GdkEventExpose *event) { gint ret = FALSE; if (GTK_WIDGET_CLASS (parent_class)->expose_event) ret = GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event); if (GTK_WIDGET_DRAWABLE (widget)) nabi_handle_box_paint (widget, &event->area); return ret; } static gboolean nabi_handle_box_button_press(GtkWidget *widget, GdkEventButton *event) { if (event->button == 1) { gtk_window_begin_move_drag(GTK_WINDOW(widget), event->button, event->x_root, event->y_root, event->time); return TRUE; } return FALSE; } nabi-nabi-1.0.1/src/handlebox.h000066400000000000000000000036041430012456200162350ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * 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 */ #ifndef __NABI_HANDLE_BOX_H__ #define __NABI_HANDLE_BOX_H__ #include G_BEGIN_DECLS #define NABI_TYPE_HANDLE_BOX (nabi_handle_box_get_type ()) #define NABI_HANDLE_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NABI_TYPE_HANDLE_BOX, NabiHandleBox)) #define NABI_HANDLE_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NABI_TYPE_HANDLE_BOX, NabiHandleBoxClass)) #define NABI_IS_HANDLE_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NABI_TYPE_HANDLE_BOX)) #define NABI_IS_HANDLE_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NABI_TYPE_HANDLE_BOX)) #define NABI_HANDLE_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NABI_TYPE_HANDLE_BOX, NabiHandleBoxClass)) typedef struct _NabiHandleBox NabiHandleBox; typedef struct _NabiHandleBoxClass NabiHandleBoxClass; struct _NabiHandleBox { GtkWindow parent; }; struct _NabiHandleBoxClass { GtkWindowClass parent_class; }; GType nabi_handle_box_get_type (void) G_GNUC_CONST; GtkWidget* nabi_handle_box_new (void); G_END_DECLS #endif /* __NABI_HANDLE_BOX_H__ */ nabi-nabi-1.0.1/src/handler.c000066400000000000000000000222441430012456200157020ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include "../IMdkit/IMdkit.h" #include "../IMdkit/Xi18n.h" #include "ic.h" #include "server.h" #include "candidate.h" #include "debug.h" #include "xim_protocol.h" static const char* get_xim_protocol_name(int code) { if (code > 0 && code < G_N_ELEMENTS(xim_protocol_name)) return xim_protocol_name[code]; return "XIM_UNKNOWN"; } static Bool nabi_handler_open(XIMS ims, IMOpenStruct *data) { nabi_server_create_connection(nabi_server, data->connect_id, data->lang.name); nabi_log(1, "open connection: id = %d, lang = %s\n", (int)data->connect_id, data->lang.name); return True; } static Bool nabi_handler_close(XIMS ims, IMCloseStruct *data) { nabi_server_destroy_connection(nabi_server, data->connect_id); nabi_log(1, "close connection: id = %d\n", (int)data->connect_id); return True; } static Bool nabi_handler_create_ic(XIMS ims, IMChangeICStruct *data) { NabiConnection* conn; conn = nabi_server_get_connection(nabi_server, data->connect_id); if (conn != NULL) { NabiIC *ic = nabi_connection_create_ic(conn, data); data->icid = nabi_ic_get_id(ic); nabi_log(1, "create ic: id = %d-%d, style = 0x%x\n", (int)data->connect_id, (int)data->icid, ic->input_style); } return True; } static Bool nabi_handler_destroy_ic(XIMS ims, IMChangeICStruct *data) { NabiConnection* conn; conn = nabi_server_get_connection(nabi_server, data->connect_id); if (conn != NULL) { NabiIC *ic = nabi_connection_get_ic(conn, data->icid); if (ic != NULL) { nabi_log(1, "destroy ic: id = %d-%d\n", (int)data->connect_id, (int)data->icid); nabi_connection_destroy_ic(conn, ic); } } return True; } static Bool nabi_handler_set_ic_values(XIMS ims, IMChangeICStruct *data) { NabiIC *ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "set values: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic != NULL) nabi_ic_set_values(ic, data); return True; } static Bool nabi_handler_get_ic_values(XIMS ims, IMChangeICStruct *data) { NabiIC *ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "get values: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic != NULL) nabi_ic_get_values(ic, data); return True; } static Bool nabi_handler_forward_event(XIMS ims, IMForwardEventStruct *data) { NabiIC* ic; KeySym keysym; XKeyEvent *kevent; if (data->event.type != KeyPress) { nabi_log(4, "process event: id = %d-%d, key release\n", (int)data->connect_id, (int)data->icid); IMForwardEvent(ims, (XPointer)data); return True; } ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); if (ic == NULL) return True; kevent = (XKeyEvent*)&data->event; keysym = nabi_ic_lookup_keysym(ic, kevent); nabi_log(3, "process event: id = %d-%d, keysym = 0x%x('%c')\n", (int)data->connect_id, (int)data->icid, keysym, (keysym < 0x80) ? keysym : ' '); if (ic->mode == NABI_INPUT_MODE_DIRECT) { /* direct mode */ if (ic->preedit.start) { nabi_ic_preedit_done(ic); nabi_ic_status_done(ic); } if (nabi_server_is_trigger_key(nabi_server, keysym, kevent->state)) { /* change input mode to compose mode */ nabi_ic_set_mode(ic, NABI_INPUT_MODE_COMPOSE); return True; } IMForwardEvent(ims, (XPointer)data); } else { if (nabi_server_is_trigger_key(nabi_server, keysym, kevent->state)) { /* change input mode to direct mode */ nabi_ic_set_mode(ic, NABI_INPUT_MODE_DIRECT); return True; } /* compose mode */ if (!ic->preedit.start) { nabi_ic_status_start(ic); } if (!nabi_ic_process_keyevent(ic, keysym, kevent->state)) IMForwardEvent(ims, (XPointer)data); } return True; } static Bool nabi_handler_set_ic_focus(XIMS ims, IMChangeFocusStruct *data) { NabiIC* ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "set focus: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic == NULL) return True; nabi_ic_set_focus(ic); return True; } static Bool nabi_handler_unset_ic_focus(XIMS ims, IMChangeFocusStruct *data) { NabiIC* ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "unset focus: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic == NULL) return True; nabi_server_set_mode_info(nabi_server, NABI_MODE_INFO_NONE); if (ic->candidate) { nabi_candidate_delete(ic->candidate); ic->candidate = NULL; } return True; } static Bool nabi_handler_reset_ic(XIMS ims, IMResetICStruct *data) { NabiIC* ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "reset: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic == NULL) return True; nabi_ic_reset(ic, data); return True; } static Bool nabi_handler_trigger_notify(XIMS ims, IMTriggerNotifyStruct *data) { NabiIC* ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "trigger notify: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic == NULL) return True; if (data->flag == 0) nabi_ic_set_mode(ic, NABI_INPUT_MODE_COMPOSE); return True; } static Bool nabi_handler_preedit_start_reply(XIMS ims, IMPreeditCBStruct *data) { NabiIC* ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "preedit start reply: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic != NULL) return True; return False; } static Bool nabi_handler_preedit_caret_reply(XIMS ims, IMPreeditCBStruct *data) { NabiIC* ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "preedit caret replay: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic != NULL) return True; return False; } static Bool nabi_handler_str_conversion_reply(XIMS ims, IMStrConvCBStruct *data) { XIMStringConversionText *text; NabiIC* ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "string conversion reply: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic == NULL) return True; text = data->strconv.text; if (text != NULL && text->length > 0 && text->string.mbs != NULL) { char* utf8 = NULL; if (text->encoding_is_wchar) { char* mbs = g_new0(char, text->length * 6); wcstombs(mbs, text->string.wcs, text->length * 6); utf8 = g_locale_to_utf8(mbs, -1, NULL, NULL, NULL); g_free(mbs); } else { utf8 = g_locale_to_utf8(text->string.mbs, -1, NULL, NULL, NULL); } if (utf8 != NULL) { nabi_log(2, "string conversion: retrieved string: %s\n", utf8); nabi_ic_process_string_conversion_reply(ic, utf8); g_free(utf8); } } return True; } Bool nabi_handler(XIMS ims, IMProtocol *data) { switch (data->major_code) { case XIM_OPEN: return nabi_handler_open(ims, &data->imopen); case XIM_CLOSE: return nabi_handler_close(ims, &data->imclose); case XIM_CREATE_IC: return nabi_handler_create_ic(ims, &data->changeic); case XIM_DESTROY_IC: return nabi_handler_destroy_ic(ims, &data->changeic); case XIM_SET_IC_VALUES: return nabi_handler_set_ic_values(ims, &data->changeic); case XIM_GET_IC_VALUES: return nabi_handler_get_ic_values(ims, &data->changeic); case XIM_FORWARD_EVENT: return nabi_handler_forward_event(ims, &data->forwardevent); case XIM_SET_IC_FOCUS: return nabi_handler_set_ic_focus(ims, &data->changefocus); case XIM_UNSET_IC_FOCUS: return nabi_handler_unset_ic_focus(ims, &data->changefocus); case XIM_RESET_IC: return nabi_handler_reset_ic(ims, &data->resetic); case XIM_TRIGGER_NOTIFY: return nabi_handler_trigger_notify(ims, &data->triggernotify); case XIM_PREEDIT_START_REPLY: return nabi_handler_preedit_start_reply(ims, &data->preedit_callback); case XIM_PREEDIT_CARET_REPLY: return nabi_handler_preedit_caret_reply(ims, &data->preedit_callback); case XIM_STR_CONVERSION_REPLY: return nabi_handler_str_conversion_reply(ims, &data->strconv_callback); default: nabi_log(1, "Unhandled XIM Protocol: %s\n", get_xim_protocol_name(data->major_code)); break; } return True; } /* vim: set ts=8 sw=4 sts=4 : */ nabi-nabi-1.0.1/src/ic.c000066400000000000000000002110171430012456200146560ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2009 Choe Hwanjin * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include #include "gettext.h" #include "ic.h" #include "server.h" #include "fontset.h" #include "debug.h" #include "util.h" #include "ustring.h" #include "nabi.h" #include "keyboard-layout.h" static void nabi_ic_preedit_configure(NabiIC *ic); static char* nabi_ic_get_hic_preedit_string(NabiIC *ic); static char* nabi_ic_get_flush_string(NabiIC *ic); static void nabi_ic_hic_on_translate(HangulInputContext* hic, int ascii, ucschar* c, void* data); static bool nabi_ic_hic_on_transition(HangulInputContext* hic, ucschar c, const ucschar* preedit, void* data); static Bool nabi_ic_update_candidate_window(NabiIC *ic); static gboolean is_syllable_boundary(ucschar prev, ucschar next) { if (hangul_is_choseong(prev)) { if (hangul_is_choseong(next)) return FALSE; if (hangul_is_jungseong(next)) return FALSE; } else if (hangul_is_jungseong(prev)) { if (hangul_is_jungseong(next)) return FALSE; if (hangul_is_jongseong(next)) return FALSE; } else if (hangul_is_jongseong(prev)) { if (hangul_is_jongseong(next)) return FALSE; } return TRUE; } static const ucschar* ustr_syllable_iter_prev(const ucschar* iter, const ucschar* begin) { if (iter > begin) iter--; while (iter > begin) { ucschar prev = *(iter - 1); ucschar curr = *iter; if (is_syllable_boundary(prev, curr)) break; iter--; } return iter; } static const ucschar* ustr_syllable_iter_next(const ucschar* iter, const ucschar* end) { while (iter < end) { ucschar curr = iter[0]; ucschar next = iter[1]; iter++; if (is_syllable_boundary(curr, next)) break; } return iter; } static inline void * nabi_malloc(size_t size) { void *ptr = malloc(size); if (ptr == NULL) { fprintf(stderr, "Nabi: memory allocation error\n"); exit(1); } return ptr; } static inline void nabi_free(void *ptr) { if (ptr != NULL) free(ptr); } static inline gboolean strniequal(const char* a, const char* b, gsize n) { return g_ascii_strncasecmp(a, b, n) == 0; } NabiConnection* nabi_connection_create(CARD16 id, const char* locale) { NabiConnection* conn; conn = g_new(NabiConnection, 1); conn->id = id; conn->mode = nabi_server->default_input_mode; conn->cd = (GIConv)-1; if (locale != NULL) { char* encoding = strchr(locale, '.'); if (encoding != NULL) { encoding++; // skip '.' if (!strniequal(encoding, "UTF-8", 5) || !strniequal(encoding, "UTF8", 4)) { conn->cd = g_iconv_open(encoding, "UTF-8"); nabi_log(3, "connection %d use encoding: %s (%lx)\n", id, encoding, (unsigned long)conn->cd); } } } conn->next_new_ic_id = 1; conn->ic_list = NULL; return conn; } void nabi_connection_destroy(NabiConnection* conn) { GSList* item; if (conn->cd != (GIConv)-1) g_iconv_close(conn->cd); item = conn->ic_list; while (item != NULL) { if (item->data != NULL) nabi_ic_destroy((NabiIC*)item->data); item = g_slist_next(item); } g_slist_free(conn->ic_list); g_free(conn); } NabiIC* nabi_connection_create_ic(NabiConnection* conn, IMChangeICStruct* data) { NabiIC* ic; if (conn == NULL) return NULL; ic = nabi_ic_create(conn, data); ic->id = conn->next_new_ic_id; conn->next_new_ic_id++; if (conn->next_new_ic_id == 0) conn->next_new_ic_id++; conn->ic_list = g_slist_prepend(conn->ic_list, ic); return ic; } void nabi_connection_destroy_ic(NabiConnection* conn, NabiIC* ic) { if (conn == NULL || ic == NULL) return; conn->ic_list = g_slist_remove(conn->ic_list, ic); nabi_ic_destroy(ic); } NabiIC* nabi_connection_get_ic(NabiConnection* conn, CARD16 id) { GSList* item; if (conn == NULL || id == 0) return NULL; item = conn->ic_list; while (item != NULL) { NabiIC* ic = (NabiIC*)item->data; if (ic->id == id) return ic; item = g_slist_next(item); } return NULL; } gboolean nabi_connection_need_check_charset(NabiConnection* conn) { if (conn == NULL) return FALSE; return conn->cd != (GIConv)-1; } gboolean nabi_connection_is_valid_str(NabiConnection* conn, const char* str) { size_t ret; gchar buf[32]; gsize inbytesleft, outbytesleft; gchar *inbuf, *outbuf; if (!nabi_connection_need_check_charset(conn)) return TRUE; inbuf = (char*)str; outbuf = buf; inbytesleft = strlen(str); outbytesleft = sizeof(buf); ret = g_iconv(conn->cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft); if (ret == -1) return False; return True; } NabiToplevel* nabi_toplevel_new(Window id) { NabiToplevel* toplevel = g_new(NabiToplevel, 1); toplevel->id = id; toplevel->mode = nabi_server->default_input_mode; toplevel->ref = 1; return toplevel; } void nabi_toplevel_ref(NabiToplevel* toplevel) { if (toplevel != NULL) toplevel->ref++; } void nabi_toplevel_unref(NabiToplevel* toplevel) { if (toplevel != NULL) { toplevel->ref--; if (toplevel->ref <= 0) { nabi_server_remove_toplevel(nabi_server, toplevel); g_free(toplevel); } } } static void nabi_ic_init_values(NabiIC *ic) { ic->input_style = 0; ic->client_window = 0; ic->focus_window = 0; ic->resource_name = NULL; ic->resource_class = NULL; ic->mode = nabi_server->default_input_mode; /* preedit attr */ ic->preedit.str = ustring_new(); ic->preedit.window = NULL; ic->preedit.width = 1; /* minimum window size is 1 x 1 */ ic->preedit.height = 1; /* minimum window size is 1 x 1 */ ic->preedit.area.x = 0; ic->preedit.area.y = 0; ic->preedit.area.width = 0; ic->preedit.area.height = 0; ic->preedit.area_needed.x = 0; ic->preedit.area_needed.y = 0; ic->preedit.area_needed.width = 0; ic->preedit.area_needed.height = 0; ic->preedit.spot.x = 0; ic->preedit.spot.y = 0; ic->preedit.cmap = 0; ic->preedit.normal_gc = NULL; ic->preedit.hilight_gc = NULL; ic->preedit.foreground = nabi_server->preedit_fg.pixel; ic->preedit.background = nabi_server->preedit_bg.pixel; ic->preedit.bg_pixmap = 0; ic->preedit.cursor = 0; ic->preedit.base_font = NULL; ic->preedit.font_set = NULL; ic->preedit.ascent = 0; ic->preedit.descent = 0; ic->preedit.line_space = 0; ic->preedit.state = XIMPreeditEnable; ic->preedit.start = False; ic->preedit.prev_length = 0; ic->preedit.has_start_cb = FALSE; ic->preedit.has_draw_cb = FALSE; ic->preedit.has_done_cb = FALSE; /* status attributes */ ic->status.area.x = 0; ic->status.area.y = 0; ic->status.area.width = 0; ic->status.area.height = 0; ic->status.area_needed.x = 0; ic->status.area_needed.y = 0; ic->status.area_needed.width = 0; ic->status.area_needed.height = 0; ic->status.cmap = 0; ic->status.foreground = 0; ic->status.background = 0; ic->status.background = 0; ic->status.bg_pixmap = 0; ic->status.line_space = 0; ic->status.cursor = 0; ic->status.base_font = NULL; ic->candidate = NULL; ic->toplevel = NULL; ic->composing_started = FALSE; ic->client_text = NULL; ic->wait_for_client_text = FALSE; ic->has_str_conv_cb = FALSE; ic->hic = hangul_ic_new(nabi_server->hangul_keyboard); hangul_ic_connect_callback(ic->hic, "translate", nabi_ic_hic_on_translate, ic); hangul_ic_connect_callback(ic->hic, "transition", nabi_ic_hic_on_transition, ic); } NabiIC* nabi_ic_create(NabiConnection* conn, IMChangeICStruct *data) { NabiIC *ic = g_new(NabiIC, 1); ic->connection = conn; nabi_ic_init_values(ic); nabi_ic_set_values(ic, data); return ic; } void nabi_ic_destroy(NabiIC *ic) { if (ic == NULL) return; nabi_free(ic->resource_name); ic->resource_name = NULL; nabi_free(ic->resource_class); ic->resource_class = NULL; nabi_free(ic->preedit.base_font); ic->preedit.base_font = NULL; nabi_free(ic->status.base_font); /* destroy preedit string */ if (ic->preedit.str != NULL) { g_array_free(ic->preedit.str, TRUE); ic->preedit.str = NULL; } /* destroy preedit window */ if (ic->preedit.window != NULL) gdk_window_destroy(ic->preedit.window); /* destroy fontset */ if (ic->preedit.font_set != NULL) { nabi_fontset_free(nabi_server->display, ic->preedit.font_set); ic->preedit.font_set = NULL; } if (ic->preedit.normal_gc != NULL) { g_object_unref(G_OBJECT(ic->preedit.normal_gc)); ic->preedit.normal_gc = NULL; } if (ic->preedit.hilight_gc != NULL) { g_object_unref(G_OBJECT(ic->preedit.hilight_gc)); ic->preedit.hilight_gc = NULL; } if (ic->candidate != NULL) { nabi_candidate_delete(ic->candidate); ic->candidate = NULL; } if (ic->client_text != NULL) { g_array_free(ic->client_text, TRUE); ic->client_text = NULL; } if (ic->toplevel != NULL) { nabi_toplevel_unref(ic->toplevel); ic->toplevel = NULL; } if (ic->hic != NULL) { hangul_ic_delete(ic->hic); ic->hic = NULL; } g_free(ic); } CARD16 nabi_ic_get_id(NabiIC* ic) { if (ic == NULL) return 0; return ic->id; } Bool nabi_ic_is_empty(NabiIC *ic) { if (ic == NULL || ic->hic == NULL) return True; return hangul_ic_is_empty(ic->hic); } void nabi_ic_set_hangul_keyboard(NabiIC *ic, const char* hangul_keyboard) { if (ic == NULL || ic->hic == NULL) return; hangul_ic_select_keyboard(ic->hic, hangul_keyboard); if (nabi_server->output_mode == NABI_OUTPUT_JAMO) { hangul_ic_set_output_mode(ic->hic, HANGUL_OUTPUT_JAMO); } else { hangul_ic_set_output_mode(ic->hic, HANGUL_OUTPUT_SYLLABLE); } } static void nabi_ic_hic_on_translate(HangulInputContext* hic, int ascii, ucschar* c, void* data) { nabi_server_log_key(nabi_server, *c, 0); } static bool nabi_ic_hic_on_transition(HangulInputContext* hic, ucschar c, const ucschar* preedit, void* data) { bool ret = true; NabiIC* ic = (NabiIC*)data; if (!nabi_server->auto_reorder) { if (hangul_is_choseong(c)) { if (hangul_ic_has_jungseong(hic) || hangul_ic_has_jongseong(hic)) { return false; } } if (hangul_is_jungseong(c)) { if (hangul_ic_has_jongseong(hic)) { return false; } } } if (ic != NULL) { char* utf8 = g_ucs4_to_utf8((const gunichar*)preedit, -1, NULL, NULL, NULL); ret = nabi_connection_is_valid_str(ic->connection, utf8); nabi_log(6, "on translation: %s: %s\n", utf8, ret ? "true" : "false"); g_free(utf8); } return ret; } static PangoLayout* nabi_ic_create_pango_layout(NabiIC *ic, const char* text) { GdkScreen* screen; PangoContext* context; PangoLayout* layout; screen = gdk_drawable_get_screen(ic->preedit.window); context = gdk_pango_context_get_for_screen(screen); pango_context_set_font_description(context, nabi_server->preedit_font); pango_context_set_base_dir(context, PANGO_DIRECTION_LTR); pango_context_set_language(context, pango_language_from_string("ko")); layout = pango_layout_new(context); if (text != NULL) pango_layout_set_text(layout, text, -1); return layout; } static void nabi_ic_preedit_gdk_draw_string(NabiIC *ic, char *preedit, char* normal, char* hilight) { GdkGC *normal_gc; GdkGC *hilight_gc; PangoContext *context; const PangoFontDescription *desc; PangoFontMetrics *metrics; int ascent; PangoLayout *normal_l; PangoLayout *hilight_l; PangoRectangle normal_r = { 0, 0, 12, 12 }; PangoRectangle hilight_r = { 0, 0, 12, 12 }; GdkColor fg, bg; GdkColormap* colormap; if (ic->preedit.window == NULL) return; normal_gc = ic->preedit.normal_gc; hilight_gc = ic->preedit.hilight_gc; normal_l = nabi_ic_create_pango_layout(ic, normal); pango_layout_get_pixel_extents(normal_l, NULL, &normal_r); hilight_l = nabi_ic_create_pango_layout(ic, hilight); pango_layout_get_pixel_extents(hilight_l, NULL, &hilight_r); fg = nabi_server->preedit_fg; bg = nabi_server->preedit_bg; colormap = gdk_drawable_get_colormap(ic->preedit.window); if (colormap != NULL) { gdk_colormap_query_color(colormap, ic->preedit.foreground, &fg); gdk_colormap_query_color(colormap, ic->preedit.background, &bg); } context = pango_layout_get_context(hilight_l); desc = pango_layout_get_font_description(hilight_l); metrics = pango_context_get_metrics(context, desc, pango_language_from_string("ko")); ascent = pango_font_metrics_get_ascent(metrics); ic->preedit.ascent = PANGO_PIXELS(ascent); ic->preedit.descent = normal_r.height - ic->preedit.ascent; ic->preedit.width = normal_r.width + hilight_r.height + 3; ic->preedit.height = MAX(normal_r.height, hilight_r.height) + 3; nabi_ic_preedit_configure(ic); gdk_window_clear(ic->preedit.window); gdk_draw_layout_with_colors(ic->preedit.window, normal_gc, 1, 1, normal_l, &fg, &bg); gdk_draw_layout_with_colors(ic->preedit.window, hilight_gc, 1 + normal_r.width, 1, hilight_l, &bg, &fg); if (normal_r.width > 0) { int w = normal_r.width + hilight_r.width; int h = MAX(normal_r.height, hilight_r.height); gdk_draw_line(ic->preedit.window, normal_gc, 1, h, 1 + w, h); } g_object_unref(G_OBJECT(normal_l)); g_object_unref(G_OBJECT(hilight_l)); } static void nabi_ic_preedit_x11_draw_string(NabiIC *ic, char* preedit, char *normal, char* hilight) { GC normal_gc; GC hilight_gc; Drawable drawable; XFontSet fontset; XRectangle rect = { 0, }; char* preedit_mb = NULL; char* normal_mb = NULL; char* hilight_mb = NULL; int preedit_size = 0; int normal_size = 0; int hilight_size = 0; if (ic->preedit.window == NULL) return; if (ic->preedit.font_set == 0) return; drawable = GDK_WINDOW_XWINDOW(ic->preedit.window); normal_gc = gdk_x11_gc_get_xgc(ic->preedit.normal_gc); hilight_gc = gdk_x11_gc_get_xgc(ic->preedit.hilight_gc); fontset = ic->preedit.font_set; normal_size = strlen(normal); if (normal_size > 0) { preedit_mb = g_locale_from_utf8(preedit, -1, NULL, NULL, NULL); normal_mb = g_locale_from_utf8(normal, -1, NULL, NULL, NULL); hilight_mb = g_locale_from_utf8(hilight, -1, NULL, NULL, NULL); normal_size = strlen(normal_mb); hilight_size = strlen(hilight_mb); preedit_size = strlen(preedit_mb); } else { preedit_mb = g_locale_from_utf8(preedit, -1, NULL, NULL, NULL); preedit_size = strlen(preedit_mb); } XmbTextExtents(fontset, preedit_mb, preedit_size, NULL, &rect); ic->preedit.ascent = ABS(rect.y); ic->preedit.descent = rect.height - ABS(rect.y); ic->preedit.width = rect.width; ic->preedit.height = rect.height + 1; nabi_ic_preedit_configure(ic); if (normal_size > 0) { int x = 0; int offset; offset = XmbTextEscapement(fontset, normal_mb, normal_size); XmbDrawImageString(nabi_server->display, drawable, fontset, normal_gc, x, ic->preedit.ascent, normal_mb, normal_size); if (hilight_size > 0) { XmbDrawImageString(nabi_server->display, drawable, fontset, hilight_gc, x + offset, ic->preedit.ascent, hilight_mb, hilight_size); } XDrawLine(nabi_server->display, drawable, normal_gc, x, rect.height, x + rect.width, rect.height); } else { XmbDrawImageString(nabi_server->display, drawable, fontset, hilight_gc, 0, ic->preedit.ascent, preedit_mb, preedit_size); } g_free(preedit_mb); g_free(normal_mb); g_free(hilight_mb); } static void nabi_ic_preedit_draw(NabiIC *ic) { char* preedit; char* normal; char* hilight; normal = ustring_to_utf8(ic->preedit.str, -1); hilight = nabi_ic_get_hic_preedit_string(ic); preedit = g_strconcat(normal, hilight, NULL); if (ic->input_style & XIMPreeditPosition) { if (!nabi_server->ignore_app_fontset && ic->preedit.font_set != NULL) nabi_ic_preedit_x11_draw_string(ic, preedit, normal, hilight); else nabi_ic_preedit_gdk_draw_string(ic, preedit, normal, hilight); } else if (ic->input_style & XIMPreeditArea) { nabi_ic_preedit_gdk_draw_string(ic, preedit, normal, hilight); } else if (ic->input_style & XIMPreeditNothing) { nabi_ic_preedit_gdk_draw_string(ic, preedit, normal, hilight); } g_free(preedit); g_free(normal); g_free(hilight); } /* map preedit window */ static void nabi_ic_preedit_show(NabiIC *ic) { if (ic->preedit.window == NULL) return; nabi_log(4, "show preedit window: id = %d-%d\n", ic->connection->id, ic->id); nabi_ic_preedit_configure(ic); /* draw preedit only when ic have any hangul data */ if (!nabi_ic_is_empty(ic)) gdk_window_show(ic->preedit.window); } /* unmap preedit window */ static void nabi_ic_preedit_hide(NabiIC *ic) { if (ic->preedit.window == NULL) return; nabi_log(4, "hide preedit window: id = %d-%d\n", ic->connection->id, ic->id); if (gdk_window_is_visible(ic->preedit.window)) gdk_window_hide(ic->preedit.window); } /* move and resize preedit window */ static void nabi_ic_preedit_configure(NabiIC *ic) { int x = 0, y = 0, w = 1, h = 1; if (ic->preedit.window == NULL) return; if (ic->input_style & XIMPreeditPosition) { x = ic->preedit.spot.x; y = ic->preedit.spot.y - ic->preedit.ascent; w = ic->preedit.width; h = ic->preedit.height; if (ic->preedit.area.width != 0) { /* if preedit window is out of focus window * we force to put it in focus window (preedit.area) */ if (x + w > ic->preedit.area.width) x = ic->preedit.area.width - w; } } else if (ic->input_style & XIMPreeditArea) { x = ic->preedit.area.x; y = ic->preedit.area.y; w = ic->preedit.width; h = ic->preedit.height; } else if (ic->input_style & XIMPreeditNothing) { x = 0; y = 0; w = ic->preedit.width; h = ic->preedit.height; } nabi_log(5, "configure preedit window: %d,%d %dx%d\n", x, y, w, h); gdk_window_move_resize(ic->preedit.window, x, y, w, h); } static GdkFilterReturn gdk_event_filter(GdkXEvent *xevent, GdkEvent *gevent, gpointer data) { XEvent *event = (XEvent*)xevent; guint connect_id = GPOINTER_TO_UINT(data) >> 16; guint ic_id = GPOINTER_TO_UINT(data) & 0xFFFF; NabiIC *ic = nabi_server_get_ic(nabi_server, connect_id, ic_id); if (ic == NULL) return GDK_FILTER_REMOVE; if (ic->preedit.window == NULL) return GDK_FILTER_REMOVE; if (event->xany.window != GDK_WINDOW_XWINDOW(ic->preedit.window)) return GDK_FILTER_CONTINUE; switch (event->type) { case DestroyNotify: /* preedit window is destroyed, so we set it 0 */ ic->preedit.window = NULL; return GDK_FILTER_REMOVE; break; case Expose: //g_print("Redraw Window\n"); nabi_ic_preedit_draw(ic); break; default: //g_print("event type: %d\n", event->type); break; } return GDK_FILTER_CONTINUE; } static void nabi_ic_preedit_window_new(NabiIC *ic) { GdkWindow *parent = NULL; GdkWindowAttr attr; gint mask; guint connect_id; guint ic_id; GdkColor fg = { 0, 0, 0, 0 }; GdkColor bg = { 0, 0, 0, 0 }; if (ic->focus_window != 0) parent = gdk_window_foreign_new(ic->focus_window); else if (ic->client_window != 0) parent = gdk_window_foreign_new(ic->client_window); else return; attr.wclass = GDK_INPUT_OUTPUT; attr.event_mask = GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK; attr.window_type = GDK_WINDOW_TEMP; attr.x = ic->preedit.spot.x; attr.y = ic->preedit.spot.y - ic->preedit.ascent; attr.width = ic->preedit.width; attr.height = ic->preedit.height; /* set override-redirect to true * we should set this to show preedit window on qt apps */ attr.override_redirect = TRUE; mask = GDK_WA_X | GDK_WA_Y | GDK_WA_NOREDIR; ic->preedit.window = gdk_window_new(parent, &attr, mask); fg.pixel = ic->preedit.foreground; bg.pixel = ic->preedit.background; gdk_window_set_background(ic->preedit.window, &bg); if (ic->preedit.normal_gc != NULL) g_object_unref(G_OBJECT(ic->preedit.normal_gc)); if (ic->preedit.hilight_gc != NULL) g_object_unref(G_OBJECT(ic->preedit.hilight_gc)); ic->preedit.normal_gc = gdk_gc_new(ic->preedit.window); gdk_gc_set_foreground(ic->preedit.normal_gc, &fg); gdk_gc_set_background(ic->preedit.normal_gc, &bg); ic->preedit.hilight_gc = gdk_gc_new(ic->preedit.window); gdk_gc_set_foreground(ic->preedit.hilight_gc, &bg); gdk_gc_set_background(ic->preedit.hilight_gc, &fg); /* install our preedit window event filter */ connect_id = ic->connection->id; ic_id = ic->id; gdk_window_add_filter(ic->preedit.window, gdk_event_filter, GUINT_TO_POINTER(connect_id << 16 | ic_id)); g_object_unref(G_OBJECT(parent)); } static void nabi_ic_set_client_window(NabiIC* ic, Window client_window) { Status s; Window w; Window root = None; Window parent = None; Window* children = NULL; unsigned int nchildren = 0; ic->client_window = client_window; w = client_window; s = XQueryTree(nabi_server->display, w, &root, &parent, &children, &nchildren); if (s) { while (parent != root) { if (children != NULL) { XFree(children); children = NULL; } w = parent; s = XQueryTree(nabi_server->display, w, &root, &parent, &children, &nchildren); if (!s) break; } if (children != NULL) { XFree(children); children = NULL; } } nabi_log(3, "ic: %d-%d, toplevel: %x\n", ic->id, ic->connection->id, w); if (ic->toplevel != NULL) nabi_toplevel_unref(ic->toplevel); ic->toplevel = nabi_server_get_toplevel(nabi_server, w); } static void nabi_ic_set_focus_window(NabiIC *ic, Window focus_window) { ic->focus_window = focus_window; } static void nabi_ic_set_preedit_foreground(NabiIC *ic, unsigned long foreground) { GdkColor color = { foreground, 0, 0, 0 }; ic->preedit.foreground = foreground; if (ic->preedit.normal_gc != NULL) gdk_gc_set_foreground(ic->preedit.normal_gc, &color); if (ic->preedit.hilight_gc != NULL) gdk_gc_set_background(ic->preedit.hilight_gc, &color); } static void nabi_ic_set_preedit_background(NabiIC *ic, unsigned long background) { GdkColor color = { background, 0, 0, 0 }; ic->preedit.background = background; if (ic->preedit.normal_gc != NULL) gdk_gc_set_background(ic->preedit.normal_gc, &color); if (ic->preedit.hilight_gc != NULL) gdk_gc_set_foreground(ic->preedit.hilight_gc, &color); if (ic->preedit.window != 0) gdk_window_set_background(ic->preedit.window, &color); } static void nabi_ic_load_preedit_fontset(NabiIC *ic, char *font_name) { NabiFontSet *fontset; if (ic->preedit.base_font != NULL && strcmp(ic->preedit.base_font, font_name) == 0) /* same font, do not create fontset */ return; nabi_free(ic->preedit.base_font); ic->preedit.base_font = strdup(font_name); if (ic->preedit.font_set) nabi_fontset_free(nabi_server->display, ic->preedit.font_set); fontset = nabi_fontset_create(nabi_server->display, font_name); if (fontset == NULL) return; ic->preedit.font_set = fontset->xfontset; ic->preedit.ascent = fontset->ascent; ic->preedit.descent = fontset->descent; ic->preedit.height = ic->preedit.ascent + ic->preedit.descent; ic->preedit.width = 1; } static void nabi_ic_set_spot(NabiIC *ic, XPoint *point) { if (point == NULL) return; ic->preedit.spot.x = point->x; ic->preedit.spot.y = point->y; /* if preedit window is out of focus window * we force it in focus window (preedit.area) */ if (ic->preedit.area.width != 0) { if (ic->preedit.spot.x + ic->preedit.width > ic->preedit.area.width) ic->preedit.spot.x = ic->preedit.area.width - ic->preedit.width; } nabi_ic_preedit_configure(ic); return; if (nabi_ic_is_empty(ic)) nabi_ic_preedit_hide(ic); else nabi_ic_preedit_show(ic); } static void nabi_ic_set_area(NabiIC *ic, XRectangle *rect) { if (rect == NULL) return; ic->preedit.area.x = rect->x; ic->preedit.area.y = rect->y; ic->preedit.area.width = rect->width; ic->preedit.area.height = rect->height; nabi_ic_preedit_configure(ic); if (nabi_ic_is_empty(ic)) nabi_ic_preedit_hide(ic); else nabi_ic_preedit_show(ic); } #define streql(x, y) (strcmp((x), (y)) == 0) void nabi_ic_set_values(NabiIC *ic, IMChangeICStruct *data) { XICAttribute *attr; CARD16 i; if (ic == NULL) return; attr = data->ic_attr; for (i = 0; i < data->ic_attr_num; i++, attr++) { if (streql(XNInputStyle, attr->name)) { CARD32 style = *(CARD32*)attr->value; ic->input_style = style; } else if (streql(XNClientWindow, attr->name)) { Window w = *(CARD32*)attr->value; nabi_ic_set_client_window(ic, w); } else if (streql(XNFocusWindow, attr->name)) { Window w = *(CARD32*)attr->value; nabi_ic_set_focus_window(ic, w); } else if (streql(XNStringConversionCallback, attr->name)) { ic->has_str_conv_cb = TRUE; } else { nabi_log(1, "set unknown ic attribute: %s\n", attr->name); } } attr = data->preedit_attr; for (i = 0; i < data->preedit_attr_num; i++, attr++) { if (streql(XNSpotLocation, attr->name)) { XPoint* point = (XPoint*)attr->value; nabi_ic_set_spot(ic, point); } else if (streql(XNForeground, attr->name)) { CARD32 color = *(CARD32*)attr->value; nabi_ic_set_preedit_foreground(ic, color); } else if (streql(XNBackground, attr->name)) { CARD32 color = *(CARD32*)attr->value; nabi_ic_set_preedit_background(ic, color); } else if (streql(XNArea, attr->name)) { XRectangle* rect = (XRectangle*)attr->value; nabi_ic_set_area(ic, rect); } else if (streql(XNLineSpace, attr->name)) { CARD32 line_space = *(CARD32*)attr->value; ic->preedit.line_space = line_space; } else if (streql(XNPreeditState, attr->name)) { CARD32 state = *(CARD32*)attr->value; ic->preedit.state = state; } else if (streql(XNFontSet, attr->name)) { char* fontset = (char*)attr->value; if (!nabi_server->ignore_app_fontset) { nabi_ic_load_preedit_fontset(ic, fontset); } nabi_log(5, "set ic value: id = %d-%d, fontset = %s\n", ic->id, ic->connection->id, fontset); } else if (streql(XNPreeditStartCallback, attr->name)) { ic->preedit.has_start_cb = TRUE; } else if (streql(XNPreeditDrawCallback, attr->name)) { ic->preedit.has_draw_cb = TRUE; } else if (streql(XNPreeditDoneCallback, attr->name)) { ic->preedit.has_done_cb = TRUE; } else { nabi_log(1, "set unknown preedit attribute: %s\n", attr->name); } } attr = data->status_attr; for (i = 0; i < data->status_attr_num; i++, attr++) { if (streql(XNArea, attr->name)) { XRectangle* rect = (XRectangle*)attr->value; ic->status.area = *rect; } else if (streql(XNAreaNeeded, attr->name)) { XRectangle* rect = (XRectangle*)attr->value; ic->status.area_needed = *rect; } else if (streql(XNForeground, attr->name)) { CARD32 color = *(CARD32*)attr->value; ic->status.foreground = color; } else if (streql(XNBackground, attr->name)) { CARD32 color = *(CARD32*)attr->value; ic->status.background = color; } else if (streql(XNLineSpace, attr->name)) { CARD32 line_space = *(CARD32*)attr->value; ic->status.line_space = line_space; } else if (streql(XNFontSet, attr->name)) { char* fontset = (char*)attr->value; g_free(ic->status.base_font); ic->status.base_font = g_strdup(fontset); } else { nabi_log(1, "set unknown status attributes: %s\n", attr->name); } } } void nabi_ic_get_values(NabiIC *ic, IMChangeICStruct *data) { XICAttribute *attr; CARD16 i; if (ic == NULL) return; attr = data->ic_attr; for (i = 0; i < data->ic_attr_num; i++, attr++) { if (streql(XNFilterEvents, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = KeyPressMask | KeyReleaseMask; } else if (streql(XNInputStyle, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->input_style; } else if (streql(XNPreeditState, attr->name)) { /* some java applications need XNPreeditState attribute in * IC attribute instead of Preedit attributes * so we support XNPreeditState attr here */ attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->preedit.state; } else if (streql(XNSeparatorofNestedList, attr->name)) { // ignore } else { nabi_log(1, "get unknown ic attributes: %s\n", attr->name); } if (attr->value == NULL) attr->value_length = 0; } attr = data->preedit_attr; for (i = 0; i < data->preedit_attr_num; i++, attr++) { if (streql(XNArea, attr->name)) { attr->value_length = sizeof(XRectangle); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(XRectangle*)attr->value = ic->preedit.area; } else if (streql(XNAreaNeeded, attr->name)) { attr->value_length = sizeof(XRectangle); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(XRectangle*)attr->value = ic->preedit.area_needed; } else if (streql(XNSpotLocation, attr->name)) { attr->value_length = sizeof(XPoint); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(XPoint*)attr->value = ic->preedit.spot; } else if (streql(XNForeground, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->preedit.foreground; } else if (streql(XNBackground, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->preedit.background; } else if (streql(XNLineSpace, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->preedit.line_space; } else if (streql(XNPreeditState, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->preedit.state; } else if (streql(XNFontSet, attr->name)) { attr->value_length = strlen(ic->preedit.base_font) + 1; attr->value = malloc(attr->value_length); if (attr->value != NULL) strncpy(attr->value, ic->preedit.base_font, attr->value_length); } else { nabi_log(1, "get unknown preedit attributes: %s\n", attr->name); } if (attr->value == NULL) attr->value_length = 0; } attr = data->status_attr; for (i = 0; i < data->status_attr_num; i++, attr++) { if (streql(XNArea, attr->name)) { attr->value_length = sizeof(XRectangle); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(XRectangle*)attr->value = ic->status.area; } else if (streql(XNAreaNeeded, attr->name)) { attr->value_length = sizeof(XRectangle); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(XRectangle*)attr->value = ic->status.area_needed; } else if (streql(XNForeground, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->status.foreground; } else if (streql(XNBackground, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->status.background; } else if (streql(XNLineSpace, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->status.line_space; } else if (streql(XNFontSet, attr->name)) { attr->value_length = strlen(ic->status.base_font) + 1; attr->value = malloc(attr->value_length); if (attr->value != NULL) strncpy(attr->value, ic->status.base_font, attr->value_length); } else { nabi_log(1, "get unknown status attributes: %s\n", attr->name); } if (attr->value == NULL) attr->value_length = 0; } } #undef streql static char *utf8_to_compound_text(const char *utf8) { char *list[2]; XTextProperty tp; int ret; list[0] = g_locale_from_utf8(utf8, -1, NULL, NULL, NULL); list[1] = 0; ret = XmbTextListToTextProperty(nabi_server->display, list, 1, XCompoundTextStyle, &tp); g_free(list[0]); if (ret > 0) nabi_log(1, "conversion failure: %d\n", ret); return (char*)tp.value; } void nabi_ic_reset(NabiIC *ic, IMResetICStruct *data) { char* preedit = nabi_ic_get_flush_string(ic); if (preedit != NULL && strlen(preedit) > 0) { char* compound_text = utf8_to_compound_text(preedit); data->commit_string = compound_text; data->length = strlen(compound_text); } else { data->commit_string = NULL; data->length = 0; } g_free(preedit); ustring_clear(ic->preedit.str); ic->preedit.prev_length = 0; if (ic->input_style & XIMPreeditPosition) { nabi_ic_preedit_hide(ic); } else if (ic->input_style & XIMPreeditArea) { nabi_ic_preedit_hide(ic); } else if (ic->input_style & XIMPreeditNothing) { nabi_ic_preedit_hide(ic); } } void nabi_ic_set_focus(NabiIC* ic) { NabiInputMode mode = ic->mode; switch (nabi_server->input_mode_scope) { case NABI_INPUT_MODE_PER_DESKTOP: mode = nabi_server->input_mode; break; case NABI_INPUT_MODE_PER_APPLICATION: if (ic->connection != NULL) mode = ic->connection->mode; break; case NABI_INPUT_MODE_PER_TOPLEVEL: if (ic->toplevel != NULL) mode = ic->toplevel->mode; break; case NABI_INPUT_MODE_PER_IC: default: break; } nabi_ic_set_mode(ic, mode); nabi_ic_set_hangul_keyboard(ic, nabi_server->hangul_keyboard); } void nabi_ic_set_mode(NabiIC *ic, NabiInputMode mode) { switch (nabi_server->input_mode_scope) { case NABI_INPUT_MODE_PER_DESKTOP: nabi_server->input_mode = mode; break; case NABI_INPUT_MODE_PER_APPLICATION: if (ic->connection != NULL) ic->connection->mode = mode; break; case NABI_INPUT_MODE_PER_TOPLEVEL: if (ic->toplevel != NULL) ic->toplevel->mode = mode; break; case NABI_INPUT_MODE_PER_IC: default: break; } ic->mode = mode; switch (mode) { case NABI_INPUT_MODE_DIRECT: nabi_ic_flush(ic); nabi_server_set_mode_info(nabi_server, NABI_MODE_INFO_DIRECT); nabi_ic_end_composing(ic); break; case NABI_INPUT_MODE_COMPOSE: /* 전에는 여기서 nabi_ic_preedit_start()함수를 불렀는데 * gvim에서 문제가 생겨서 키 입력이 시작될때 preedit start를 부르도록 * 수정했다. #305259 * gvim에서 :이나 /입력할때 영문 상태로 바꾸기위해서 * xic를 destroy했다가 create하는데, * 그런데 focus 이벤트에서 preedit start 콜백을 부르면 * xim client에서는 두번째 XCreateIC() 안에서 xim server로부터 응답을 * 기다리다가 방금전 focus 이벤트에서 보냈던 preedit start callback을 * 받아 이제 처리하게 된다. 이것은 방금전에 destroy된 IC의 것임에도 * xlib에서는 그 응답을 받아서 preedit_start callback을 처리하는데 * gvim의 preedit start callback에서는 다시 XIC를 create한다. * 따라서 XCreateIC() 함수안에서 다시 XCreateIC()를 부른 상황이 되는데 * 이러면 첫번째 XCreateIC()의 응답이 먼처 처리되어야 하는데, 그렇지 * 못하고 두번째 XCreateIC() 함수의 응답을 기다리게 되면서 xim * client 가 block 된다. * 이 문제를 쉽게 해결하기 위해서 preedit start 프로토콜을 * 아무 키입력이나 시작했을 때에 보내는 방식으로 바꾼다. */ nabi_server_set_mode_info(nabi_server, NABI_MODE_INFO_COMPOSE); nabi_ic_start_composing(ic); break; default: break; } nabi_ic_status_update(ic); } void nabi_ic_start_composing(NabiIC *ic) { if (ic->composing_started) return; nabi_log(3, "start composing: %d-%d\n", ic->connection->id, ic->id); ic->composing_started = TRUE; if (nabi_server->dynamic_event_flow) { IMPreeditStateStruct preedit_state; preedit_state.connect_id = ic->connection->id; preedit_state.icid = ic->id; IMPreeditStart(nabi_server->xims, (XPointer)&preedit_state); } } void nabi_ic_end_composing(NabiIC *ic) { if (!ic->composing_started) return; nabi_log(3, "end composing: %d-%d\n", ic->connection->id, ic->id); ic->composing_started = FALSE; if (nabi_server->dynamic_event_flow) { IMPreeditStateStruct preedit_state; preedit_state.connect_id = ic->connection->id; preedit_state.icid = ic->id; IMPreeditEnd(nabi_server->xims, (XPointer)&preedit_state); } } void nabi_ic_preedit_start(NabiIC *ic) { if (ic->preedit.start) return; nabi_log(3, "preedit start: %d-%d\n", ic->connection->id, ic->id); if (ic->input_style & XIMPreeditCallbacks) { if (ic->preedit.has_start_cb) { IMPreeditCBStruct preedit_data; preedit_data.major_code = XIM_PREEDIT_START; preedit_data.minor_code = 0; preedit_data.connect_id = ic->connection->id; preedit_data.icid = ic->id; preedit_data.todo.return_value = 0; IMCallCallback(nabi_server->xims, (XPointer)&preedit_data); } } else if (ic->input_style & XIMPreeditPosition) { if (ic->preedit.window == NULL) nabi_ic_preedit_window_new(ic); } else if (ic->input_style & XIMPreeditArea) { if (ic->preedit.window == NULL) nabi_ic_preedit_window_new(ic); } else if (ic->input_style & XIMPreeditNothing) { if (ic->preedit.window == NULL) nabi_ic_preedit_window_new(ic); } ic->preedit.start = True; } void nabi_ic_preedit_done(NabiIC *ic) { if (!ic->preedit.start) return; nabi_log(3, "preedit done: %d-%d\n", ic->connection->id, ic->id); if (ic->input_style & XIMPreeditCallbacks) { if (ic->preedit.has_done_cb) { IMPreeditCBStruct preedit_data; preedit_data.major_code = XIM_PREEDIT_DONE; preedit_data.minor_code = 0; preedit_data.connect_id = ic->connection->id; preedit_data.icid = ic->id; preedit_data.todo.return_value = 0; IMCallCallback(nabi_server->xims, (XPointer)&preedit_data); } } else if (ic->input_style & XIMPreeditPosition) { nabi_ic_preedit_hide(ic); } else if (ic->input_style & XIMPreeditArea) { nabi_ic_preedit_hide(ic); } else if (ic->input_style & XIMPreeditNothing) { nabi_ic_preedit_hide(ic); } ic->preedit.start = False; } static char* nabi_ic_get_hic_preedit_string(NabiIC *ic) { const ucschar *str = hangul_ic_get_preedit_string(ic->hic); return g_ucs4_to_utf8((const gunichar*)str, -1, NULL, NULL, NULL); } static char* nabi_ic_get_preedit_string(NabiIC *ic) { char* preedit; const ucschar* hic_preedit; UString* str; str = ustring_new(); ustring_append(str, ic->preedit.str); hic_preedit = hangul_ic_get_preedit_string(ic->hic); ustring_append_ucs4(str, hic_preedit, -1); preedit = ustring_to_utf8(str, str->len); ustring_delete(str); return preedit; } static char* nabi_ic_get_hic_commit_string(NabiIC *ic) { const ucschar *str = hangul_ic_get_commit_string(ic->hic); return g_ucs4_to_utf8((const gunichar*)str, -1, NULL, NULL, NULL); } static char* nabi_ic_get_flush_string(NabiIC *ic) { char* flushed; const ucschar* hic_flushed; GArray* str; str = ustring_new(); ustring_append(str, ic->preedit.str); hic_flushed = hangul_ic_flush(ic->hic); ustring_append_ucs4(str, hic_flushed, -1); flushed = ustring_to_utf8(str, -1); ustring_delete(str); return flushed; } static inline XIMFeedback * nabi_ic_preedit_feedback_new(int underline_len, int reverse_len) { int i, len = underline_len + reverse_len; XIMFeedback *feedback = g_new(XIMFeedback, len + 1); if (feedback != NULL) { for (i = 0; i < underline_len; ++i) feedback[i] = XIMUnderline; for (i = underline_len; i < len; ++i) feedback[i] = XIMReverse; feedback[len] = 0; } return feedback; } void nabi_ic_preedit_update(NabiIC *ic) { int preedit_len, normal_len, hilight_len; char* preedit; char* normal; char* hilight; normal = ustring_to_utf8(ic->preedit.str, -1); hilight = nabi_ic_get_hic_preedit_string(ic); preedit = g_strconcat(normal, hilight, NULL); normal_len = g_utf8_strlen(normal, -1); hilight_len = g_utf8_strlen(hilight, -1); preedit_len = normal_len + hilight_len; if (preedit_len <= 0) { if (ic->candidate != NULL) { nabi_candidate_delete(ic->candidate); ic->candidate = NULL; } nabi_ic_preedit_clear(ic); g_free(normal); g_free(hilight); g_free(preedit); if (ic->preedit.start) nabi_ic_preedit_done(ic); return; } if (!ic->preedit.start) nabi_ic_preedit_start(ic); nabi_log(3, "update preedit: id = %d-%d, preedit = '%s' + '%s'\n", ic->connection->id, ic->id, normal, hilight); if (ic->input_style & XIMPreeditCallbacks) { if (ic->preedit.has_draw_cb) { char *compound_text; XIMText text; IMPreeditCBStruct data; compound_text = utf8_to_compound_text(preedit); data.major_code = XIM_PREEDIT_DRAW; data.minor_code = 0; data.connect_id = ic->connection->id; data.icid = ic->id; data.todo.draw.caret = preedit_len; data.todo.draw.chg_first = 0; data.todo.draw.chg_length = ic->preedit.prev_length; data.todo.draw.text = &text; text.feedback = nabi_ic_preedit_feedback_new(normal_len, hilight_len); text.encoding_is_wchar = False; text.string.multi_byte = compound_text; text.length = strlen(compound_text); IMCallCallback(nabi_server->xims, (XPointer)&data); g_free(text.feedback); XFree(compound_text); } } else if (ic->input_style & XIMPreeditPosition) { nabi_ic_preedit_show(ic); if (!nabi_server->ignore_app_fontset && ic->preedit.font_set != NULL) nabi_ic_preedit_x11_draw_string(ic, preedit, normal, hilight); else nabi_ic_preedit_gdk_draw_string(ic, preedit, normal, hilight); } else if (ic->input_style & XIMPreeditArea) { nabi_ic_preedit_show(ic); nabi_ic_preedit_gdk_draw_string(ic, preedit, normal, hilight); } else if (ic->input_style & XIMPreeditNothing) { nabi_ic_preedit_show(ic); nabi_ic_preedit_gdk_draw_string(ic, preedit, normal, hilight); } ic->preedit.prev_length = preedit_len; g_free(normal); g_free(hilight); g_free(preedit); } void nabi_ic_preedit_clear(NabiIC *ic) { if (ic->preedit.prev_length == 0) return; if (ic->input_style & XIMPreeditCallbacks) { if (ic->preedit.has_draw_cb) { XIMText text; XIMFeedback feedback[4] = { XIMReverse, 0, 0, 0 }; IMPreeditCBStruct data; nabi_log(3, "clear preedit: id = %d-%d\n", ic->connection->id, ic->id); data.major_code = XIM_PREEDIT_DRAW; data.minor_code = 0; data.connect_id = ic->connection->id; data.icid = ic->id; data.todo.draw.caret = 0; data.todo.draw.chg_first = 0; data.todo.draw.chg_length = ic->preedit.prev_length; data.todo.draw.text = &text; text.feedback = feedback; text.encoding_is_wchar = False; text.string.multi_byte = NULL; text.length = 0; IMCallCallback(nabi_server->xims, (XPointer)&data); } } else if (ic->input_style & XIMPreeditPosition) { nabi_ic_preedit_hide(ic); } else if (ic->input_style & XIMPreeditArea) { nabi_ic_preedit_hide(ic); } else if (ic->input_style & XIMPreeditNothing) { nabi_ic_preedit_hide(ic); } ic->preedit.prev_length = 0; } static void nabi_ic_commit_utf8(NabiIC *ic, const char *utf8_str) { IMCommitStruct commit_data; char *compound_text; /* According to XIM Spec, We should delete preedit string here * befor commiting the string. but it makes too many flickering * so I first send commit string and then delete preedit string. * This makes some problem on gtk2 entry */ /* Now, Conforming to XIM spec */ /* On XIMPreeditPosition mode, input sequence is wrong on gtk+ 1 app, * so we commit and then clear preedit string on XIMPreeditPosition mode */ if (ic->input_style & XIMPreeditCallbacks) nabi_ic_preedit_clear(ic); nabi_log(1, "commit: id = %d-%d, str = '%s'\n", ic->connection->id, ic->id, utf8_str); compound_text = utf8_to_compound_text(utf8_str); commit_data.major_code = XIM_COMMIT; commit_data.minor_code = 0; commit_data.connect_id = ic->connection->id; commit_data.icid = ic->id; commit_data.flag = XimLookupChars; commit_data.commit_string = compound_text; IMCommitString(nabi_server->xims, (XPointer)&commit_data); XFree(compound_text); /* we delete preedit string here when PreeditPosition */ if (!(ic->input_style & XIMPreeditCallbacks)) nabi_ic_preedit_clear(ic); } Bool nabi_ic_commit(NabiIC *ic) { if (nabi_server->commit_by_word || nabi_server->hanja_mode) { const ucschar *str = hangul_ic_get_commit_string(ic->hic); ustring_append_ucs4(ic->preedit.str, str, -1); if (hangul_ic_is_empty(ic->hic)) nabi_ic_flush(ic); } else { char* str = nabi_ic_get_hic_commit_string(ic); if (str != NULL && strlen(str) > 0) nabi_ic_commit_utf8(ic, str); g_free(str); } return True; } void nabi_ic_flush(NabiIC *ic) { char* str; nabi_ic_preedit_clear(ic); nabi_ic_preedit_done(ic); str = nabi_ic_get_flush_string(ic); if (str != NULL && strlen(str) > 0) nabi_ic_commit_utf8(ic, str); g_free(str); ustring_clear(ic->preedit.str); } void nabi_ic_status_start(NabiIC *ic) { if (!nabi_server->show_status) return; if (ic->input_style & XIMStatusCallbacks) { IMStatusCBStruct data; char *compound_text; XIMText text; XIMFeedback feedback[4] = { 0, 0, 0, 0 }; compound_text = ""; data.major_code = XIM_STATUS_START; data.minor_code = 0; data.connect_id = ic->connection->id; data.icid = ic->id; data.todo.draw.data.text = &text; data.todo.draw.type = XIMTextType; text.feedback = feedback; text.encoding_is_wchar = False; text.string.multi_byte = compound_text; text.length = strlen(compound_text); IMCallCallback(nabi_server->xims, (XPointer)&data); } g_print("Status start\n"); } void nabi_ic_status_done(NabiIC *ic) { if (!nabi_server->show_status) return; if (ic->input_style & XIMStatusCallbacks) { IMStatusCBStruct data; char *compound_text; XIMText text; XIMFeedback feedback[4] = { 0, 0, 0, 0 }; compound_text = ""; data.major_code = XIM_STATUS_DONE; data.minor_code = 0; data.connect_id = ic->connection->id; data.icid = ic->id; data.todo.draw.data.text = &text; data.todo.draw.type = XIMTextType; text.feedback = feedback; text.encoding_is_wchar = False; text.string.multi_byte = compound_text; text.length = strlen(compound_text); IMCallCallback(nabi_server->xims, (XPointer)&data); } g_print("Status done\n"); } void nabi_ic_status_update(NabiIC *ic) { if (!nabi_server->show_status) return; if (ic->input_style & XIMStatusCallbacks) { IMStatusCBStruct data; char *status_str; char *compound_text; XIMText text; XIMFeedback feedback[4] = { 0, 0, 0, 0 }; switch (ic->mode) { case NABI_INPUT_MODE_DIRECT: status_str = "영어"; break; case NABI_INPUT_MODE_COMPOSE: status_str = "한글"; break; default: status_str = ""; break; } compound_text = utf8_to_compound_text(status_str); data.major_code = XIM_STATUS_DRAW; data.minor_code = 0; data.connect_id = ic->connection->id; data.icid = ic->id; data.todo.draw.data.text = &text; data.todo.draw.type = XIMTextType; text.feedback = feedback; text.encoding_is_wchar = False; text.string.multi_byte = compound_text; text.length = strlen(compound_text); IMCallCallback(nabi_server->xims, (XPointer)&data); } g_print("Status draw\n"); } static Bool nabi_ic_candidate_process(NabiIC* ic, KeySym keyval) { const Hanja* hanja = NULL; switch (keyval) { case XK_Up: nabi_candidate_prev(ic->candidate); break; case XK_Down: nabi_candidate_next(ic->candidate); break; case XK_Left: case XK_Page_Up: case XK_KP_Subtract: nabi_candidate_prev_page(ic->candidate); break; case XK_Right: case XK_Page_Down: case XK_KP_Add: nabi_candidate_next_page(ic->candidate); break; case XK_Escape: nabi_candidate_delete(ic->candidate); ic->candidate = NULL; break; case XK_Return: case XK_KP_Enter: hanja = nabi_candidate_get_current(ic->candidate); break; case XK_1: case XK_2: case XK_3: case XK_4: case XK_5: case XK_6: case XK_7: case XK_8: case XK_9: hanja = nabi_candidate_get_nth(ic->candidate, keyval - XK_1); break; case XK_KP_1: case XK_KP_2: case XK_KP_3: case XK_KP_4: case XK_KP_5: case XK_KP_6: case XK_KP_7: case XK_KP_8: case XK_KP_9: hanja = nabi_candidate_get_nth(ic->candidate, keyval - XK_KP_1); break; case XK_KP_End: hanja = nabi_candidate_get_nth(ic->candidate, 0); break; case XK_KP_Down: hanja = nabi_candidate_get_nth(ic->candidate, 1); break; case XK_KP_Next: hanja = nabi_candidate_get_nth(ic->candidate, 2); break; case XK_KP_Left: hanja = nabi_candidate_get_nth(ic->candidate, 3); break; case XK_KP_Begin: hanja = nabi_candidate_get_nth(ic->candidate, 4); break; case XK_KP_Right: hanja = nabi_candidate_get_nth(ic->candidate, 5); break; case XK_KP_Home: hanja = nabi_candidate_get_nth(ic->candidate, 6); break; case XK_KP_Up: hanja = nabi_candidate_get_nth(ic->candidate, 7); break; case XK_KP_Prior: hanja = nabi_candidate_get_nth(ic->candidate, 8); break; default: if (nabi_server->hanja_mode) { return False; } else { switch (keyval) { case XK_k: nabi_candidate_prev(ic->candidate); break; case XK_j: nabi_candidate_next(ic->candidate); break; case XK_h: nabi_candidate_prev_page(ic->candidate); break; case XK_l: case XK_space: case XK_Tab: nabi_candidate_next_page(ic->candidate); break; default: return False; } } } if (hanja != NULL) { nabi_ic_insert_candidate(ic, hanja); nabi_ic_preedit_update(ic); nabi_ic_update_candidate_window(ic); } return True; } static void nabi_ic_request_client_text(NabiIC* ic) { if (ic->has_str_conv_cb) { IMStrConvCBStruct data; ic->wait_for_client_text = TRUE; data.major_code = XIM_STR_CONVERSION; data.minor_code = 0; data.connect_id = ic->connection->id; data.icid = ic->id; data.strconv.position = (XIMStringConversionPosition)0; data.strconv.direction = XIMBackwardChar; data.strconv.operation = XIMStringConversionRetrieval; data.strconv.factor = 10; data.strconv.text = NULL; IMCallCallback(nabi_server->xims, (XPointer)&data); nabi_log(3, "request client text: id = %d-%d\n", ic->connection->id, ic->id); } } static void nabi_ic_delete_client_text(NabiIC* ic, size_t len) { if (ic->has_str_conv_cb) { IMStrConvCBStruct data; data.major_code = XIM_STR_CONVERSION; data.minor_code = 0; data.connect_id = ic->connection->id; data.icid = ic->id; data.strconv.position = (XIMStringConversionPosition)0; data.strconv.direction = XIMBackwardChar; data.strconv.operation = XIMStringConversionSubstitution; data.strconv.factor = len; data.strconv.text = NULL; IMCallCallback(nabi_server->xims, (XPointer)&data); nabi_log(3, "delete client text: id = %d-%d, pos = %d, len = %d\n", ic->connection->id, ic->id, data.strconv.position, data.strconv.factor); } } static KeySym nabi_ic_normalize_keysym(NabiIC* ic, KeySym keysym, unsigned int state) { KeySym upper, lower; bool need_normalize; /* unicode keysym */ if ((keysym & 0xff000000) == 0x01000000) keysym &= 0x00ffffff; need_normalize = !hangul_ic_is_transliteration(ic->hic); if (need_normalize) { /* for non-qwerty mapping */ if (nabi_server->use_system_keymap && nabi_server->layout != NULL) { keysym = nabi_keyboard_layout_get_key(nabi_server->layout, keysym); } upper = keysym; lower = keysym; XConvertCase(keysym, &lower, &upper); if (state & ShiftMask) keysym = upper; else keysym = lower; } return keysym; } Bool nabi_ic_process_keyevent(NabiIC* ic, KeySym keysym, unsigned int state) { Bool ret; if (ic->candidate) { ret = nabi_ic_candidate_process(ic, keysym); if (nabi_server->hanja_mode) { if (ret) return ret; } else { return ret; } } /* if shift is pressed, we dont commit current string * and silently ignore it */ if (keysym == XK_Shift_L || keysym == XK_Shift_R) return False; /* for vi user: on Esc we change state to direct mode */ if (nabi_server_is_off_key(nabi_server, keysym, state)) { /* 이 경우는 vi 나 emacs등 에디터에서 사용하기 위한 키이므로 * 이 키를 xim에서 사용하지 않고 그대로 다시 forwarding하는 * 방식으로 작동하게 한다. */ nabi_ic_set_mode(ic, NABI_INPUT_MODE_DIRECT); return False; } /* candiate */ if (nabi_server_is_candidate_key(nabi_server, keysym, state)) { nabi_ic_request_client_text(ic); nabi_ic_update_candidate_window(ic); return True; } /* forward key event and commit current string if any state is on */ if (state & (ControlMask | /* Ctl */ Mod1Mask | /* Alt */ Mod3Mask | Mod4Mask | /* Windows */ Mod5Mask)) { if (!nabi_ic_is_empty(ic)) nabi_ic_flush(ic); return False; } /* save key event log */ nabi_server_log_key(nabi_server, keysym, state); if (keysym == XK_BackSpace) { ret = hangul_ic_backspace(ic->hic); if (ret) nabi_ic_preedit_update(ic); else { guint len = ustring_length(ic->preedit.str); if (len > 0) { ustring_erase(ic->preedit.str, len - 1, 1); nabi_ic_preedit_update(ic); return True; } } return ret; } keysym = nabi_ic_normalize_keysym(ic, keysym, state); if (keysym >= XK_exclam && keysym <= XK_asciitilde) { ret = hangul_ic_process(ic->hic, keysym); nabi_ic_commit(ic); nabi_ic_preedit_update(ic); if (nabi_server->hanja_mode) { nabi_ic_update_candidate_window(ic); } return ret; } if (nabi_server->hanja_mode) { if (ic->candidate != NULL) { nabi_candidate_delete(ic->candidate); ic->candidate = NULL; } } nabi_ic_flush(ic); return False; } static void nabi_ic_candidate_commit_cb(NabiCandidate *candidate, const Hanja* hanja, gpointer data) { NabiIC *ic; if (candidate == NULL || data == NULL) return; ic = (NabiIC*)data; nabi_ic_insert_candidate(ic, hanja); nabi_ic_preedit_update(ic); nabi_ic_update_candidate_window(ic); } static void nabi_ic_close_candidate_window(NabiIC* ic) { nabi_candidate_delete(ic->candidate); ic->candidate = NULL; } static Bool nabi_ic_update_candidate_window_with_key(NabiIC *ic, const char* key) { Window parent = 0; HanjaList* list; char* p; char* normalized; int valid_list_length = 0; const Hanja **valid_list = NULL; if (ic->focus_window != 0) parent = ic->focus_window; else if (ic->client_window != 0) parent = ic->client_window; p = strrchr(key, ' '); if (p != NULL) key = p; while (isspace(*key) || ispunct(*key)) key++; if (key[0] == '\0') { nabi_ic_close_candidate_window(ic); return True; } /* candidate 검색을 위한 스트링이 자모형일 수도 있으므로 normalized하여 * hanja table에서 검색을 해야 한다. */ normalized = g_utf8_normalize(key, -1, G_NORMALIZE_DEFAULT_COMPOSE); if (normalized == NULL) { nabi_ic_close_candidate_window(ic); return True; } nabi_log(6, "lookup string: %s\n", normalized); if (nabi_server->hanja_mode && ic->client_text == NULL) list = hanja_table_match_prefix(nabi_server->symbol_table, normalized); else if (nabi_server->commit_by_word && ic->client_text == NULL) list = hanja_table_match_prefix(nabi_server->symbol_table, normalized); else list = hanja_table_match_suffix(nabi_server->symbol_table, normalized); if (list == NULL) { if (nabi_server->hanja_mode && ic->client_text == NULL) list = hanja_table_match_prefix(nabi_server->hanja_table, normalized); else if (nabi_server->commit_by_word && ic->client_text == NULL) list = hanja_table_match_prefix(nabi_server->hanja_table, normalized); else list = hanja_table_match_suffix(nabi_server->hanja_table, normalized); } if (list != NULL) { int i; int n = hanja_list_get_size(list); valid_list = g_new(const Hanja*, n); if (nabi_connection_need_check_charset(ic->connection)) { int j; for (i = 0, j = 0; i < n; i++) { const Hanja* hanja = hanja_list_get_nth(list, i); const char* value = hanja_get_value(hanja); if (nabi_connection_is_valid_str(ic->connection, value)) { valid_list[j] = hanja; j++; } } valid_list_length = j; } else { for (i = 0; i < n; i++) { valid_list[i] = hanja_list_get_nth(list, i); } valid_list_length = n; } } if (valid_list_length > 0) { if (ic->candidate != NULL) { nabi_candidate_set_hanja_list(ic->candidate, list, valid_list, valid_list_length); } else { ic->candidate = nabi_candidate_new(key, 9, list, valid_list, valid_list_length, parent, &nabi_ic_candidate_commit_cb, ic); } } else { nabi_ic_close_candidate_window(ic); } g_free(normalized); return True; } static Bool nabi_ic_update_candidate_window(NabiIC *ic) { Bool res; char* key = nabi_ic_get_preedit_string(ic); res = nabi_ic_update_candidate_window_with_key(ic, key); g_free(key); return res; } void nabi_ic_insert_candidate(NabiIC *ic, const Hanja* hanja) { const char* key; const char* value; int keylen = -1; if (!nabi_server_is_valid_ic(nabi_server, ic)) return; value = hanja_get_value(hanja); if (value == NULL) return; key = hanja_get_key(hanja); if (key != NULL) keylen = g_utf8_strlen(key, -1); if ((nabi_server->hanja_mode && ic->client_text == NULL) || (nabi_server->commit_by_word && ic->client_text == NULL)) { /* 한자 모드나 단어 단위 입력에서는 prefix 방식으로 매칭하여 변환하므로 * 앞에서부터 preedit text를 지워 나간다. * 그러나 client text가 있을 때에는 suffix 방식으로 검색해야 한다. */ if (ic->preedit.str != NULL && ic->preedit.str->len > 0) { const ucschar* begin = ustring_begin(ic->preedit.str); const ucschar* end = ustring_end(ic->preedit.str); const ucschar* iter = begin; guint n; while (keylen > 0 && iter < end) { iter = ustr_syllable_iter_next(iter, end); keylen--; } n = iter - begin; if (n > 0) ustring_erase(ic->preedit.str, 0, n); } if (keylen > 0) { if (!hangul_ic_is_empty(ic->hic)) { hangul_ic_reset(ic->hic); keylen--; } } } else { /* candidate를 입력하려면 원래 텍스트에서 candidate로 교체될 부분을 * 지우고 commit 하여야 한다. * 입력이 자모스트링으로 된 경우를 대비하여 syllable 단위로 글자를 * 지운다. libhangul의 suffix 방식으로 매칭하는 것이므로 뒤쪽부터 한 * 음절씩 지워 나간다. * candidate string의 구조는 * * client_text + nabi_ic_preedit_str + hangul_ic_preedit_str * * 과 같으므로 뒤쪽부터 순서대로 지운다.*/ /* hangul_ic_preedit_str */ if (keylen > 0) { if (!hangul_ic_is_empty(ic->hic)) { hangul_ic_reset(ic->hic); keylen--; } } /* nabi_ic_preedit_str */ if (ic->preedit.str != NULL) { const ucschar* begin = ustring_begin(ic->preedit.str); const ucschar* iter = ustring_end(ic->preedit.str); while (keylen > 0 && ustring_length(ic->preedit.str) > 0) { guint pos; guint n; iter = ustr_syllable_iter_prev(iter, begin); pos = iter - begin; n = ustring_length(ic->preedit.str) - pos; ustring_erase(ic->preedit.str, pos, n); keylen--; } } /* client_text */ if (ic->client_text != NULL) { const ucschar* begin = ustring_begin(ic->client_text); const ucschar* end = ustring_end(ic->client_text); const ucschar* iter = end; while (keylen > 0 && iter > begin) { iter = ustr_syllable_iter_prev(iter, begin); keylen--; } nabi_ic_delete_client_text(ic, end - iter); } } if (strlen(value) > 0) { char* preedit_left = NULL; char* modified_value; char* candidate; /* nabi ic의 preedit string이 남아 있으면 그것도 commit해야지 * 그렇지 않으면 한자로 변환되지 않은 preedit string은 한자 변환후 * commit된 스트링뒤에서 나타나게 된다. */ if (ustring_length(ic->preedit.str) > 0) { preedit_left = ustring_to_utf8(ic->preedit.str, -1); if (!nabi_server->hanja_mode && !nabi_server->commit_by_word) { ustring_clear(ic->preedit.str); } } else { preedit_left = g_strdup(""); } if (nabi_server->use_simplified_chinese) { modified_value = nabi_traditional_to_simplified(value); if (!nabi_connection_is_valid_str(ic->connection, modified_value)) { g_free(modified_value); modified_value = g_strdup(value); } } else { modified_value = g_strdup(value); } if (strcmp(nabi->config->candidate_format->str, "hanja(hangul)") == 0) { if (nabi_server->hanja_mode || nabi_server->commit_by_word) candidate = g_strdup_printf("%s(%s)", modified_value, key); else candidate = g_strdup_printf("%s%s(%s)", preedit_left, modified_value, key); } else if (strcmp(nabi->config->candidate_format->str, "hangul(hanja)") == 0) { if (nabi_server->hanja_mode || nabi_server->commit_by_word) candidate = g_strdup_printf("%s(%s)", key, modified_value); else candidate = g_strdup_printf("%s%s(%s)", preedit_left, key, modified_value); } else { if (nabi_server->hanja_mode || nabi_server->commit_by_word) candidate = g_strdup_printf("%s", modified_value); else candidate = g_strdup_printf("%s%s", preedit_left, modified_value); } nabi_ic_commit_utf8(ic, candidate); g_free(preedit_left); g_free(modified_value); g_free(candidate); } if (ic->client_text != NULL) ustring_clear(ic->client_text); } void nabi_ic_process_string_conversion_reply(NabiIC* ic, const char* text) { char* key; char* preedit; if (text == NULL) return; // gtk2의 xim module은 XIMStringConversionSubstitution에도 // string을 보내온다. 그런 경우에 무시하기 위해서 client text를 요구한 // 경우에만 candidate window를 띄우고 아니면 무시한다. if (!ic->wait_for_client_text) return; ic->wait_for_client_text = FALSE; if (ic->client_text == NULL) ic->client_text = ustring_new(); ustring_clear(ic->client_text); ustring_append_utf8(ic->client_text, text); preedit = nabi_ic_get_preedit_string(ic); key = g_strconcat(text, preedit, NULL); nabi_ic_update_candidate_window_with_key(ic, key); g_free(preedit); g_free(key); } /* 이 테이블은 US layout을 기준으로 만든것이다. * 그러나 keycode의 값은 하드웨어마다 다를 수 있으므로 * 일반 PC 환경이 아닌 곳에서는 문제가 될지도 모른다. */ static const unsigned int keymap[][2] = { { XK_1, XK_exclam }, /* 10 */ { XK_2, XK_at }, /* 11 */ { XK_3, XK_numbersign }, /* 12 */ { XK_4, XK_dollar }, /* 13 */ { XK_5, XK_percent }, /* 14 */ { XK_6, XK_asciicircum }, /* 15 */ { XK_7, XK_ampersand }, /* 16 */ { XK_8, XK_asterisk }, /* 17 */ { XK_9, XK_parenleft }, /* 18 */ { XK_0, XK_parenright }, /* 19 */ { XK_minus, XK_underscore }, /* 20 */ { XK_equal, XK_plus }, /* 21 */ { XK_BackSpace, XK_BackSpace }, /* 22 */ { XK_Tab, XK_Tab }, /* 23 */ { XK_q, XK_Q }, /* 24 */ { XK_w, XK_W }, /* 25 */ { XK_e, XK_E }, /* 26 */ { XK_r, XK_R }, /* 27 */ { XK_t, XK_T }, /* 28 */ { XK_y, XK_Y }, /* 29 */ { XK_u, XK_U }, /* 30 */ { XK_i, XK_I }, /* 31 */ { XK_o, XK_O }, /* 32 */ { XK_p, XK_P }, /* 33 */ { XK_bracketleft, XK_braceleft }, /* 34 */ { XK_bracketright, XK_braceright }, /* 35 */ { XK_Return, XK_Return }, /* 36 */ { XK_Control_L, XK_Control_L }, /* 37 */ { XK_a, XK_A }, /* 38 */ { XK_s, XK_S }, /* 39 */ { XK_d, XK_D }, /* 40 */ { XK_f, XK_F }, /* 41 */ { XK_g, XK_G }, /* 42 */ { XK_h, XK_H }, /* 43 */ { XK_j, XK_J }, /* 44 */ { XK_k, XK_K }, /* 45 */ { XK_l, XK_L }, /* 46 */ { XK_semicolon, XK_colon }, /* 47 */ { XK_apostrophe, XK_quotedbl }, /* 48 */ { XK_grave, XK_asciitilde }, /* 49 */ { XK_Shift_L, XK_Shift_L }, /* 50 */ { XK_backslash, XK_bar }, /* 51 */ { XK_z, XK_Z }, /* 52 */ { XK_x, XK_X }, /* 53 */ { XK_c, XK_C }, /* 54 */ { XK_v, XK_V }, /* 55 */ { XK_b, XK_B }, /* 56 */ { XK_n, XK_N }, /* 57 */ { XK_m, XK_M }, /* 58 */ { XK_comma, XK_less }, /* 59 */ { XK_period, XK_greater }, /* 60 */ { XK_slash, XK_question }, /* 61 */ }; KeySym nabi_ic_lookup_keysym(NabiIC* ic, XKeyEvent* event) { int index; KeySym keysym; bool is_transliteration; is_transliteration = hangul_ic_is_transliteration(ic->hic); if (is_transliteration) { /* transliteration method인 경우에는 사용자의 자판 설정에서 * 오는 값을 임의로 바꿔서는 안된다. 사용자 설정에 따르는 것이 * 맞다. */ char buf[64]; XLookupString(event, buf, sizeof(buf), &keysym, NULL); } else { keysym = NoSymbol; index = (event->state & ShiftMask) ? 1 : 0; /* 자판 설정에 따른 변환 문제를 피하기 위해서 내장 keymap을 사용하여 * keycode를 keysym으로 변환함 */ if (!nabi_server->use_system_keymap) { if (event->keycode >= 10 && event->keycode <= 61) keysym = keymap[event->keycode - 10][index]; } /* XLookupString()을 사용하지 않고 XLookupKeysym()함수를 * 사용한 것은 데스크탑에서 여러 언어 자판을 지원하기위해서 Xkb를 * 사용하는 경우에 쉽게 처리하기 위한 방편이다. * Xkb를 사용하게 되면 keymap이 재정의되므로 XLookupString()의 리턴값은 * 재정의된 키값을 얻게되어 각 언어(예를 들어 프랑스, 러시아 등)의 * 자판에서 일반 qwerty 자판으로 변환을 해줘야 한다. 이 문제를 좀더 * 손쉽게 풀기 위해서 재정의된 자판이 아닌 첫번째 자판의 값을 직접 * 가져오기 위해서 XLookupKeysym()함수를 사용한다. */ if (keysym == NoSymbol) { keysym = XLookupKeysym(event, index); } /* 그러나 이 함수를 사용하게되면 새로 정의된 키를 가져와야 되는 경우에 * 못가져오는 수가 생긴다. 이를 피하기 위해서 XLookupKeysym() 함수가 * 0을 리턴하면 XLookupString()으로 다시한번 시도하는 방식으로 * 처리한다. */ if (keysym == NoSymbol) { char buf[64]; XLookupString(event, buf, sizeof(buf), &keysym, NULL); } } return keysym; } /* vim: set ts=8 sw=4 sts=4 : */ nabi-nabi-1.0.1/src/ic.h000066400000000000000000000147151430012456200146710ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * 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 */ #ifndef _NABIIC_H_ #define _NABIIC_H_ #include #include #include #include #include "../IMdkit/IMdkit.h" #include "../IMdkit/Xi18n.h" #include "candidate.h" #include "ustring.h" typedef struct _PreeditAttributes PreeditAttributes; typedef struct _StatusAttributes StatusAttributes; typedef struct _NabiIC NabiIC; typedef struct _NabiConnection NabiConnection; typedef struct _NabiToplevel NabiToplevel; typedef enum { NABI_INPUT_MODE_DIRECT, NABI_INPUT_MODE_COMPOSE } NabiInputMode; struct _NabiConnection { CARD16 id; NabiInputMode mode; GIConv cd; CARD16 next_new_ic_id; GSList* ic_list; }; struct _NabiToplevel { Window id; NabiInputMode mode; unsigned int ref; }; struct _PreeditAttributes { UString* str; GdkWindow* window; /* where to draw the preedit string */ int width; /* preedit area width */ int height; /* preedit area height */ XPoint spot; /* window position */ XRectangle area; /* area */ XRectangle area_needed; /* area needed */ Colormap cmap; /* colormap */ GdkGC* normal_gc; /* gc */ GdkGC* hilight_gc; /* gc */ unsigned long foreground; /* foreground */ unsigned long background; /* background */ char *base_font; /* base font of fontset */ XFontSet font_set; /* font set */ int ascent; /* font property */ int descent; /* font property */ Pixmap bg_pixmap; /* background pixmap */ CARD32 line_space; /* line spacing */ Cursor cursor; /* cursor */ XIMPreeditState state; /* preedit state */ Bool start; /* preedit start */ int prev_length; /* previous preedit string length */ gboolean has_start_cb; /* whether XNPreeditStartCallback * registered */ gboolean has_draw_cb; /* whether XNPreeditDrawCallback * registered */ gboolean has_done_cb; /* whether XNPreeditDoneCallback * registered */ }; struct _StatusAttributes { XRectangle area; /* area */ XRectangle area_needed; /* area needed */ Colormap cmap; /* colormap */ unsigned long foreground; /* foreground */ unsigned long background; /* background */ Pixmap bg_pixmap; /* background pixmap */ char *base_font; /* base font of fontset */ CARD32 line_space; /* line spacing */ Cursor cursor; /* cursor */ }; struct _NabiIC { CARD16 id; /* ic id */ INT32 input_style; /* input style */ Window client_window; /* client window */ Window focus_window; /* focus window */ char* resource_name; /* resource name */ char* resource_class; /* resource class */ StatusAttributes status; /* status attributes */ PreeditAttributes preedit; /* preedit attributes */ NabiConnection* connection; NabiToplevel* toplevel; /* hangul data */ NabiInputMode mode; HangulInputContext* hic; /* hanja or symbol select window */ NabiCandidate* candidate; gboolean composing_started; UString* client_text; gboolean wait_for_client_text; /* whether this ic requested * client text */ gboolean has_str_conv_cb; /* whether XNStringConversionCallback * registered */ }; NabiConnection* nabi_connection_create(CARD16 id, const char* encoding); void nabi_connection_destroy(NabiConnection* conn); NabiIC* nabi_connection_create_ic(NabiConnection* conn, IMChangeICStruct* data); void nabi_connection_destroy_ic(NabiConnection* conn, NabiIC* ic); NabiIC* nabi_connection_get_ic(NabiConnection* conn, CARD16 id); NabiToplevel* nabi_toplevel_new(Window id); void nabi_toplevel_ref(NabiToplevel* toplevel); void nabi_toplevel_unref(NabiToplevel* toplevel); NabiIC* nabi_ic_create(NabiConnection* conn, IMChangeICStruct *data); void nabi_ic_destroy(NabiIC *ic); void nabi_ic_real_destroy(NabiIC *ic); void nabi_ic_set_values(NabiIC *ic, IMChangeICStruct *data); void nabi_ic_get_values(NabiIC *ic, IMChangeICStruct *data); Bool nabi_ic_is_empty(NabiIC *ic); CARD16 nabi_ic_get_id(NabiIC* ic); KeySym nabi_ic_lookup_keysym(NabiIC* ic, XKeyEvent* event); void nabi_ic_set_focus(NabiIC *ic); void nabi_ic_set_mode(NabiIC *ic, NabiInputMode mode); void nabi_ic_start_composing(NabiIC *ic); void nabi_ic_end_composing(NabiIC *ic); void nabi_ic_preedit_start(NabiIC *ic); void nabi_ic_preedit_done(NabiIC *ic); void nabi_ic_preedit_update(NabiIC *ic); void nabi_ic_preedit_clear(NabiIC *ic); void nabi_ic_status_start(NabiIC *ic); void nabi_ic_status_done(NabiIC *ic); void nabi_ic_status_update(NabiIC *ic); Bool nabi_ic_commit(NabiIC *ic); Bool nabi_ic_process_keyevent(NabiIC* ic, KeySym keysym, unsigned int state); void nabi_ic_flush(NabiIC *ic); void nabi_ic_reset(NabiIC *ic, IMResetICStruct *data); Bool nabi_ic_popup_candidate_window(NabiIC *ic, const char* key); void nabi_ic_insert_candidate(NabiIC *ic, const Hanja* hanja); void nabi_ic_process_string_conversion_reply(NabiIC* ic, const char* text); #endif /* _NABIIC_H_ */ /* vim: set ts=8 sw=4 sts=4 : */ nabi-nabi-1.0.1/src/keyboard-layout.c000066400000000000000000000042661430012456200174040ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2011 Choe Hwanjin * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #include #include "keyboard-layout.h" struct KeySymPair { KeySym key; KeySym value; }; NabiKeyboardLayout* nabi_keyboard_layout_new(const char* name) { NabiKeyboardLayout* layout = g_new(NabiKeyboardLayout, 1); layout->name = g_strdup(name); layout->table = NULL; return layout; } static int nabi_keyboard_layout_cmp(const void* a, const void* b) { const struct KeySymPair* pair1 = a; const struct KeySymPair* pair2 = b; return pair1->key - pair2->key; } void nabi_keyboard_layout_append(NabiKeyboardLayout* layout, KeySym key, KeySym value) { struct KeySymPair item = { key, value }; if (layout->table == NULL) layout->table = g_array_new(FALSE, FALSE, sizeof(struct KeySymPair)); g_array_append_vals(layout->table, &item, 1); } KeySym nabi_keyboard_layout_get_key(NabiKeyboardLayout* layout, KeySym keysym) { if (layout->table != NULL) { struct KeySymPair key = { keysym, 0 }; struct KeySymPair* ret; ret = bsearch(&key, layout->table->data, layout->table->len, sizeof(key), nabi_keyboard_layout_cmp); if (ret) { return ret->value; } } return keysym; } void nabi_keyboard_layout_free(gpointer data, gpointer user_data) { NabiKeyboardLayout *layout = data; g_free(layout->name); if (layout->table != NULL) g_array_free(layout->table, TRUE); g_free(layout); } nabi-nabi-1.0.1/src/keyboard-layout.h000066400000000000000000000025261430012456200174060ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2011 Choe Hwanjin * * 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 */ #ifndef nabi_keyboard_layout_h #define nabi_keyboard_layout_h #include #include typedef struct _NabiKeyboardLayout NabiKeyboardLayout; struct _NabiKeyboardLayout { char* name; GArray* table; }; NabiKeyboardLayout* nabi_keyboard_layout_new(const char* name); void nabi_keyboard_layout_free(gpointer data, gpointer user_data); void nabi_keyboard_layout_append(NabiKeyboardLayout* layout, KeySym key, KeySym value); KeySym nabi_keyboard_layout_get_key(NabiKeyboardLayout* layout, KeySym keysym); #endif /* nabi_keyboard_layout_h */ nabi-nabi-1.0.1/src/keycapturedialog.c000066400000000000000000000110101430012456200176060ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #include "keycapturedialog.h" static char key_label_text[256] = { '\0', }; static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) { gchar *keys; GString *str; GtkWidget *label; gchar markup_str[256]; gtk_dialog_set_response_sensitive(GTK_DIALOG(widget), GTK_RESPONSE_OK, TRUE); label = g_object_get_data(G_OBJECT(widget), "key-text-label"); str = g_string_new(""); if (event->state & GDK_CONTROL_MASK) { g_string_append(str, "Control+"); } if (event->state & GDK_SHIFT_MASK) { g_string_append(str, "Shift+"); } if (event->state & GDK_MOD1_MASK) { g_string_append(str, "Alt+"); } if (event->state & GDK_MOD4_MASK) { g_string_append(str, "Super+"); } keys = gdk_keyval_name(event->keyval); if (keys == NULL) keys = ""; str = g_string_append(str, keys); g_strlcpy(key_label_text, str->str, sizeof(key_label_text)); g_snprintf(markup_str, sizeof(markup_str), "%s", str->str); gtk_label_set_markup(GTK_LABEL(label), markup_str); gtk_window_present(GTK_WINDOW(widget)); return TRUE; } GtkWidget* key_capture_dialog_new(const gchar *title, GtkWindow *parent, const gchar *key_text, const gchar *message_format, ...) { GtkWidget *dialog; GtkWidget *image; GtkWidget *message_label; GtkWidget *key_label; GtkWidget *hbox; GtkWidget *vbox; gchar markup_str[256]; dialog = gtk_dialog_new_with_buttons(title, parent, GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); gtk_window_set_resizable (GTK_WINDOW(dialog), FALSE); gtk_container_set_border_width(GTK_CONTAINER(dialog), 6); vbox = gtk_vbox_new(FALSE, 0); message_label = gtk_label_new (NULL); gtk_label_set_line_wrap (GTK_LABEL(message_label), TRUE); gtk_box_pack_start(GTK_BOX(vbox), message_label, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "message-label", message_label); if (message_format != NULL) { gchar *msg; va_list args; va_start(args, message_format); msg = g_strdup_vprintf(message_format, args); va_end(args); gtk_label_set_markup(GTK_LABEL(message_label), msg); g_free(msg); } key_label = gtk_label_new(""); gtk_label_set_line_wrap (GTK_LABEL(key_label), FALSE); gtk_label_set_use_markup(GTK_LABEL(key_label), TRUE); g_snprintf(markup_str, sizeof(markup_str), "%s", key_text); g_strlcpy(key_label_text, key_text, sizeof(key_label_text)); gtk_label_set_markup(GTK_LABEL(key_label), markup_str); gtk_widget_show(key_label); g_object_set_data(G_OBJECT(dialog), "key-text-label", key_label); image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG); gtk_misc_set_alignment (GTK_MISC(image), 0.5, 0.0); hbox = gtk_hbox_new (FALSE, 6); gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 6); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 6); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), key_label, FALSE, FALSE, 0); gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK, FALSE); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL); gtk_widget_show_all (hbox); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(on_key_press), dialog); return dialog; } G_CONST_RETURN gchar * key_capture_dialog_get_key_text(GtkWidget *dialog) { return key_label_text; } nabi-nabi-1.0.1/src/keycapturedialog.h000066400000000000000000000022111430012456200176160ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * 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 */ #ifndef __KEYCAPTUREDIALOG_H_ #define __KEYCAPTUREDIALOG_H_ #include GtkWidget* key_capture_dialog_new(const gchar *title, GtkWindow *parent, const gchar *key_text, const gchar *message_format, ...); G_CONST_RETURN gchar * key_capture_dialog_get_key_text(GtkWidget *dialog); #endif /* __KEYCAPTUREDIALOG_H_ */ nabi-nabi-1.0.1/src/main.c000066400000000000000000000057631430012456200152200ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include "gettext.h" #include "server.h" #include "session.h" #include "nabi.h" #include "debug.h" NabiApplication* nabi = NULL; NabiServer* nabi_server = NULL; static int nabi_x_error_handler(Display *display, XErrorEvent *error) { gchar buf[64]; XGetErrorText (display, error->error_code, buf, 63); fprintf(stderr, "Nabi: X error: %s\n", buf); return 0; } static int nabi_x_io_error_handler(Display* display) { nabi_log(1, "x io error: save config\n"); nabi_server_write_log(nabi_server); nabi_app_save_config(); exit(0); } int main(int argc, char *argv[]) { GtkWidget *widget; #ifdef ENABLE_NLS bindtextdomain(PACKAGE, LOCALEDIR); bind_textdomain_codeset(PACKAGE, "UTF-8"); textdomain(PACKAGE); #endif gtk_init(&argc, &argv); nabi_log_set_device("stdout"); nabi_app_new(); nabi_app_init(&argc, &argv); XSetErrorHandler(nabi_x_error_handler); XSetIOErrorHandler(nabi_x_io_error_handler); if (!nabi->status_only) { Display* display; int screen; char *xim_name; /* we prefer command line option as default xim name */ if (nabi->xim_name != NULL) xim_name = nabi->xim_name; else xim_name = nabi->config->xim_name->str; if (nabi_server_is_running(xim_name)) { nabi_log(1, "xim %s is already running\n", xim_name); goto quit; } display = gdk_x11_get_default_xdisplay(); screen = gdk_x11_get_default_screen(); nabi_server = nabi_server_new(display, screen, xim_name); nabi_app_setup_server(); } widget = nabi_app_create_palette(); gtk_widget_show(widget); if (nabi_server != NULL) { nabi_server_start(nabi_server); } if (nabi_log_get_level() == 0) nabi_session_open(nabi->session_id); gtk_main(); if (nabi_log_get_level() == 0) nabi_session_close(); if (nabi_server != NULL) { nabi_server_stop(nabi_server); nabi_server_write_log(nabi_server); nabi_server_destroy(nabi_server); nabi_server = NULL; } quit: nabi_app_free(); return 0; } /* vim: set ts=8 sts=4 sw=4 : */ nabi-nabi-1.0.1/src/nabi.h000066400000000000000000000036511430012456200152040ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2009 Choe Hwanjin * * 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 */ #ifndef __NABI_H_ #define __NABI_H_ #include #include #include "conf.h" typedef struct _NabiApplication NabiApplication; struct _NabiApplication { gchar* xim_name; GtkWidget* palette; GtkWidget* keyboard_button; GtkWidget* tray_icon; gboolean status_only; gchar* session_id; int icon_size; /* hangul status data */ GdkWindow *root_window; GdkAtom mode_info_atom; GdkAtom mode_info_type; Atom mode_info_xatom; /* config data */ NabiConfig* config; }; extern NabiApplication* nabi; void nabi_app_new(void); void nabi_app_init(int *argc, char ***argv); void nabi_app_setup_server(void); void nabi_app_quit(void); void nabi_app_free(void); void nabi_app_save_config(void); void nabi_app_set_theme(const char *name); void nabi_app_use_tray_icon(gboolean use); void nabi_app_show_palette(gboolean state); void nabi_app_set_hanja_mode(gboolean state); void nabi_app_set_hangul_keyboard(const char *id); GtkWidget* nabi_app_create_palette(void); #endif /* __NABI_H_ */ /* vim: set ts=8 sw=4 : */ nabi-nabi-1.0.1/src/preference.c000066400000000000000000001413371430012456200164100ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2009 Choe Hwanjin * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include "nabi.h" #include "server.h" #include "preference.h" #include "keycapturedialog.h" #include "debug.h" enum { THEMES_LIST_PATH = 0, THEMES_LIST_NONE, THEMES_LIST_HANGUL, THEMES_LIST_ENGLISH, THEMES_LIST_NAME, N_COLS }; static NabiConfig* config = NULL; static GtkTreeModel* trigger_key_model = NULL; static GtkTreeModel* off_key_model = NULL; static GtkTreeModel* candidate_key_model = NULL; static GdkPixbuf * load_resized_icons_from_file(const gchar *base_filename, int size) { char* filename; GdkPixbuf *pixbuf; GdkPixbuf *pixbuf_resized; gdouble factor; gint orig_width, orig_height; gint new_width, new_height; GdkInterpType scale_method = GDK_INTERP_NEAREST; filename = g_strconcat(base_filename, ".svg", NULL); pixbuf = gdk_pixbuf_new_from_file(filename, NULL); g_free(filename); if (pixbuf == NULL) { filename = g_strconcat(base_filename, ".png", NULL); pixbuf = gdk_pixbuf_new_from_file(filename, NULL); g_free(filename); } if (pixbuf == NULL) return NULL; orig_width = gdk_pixbuf_get_width(pixbuf); orig_height = gdk_pixbuf_get_height(pixbuf); if (orig_width > orig_height) { factor = (double)size / (double)orig_width; new_width = size; new_height = (int)(orig_height * factor); } else { factor = (double)size / (double)orig_height; new_width = (int)(orig_width * factor); new_height = size; } if (factor < 1) scale_method = GDK_INTERP_BILINEAR; pixbuf_resized = gdk_pixbuf_scale_simple(pixbuf, new_width, new_height, scale_method); g_object_unref(pixbuf); return pixbuf_resized; } static GtkWidget* create_pref_item(const char* title, GtkWidget* child, gboolean expand, gboolean fill) { GtkWidget* vbox; GtkWidget* hbox; GtkWidget* label; char markup[256]; snprintf(markup, sizeof(markup), "%s", title); vbox = gtk_vbox_new(FALSE, 0); label = gtk_label_new(""); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_label_set_markup(GTK_LABEL(label), markup); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 6); label = gtk_label_new(" "); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), child, expand, fill, 0); return vbox; } static GtkTreeModel * get_themes_list(int size) { const gchar *path; gchar *theme_dir; gchar *file_none; gchar *file_hangul; gchar *file_english; GdkPixbuf *pixbuf_none; GdkPixbuf *pixbuf_hangul; GdkPixbuf *pixbuf_english; GtkListStore *store; GtkTreeIter iter; DIR *dir; struct dirent *dent; store = gtk_list_store_new(N_COLS, G_TYPE_STRING, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF, G_TYPE_STRING); path = NABI_THEMES_DIR; dir = opendir(path); if (dir == NULL) return NULL; for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { if (dent->d_name[0] == '.') continue; theme_dir = g_build_filename(path, dent->d_name, NULL); file_none = g_build_filename(theme_dir, "none", NULL); file_hangul = g_build_filename(theme_dir, "hangul", NULL); file_english = g_build_filename(theme_dir, "english", NULL); pixbuf_none = load_resized_icons_from_file(file_none, size); pixbuf_hangul = load_resized_icons_from_file(file_hangul, size); pixbuf_english = load_resized_icons_from_file(file_english, size); if (pixbuf_none != NULL && pixbuf_hangul != NULL && pixbuf_english != NULL) { gtk_list_store_append(store, &iter); gtk_list_store_set (store, &iter, THEMES_LIST_PATH, theme_dir, THEMES_LIST_NONE, pixbuf_none, THEMES_LIST_HANGUL, pixbuf_hangul, THEMES_LIST_ENGLISH, pixbuf_english, THEMES_LIST_NAME, dent->d_name, -1); g_object_unref(pixbuf_none); g_object_unref(pixbuf_hangul); g_object_unref(pixbuf_english); } g_free(theme_dir); g_free(file_none); g_free(file_hangul); g_free(file_english); } closedir(dir); return GTK_TREE_MODEL(store); } static GtkTreePath * search_text_in_model (GtkTreeModel *model, int column, const char *target_text) { gchar *text = NULL; GtkTreeIter iter; GtkTreePath *path; gboolean ret; ret = gtk_tree_model_get_iter_first(model, &iter); while (ret) { gtk_tree_model_get(model, &iter, column, &text, -1); if (text != NULL && strcmp(target_text, text) == 0) { path = gtk_tree_model_get_path(model, &iter); g_free(text); return path; } g_free(text); ret = gtk_tree_model_iter_next(model, &iter); } return NULL; } static void on_icon_list_selection_changed(GtkTreeSelection *selection, gpointer data) { GtkTreeModel *model; GtkTreeIter iter; gchar *theme; if (gtk_tree_selection_get_selected(selection, &model, &iter)) { gtk_tree_model_get(model, &iter, THEMES_LIST_NAME, &theme, -1); nabi_app_set_theme(theme); g_free(theme); nabi_log(4, "preference: set theme: %s\n", config->theme->str); } } static void on_use_tray_icon_button_toggled(GtkToggleButton* button, gpointer data) { gboolean flag = gtk_toggle_button_get_active(button); nabi_app_use_tray_icon(flag); nabi_log(4, "preference: set use tray icon: %d\n", flag); } static GtkWidget* create_theme_page(GtkWidget* dialog) { GtkWidget *page; GtkWidget *item; GtkWidget *scrolledwindow; GtkWidget *treeview; GtkWidget *vbox; GtkWidget *button; GtkTreeModel *model; GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkTreeSelection *selection; GtkTreePath *path; page = gtk_vbox_new(FALSE, 6); gtk_container_set_border_width(GTK_CONTAINER(page), 12); scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_set_border_width(GTK_CONTAINER(scrolledwindow), 0); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_SHADOW_IN); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0); item = create_pref_item(_("Tray icons"), vbox, TRUE, TRUE); gtk_box_pack_start(GTK_BOX(page), item, TRUE, TRUE, 0); /* loading themes list */ model = get_themes_list(nabi->icon_size); treeview = gtk_tree_view_new_with_model(model); g_object_unref(G_OBJECT(model)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); gtk_container_add(GTK_CONTAINER(scrolledwindow), treeview); g_object_set_data(G_OBJECT(dialog), "nabi-pref-theme", treeview); /* theme icons */ /* state None */ column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, "None"); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", THEMES_LIST_NONE); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); /* state Hangul */ column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, "Hangul"); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", THEMES_LIST_HANGUL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); /* state English */ column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, "English"); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", THEMES_LIST_ENGLISH); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("Theme Name", renderer, "text", THEMES_LIST_NAME, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); path = search_text_in_model(model, THEMES_LIST_NAME, config->theme->str); if (path) { gtk_tree_view_set_cursor (GTK_TREE_VIEW(treeview), path, NULL, FALSE); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(treeview), path, NULL, TRUE, 0.5, 0.0); gtk_tree_path_free(path); } // 현재 theme를 선택한후 signal을 연결한다. // 그렇지 않으면 UI를 초기화하는 과정에서 아래 콜백이 불리게 된다. g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(on_icon_list_selection_changed), NULL); button = gtk_check_button_new_with_label(_("Use tray icon")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), config->use_tray_icon); gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 6); g_object_set_data(G_OBJECT(dialog), "nabi-pref-use-tray-icon", button); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_use_tray_icon_button_toggled), NULL); return page; } static void on_hangul_keyboard_changed(GtkComboBox *widget, gpointer data) { int i; const NabiHangulKeyboard* keyboards; i = gtk_combo_box_get_active(widget); keyboards = nabi_server_get_hangul_keyboard_list(nabi_server); if (keyboards[i].id != NULL) { nabi_app_set_hangul_keyboard(keyboards[i].id); nabi_log(4, "preference: set hagul keyboard: %s\n", config->hangul_keyboard->str); } } static void on_latin_keyboard_changed(GtkComboBox *widget, gpointer data) { int i = gtk_combo_box_get_active(widget); NabiKeyboardLayout* item = g_list_nth_data(nabi_server->layouts, i); if (item != NULL) { g_string_assign(config->latin_keyboard, item->name); nabi_server_set_keyboard_layout(nabi_server, item->name); nabi_log(4, "preference: set latin keyboard: %s\n", config->latin_keyboard->str); } } static void on_use_system_keymap_button_toggled(GtkToggleButton *button, gpointer data) { gboolean flag = gtk_toggle_button_get_active(button); config->use_system_keymap = flag; nabi_server_set_use_system_keymap(nabi_server, flag); gtk_widget_set_sensitive(GTK_WIDGET(data), config->use_system_keymap); nabi_log(4, "preference: set use system keymap: %d\n", flag); } static GtkWidget* create_keyboard_page(GtkWidget* dialog) { GtkWidget *page; GtkWidget *item; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *button; GtkWidget *combo_box; GtkSizeGroup* size_group; GList* list; int i; const NabiHangulKeyboard* keyboards; page = gtk_vbox_new(FALSE, 6); gtk_container_set_border_width(GTK_CONTAINER(page), 12); /* hangul keyboard */ size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); combo_box = gtk_combo_box_new_text(); keyboards = nabi_server_get_hangul_keyboard_list(nabi_server); for (i = 0; keyboards[i].name != NULL; i++) { gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), _(keyboards[i].name)); if (strcmp(config->hangul_keyboard->str, keyboards[i].id) == 0) { gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), i); } } gtk_size_group_add_widget(size_group, combo_box); g_object_set_data(G_OBJECT(dialog), "nabi-pref-hangul-keyboard", combo_box); g_signal_connect(G_OBJECT(combo_box), "changed", G_CALLBACK(on_hangul_keyboard_changed), NULL); item = create_pref_item(_("Hangul keyboard"), combo_box, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(page), item, FALSE, TRUE, 0); /* latin keyboard */ vbox = gtk_vbox_new(FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); button = gtk_check_button_new_with_label(_("Use system keymap")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), config->use_system_keymap); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-use-system-keymap", button); combo_box = gtk_combo_box_new_text(); i = 0; list = nabi_server->layouts; while (list != NULL) { NabiKeyboardLayout* layout = list->data; if (layout != NULL) { gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), layout->name); if (strcmp(config->latin_keyboard->str, layout->name) == 0) { gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), i); } } list = g_list_next(list); i++; } gtk_size_group_add_widget(size_group, combo_box); gtk_box_pack_start(GTK_BOX(vbox), combo_box, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-latin-keyboard", combo_box); g_signal_connect(G_OBJECT(combo_box), "changed", G_CALLBACK(on_latin_keyboard_changed), NULL); gtk_widget_set_sensitive(GTK_WIDGET(combo_box), config->use_system_keymap); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_use_system_keymap_button_toggled), combo_box); item = create_pref_item(_("English keyboard"), vbox, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(page), item, FALSE, TRUE, 0); g_object_unref(G_OBJECT(size_group)); return page; } static GtkTreeModel* create_key_list_store(const char *key_list) { int i; GtkListStore *store; GtkTreeIter iter; gchar **keys; store = gtk_list_store_new(1, G_TYPE_STRING); keys = g_strsplit(key_list, ",", 0); for (i = 0; keys[i] != NULL; i++) { gtk_list_store_append(store, &iter); gtk_list_store_set (store, &iter, 0, keys[i], -1); } g_strfreev(keys); return GTK_TREE_MODEL(store); } static GtkWidget* create_key_list_widget(const char* key_list) { GtkWidget *scrolledwindow; GtkWidget *treeview; GtkTreeViewColumn *column; GtkTreeSelection *selection; GtkCellRenderer *renderer; GtkTreeModel *model; scrolledwindow = gtk_scrolled_window_new(NULL, NULL); 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_IN); gtk_container_set_border_width(GTK_CONTAINER(scrolledwindow), 0); model = create_key_list_store(key_list); treeview = gtk_tree_view_new_with_model(model); g_object_unref(G_OBJECT(model)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); gtk_container_add(GTK_CONTAINER(scrolledwindow), treeview); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, "key"); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_add_attribute(column, renderer, "text", 0); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); gtk_tree_selection_unselect_all(selection); g_object_set_data(G_OBJECT(scrolledwindow), "treeview", treeview); return scrolledwindow; } static char** create_key_list_string_array(GtkTreeModel* model) { GtkTreeIter iter; gboolean ret; int n; char **keys; n = gtk_tree_model_iter_n_children(model, NULL); keys = g_new(char*, n + 1); n = 0; ret = gtk_tree_model_get_iter_first(model, &iter); while (ret) { char *key = NULL; gtk_tree_model_get(model, &iter, 0, &key, -1); if (key != NULL) keys[n++] = key; ret = gtk_tree_model_iter_next(model, &iter); } keys[n] = NULL; return keys; } static void update_trigger_keys_setting(GtkTreeModel *model) { char *joined; char **keys = create_key_list_string_array(model); joined = g_strjoinv(",", keys); g_string_assign(config->trigger_keys, joined); nabi_server_set_trigger_keys(nabi_server, keys); g_free(joined); g_strfreev(keys); nabi_log(4, "preference: set trigger keys: %s\n", config->trigger_keys->str); } static void update_off_keys_setting(GtkTreeModel *model) { char *joined; char **keys = create_key_list_string_array(model); joined = g_strjoinv(",", keys); g_string_assign(config->off_keys, joined); nabi_server_set_off_keys(nabi_server, keys); g_free(joined); g_strfreev(keys); nabi_log(4, "preference: set off keys: %s\n", config->off_keys->str); } static void on_key_list_add_button_clicked(GtkWidget *widget, gpointer data) { GtkWidget *toplevel; GtkWindow *parent = NULL; GtkWidget *dialog; gchar* title; gchar* message; gint result; title = g_object_get_data(G_OBJECT(widget), "dialog-title"); message = g_object_get_data(G_OBJECT(widget), "dialog-message"); toplevel = gtk_widget_get_toplevel(GTK_WIDGET(widget)); if (GTK_WIDGET_TOPLEVEL(toplevel)) parent = GTK_WINDOW(toplevel); dialog = key_capture_dialog_new(title, parent, "", message); run: result = gtk_dialog_run(GTK_DIALOG(dialog)); if (result == GTK_RESPONSE_OK) { const gchar *key = key_capture_dialog_get_key_text(dialog); if (strlen(key) > 0) { GtkWidget* message_dialog; GtkTreePath *path; path = search_text_in_model(trigger_key_model, 0, key); if (path != NULL) { message_dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(dialog), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, _("This key is already registered for trigger key\n" "Please select another key")); gtk_dialog_run(GTK_DIALOG(message_dialog)); gtk_widget_destroy(message_dialog); gtk_tree_path_free(path); goto run; } path = search_text_in_model(off_key_model, 0, key); if (path != NULL) { message_dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(dialog), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, _("This key is already registered for off key\n" "Please select another key")); gtk_dialog_run(GTK_DIALOG(message_dialog)); gtk_widget_destroy(message_dialog); gtk_tree_path_free(path); goto run; } path = search_text_in_model(candidate_key_model, 0, key); if (path != NULL) { message_dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(dialog), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, _("This key is already registered for candidate key\n" "Please select another key")); gtk_dialog_run(GTK_DIALOG(message_dialog)); gtk_widget_destroy(message_dialog); gtk_tree_path_free(path); goto run; } else { GtkTreeModel *model; GtkTreeIter iter; GtkWidget* remove_button; model = gtk_tree_view_get_model(GTK_TREE_VIEW(data)); gtk_list_store_append(GTK_LIST_STORE(model), &iter); gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, key, -1); /* treeview가 remove button을 가지고 있으면 sensitive 플래그를 * 켠다. item이 하나 추가 되었으므로 remove button이 활성화 * 되어도 된다. */ remove_button = g_object_get_data(G_OBJECT(data), "remove-button"); if (remove_button != NULL) gtk_widget_set_sensitive(remove_button, TRUE); } } } gtk_widget_destroy(dialog); } static void on_key_list_remove_button_clicked(GtkWidget *widget, gpointer data) { GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data)); if (gtk_tree_selection_get_selected(selection, &model, &iter)) { GtkWidget *remove_button; gtk_list_store_remove(GTK_LIST_STORE(model), &iter); /* treeview 가 "remove-button"을 가지고 있을 경우에는 * item이 1개만 남았을때 부터 remove button을 insensitive하게 만들어 * 더이상 아이템을 지울수 없게 한다. * trigger키의 경우에는 최소한 1개의 아이템이 있어야 한다. */ remove_button = g_object_get_data(G_OBJECT(data), "remove-button"); if (remove_button) { int n = gtk_tree_model_iter_n_children(model, NULL); if (n <= 1) { gtk_widget_set_sensitive(remove_button, FALSE); } } } } static void update_candidate_keys_setting(GtkTreeModel *model) { char *joined; char **keys = create_key_list_string_array(model); joined = g_strjoinv(",", keys); g_string_assign(config->candidate_keys, joined); nabi_server_set_candidate_keys(nabi_server, keys); g_free(joined); g_strfreev(keys); nabi_log(4, "preference: set candidate keys: %s\n", config->candidate_keys->str); } static GtkWidget* create_hangul_page(GtkWidget* dialog) { GtkWidget *page; GtkWidget *item; GtkWidget *hbox; GtkWidget *vbox1; GtkWidget *vbox2; GtkWidget *label; GtkWidget *button; GtkWidget *widget; GtkWidget *treeview; GtkTreeModel *model; const char *title; const char *message; int n; page = gtk_vbox_new(FALSE, 6); gtk_container_set_border_width(GTK_CONTAINER(page), 12); /* options for trigger key */ vbox1 = gtk_vbox_new(FALSE, 0); item = create_pref_item(_("Trigger keys"), vbox1, TRUE, TRUE); gtk_box_pack_start(GTK_BOX(page), item, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox1), hbox, TRUE, TRUE, 0); vbox2 = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 0); widget = create_key_list_widget(config->trigger_keys->str); treeview = g_object_get_data(G_OBJECT(widget), "treeview"); gtk_box_pack_start(GTK_BOX(vbox2), widget, TRUE, TRUE, 0); model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); g_object_set_data(G_OBJECT(dialog), "nabi-pref-trigger-keys", model); g_signal_connect_after(G_OBJECT(model), "row-changed", G_CALLBACK(update_trigger_keys_setting), NULL); g_signal_connect_after(G_OBJECT(model), "row-deleted", G_CALLBACK(update_trigger_keys_setting), NULL); vbox2 = gtk_vbox_new(FALSE, 6); gtk_box_pack_start(GTK_BOX(hbox), vbox2, FALSE, TRUE, 6); title = _("Select trigger key"); message = _("Press any key which you want to use as trigger key. " "The key you pressed is displayed below.\n" "If you want to use it, click \"Ok\" or click \"Cancel\""); button = gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, TRUE, 0); g_object_set_data(G_OBJECT(button), "dialog-title", (gpointer)title); g_object_set_data(G_OBJECT(button), "dialog-message", (gpointer)message); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_key_list_add_button_clicked), treeview); button = gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, TRUE, 0); g_object_set_data(G_OBJECT(treeview), "remove-button", button); model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); trigger_key_model = model; n = gtk_tree_model_iter_n_children(model, NULL); if (n <= 1) { /* there is only one entry in trigger key list. * nabi need at least on trigger key. * So we disable remove the button, here */ gtk_widget_set_sensitive(button, FALSE); } g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_key_list_remove_button_clicked), treeview); label = gtk_label_new(_("* You should restart nabi to apply above option")); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_box_pack_start(GTK_BOX(vbox1), label, FALSE, FALSE, 6); /* options for off keys */ hbox = gtk_hbox_new(FALSE, 0); item = create_pref_item(_("Off keys"), hbox, TRUE, TRUE); gtk_box_pack_start(GTK_BOX(page), item, TRUE, TRUE, 0); vbox2 = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 0); widget = create_key_list_widget(config->off_keys->str); treeview = g_object_get_data(G_OBJECT(widget), "treeview"); model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); off_key_model = model; g_object_set_data(G_OBJECT(dialog), "nabi-pref-off-keys", model); gtk_box_pack_start(GTK_BOX(vbox2), widget, TRUE, TRUE, 0); g_signal_connect_after(G_OBJECT(model), "row-changed", G_CALLBACK(update_off_keys_setting), NULL); g_signal_connect_after(G_OBJECT(model), "row-deleted", G_CALLBACK(update_off_keys_setting), NULL); vbox2 = gtk_vbox_new(FALSE, 6); gtk_box_pack_start(GTK_BOX(hbox), vbox2, FALSE, TRUE, 6); title = _("Select off key"); message = _("Press any key which you want to use as off key. " "The key you pressed is displayed below.\n" "If you want to use it, click \"Ok\" or click \"Cancel\""); button = gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, TRUE, 0); g_object_set_data(G_OBJECT(button), "dialog-title", (gpointer)title); g_object_set_data(G_OBJECT(button), "dialog-message", (gpointer)message); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_key_list_add_button_clicked), treeview); button = gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, TRUE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_key_list_remove_button_clicked), treeview); return page; } static void candidate_font_button_set_labels(GtkWidget* button, const char* font_name) { GtkWidget* face_label = g_object_get_data(G_OBJECT(button), "face_label"); GtkWidget* size_label = g_object_get_data(G_OBJECT(button), "size_label"); const char* sep = strrchr(font_name, ' '); if (sep != NULL) { gchar* face_str = g_strndup(font_name, sep - font_name); const gchar* size_str = sep + 1; gtk_label_set_text(GTK_LABEL(face_label), face_str); gtk_label_set_text(GTK_LABEL(size_label), size_str); g_free(face_str); } else { gtk_label_set_text(GTK_LABEL(face_label), font_name); } } static void on_candidate_font_button_clicked(GtkWidget *button, gpointer data) { gint result; GtkWidget *dialog; dialog = gtk_font_selection_dialog_new(_("Select hanja font")); gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(dialog), config->candidate_font->str); gtk_font_selection_dialog_set_preview_text(GTK_FONT_SELECTION_DIALOG(dialog), "訓民正音 훈민정음"); gtk_widget_show_all(dialog); gtk_widget_hide(GTK_FONT_SELECTION_DIALOG(dialog)->apply_button); result = gtk_dialog_run(GTK_DIALOG(dialog)); if (result == GTK_RESPONSE_OK) { char *font = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(dialog)); g_string_assign(config->candidate_font, font); nabi_server_set_candidate_font(nabi_server, font); candidate_font_button_set_labels(button, font); nabi_log(4, "preference: set candidate font: %s\n", config->candidate_font->str); } gtk_widget_destroy(dialog); } static void on_simplified_chinese_toggled(GtkToggleButton* button, gpointer data) { gboolean flag = gtk_toggle_button_get_active(button); config->use_simplified_chinese = flag; nabi_server_set_simplified_chinese(nabi_server, flag); nabi_log(4, "preference: set use simplified chinese: %d\n", flag); } static GtkWidget* create_candidate_page(GtkWidget* dialog) { GtkWidget *page; GtkWidget *item; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *button; GtkWidget *widget; GtkWidget *treeview; GtkWidget *label; GtkTreeModel *model; const char *title; const char *message; page = gtk_vbox_new(FALSE, 6); gtk_container_set_border_width(GTK_CONTAINER(page), 12); /* options for candidate font */ button = gtk_button_new(); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new(""); g_object_set_data(G_OBJECT(button), "face_label", label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), gtk_vseparator_new(), FALSE, FALSE, 0); label = gtk_label_new(""); g_object_set_data(G_OBJECT(button), "size_label", label); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_container_add(GTK_CONTAINER(button), hbox); candidate_font_button_set_labels(button, config->candidate_font->str); g_object_set_data(G_OBJECT(dialog), "nabi-pref-candidate-font", button); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_candidate_font_button_clicked), NULL); item = create_pref_item(_("Hanja Font"), button, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(page), item, FALSE, TRUE, 0); /* options for candidate key */ hbox = gtk_hbox_new(FALSE, 0); item = create_pref_item(_("Hanja keys"), hbox, TRUE, TRUE); gtk_box_pack_start(GTK_BOX(page), item, TRUE, TRUE, 0); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); widget = create_key_list_widget(config->candidate_keys->str); treeview = g_object_get_data(G_OBJECT(widget), "treeview"); model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); candidate_key_model = model; gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, TRUE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-candidate-keys", model); g_signal_connect_after(G_OBJECT(model), "row-changed", G_CALLBACK(update_candidate_keys_setting), NULL); g_signal_connect_after(G_OBJECT(model), "row-deleted", G_CALLBACK(update_candidate_keys_setting), NULL); vbox = gtk_vbox_new(FALSE, 6); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, TRUE, 6); title = _("Select candidate key"); message = _("Press any key which you want to use as candidate key. " "The key you pressed is displayed below.\n" "If you want to use it, click \"Ok\", or click \"Cancel\""); button = gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, TRUE, 0); g_object_set_data(G_OBJECT(button), "dialog-title", (gpointer)title); g_object_set_data(G_OBJECT(button), "dialog-message", (gpointer)message); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_key_list_add_button_clicked), treeview); button = gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, TRUE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_key_list_remove_button_clicked), treeview); /* options for candidate option */ button = gtk_check_button_new_with_label(_("Use simplified chinese")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), config->use_simplified_chinese); g_object_set_data(G_OBJECT(dialog), "nabi-pref-simplified-chinese", button); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_simplified_chinese_toggled), NULL); item = create_pref_item(_("Hanja Options"), button, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(page), item, FALSE, FALSE, 0); return page; } static void on_xim_name_changed(GtkEntry* entry, gpointer data) { const char* name = gtk_entry_get_text(GTK_ENTRY(entry)); g_string_assign(config->xim_name, name); nabi_server_set_xim_name(nabi_server, name); nabi_log(4, "preference: set xim name: %s\n", name); } static void on_event_flow_button_toggled(GtkToggleButton *button, gpointer data) { gboolean flag = gtk_toggle_button_get_active(button); config->use_dynamic_event_flow = flag; nabi_server_set_dynamic_event_flow(nabi_server, flag); nabi_log(4, "preference: set use dynamic event flow: %d\n", flag); } static void on_commit_by_word_button_toggled(GtkToggleButton *button, gpointer data) { gboolean flag = gtk_toggle_button_get_active(button); config->commit_by_word = flag; nabi_server_set_commit_by_word(nabi_server, flag); nabi_log(4, "preference: set commit by word: %d\n", flag); } static void on_auto_reorder_button_toggled(GtkToggleButton *button, gpointer data) { gboolean flag = gtk_toggle_button_get_active(button); config->auto_reorder = flag; nabi_server_set_auto_reorder(nabi_server, flag); nabi_log(4, "preference: set auto reorder: %d\n", flag); } static void on_ignore_app_fontset_button_toggled(GtkToggleButton *button, gpointer data) { gboolean flag = gtk_toggle_button_get_active(button); config->ignore_app_fontset = flag; nabi_server_set_ignore_app_fontset(nabi_server, flag); nabi_log(4, "preference: set ignore app fontset: %d\n", flag); } static void on_default_input_mode_button_toggled(GtkToggleButton *button, gpointer data) { gboolean flag = gtk_toggle_button_get_active(button); if (flag) { g_string_assign(config->default_input_mode, "compose"); nabi_server_set_default_input_mode(nabi_server, NABI_INPUT_MODE_COMPOSE); } else { g_string_assign(config->default_input_mode, "direct"); nabi_server_set_default_input_mode(nabi_server, NABI_INPUT_MODE_DIRECT); } nabi_log(4, "preference: set default input mode: %s\n", config->default_input_mode->str); } static void on_input_mode_scope_changed(GtkComboBox* combo_box, gpointer data) { NabiInputModeScope input_mode_scope; char* input_mode_scope_str = NULL; input_mode_scope = (NabiInputModeScope)gtk_combo_box_get_active(combo_box); switch (input_mode_scope) { case NABI_INPUT_MODE_PER_DESKTOP: input_mode_scope_str = g_strdup("per_desktop"); break; case NABI_INPUT_MODE_PER_APPLICATION: input_mode_scope_str = g_strdup("per_application"); break; case NABI_INPUT_MODE_PER_IC: input_mode_scope_str = g_strdup("per_ic"); break; case NABI_INPUT_MODE_PER_TOPLEVEL: default: input_mode_scope_str = g_strdup("per_toplevel"); break; } g_string_assign(config->input_mode_scope, input_mode_scope_str); nabi_server_set_input_mode_scope(nabi_server, input_mode_scope); nabi_log(4, "preference: set input mode scope: %s\n", config->input_mode_scope->str); } static void on_preedit_font_changed(GtkFontButton* widget, gpointer data) { const char* font_desc; font_desc = gtk_font_button_get_font_name(widget); g_string_assign(config->preedit_font, font_desc); nabi_server_set_preedit_font(nabi_server, font_desc); nabi_log(4, "preference: set preedit font: %s\n", config->preedit_font->str); } static GtkWidget* create_advanced_page(GtkWidget* dialog) { GtkWidget *page; GtkWidget *item; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *label; GtkWidget *button; GtkWidget *entry; GtkWidget *combo_box; page = gtk_vbox_new(FALSE, 6); gtk_container_set_border_width(GTK_CONTAINER(page), 12); vbox = gtk_vbox_new(FALSE, 0); item = create_pref_item(_("Advanced"), vbox, TRUE, TRUE); gtk_box_pack_start(GTK_BOX(page), item, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("XIM name:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); entry = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entry), 16); gtk_entry_set_text(GTK_ENTRY(entry), config->xim_name->str); gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 6); g_object_set_data(G_OBJECT(dialog), "nabi-pref-xim-name", entry); g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(on_xim_name_changed), NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); button = gtk_check_button_new_with_label(_("Use dynamic event flow")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), config->use_dynamic_event_flow); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-use-dynamic-event-flow", button); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_event_flow_button_toggled), NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); button = gtk_check_button_new_with_label(_("Commit by word")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), config->commit_by_word); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-commit-by-word", button); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_commit_by_word_button_toggled), NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); button = gtk_check_button_new_with_label(_("Automatic reordering")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), config->auto_reorder); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-auto-reorder", button); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_auto_reorder_button_toggled), NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); button = gtk_check_button_new_with_label(_("Start in hangul mode")); if (strcmp(config->default_input_mode->str, "compose") == 0) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-default-input-mode", button); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_default_input_mode_button_toggled), NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); button = gtk_check_button_new_with_label(_("Ignore fontset information from the client")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), config->ignore_app_fontset); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-ignore-app-fontset", button); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_ignore_app_fontset_button_toggled), NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Input mode scope: ")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); combo_box = gtk_combo_box_new_text(); gtk_combo_box_insert_text(GTK_COMBO_BOX(combo_box), NABI_INPUT_MODE_PER_DESKTOP, _("per desktop")); gtk_combo_box_insert_text(GTK_COMBO_BOX(combo_box), NABI_INPUT_MODE_PER_APPLICATION, _("per application")); gtk_combo_box_insert_text(GTK_COMBO_BOX(combo_box), NABI_INPUT_MODE_PER_TOPLEVEL, _("per toplevel")); gtk_combo_box_insert_text(GTK_COMBO_BOX(combo_box), NABI_INPUT_MODE_PER_IC, _("per context")); if (strcmp(config->input_mode_scope->str, "per_desktop") == 0) gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), NABI_INPUT_MODE_PER_DESKTOP); else if (strcmp(config->input_mode_scope->str, "per_application") == 0) gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), NABI_INPUT_MODE_PER_APPLICATION); else if (strcmp(config->input_mode_scope->str, "per_ic") == 0) gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), NABI_INPUT_MODE_PER_IC); else gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), NABI_INPUT_MODE_PER_TOPLEVEL); gtk_box_pack_start(GTK_BOX(hbox), combo_box, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-input-mode-option", combo_box); g_signal_connect(G_OBJECT(combo_box), "changed", G_CALLBACK(on_input_mode_scope_changed), NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Preedit string font: ")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); button = gtk_font_button_new_with_font(config->preedit_font->str); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-preedit-font", button); g_signal_connect(G_OBJECT(button), "font-set", G_CALLBACK(on_preedit_font_changed), NULL); return page; } static void on_preference_reset(GtkWidget *button, gpointer data) { GObject *dialog = G_OBJECT(data); gpointer p; GtkTreeModel* model; GtkTreeIter iter; GtkTreePath *path; GList* list; const NabiHangulKeyboard* keyboards; int i; // theme p = g_object_get_data(dialog, "nabi-pref-theme"); if (p != NULL) { model = gtk_tree_view_get_model(GTK_TREE_VIEW(p)); path = search_text_in_model(model, THEMES_LIST_NAME, DEFAULT_THEME); if (path != NULL) { gtk_tree_view_set_cursor (GTK_TREE_VIEW(p), path, NULL, FALSE); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(p), path, NULL, TRUE, 0.5, 0.0); gtk_tree_path_free(path); } } nabi_app_set_theme(DEFAULT_THEME); p = g_object_get_data(dialog, "nabi-pref-use-tray-icon"); if (p != NULL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p), TRUE); } // keyboard p = g_object_get_data(dialog, "nabi-pref-hangul-keyboard"); if (p != NULL) { keyboards = nabi_server_get_hangul_keyboard_list(nabi_server); for (i = 0; keyboards[i].id != NULL; i++) { if (strcmp(keyboards[i].id, DEFAULT_KEYBOARD) == 0) { gtk_combo_box_set_active(GTK_COMBO_BOX(p), i); break; } } } nabi_app_set_hangul_keyboard(DEFAULT_KEYBOARD); p = g_object_get_data(dialog, "nabi-pref-use-system-keymap"); if (p != NULL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p), FALSE); } p = g_object_get_data(dialog, "nabi-pref-latin-keyboard"); if (p != NULL) { i = 0; list = nabi_server->layouts; while (list != NULL) { NabiKeyboardLayout* layout = list->data; if (layout != NULL) { if (strcmp(layout->name, "none") == 0) { gtk_combo_box_set_active(GTK_COMBO_BOX(p), i); break; } } list = g_list_next(list); i++; } } // hangul p = g_object_get_data(dialog, "nabi-pref-trigger-keys"); if (p != NULL) { gtk_list_store_clear(GTK_LIST_STORE(p)); gtk_list_store_append(GTK_LIST_STORE(p), &iter); gtk_list_store_set(GTK_LIST_STORE(p), &iter, 0, "Hangul", -1); gtk_list_store_append(GTK_LIST_STORE(p), &iter); gtk_list_store_set(GTK_LIST_STORE(p), &iter, 0, "Shift+space", -1); } p = g_object_get_data(dialog, "nabi-pref-off-keys"); if (p != NULL) { gtk_list_store_clear(GTK_LIST_STORE(p)); gtk_list_store_append(GTK_LIST_STORE(p), &iter); gtk_list_store_set(GTK_LIST_STORE(p), &iter, 0, "Escape", -1); } // hanja p = g_object_get_data(dialog, "nabi-pref-candidate-font"); if (p != NULL) { candidate_font_button_set_labels(GTK_WIDGET(p), "Sans 14"); } g_string_assign(config->candidate_font, "Sans 14"); p = g_object_get_data(dialog, "nabi-pref-candidate-keys"); if (p != NULL) { gtk_list_store_clear(GTK_LIST_STORE(p)); gtk_list_store_append(GTK_LIST_STORE(p), &iter); gtk_list_store_set(GTK_LIST_STORE(p), &iter, 0, "Hangul_Hanja", -1); gtk_list_store_append(GTK_LIST_STORE(p), &iter); gtk_list_store_set(GTK_LIST_STORE(p), &iter, 0, "F9", -1); } p = g_object_get_data(dialog, "nabi-pref-simplified-chinese"); if (p != NULL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p), FALSE); } // advanced p = g_object_get_data(dialog, "nabi-pref-xim-name"); if (p != NULL) { gtk_entry_set_text(GTK_ENTRY(p), PACKAGE); } p = g_object_get_data(dialog, "nabi-pref-use-dynamic-event-flow"); if (p != NULL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p), TRUE); } p = g_object_get_data(dialog, "nabi-pref-commit-by-word"); if (p != NULL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p), FALSE); } p = g_object_get_data(dialog, "nabi-pref-auto-reorder"); if (p != NULL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p), TRUE); } p = g_object_get_data(dialog, "nabi-pref-default-input-mode"); if (p != NULL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p), FALSE); } p = g_object_get_data(dialog, "nabi-pref-input-mode-option"); if (p != NULL) { gtk_combo_box_set_active(GTK_COMBO_BOX(p), NABI_INPUT_MODE_PER_TOPLEVEL); } p = g_object_get_data(dialog, "nabi-pref-preedit-font"); if (p != NULL) { gtk_font_button_set_font_name(GTK_FONT_BUTTON(p), "Sans 9"); g_signal_emit_by_name(p, "font-set", NULL); } p = g_object_get_data(dialog, "nabi-pref-ignore-app-fonset"); if (p != NULL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p), FALSE); } } static void on_preference_destroy(GtkWidget *dialog, gpointer data) { nabi_app_save_config(); trigger_key_model = NULL; off_key_model = NULL; candidate_key_model = NULL; } static GtkWidget* reset_button_create(void) { GtkWidget *button; GtkWidget *box; GtkWidget *align; GtkWidget *label; GtkWidget *image; gint image_spacing = 3; button = gtk_button_new(); gtk_widget_style_get(GTK_WIDGET(button), "image-spacing", &image_spacing, NULL); box = gtk_hbox_new(FALSE, image_spacing); image = gtk_image_new_from_stock(GTK_STOCK_REFRESH, GTK_ICON_SIZE_BUTTON); gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0); label = gtk_label_new_with_mnemonic(_("_Reset")); gtk_label_set_mnemonic_widget(GTK_LABEL(label), button); gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0); align = gtk_alignment_new(0.5, 0.5, 0, 0); gtk_container_add(GTK_CONTAINER(button), align); gtk_container_add(GTK_CONTAINER(align), box); return button; } GtkWidget* preference_window_create(void) { GtkWidget *dialog; GtkWidget *vbox; GtkWidget *notebook; GtkWidget *label; GtkWidget *button; GtkWidget *child; GtkWidget *action_area; GList *list; config = nabi->config; dialog = gtk_dialog_new_with_buttons(_("Nabi Preferences"), GTK_WINDOW(nabi->palette), GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); gtk_container_set_border_width(GTK_CONTAINER(dialog), 6); notebook = gtk_notebook_new(); gtk_container_set_border_width(GTK_CONTAINER(notebook), 6); /* icons */ label = gtk_label_new(_("Tray")); child = create_theme_page(dialog); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), child, label); if (nabi_server != NULL) { /* keyboard */ label = gtk_label_new(_("Keyboard")); child = create_keyboard_page(dialog); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), child, label); /* key */ label = gtk_label_new(_("Hangul")); child = create_hangul_page(dialog); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), child, label); /* candidate */ label = gtk_label_new(_("Hanja")); child = create_candidate_page(dialog); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), child, label); /* advanced */ label = gtk_label_new(_("Advanced")); child = create_advanced_page(dialog); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), child, label); } vbox = GTK_DIALOG(dialog)->vbox; gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0); g_signal_connect(G_OBJECT(dialog), "destroy", G_CALLBACK(on_preference_destroy), NULL); //gtk_window_set_icon(GTK_WINDOW(dialog), default_icon); gtk_window_set_default_size(GTK_WINDOW(dialog), 300, 300); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE); action_area = GTK_DIALOG(dialog)->action_area; gtk_button_box_set_layout(GTK_BUTTON_BOX(action_area), GTK_BUTTONBOX_END); list = gtk_container_get_children(GTK_CONTAINER(action_area)); if (list != NULL) { GList *child = g_list_last(list); if (child != NULL && child->data != NULL) gtk_widget_grab_focus(GTK_WIDGET(child->data)); g_list_free(list); } button = reset_button_create(); gtk_box_pack_end(GTK_BOX(action_area), button, FALSE, FALSE, 0); gtk_button_box_set_child_secondary(GTK_BUTTON_BOX(action_area), button, TRUE); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_preference_reset), dialog); gtk_widget_show_all(dialog); return dialog; } nabi-nabi-1.0.1/src/preference.h000066400000000000000000000016341430012456200164100ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2008 Choe Hwanjin * * 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 */ #ifndef nabi_preference_h #define nabi_preference_h GtkWidget* preference_window_create(void); #endif // nabi_preference_h nabi-nabi-1.0.1/src/sctc.h000066400000000000000000003112771430012456200152350ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2007-2008 Choe Hwanjin * * 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 */ /* data below is from SCIM project and modified for nabi */ const static NabiUnicharPair nabi_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 } }; const static NabiUnicharPair nabi_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 } }; nabi-nabi-1.0.1/src/server.c000066400000000000000000000653461430012456200156050ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2009 Choe Hwanjin * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include "debug.h" #include "gettext.h" #include "server.h" #include "fontset.h" #include "hangul.h" #define NABI_SYMBOL_TABLE NABI_DATA_DIR G_DIR_SEPARATOR_S "symbol.txt" /* from handler.c */ Bool nabi_handler(XIMS ims, IMProtocol *call_data); static void nabi_server_delete_layouts(NabiServer* server); long nabi_filter_mask = KeyPressMask | KeyReleaseMask; /* Supported Inputstyles */ static XIMStyle nabi_input_styles[] = { XIMPreeditCallbacks | XIMStatusCallbacks, XIMPreeditCallbacks | XIMStatusNothing, XIMPreeditPosition | XIMStatusNothing, XIMPreeditArea | XIMStatusNothing, XIMPreeditNothing | XIMStatusNothing, 0 }; static XIMEncoding nabi_encodings[] = { "COMPOUND_TEXT", NULL }; static char *nabi_locales[] = { "ko_KR.UTF-8", "ko_KR.utf8", "ko_KR.eucKR", "ko_KR.euckr", "ko.UTF-8", "ko.utf8", "ko.eucKR", "ko.euckr", "ko", "a3_AZ.UTF-8", "af_ZA.UTF-8", "am_ET.UTF-8", "ar_AA.UTF-8", "ar_AE.UTF-8", "ar_BH.UTF-8", "ar_DZ.UTF-8", "ar_EG.UTF-8", "ar_IN.UTF-8", "ar_IQ.UTF-8", "ar_JO.UTF-8", "ar_KW.UTF-8", "ar_LB.UTF-8", "ar_LY.UTF-8", "ar_MA.UTF-8", "ar_OM.UTF-8", "ar_QA.UTF-8", "ar_SA.UTF-8", "ar_SD.UTF-8", "ar_SY.UTF-8", "ar_TN.UTF-8", "ar_YE.UTF-8", "as_IN.UTF-8", "az_AZ.UTF-8", "be_BY.UTF-8", "bg_BG.UTF-8", "bn_BD.UTF-8", "bn_IN.UTF-8", "bo_IN.UTF-8", "br_FR.UTF-8", "bs_BA.UTF-8", "ca_AD.UTF-8", "ca_ES.UTF-8", "ca_FR.UTF-8", "ca_IT.UTF-8", "cs_CZ.UTF-8", "cy_GB.UTF-8", "da_DK.UTF-8", "de_AT.UTF-8", "de_BE.UTF-8", "de_CH.UTF-8", "de_DE.UTF-8", "de_LI.UTF-8", "de_LU.UTF-8", "el_CY.UTF-8", "el_GR.UTF-8", "en_AU.UTF-8", "en_BE.UTF-8", "en_BZ.UTF-8", "en_CA.UTF-8", "en_GB.UTF-8", "en_IE.UTF-8", "en_JM.UTF-8", "en_MT.UTF-8", "en_NZ.UTF-8", "en_TT.UTF-8", "en_UK.UTF-8", "en_US.UTF-8", "en_ZA.UTF-8", "eo_EO.UTF-8", "eo_XX.UTF-8", "es_AR.UTF-8", "es_BO.UTF-8", "es_CL.UTF-8", "es_CO.UTF-8", "es_CR.UTF-8", "es_DO.UTF-8", "es_EC.UTF-8", "es_ES.UTF-8", "es_GT.UTF-8", "es_HN.UTF-8", "es_MX.UTF-8", "es_NI.UTF-8", "es_PA.UTF-8", "es_PE.UTF-8", "es_PR.UTF-8", "es_PY.UTF-8", "es_SV.UTF-8", "es_US.UTF-8", "es_UY.UTF-8", "es_VE.UTF-8", "et_EE.UTF-8", "eu_ES.UTF-8", "fa_IR.UTF-8", "fi_FI.UTF-8", "fo_FO.UTF-8", "fr_BE.UTF-8", "fr_CA.UTF-8", "fr_CH.UTF-8", "fr_FR.UTF-8", "fr_LU.UTF-8", "ga_IE.UTF-8", "gd_GB.UTF-8", "gl_ES.UTF-8", "gu_IN.UTF-8", "gv_GB.UTF-8", "he_IL.UTF-8", "hi_IN.UTF-8", "hne_IN.UTF-8", "hr_HR.UTF-8", "hu_HU.UTF-8", "hy_AM.UTF-8", "id_ID.UTF-8", "is_IS.UTF-8", "it_CH.UTF-8", "it_IT.UTF-8", "iu_CA.UTF-8", "ja_JP.UTF-8", "ka_GE.UTF-8", "kk_KZ.UTF-8", "kl_GL.UTF-8", "kn_IN.UTF-8", "ko_KR.UTF-8", "ks_IN.UTF-8", "ks_IN@devanagari.UTF-8", "kw_GB.UTF-8", "ky_KG.UTF-8", "lo_LA.UTF-8", "lt_LT.UTF-8", "lv_LV.UTF-8", "mai_IN.UTF-8", "mi_NZ.UTF-8", "mk_MK.UTF-8", "ml_IN.UTF-8", "mr_IN.UTF-8", "ms_MY.UTF-8", "mt_MT.UTF-8", "nb_NO.UTF-8", "ne_NP.UTF-8", "nl_BE.UTF-8", "nl_NL.UTF-8", "nn_NO.UTF-8", "no_NO.UTF-8", "nr_ZA.UTF-8", "nso_ZA.UTF-8", "ny_NO.UTF-8", "oc_FR.UTF-8", "or_IN.UTF-8", "pa_IN.UTF-8", "pa_PK.UTF-8", "pd_DE.UTF-8", "pd_US.UTF-8", "ph_PH.UTF-8", "pl_PL.UTF-8", "pp_AN.UTF-8", "pt_BR.UTF-8", "pt_PT.UTF-8", "ro_RO.UTF-8", "ru_RU.UTF-8", "ru_UA.UTF-8", "rw_RW.UTF-8", "sa_IN.UTF-8", "sd_IN.UTF-8", "sd_IN@devanagari.UTF-8", "se_NO.UTF-8", "sh_BA.UTF-8", "sh_YU.UTF-8", "si_LK.UTF-8", "sk_SK.UTF-8", "sl_SI.UTF-8", "sq_AL.UTF-8", "sr_CS.UTF-8", "sr_ME.UTF-8", "sr_RS.UTF-8", "sr_YU.UTF-8", "ss_ZA.UTF-8", "st_ZA.UTF-8", "sv_FI.UTF-8", "sv_SE.UTF-8", "ta_IN.UTF-8", "te_IN.UTF-8", "tg_TJ.UTF-8", "th_TH.UTF-8", "ti_ER.UTF-8", "ti_ET.UTF-8", "tl_PH.UTF-8", "tn_ZA.UTF-8", "tr_TR.UTF-8", "ts_ZA.UTF-8", "tt_RU.UTF-8", "uk_UA.UTF-8", "ur_IN.UTF-8", "ur_PK.UTF-8", "uz_UZ.UTF-8", "ve_ZA.UTF-8", "vi_VN.UTF-8", "wa_BE.UTF-8", "xh_ZA.UTF-8", "yi_US.UTF-8", "zh_CN.UTF-8", "zh_HK.UTF-8", "zh_SG.UTF-8", "zh_TW.UTF-8", "zu_ZA.UTF-8", NULL, NULL }; NabiServer* nabi_server_new(Display* display, int screen, const char *name) { unsigned i; unsigned n; const char *charset; char *trigger_keys[3] = { "Hangul", "Shift+space", NULL }; char *off_keys[2] = { "Escape", NULL }; char *candidate_keys[3] = { "Hangul_Hanja", "F9", NULL }; NabiServer *server; server = (NabiServer*)malloc(sizeof(NabiServer)); server->display = display; server->screen = screen; /* server var */ if (name == NULL) server->name = strdup(PACKAGE); else server->name = strdup(name); server->xims = 0; server->window = 0; server->filter_mask = 0; server->trigger_keys.count_keys = 0; server->trigger_keys.keylist = NULL; server->off_keys.count_keys = 0; server->off_keys.keylist = NULL; server->candidate_keys.count_keys = 0; server->candidate_keys.keylist = NULL; server->locales = nabi_locales; server->filter_mask = KeyPressMask; /* keys */ nabi_server_set_trigger_keys(server, trigger_keys); nabi_server_set_off_keys(server, off_keys); nabi_server_set_candidate_keys(server, candidate_keys); /* check locale encoding */ if (g_get_charset(&charset)) { /* utf8 encoding */ /* We add current locale to nabi support locales array, * so whatever the locale string is, if its encoding is utf8, * nabi support the locale */ for (i = 0; server->locales[i] != NULL; i++) continue; server->locales[i] = setlocale(LC_CTYPE, NULL); } /* connection list */ server->connections = NULL; /* toplevel window list */ server->toplevels = NULL; /* hangul data */ server->layouts = NULL; server->layout = NULL; server->hangul_keyboard = NULL; /* init keyboard list from libhangul */ n = hangul_ic_get_n_keyboards(); server->hangul_keyboard_list = g_new(NabiHangulKeyboard, n + 1); for (i = 0; i < n; ++i) { const char* id = hangul_ic_get_keyboard_id(i); const char* name = hangul_ic_get_keyboard_name(i); server->hangul_keyboard_list[i].id = id; server->hangul_keyboard_list[i].name= name; } server->hangul_keyboard_list[i].id = NULL; server->hangul_keyboard_list[i].name= NULL; server->dynamic_event_flow = True; server->commit_by_word = False; server->auto_reorder = True; server->hanja_mode = False; server->default_input_mode = NABI_INPUT_MODE_DIRECT; server->input_mode = server->default_input_mode; server->input_mode_scope = NABI_INPUT_MODE_PER_TOPLEVEL; server->output_mode = NABI_OUTPUT_SYLLABLE; /* hanja */ server->hanja_table = hanja_table_load(NULL); /* symbol */ server->symbol_table = hanja_table_load(NABI_SYMBOL_TABLE); /* options */ server->show_status = False; server->use_simplified_chinese = False; server->ignore_app_fontset = False; server->use_system_keymap = False; server->preedit_fg.pixel = 0; server->preedit_fg.red = 0xffff; server->preedit_fg.green = 0; server->preedit_fg.blue = 0; server->preedit_bg.pixel = 0; server->preedit_bg.red = 0; server->preedit_bg.green = 0; server->preedit_bg.blue = 0; server->preedit_font = pango_font_description_from_string("Sans 9"); server->candidate_font = pango_font_description_from_string("Sans 14"); /* statistics */ memset(&(server->statistics), 0, sizeof(server->statistics)); return server; } void nabi_server_destroy(NabiServer *server) { GSList *item; if (server == NULL) return; /* destroy remaining connections */ if (server->connections != NULL) { item = server->connections; while (item != NULL) { if (item->data != NULL) { NabiConnection* conn = (NabiConnection*)item->data; nabi_log(3, "remove remaining connection: 0x%x\n", conn->id); nabi_connection_destroy(conn); } item = g_slist_next(item); } g_slist_free(server->connections); server->connections = NULL; } /* free remaining toplevel list */ if (server->toplevels != NULL) { item = server->toplevels; while (item != NULL) { NabiToplevel* toplevel = (NabiToplevel*)item->data; nabi_log(3, "remove remaining toplevel: 0x%x\n", toplevel->id); g_free(item->data); item = g_slist_next(item); } g_slist_free(server->toplevels); server->toplevels = NULL; } /* free remaining fontsets */ nabi_fontset_free_all(server->display); /* keyboard */ nabi_server_delete_layouts(server); g_free(server->hangul_keyboard); /* delete hanja table */ if (server->hanja_table != NULL) hanja_table_delete(server->hanja_table); /* delete symbol table */ if (server->symbol_table != NULL) hanja_table_delete(server->symbol_table); /* libhangul keyboard list */ g_free(server->hangul_keyboard_list); g_free(server->trigger_keys.keylist); g_free(server->candidate_keys.keylist); g_free(server->off_keys.keylist); pango_font_description_free(server->preedit_font); pango_font_description_free(server->candidate_font); g_free(server->name); g_free(server); } void nabi_server_set_hangul_keyboard(NabiServer *server, const char *id) { if (server == NULL) return; if (server->hangul_keyboard != NULL) g_free(server->hangul_keyboard); server->hangul_keyboard = g_strdup(id); } void nabi_server_set_mode_info(NabiServer *server, int state) { long data; Window root; Atom property; Atom type; if (server == NULL) return; data = state; root = RootWindow(server->display, server->screen); property = XInternAtom(server->display, "_HANGUL_INPUT_MODE", FALSE); type = XInternAtom(server->display, "INTEGER", FALSE); XChangeProperty(server->display, root, property, type, 32, PropModeReplace, (unsigned char*)&data, 1); } void nabi_server_set_output_mode(NabiServer *server, NabiOutputMode mode) { if (server == NULL) return; if (mode == NABI_OUTPUT_SYLLABLE) { server->output_mode = mode; } else { server->output_mode = mode; } } void nabi_server_set_preedit_font(NabiServer *server, const char *font_desc) { if (server == NULL) return; if (font_desc != NULL) pango_font_description_free(server->preedit_font); server->preedit_font = pango_font_description_from_string(font_desc); nabi_log(3, "set preedit font: %s\n", font_desc); } void nabi_server_set_candidate_font(NabiServer *server, const char *font_desc) { if (server == NULL) return; if (font_desc != NULL) pango_font_description_free(server->candidate_font); server->candidate_font = pango_font_description_from_string(font_desc); nabi_log(3, "set candidate font: %s\n", font_desc); } static void xim_trigger_keys_set_value(XIMTriggerKeys* keys, char** key_strings) { int i, j, n; XIMTriggerKey *keylist; if (keys == NULL) return; if (keys->keylist != NULL) { g_free(keys->keylist); keys->keylist = NULL; keys->count_keys = 0; } if (key_strings == NULL) return; for (n = 0; key_strings[n] != NULL; n++) continue; keylist = g_new(XIMTriggerKey, n); for (i = 0; i < n; i++) { keylist[i].keysym = 0; keylist[i].modifier = 0; keylist[i].modifier_mask = 0; } for (i = 0; i < n; i++) { gchar **list = g_strsplit(key_strings[i], "+", 0); for (j = 0; list[j] != NULL; j++) { if (strcmp("Shift", list[j]) == 0) { keylist[i].modifier |= ShiftMask; keylist[i].modifier_mask |= ShiftMask; } else if (strcmp("Control", list[j]) == 0) { keylist[i].modifier |= ControlMask; keylist[i].modifier_mask |= ControlMask; } else if (strcmp("Alt", list[j]) == 0) { keylist[i].modifier |= Mod1Mask; keylist[i].modifier_mask |= Mod1Mask; } else if (strcmp("Super", list[j]) == 0) { keylist[i].modifier |= Mod4Mask; keylist[i].modifier_mask |= Mod4Mask; } else { keylist[i].keysym = gdk_keyval_from_name(list[j]); } } g_strfreev(list); } keys->keylist = keylist; keys->count_keys = n; } void nabi_server_set_trigger_keys(NabiServer *server, char **keys) { xim_trigger_keys_set_value(&server->trigger_keys, keys); if (server->xims != NULL && server->dynamic_event_flow) { IMSetIMValues(server->xims, IMOnKeysList, &(server->trigger_keys), NULL); } } void nabi_server_set_off_keys(NabiServer *server, char **keys) { xim_trigger_keys_set_value(&server->off_keys, keys); } void nabi_server_set_candidate_keys(NabiServer *server, char **keys) { xim_trigger_keys_set_value(&server->candidate_keys, keys); } gboolean nabi_server_is_valid_ic(NabiServer* server, NabiIC* ic) { GSList* item = server->connections; while (item != NULL) { NabiConnection* conn = (NabiConnection*)item->data; if (g_slist_find(conn->ic_list, ic) != NULL) return TRUE; item = g_slist_next(item); } return FALSE; } NabiIC* nabi_server_get_ic(NabiServer *server, CARD16 connect_id, CARD16 ic_id) { NabiConnection* conn; conn = nabi_server_get_connection(server, connect_id); if (conn != NULL) { return nabi_connection_get_ic(conn, ic_id); } return NULL; } static Bool nabi_server_is_key(XIMTriggerKey *keylist, int count, KeySym key, unsigned int state) { int i; for (i = 0; i < count; i++) { if (key == keylist[i].keysym && (state & keylist[i].modifier_mask) == keylist[i].modifier) return True; } return False; } Bool nabi_server_is_trigger_key(NabiServer* server, KeySym key, unsigned int state) { return nabi_server_is_key(server->trigger_keys.keylist, server->trigger_keys.count_keys, key, state); } Bool nabi_server_is_off_key(NabiServer* server, KeySym key, unsigned int state) { return nabi_server_is_key(server->off_keys.keylist, server->off_keys.count_keys, key, state); } Bool nabi_server_is_candidate_key(NabiServer* server, KeySym key, unsigned int state) { return nabi_server_is_key(server->candidate_keys.keylist, server->candidate_keys.count_keys, key, state); } Bool nabi_server_is_running(const char* name) { Display* display; Atom atom; Window owner; char atom_name[64]; display = gdk_x11_get_default_xdisplay(); snprintf(atom_name, sizeof(atom_name), "@server=%s", name); atom = XInternAtom(display, atom_name, True); if (atom != None) { owner = XGetSelectionOwner(display, atom); if (owner != None) return True; } return False; } int nabi_server_start(NabiServer *server) { Window window; XIMS xims; XIMStyles input_styles; XIMEncodings encodings; char *locales; if (server == NULL) return 0; if (server->xims != NULL) return 0; window = XCreateSimpleWindow(server->display, RootWindow(server->display, server->screen), 0, 0, 1, 1, 1, 0, 0); input_styles.count_styles = sizeof(nabi_input_styles) / sizeof(XIMStyle) - 1; input_styles.supported_styles = nabi_input_styles; encodings.count_encodings = sizeof(nabi_encodings) / sizeof(XIMEncoding) - 1; encodings.supported_encodings = nabi_encodings; locales = g_strjoinv(",", server->locales); xims = IMOpenIM(server->display, IMModifiers, "Xi18n", IMServerWindow, window, IMServerName, server->name, IMLocale, locales, IMServerTransport, "X/", IMInputStyles, &input_styles, NULL); g_free(locales); if (xims == NULL) { nabi_log(1, "can't open input method service\n"); exit(1); } if (server->dynamic_event_flow) { IMSetIMValues(xims, IMOnKeysList, &(server->trigger_keys), NULL); } IMSetIMValues(xims, IMEncodingList, &encodings, IMProtocolHandler, nabi_handler, IMFilterEventMask, nabi_filter_mask, NULL); server->xims = xims; server->window = window; server->start_time = time(NULL); nabi_log(1, "xim server started\n"); return 0; } int nabi_server_stop(NabiServer *server) { if (server == NULL) return 0; if (server->xims != NULL) { IMCloseIM(server->xims); server->xims = NULL; } nabi_log(1, "xim server stoped\n"); return 0; } NabiConnection* nabi_server_create_connection(NabiServer *server, CARD16 connect_id, const char* locale) { NabiConnection* conn; if (server == NULL) return NULL; conn = nabi_connection_create(connect_id, locale); server->connections = g_slist_prepend(server->connections, conn); return conn; } NabiConnection* nabi_server_get_connection(NabiServer *server, CARD16 connect_id) { GSList* item; item = server->connections; while (item != NULL) { NabiConnection* conn = (NabiConnection*)item->data; if (conn != NULL && conn->id == connect_id) return conn; item = g_slist_next(item); } return NULL; } void nabi_server_destroy_connection(NabiServer *server, CARD16 connect_id) { NabiConnection* conn = nabi_server_get_connection(server, connect_id); server->connections = g_slist_remove(server->connections, conn); nabi_connection_destroy(conn); } NabiToplevel* nabi_server_get_toplevel(NabiServer* server, Window id) { NabiToplevel* toplevel; GSList* item; item = server->toplevels; while (item != NULL) { NabiToplevel* toplevel = (NabiToplevel*)item->data; if (toplevel != NULL && toplevel->id == id) { nabi_toplevel_ref(toplevel); return toplevel; } item = g_slist_next(item); } toplevel = nabi_toplevel_new(id); server->toplevels = g_slist_prepend(server->toplevels, toplevel); return toplevel; } void nabi_server_remove_toplevel(NabiServer* server, NabiToplevel* toplevel) { if (server != NULL && server->toplevels != NULL) server->toplevels = g_slist_remove(server->toplevels, toplevel); } Bool nabi_server_is_locale_supported(NabiServer *server, const char *locale) { const char *charset; if (strncmp("ko", locale, 2) == 0) return True; if (g_get_charset(&charset)) { return True; } return False; } void nabi_server_log_key(NabiServer *server, ucschar c, unsigned int state) { if (c == XK_BackSpace) { server->statistics.backspace++; server->statistics.total++; } else if (c == XK_space) { server->statistics.space++; server->statistics.total++; } else if (c >= 0x1100 && c <= 0x11FF) { int index = (unsigned int)c & 0xff; if (index >= 0 && index <= 255) { server->statistics.jamo[index]++; server->statistics.total++; } } if (state & ShiftMask) server->statistics.shift++; } static gchar* skip_space(gchar* p) { while (g_ascii_isspace(*p)) p++; return p; } static void nabi_server_delete_layouts(NabiServer* server) { if (server->layouts != NULL) { g_list_foreach(server->layouts, nabi_keyboard_layout_free, NULL); g_list_free(server->layouts); server->layouts = NULL; } } void nabi_server_load_keyboard_layout(NabiServer *server, const char *filename) { FILE *file; char *p, *line; char *saved_position = NULL; char buf[256]; GList *list = NULL; NabiKeyboardLayout *layout = NULL; file = fopen(filename, "r"); if (file == NULL) { fprintf(stderr, "Nabi: Failed to open keyboard layout file: %s\n", filename); return; } layout = nabi_keyboard_layout_new("none"); list = g_list_append(list, layout); layout = NULL; for (line = fgets(buf, sizeof(buf), file); line != NULL; line = fgets(buf, sizeof(buf), file)) { p = skip_space(buf); /* skip comments */ if (*p == '\0' || *p == ';' || *p == '#') continue; if (p[0] == '[') { p = strtok_r(p + 1, "]", &saved_position); if (p != NULL) { if (layout != NULL) list = g_list_append(list, layout); layout = nabi_keyboard_layout_new(p); } } else if (layout != NULL) { KeySym key, value; p = strtok_r(p, " \t", &saved_position); if (p == NULL) continue; key = strtol(p, NULL, 16); if (key == 0) continue; p = strtok_r(NULL, "\r\n\t ", &saved_position); if (p == NULL) continue; value = strtol(p, NULL, 16); if (value == 0) continue; nabi_keyboard_layout_append(layout, key, value); } } if (layout != NULL) list = g_list_append(list, layout); fclose(file); nabi_server_delete_layouts(server); server->layouts = list; } void nabi_server_set_keyboard_layout(NabiServer *server, const char* name) { GList* list; if (server == NULL) return; if (strcmp(name, "none") == 0) { server->layout = NULL; return; } list = server->layouts; while (list != NULL) { NabiKeyboardLayout* layout = list->data; if (strcmp(layout->name, name) == 0) { server->layout = layout; } list = g_list_next(list); } } const NabiHangulKeyboard* nabi_server_get_hangul_keyboard_list(NabiServer* server) { if (server != NULL) return server->hangul_keyboard_list; return NULL; } const char* nabi_server_get_keyboard_name_by_id(NabiServer* server, const char* id) { int i; if (server == NULL) return NULL; for (i = 0; server->hangul_keyboard_list[i].id != NULL; i++) { if (strcmp(id, server->hangul_keyboard_list[i].id) == 0) { return server->hangul_keyboard_list[i].name; } } return NULL; } const char* nabi_server_get_current_keyboard_name(NabiServer* server) { return nabi_server_get_keyboard_name_by_id(server, server->hangul_keyboard); } void nabi_server_toggle_input_mode(NabiServer* server) { if (server == NULL) return; if (server->input_mode_scope == NABI_INPUT_MODE_PER_DESKTOP) { if (server->input_mode == NABI_INPUT_MODE_DIRECT) { server->input_mode = NABI_INPUT_MODE_COMPOSE; nabi_server_set_mode_info(nabi_server, NABI_MODE_INFO_COMPOSE); nabi_log(1, "change input mode: compose\n"); } else { server->input_mode = NABI_INPUT_MODE_DIRECT; nabi_server_set_mode_info(nabi_server, NABI_MODE_INFO_DIRECT); nabi_log(1, "change input mode: direct\n"); } } } void nabi_server_set_dynamic_event_flow(NabiServer* server, Bool flag) { if (server != NULL) server->dynamic_event_flow = flag; } void nabi_server_set_xim_name(NabiServer* server, const char* name) { if (server != NULL) { g_free(server->name); server->name = g_strdup(name); } } void nabi_server_set_commit_by_word(NabiServer* server, Bool flag) { if (server != NULL) server->commit_by_word = flag; } void nabi_server_set_auto_reorder(NabiServer* server, Bool flag) { if (server != NULL) server->auto_reorder = flag; } void nabi_server_set_default_input_mode(NabiServer* server, NabiInputMode mode) { if (server != NULL) server->default_input_mode = mode; } void nabi_server_set_input_mode_scope(NabiServer* server, NabiInputModeScope scope) { if (server != NULL) server->input_mode_scope = scope; } void nabi_server_set_hanja_mode(NabiServer* server, Bool flag) { if (server != NULL) server->hanja_mode = flag; } void nabi_server_set_simplified_chinese(NabiServer* server, Bool state) { if (server != NULL) server->use_simplified_chinese = state; } void nabi_server_set_ignore_app_fontset(NabiServer* server, Bool state) { if (server != NULL) server->ignore_app_fontset = state; } void nabi_server_set_use_system_keymap(NabiServer* server, Bool state) { if (server != NULL) server->use_system_keymap = state; } void nabi_server_write_log(NabiServer *server) { const gchar *homedir; gchar *filename; FILE *file; if (server->statistics.total <= 0) return; homedir = g_get_home_dir(); filename = g_build_filename(homedir, ".nabi", "nabi.log", NULL); file = fopen(filename, "a"); if (file != NULL) { int i, sum; time_t current_time; struct tm local_time; char buf[256] = { '\0', }; localtime_r(&server->start_time, &local_time); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &local_time); fprintf(file, "%s - ", buf); current_time = time(NULL); localtime_r(¤t_time, &local_time); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &local_time); fprintf(file, "%s", buf); fprintf(file, " (%ds)\n", (int)(current_time - server->start_time)); fprintf(file, "total: %d\n", server->statistics.total); fprintf(file, "space: %d\n", server->statistics.space); fprintf(file, "backspace: %d\n", server->statistics.backspace); fprintf(file, "keyboard: %s\n", server->hangul_keyboard); /* choseong */ sum = 0; for (i = 0x00; i <= 0x12; i++) sum += server->statistics.jamo[i]; if (sum > 0) { fprintf(file, "cho: "); for (i = 0x0; i <= 0x12; i++) { char label[8] = { '\0', }; g_unichar_to_utf8(0x1100 + i, label); fprintf(file, "%s: %-3d ", label, server->statistics.jamo[i]); } fprintf(file, "\n"); } else { fprintf(file, "cho: 0\n"); } /* jungseong */ sum = 0; for (i = 0x61; i <= 0x75; i++) sum += server->statistics.jamo[i]; if (sum > 0) { fprintf(file, "jung: "); for (i = 0x61; i <= 0x75; i++) { char label[8] = { '\0', }; g_unichar_to_utf8(0x1100 + i, label); fprintf(file, "%s: %-3d ", label, server->statistics.jamo[i]); } fprintf(file, "\n"); } else { fprintf(file, "jung: 0\n"); } /* jong seong */ sum = 0; for (i = 0xa8; i <= 0xc2; i++) sum += server->statistics.jamo[i]; if (sum > 0) { fprintf(file, "jong: "); for (i = 0xa8; i <= 0xc2; i++) { char label[8] = { '\0', }; g_unichar_to_utf8(0x1100 + i, label); fprintf(file, "%s: %-3d ", label, server->statistics.jamo[i]); } fprintf(file, "\n"); } fprintf(file, "\n"); fclose(file); } g_free(filename); } nabi-nabi-1.0.1/src/server.h000066400000000000000000000170221430012456200155760ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2009 Choe Hwanjin * * 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 */ #ifndef __SERVER_H_ #define __SERVER_H_ #ifdef HAVE_STDINT_H #include #endif #include #include #include #include #include #include "../IMdkit/IMdkit.h" #include "../IMdkit/Xi18n.h" #include "ic.h" #include "keyboard-layout.h" typedef struct _NabiHangulKeyboard NabiHangulKeyboard; typedef struct _NabiServer NabiServer; #define KEYBOARD_TABLE_SIZE 94 struct _NabiHangulKeyboard { const gchar* id; const gchar* name; }; typedef enum { NABI_OUTPUT_SYLLABLE, NABI_OUTPUT_JAMO, NABI_OUTPUT_MANUAL } NabiOutputMode; typedef enum { NABI_INPUT_MODE_PER_DESKTOP, NABI_INPUT_MODE_PER_APPLICATION, NABI_INPUT_MODE_PER_TOPLEVEL, NABI_INPUT_MODE_PER_IC } NabiInputModeScope; enum { NABI_MODE_INFO_NONE, NABI_MODE_INFO_DIRECT, NABI_MODE_INFO_COMPOSE }; typedef void (*NabiModeInfoCallback)(int); struct NabiStatistics { int total; int space; int backspace; int shift; int jamo[256]; }; struct _NabiServer { /* XIMS */ Display* display; int screen; char* name; XIMS xims; Window window; long filter_mask; XIMTriggerKeys trigger_keys; XIMTriggerKeys off_keys; XIMTriggerKeys candidate_keys; char** locales; /* xim connection list */ GSList* connections; GSList* toplevels; /* keyboard translate */ GList* layouts; NabiKeyboardLayout* layout; /* hangul automata */ char* hangul_keyboard; NabiHangulKeyboard* hangul_keyboard_list; NabiOutputMode output_mode; /* hanja */ HanjaTable* hanja_table; /* symbol */ HanjaTable* symbol_table; /* options */ Bool dynamic_event_flow; Bool commit_by_word; Bool auto_reorder; Bool show_status; Bool hanja_mode; Bool use_simplified_chinese; Bool ignore_app_fontset; Bool use_system_keymap; NabiInputMode default_input_mode; NabiInputMode input_mode; NabiInputModeScope input_mode_scope; GdkColor preedit_fg; GdkColor preedit_bg; PangoFontDescription* preedit_font; PangoFontDescription* candidate_font; /* statistics */ time_t start_time; struct NabiStatistics statistics; }; extern NabiServer* nabi_server; NabiServer* nabi_server_new (Display* display, int screen, const char* name); void nabi_server_destroy (NabiServer* server); int nabi_server_start (NabiServer* server); int nabi_server_stop (NabiServer *server); Bool nabi_server_is_running(); Bool nabi_server_is_trigger_key (NabiServer* server, KeySym key, unsigned int state); Bool nabi_server_is_off_key (NabiServer* server, KeySym key, unsigned int state); Bool nabi_server_is_candidate_key(NabiServer* server, KeySym key, unsigned int state); void nabi_server_set_trigger_keys (NabiServer *server, char **keys); void nabi_server_set_off_keys (NabiServer *server, char **keys); void nabi_server_set_candidate_keys(NabiServer *server, char **keys); void nabi_server_load_keyboard_layout(NabiServer *server, const char *filename); void nabi_server_set_keyboard_layout(NabiServer *server, const char* name); void nabi_server_set_hangul_keyboard(NabiServer *server, const char *id); void nabi_server_toggle_input_mode(NabiServer* server); void nabi_server_set_mode_info(NabiServer *server, int state); void nabi_server_set_output_mode (NabiServer *server, NabiOutputMode mode); void nabi_server_set_preedit_font(NabiServer *server, const gchar *font_desc); void nabi_server_set_candidate_font(NabiServer *server, const gchar *font_desc); void nabi_server_set_dynamic_event_flow(NabiServer* server, Bool flag); void nabi_server_set_xim_name(NabiServer* server, const char* name); void nabi_server_set_commit_by_word(NabiServer* server, Bool flag); void nabi_server_set_auto_reorder(NabiServer* server, Bool flag); void nabi_server_set_hanja_mode(NabiServer* server, Bool flag); void nabi_server_set_default_input_mode(NabiServer* server, NabiInputMode mode); void nabi_server_set_input_mode_scope(NabiServer* server, NabiInputModeScope scope); void nabi_server_set_simplified_chinese(NabiServer* server, Bool state); void nabi_server_set_ignore_app_fontset(NabiServer* server, Bool state); void nabi_server_set_use_system_keymap(NabiServer* server, Bool state); NabiIC* nabi_server_get_ic (NabiServer *server, CARD16 connect_id, CARD16 icid); gboolean nabi_server_is_valid_ic (NabiServer* server, NabiIC* ic); NabiConnection* nabi_server_create_connection (NabiServer *server, CARD16 connect_id, const char* locale); NabiConnection* nabi_server_get_connection (NabiServer *server, CARD16 connect_id); void nabi_server_destroy_connection(NabiServer *server, CARD16 connect_id); NabiToplevel* nabi_server_get_toplevel(NabiServer* server, Window id); void nabi_server_remove_toplevel(NabiServer* server, NabiToplevel* toplevel); Bool nabi_server_is_locale_supported(NabiServer *server, const char *locale); Bool nabi_server_is_valid_str (NabiServer *server, const char* str); void nabi_server_log_key (NabiServer *server, ucschar c, unsigned int state); void nabi_server_write_log(NabiServer *server); Bool nabi_server_load_keyboard_table(NabiServer *server, const char *filename); Bool nabi_server_load_compose_table(NabiServer *server, const char *filename); const NabiHangulKeyboard* nabi_server_get_hangul_keyboard_list(NabiServer* server); const char* nabi_server_get_keyboard_name_by_id(NabiServer* server, const char* id); const char* nabi_server_get_current_keyboard_name(NabiServer* server); #endif /* __SERVER_H_ */ /* vim: set ts=8 sw=4 sts=4 : */ nabi-nabi-1.0.1/src/session.c000066400000000000000000000147531430012456200157560ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #ifdef HAVE_LIBSM #include #include #include #include #include #include "debug.h" #include "server.h" #include "session.h" #include "nabi.h" static SmcConn session_connection; static gboolean process_ice_messages(GIOChannel *channel, GIOCondition condition, gpointer client_data) { IceConn ice_conn = (IceConn)client_data; IceProcessMessagesStatus status; status = IceProcessMessages(ice_conn, NULL, NULL); if (status == IceProcessMessagesIOError) { nabi_log(1, "ice message process error\n"); IceSetShutdownNegotiation(ice_conn, False); IceCloseConnection(ice_conn); } return TRUE; } static void ice_watch_proc(IceConn ice_conn, IcePointer client_data, Bool opening, IcePointer *watch_data) { guint input_id; if (opening) { GIOChannel *channel; channel = g_io_channel_unix_new(IceConnectionNumber(ice_conn)); input_id = g_io_add_watch(channel, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_PRI, process_ice_messages, ice_conn); g_io_channel_unref(channel); *watch_data = (IcePointer)GUINT_TO_POINTER(input_id); } else { input_id = GPOINTER_TO_UINT((gpointer) *watch_data); g_source_remove(input_id); } } static void save_yourself_proc(SmcConn smc_conn, SmPointer client_data, int save_type, Bool shutdown, int interact_style, Bool fast) { nabi_app_save_config(); SmcSaveYourselfDone(smc_conn, True); } static void die_proc(SmcConn smc_conn, SmPointer client_data) { nabi_app_quit(); } static void save_complete_proc(SmcConn smc_conn, SmPointer client_data) { } static void shutdown_cancelled_proc(SmcConn smc_conn, SmPointer client_data) { SmcSaveYourselfDone(smc_conn, True); } static SmProp * property_new(const char *name, const char *type, ...) { SmProp *prop; SmPropValue *val_list; va_list args; const char *str; int n, i; prop = g_malloc(sizeof(SmProp)); prop->name = g_strdup(name); prop->type = g_strdup(type); va_start(args, type); str = va_arg(args, const char*); for (n = 0; str != NULL; n++, str = va_arg(args, const char*)) continue; va_end(args); prop->num_vals = n; val_list = g_malloc(sizeof(SmPropValue) * n); va_start(args, type); for (i = 0; i < n; i++) { str = va_arg(args, const char*); val_list[i].length = strlen(str); val_list[i].value = g_strdup(str); } va_end(args); prop->vals = val_list; return prop; } static void property_free(SmProp *prop) { int i; g_free(prop->name); g_free(prop->type); for (i = 0; i < prop->num_vals; i++) g_free(prop->vals[i].value); g_free(prop->vals); g_free(prop); } static void setup_properties(const char *client_id) { gchar *process_id; gchar *restart_style_hint; const gchar *program; const gchar *user_id; SmProp *prop_list[6]; if (session_connection == NULL) return; process_id = g_strdup_printf("%d", (int) getpid()); program = g_get_prgname(); user_id = g_get_user_name(); prop_list[0] = property_new(SmCloneCommand, SmLISTofARRAY8, program, NULL); prop_list[1] = property_new(SmProcessID, SmARRAY8, process_id, NULL); prop_list[2] = property_new(SmProgram, SmARRAY8, program, NULL); if (nabi->status_only) prop_list[3] = property_new(SmRestartCommand, SmLISTofARRAY8, program, "--status-only", "--sm-client-id", client_id, NULL); else prop_list[3] = property_new(SmRestartCommand, SmLISTofARRAY8, program, "--sm-client-id", client_id, NULL); prop_list[4] = property_new(SmUserID, SmARRAY8, user_id, NULL); restart_style_hint = g_strdup_printf("%c", (char)SmRestartImmediately); prop_list[5] = property_new(SmRestartStyleHint, SmCARD8, restart_style_hint, NULL); g_free(restart_style_hint); SmcSetProperties(session_connection, 6, prop_list); property_free(prop_list[0]); property_free(prop_list[1]); property_free(prop_list[2]); property_free(prop_list[3]); property_free(prop_list[4]); property_free(prop_list[5]); g_free(process_id); } void nabi_session_open(char *previos_id) { char buf[256]; SmcCallbacks callbacks; char *client_id = NULL; IceAddConnectionWatch(ice_watch_proc, NULL); callbacks.save_yourself.callback = save_yourself_proc; callbacks.save_yourself.client_data = NULL; callbacks.die.callback = die_proc; callbacks.die.client_data = NULL; callbacks.save_complete.callback = save_complete_proc; callbacks.save_complete.client_data = NULL; callbacks.shutdown_cancelled.callback = shutdown_cancelled_proc; callbacks.shutdown_cancelled.client_data = NULL; session_connection = SmcOpenConnection(NULL, NULL, SmProtoMajor, SmProtoMinor, SmcSaveYourselfProcMask | SmcDieProcMask | SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask, &callbacks, previos_id, &client_id, sizeof(buf), buf); if (session_connection == NULL) { nabi_log(1, "session: %s\n", buf); return; } if (client_id == NULL) return; setup_properties(client_id); gdk_set_sm_client_id(client_id); g_free(nabi->session_id); nabi->session_id = client_id; return; } void nabi_session_close(void) { char *prop_names[] = { SmRestartStyleHint, 0 }; if (session_connection == NULL) return; SmcDeleteProperties(session_connection, 1, prop_names); SmcCloseConnection(session_connection, 0, NULL); gdk_set_sm_client_id(NULL); g_free(nabi->session_id); nabi->session_id = NULL; } #else /* HAVE_LIBSM */ void nabi_session_open(char *previos_id) { } void nabi_session_close(void) { } #endif /* HAVE_LIBSM */ nabi-nabi-1.0.1/src/session.h000066400000000000000000000016741430012456200157610ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * 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 */ #ifndef _NABI_SESSION_H #define _NABI_SESSION_H void nabi_session_open(char *previos_id); void nabi_session_close(void); #endif /* _NABI_SESSION_H */ nabi-nabi-1.0.1/src/ui.c000066400000000000000000001355101430012456200147030ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2010 Choe Hwanjin * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #if GTK_CHECK_VERSION(2, 16, 0) #define HAVE_GTK_STATUS_ICON 1 #endif #if !HAVE_GTK_STATUS_ICON #include "eggtrayicon.h" #endif #include "debug.h" #include "gettext.h" #include "nabi.h" #include "ic.h" #include "server.h" #include "conf.h" #include "handlebox.h" #include "preference.h" #include "default-icons.h" enum { THEMES_LIST_PATH = 0, THEMES_LIST_NONE, THEMES_LIST_HANGUL, THEMES_LIST_ENGLISH, THEMES_LIST_NAME, N_COLS }; typedef struct _NabiStateIcon { GtkWidget* widget; GtkWidget* none; GtkWidget* english; GtkWidget* hangul; } NabiStateIcon; typedef struct _NabiPalette { GtkWidget* widget; NabiStateIcon* state; GtkToggleButton* hanja_mode_button; guint source_id; } NabiPalette; #if HAVE_GTK_STATUS_ICON typedef struct _NabiTrayIcon { GtkStatusIcon* icon; } NabiTrayIcon; #else typedef struct _NabiTrayIcon { EggTrayIcon* widget; NabiStateIcon* state; GtkTooltips* tooltips; } NabiTrayIcon; #endif static GtkWidget *about_dialog = NULL; static GtkWidget *preference_dialog = NULL; static GtkWidget *hide_palette_menuitem = NULL; static void nabi_app_load_base_icons(); static void nabi_state_icon_load(NabiStateIcon* state, int w, int h); static void nabi_palette_update_state(NabiPalette* palette, int state); static void nabi_palette_show(NabiPalette* palette); static void nabi_palette_hide(NabiPalette* palette); static void nabi_palette_destroy(NabiPalette* palette); static void nabi_palette_update_hanja_mode(NabiPalette* palette, gboolean state); static gboolean nabi_tray_icon_create(gpointer data); #if !HAVE_GTK_STATUS_ICON static void nabi_tray_load_icons(NabiTrayIcon* tray, gint default_size); #endif static void nabi_tray_icon_update_tooltips(); static void nabi_tray_icon_destroy(NabiTrayIcon* tray); static void remove_event_filter(); static GtkWidget* create_tray_icon_menu(void); static GdkPixbuf *none_pixbuf = NULL; static GdkPixbuf *hangul_pixbuf = NULL; static GdkPixbuf *english_pixbuf = NULL; static NabiPalette* nabi_palette = NULL; static NabiTrayIcon* nabi_tray = NULL; static void load_colors(void) { gboolean ret; GdkColor color; GdkColormap *colormap; colormap = gdk_colormap_get_system(); /* preedit foreground */ gdk_color_parse(nabi->config->preedit_fg->str, &color); ret = gdk_colormap_alloc_color(colormap, &color, FALSE, TRUE); if (ret) nabi_server->preedit_fg = color; else { color.pixel = 1; color.red = 0xffff; color.green = 0xffff; color.blue = 0xffff; ret = gdk_colormap_alloc_color(colormap, &color, FALSE, TRUE); nabi_server->preedit_fg = color; } /* preedit background */ gdk_color_parse(nabi->config->preedit_bg->str, &color); ret = gdk_colormap_alloc_color(colormap, &color, FALSE, TRUE); if (ret) nabi_server->preedit_bg = color; else { color.pixel = 0; color.red = 0; color.green = 0; color.blue = 0; ret = gdk_colormap_alloc_color(colormap, &color, FALSE, TRUE); nabi_server->preedit_fg = color; } } static void set_up_keyboard(void) { /* keyboard layout */ if (g_path_is_absolute(nabi->config->keyboard_layouts_file->str)) { nabi_server_load_keyboard_layout(nabi_server, nabi->config->keyboard_layouts_file->str); } else { char* filename = g_build_filename(NABI_DATA_DIR, nabi->config->keyboard_layouts_file->str, NULL); nabi_server_load_keyboard_layout(nabi_server, filename); g_free(filename); } nabi_server_set_keyboard_layout(nabi_server, nabi->config->latin_keyboard->str); /* set keyboard */ nabi_server_set_hangul_keyboard(nabi_server, nabi->config->hangul_keyboard->str); } void nabi_app_new(void) { nabi = g_new(NabiApplication, 1); nabi->xim_name = NULL; nabi->palette = NULL; nabi->status_only = FALSE; nabi->session_id = NULL; nabi->icon_size = 0; nabi->root_window = NULL; nabi->mode_info_atom = 0; nabi->mode_info_type = 0; nabi->mode_info_xatom = 0; nabi->config = NULL; } void nabi_app_init(int *argc, char ***argv) { gchar *icon_filename; GdkPixbuf *default_icon = NULL; /* set XMODIFIERS env var to none before creating any widget * If this is not set, xim server will try to connect herself. * So It would be blocked */ putenv("XMODIFIERS=\"@im=none\""); putenv("GTK_IM_MODULE=gtk-im-context-simple"); /* process command line options */ if (argc != NULL && argv != NULL) { int i, j, k; for (i = 1; i < *argc;) { if (strcmp("-s", (*argv)[i]) == 0 || strcmp("--status-only", (*argv)[i]) == 0) { nabi->status_only = TRUE; (*argv)[i] = NULL; } else if (strcmp("--sm-client-id", (*argv)[i]) == 0 || strncmp("--sm-client-id=", (*argv)[i], 15) == 0) { gchar *session_id = (*argv)[i] + 14; if (*session_id == '=') { session_id++; } else { (*argv)[i] = NULL; i++; session_id = (*argv)[i]; } (*argv)[i] = NULL; nabi->session_id = g_strdup(session_id); } else if (strcmp("--xim-name", (*argv)[i]) == 0 || strncmp("--xim-name=", (*argv)[i], 11) == 0) { gchar *xim_name = (*argv)[i] + 10; if (*xim_name == '=') { xim_name++; } else { (*argv)[i] = NULL; i++; xim_name = (*argv)[i]; } (*argv)[i] = NULL; nabi->xim_name = g_strdup(xim_name); } else if (strcmp("-d", (*argv)[i]) == 0) { gchar* log_level = "0"; (*argv)[i] = NULL; i++; log_level = (*argv)[i]; nabi_log_set_level(strtol(log_level, NULL, 10)); } i++; } /* if we accept any command line options, compress rest of argc, argv */ for (i = 1; i < *argc; i++) { for (k = i; k < *argc; k++) if ((*argv)[k] == NULL) break; if (k > i) { k -= i; for (j = i + k; j < *argc; j++) (*argv)[j - k] = (*argv)[j]; *argc -= k; } } } nabi->config = nabi_config_new(); nabi_config_load(nabi->config); /* set atoms for hangul status */ nabi->mode_info_atom = gdk_atom_intern("_HANGUL_INPUT_MODE", TRUE); nabi->mode_info_type = gdk_atom_intern("INTEGER", TRUE); nabi->mode_info_xatom = gdk_x11_atom_to_xatom(nabi->mode_info_atom); /* default icon */ nabi->icon_size = 24; icon_filename = g_build_filename(NABI_DATA_DIR, "nabi.svg", NULL); default_icon = gdk_pixbuf_new_from_file(icon_filename, NULL); if (default_icon == NULL) { g_free(icon_filename); icon_filename = g_build_filename(NABI_DATA_DIR, "nabi.png", NULL); default_icon = gdk_pixbuf_new_from_file(icon_filename, NULL); } g_free(icon_filename); if (default_icon != NULL) { gtk_window_set_default_icon(default_icon); g_object_unref(default_icon); } /* status icons */ nabi_app_load_base_icons(); } static void set_up_output_mode(void) { NabiOutputMode mode; mode = NABI_OUTPUT_SYLLABLE; if (nabi->config->output_mode != NULL) { if (g_ascii_strcasecmp(nabi->config->output_mode->str, "jamo") == 0) { mode = NABI_OUTPUT_JAMO; } else if (g_ascii_strcasecmp(nabi->config->output_mode->str, "manual") == 0) { mode = NABI_OUTPUT_MANUAL; } } nabi_server_set_output_mode(nabi_server, mode); } void nabi_app_setup_server(void) { const char *locale; char **keys; const char* option; if (nabi->status_only) return; locale = setlocale(LC_CTYPE, NULL); if (locale == NULL || !nabi_server_is_locale_supported(nabi_server, locale)) { GtkWidget *message; const gchar *encoding = ""; g_get_charset(&encoding); message = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, "" "한글 입력기 나비에서 알림\n\n" "현재 로캘이 나비에서 지원하는 것이 아닙니다. " "이렇게 되어 있으면 한글 입력에 문제가 있을수 있습니다. " "설정을 확인해보십시오.\n\n" "현재 로캘 설정: %s (%s)", locale, encoding); gtk_label_set_use_markup(GTK_LABEL(GTK_MESSAGE_DIALOG(message)->label), TRUE); gtk_widget_show(message); gtk_dialog_run(GTK_DIALOG(message)); gtk_widget_destroy(message); } set_up_keyboard(); load_colors(); set_up_output_mode(); keys = g_strsplit(nabi->config->trigger_keys->str, ",", 0); nabi_server_set_trigger_keys(nabi_server, keys); g_strfreev(keys); keys = g_strsplit(nabi->config->candidate_keys->str, ",", 0); nabi_server_set_candidate_keys(nabi_server, keys); g_strfreev(keys); nabi_server_set_candidate_font(nabi_server, nabi->config->candidate_font->str); nabi_server_set_dynamic_event_flow(nabi_server, nabi->config->use_dynamic_event_flow); nabi_server_set_commit_by_word(nabi_server, nabi->config->commit_by_word); nabi_server_set_auto_reorder(nabi_server, nabi->config->auto_reorder); nabi_server_set_simplified_chinese(nabi_server, nabi->config->use_simplified_chinese); option = nabi->config->default_input_mode->str; if (strcmp(option, "compose") == 0) { nabi_server_set_default_input_mode(nabi_server, NABI_INPUT_MODE_COMPOSE); } else { nabi_server_set_default_input_mode(nabi_server, NABI_INPUT_MODE_DIRECT); } option = nabi->config->input_mode_scope->str; if (strcmp(option, "per_desktop") == 0) { nabi_server_set_input_mode_scope(nabi_server, NABI_INPUT_MODE_PER_DESKTOP); } else if (strcmp(option, "per_application") == 0) { nabi_server_set_input_mode_scope(nabi_server, NABI_INPUT_MODE_PER_APPLICATION); } else if (strcmp(option, "per_ic") == 0) { nabi_server_set_input_mode_scope(nabi_server, NABI_INPUT_MODE_PER_IC); } else { nabi_server_set_input_mode_scope(nabi_server, NABI_INPUT_MODE_PER_TOPLEVEL); } nabi_server_set_preedit_font(nabi_server, nabi->config->preedit_font->str); nabi_server_set_ignore_app_fontset(nabi_server, nabi->config->ignore_app_fontset); nabi_server_set_use_system_keymap(nabi_server, nabi->config->use_system_keymap); } void nabi_app_quit(void) { if (about_dialog != NULL) { gtk_dialog_response(GTK_DIALOG(about_dialog), GTK_RESPONSE_CANCEL); } if (preference_dialog != NULL) { gtk_dialog_response(GTK_DIALOG(preference_dialog), GTK_RESPONSE_CANCEL); } nabi_palette_destroy(nabi_palette); nabi_palette = NULL; } void nabi_app_free(void) { if (nabi == NULL) return; nabi_app_save_config(); nabi_config_delete(nabi->config); nabi->config = NULL; if (nabi_palette != NULL) { nabi_palette_destroy(nabi_palette); nabi_palette = NULL; } g_free(nabi->xim_name); g_free(nabi); nabi = NULL; } static NabiStateIcon* nabi_state_icon_new(int w, int h) { NabiStateIcon* state; state = g_new(NabiStateIcon, 1); state->widget = gtk_notebook_new(); gtk_notebook_set_show_tabs(GTK_NOTEBOOK(state->widget), FALSE); gtk_notebook_set_show_border(GTK_NOTEBOOK(state->widget), FALSE); state->none = gtk_image_new(); state->english = gtk_image_new(); state->hangul = gtk_image_new(); gtk_notebook_append_page(GTK_NOTEBOOK(state->widget), state->none, NULL); gtk_notebook_append_page(GTK_NOTEBOOK(state->widget), state->english, NULL); gtk_notebook_append_page(GTK_NOTEBOOK(state->widget), state->hangul, NULL); gtk_notebook_set_current_page(GTK_NOTEBOOK(state->widget), 0); gtk_widget_show_all(state->widget); nabi_state_icon_load(state, w, h); return state; } static void nabi_state_icon_load_scaled(GtkWidget* image, const GdkPixbuf* pixbuf, int w, int h) { int orig_width; int orig_height; int new_width; int new_height; double factor; GdkPixbuf* scaled; orig_width = gdk_pixbuf_get_width(pixbuf); orig_height = gdk_pixbuf_get_height(pixbuf); if (w < 0 && h < 0) { factor = 1.0; new_width = orig_width; new_height = orig_height; } else if (w < 0 && h > 0) { factor = (double)h / (double)orig_height; new_width = orig_width * factor + 0.5; // 반올림 new_height = h; } else if (w > 0 && h < 0) { factor = (double)w / (double)orig_width; new_width = w; new_height = orig_height * factor + 0.5; // 반올림 } else { factor = MIN((double)w / (double)orig_width, (double)h / (double)orig_height); new_width = w; new_height = h; } scaled = gdk_pixbuf_scale_simple(pixbuf, new_width, new_height, GDK_INTERP_TILES); gtk_image_set_from_pixbuf(GTK_IMAGE(image), scaled); g_object_unref(G_OBJECT(scaled)); nabi_log(3, "icon resize: %dx%d -> %dx%d\n", orig_width, orig_height, new_width, new_height); } static void nabi_state_icon_load(NabiStateIcon* state, int w, int h) { if (state == NULL) return; nabi_state_icon_load_scaled(state->none, none_pixbuf, w, h); nabi_state_icon_load_scaled(state->hangul, hangul_pixbuf, w, h); nabi_state_icon_load_scaled(state->english, english_pixbuf, w, h); } static void nabi_state_icon_update(NabiStateIcon* state, int flag) { if (state == NULL) return; gtk_notebook_set_current_page(GTK_NOTEBOOK(state->widget), flag); } static void nabi_state_icon_destroy(NabiStateIcon* state) { g_free(state); } static void on_tray_icon_embedded(GtkWidget *widget, gpointer data) { nabi_log(1, "tray icon is embedded\n"); if (!nabi->config->show_palette) { nabi_palette_hide(nabi_palette); } gtk_widget_set_sensitive(hide_palette_menuitem, TRUE); } #if HAVE_GTK_STATUS_ICON static void on_status_icon_embedded(GObject* gobject, GParamSpec* paramspec, gpointer data) { on_tray_icon_embedded(NULL, data); } #endif static void on_tray_icon_destroyed(GtkWidget *widget, gpointer data) { #if !HAVE_GTK_STATUS_ICON nabi_state_icon_destroy(nabi_tray->state); #endif g_free(nabi_tray); nabi_tray = NULL; nabi_log(1, "tray icon is destroyed\n"); if (nabi->config->use_tray_icon) nabi_palette->source_id = g_idle_add(nabi_tray_icon_create, NULL); nabi_palette_show(nabi_palette); gtk_widget_set_sensitive(hide_palette_menuitem, FALSE); } static void on_palette_destroyed(GtkWidget *widget, gpointer data) { gtk_main_quit(); if (nabi_tray != NULL) { nabi_tray_icon_destroy(nabi_tray); } remove_event_filter(); nabi_log(1, "palette destroyed\n"); } static void nabi_menu_position_func(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data) { GtkWidget *widget; GdkWindow *window; GdkScreen *screen; gint width, height, menu_width, menu_height; gint screen_width, screen_height; widget = GTK_WIDGET(data); window = GDK_WINDOW(widget->window); screen = gdk_drawable_get_screen(GDK_DRAWABLE(window)); screen_width = gdk_screen_get_width(screen); screen_height = gdk_screen_get_height(screen); gdk_window_get_origin(window, x, y); gdk_drawable_get_size(window, &width, &height); if (!GTK_WIDGET_REALIZED(menu)) gtk_widget_realize(GTK_WIDGET(menu)); gdk_drawable_get_size(GDK_WINDOW(GTK_WIDGET(menu)->window), &menu_width, &menu_height); if (*y + height < screen_height / 2) *y += widget->allocation.height; else *y -= menu_height; *x += widget->allocation.x; *y += widget->allocation.y; if (*x + menu_width > screen_width) *x = screen_width - menu_width; } #if HAVE_GTK_STATUS_ICON static void on_tray_icon_popup_menu(GtkStatusIcon *status_icon, guint button, guint activate_time, gpointer data) { static GtkWidget *menu = NULL; if (preference_dialog != NULL) { gtk_window_present(GTK_WINDOW(preference_dialog)); return; } if (menu != NULL) gtk_widget_destroy(menu); menu = create_tray_icon_menu(); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, gtk_status_icon_position_menu, status_icon, button, activate_time); } #else static gboolean on_tray_icon_button_press(GtkWidget *widget, GdkEventButton *event, gpointer data) { static GtkWidget *menu = NULL; if (event->type == GDK_BUTTON_PRESS) { if (preference_dialog != NULL) { gtk_window_present(GTK_WINDOW(preference_dialog)); return TRUE; } if (menu != NULL) gtk_widget_destroy(menu); menu = create_tray_icon_menu(); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, nabi_menu_position_func, widget, event->button, event->time); return TRUE; } return FALSE; } #endif #if !HAVE_GTK_STATUS_ICON static void on_tray_icon_size_allocate (GtkWidget *widget, GtkAllocation *allocation, gpointer data) { NabiTrayIcon* tray; GtkOrientation orientation; int size; tray = (NabiTrayIcon*)data; if (tray == NULL) return; orientation = egg_tray_icon_get_orientation (tray->widget); if (orientation == GTK_ORIENTATION_HORIZONTAL) size = allocation->height; else size = allocation->width; /* We set minimum icon size */ if (size <= 18) { size = 16; } else if (size <= 24) { size = 24; } if (size != nabi->icon_size) { nabi->icon_size = size; nabi_tray_load_icons(nabi_tray, size); } } #endif /* !HAVE_GTK_STATUS_ICON */ static void get_statistic_string(GString *str) { if (nabi_server == NULL) { g_string_assign(str, _("XIM Server is not running")); } else { int i; int sum; g_string_append_printf(str, "%s: %3d\n" "%s: %3d\n" "%s: %3d\n" "%s: %3d\n" "\n", _("Total"), nabi_server->statistics.total, _("Space"), nabi_server->statistics.space, _("BackSpace"), nabi_server->statistics.backspace, _("Shift"), nabi_server->statistics.shift); /* choseong */ g_string_append(str, _("Choseong")); g_string_append_c(str, '\n'); for (i = 0x00; i <= 0x12; i++) { char label[8] = { '\0', }; int len = g_unichar_to_utf8(0x1100 + i, label); label[len] = '\0'; g_string_append_printf(str, "%s: %-3d ", label, nabi_server->statistics.jamo[i]); if ((i + 1) % 10 == 0) g_string_append_c(str, '\n'); } g_string_append(str, "\n\n"); /* jungseong */ g_string_append(str, _("Jungseong")); g_string_append_c(str, '\n'); for (i = 0x61; i <= 0x75; i++) { char label[8] = { '\0', }; int len = g_unichar_to_utf8(0x1100 + i, label); label[len] = '\0'; g_string_append_printf(str, "%s: %-3d ", label, nabi_server->statistics.jamo[i]); if ((i - 0x60) % 10 == 0) g_string_append_c(str, '\n'); } g_string_append(str, "\n\n"); /* print only when a user have pressed any jonseong keys */ sum = 0; for (i = 0xa8; i <= 0xc2; i++) { sum += nabi_server->statistics.jamo[i]; } if (sum > 0) { /* jongseong */ g_string_append(str, _("Jongseong")); g_string_append_c(str, '\n'); for (i = 0xa8; i <= 0xc2; i++) { char label[8] = { '\0', }; int len = g_unichar_to_utf8(0x1100 + i, label); label[len] = '\0'; g_string_append_printf(str, "%s: %-3d ", label, nabi_server->statistics.jamo[i]); if ((i - 0xa7) % 10 == 0) g_string_append_c(str, '\n'); } g_string_append(str, "\n"); } } } static void on_about_statistics_clicked(GtkWidget *widget, gpointer parent) { GString *str; GtkWidget *hbox; GtkWidget *stat_label = NULL; GtkWidget *dialog = NULL; dialog = gtk_dialog_new_with_buttons(_("Nabi keypress statistics"), GTK_WINDOW(parent), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); hbox = gtk_hbox_new(FALSE, 10); gtk_container_set_border_width(GTK_CONTAINER(hbox), 6); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 0); str = g_string_new(NULL); get_statistic_string(str); stat_label = gtk_label_new(str->str); gtk_label_set_selectable(GTK_LABEL(stat_label), TRUE); gtk_box_pack_start(GTK_BOX(hbox), stat_label, TRUE, TRUE, 6); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); g_string_free(str, TRUE); } static const char* get_project_url() { if (gtk_major_version > 2 || (gtk_major_version == 2 && gtk_minor_version >= 18)) { return "" PACKAGE_BUGREPORT ""; } else { return PACKAGE_BUGREPORT; } } static void on_menu_about(GtkWidget *widget) { GtkWidget *dialog = NULL; GtkWidget *vbox; GtkWidget *comment; GtkWidget *server_info; GtkWidget *image; GtkWidget *label; GList *list; gchar *image_filename; gchar *comment_str; gchar buf[256]; const char *encoding = ""; const char *project_url; if (about_dialog != NULL) { gtk_window_present(GTK_WINDOW(about_dialog)); return; } dialog = gtk_dialog_new_with_buttons(_("About Nabi"), NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); about_dialog = dialog; vbox = GTK_DIALOG(dialog)->vbox; image_filename = g_build_filename(NABI_DATA_DIR, "nabi-about.png", NULL); image = gtk_image_new_from_file(image_filename); gtk_misc_set_padding(GTK_MISC(image), 0, 6); gtk_box_pack_start(GTK_BOX(vbox), image, FALSE, TRUE, 0); gtk_widget_show(image); g_free(image_filename); project_url = get_project_url(); comment = gtk_label_new(NULL); comment_str = g_strdup_printf( _("An Easy Hangul XIM\n" "version %s\n\n" "Copyright (C) 2003-2011 Choe Hwanjin\n" "%s"), VERSION, project_url); gtk_label_set_markup(GTK_LABEL(comment), comment_str); gtk_label_set_justify(GTK_LABEL(comment), GTK_JUSTIFY_CENTER); gtk_box_pack_start(GTK_BOX(vbox), comment, FALSE, TRUE, 0); gtk_widget_show(comment); g_free(comment_str); if (nabi_server != NULL) { GtkWidget *hbox; GtkWidget *button; server_info = gtk_table_new(4, 2, TRUE); label = gtk_label_new(""); gtk_label_set_markup(GTK_LABEL(label), _("XIM name: ")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(server_info), label, 0, 1, 0, 1); label = gtk_label_new(""); gtk_label_set_markup(GTK_LABEL(label), _("Locale: ")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(server_info), label, 0, 1, 1, 2); label = gtk_label_new(""); gtk_label_set_markup(GTK_LABEL(label), _("Encoding: ")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(server_info), label, 0, 1, 2, 3); label = gtk_label_new(""); gtk_label_set_markup(GTK_LABEL(label), _("Connected: ")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(server_info), label, 0, 1, 3, 4); label = gtk_label_new(nabi_server->name); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(server_info), label, 1, 2, 0, 1); label = gtk_label_new(setlocale(LC_CTYPE, NULL)); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(server_info), label, 1, 2, 1, 2); g_get_charset(&encoding); label = gtk_label_new(encoding); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(server_info), label, 1, 2, 2, 3); snprintf(buf, sizeof(buf), "%d", g_slist_length(nabi_server->connections)); label = gtk_label_new(buf); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(server_info), label, 1, 2, 3, 4); gtk_box_pack_start(GTK_BOX(vbox), server_info, FALSE, TRUE, 5); gtk_widget_show_all(server_info); hbox = gtk_hbox_new(TRUE, 10); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, TRUE, 0); gtk_widget_show(hbox); button = gtk_button_new_with_label(_("Keypress Statistics")); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); gtk_widget_show(button); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 5); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_about_statistics_clicked), dialog); } gtk_window_set_default_size(GTK_WINDOW(dialog), 300, 200); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); gtk_widget_show(dialog); list = gtk_container_get_children(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area)); if (list != NULL) { GList *child = g_list_last(list); if (child != NULL && child->data != NULL) gtk_widget_grab_focus(GTK_WIDGET(child->data)); g_list_free(list); } gtk_dialog_run(GTK_DIALOG(about_dialog)); gtk_widget_destroy(about_dialog); about_dialog = NULL; } static void on_menu_preference(GtkWidget *widget) { if (preference_dialog != NULL) { gtk_window_present(GTK_WINDOW(preference_dialog)); return; } preference_dialog = preference_window_create(); gtk_dialog_run(GTK_DIALOG(preference_dialog)); gtk_widget_destroy(preference_dialog); preference_dialog = NULL; } static void on_menu_show_palette(GtkWidget *widget, gpointer data) { gboolean state; state = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); nabi_app_show_palette(state); } static void on_menu_hanja_mode(GtkWidget *widget, gpointer data) { gboolean state; state = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); nabi_app_set_hanja_mode(state); nabi_palette_update_hanja_mode(nabi_palette, state); } static void on_menu_hide_palette(GtkWidget *widget, gpointer data) { // tray icon을 사용하지 않는 상태에서는 palette를 hide하면 모든 ui가 // 화면에서 사라져 nabi를 컨트롤할 수 없게 된다. // 그래서 tray icon을 사용하는 경우가 아니면 아래 함수가 작동하지 // 않도록 한다. // 또한 tray icon 사용 설정과 관계없이 tray에 embed 되지 않은 상황 // 이라면 palette가 hide되면 안된다. if (nabi->config->use_tray_icon && nabi_tray != NULL) { nabi_app_show_palette(FALSE); } } static void on_menu_keyboard(GtkWidget *widget, gpointer data) { const char* id = (const char*)data; nabi_app_set_hangul_keyboard(id); nabi_app_save_config(); } static void on_menu_quit(GtkWidget *widget) { nabi_app_quit(); } static GtkWidget* create_tray_icon_menu(void) { GtkWidget* menu; GtkWidget* menuitem; GSList *radio_group = NULL; menu = gtk_menu_new(); /* about menu */ menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_DIALOG_INFO, NULL); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_about), menuitem); /* separator */ menuitem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); /* preferences menu */ menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, NULL); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_preference), menuitem); /* palette menu */ menuitem = gtk_check_menu_item_new_with_mnemonic(_("_Show palette")); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), nabi->config->show_palette); g_signal_connect_swapped(G_OBJECT(menuitem), "toggled", G_CALLBACK(on_menu_show_palette), menuitem); /* hanja mode */ menuitem = gtk_check_menu_item_new_with_mnemonic(_("_Hanja Lock")); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), nabi->config->hanja_mode); g_signal_connect_swapped(G_OBJECT(menuitem), "toggled", G_CALLBACK(on_menu_hanja_mode), menuitem); /* separator */ menuitem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); /* keyboard list */ if (nabi_server != NULL) { int i = 0; const NabiHangulKeyboard* keyboards; keyboards = nabi_server_get_hangul_keyboard_list(nabi_server); while (keyboards[i].id != NULL) { const char* id = keyboards[i].id; const char* name = keyboards[i].name; menuitem = gtk_radio_menu_item_new_with_label(radio_group, _(name)); radio_group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem)); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_keyboard), (gpointer)id); if (strcmp(id, nabi->config->hangul_keyboard->str) == 0) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE); i++; } /* separator */ menuitem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); } /* menu quit */ menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_quit), menuitem); gtk_widget_show_all(menu); return menu; } #if !HAVE_GTK_STATUS_ICON static void nabi_tray_load_icons(NabiTrayIcon* tray, gint default_size) { int w, h; GtkOrientation orientation; orientation = egg_tray_icon_get_orientation(tray->widget); if (orientation == GTK_ORIENTATION_VERTICAL) { w = default_size; h = -1; } else { w = -1; h = default_size; } nabi_state_icon_load(tray->state, w, h); } #endif static void nabi_tray_update_state(NabiTrayIcon* tray, int state) { #if HAVE_GTK_STATUS_ICON if (tray != NULL) { switch (state) { case 1: gtk_status_icon_set_from_pixbuf(nabi_tray->icon, english_pixbuf); break; case 2: gtk_status_icon_set_from_pixbuf(nabi_tray->icon, hangul_pixbuf); break; default: gtk_status_icon_set_from_pixbuf(nabi_tray->icon, none_pixbuf); break; } } #else if (tray != NULL) nabi_state_icon_update(tray->state, state); #endif } static GdkFilterReturn root_window_event_filter (GdkXEvent *gxevent, GdkEvent *event, gpointer data) { XEvent *xevent; XPropertyEvent *pevent; xevent = (XEvent*)gxevent; switch (xevent->type) { case PropertyNotify: pevent = (XPropertyEvent*)xevent; if (pevent->atom == nabi->mode_info_xatom) { int state; guchar *buf; gboolean ret; ret = gdk_property_get (nabi->root_window, nabi->mode_info_atom, nabi->mode_info_type, 0, 32, 0, NULL, NULL, NULL, &buf); if (ret) { memcpy(&state, buf, sizeof(state)); nabi_tray_update_state(nabi_tray, state); nabi_palette_update_state(nabi_palette, state); g_free(buf); } else { nabi_log(4, "Fail on getting property: gdk_property_get\n"); } } break; default: break; } return GDK_FILTER_CONTINUE; } static void install_event_filter(GtkWidget *widget) { GdkScreen *screen; GdkEventMask mask; screen = gdk_drawable_get_screen(GDK_DRAWABLE(widget->window)); nabi->root_window = gdk_screen_get_root_window(screen); mask = gdk_window_get_events(nabi->root_window); gdk_window_set_events(nabi->root_window, mask | GDK_PROPERTY_CHANGE_MASK); gdk_window_add_filter(nabi->root_window, root_window_event_filter, NULL); } static void remove_event_filter() { gdk_window_remove_filter(nabi->root_window, root_window_event_filter, NULL); } static void on_palette_realized(GtkWidget *widget, gpointer data) { install_event_filter(widget); } static GdkPixbuf* load_icon(const char* theme, const char* name, const char** default_xpm, gboolean* error_on_load) { char* path; char* filename; GError *error = NULL; GdkPixbuf *pixbuf; filename = g_strconcat(name, ".svg", NULL); path = g_build_filename(NABI_THEMES_DIR, theme, filename, NULL); pixbuf = gdk_pixbuf_new_from_file(path, &error); if (pixbuf != NULL) goto done; g_free(filename); g_free(path); if (error != NULL) { g_error_free(error); error = NULL; } filename = g_strconcat(name, ".png", NULL); path = g_build_filename(NABI_THEMES_DIR, theme, filename, NULL); pixbuf = gdk_pixbuf_new_from_file(path, &error); if (pixbuf == NULL) { if (error != NULL) { nabi_log(1, "Error on reading image file: %s\n", error->message); g_error_free(error); error = NULL; } pixbuf = gdk_pixbuf_new_from_xpm_data(default_xpm); *error_on_load = TRUE; } done: g_free(filename); g_free(path); if (error != NULL) g_error_free(error); return pixbuf; } static void nabi_app_load_base_icons() { gboolean error = FALSE; const char* theme = nabi->config->theme->str; if (none_pixbuf != NULL) g_object_unref(G_OBJECT(none_pixbuf)); none_pixbuf = load_icon(theme, "none", none_default_xpm, &error); if (english_pixbuf != NULL) g_object_unref(G_OBJECT(english_pixbuf)); english_pixbuf = load_icon(theme, "english", english_default_xpm, &error); if (hangul_pixbuf != NULL) g_object_unref(G_OBJECT(hangul_pixbuf)); hangul_pixbuf = load_icon(theme, "hangul", hangul_default_xpm, &error); if (error) { GtkWidget *message; message = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, _("" "Can't load tray icons\n\n" "There are some errors on loading tray icons.\n" "Nabi will use default builtin icons and the theme will be changed to default value.\n" "Please change the theme settings.")); gtk_label_set_use_markup(GTK_LABEL(GTK_MESSAGE_DIALOG(message)->label), TRUE); gtk_window_set_title(GTK_WINDOW(message), _("Nabi: error message")); gtk_widget_show(message); gtk_dialog_run(GTK_DIALOG(message)); gtk_widget_destroy(message); g_string_assign(nabi->config->theme, DEFAULT_THEME); } } static gboolean nabi_tray_icon_create(gpointer data) { #if HAVE_GTK_STATUS_ICON NabiTrayIcon* tray; if (nabi_tray != NULL) return FALSE; tray = g_new(NabiTrayIcon, 1); nabi_tray = tray; tray->icon = gtk_status_icon_new(); g_signal_connect(G_OBJECT(tray->icon), "popup-menu", G_CALLBACK(on_tray_icon_popup_menu), NULL); gtk_status_icon_set_from_pixbuf(tray->icon, none_pixbuf); nabi_tray_icon_update_tooltips(); g_signal_connect(G_OBJECT(tray->icon), "notify::embedded", G_CALLBACK(on_status_icon_embedded), tray); #else NabiTrayIcon* tray; GtkWidget *eventbox; GtkTooltips *tooltips; GtkOrientation orientation; int w, h; if (nabi_tray != NULL) return FALSE; tray = g_new(NabiTrayIcon, 1); tray->widget = NULL; tray->state = NULL; nabi_tray = tray; tray->widget = egg_tray_icon_new("Tray icon"); eventbox = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(tray->widget), eventbox); g_signal_connect(G_OBJECT(eventbox), "button-press-event", G_CALLBACK(on_tray_icon_button_press), NULL); gtk_widget_show(eventbox); nabi->tray_icon = eventbox; tooltips = gtk_tooltips_new(); tray->tooltips = tooltips; nabi_tray_icon_update_tooltips(); orientation = egg_tray_icon_get_orientation(tray->widget); if (orientation == GTK_ORIENTATION_VERTICAL) { w = nabi->icon_size; h = -1; } else { w = -1; h = nabi->icon_size; } tray->state = nabi_state_icon_new(w, h); gtk_container_add(GTK_CONTAINER(eventbox), tray->state->widget); gtk_widget_show(tray->state->widget); g_signal_connect(G_OBJECT(tray->widget), "size-allocate", G_CALLBACK(on_tray_icon_size_allocate), tray); g_signal_connect(G_OBJECT(tray->widget), "embedded", G_CALLBACK(on_tray_icon_embedded), tray); g_signal_connect(G_OBJECT(tray->widget), "destroy", G_CALLBACK(on_tray_icon_destroyed), tray); gtk_widget_show(GTK_WIDGET(tray->widget)); #endif // HAVE_GTK_STATUS_ICON return FALSE; } static void nabi_tray_icon_destroy(NabiTrayIcon* tray) { #if HAVE_GTK_STATUS_ICON if (tray->icon != NULL) { g_object_unref(tray->icon); on_tray_icon_destroyed(NULL, NULL); } #else // widget만 destroy하면 destroy signal에서 나머지 delete 처리를 한다. if (tray->widget != NULL) gtk_widget_destroy(GTK_WIDGET(tray->widget)); #endif } static void on_palette_item_pressed(GtkWidget* widget, gpointer data) { gtk_menu_popup(GTK_MENU(data), NULL, NULL, nabi_menu_position_func, widget, 0, gtk_get_current_event_time()); } static void on_palette_hanja_mode_toggled(GtkToggleButton* button, gpointer data) { gboolean state; state = gtk_toggle_button_get_active(button); nabi_app_set_hanja_mode(state); } GtkWidget* nabi_app_create_palette(void) { GtkWidget* handlebox; GtkWidget* hbox; GtkWidget* eventbox; GtkWidget* menu; GtkWidget* menuitem; GtkWidget* image; GtkWidget* button; const char* current_keyboard_name = NULL; nabi_palette = g_new(NabiPalette, 1); nabi_palette->widget = NULL; nabi_palette->state = NULL; nabi_palette->hanja_mode_button = NULL; nabi_palette->source_id = 0; handlebox = nabi_handle_box_new(); nabi_palette->widget = handlebox; gtk_window_move(GTK_WINDOW(handlebox), nabi->config->x, nabi->config->y); gtk_window_set_keep_above(GTK_WINDOW(handlebox), TRUE); gtk_window_stick(GTK_WINDOW(handlebox)); gtk_window_set_accept_focus(GTK_WINDOW(handlebox), FALSE); g_signal_connect_after(G_OBJECT(handlebox), "realize", G_CALLBACK(on_palette_realized), NULL); g_signal_connect(G_OBJECT(handlebox), "destroy", G_CALLBACK(on_palette_destroyed), NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(handlebox), hbox); gtk_widget_show(hbox); eventbox = gtk_event_box_new(); gtk_box_pack_start(GTK_BOX(hbox), eventbox, FALSE, FALSE, 0); gtk_widget_show(eventbox); nabi_palette->state = nabi_state_icon_new(-1, nabi->config->palette_height); gtk_container_add(GTK_CONTAINER(eventbox), nabi_palette->state->widget); gtk_widget_show(nabi_palette->state->widget); current_keyboard_name = nabi_server_get_keyboard_name_by_id(nabi_server, nabi->config->hangul_keyboard->str); if (current_keyboard_name != NULL) { const NabiHangulKeyboard* keyboards; button = gtk_button_new_with_label(_(current_keyboard_name)); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); gtk_button_set_focus_on_click(GTK_BUTTON(button), FALSE); GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); gtk_widget_show(button); nabi->keyboard_button = button; keyboards = nabi_server_get_hangul_keyboard_list(nabi_server); if (keyboards != NULL) { int i; menu = gtk_menu_new(); for (i = 0; keyboards[i].id != NULL; i++) { menuitem = gtk_menu_item_new_with_label(_(keyboards[i].name)); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); gtk_widget_show(menuitem); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_keyboard), (gpointer)keyboards[i].id); } g_signal_connect(G_OBJECT(button), "pressed", G_CALLBACK(on_palette_item_pressed), menu); } } button = gtk_toggle_button_new_with_label(_("Hanja Lock")); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), nabi->config->hanja_mode); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_palette_hanja_mode_toggled), NULL); gtk_widget_show(button); nabi_palette->hanja_mode_button = GTK_TOGGLE_BUTTON(button); image = gtk_image_new_from_stock(GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU); button = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); gtk_button_set_focus_on_click(GTK_BUTTON(button), FALSE); GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS); gtk_button_set_image(GTK_BUTTON(button), image); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); gtk_widget_show(button); menu = gtk_menu_new(); menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_DIALOG_INFO, NULL); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_about), menuitem); menuitem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, NULL); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_preference), menuitem); menuitem = gtk_menu_item_new_with_mnemonic(_("_Hide palette")); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_hide_palette), menuitem); // tray에 embed되기 전까지는 무조건 hide 메뉴는 비활성화 해야 // 실수로라도 palette가 사라지는 것을 막을 수 있다. gtk_widget_set_sensitive(menuitem, FALSE); hide_palette_menuitem = menuitem; menuitem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_quit), menuitem); gtk_widget_show_all(menu); g_signal_connect(G_OBJECT(button), "pressed", G_CALLBACK(on_palette_item_pressed), menu); if (nabi->config->use_tray_icon) g_idle_add(nabi_tray_icon_create, NULL); return handlebox; } static void nabi_palette_show(NabiPalette* palette) { if (palette != NULL && palette->widget != NULL && !GTK_WIDGET_VISIBLE(palette->widget)) { gtk_window_move(GTK_WINDOW(palette->widget), nabi->config->x, nabi->config->y); gtk_widget_show(GTK_WIDGET(palette->widget)); } } static void nabi_palette_hide(NabiPalette* palette) { if (palette != NULL && GTK_WIDGET_VISIBLE(palette->widget)) { gtk_window_get_position(GTK_WINDOW(palette->widget), &nabi->config->x, &nabi->config->y); gtk_widget_hide(GTK_WIDGET(palette->widget)); } } static void nabi_palette_update_state(NabiPalette* palette, int state) { if (palette != NULL) nabi_state_icon_update(palette->state, state); } static void nabi_palette_update_hanja_mode(NabiPalette* palette, gboolean state) { if (palette != NULL) gtk_toggle_button_set_active(palette->hanja_mode_button, state); } static void nabi_palette_destroy(NabiPalette* palette) { if (palette != NULL) { GtkWidget* widget = palette->widget; /* palette의 widget을 destroy할때 "on_destroy" 시그널에 * tray icon을 정리하면서 palette widget을 다시 show()하는 * 경우가 발생할 수 있다. 이런 문제를 피하기 위해서 * 여기서 palette->widget을 먼저 NULL로 세팅하고 destroy()를 * 호출하도록 한다. */ palette->widget = NULL; gtk_window_get_position(GTK_WINDOW(widget), &nabi->config->x, &nabi->config->y); gtk_widget_destroy(widget); nabi_state_icon_destroy(palette->state); if (palette->source_id > 0) g_source_remove(palette->source_id); g_free(palette); } } void nabi_app_set_theme(const gchar *name) { g_string_assign(nabi->config->theme, name); nabi_app_load_base_icons(); #if HAVE_GTK_STATUS_ICON // 아이콘을 바꾸려면 현재 state를 알아야 한다. // 그런데 state를 알아오려면 애매하고, 사실 테마가 바뀌는 순간에는 // text entry에 focus가 없을 것이므로 기본 상태 값으로 줘도 // 별 문제가 없을 것이다. if (nabi_tray != NULL) nabi_tray_update_state(nabi_tray, 0); #else if (nabi_tray != NULL) nabi_tray_load_icons(nabi_tray, nabi->icon_size); #endif } void nabi_app_use_tray_icon(gboolean use) { nabi->config->use_tray_icon = use; // tray icon이 없는 상태에서 hide palette 메뉴를 작동시키면 tray icon도 // 없고 palette도 없게 되므로 nabi를 컨트롤 할수 없게 된다. 따라서 // tray icon이 있는 상태에서만 hide palette 메뉴를 사용할수 있게 한다. gtk_widget_set_sensitive(hide_palette_menuitem, use); if (use) { if (nabi_tray == NULL) { nabi_tray_icon_create(NULL); } } else { if (nabi_tray != NULL) { nabi_tray_icon_destroy(nabi_tray); } } } void nabi_app_show_palette(gboolean state) { nabi->config->show_palette = state; if (state) nabi_palette_show(nabi_palette); else nabi_palette_hide(nabi_palette); } void nabi_app_set_hanja_mode(gboolean state) { nabi->config->hanja_mode = state; nabi_server_set_hanja_mode(nabi_server, state); } void nabi_app_set_hangul_keyboard(const char *id) { if (id == NULL) g_string_assign(nabi->config->hangul_keyboard, DEFAULT_KEYBOARD); else g_string_assign(nabi->config->hangul_keyboard, id); nabi_server_set_hangul_keyboard(nabi_server, id); // palette의 메뉴 버튼 업데이트 if (nabi->keyboard_button != NULL) { const char* name; name = nabi_server_get_current_keyboard_name(nabi_server); gtk_button_set_label(GTK_BUTTON(nabi->keyboard_button), _(name)); } nabi_tray_icon_update_tooltips(); } void nabi_app_save_config() { if (nabi != NULL && nabi->config != NULL) nabi_config_save(nabi->config); } static void nabi_tray_icon_update_tooltips() { #if HAVE_GTK_STATUS_ICON if (nabi_tray != NULL && nabi_tray->icon != NULL) { const char* keyboard_name; char tip_text[256]; keyboard_name = nabi_server_get_keyboard_name_by_id(nabi_server, nabi->config->hangul_keyboard->str); snprintf(tip_text, sizeof(tip_text), _("Nabi: %s"), _(keyboard_name)); gtk_status_icon_set_tooltip_text(nabi_tray->icon, tip_text); } #else /* HAVE_GTK_STATUS_ICON */ if (nabi_tray != NULL && nabi_tray->tooltips != NULL) { const char* keyboard_name; char tip_text[256]; keyboard_name = nabi_server_get_keyboard_name_by_id(nabi_server, nabi->config->hangul_keyboard->str); snprintf(tip_text, sizeof(tip_text), _("Nabi: %s"), _(keyboard_name)); gtk_tooltips_set_tip(GTK_TOOLTIPS(nabi_tray->tooltips), nabi->tray_icon, tip_text, _("Hangul input method: Nabi" " - You can input hangul using this program")); } #endif /* HAVE_GTK_STATUS_ICON */ } /* vim: set ts=8 sts=4 sw=4 : */ nabi-nabi-1.0.1/src/ustring.c000066400000000000000000000041201430012456200157510ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2008 Choe Hwanjin * * 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 */ #include "ustring.h" UString* ustring_new() { return g_array_new(TRUE, TRUE, sizeof(ucschar)); } void ustring_delete(UString* str) { g_array_free(str, TRUE); } void ustring_clear(UString* str) { if (str->len > 0) g_array_remove_range(str, 0, str->len); } UString* ustring_erase(UString* str, guint pos, guint len) { return g_array_remove_range(str, pos, len); } ucschar* ustring_begin(UString* str) { return (ucschar*)str->data; } ucschar* ustring_end(UString* str) { return &g_array_index(str, ucschar, str->len); } guint ustring_length(const UString* str) { return str->len; } UString* ustring_append(UString* str, const UString* s) { return g_array_append_vals(str, s->data, s->len); } UString* ustring_append_ucs4(UString* str, const ucschar* s, gint len) { if (len < 0) { const ucschar*p = s; while (*p != 0) p++; len = p - s; } return g_array_append_vals(str, s, len); } UString* ustring_append_utf8(UString* str, const char* utf8) { while (*utf8 != '\0') { ucschar c = g_utf8_get_char(utf8); g_array_append_vals(str, &c, 1); utf8 = g_utf8_next_char(utf8); } return str; } gchar* ustring_to_utf8(const UString* str, guint len) { if (len < 0) len = str->len; return g_ucs4_to_utf8((const gunichar*)str->data, len, NULL, NULL, NULL); } nabi-nabi-1.0.1/src/ustring.h000066400000000000000000000026741430012456200157720ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2008 Choe Hwanjin * * 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 */ #ifndef nabi_ustring_h #define nabi_ustring_h #include #include typedef GArray UString; UString* ustring_new(); void ustring_delete(UString* str); void ustring_clear(UString* str); UString* ustring_erase(UString* str, guint pos, guint len); ucschar* ustring_begin(UString* str); ucschar* ustring_end(UString* str); guint ustring_length(const UString* str); UString* ustring_append(UString* str, const UString* s); UString* ustring_append_ucs4(UString* str, const ucschar* s, gint len); UString* ustring_append_utf8(UString* str, const char* utf8); gchar* ustring_to_utf8(const UString* str, guint len); #endif // nabi_ustring_h nabi-nabi-1.0.1/src/util.c000066400000000000000000000034431430012456200152420ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2007-2008 Choe Hwanjin * * 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 */ #include #include #include "debug.h" typedef struct _NabiUnicharPair NabiUnicharPair; struct _NabiUnicharPair { gunichar first; gunichar second; }; #include static int pair_compare(const void* x, const void* y) { const NabiUnicharPair* a = x; const NabiUnicharPair* b = y; return a->first - b->first; } char* nabi_traditional_to_simplified(const char* str) { GString* ret; if (str == NULL) return NULL; ret = g_string_new(NULL); while (*str != '\0') { gunichar c = g_utf8_get_char(str); NabiUnicharPair key = { c, 0 }; NabiUnicharPair* res; res = bsearch(&key, nabi_tc_to_sc_table, G_N_ELEMENTS(nabi_tc_to_sc_table), sizeof(NabiUnicharPair), pair_compare); if (res == NULL) { g_string_append_unichar(ret, c); } else { nabi_log(3, "tc -> sc: %x -> %x\n", res->first, res->second); g_string_append_unichar(ret, res->second); } str = g_utf8_next_char(str); } return g_string_free(ret, FALSE); } nabi-nabi-1.0.1/src/util.h000066400000000000000000000016331430012456200152460ustar00rootroot00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2007-2008 Choe Hwanjin * * 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 */ #ifndef nabi_util_h #define nabi_util_h char* nabi_traditional_to_simplified(const char* str); #endif // nabi_util_h nabi-nabi-1.0.1/src/xim_protocol.h000066400000000000000000000105721430012456200170110ustar00rootroot00000000000000static const char* xim_protocol_name[] = { "XIM_UNKNOWN", /* 0 */ "XIM_CONNECT", /* 1 */ "XIM_CONNECT_REPLY", /* 2 */ "XIM_DISCONNECT", /* 3 */ "XIM_DISCONNECT_REPLY", /* 4 */ "XIM_UNKNOWN", /* 5 */ "XIM_UNKNOWN", /* 6 */ "XIM_UNKNOWN", /* 7 */ "XIM_UNKNOWN", /* 8 */ "XIM_UNKNOWN", /* 9 */ "XIM_AUTH_REQUIRED", /* 10 */ "XIM_AUTH_REPLY", /* 11 */ "XIM_AUTH_NEXT", /* 12 */ "XIM_AUTH_SETUP", /* 13 */ "XIM_AUTH_NG", /* 14 */ "XIM_UNKNOWN", /* 15 */ "XIM_UNKNOWN", /* 16 */ "XIM_UNKNOWN", /* 17 */ "XIM_UNKNOWN", /* 18 */ "XIM_UNKNOWN", /* 19 */ "XIM_ERROR", /* 20 */ "XIM_UNKNOWN", /* 21 */ "XIM_UNKNOWN", /* 22 */ "XIM_UNKNOWN", /* 23 */ "XIM_UNKNOWN", /* 24 */ "XIM_UNKNOWN", /* 25 */ "XIM_UNKNOWN", /* 26 */ "XIM_UNKNOWN", /* 27 */ "XIM_UNKNOWN", /* 28 */ "XIM_UNKNOWN", /* 29 */ "XIM_OPEN", /* 30 */ "XIM_OPEN_REPLY", /* 31 */ "XIM_CLOSE", /* 32 */ "XIM_CLOSE_REPLY", /* 33 */ "XIM_REGISTER_TRIGGERKEYS", /* 34 */ "XIM_TRIGGER_NOTIFY", /* 35 */ "XIM_TRIGGER_NOTIFY_REPLY", /* 36 */ "XIM_SET_EVENT_MASK", /* 37 */ "XIM_ENCODING_NEGOTIATION", /* 38 */ "XIM_ENCODING_NEGOTIATION_REPLY", /* 39 */ "XIM_QUERY_EXTENSION", /* 40 */ "XIM_QUERY_EXTENSION_REPLY", /* 41 */ "XIM_SET_IM_VALUES", /* 42 */ "XIM_SET_IM_VALUES_REPLY", /* 43 */ "XIM_GET_IM_VALUES", /* 44 */ "XIM_GET_IM_VALUES_REPLY", /* 45 */ "XIM_UNKNOWN", /* 46 */ "XIM_UNKNOWN", /* 47 */ "XIM_UNKNOWN", /* 48 */ "XIM_UNKNOWN", /* 49 */ "XIM_CREATE_IC", /* 50 */ "XIM_CREATE_IC_REPLY", /* 51 */ "XIM_DESTROY_IC", /* 52 */ "XIM_DESTROY_IC_REPLY", /* 53 */ "XIM_SET_IC_VALUES", /* 54 */ "XIM_SET_IC_VALUES_REPLY", /* 55 */ "XIM_GET_IC_VALUES", /* 56 */ "XIM_GET_IC_VALUES_REPLY", /* 57 */ "XIM_SET_IC_FOCUS", /* 58 */ "XIM_UNSET_IC_FOCUS", /* 59 */ "XIM_FORWARD_EVENT", /* 60 */ "XIM_SYNC", /* 61 */ "XIM_SYNC_REPLY", /* 62 */ "XIM_COMMIT", /* 63 */ "XIM_RESET_IC", /* 64 */ "XIM_RESET_IC_REPLY", /* 65 */ "XIM_UNKNOWN", /* 66 */ "XIM_UNKNOWN", /* 67 */ "XIM_UNKNOWN", /* 68 */ "XIM_UNKNOWN", /* 69 */ "XIM_GEOMETRY", /* 70 */ "XIM_STR_CONVERSION", /* 71 */ "XIM_STR_CONVERSION_REPLY", /* 72 */ "XIM_PREEDIT_START", /* 73 */ "XIM_PREEDIT_START_REPLY", /* 74 */ "XIM_PREEDIT_DRAW", /* 75 */ "XIM_PREEDIT_CARET", /* 76 */ "XIM_PREEDIT_CARET_REPLY", /* 77 */ "XIM_PREEDIT_DONE", /* 78 */ "XIM_STATUS_START", /* 79 */ "XIM_STATUS_DRAW", /* 80 */ "XIM_STATUS_DONE", /* 81 */ }; nabi-nabi-1.0.1/tables/000077500000000000000000000000001430012456200146005ustar00rootroot00000000000000nabi-nabi-1.0.1/tables/.cvsignore000066400000000000000000000000251430012456200165750ustar00rootroot00000000000000Makefile Makefile.in nabi-nabi-1.0.1/tables/Makefile.am000066400000000000000000000002631430012456200166350ustar00rootroot00000000000000 keyboarddir = @NABI_DATA_DIR@ keyboard_DATA = keyboard_layouts symboltabledir = @NABI_DATA_DIR@ symboltable_DATA = symbol.txt EXTRA_DIST = $(keyboard_DATA) $(symboltable_DATA) nabi-nabi-1.0.1/tables/candidate/000077500000000000000000000000001430012456200165145ustar00rootroot00000000000000nabi-nabi-1.0.1/tables/candidate/CREDITS000066400000000000000000000006731430012456200175420ustar00rootroot00000000000000Chloe Lewis Choe Hwanjin Jeon Byeong Sik Kibum Han Kim Seok-Jin Like Macgyver Young-Ho Cha Yun-young Lee kheled myunggoni 김 정수 김민우 김선달 nabi-nabi-1.0.1/tables/candidate/ChangeLog000066400000000000000000000012531430012456200202670ustar00rootroot000000000000002004-08-18 Choe Hwanjin * hanja-to-c.py 스크립트 추가 2004-05-26 Chloe Lewis * hanja-sanity.pl: 기본 동작으로 두음법칙을 고려하여 출력하고, 옵션으로 -v 를 사용하면 모든 잘못되었음직한 항목을 보이도록 수정 2004-05-21 Chloe Lewis * nabi-hanja.txt: Unihan-4.0.1.txt 로 이전 2004-05-16 Choe Hwanjin * nabi-symbol.txt, nabi.txt: http://micsland.com/phps/key.php 여기에 있는 표대로 심벌 문자 배치를 변경 2004-05-07 Choe Hwanjin * start ChangeLog for hanja dictionary file * add hanja-merge.py, hanja-gettext.py script nabi-nabi-1.0.1/tables/candidate/README000066400000000000000000000011541430012456200173750ustar00rootroot00000000000000한자 정보 파일 hanjatable.py는 python 스크립트로 Unihan.txt 파일을 읽어서 한국어음을 가지고 있는 한자를 골라서 나비, 새나루 같은 한글 입력기에서 사용 가능한 포맷의 파일을 생성한다. 사용법: $ hanjatable.py Unihan.txt > nabi-hanja.txt 에러나 다른 정보는 stderr로 출력되므로 확인할 수 있다. 출력되는 파일 형식은 [글자] 한자=설명 이다. 여기서 출력된 한자 데이터 파일과 심벌 데이터 파일을 아래와 같이 합쳐 데이터 파일을 만든다. $ cat nabi-symbol.txt nabi-hanja.txt > nabi.txt nabi-nabi-1.0.1/tables/candidate/hanja-gettext.py000077500000000000000000000110131430012456200216300ustar00rootroot00000000000000#!/usr/bin/env python # import sys, string char_type = 'static const gunichar' copyright = '' def print_help(): sys.stderr.write("Usage: hanja-gettext.py [Unihan database file]\n") sys.exit(1); def unicodetohexnum(str): return string.atoi(str[2:], 16) def jamotosyllable(cho, jung, jong): syllable_base = 0xAC00 choseong_base = 0x1100 jungseong_base = 0x1161 jongseong_base = 0x11A7 njungseong = 21 njongseong = 28 if cho < 0x1100 and cho > 0x1112: return 0 if jung < 0x1161 and jung > 0x1175: return 0 if jong < 0x11A8 and jong > 0x11C2: return 0 cho -= choseong_base jung -= jungseong_base jong -= jongseong_base ch = ((cho * njungseong) + jung) * njongseong + jong + syllable_base if ch >= 0xAC00 and ch <= 0xD7AF: return ch else: return 0 def phonetocode(phone, error_msg): # refer to the Yale romanization system # (http://www.btranslations.com/resources/romanization/korean.asp) choseong_table = { 'K': 0x1100, 'KK': 0x1101, 'N': 0x1102, 'T': 0x1103, 'TT': 0x1104, 'L': 0x1105, 'M': 0x1106, 'P': 0x1107, 'B': 0x1107, 'PP': 0x1108, 'S': 0x1109, 'SS': 0x110A, #'': 0x110B, 'C': 0x110C, 'CC': 0x110D, 'CH': 0x110E, 'KH': 0x110F, 'TH': 0x1110, 'PH': 0x1111, 'H': 0x1112 } jungseong_table = { 'A': 0x1161, 'AY': 0x1162, 'YA': 0x1163, 'YAY': 0x1164, 'E': 0x1165, 'EY': 0x1166, 'YE': 0x1167, 'YEY': 0x1168, 'O': 0x1169, 'WA': 0x116A, 'OAY': 0x116B, 'WAY': 0x116B, 'OY': 0x116C, 'WOY': 0x116C, 'YO': 0x116D, 'WU': 0x116E, 'WE': 0x116F, 'WEY': 0x1170, 'WI': 0x1171, 'YU': 0x1172, 'U': 0x1173, 'UI': 0x1174, 'UY': 0x1174, 'I': 0x1175 } jongseong_table = { 'K': 0x11A8, 'KK': 0x11A9, 'KS': 0x11AA, 'N': 0x11AB, 'NC': 0x11AC, 'NH': 0x11AD, 'T': 0x11AE, 'L': 0x11AF, 'LK': 0x11B0, 'LM': 0x11B1, 'LP': 0x11B2, 'LS': 0x11B3, 'LTH': 0x11B4, 'LPH': 0x11B5, 'LH': 0x11B6, 'M': 0x11B7, 'P': 0x11B8, 'PS': 0x11B9, 'S': 0x11BA, 'SS': 0x11BB, 'NG': 0x11BC, 'C': 0x11BD, 'CH': 0x11BE, 'KH': 0x11BF, 'TH': 0x11C0, 'PH': 0x11C1, 'H': 0x11C2 } orig_phone = phone if choseong_table.has_key(phone[:2]): choseong = choseong_table[phone[:2]] phone = phone[2:] elif choseong_table.has_key(phone[:1]): choseong = choseong_table[phone[:1]] phone = phone[1:] else: choseong = 0x110B if jungseong_table.has_key(phone[:3]): jungseong = jungseong_table[phone[:3]] phone = phone[3:] elif jungseong_table.has_key(phone[:2]): jungseong = jungseong_table[phone[:2]] phone = phone[2:] elif jungseong_table.has_key(phone[:1]): jungseong = jungseong_table[phone[:1]] phone = phone[1:] else: sys.stderr.write(error_msg + ':%s: phonetic data error\n' % orig_phone) return 0 if jongseong_table.has_key(phone[:3]): jongseong = jongseong_table[phone[:3]] phone = phone[3:] elif jongseong_table.has_key(phone[:2]): jongseong = jongseong_table[phone[:2]] phone = phone[2:] elif jongseong_table.has_key(phone[:1]): jongseong = jongseong_table[phone[:1]] phone = phone[1:] elif len(phone) == 0: jongseong = 0x11A7 else: sys.stderr.write(error_msg + ':%s: phonetic data error\n' % orig_phone) return 0 # print "%x + %x + %x" % ( choseong, jungseong, jongseong ) hangulcode = jamotosyllable(choseong, jungseong, jongseong) return hangulcode; # start main procedure data_file_name = "Unihan.txt" if len(sys.argv) == 2: data_file_name = sys.argv[1] try: data_file = open(data_file_name, 'r') except: sys.stderr.write("Cant open file: %s\n" % data_file_name) print_help() sys.exit(1) table = { } lineno = 0 for line in data_file.readlines(): lineno = lineno + 1 # check for comment, jump over comments if line[0] == '#': continue # check for korean phonetic data if string.find(line, "kKorean") < 0: continue tokens = string.split(line) hanjacode = unicodetohexnum(tokens[0]) for hangulphone in tokens[2:]: hangulcode = phonetocode(hangulphone, "%s: U+%X " % (data_file_name, hanjacode)) if hangulcode == 0: continue if table.has_key(hangulcode): table[hangulcode].append(hanjacode) else: table[hangulcode] = [ hanjacode ] data_file.close() list = table.keys() list.sort() sys.stderr.write("\n") char_num = 0 table_len = 0 for key in list: print '[' + unichr(key).encode('utf-8') + ']' i = 0 table[key].sort() for hanja in table[key]: print unichr(hanja).encode('utf-8') + '=' char_num = char_num + 1 table_len = len(table[key]) sys.stderr.write("%s: %d\n" % (unichr(key).encode('utf-8'), table_len)) sys.stderr.write("Total %d chars are written\n" % char_num) nabi-nabi-1.0.1/tables/candidate/hanja-merge.py000077500000000000000000000034111430012456200212460ustar00rootroot00000000000000#!/usr/bin/env python # # A tool for merging commented hanja dictionary file with new hanja template # file import sys, string if len(sys.argv) == 3: old_file_name = sys.argv[1] new_file_name = sys.argv[2] else: print 'Usage: hanja-merge [commented file] [new template]' sys.exit(1) try: old_file = open(old_file_name, 'r') except: sys.stderr.write("Cant open file: %s\n" % old_file_name) sys.exit(1) try: new_file = open(new_file_name, 'r') except: sys.stderr.write("Cant open file: %s\n" % new_file_name) sys.exit(1) old_table = { } new_table = { } category = '' for line in old_file.readlines(): line = line.strip() if len(line) == 0: continue if line[0] == '[': category = line[1:].split(']')[0] old_table[category] = {} else: if category == '': continue list = line.strip().split('=') key = list[0] value = list[1] old_table[category][key] = value category = '' for line in new_file.readlines(): line = line.strip() if len(line) == 0: continue if line[0] == '[': category = line[1:].split(']')[0] new_table[category] = {} else: if category == '': continue key = line.strip().split('=')[0] if old_table.has_key(category) and old_table[category].has_key(key): value = old_table[category].pop(key) else: value = '' new_table[category][key] = value list = new_table.keys() list.sort() # print merged result for category in list: print '[' + category + ']' keys = new_table[category].keys() keys.sort() for key in keys: print key + '=' + new_table[category][key] # print rest for category in old_table.keys(): if len(old_table[category]) == 0: continue sys.stderr.write('[' + category + ']\n') keys = old_table[category].keys() for key in keys: sys.stderr.write(key + '=' + old_table[category][key] + '\n') nabi-nabi-1.0.1/tables/candidate/hanja-sanity.pl000066400000000000000000000054351430012456200214460ustar00rootroot00000000000000#!/usr/bin/perl -w # # Usage : ./hanja-sanity.pl [-v] [nabi-hanja.txt] # checks the sanity of nabi-hanja.txt and shows entries presumably wrong-commented. require 5.8.0; use strict; use Carp; use Getopt::Std; use Fcntl qw/:flock/; use encoding qw/utf8/; # options our $opt_v; getopts('v'); my $file = shift || "nabi-hanja.txt"; # open file open IN, "<:utf8",$file or croak "cannot open `$file'"; flock IN, LOCK_SH or croak "cannot shlock `$file'"; # loop my ($p,$flag) = (undef,0); foreach () { # check if new pronunciation found if (m/^\[(.)\]$/) { ($p,$flag) = ($1,0); next; } # check sanity next if m/^.=(?:[^,]+ $p, )*[^,]+ $p$/; # ordinary case next if m/^.=.\x{c758} (?:\x{7c21}\x{9ad4}|\x{53e4}|\x{7565}|\x{672c}|\x{4fd7}|\x{8a1b}|\x{8b4c}|\x{6b63}|\x{7c21}(?:\x{9ad4}|\x{4f53}))\x{5b57}$/; # misc next if m/^.=.\x{acfc} \x{540c}\x{5b57}$/ && (((ord $p)-hex"ac00")%28); # has jongseong next if m/^.=.\x{c640} \x{540c}\x{5b57}$/ && !(((ord $p)-hex"ac00")%28); # has no jongseong next if m/^(.)=$/ && (((ord $1)&0xf000)!=hex"f000"); # has no meaning and not a char for compatibility next if m/^$/; # possible blank lines # check an avoidance of liquid at the head phoneme unless verbose unless ($opt_v || (my @p=&_alternate_pronunciations($p))<2) { my $ap = "(?:".+(join"|",@p).")"; next if m/^.=(?:[^,]+ $ap, )*[^,]+ $ap$/; } # print print "[$p]\n" unless $flag++; print "U+".+(uc unpack "H4", pack "n", ord $1)." $_" if m/^(.)/; } # close file flock IN, LOCK_UN; close IN; # returns all possible pronunciations sub _alternate_pronunciations { my $p = shift; my %t = ( "\x{b140}" => "\x{c5ec}", # NEYO => YEO : Nasal#{{{ "\x{b1e8}" => "\x{c694}", # NYO => YO "\x{b274}" => "\x{c720}", # NYU => YU "\x{b2c8}" => "\x{c774}", # NI => I "\x{b7b4}" => "\x{c57c}", # RYA => YA : Liquid "\x{b824}" => "\x{c5ec}", # RYEO => YEO "\x{b840}" => "\x{c608}", # RYE => YE "\x{b8cc}" => "\x{c694}", # RYO => YO "\x{b958}" => "\x{c720}", # RYU => YU "\x{b9ac}" => "\x{c774}", # RI => I "\x{b82c}" => "\x{c5f4}", # RYEOL => YEOL "\x{b960}" => "\x{c728}", # RYUL => YUL "\x{b77c}" => "\x{b098}", # RA => NA "\x{b798}" => "\x{b0b4}", # RAE => NAE "\x{b85c}" => "\x{b178}", # RO => NO "\x{b8b0}" => "\x{b1cc}", # ROE => NOE "\x{b8e8}" => "\x{b204}", # RU => NU "\x{b974}" => "\x{b290}", # REU => NEU );#}}} my @p = ($p); my $jong = ((ord $p)-hex"ac00")%28; # JONGSEONG of $p $p = pack "U", ord($p)-$jong; map { push @p, pack "U", ord($_)+$jong if $t{$_} eq $p; } keys %t; return @p; } nabi-nabi-1.0.1/tables/candidate/hanja-to-c.py000077500000000000000000000031051430012456200210110ustar00rootroot00000000000000#!/usr/bin/env python # # A tool for merging commented hanja dictionary file with new hanja template # file import sys, string if len(sys.argv) == 1: print 'Usage: hanja-merge [commented files]...' sys.exit(1) table = { } for file_name in sys.argv[1:]: try: file = open(file_name, 'r') except: sys.stderr.write("Cant open file: %s\n" % file_name) sys.exit(1) # load the table category = '' for line in file.readlines(): line = line.strip() if len(line) == 0: continue if line[0] == '[': category = line[1:].split(']')[0] table[category] = {} table[category]['keylist'] = [] else: if category == '': continue list = line.strip().split('=') key = list[0] value = list[1] table[category][key] = value table[category]['keylist'].append(key) file.close() # print the table categories = table.keys() categories.sort() for category in categories: print 'static const CandidateItem item_%04x[] = {' % ord(category.decode('utf-8')) print ' { 0x%04x, \"%s\" },' % (ord(category.decode('utf-8')), category) keys = table[category]['keylist'] for key in keys: print ' { 0x%04x, /*%s*/ \"%s\" },' % (ord(key.decode('utf-8')), key, table[category][key]) continue print ' { 0x0, \"\" }' print '};' print '' print 'static const CandidateItem *candidate_table[] = {' sys.stdout.write(' ') i = 1 for category in categories[:-1]: sys.stdout.write('item_%04x, ' % ord(category.decode('utf-8'))) if i % 4 == 0: sys.stdout.write('\n ') i = i + 1 sys.stdout.write('item_%04x\n' % ord(categories[-1].decode('utf-8'))) print '};' nabi-nabi-1.0.1/tables/candidate/hanja-variants.pl000077500000000000000000000205671430012456200217740ustar00rootroot00000000000000#!/usr/bin/perl -w # # Usage : ./hanja-variants.pl [-v] [Unihan.txt] # checks the sanity of {simplified,traditional} variants with kKorean. # `-v' makes the result very verbose, showing every variants. # # how it works.? # -------------- # 1. grab every single kKorean with its variant informations. # 2. double check its variant : # a. `a' is one of simplified variants of `b' if `b' has a tag of kTraditionalVariant of `a'. # b. `a' is one of traditional variants of `b' if `b' has a tag of kSimplifiedVariant of `a'. # c. `a' should have a tag of kKorean, meaning korean pronunciation. # 3. might be erroneous if : # a. two arrays of isSimplifiedVariantOf and kTraditionalVariant are different. # a. two arrays of isTraditionalVariantOf and kSimplifiedVariant are different. require 5.8.0; use strict; use Carp; use Getopt::Std; use Fcntl qw/:flock/; use encoding qw/utf8/; # options our $opt_v; getopts('v'); # filename my $unihan = shift || "Unihan.txt"; #my @vtags = qw/kKorean kSimplifiedVariant kTraditionalVariant kZVariant/; my @vtags = qw/kKorean kSimplifiedVariant kTraditionalVariant/; # open file open IN, "<:utf8",$unihan or croak "cannot open `$unihan'"; flock IN, LOCK_SH or croak "cannot shlock `$unihan'"; # loop my $char = { }; # hashref of kKorean my $this = undef; # temporary while () { # split my ($hex,$tag,$value) = split /\t/, $_, 3; next if $hex =~ m/^#/; # skip if commented # push the information of previous char if new char found if (defined $this->{'hex'} && $this->{'hex'} ne $hex) { unless (defined $this->{'kKorean'}) { undef $this; next; } # skip if no kKorean map { $char->{$this->{'hex'}}->{$_} = $this->{$_} } grep ! /^hex$/, keys %{$this}; undef $this; } # this char $this->{'hex'} = $hex; foreach (@vtags) { push @{$this->{$_}}, split /\s+/, $value if $tag eq $_; last if $tag eq $_; # foreach (@vtags) } } # while () # close file flock IN, LOCK_UN; close IN; # $char is now hashref of whole kKorean : # $char->{'U+XXXX'}->{'kKorean'} = pronunciation(s) of this char # ->{'kSimplifiedVariant'} = simplified Chinese variant(s) of this char if any # ->{'kTraditionalVariant'} = traditional Chinese variant(s) of this char if any # search Variants foreach my $hex (keys %{$char}) { if (defined $char->{$hex}->{'kSimplifiedVariant'}) { foreach (@{$char->{$hex}->{'kSimplifiedVariant'}}) { push @{$char->{$_}->{'isSimplifiedVariantOf'}}, $hex if defined $char->{$_} && $char->{$_}->{'kKorean'}; # XXX beware } } elsif (defined $char->{$hex}->{'kTraditionalVariant'}) { foreach (@{$char->{$hex}->{'kTraditionalVariant'}}) { push @{$char->{$_}->{'isTraditionalVariantOf'}}, $hex if defined $char->{$_} && $char->{$_}->{'kKorean'}; } } } # $char has additionally : # $char->{'U+XXXX'}->{'isSimplifiedVariantOf'} = traditional Chinese variant(s) of this char if any # ->{'isTraditionalVariantOf'} = simplified Chinese variant(s) of this char if any # show results foreach my $hex (sort keys %{$char}) { my @tags = grep ! /^kKorean$/, keys %{$char->{$hex}}; # skip if not variant next unless $char->{$hex}->{'isSimplifiedVariantOf'} || $char->{$hex}->{'isTraditionalVariantOf'} || $char->{$hex}->{'kSimplifiedVariant'} || $char->{$hex}->{'kTraditionalVariant'}; my $has_error = 0; # if a char is a simplified variant of others $has_error ++ if $char->{$hex}->{'isSimplifiedVariantOf'} && ! &_is_identical(\$char->{$hex}->{'isSimplifiedVariantOf'},\$char->{$hex}->{'kTraditionalVariant'}); # if a char is a traditional variant of others $has_error ++ if $char->{$hex}->{'isTraditionalVariantOf'} && ! &_is_identical(\$char->{$hex}->{'isTraditionalVariantOf'},\$char->{$hex}->{'kSimplifiedVariant'}); next unless $has_error || $opt_v; print &_uchar($hex).($has_error?" might have some errors on its variant information..":"")."\n"; printf "%22s : %s\n", "kKorean", join " ", map{&_phone($_)}sort@{$char->{$hex}->{'kKorean'}}; printf "%22s : %s\n", $_, join ", ",map{&_uchar($_)}sort@{$char->{$hex}->{$_}} foreach sort @tags; print +("-"x76)."\n"; } # return true if two arrayref has same elements sub _is_identical { my ($a1,$a2) = @_; my %union; map { $union{$_} ++ } @{$$a1}; map { $union{$_} ++ } @{$$a2}; return (keys %union == @{$$a1}) ? (keys %union == @{$$a2}) ? 1 : 0 : 0; } # return utf8 char sub _uchar { my $u = shift; return +(pack"U",hex($1))." $u" if $u =~ m/^U\+(.*)/; } # return pronunciation sub _phone { # stolen from hanjatable.py my $jamo = { 'base' => { 'syllable' => 0xac00, 'cho' => 0x1100, 'jung' => 0x1161, 'jong' => 0x11a7, }, 'num' => { 'jung' => 21, 'jong' => 28, }, 'cho' => { 'k' => 0x1100,#{{{ 'kk' => 0x1101, 'n' => 0x1102, 't' => 0x1103, 'tt' => 0x1104, 'l' => 0x1105, 'm' => 0x1106, 'p' => 0x1107, 'b' => 0x1107, 'pp' => 0x1108, 's' => 0x1109, 'ss' => 0x110a, '' => 0x110b, # IEUNG without phonetic value 'c' => 0x110c, 'cc' => 0x110d, 'ch' => 0x110e, 'kh' => 0x110f, 'th' => 0x1110, 'ph' => 0x1111, 'h' => 0x1112, },#}}} 'jung' => { 'a' => 0x1161,#{{{ 'ay' => 0x1162, 'ya' => 0x1163, 'yay' => 0x1164, 'e' => 0x1165, 'ey' => 0x1166, 'ye' => 0x1167, 'yey' => 0x1168, 'o' => 0x1169, 'wa' => 0x116a, 'way' => 0x116b, 'oy' => 0x116c, 'woy' => 0x116c, 'yo' => 0x116d, 'wu' => 0x116e, 'we' => 0x116f, 'wey' => 0x1170, 'wi' => 0x1171, 'yu' => 0x1172, 'u' => 0x1173, 'uy' => 0x1174, 'i' => 0x1175, },#}}} 'jong' => { '' => 0x11a7,#{{{ 'k' => 0x11a8, 'kk' => 0x11a9, 'ks' => 0x11aa, 'n' => 0x11ab, 'nc' => 0x11ac, 'nh' => 0x11ad, 't' => 0x11ae, 'l' => 0x11af, 'lk' => 0x11b0, 'lm' => 0x11b1, 'lp' => 0x11b2, 'ls' => 0x11b3, 'lth' => 0x11b4, 'lph' => 0x11b5, 'lh' => 0x11b6, 'm' => 0x11b7, 'p' => 0x11b8, 'ps' => 0x11b9, 's' => 0x11ba, 'ss' => 0x11bb, 'ng' => 0x11bc, 'c' => 0x11bd, 'ch' => 0x11be, 'kh' => 0x11bf, 'th' => 0x11c0, 'ph' => 0x11c1, 'h' => 0x11c2, },#}}} }; #my ($cho,$jung,$jong) = ($1,$2,$3) if +shift =~ m/^(.*?)?([aeiouwy]+)(.*)$/i; my $e = shift; my ($cho,$jung,$jong) = map { lc } ($1,$2,$3) if $e =~ m/^(.*?)?([aeiouwy]+)(.*)$/i; unless (defined $jamo->{'cho'}->{$cho}) { carp "no such CHOSEONG $cho ($e)"; return $e; } unless (defined $jamo->{'jung'}->{$jung}) { carp "no such JUNGSEONG $jung ($e)"; return $e; } unless (defined $jamo->{'jong'}->{$jong}) { carp "no such JONGSEONG $jong ($e)"; return $e; } $cho = $jamo->{'cho'}->{$cho} - $jamo->{'base'}->{'cho'}; $jung = $jamo->{'jung'}->{$jung} - $jamo->{'base'}->{'jung'}; $jong = $jamo->{'jong'}->{$jong} - $jamo->{'base'}->{'jong'}; return pack "U",($cho*$jamo->{'num'}->{'jung'}+$jung)*$jamo->{'num'}->{'jong'}+$jong+$jamo->{'base'}->{'syllable'}; } nabi-nabi-1.0.1/tables/candidate/hanjatable.py000077500000000000000000000122241430012456200211630ustar00rootroot00000000000000#!/usr/bin/env python import sys, string char_type = 'static const gunichar' copyright = '' def print_help(): sys.stderr.write("Usage: hanjatable.py [Unihan database file]\n") sys.exit(1); def print_description(): desc = """/* * this file is generated from Unihan.txt database file by gen.py (part of * GTK+-2.0 input module package, imhangul) * You can get this database file from ftp://www.unicode.org/Public/UNIDATA/ * or http://www.unicode.org/Public/UNIDATA/ */ """ print desc def print_copyright(): print '/*\n' + copyright + ' */\n' def unicodetohexnum(str): return string.atoi(str[2:], 16) def jamotosyllable(cho, jung, jong): syllable_base = 0xAC00 choseong_base = 0x1100 jungseong_base = 0x1161 jongseong_base = 0x11A7 njungseong = 21 njongseong = 28 if cho < 0x1100 and cho > 0x1112: return 0 if jung < 0x1161 and jung > 0x1175: return 0 if jong < 0x11A8 and jong > 0x11C2: return 0 cho -= choseong_base jung -= jungseong_base jong -= jongseong_base ch = ((cho * njungseong) + jung) * njongseong + jong + syllable_base if ch >= 0xAC00 and ch <= 0xD7AF: return ch else: return 0 def phonetocode(phone, error_msg): choseong_table = { 'K': 0x1100, 'KK': 0x1101, 'N': 0x1102, 'T': 0x1103, 'TT': 0x1104, 'L': 0x1105, 'M': 0x1106, 'P': 0x1107, 'B': 0x1107, 'PP': 0x1108, 'S': 0x1109, 'SS': 0x110A, #'': 0x110B, 'C': 0x110C, 'CC': 0x110D, 'CH': 0x110E, 'KH': 0x110F, 'TH': 0x1110, 'PH': 0x1111, 'H': 0x1112 } jungseong_table = { 'A': 0x1161, 'AY': 0x1162, 'YA': 0x1163, 'YAY': 0x1164, 'E': 0x1165, 'EY': 0x1166, 'YE': 0x1167, 'YEY': 0x1168, 'O': 0x1169, 'WA': 0x116A, 'WAY': 0x116B, 'OY': 0x116C, 'WOY': 0x116C, 'YO': 0x116D, 'WU': 0x116E, 'WE': 0x116F, 'WEY': 0x1170, 'WI': 0x1171, 'YU': 0x1172, 'U': 0x1173, 'UY': 0x1174, 'I': 0x1175 } jongseong_table = { 'K': 0x11A8, 'KK': 0x11A9, 'KS': 0x11AA, 'N': 0x11AB, 'NC': 0x11AC, 'NH': 0x11AD, 'T': 0x11AE, 'L': 0x11AF, 'LK': 0x11B0, 'LM': 0x11B1, 'LP': 0x11B2, 'LS': 0x11B3, 'LTH': 0x11B4, 'LPH': 0x11B5, 'LH': 0x11B6, 'M': 0x11B7, 'P': 0x11B8, 'PS': 0x11B9, 'S': 0x11BA, 'SS': 0x11BB, 'NG': 0x11BC, 'C': 0x11BD, 'CH': 0x11BE, 'KH': 0x11BF, 'TH': 0x11C0, 'PH': 0x11C1, 'H': 0x11C2 } orig_phone = phone if choseong_table.has_key(phone[:2]): choseong = choseong_table[phone[:2]] phone = phone[2:] elif choseong_table.has_key(phone[:1]): choseong = choseong_table[phone[:1]] phone = phone[1:] else: choseong = 0x110B if jungseong_table.has_key(phone[:3]): jungseong = jungseong_table[phone[:3]] phone = phone[3:] elif jungseong_table.has_key(phone[:2]): jungseong = jungseong_table[phone[:2]] phone = phone[2:] elif jungseong_table.has_key(phone[:1]): jungseong = jungseong_table[phone[:1]] phone = phone[1:] else: sys.stderr.write(error_msg + ':%s: phonetic data error\n' % orig_phone) return 0 if jongseong_table.has_key(phone[:3]): jongseong = jongseong_table[phone[:3]] phone = phone[3:] elif jongseong_table.has_key(phone[:2]): jongseong = jongseong_table[phone[:2]] phone = phone[2:] elif jongseong_table.has_key(phone[:1]): jongseong = jongseong_table[phone[:1]] phone = phone[1:] elif len(phone) == 0: jongseong = 0x11A7 else: sys.stderr.write(error_msg + ':%s: phonetic data error\n' % orig_phone) return 0 # print "%x + %x + %x" % ( choseong, jungseong, jongseong ) hangulcode = jamotosyllable(choseong, jungseong, jongseong) return hangulcode; # start main procedure data_file_name = "Unihan.txt" if len(sys.argv) == 2: data_file_name = sys.argv[1] try: data_file = open(data_file_name, 'r') except: sys.stderr.write("Cant open file: %s\n" % data_file_name) help() sys.exit(1) gather_copyright = 0 table = { } lineno = 0 for line in data_file.readlines(): lineno = lineno + 1 # check for comment, jump over comments if line[0] == '#': if gather_copyright == 0: if string.find(line, "Format information:") != -1 : gather_copyright = 1 continue copyright += ' * ' + string.strip(line[1:]) + '\n' continue else: continue # check for korean phonetic data if string.find(line, "kKorean") < 0: continue tokens = string.split(line) hanjacode = unicodetohexnum(tokens[0]) for hangulphone in tokens[2:]: hangulcode = phonetocode(hangulphone, "%s: U+%X " % (data_file_name, hanjacode)) if hangulcode == 0: continue if table.has_key(hangulcode): table[hangulcode].append(hanjacode) else: table[hangulcode] = [ hanjacode ] data_file.close() list = table.keys() list.sort() sys.stderr.write("\n") threshold = 0 section_no = 1 char_num = 0 table_len = 0 sys.stderr.write("-- %d --\n" % section_no) for key in list: print '[' + unichr(key).encode('utf-8') + ']' i = 0 table[key].sort() for hanja in table[key]: print unichr(hanja).encode('utf-8') + '=' char_num = char_num + 1 table_len = len(table[key]) threshold = threshold + table_len sys.stderr.write("%s: %d\n" % (unichr(key).encode('utf-8'), table_len)) if threshold > 100: threshold = 0 section_no = section_no + 1 sys.stderr.write("-- %d --\n" % section_no) sys.stderr.write("Total %d chars are written\n" % char_num) nabi-nabi-1.0.1/tables/candidate/nabi-hanja.txt000066400000000000000000007066331430012456200212640ustar00rootroot00000000000000[가] 个=명당 곁방 가 仮=假의 略字 伽=절 가 佳=아름다울 가 価=價의 略字 假=거짓 가 傢=세간 가 價=값 가 加=더할 가 叚=빌 가 可=옳을 가 呵=꾸짖을 가 咖=커피차 가, 커피의 음차로 쓰는자 가 哥=노래 가 哿=좋을 가 嘉=아름다울 가 嘏=클 가, 복 가, 멀 가, 굳을 가 坷=험할 가 嫁=시집갈 가 宊=家와 同字 家=집 가 斝=옥잔 가 暇=겨를 가 架=시렁 가 枷=목칼 가, 도리깨채 가 柯=가지 가 榎=檟와 同字 檟=오동나무 가 歌=노래 가 珂=옥 이름 가 珈=머리꾸미개 가 痂=헌데 딱지 가 稼=심을 가 笳=갈잎피리 가 耞=도리깨 가 舸=큰 배 가 苛=매울 가 茄=가지 가 葭=갈대 가 街=거리 가 袈=가사 가 訶=꾸짖을 가 謌=歌와 同字 賈=값 가 跏=책상다리할 가 軻=수레 가기 힘들 가 迦=부처이름 가 駕=멍에 가 髂=허리뼈 가 [각] 傕=성 각 刻=새길 각 却=물리칠 각 卻=却의 本字 各=각각 각 咯=토할 각 埆=메마를 각 恪=삼갈 각 慤=삼갈 각 搉=칠 각 擱=놓을 각 桷=서까래 각 殻=殼과 同字 殼=껍질 각 玨=珏의 古字 珏=쌍옥 각 脚=다리 각 覚=覺의 略字 覺=깨달을 각 角=뿔 각 較=수레 귀 각 閣=문설주 각 [간] 乾=마를 간 亁=乾의 俗字 侃=강직할 간 倝=해 돋을 간 偘=侃과 同字 刊=책 펴낼 간 囏=艱의 古字 墾=따비질할 간 奸=범할 간, 간악할 간 姦=간사할 간 干=방패 간 幹=줄기 간, 우물난간 간 慳=아낄 간 懇=정성 간 揀=가릴 간 斡=관리할 간 旰=해질 간 杆=지레 간, 나무이름 간 柬=가릴 간 栞=도표 간 榦=幹의 本字 澗=산골물 간 玕=옥돌 간 珢=부르터 삐어진 흔적 있는 옥 간 癎=경풍 간 看=볼 간 磵=산골 시내 간, 석간수 간 秆=稈과 同字 稈=짚 간 竿=장대 간, 화살대 간, 횃대 간 簡=대쪽 간 肝=간 간 艮=괘이름 간 艱=어려울 간 茛=독초이름 간, 미나리아재비 간 衎=즐길 간, 바를 간 諫=간할 간 赶=달릴 간 迀=구할 간, 권할 간 閒=틈 간 間=틈 간, 사이 간 齦=물을 간 [갈] 丐=거지 갈, 줄 갈 乫=땅이름 갈 匄=청구할 갈, 줄 갈, 빌 갈 咭=쥐 우는 소리 갈 喝=꾸짖을 갈, 성낸 소리 갈 嘠= 噶=벼슬이름 갈, 땅이름 갈 掲=揭과 同字 揭=높이 들 갈, 옷 걷고 물 건널 갈, 등에 질 갈 曷=어찌 갈, 그칠 갈, 벌레이름 갈 楬=패를 써서 표시할 갈 渇=渴과 同字 渴=목마를 갈, 급할 갈 碣=비 갈, 우뚝선 돌 갈, 동해의 산이름 갈 秸=볏짚 갈, 짚 고갱이 갈 竭=다할 갈, 마를 갈 羯=불친 양 갈, 땅이름 갈 葛=칡 갈 蝎=전갈 갈, 빈대 갈 蠍=전갈 갈 褐=털베 갈, 굵은 베 갈, 천한사람 갈, 갈옷 갈 鞨=말갈나라 갈, 말갈보석 갈 頡=긁을 갈, 밟을 갈 鶡=할단새 갈, 관이름 갈 [감] 减=減의 俗字 凵=입 벌릴 감, 위가 벌어진 그릇 감 勘=마감할 감, 정할 감 坎=구덩이 감, 험할 감, 작은 잔 감, 괘 이름 감, 불우하여 뜻을 이루지 못할 감 坩=도가니 감 埳=구덩이 감 堪=견딜 감, 이길 감, 맡을 감, 하늘 감, 산 모양이 기괴할 감 嵁=산 험할 감 嵌=깊은 골 감, 곁굴 감, 깊은 산 감 弇=뚜껑 감, 사람이름 감 感=감동할 감, 찌를 감, 깨달을 감, 느낄 감 憨=어리석을 감, 미련할 감 憾=섭섭할 감, 한할 감, 한혐할 감 戡=찌를 감, 이길 감, 죽일 감 撼=흔들 감, 움직일 감, 깨뜨릴 감 敢=감히 감, 구태여 감, 날랠 감, 용맹할 감 柑=감귤 감, 감자 감 橄=감람나무 감 欠=하픔할 감, 기지개 켤 감, 이지러질 감 欿=서운할 감, 찌푸릴 감, 걱정할 감 減=덜 감, 무지러질 감, 가벼울 감, 물이름 감 甘=달 감, 달게 여길 감 疳=감질병 감, 궤양 감, 창병 감, 종기 아플 감 監=거느릴 감, 살필 감, 볼 감, 벼슬 감, 감옥 감 瞰=굽어볼 감, 내려다 볼 감 紺=아청 감, 보랏빛 감 鍼= 鑑=거울 감, 밝을 감, 비칠 감, 경계할 감 鑒=鑑과 同字 龕=취할 감, 이길 감, 감실 감 [갑] 匣=궤 갑, 상자 갑 合=부를 갑, 홉 갑 岬=산 허구리 갑, 줄이 느런할 갑 押=도울 갑, 단속할 갑, 잡아들일 갑 甲=갑옷 갑, 첫째 천간 갑, 비롯할 갑, 떡잎 날 갑, 법령 갑, 대궐 갑 胛=어깻죽지 갑 鉀=갑옷 갑 閘=문 빗장 갑, 물 문 갑 韐=가죽바지 갑 [강] 傋=아첨 아니할 강 僵=엎드러질 강, 쓰러질 강 剛=굳을 강, 굳셀 강, 꼬장할 강, 바야흐로 강 匟=평상 강 唴=어린아이 울 강, 울어 기진할 강 堈=언덕 강, 밭 두둑 강 壃=疆과 同字 姜=성씨 강, 강할 강 岡=멧동 강, 산등성이 강 崗=岡의 俗字 康=편안할 강, 즐거울 강, 다섯거리 강 強=强의 本字 强=강할 강, 나머지 강, 바구미 강 彊=굳셀 강, 센 활 강, 사나울 강, 송장 뻣뻣할 강 忼=강개할 강, 뜻이 크고 기개있을 강, 탄식할 강 慶=복 강, 이에 강 慷=강개할 강 扛=마주 들 강 控=칠 강 杠=외나무 다리 강, 깃대 강, 상 앞 가로막대 강, 올릴 강 橿=참죽나무 강, 호미자루 강, 사닥다리 강, 억셀 강 殭=죽어 썩지 않을 강, 마른 누에 강 江=가람 강, 물 강 畺=疆과 同字 疆=땅 경계 강, 갈피 강, 굳셀 강, 변방 강 矼=돌다리 강, 징검다리 강, 성실할 강 穅=겨 강, 악기이름 강 糠=겨 강, 번쇄할 강 絳=깊게 붉을 강, 강초 강 綱=벼리 강, 근본 강, 법 강, 대강 강 繈=繦의 本字 繦=돈꿰미 강 罡=강별 강 羌=오랑캐 강, 말 끝낼 강 羗=羌과 同字 羫=밭 갈 강 腔=창자 강, 속 빌 강, 뼈대 강, 말 허구리 강 舡=오나라 배 강 茳=강리풀 강 薑=생강 강 虹=골이름 강 襁=포대기 강 講=강론할 강, 강구할 강, 익힐 강, 강화할 강 豇=광저기 강 鋼=쇠 강 降=내릴 강, 떨어질 강, 돌아갈 강 韁=고삐 강 鱇=천징어 강 [개] 丐=빌 개 个=낱 개 介=낄 개, 도울 개, 맬 개, 클 개, 중매할 개 价=착할 개, 클 개, 사신 개 佳=착할 개, 좋을 개, 좋아할 개 個=낱 개, 치우칠 개 凱=싸움 이긴 풍류 개, 착할 개, 마파람 개, 좋은 사람 개 剴=낫 개, 가까울 개, 간절할 개 匃=청구할 개, 줄 개, 빌 개 匄=匃와 同字 喈=새소리 개, 빠를 개 嘅=탄식할 개, 성낼 개 塏=시원한 땅 개 恝=걱정 없을 개 愷=탐할 개, 급할 개 愾=한숨 쉴 개, 성낼 개 慨=분할 개, 강개할 개, 슬플 개 揩=문지를 개, 문질러 훔칠 개 改=고칠 개, 거듭할 개, 바꿀 개 概=槪와 同字 槩=槪와 同字 槪=평두목 개, 절개 개, 대강 개, 거리낄 개, 칠한 술통 개 溉=漑와 同字 漑=물 댈 개, 씻을 개, 물 천천히 흐를 개 玠=큰 서옥 개 疥=옴 개 皆=모두 개, 한 가지 개, 같을 개 盖=蓋의 俗字 磕=돌 부딪는 소리 개 箇=낱 개, 개수 개 芥=겨자 개, 갓 개, 지푸라기 개, 티끌 개 蓋=뚜껑 개, 덮개 개, 이엉 개, 우산 개, 가리울 개 解=벗을 개, 풀 개, 헤칠 개, 발신할 개 豈=승전악 개 鎧=투구 개, 갑옷 개 開=열 개, 통할 개, 발할 개, 베풀 개, 풀 개 闓=열 개, 풀 개, 활깍지 개 豈=승전악 개 [객] 喀=기침할 객, 토할 객 客=손님 객, 부칠 객, 나그네 객, 지날 객 [갱] 坑=빠질 갱, 묻을 갱, 구덩이 갱 更=다시 갱 硜=아릿아릿할 갱, 알랑알랑할 갱, 돌소리 갱 粳=메벼 갱 羹=국 갱 賡=이을 갱, 일 갱 鏗=금석 소리 갱, 사람이름 갱 更=다시 갱 [갹] 噱=껄껄 웃을 갹, 입 벌일 갹 醵=술추렴 갹, 추렴 걷을 갹 [거] 佉=나라이름 거 俥=인력거 거 倨=거만할 거, 걸터 앉을 거, 굽을 거 凥=居와 同字 勮=부지런히 힘쓸 거, 두려울 거 厺=去의 本字 去=갈 거, 버릴 거, 오래될 거, 떨어질 거, 쫓을 거, 감출 거 呿=입 딱 벌일 거 居=살 거, 곳 거, 앉을 거, 놓을 거, 쌓을 거 巨=클 거, 많을 거, 억 거 拒=막을 거, 맞설 거, 다닥칠 거, 다다를 거 拠=據의 俗字 据=가질 거, 길거할 거, 의지할 거, 손병 거 據=의지할 거, 기댈 거, 웅거할 거, 짚을 거 擧=들 거, 받들 거, 움직일 거, 일걸을 거 昛=밝을 거 渠=개천 거, 도랑 거, 휑덩그렁할 거, 클 거, 껄껄 웃을 거, 무엇 거 炬=횃불 거, 불 땔 거 祛=물리칠 거, 빌 거, 굳셀 거 秬=검은 기장 거 筥=쌀 담는 광주리 거, 볏단 거 籧=대자리 거, 천상바라기 거, 양잠기 거 胠=열 거, 갈비 거 腒=건치 거, 꿩 포 거 艍= 苣=상추 거, 검은 깨 거 莒=모시풀 거, 나라이름 거, 고을이름 거 蕖=연꽃 거 蘧=패랭이꽃 거, 석죽화 거, 마음에 든든할 거 袪=소매 거, 소매 아귀 거 裾=옷 뒷자락 거 詎=어찌 거, 모를 거 距=며느리 발톱 거, 지낼 거, 뛸 거, 겨룰 거, 미눌 거 踞=걸터앉을 거 車=수레 거, 그물 거, 잇몸 거 遽=급할 거, 두려울 거, 역말 수레 거 醵=술추렴 거, 추렴 걷을 거 鉅=갈고리 거, 클 거, 강한 쇠 거 鋸=톱 거, 다리 꺾는 형벌 거 駏=튀기 거, 거공벌레 거 車=수레 거, 그물 거, 잇몸 거 [걱] 巪=사람 이름자 걱 [건] 乾=하늘 건, 괘 이름 건, 서북쪽 건, 굳셀 건, 임금 건 亁=乾과 同字 件=조건 건, 가지 건, 구별할 건, 나눌 건 健=굳셀 건, 병 없을 건, 탐할 건 囝=아이 건 巾=수건 건, 덮을 건 建=세울 건, 둘 건, 심을 건, 칼집 건, 별이름 건 愆=죄 건, 허물 건, 어기어질 건 揵=멜 건, 막을 건, 들 건 楗=문 빗장 건, 문지방 건 犍=불친 소 건, 짐승이름 건, 촉나라 고을이름 건 睷=눈으로 세어볼 건 腱=힘줄 건 荐= 虔=정성 건, 빼앗을 건, 죽일 건 褰=바지 건, 걷을 건, 발 걷을 건 謇=말 더듬거릴 건, 바른말할 건 蹇=절름거릴 건, 험할 건, 교만할 건 鍵=열쇠 건, 수레 굴대 건 鞬=칼집 건, 동개 건 騫=말 배 앓을 건, 이지러질 건, 휙 뛰어 나아갈 건 [걸] 乞=구걸할 걸, 요구할 걸, 원할 걸, 거지 걸 乬=갈 걸 偈=힘 빼두를 걸, 빠를 걸, 헌걸찰 걸 傑=호걸 걸, 준걸 걸, 뛰어날 걸, 거만할 걸, 떡잎 걸 朅=갈 걸 杰=傑의 俗字 桀=찢을 걸, 홰 걸, 빼어날 걸, 멜 걸, 사나을 걸, 왕이름 걸 榤=닭의 홰 걸 渇=渴과 同字 渴=물 잦을 걸 竭=다할 걸, 마를 걸 [검] 倹=儉의 略字 儉=검소할 검, 흉년들 검, 적을 검, 가난할 검 剣=劍과 同字 劍=칼 검, 칼로 찔러 죽일 검, 칼 쓰는법 검 劎=劍과 同字 劒=劎의 譌字 劔=劎의 俗字 撿=잡을 검, 구속할 검, 관찰할 검, 비교할 검 柑= 検=檢과 同字 檢=교정할 검, 금제할 검, 법 검, 봉할 검, 책메뚜기 검, 수결둘 검 歛=탐할 검, 구걸할 검 泔= 淦= 澉= 瞼=눈시울 검 矙= 芡=마름 검, 가시연밥 검 轗= 酣= 鈐=굴대 비녀장 검, 자물쇠 검, 큰 보습 검 鹻=소금물 검, 잿물 검, 비누 검 黔=검을 검 [겁] 刦=겁탈할 겁, 구속할 겁 刧=刦의 俗字 劫=위협할 겁, 겁탈할 겁, 부지런할 겁, 대궐 층계 겁, 겁 겁, 화재 겁 怯=무서워할 겁, 겁낼 겁, 으를 겁 迲= [것] 唟=땅이름 것 [게] 偈=쉴 게, 게타 게, 글귀 게 卟=점칠 게, 생각할 게 憩=쉴 게 掲=揭와 同字 揭=높이 들 게, 옷 걷고 물 건널 게, 등에 질 게 [격] 嗝=딸꾹질할 격, 꿩 울 격 挌=칠 격, 들 격 撃=칠 격, 두드릴 격, 눈에 마주칠 격, 죽일 격 擊=撃과 同字 格=이를 격, 올 격, 바를 격, 대적할 격, 감동할 격 檄=격서 격, 격문 격, 과격할 격 毄=맞부딛는 소리 격, 충돌할 격, 창 격 激=물결 부딪혀 흐를 격, 찌를 격, 맑은 소리 격, 말 과격히 할 격 膈=명치 격 覡=박수 격, 남자무당 격 闃=고요할 격 隔=막을 격, 멀 격 骼=마른 뼈 격, 드러난 뼈 격, 짐승의 뼈 격 鬲=오지병 격, 땅이름 격 鴃=왜가리 격, 때까치 격 [견] 健=탐할 견 堅=굳을 견, 굳셀 견, 반드시 견 樫=떡갈나무 견 牽=당길 견, 이끌 견, 빠를 견, 거리낄 견, 볏줄 견 犬=큰 개 견 狷=고집스러울 견, 조수할 견, 편협할 견 甄=질그릇 견, 살필 견, 표시할 견, 진 이름 견, 면할 견, 밝을 견 甽=畎의 古字 畎=밭 도랑 견, 산골 도랑 견 筧=대 홈통 견 絹=비단 견, 깁 견 縳=올 견, 낳이 실 견 縴=궂은 솜 견 繭=고치 견, 발 부르틀 견, 목 쉴 견, 비단 견 繾=곡진할 견, 마지 않을 견 羂=걸 견, 걸릴 견 肩=어깨 견, 이길 견, 맡길 견, 멜 견, 세 살 된 짐승 견 蠲=밝을 견, 조촐할 견, 반딧불 견 見=볼 견, 만날 견, 당할 견 譴=꾸짖을 견, 성낼 견, 귀양갈 견 豣=큰 돼지 견, 세 살 된 돼지 견 趼=발 부르틀 견 遣=보낼 견, 쫓을 견, 견전제 견 鰹=큰 가물치 견, 물치 견, 강고도리 견 鵑=접동새 견, 두견새 견, 뻐꾹새 견 [결] 僪=해무리 결, 미칠 결 决=決의 俗字 刔=抉과 同字 抉=긁을 결, 당길 결 拮=길거할 결, 열심히 일할 결 決=결단할 결, 물이름 결, 물골 터 놓을 결, 끊을 결, 이별할 결 潔=맑을 결, 정결할 결, 조촐할 결 玦=옥패 결, 활 깍지 결 結=맺을 결, 마칠 결, 나중 결, 몫 결 缺=이지러질 결, 번개 번쩍거릴 결, 깨어질 결, 이 빠질 결 觖=서운할 결, 들쳐낼 결, 바랄 결 訣=이별할 결, 열결할 결, 사례할 결, 비결 결 闋=쉴 결, 다할 결, 풍류 마칠 결, 문 닫을 결 [겸] 傔=겸종 겸 兼=겸할 겸, 아우를 겸, 둘 얻을 겸, 모을 겸 嗛=부족히 여길 겸, 겸손 겸, 입에 밥 물고 있을 겸 岒=산 작고 높을 겸 慊=앙심먹을 겸, 불만족하게 생각할 겸, 싫을 겸 拑=자갈 먹일 겸 歉=흉년들 겸, 적을 겸, 나쁠 겸 箝=재갈 겸, 족집개 겸, 목 잠글 겸 縑=합사비단 겸 蒹=갈대 겸 謙=사양할 겸, 겸손할 겸, 괘 이름 겸 鉗=목사슬 겸, 세력으로써 남을 누를 겸, 입 다물 겸 鎌=낫 겸 黚=얕은 금향빛 겸 鼸=두더쥐 겸 [겹] 侠=俠의 俗字 俠=아오를 겹 唊=망녕되이 말할 겹 郟=그을 이름 겹 [경] 京=서울 경 亰=서울 경 俓=徑과 同字 倞=굳셀 경 傾=기울 경 儆=경계할 경 冂=먼데 경 冏=빛날 경 剄=목 벨 경 剠=鯨과 同字 勁=굳셀 경 勍=셀 경 卿=벼슬 경 哽=목멜 경 囧=冏과 同字 坰=들 경 境=지경 경 庚=일곱째 천간 경 径=통할 경 徑=지름길 경 惸=근심할 경 慶=경사 경 憬=깨달을 경 憼=공경할 경 扃=빗장 경 擎=들 경 敬=공경할 경 景=별 경 暻=밝을 경 更=고칠 경 梗=대개 경 檠=도지개 경 涇=통할 경 炅=빛날 경 烱=빛날 경 焭=근싱할 경 煢=외로울 경 熲=빛날 경 璟=옥 빛 경 璥=경옥 경 瓊=옥 경 畊=耕의 古字 痙=심줄 땅길 경 硬=굳을 경 磬=경쇠 경 竟=다할 경 競=겨룰 경 竸=競과 同字 絅=끌어 쥘 경 経=날 경 綆=두레박줄 경 經=날 경 罄=빌 경 耕=밭갈 경 耿=빛날 경 脛=정강이 경 莖=줄기 경 褧=홑옷 경 謦=기침 경 警=경계할 경 軽=천할 경 輕=가벼울 경 逕=소로 경 鏡=거울 경 頃=밭 넓이 단위 경 頚=頸의 俗字 頸=목 경 顈=홑옷 경 駉=목장 경 驚=놀랄 경 鯁=생선뼈 경 鯨=고래 경 黥=묵형할 경 [계] 乩=점칠 계 係=걸릴 계 启=啓와 同字 啓=열 계 啟=인도할 계 堦=섬돌 계 堺=界와 同字 契=맺을 계 季=끝 계 屆=이를 계 悸=두근거를 계 戒=경계할 계 挈=끊을 계 桂=계수나무 계 械=형틀 계 棨=창 계 溪=시내 계 烓=화덕 계 界=지경 계 瘈=미칠 계 癸=열째 천간 계 碣= 磎=谿와 同字 禊=계제 계 稽=머무를 계 筓=비녀 계 系=이을 계 継=繼의 俗字 綮=발 고운 비단 계 縘=繫와 同字 繋=繫와 同字 繫=맬 계, 맺을 계 繼=이을 계 罽=물고기 그물 계 葪=베일 계, 삽주 계 薊=삽주 계 計=꾀 계 誡=경계할 계 谿=시내 계 階=섬돌 계 雞=닭 계 髻=상투 계 鳮=鷄의 俗字 鷄=닭 계 [고] 估=값 고 侤=생각할 고 凅=얼어붙을 고 刳=가를 고 古=옛 고 叩=두드릴 고 吿=告와 同字 告=알릴 고 呱=울 고 咎=허물 고 咕=투덜거릴 고 嚳=고할 고 固=굳을 고 塙=단단할 고 姑=시어미 고 孤=외로울 고 尻=꽁무니 고 庫=곳집 고 拷=가질 고 攷=考의 古字 故=옛 고 敲=두드릴 고 暠=흴 고 杲=밝을 고 枯=마를 고 栲=북나무 고 槀=마를 고 槁=槀와 同字 槹=두레박 고 櫜=활집 고 沽=팔 고 牯=암소 고 痼=고질 고 皋=못 고 皐=부르는 소리 고 盬=염지 고 睾=못 고 瞽=소경 고 稁=稿와 同字 稿=볏집 고 箍=테 고 篙=상앗대 고 糕=떡 고 罟=그물 고 羔=새끼양 고 羖=검은 암양 고 翱=翺와 同字 翺=날 고 考=상고할 고 股=넓적다리 고 胯=사타구니 고 脵= 膏=살찔 고 苦=쓸 고 苽=줄 고 菰=향초 고 藁=마른 나무 고 蠱=독 고 袴=바지 고 觚=술잔 고 詁=주석 고 誥=고할 고 賈=장사 고 辜=허물 고 郜=나라이름 고 酤=계명주 고 鈷=다리미 고 錮=땜질할 고 雇=새이름 고 靠=기댈 고 顧=돌아볼 고 骷=해골 고 高=높을 고 髙=高와 同字 鯝=참마자 고 鴣=자고 고 鷱=새이름 고 鼓=북 고 賈=장사 고 [곡] 吿=告과 同字 告=청할 곡 哭=울 곡 斛=휘 곡 曲=굽을 곡 梏=쇠고랑 곡 榖=穀의 俗字 槲=떡갈나무 곡 玨=珏의 古字 珏=쌍옥 곡 穀=곡식 곡 縠=주름 비단 곡 角= 觳=뿔잔 곡 谷=골짜기 곡 轂=바퀴 곡 鵠=고니 곡 [곤] 丨=뚫을 곤 困=괴로울 곤 坤=땅 곤 堃=따 곤 崐=곤륜산 곤 崑=산이름 곤 悃=정성 곤 捆=두드릴 곤 昆=형 곤 梱=문지방 곤 棍=몽둥이 곤 混=서쪽 오랑캐 곤 滚=滾과 同字 滾=흐를 곤 琨=옥돌 곤 緄=띠 곤 衮=袞과 同字 袞=곤룡포 곤 裍=걷어 올릴 곤 褌=잠방이 곤 錕=붉은 쇠 곤 閫=문지방 곤 髡=머리 깍을 곤 鯀=물고기 이름 곤 鯤=준마 이름 곤 鵾=댓닭 곤 鶤=댓닭 곤 齫=이 빠질 곤 [골] 搰=팔 골 榾=등걸 골 汨=빠질 골 滑=어지러울 골 矻=돌 골 骨=뼈 골 鶻=송골매 골 滑=어지러울 골 [공] 供=이바지할 공 倥=어리석을 공 公=공변될 공 共=함께 공 功=공 공 卭=병될 공 孔=구멍 공 崆=산이름 공 工=장인 공 恐=두려울 공 恭=공손할 공 悾=정성 공 拱=두 손 맞잡을 공 控=당길 공 攻=칠 공 栱=두공 공 槓=지렛대 공 珙=큰 옥 공 空=빌 공 笻=대이름 공 箜=공후 공 紅=상복 이름 공 蚣=지네 공 蛩=메뚜기 공 蛬=귀뚜라미 공 貢=바칠 공 贛=줄 공 跫=발자국 소리 공 邛=언덕 공 釭=굴대 공 銎=도끼 구멍 공 鞏=묶을 공 龔=공손할 공 [곶] 串=땅이름 곶 廤=곳 곶 串=곶 곶 [과] 侉=자랑할 과 剮=바를 과 堝=도가니 과 夥=많을 과 夸=자랑할 과 媧=사람 이름 과 寡=적을 과 戈=창 과 撾=칠 과 果=실과 과 猓=긴 꼬리 원숭이 과 瓜=오이 과 科=과정 과 稞=보리 과 窠=보금자리 과 胯=사타구니 과 菓=과일 과 蝌=올챙이 과 裹=쌀 과 誇=자랑할 과 課=매길 과 跨=타넘을 과 踝=복사뼈 과 過=지날 과 銙=대구 과 鍋=노구솥 과 顆=낟알 과 騍=암말 과 髁=넓적다리뼈 과 [곽] 廓=둘레 곽 椁=관 곽 槨=덧널 곽 癨=곽란 곽 藿=콩잎 곽 躩=바삐 갈 곽 郭=성곽 곽 霍=빠를 곽 鞹=무두질한 가죽 곽 [관] 丱=쌍상투 관 串=익힐 관 倌=수레 모는 사람 관 冠=갓 관 卝=丱과 同字 官=벼슬 관 寛=용서할 관 寬=너그러울 관 慣=버릇 관 棺=널 관 款=정성 관 涫=끓을 관 灌=물 댈 관 爟=봉화 관 琯=옥피리 관 瓘=옥 이름 관 盥=대야 관 祼=강신제 관 窾=빌 관 筦=피리 관 管=피리 관 綰=얽을 관 綸=관건 관 罐=두레박 관 舘=객사 관 莞=골풀 관 菅=골풀 관 覌=볼 관 観=볼 관 觀=볼 관 貫=꿸 관 輨=줏대 관 錧=비녀장 관 鑵=두레박 관 関=쇠사슬 관 闗=빗장 관 關=빗장 관 雚=황새 관 顴=광대뼈 관 館=객사 관 髖=허리뼈 관 鸛=황새 관 館=객사 관 [괄] 佸=힘 쓸 괄 刮=깍을 괄 劀=궂은 살을 잘라낼 괄 恝=걱정 없을 괄 括=묶을 괄 栝=노송나무 괄 檜=전나무 괄, 나라이름 괄 活=물 소리 괄 筈=하눌타리 괄 聒=떠들석할 괄 适=빠를 괄 颳=모진 바람 괄 髺=머리 묶을 괄 鬠=결발할 괄 鴰=재두루미 괄 [광] 侊=성한 모양 광 俇=허둥지둥할 광 光=빛 광 劻=급할 광 匡=바룰 광 壙=광 광 広=廣의 略字 廣=넓을 광 恇=겁낼 광 拡=擴의 略字 擴=넓힐 광 曠=밝을 광 桄=광랑나무 광 框=문테 광 洸=물 용솟음할 광 炚=햇빚 뜨거울 광 爌=불 빛 환할 광 狂=미질 광 獷=사나울 광 珖=옥피리 광 磺=쇳돌 광 礦=쇳돌 광 筐=광주리 광 絖=솜 광 纊=솜 광 胱=오줌통 광 茪=초결명 광 誆=속일 광 誑=속일 광 鄺=성 광 鉱=鑛의 俗字 鑛=쇳돌 광 [괘] 卦=걸 괘 叏=나누어 가를 괘 咼=입 비뚤어질 괘 挂=그림족자 괘 掛=걸 괘 罣=걸 괘 罫=줄 괘 詿=그르칠 괘 [괴] 乖=어그러질 괴 会=會의 略字 傀=클 괴 儈=거간군 괴 凷=흙덩이 괴 劊=끊을 괴 喟=한숨쉴 괴 嘳=한숨쉴 괴 塊=흙덩이 괴 壞=무너질 괴 媿=창피줄 괴 廥=여물광 괴 怪=기이할 괴 恠=怪의 俗字 愧=부끄러워할 괴 拐=속일 괴 會=그림 괴 槐=홰나무 괴 瑰=슬이름 괴 璝=옥돌 괴 蒯=황모 괴 襘=띠매듭 괴 魁=으뜸 괴 [괵] 剨=자끈할 괵 嘓=귀찮을 괵 馘=벨 괵 [굉] 卝=丱과 同字 厷=둥글 굉 宏=클 굉 浤=용솟음할 굉 紘=갓끈 굉 纮=넓을 굉 肱=팔뚝 굉 觥=뿔잔 굉 訇=큰 소리 굉 轟=울릴 굉 鍠=종고 소리 굉 锽=쇠북소리 굉 閎=마을문 굉 [교] 丂=교묘할 교 交=사귈 교 佼=예쁠 교 僑=높을 교 儌=갈 교 咬=새소리 교 啋=움직일 교 喬=높을 교 嘂=크게 부르짖을 교 嘄=부르짖을 교 嘐=닭 울 교 嘺=입 비뚤러질 교 噭=부르짖을 교 嚙=깨물 교 姣=예쁠 교 嬌=아리따울 교 嶠=뾰족하게 높을 교 巧=공교할 교 憍=교만할 교 招=들 교 撟=들 교 撹=攪의 略字 攪=어지러울 교 敎=가르침 교 教=敎의 俗字 敲=두드릴 교 晈=달 밝을 교 暞=밝을 교 校=학교 교 榷=외나무 다리 교 橋=다리 교 狡=교활할 교 皎=달빛 교 矯=바로잡을 교 磽=메마른 땅 교 窖=움 교, 지함 교 糾=맺힐 교 絞=목맬 교 翹=꼬리 긴 깃털 교 膠=아교 교 蕎=메밀 교 蛟=교룡 교 覚=覺의 略字 覺=꿈 깰 교 趫=나무에 잘 오를 교, 잘 달아날 교 跤=발화목 교 蹺=발돋움할 교 較=견줄 교 轎=가마 교 郊=성 밖 교 鉸=가위 교, 금장식 교 鞽=신 교 餃=경단 교 驕=교만할 교 骹=발회목뼈 교 鮫=상어 교 鵁=교청새 교 齩=뼈 깨물 교 [구] 丘=언덕 구 丠=丘와 同字 丩=넝쿨 구 久=오랠 구 乆=久의 俗字 九=아홉 구 仇=짝 구 佉=나라 이름 구 佝=꼽추 구 俅=공손할 구 俱=함께 구 倃=훼방할 구 倶=俱와 同字 傴=구부릴 구 具=갖출 구 冓=재목 어긋매겨 쌓을 구 劬=수고로울 구 劶=부지런할 구 勼=모을 구 勾=글귀절 구 匓=배불러 싫을 구 匛=관 구, 널 구 匶=柩의 古字 区=區의 略字 區=감출 구 厩=마구 구 厹=세모창 구 口=입 구 句=글귀절 구 叴=소리 높일 구 呴=숨을 내쉴 구 咎=허물 구 嘔=토할 구 坵=丘의 俗字 坸=垢와 同字 垢=때 구, 더러울 구 夻=대구 구 姤=만날 구 媾=겹사돈 구 嫗=할미 구 寇=도둑 구 屨=삼으로 짠 신 구 岣=산이름 구 嶇=산험준할 구 廄=廐와 同字 廏=廐와 同字 廐=마구간 구 彀=활 잔뜩 당길 구 懼=두려워할 구 戵=창 구 扣=두드릴 구 拒=진이름 구 拘=잡을 구 捄=흙파올릴 구 搆=얽어맬 구 摳=치마걷어들 구 救=구원할 구 旧=舊의 略字 昫=해돋아 따뜻할 구 枸=구기자 구 柩=관 구 柾=관 구, 널 구 榘=곡척 구 構=집세울 구 歐=토할 구 毆=때릴 구 毬=제기 구 求=찾을 구 溝=개천 구 漚=물거품 구 灸=지질 구 狗=개 구 玖=옥 다음가는 돌 구 球=옥경쇠 구 璆=옥경쇠 구 甌=사발 구 疚=오랜 병 구 痀=곱사등이 구 癯=여윌 구 瞿=놀라서 볼 구 矩=곡척 구 穀=녹봉 구 究=궁리할 구 窛=노략질할 구 窶=가난하여 예절없을 구 篝=불덮개 구 糗=마른밥가루 구 絿=급박할 구 耇=명길 구 耈=耇와 同字 耉=늙을 구 胊=포(얇게 저미어서 말린 고기) 구 臼=절구 구 舅=외삼촌 구 舊=옛 구 苟=진실로 구 蒟=구장 구 蚯=지렁이 구 衢=네거리 구 裘=갓옷 구 覯=만나볼 구 詬=꾸짖을 구 謳=읊조릴 구 購=살(구입할) 구 軀=몸 구 逑=짝 구 遘=만날 구 邱=언덕 구 釦=그릇에 금테 두를 구 鉤=갈고랑쇠 구 銶=끌 구 鞫= 鞲=팔찌 구 韝=깍지 구 韭=부추 구 韮=韭와 同字 颶=사방풍 구 駆=驅의 略字 駈=驅와 同字 駒=망아지 구 驅=몰 구 鬮=제비뽑을 구 鳩=비둘기 구 鷇=새 새끼 구 鷗=갈매기 구 鸜=구관조 구 鼽=감기들어 코 막힐 구 龜=나라 이름 구 [국] 侷=죄어칠 국 匊=움켜 뜰 국 囗=國의 古字 囶=國의 古字 国=國의 略字 圀=國의 古字 國=나라 국 局=부분 국 掬=두 손으로 움킬 국 菊=국화 국 跼=구부릴 국 鞠=기를 국 麯=麴과 同字 麴=누룩 국 麹=누룩 국 [군] 僒=구부릴 군 君=임금 군 捃=주울 군 桾=고욤나무 군 皸=얼어터질 군 窘=군색할 군 群=무리 군 裙=치마 군 軍=군사 군 郡=고을 군 麇=무리 군 [굴] 倔=딱딱할 굴 厥=나라이름 굴 堀=굴뚝 굴 屈=굽을 굴 崛=산 높을 굴 掘=팔 굴 淈=흐릴 굴 窟=구멍 굴 詘=굽을 굴 [궁] 匑=공손할 궁 宫=宮의 略字 宮=굴궐 궁 弓=활 궁 穹=높을 궁 窮=다할 궁 芎=궁궁이 궁 躬=몸 궁 躳=躬의 本字 [권] 倦=게으를 권 券=엄쪽(어음을 쪼갠 한 쪽) 권 劵=게으를 권, 고달플 권, 수고로울 권 勌=倦과 同字 勧=勸의 略字 勸=권할 권 卷=굽을 권 圈=둥글 권 圏=圈과 同字 巻=卷의 俗字 惓=삼갈 권 拳=주먹 권 捲=거둘 권 棬=휘어만든 나무그릇 권 権=權의 俗字 權=권세 권 淃=물돌아 흐를 권 眷=돌아볼 권 睠=眷과 同字 綣=정다울 권 蜷=움추러질 권 鬈=수염좋을 권 [궐] 亅=갈고리 궐 厥=그 궐 掘=뚫을 궐 獗=도둑 일어날 궐 蕨=고사리 궐 蹶=우물벌레 궐 闕=대궐 궐 鱖=쏘가리 궐 [궤] 佹=포갤 궤 儿=어진 사람 궤 几=안석 궤 劂=새김칼 궤 匭=갑 궤 匱=갑 궤 厬=목마를 궤 帰=歸의 俗字 憒=심란할 궤 撅=옷걷을 궤 机=느티나무 궤 樻=가마테나무 궤 櫃=상자 궤 歸=먹일 궤 氿=물가 궤 潰=흩어질 궤 簋=대제기 궤 繢=톱끝 궤 詭=속일 궤 跪=끓어앉을 궤 蹶=급히걸을 궤 軌=수레바퀴 사이 궤 闠=저자문 궤 餽=饋와 同字 饋=먹일 궤 鱖=쏘가리 궤 麂=큰고라니 궤 [귀] 亀=龜의 略字 劌=상할 귀 勾=句와 同字 句=글귀 귀 帰=歸의 俗字 晷=시각 귀 櫷=느티나무 귀 歸=돌아올 귀 貴=높을 귀 鬼=귀신 귀 龜=거북 귀 句=글귀 귀 龜=거북 귀 [규] 九=모을 규 乣=糺의 譌字 刲=찌를 규 叫=부를 규 呌=부르짖을 규 圭=서옥 규 奎=별 규 嫢=가는 허리 규 嬀=성 규 巋=높고 험준할 규 揆=헤아릴 규 暌=해질 규 楏=호미자루 규 槻=물푸레나무 규 樛=나무가지 휘어질 규 潙=물이름 규 珪=圭와 同字 睽=어그러질 규 硅=유리만드는 흙 규 窺=엿볼 규 竅=구멍 규 糺=거둘 규 糾=삼합노 규 葵=해바라기 규 虬=虯와 同字 虯=뿔없는 용 규 規=그림쇠 규 赳=헌걸찰 규 跬=한발자국 규 逵=구거리 규 邽=고을이름 규 閨=색시 규 闚=갸웃이 볼 규 頃=반걸음 규 頍=고깔비녀 규 馗=아홉거리 규 [균] 亀=龜의 略字 勻=고를 균 匀=고를 균 囷=둥근곳집 균 均=고를 균 畇=밭개간할 균 筠=대껍질 균 菌=버섯 균 鈞=서른 근 균 麇=노루 균 麏=고라니 균 龜=(피부가)틀 균 龜=(피부가)틀 균 [귤] 橘=귤나무 귤 [극] 丮=잡을 극 亟=빠를 극 克=이길 극 剋=깍일 극 劇=심할 극 勀=이길 극 可=오랑캐 임금 이름 극 尅=剋과 同字 屐=나막신 극 戟=갈래진 창 극 棘=가시나무 극 極=가운데 극 郄=隙과 同字 郤=틈 극 隙=틈 극 革=위독해질 극 [근] 僅=겨우 근 劤=힘많을 근 勤=부지런할 근 卺=합환주잔 근 厪=적을 근 堇=노란진흙 근 墐=진흙 근 巹=받들 근 廑=작은집 근 懃=은근할 근 斤=근 근 根=뿌리 근 槿=무궁화 근 漌=맑을 근 瑾=붉은옥 근 矜=창자루 근 筋=힘줄 근 芹=미나리 근 菫=오랑캐 꽃 근 覲=뵈올 근 觔=筋과 同字 謹=삼갈 근 跟=발두꿈치 근 近=가까울 근 釿=대패 근 靳=아낄 근 饉=주릴 근 [글] 契=부족 이름 글 契=부족 이름 글 [금] 今=이제 금 僸=우러를 금 凚=쌀쌀하게 추울 금 厼= 唫=입 다물 금 噤=입 다물 금 妗=외숙모 금 嵚=산 솟을 금 嶔=높고 험할 금 擒=사로잡을 금 昑=밝을 금 檎=능금나무 금 琴=거문고 금 禁=금할 금 禽=날짐승 금 笒=첨대 금 芩=풀 이름 금 衾=이불 금 衿=옷깃 금 襟=옷깃 금 金=쇠 금 錦=비단 금 黅=누른 빛 금 黔=귀신 이름 금 金=성 금 [급] 伋=속일 급 及=미칠 급 圾=위태할 급 岌=높을 급 急=급할 급 扱=미칠 급 汲=길을 급 皀=고소할 급 礏=산 높은 모양 급 笈=책상자 급 級=등급 급 給=넉넉할 급 芨=말오줌나무 급 [긍] 亙=뻗칠 긍 兢=삼갈 긍 恒=시위 긍, 두루할 긍 殑=까무라칠 긍 矜=불쌍히 여길 긍 肯=옳이 여길 긍 鹶=짜고 쓸 긍 [기] 丌=책상 기 乞=줄 기 亓=其의 古字 亟=자주 기 企=꾀할 기 伎=재주 기 俟=성씨 기 倚=기이할 기 倛=탈 기 僛=취하여 춤추는 모양 기 僟=삼갈 기 其=그 기 冀=바랄 기 刏=찌를 기 剞=새김칼 기 呮=도사리고 앉을 기 唭=듣지도 보지도 않을 기 嗜=즐길 기 嘰=쪽잘거릴 기 噐=그릇 기 器=그릇 기 圻=경기 기 基=터 기 埼=崎와 同字 墍=맥질할 기 夔=조심할 기 奇=기이할 기 妓=기생 기 寄=부칠 기 居=어조사 기 屺=민둥산 기 岐=갈림길 기 崎=험할 기 己=자기 기 幾=기미 기 庋=시렁 기 弃=棄의 古字 忌=꺼릴 기 忮=해칠 기 怾=산 이름 기 愭=공손할 기 技=재주 기 掎=끌 기 攲=기울기 기 旂=기 기 旗=기 기 既=旣의 訛字 旣=이미 기 暣=볕기운 기 暨=曁와 同字 曁=및 기, 미칠 기, 굳셀 기 朞=돌 기 期=기약할 기 杞=나무 이름 기 枳=해할 기, 사타구니 기 棄=버릴 기 棊=棋와 同字 棋=바둑 기 機=틀 기 欺=속일 기 歧=岐와 同字 気=氣의 略字 氣=기운 기 汽=김 기 沂=물 이름 기 淇=강 이름 기 炁=기운 기 猉=강아지 기 玘=패옥 기 琦=옥 이름 기 琪=옥 기 璂=피변 꾸미개 기 璣=구슬 기 畸=뙈기 밭 기 畿=경기 기 碁=棋와 同字 磯=물가 기 示=땅 귀신 기 祁=성할 기 祇=토지의 신 기 祈=빌 기 祺=복 기 禨=조짐 기 箕=키 기 紀=벼리 기 綥=비단 쑥색 기 綦=연두빛 비단 기 綺=비단 기 羇=나그네 기 羈=굴레 기 耆=늙은이 기 耭=갈 기 肌=살 기 肵=적대 기 芪=단너삼 기 芰=세발 마름 기 蘄=풀 이름 기 虁=夔와 同字 蜝=방계 기 蟣=서캐 기 覉=구속할 기, 말 굴레 기 覬=바랄 기 記=기록할 기 譏=나무랄 기 豈=어찌 기 起=일어날 기 跂=육발 기 跽=꿇어앉을 기 錡=솥 기 錤=호미 기 锜=세발 가마 기 隑=사닥다리 기 頎=헌걸찰 기 飢=주릴 기 饑=주릴 기 騎=말탈 기 騏=털총이 기 驥=천리마 기 鬐=갈기 기 鰭=지느러미 기 麒=기린 기 黖=물건 생겨날 기 [긴] 緊=굳게 얽힐 긴 [길] 佶=건장할 길 吉=길할 길 咭=웃는 모양 길 姞=성 길 拮=일할 길 桔=도라지 길 蛣=장구벌레 길 鮚=대합 길 [김] 金=사람의 성 김 [끝] 印=끝(官簿之末端書字) 끝 [끽] 喫=마실 끽 [나] 儺=역귀 쫓을 나 哪=연귀 쫓는 소리 나 奈=어찌 나 娜=아리따울 나 懦=나약할 나 拏=붙잡을 나 拿=붙잡을 나 挐=붙잡을 나 挪=옮길 나 梛=나무 이름 나 糥=糯와 同字 糯=찰벼 나 那=어찌 나 難=성할 나, 탈 나 喇=나팔 라, 라마교 라 奈=어찌 나 懶=게으를 나 癩=약물 중독 나 羅=새 그물 나 蘿=소나무겨우살이 나 螺=소라 라 裸=벌거벗을 라, 털 없는 벌레 라 邏=돌 나 [낙] 格=막힐 락 諾=대답할 낙 樂=즐길 낙 洛=강 이름 낙 烙=지질 낙 珞=구슬 목걸이 낙 落=떨어질 낙 酪=타락 낙 駱=낙타 낙 [난] 偄=언약할 난 暖=따뜻할 난 煖=따뜻할 난 煗=터울 난 赧=얼굴 붉힐 난 難=어려울 난 餪=풀보기 잔치 난 亂=어지러울 난 卵=알 난 欄=난간 난 爛=문드러질 난 蘭=난초 난 鸞=난새 난 [날] 捏=이길 날 捺=누를 날 涅=앙금 흙 날 [남] 南=남녘 남 喃=재잘거릴 남 枏=녹나무 남 柟=枏의 俗字 楠=녹나무 남 湳=강 이름 남 男=사내 남 嵐=남기 남 濫=퍼질 남 藍=쪽 남 襤=누더기 남 [납] 內=들일 납 内=받아들일 납 納=바칠 납 衲=기울 납 拉=꺽을 납 臘=납향 납 蠟=밀 납 [낭] 嚢=囊과 同字 囊=주머니 낭 娘=아가씨 낭 曩=접때 낭 廊=복도 낭 朗=밝을 낭 浪=물결 낭 狼=이리 낭 郎=사나이 낭 [내] 乃=이에 내 內=안 내 内=內와 同字 匂=향내 내 奈=어찌 내 奶=젖 내 嬭=젖 내 廼=迺의 俗字 柰=능금나무 내 耐=견딜 내 能=세 발 자라 내 迺=이에 내 鼐=가마솥 내 來=올 내 [냉] 冷=차가울 냉 [녀] 女=계집 녀 挐=이끌 녀 [녁] 惄=마음 졸일 녁 [년] 年=해 년 撚=비틀 년 碾=맷돌 년 秊=年의 本字 [녈] 囓= 涅=죽을 녈 [념] 念=생각 념 恬=편안할 념 拈=집을 념 捻=비틀 념 [녑] 捻=비틀 녑 [녕] 佞=재주 녕 儜=고달플 녕 嚀=정녕할 녕 寕=문안할 녕 寗=편안할 녕 寜=차라리 녕 寧=편안할 녕 濘=진흙 녕 甯=편안할 녕 矃=볼 녕 [녜] 昵=아비사당 녜 [노] 努=힘쓸 노 呶=들랠 노 奴=종 노 孥=자식 노 峱=산이름 노 帑=처자식 노 弩=쇠뇌(여러 개의 화살이나 돌을 잇따라 쏘게 된 큰 활) 노 怒=성낼 노 猱=못할 노 瑙=마노 노 笯=새장 노 臑=팔마디 노 駑=둔할 노 勞=수고할 노 擄=사로잡을 노 櫓=큰 방패 노 爐=화로 노 盧=밥그릇 노 老=늙을 노 蘆=갈대 노 虜=포로 노 路=길 노 露=이슬 노 魯=미련할 노 鷺=해오라기 노 [녹] 碌=푸른 빛 녹 祿=행복 녹 綠=초록빛 녹 菉=조개풀 녹 錄=기록할 녹 鹿=사슴 녹 [논] 論=말할 논 [농] 儂=나 농 噥=달게 먹을 농 濃=짙을 농 穠=후한 제사 농 竜=두덕 롱 膿=고름 농 農=농사 농 醲=텁텁한 술 농 龐=통통하게 살질 롱 壟=밭두둑 농 弄=희롱할 농 籠=대그릇 농 聾=귀머거리 농 [뇌] 匘=살찐 모양 뇌 悩=惱의 俗字 惱=괴로워할 뇌 脳=머리골 뇌 腦=머리 뇌 餒=굶길 뇌 牢=가축우리 뇌 磊=돌이 많이 쌓인 모양 뇌 賂=뇌물 뇌 雷=우뢰 뇌 [뇨] 啂= 嫋=날릴 뇨 嬲=샘낼 뇨 尿=오줌 뇨 淖=진흙 뇨 溺=우줌눌 뇨 磠=약돌 뇨 裊=끄을 뇨 鐃=작은 징 뇨 鬧=시끄러울 뇨 [누] 耨=김맬 누 壘=진 누 屢=(빛이 들어오는)창 누 樓=다락 누 淚=눈물 누 漏=샐 누 累=포갤 누 縷=자세할 누 陋=줍을 누 [눈] 嫩=언약할 눈 [눌] 吶=말 더듬을 눌 呐=吶과 同字 肭=물개 눌 訥=말 더듬거릴 눌 [뉴] 忸=익을 뉴 杻=옷 부드러울 뉴 紐=잡색비단 뉴 靵=단추 뉴 [뉵] 衄=코피 뉵 [늑] 勒=굴레 늑 肋=갈비대 늑 [늠] 凜=찰 늠 [능] 能=능할 능 凌=얼음 능 稜=모질 능 綾=무늬 놓은 비단 능 菱=마름 능 陵=능 능 [늦] 莻=늦을 늦 [니] 你=너 니 呢=소근거릴 니 尼=여승 니 怩=부끄러워할 니 柅=얼레자루 니 泥=막힐 니 祢=아비사당 니 禰=아비사당 니 膩=살찔 니 [닉] 匿=숨쉴 닉 溺=빠질 닉 [닐] 昵=가깝게 할 닐 暱=칠근할 닐 [다] 多=많을 다 爹=아비 다 茶=차풀 다 [단] 丹=붉을 단 亶=믿을 단 但=다만 단 剬=단정할 단 剸=끊을 단 勯=힘다할 단 匰=신주독 단 单=홀로 단 単=單의 略字 唌=참소리 단 單=홀로 단 団=團의 略字 團=둥글 단 壇=제터 단 彖=결단할 단 慱=근심할 단 担=원숭이 같은 짐승 단 断=어질 단 斷=끊을 단 旦=밝을 단 椴=자작나무 단 檀=향나무 단 段=층계 단 湍=여울 단 漙=이슬방울 맺을 단 澾= 癉=황달 단 短=짧을 단 端=끝 단 笪=고리짝 단 箪=밥그릇 단 簞=소쿠리 단 糰=경단 단 緞=비단 단 緣=단옷 단 縁=緣의 略字 耑=시초 단 胆=침비깨 단 腶=약포 단 蛋=오랑캐 이름 단 蜑=오랑캐 이름 단 袒=웃옷 벗을 단 踹=발꿈치 단 鄲=조나라 서울 단 鍛=쇠불릴 단 [달] 呾=마주 꾸짖을 달 噠=오랑캐 나라 이름 달 妲=계집의 이름 달 怛=깜짝 놀랄 달 撻=매질할 달 獺=수달 달 疸=황달 달 笪=뜸 달, 배 덮는 삿자리 달 達=통달할 달 闥=대문 달 靼=다룬가죽 달 韃=칠 달 [담] 倓=편안할 담 儋=기운차고 날쌜해집 담 啖=씹을 담 啗=씹을 담 啿=많을 담 嘾=탐할 담 噇=먹는 모양 담 噉=씹을 담 嚪=먹을 담 坍=물이 언덕 찰 담 墰=목긴 술병 담 壜=술병 담 憺=고요할 담 擔=질 담 曇=날 흐릴 담 毯=담자리 담 淡=물모양 담 湛=즐거울 담 潭=깊을 담 澹=맑을 담 痰=가래 담 禫=담제 담 罎=壜과 同字 聃=노자이름 담 膽=쓸개 담 蕁=말 담 薝=치자나무 담 覃=미칠 담 談=말씀 담 譚=클 담 郯=나라이름 담 錟=긴 창 담 黮=검을 담 黵=문신할 담 [답] 匒=포갤 답 沓=거듭 답 畓=논 답 答=젖을 답 踏=떨어지는 소리 답 遝=가다가설 답 [당] 倘=혹시 당 儻=빼어날 당 党=黨의 略字 唐=당나라 당 堂=집 당 塘=연못 당 幢=기 당 当=當의 略字 戇=어리석을 당 搪=당동할 당 撞=두드릴 당 棠=아가위 당 檔=책상 당 溏=진수렁 당 瑭=옥이름 당 璫=귀고리 당 當=마땅할 당 瞠=바로볼 당 礑=밑바닥 당 糖=엿 당 螳=버마 재비 당 蟷=사마귀 당 襠=잠방이 당 讜=곧은 말 당 鏜=북방축소 당 鐺=죄인 자물쇠 당 餳=엿 당 餹=엿 당 黨=무리 당 [대] 代=대신할 대 儓=하인 대 坮=들 대 垈=터 대 大=큰 대 对=對의 略字 対=對의 略字 對=마주볼 대 岱=태산 대 带=띠 대 帯=帶의 俗字 帶=띠 대 待=기다릴 대 懟=원망할 대 戴=받들 대 擡=들 대 旲=햇빛 대 枱= 檯=등대 대 歹=거스릴 대 汏=씻을 대 玳=대모(바다거북) 대 碓=방아 대 臺=능 대 袋=자루 대 貸=빌릴 대 錞=창고달 대 鐓=창고달 대 隊=군대 대 黛=눈썹 그릴 대, 새파랄 대 [댁] 宅=집 댁 [덕] 徳=德의 略字 德=품행 덕, 큰 덕, 은혜 덕 悳=德의 古字 惪=悳과 同字 [도] 倒=넘어질 도 刀=칼 도 刂=刀와 同字 到=이를 도 匋=질그릇 도 叨=탐할 도 咷=아이 울음 끈질길 도 啕=수도할 도 嘟=칭찬할 도 図=圖의 俗字 圖=그림 도 圗=그림 도 堵=담 도 塗=바를 도 壔=작은 성 도 導=이끌 도 屠=잡을 도 島=섬 도 嶋=섬 도 度=법도 도 弢=활집 도 徒=무리 도 忉=근심할 도 悼=슬퍼할 도 慆=기뻐할 도 挑=돋을 도 掉=흔들 도 掏=가릴(선택)할 도 搗=찧을 도 搯=두드릴 도 擣=찧을 도 桃=복숭아 나무 도 棹=노 저을 도 檮=그루터기 도 櫂=상앗대 도 洮=달아날 도 涂=길 도 淘=일 도 渡=건널 도 滔=물 넘칠 도 濤=물결 도 燾=비칠 도 盜=도둑 도 睹=볼 도 祷=禱와 同字 禱=빌 도 稌=찰벼 도 稲=稻의 俗字 稻=벼 도 綢=쌀 도 纛=클 깃발 도 菟=고을 이름 도 萄=포도나무 도 覩=睹와 同字 賭=노름 도 跳=뛸 도 蹈=밟을 도 逃=달아날 도 途=길 도 道=길 도 都=도읍 도 酴=두번 빚은 술 도 鍍=도금할 도 闍=성문 층대 도 陶=질 그도 도 鞀=소고 도 鞱=너그러울 도 韜=활집 도 饕=탐할 도 鼗=땡땡이 도 都=도읍 도 [독] 匵=손궤 독 櫝=함 독 毒=독 독 涜=瀆과 同字 瀆=도랑 독 牘=편지 독 犢=송아지 독 独=獨의 俗字 獨=홀로 독 督=감독할 독 禿=대머리 독 秃=禿과 同字 竺=두터울 독 篤=도타울 독 読=교활할 독 讀=읽을 독 黷=더러울 독 [돈] 伅=어두울 돈 囤=작을 곳집 돈 墩=돈대 돈 弴=그림 그린 활 돈 惇=두터울 돈 敦=도타울 돈 旽=늘 돋을 돈 暾=아침해 돈 沌=기름 덩어리 돈 潡=큰 물 돈 焞=귀갑 지지는 불 돈 燉=불 성할 돈 犜=돈피 돈 獤=돈피 돈 盾=사람이름 돈 豚=돼지 돈 躉=거룻배 돈 遁=달아날 돈 頓=조아릴 돈 [돌] 乭=이름 돌 凸=뾰족할 돌, 내밀 돌, 도도록할 돌 咄=꾸짖을 돌 堗=굴똑 돌 突=부딪칠 돌 [동] 仝=同의 古字 佟= 侗=무지할 동 倲=어리석을 동 偅=흐리멍텅할 동 働=궁닐 동 僮=아이 동 冬=겨울 동 凍=얼 동 動=움직일 동 同=같을 동 哃=클말할 동 垌=항아리 동 峒=산이름 동 彤=붉은 칠 동 憧=동경할 동 朣=달 뜰 동 東=동녘 동 桐=오동나무 동 棟=용마루 동 橦=나무이름 동 洞=마을 동 涷=마룻대 동 潼=물 이름 동 炵=불꽃 동 疼=아플 동 瞳=눈동자 동 童=아이 동 胴=큰 창자 동 艟=배 동 苳=겨울살이 동 茼=쏙갓 동 董=바로잡을 동 蕫=황모 동 蝀=무지개 동 銅=구리 동 錬=보습날 동 鮗=전어 동 鼕=북소리 동 [두] 亠=뜻 없는 토 두 侸=마를 두 兜=투구 두 吺=말 많을 두 土=뿌리 두 抖=퍼주거릴 두 斁=섞을 두 斗=말 두 杜=막을 두 枓=두공 두 痘=마마 두 竇=구멍 두 肚=밥통 두 脰=목 두 荳=콩 두 蚪=올챙이 두 蠹=좀 두 読=讀의 略字 讀=귀절 두 豆=콩 두 逗=머무를 두 陡=절벽 두 頭=머리 두 讀=구절 두 [둔] 吨=말 분명치 못할 둔 屯=진칠 둔 窀=광중 둔 臀=볼기 둔 芚=채소 이름 둔 迍=머뭇거릴 둔 遁=달아날 둔 遯=달아날 둔 鈍=무딜 둔 頓=조아릴 둔 [둘] 乧=음역자 둘 [득] 得=얻을 득 [등] 凳=걸상 등 墱=자드락길 등 嶝=고개 등 朩= 橙=등자나무 등 滕=물 솟을 등 灯=燈의 略字 燈=등잔 등 登=오를 등 磴=돌 비탈길 등 等=가지런할 등 籐=대 기구 등 縢=봉할 등 腾=달릴 등, 뛰놀 등, 날칠 등의 簡體字 藤=등나무 등 螣=등사 등 謄=베낄 등 鄧=나라 이름 등 鐙=등자 등 騰=오를 등 [라] 亽= 倮=알몸 라 儸=간능할 라 喇=나팔 라 嗠= 囉=소리 읽힐 라 懶=게으를 라 曪=날 흐릴 라 瘰=연주창 라 癩=약물 중독 라 砢=돌 쌓일 라 羅=새그물 라 臝=벌거벗을 라 蘿=무 라 螺=소라 라 蠃=소라 라, 나나니벌 라 裸=벌거벗을 라 邏=순행할 라 鑼=징 라 陏=오이 라, 풀열매 라 騾=노새 라 驘=옹 솥 라 拏=붙잡을 라 [락] 樂=즐길 락 洛=강이름 락 烙=지질 락 犖=얼룩소 락 珞=구슬 목걸이 락 絡=헌솜 락 落=떨어질 락 諾=대답할 락 酪=진한 유즙 락 雒=수리부엉이 락 駱=낙타 락 樂=즐거울 락 諾=대답할 락 [란] 乱=어지러울 란 亂=어지러울 란 卵=알 란 囒=거짓말 할 란 圝=둥글 란 嬾=게으를 란 幱=내리다지 란 懶=게으를 란 攔=막을 란 欄=난간 란 欒=나무 이름 란 瀾=물결 란 灓=적실 란 爛=문드러질 란 蘭=난초 란 襴=난삼 란 鑾=방울 란 闌=가막을 란 鸞=난새 란 丹=붉을 란 [랄] 剌=어그러질 랄 喇=말굽히할 랄 埒=바자울 랄 辢=辣과 同字 辣=매울 랄 [람] 啉=술순배 람 嚂=먹을 람 婪=탐할 람 嵐=남기 람 惏=떨릴 람 擥=攬과 同字 攬=잡을 람 欖=감람나무 람 濫=퍼질 람 籃=바구니 람 纜=닻줄 람 藍=쪽 람 襤=누더기 람 覧=볼 람 覽=볼 람 [랍] 拉=꺽을 랍 臘=납향 랍 蝋=蠟과 同字 蠟=밀 랍, 백랍 랍 鑞=땜납 랍 [랑] 廊=복도 랑 朗=밝을 랑 榔=나무 이름 랑 浪=물결 랑 狼=이리 랑 琅=옥 이름 랑 瑯=고을 이름 랑 硠=돌 부딪는 소라 랑 稂=강아지 풀 랑 莨=수크령 랑 蜋=사마귀 랑 螂=蜋과 同字 郎=남편 랑 郞=사나이 랑 閬=솟을 대문 랑 [래] 來=올 래 儽=게으를 래 勑=위로할 래 崍=산 이름 래 徠=올 래 淶=강 이름 래 莱=명아주 래 萊=명아주 래 騋=큰 말 래 黧=검을 래 [랭] 冷=찰 랭 [략] 剠=鯨과 同字 掠=노략질할 략 略=다스릴 략 畧=略과 同字 [량] 両=兩의 俗字 两=쌍 량 亮=밝을 량 俍=良과 同字 倆=재주 량 兩=두 량 凉=涼의 俗字 剠=鯨과 同字 喨=소리 맑을 량 悢=슬퍼할 량 掠=볼기칠 량 梁=푸조나무 량 椋=들보 량 樑=서늘할 량 涼=서늘할 량 粮=糧과 同字 粱=기장 량 糧=양식 량 良=좋을 량 諒=믿을 량 踉=뛸 량 輛=수레 량 量=헤아릴 량 魎=도깨비 량 [레] 螺= [려] 侣=侶와 同字 侶=짝 려 儢=맘에 하기 싫을 려 儷=짝 려 刕= 励=勵의 略字 勴=마음으로 도울 려 勵=힘쓸 려 厉=厲의 略字 厲=갈 려 吕=呂와 同字 呂=음률 려 唳=울 려 廬=오두막집 려 慮=생각할 려 戻=수레 옆문 려 戾=여그러질 려 攊= 旅=군사 려 梠=평고대 려 櫚=종려나무 려 濾=겨를 려 癘=창질 려 砺=礪의 略字 礪=거친 숫돌 려 糲=현미 려 膂=등골 뼈 려 臚=살갗 려 藜=나라 이름 려 蠡=좀먹을 려 蠣=굴 려 邌=천천히 걸을 려 鑢=줄 려 閭=이문 려 驢=나귀 려 驪=가라말 려 鱺=뱀장어 려 麗=고울 려 黎=검을 려 黧=검을 려 [력] 力=힘 력 厤=다스릴 력 嚦=소리 력 曆=책력 력 櫟=상수리나무 력 櫪=말구유 력 歷=지낼 력 瀝=거를 력 癧=연주창 력 礫=조약돌 력 躒=움직일 력 轢=삐걱거릴 력 轣=갈 력 酈=땅 이름 력 靂=벼락 력 [련] 僆=쌍둥이 련 嗹=길게 말할 련 孌=아름다울 련 怜=연리할 련 恋=戀의 俗字 憐=불쌍히 여길 련 戀=사모할 련 挒= 攣=걸릴 련 楝=멀구슬나무 련 湅=누일 련 漣=물놀이 련 煉=불릴 련 璉=호련 련 練=익힐 련 聫=聮과 同字 聮=연할 련 聯=잇달 련 臠=저민고기 련 蓮=연밥 련 輦=손수레 련 連=잇닿을 련 錬= 鍊=불릴 련 鏈=쇠사슬 련 零=조용히 오는 비 련 鰊=고기 이름 련 鰱=연어 련 零=조용히 오는 비 련 [렬] 冽=찰 렬 列=줄 렬 劣=못할 렬 咧=새소리 렬 哷=닭 우는 소리 렬 戻= 戾=어그러질 렬, 휘어질 렬 捩=비틀 렬 洌=맑을 렬 烈=세찰 렬 裂=찢을 렬 颲=사나운 바람 렬 [렴] 亷=廉과 同字 匲=경대 렴 匳=경대 렴 奩=화장 상자 렴 帘=주막기 렴 廉=청렴할 렴 斂=거둘 렴 殮=염할 렴 濂=내 이름 렴 瀲=넘칠 렴 磏=거친 숫돌 렴 簾=발 렴 [렵] 儠=풍신 좃을 렵 獵=사냥 렵 躐=밟을 렵 鬣=갈기 렵 [령] 令=명령 령, 시킬 령 伶=영리할 령, 악공 령, 광대 령 另=나눌 령, 다를 령, 헤어질 령 呤=속삭일 령 呬=왁자할 령 囹=옥 령 姈=계집 슬기로울 령 岭=산 이름 령 岺=재 령 嶺=재 령 怜=영리할 령 昤=날 빛 영롱할 령 欞=격자창 령 泠=깨우칠 령 灵=靈의 俗字 玲=옥이름 령 秢=벼 처음 익을 령 笭=도꼬마리 령 羚=영양 령 翎=깃 령 聆=들을 령 苓=도꼬마리 령 蛉=장자리 령 軨=사냥 수레 령 逞=굳셀 령 鈴=방울 령 零=조용히 오는 비 령 靈=신령 령 領=옷깃 령 鴒=할미새 령 鹷=나이 령 齡=나이 령 寧=편안할 령 [례] 例=법식 례 劙=가를 례 澧=강 이름 례 礼=禮의 古字 禮=예도 례 豊=禮의 古字 醴=단술 례 隷=隸와 同字 隸=붙을 례 鱧=가물치 례 礼=禮의 略字 [로] 労=勞의 略字 勞=일할 로 哰=말 알아듣지 못할 로 嚕=아까워할 로 嚧=웃을 로 壚=흑토 로 撈=잡을 로 擄=사로잡을 로 櫓=방패 로 滷=소금밭 로 潞=강 이름 로 瀘=강 이름 로 炉=爐의 略字 爐=화로 로 牢=우리 로 玈=검을 로 癆=종독 로 盧=밥그릇 로 窂=우리 로 老=늙은이 로 艪=艫와 同字 艫=뱃머리 로 蘆=갈대 로 虜=포로 로 賂=뇌물 줄 로 路=길 로 輅=수레 로 轤=고패 로 鐪=부레 로 鑪=화로 로 露=이슬 로 顱=머리뼈 로 髗=해골 로 魯=노둔할 로 鱸=농어 로 鷺=해오라기 로 鸕=가마우지 로 鹵=소금 로 怒=성냉 로 [록] 圥=버섯 록 彔=나무 깍을 록 淥=밭을 록 渌=淥의 略字 漉=거를 록 碌=돌 모양 록 祿=복 록 簏=대 상자 록 綠=초록빛 록 緑=綠의 略字 菉=조개풀 록 角=신선이름 록, 사람이름 록 轆=도르래 록 錄=기록할 록 録=희학질할 록 騄=말이름 록 鹿=사슴 록 麓=신기슭 록 [론] 淪=기운덩어리 론 論=말할 론 [롱] 儱=건목칠 롱 哢=지저귈 롱 嚨=목구멍 롱 壟=언덕 롱 弄=희롱할 롱 攂=攏의 本字 攏=누를 롱 曨=어스레할 롱 朧=흐릿할 롱 礱=갈 롱 篭=籠과 同字 籠=대그릇 롱 聾=귀머거리 롱 蘢=개여뀌 롱 隴=고개 이름 롱 龍=언덕 롱 龎=충실할 롱 (龐의 俗字) [뢰] 儡=영락할 뢰 瀨=여울 뢰 瀬=여울 뢰 牢=우리 뢰 磊=돌무더기 뢰 礌=돌 굴러내릴 뢰 礧=바위너설 뢰 籟=세 구멍 퉁소 뢰 纇=실 마디 뢰 罍=술독 뢰 耒=쟁기 뢰 蕾=꽃봉오리 뢰 誄=뇌사 뢰 賂=뇌물 줄 뢰 賚=줄 뢰 賴=힘 입을 뢰 酹=부을 뢰 雷=우뢰 뢰 頼=賴의 俗字 顂=덮을 뢰 [료] 了=마칠 료 僚=동료 료 嘹=울 료 嫽=외조모 료 寥=쓸쓸할 료 寮=벼슬아쳐 료 廖=공허할 료 撩=다스릴 료 料=되질할 료 暸=밝을 료 潦=큰 비 료 燎=화톳불 료 獠=밤사냥 료 療=병고칠 료 瞭=밝을 료 繚=감길 료 聊=귀 울 료 膋=발기름 료 蓼=여뀌 료 遼=멀 료 醪=막걸리 료 鐐=은 료 飂=높이 부는 바람 료 飉=바람 료 鬧=시끄러울 료 [룡] 瀧=비 올 룡 瓏=옥소리 룡 竜=龍의 古字 龍=용 룡 龒=龍의 古字 [루] 僂=구부릴 루 嘍=시끄러울 루 壘=진 루 婁=별 이름 루 屢=창 루 嶁=봉우리 루 慺=정성스러울 루 楼=樓의 俗字 樓=다락 루 涙=淚와 同字 淚=눈물 루 漏=샐 루 瘻=부스럼 루 累=묶을 루 縷=실 루 耬=씨 뿌리는 기구 루 蔞=쑥 루 螻=땅강아지 루 褸=남루할 루 鏤=새길 루 陋=줍을 루 髏=해굴 루 [뤼] 厽=흙을 쌓아서 담 쌓을 뤼 [류] 刘=劉의 略字 劉=죽일 류 嚠=瀏와 同字 旒=깃발 류 柳=버들 류 榴=석류나무 류 橊=榴의 本字 流=흐를 류 溜=방울져 떨어질 류 瀏=맑을 류 琉=유리 류 瑠=琉와 同字 留=머무를 류 瘤=혹 류 硫=유황 류 类=나눌 류 縲=포승 류 纍=갇힐 류 謬=그릇될 류 遛=머무를 류 鎏=급속 류 類=무리 류 鶹=올빼미 류 [륙] 僇=욕보일 륙 六=여섯 륙 剹=깎을 륙 勠=협력할 륙 戮=죽일 륙 陸=뭍 륙 [륜] 侖=둥글 륜 倫=인륜 륜 嗧=갤런 륜 圇=완전할 륜 崙=산 이름 륜 掄=가릴 륜 淪=물놀이 륜 潤=젖을 륜 綸=낚싯줄 륜 輪=바퀴 륜 閏=윤달 륜 [률] 嵂=가파를 률 律=법 률 慄=두려워할 률 栗=밤나무 률 溧=강 이름 률 率=거느릴 률 篥=대 이름 률 率=헤아릴 률 [륭] 癃=느른할 륭 窿=활꼴 륭 隆=클 륭 [륵] 仂=나머지 륵 勒=굴레 륵 嘞=어조사 륵 泐=돌 갈라질 륵 肋=갈비 륵 鰳=준치 륵 [름] 凛=찰 름 凜=찰 름 廩=곳집 름 澟=서늘할 름 [릉] 倰=속일 릉 凌=능가할 릉 楞=모 릉 稜=모 릉 綾=비단 릉 菱=蔆과 同字 蔆=마름 릉 陵=큰 언덕 릉 鯪=천산갑 릉 [리] 俐=똑똑할 리 俚=속될 리 刕=벨 리 利=날카로울 리 剓=뱃길 리 剺=벗길 리 劙=가를 리 厘=釐의 俗字 吏=벼슬아치 리 哩=어조사 리 唎=가는 소리 리 嫠=과부 리 履=신 리 悧=영리할 리 李=오얏 리 梨=배나무 리 浬=해리 리 涖=다다를 리 漓=스며들 리 犁=얼룩소 리 狸=貍와 同字 理=다스릴 리 璃=유리 리 痢=설사 리 离=산신 리 籬=울타리 리 罹=근심 리 羸=여윌 리 莅=다다를 리 莉=말리 리 蒞=莅의 俗字 蜊=참조개 리 螭=교륭 리 裏=속 리 裡=裏와 同字 貍=삵 리 邐=이어질 리 里=마을 리 釐=다스릴 리 離=떼 놓을 리 魑=도깨비 리 鯉=잉어 리 鱺=뱀장어 리 麗=고울 리 黐=끈끈이 리 黧=검을 리 異=다를 리 [린] 厸=鄰의 古字 吝=아낄 린 嶙=가파를 린 悋=아낄 린 潾=맑을 린 燐=도깨비불 린 獜=튼튼할 린 璘=옥빛 린 磷=돌 을 틈물이 흐르는 모양 린 粦=도깨비 불 린 粼=물 맑을 린 繗=이을 린 藺=골풀 린 躙=짓밟을 린 躪=짓밟을 린 轔=수레 소리 린 鄰=이웃 린 鏻=굳셀 린 隣=鄰의 俗字 驎=워라말 린 鱗=비늘 린 麟=기린 린 [림] 林=수풀 림 淋=물뿌릴 림 琳=아름다운 옥 림 痳=임질 림 臨=임할 림 霖=장마 림 [립] 岦=산 우뚝할 립 砬=돌 소리 립 立=설 립 笠=우리 립 粒=알 립 [마] 亇=망치 마 亍=땅 이름 마 傌=욕할 마 劘=깍을 마 哶=양울 마 嗎=꾸짖을 마 嘛=나마 마 媽=어미 마 摩=갈 마 瑪=마노 마 痲=저릴 마 碼=마노 마 磨=갈 마 螞=말거머리 마 蟇=개구리 마 馬=말 마 魔=마귀 마 麻=삼 마 麼=작을 마 麽=잘 마 麿=갈 마 [막] 嗼=고요할 막 寞=쓸쓸할 막 幕=막 막 漠=사막 막 瞙=눈 흐릴 막 膜=막 막 莫=없을 막 貌=모뜰 막 邈=멀 막 鏌=칼 이름 막 [만] 万=일만 만 僈=얕볼 만 卍=만자 만 卐=卍과 同字 墁=흙손 만 娩=해산할 만 嫚=업신여길 만 巒=뫼 만 幔=막 만 彎=굽을 만 慢=게으를 만 挽=당길 만 晚=저물 만 晩=저물 만 曼=끌 만 滿=찰 만 漫=질펀할 만 灣=물굽이 만 瞞=속일 만 縵=무늬 없는 비단 만 萬=일만 만 蔓=덩굴 만 蛮=蠻의 略字 蠻=오랑캐 만 謾=속일 만 蹣=비틀거릴 만 輓=끌 만 鏋=금 만 鏝=흙손 만 鞔=신울 만 饅=만두 만 鬘=머리장식 만 鰻=뱀장어 만 [말] 唜=끌 말 帕=머리띠 말 抹=바랄 말 末=끝 말 沫=거품 말 秣=꼴 말 茉=말리 말 襪=버선 말 靺=버선 말 [망] 亡=망할 망 亾=兦과 同字 兦=亡의 本字 妄=허망할 망 孟=맹랑할 망 忘=잊을 망 忙=바쁠 망 惘=멍할 망 望=바랄 망 汒=황급할 망 漭=넓을 망 網=그물 망 罔=그물 망 芒=까끄라기 망 茫=아득할 망 莽=우거질 망 莾=마디 짧은 대 망 蟒=이무기 망 輞=바퀴테 망 邙=산 이름 망 魍=도깨비 망 [매] 勱=힘쓸 매 呅=웃을 매 呆=어리석을 매 嚜=거짓말할 매 埋=묻을 매 売=賣의 略字 妹=누이 매 媒=중매 매 寐=잠잘 매 昧=새벽 매 枚=줄기 매 某=매화나무 매 梅=매화나무 매 楳=梅의 古字 毎=每의 略字 每=매양 매 沬=지명 매 煤=그을음 매 玫=매괴 매 眛=어두울 매 罵=욕할 매 苺=딸기 매 莓=나무딸기 매 買=살 매 賣=팔 매 邁=갈 매 酶=술밑 매 霉=매우 매 霾=흙비 올 매 魅=도깨비 매 [맥] 百=힘쓸 맥 脈=맥 맥 脉=脈의 古字 貃=오랑캐 맥 貊=북방 종족 맥 貘=짐승 이름 맥 陌=두렁 맥 驀=말탈 맥 麥=보리 맥 麦=麥의 俗字 [맹] 孟=맏 맹 氓=백성 맹 猛=사나울 맹 盟=맹세할 맹 盲=소경 맹 萌=싹 맹 [먀] 乜=사팔 뜨기 먀 [멍] 儚= 甍= 甿= 虻= [며] 旀=하며 며 [멱] 冖=덮을 멱 冪=덮을 멱 幎=덮을 멱 汨=물이름 멱 覓=찾을 멱 [면] 丏=가릴 면 俛=힘쓸 면 偭=향할 면 免=면할 면 冕=면류관 면 勉=힘쓸 면 棉=목화 면 沔=물 흐를 면 湎=빠질 면 眄=애꾸눈 면 眠=잠잘 면 瞑=눈 감을 면 糆=麪과 同字 綿=이어질 면 緜=햇솜 면 緬=가는 실 면 面=낯 면 麪=밀가루 면 麵=麪의 俗字 麺=麵의 簡體字 [멸] 滅=멸망할 멸 篾=대 껍질 멸 蔑=업신여길 멸 衊=모독할 멸 [명] 冥=어두울 명 名=이름 명 命=목숨 명 明=밝을 명 暝=어두울 명 椧=홈 통 명 洺=강 이름 명 溟=어두울 명 皿=그릇 명 瞑=눈 감을 명 茗=차 싹 명 蓂=명협 명 螟=마디충 명 酩=술 취할 명 銘=새길 명 鳴=울 명 [몌] 袂=소매 몌 [모] 侔=가지런 할 모 侮=업신여길 모 冃=어린이 머리 건 모 冐=冒의 俗字 冒=가릴 모 募=모을 모 姆=여스승 모 姥=할미 모 媢=강새암 할 모 嫫=예쁠 모 帽=모자 모 恈=탐할 모 慕=그리워할 모 摸=찾을 모 摹=베낄 모 旄=깃대 장식 모 暮=저물 모 木=나무에 서화를 새길 모, 목각활자 모 某=아무 모 模=법 모 母=어미 모 毛=털 모 牟=소 우는 소리 모 牡=수컷 모 瑁=서옥 모 皃=貌와 同字 眊=눈 흐릴 모 眸=눈동자 모 矛=창 모 粍=밀리메트로 모 糢=模의 俗字 耄=늙은이 모 耗=줄 모 膜=무릎 꿇을 모 芼=풀 우거질 모 茅=띠 모 莫=저물 모 蝥=해충 모 蟊=蝥와 同字 謀=꾀할 모 謨=꾀 모 貌=얼굴 모 鉾=칼 끝 모 髦=다팔머리 모 麰=보리 모 [목] 冒=무릅쓸 목 凩=찬바람 목 匹=집 오리 목 木=나무 목 沐=머리감을 목 牧=칠 목 目=눈 목 睦=화목할 목 穆=화목할 목 苜=거여목 목 鶩=집오리 목 [몰] 勿=없을 몰 歿=죽을 몰 殁=歿의 俗字 沒=가라 앉을 몰 [몽] 冡=덮어쓸 몽 夢=꿈 몽 幪=덮을 몽 懞=어두울 몽 曚=어두울 몽 朦=풍부할 몽 溕=가랑비 몽, 이슬비 몽 濛=비 부슬부슬 올 몽, 기운덩어리 몽 瞢=어두울 몽 矇=소경 몽 艨=싸움배 몽 蒙=입을 몽 雺=안개 몽 鸏=비둘기 몽 [묘] 卯=토끼 묘 吵=지저귈 묘 墓=무덤 묘 妙=묘할 묘 廟=사당 묘 描=그릴 묘 昴=별자리 이름 묘 杳=어두울 묘 淼=물 아득할 묘 渺=아득할 묘 猫=고양이 묘 眇=애꾸눈 묘 秒=까끄라기 묘 竗=땅 이름 묘 緲=아득할 묘 苗=모 묘 藐=작을 묘 貓=猫와 同字 錨=닻 묘 [무] 亡=없을 무 亾=兦와 同字 儛=舞와 同字 兦=亡의 本字 務=일 무, 힘쓸 무, 권장할 무 嘸=분명하지 않을 무, 모호한 모양 무 巫=무당 무, 산 이름 무 廡=집 무, 처마 무, 지붕 무 憮=어루만질 무, 애무할 무 懋=힘쓸 무, 노력할 무 戊=다섯째 천간 무, 무성할 무 拇=엄지손가락 무 撫=어루만질 무, 누를 무 无=없을 무 楙=무성할 무, 아름다울 무 武=굳셀 무, 자만할 무, 군인 무 毋=말 무 無=없을 무 珷=옥돌 무 畝=이랑 무 畮=畝의 正字 繆=묶을 무, 얽을 무, 삼 무 膴=포 무, 크게 저민 고기 무 舞=춤출 무 茂=우거질 무, 무성할 무 蕪=거칠어질 무, 거친풀 무 袤=길이 무 誣=무고할 무, 깔볼 무 謬=그릇될 무, 어지러울 무, 속일 무, 망령되게 말할 무 貿=바꿀 무, 물건 살 무 鍪=투구 무, 가마 무 霧=안개 무, 어두울 무 騖=달릴 무, 질주할 무 鵡=앵무새 무 [묵] 万=성씨 묵 嘿=고요할 묵, 말 아니할 묵 嚜=거짓 묵, 불만스러운 모양 묵 墨=먹 묵, 형벌 이름 묵 默=묵묵할 묵, 고요할 묵 [문] 亹=땅이름 문 們=들 문, 무리 문 免=해산할 문, 통건 쓸 문 刎=목 벨 문, 자를 문, 끊을 문 勽=덮을 문 匁=몸메 문 吻=입술 문, 입가 문 呅=웃을 문 問=물을 문, 알릴 문 悗=잊어버릴 문 懣=번거로울 문 抆=닦을 문, 문지를 문 捫=어루만질 문, 쓰다듬을 문 文=무늬 문, 얼룩 문 汶=내 이름 문, 수치 문 炆=따뜻할 문 璊=붉은 옥 문 紊=어지러울 문 紋=무늬 문, 주름 문 聞=들을 문 蚊=모기 문 門=문 문 雯=구름 무늬 문 [물] 勿=말 물, 아닐 물, 깃발 물 沕=아득할 물, 숨길 물 物=만물 물, 무리 물 [미] 亹=힘쓸 미, 문채가 있는 모양 미 侎=어루만질 미 冞=점점 미, 두루 다닐 미 味=맛 미, 뜻 미 咩=양 울 미 咪=咩와 同字 娓=장황할 미, 힘쓸 미 媄=빛 고울 미 媚=아첨할 미, 풍치가 아름다울 미 媺=착하고 아름다울 미 尾=꼬리 미, 등 미 嵋=산이름 미 弥=彌와 同字 弭=활고자 미, 그칠 미 彌=두루 미, 널리 미 微=작을 미, 자질구레할 미 敉=어루만질 미 未=아닐 미 梶=나무 끝 미 楣=문미 미, 처마 미 渼=물놀이 미, 내 이름 미 湄=물 가 미, 더운 물 미 瀰=물 넓을 미 獼=원숭이 미 眉=눈썹 미, 노인 미 米=쌀 미 糜=죽 미, 싸라기 미 縻=고삐 미, 얽어맬 미 羋=양 울 미 美=아름다울 미, 맛이 좋을 미 芈=양이 울 미, 성씨 미 苿=味와 同字 菋=오미자 미 薇=고삐 미 蘼=장미 미, 천궁 미 謎=수수께끼 미 迷=미혹할 미, 전념할 미 靡=쓰러질 미, 쏠릴 미 麋=큰사슴 미, 부서질 미 黴=곰팡이 미, 검을 미, 썪을 미 [민] 僶=어거지로 할 민 勔=권면할 민, 힘쓸 민 岷=산이름 민 忞=강인할 민 忟=강인할 민 悶=번민할 민 愍=근심할 민 憫=불쌍히 여길 민 敏=민첩할 민 旻=하늘 민 旼=온화할 민 暋=굳셀 민 民=백성 민 泯=망할 민 湣=낚시줄 민 玟=옥돌 민 珉=아름다운돌 민 緍=낚시줄 민 緡=낚시줄 민 罠=그물 민 苠=속대 민 閔=위문할 민 閩=종족이름 민 鰵=대구 민 黽=힘쓸 민 [밀] 宻=密의 俗字 密=빽빽할 밀 樒=침향 밀 滵=물 흐르는 모양 밀 蜜=꿀 밀 謐=고요할 밀 [박] 亳=땅이름 박 剝=벗길 박 剥=剝의 略字 博=넓을 박 嚗=역정낼 박, 지팡이 던지는 소리 박 拍=칠 박 搏=칠 박 撲=업어질 박 朴=나무껍질 박 樸=통나무 박 欂=주두 박 泊=머무를 박 溥=빽빽할 박 爆=지질 박 牔=박공 박 珀=호박 박 璞=옥덩어리 박 箔=발 박 簿=잠박 박 粕=지게미 박 縛=묶을 박 膊=포 박 舶=배 박 薄=엷을 박 趵=차는 소리 박 迫=닥칠 박 鉑=금박 박 鎛=종 박 雹=누리 박 駁=얼룩말 박 駮=짐승이름 박 髆=어깨쭉지 박 [반] 仮=反과 同字 伴=짝 반 冸=녹을 반 半=반 반 反=돌이킬 반 叛=배반할 반 媻=비틀거릴 반 弁=즐거워할 반 扮=꾸밀 반 扳=끌 반 拌=버릴 반 搫=덜 반 搬=옮길 반 攀=더위잡을 반 攽=나눌 반 斑=얼룩 반 朌=구실 반 槃=쟁반 반 泮=학교 반 潘=뜨물 반 班=나눌 반 畔=지경 반 番=갈아치울 반, 차례 반, 땅이름 반 瘢=흉터 반 盤=소반 반 盼=곁눈질 할 반 磐=넓을 반 磻=강이름 반 礬=명반 반 竝=짝지을 반, 고을이름 반 絆=줄 반 繁=뱃대끈 반 肦=나눌 반 胖=희생 반 般=옮길 반 螌=가뢰 반 蟠=서릴 반 返=돌이킬 반 頒=나눌 반 頖=풀릴 반 飯=밥 반 飯=밥 반 [발] 勃=갑작스러울 발 哱=어지러울 발 彂=發과 同字 悖=우쩍 일어날 발 抜=拔의 俗字 拔=뺄 발 拨=撥의 簡體字 撥=다스릴 발 浌= 浡=일어날 발 渤=바다이름 발 溌=潑의 略字 潑=뿌릴 발 発=發의 略字 發=쏠 발 脖=배꼽 발 跋=밟을 발 酦=술기운 발 醗=醱의 略字 醱=술 괼 발 鈸=방울 발 鉢=바리때 발 髮=터럭 발 魃=가물 귀신 발 鵓=집비둘기 발 [방] 仿=헤멜 방 倣=본뜰 방 傍=곁 방 匚=상자 방 厖=클 방 哤=난잡할 방 嗙=웃을 방 坊=동네 방 妨=방해할 방 尨=삽살개 방 幇=幫과 同字 幚=幫과 同字 幫=도울 방 彭=많을 방 彷=거닐 방 徬=시중들 방 房=방 방 搒=배저을 방 放=놓을 방 方=모 방 旁=두루 방 旊=옹기장 방 昉=마침 방 枋=다목 방 梆=목어 방 榜=매 방 滂=비 퍼부을 방 牓=패 방 磅=돌 떨어지는 소리 방 紡=자을 방 肪=기름 방 膀=쌍배 방 舫=배 방 舽=배 방 芳=꽃다울 방 蒡=인동 덩굴 방 蚌=방합 방 螃=방게 방 訪=찾을 방 謗=헐뜯을 방 邡=고을 이름 방 邦=나라 방 鎊=깎을 방 防=둑 방 髣=비슷할 방 魴=방어 방 龍=잿빛 방 龎=龐의 俗字 龐=어지러울 방 [배] 俳=광대 배 倍=곱 배 偝=버릴 배 啡=코 고는 소리 배 坏=언덕 배 坯=坏와 同字 培=북돋을 배 妃=짝(配) 배 徘=노닐 배 扒=뺄 배 拜=절 배 排=밀칠 배 杯=잔 배 湃=물결 이는 모양 배 焙=불에 쬘 배 牌=배지 배 琲=구슬 꿰미 배 白=땅이름 배 盃=杯의 俗字 背=등 배 胚=아이 밸 배 蓓=꽃봉오리 배 裴=옷 치렁치렁할 배 賠=물어줄 배 輩=무리 배 配=아내 배 陪=쌓아올릴 배 [백] 伯=맏 백 兡=헥트르램 백 帛=비단 백 柏=나무 이름 백 栢=柏의 俗字 白=흰 백 百=일백 백 粨=힉터메트르 백 覇=霸의 俗字 霸=달력 백 魄=넋 백 [번] 反=되돌릴 번 噃=산돼지 번, 소리 번 幡=기 번 樊=울 번 潘=넘칠 번 煩=괴로워할 번 燔=구울 번 番=갈마들 번 磻=강이름 번 繁=많을 번 繙=되풀이 풀이할 번 翻=날 번 膰=제사 고기 번 蕃=우거질 번 藩=덮을 번 蘩=산흰쑥 번 袢=속옷 번 蹯=짐승 발바닥 번 飜=뒤칠 번 磻=강이름 번 [벌] 伐=칠 벌 橃=떼 벌 筏=떼 벌 罰=죄 벌 罸=罰과 同字 閥=공훈 벌 [범] 凡=무릇 범 凢=凡의 俗字 凣=凡의 俗字 帆=돛 범 梵=범어 범 氾=넘칠 범 汎=뜰 범 泛=뜰 범 犯=범할 범 笵=법 범 範=법 범 范=풀 이름 범 訉=말 많을 범 颿=돛 범 [법] 法=법 법 琺=법랑 법 [베] 北= 裵= 褙= 北= [벡] 佰= [벽] 僻=후미질 벽 劈=쪼갤 벽 壁=벽 벽 擗=가슴칠 벽 擘=엄지손가락 벽 檗=황벽나무 벽 璧=동근 옥 벽 甓=벽돌 벽 疈=가를 벽 癖=적취 벽 碧=푸를 벽 薜=승검초 벽 蘗=황경나무 벽 襞=주름 벽 辟=임금 벽 闢=열 벽 霹=벼락 벽 鷿=농병아리 벽 鼊=거북 벽 [변] 便=똥오줌 변 匥=관갑 변, 옷상자 변, 대그릇 변 卞=조급할 변 变=変과 同字 変=變의 俗字 弁=고깔 변 忭=기뻐할 변 扁=현판 변, 모난 그릇 변, 비천할 변 抃=손뼉칠 변 籩=제기 이름 변 編=땋을 변 胼=腁의 俗字 腁=살갗 틀 변 變=변할 변 賆=더할 변 辨=분별할 변 辮=땋을 변, 엮을 변, 얽을 변, 단추 변 辯=말잘할 변 边=邊의 略字 辺=邊의 略字 邊=가 변 釆=분별할 변 駢=騈의 俗字 騈=나란히 할 변 骿=통갈비 변 鴘=매 변 便=똥오줌 변 [별] 丿=삐침 별 別=나눌 별 别=別의 俗字 彆=활 뒤틀릴 별 憋=악할 별 批=거스를 별 瞥=언뜻 볼 별 蹩=절름발이 별 閉=막을 별 鱉=鼈과 同字 鷩=금계 별 鼈=자라 별 龞=鼈과 同字 [병] 丙=남녘 병 並=竝과 同字 併=倂의 俗字 倂=아우를 병 兵=군사 병 塀=담 병 屏=屛의 俗字 屛=병풍 병 并=幷의 俗字 幷=합할 병, 아우를 병, 겸할 병 摒=제거할 병 昞=밝을 병 昺=昞과 同字 柄=자루 병 棅=柄과 同字 榜=게시판 병, 방 써붙일 병, 매 병, 볼기칠 병 炳=밝을 병 瓶=甁의 俗字 甁=병 병 病=병 병 秉=잡을 병 竝=아우를 병 絣=무늬없는 비단 병, 이을 병, 먹줄 튀길 병 缾=두레박 병 軿=輧의 俗字 輧=거마 소리 병 迸=달아날 병 邴=고을 이름 병 鈵=굳을 병 鉼=판금 병 鋲=넓은 못 병, 징 병 餅=餠의 俗字 餠=떡 병 駢=騈의 俗字 騈=나란히 할 병 [보] 俌=도울 보 保=지킬 보 呆=保와 同字 堡=작은 성 보 報=갚을 보 宝=寶의 俗字 寳=寶의 俗字 寶=보배 보 普=널리 보 椺=들보 보 步=걸을 보 歩=步의 俗字 洑=보 보 湺= 潽=물(水) 보 父=남자의 미칭(美稱) 보 珤=寶의 古字 甫=클 보 盙=簠의 本字 簠=제기 이름 보 菩=보살 보 葆=풀 더부룩할 보 補=기울 보 褓=포대기 보 譜=계보 보 輔=덧방나무 보 靌=寶와 同字 鴇=능에 보 黼=수 보 [복] 伏=엎드릴 복 僕=종 복 副=버금 복 匐=길 복 卜=점 복 墣=흙덩이 복 宓=성 복 幞=건 복 復=돌아올 복 扑=칠 복 撲=닦을 복 服=옷 복 樸=총생할 복 濮=강 이름 복 福=복 복 箙=전동 복 腹=배 복 茯=복령 복 菔=무 복 蔔=무우 복 蝠=박쥐 복 蝮=살무사 복 袱=보 복 複=겹옷 복 覆=뒤집힐 복 踣=넘어질 복 蹼=물갈퀴 복 輹=복토 복 輻=바퀴살 복 馥=향기 복 鰒=전복 복 鵩=새 이름 복 福=복 복 [본] 本=밑 본 [봉] 丰=예쁠 봉 俸=녹 봉 唪=껄껄 웃을 봉 塜=먼지 일 봉 夆=끌 봉 奉=받들 봉 封=봉할 봉 尨=헝클어진 모양 봉 峯=봉우리 봉 峰=峯과 同字 捧=받들 봉 棒=몽둥이 봉 汎=뜰 봉 泛=엎을 봉 烽=봉화 봉 熢=연기 자욱할 봉 琫=칼집 장식 봉 篷=뜸 봉 綘=縫과 同字 縫=꿰맬 봉 菶=풀 무성할 봉 蓬=쑥 봉 蜂=벌 봉 逢=만날 봉 鋒=칼끝 봉 鳯=鳳의 俗字 鳳=봉새 봉 鴌=鳳의 古字 [부] 不=아닐 부 仆=엎드릴 부 付=줄 부 伏=알 안을 부 俘=사로잡을 부 俯=구푸릴 부 偩=본뜰 부 傅=스승 부 冨=富의 俗字 剖=쪼갤 부 副=버금 부 否=아닐 부 咐=분부할 부 哹=부는 소리 부, 물새 우는 소리 부 埠=선창 부 培=무덤 부 報=나아갈 부 夫=지아비 부 婦=며느리 부 媍=婦와 同字 孚=미쁠 부 孵=알 깔 부 富=가멸 부 巬= 巭=공부할 부 府=곳집 부 復=다시 부 扶=도울 부 抔=움킬 부 拊=어루만질 부 掊=그러모을 부 敷=펼 부 斧=도끼 부 旉=敷의 古字 桴=마룻대 부 榑=부상 부 浮=뜰 부 涪=물거품 부 溥=펼 부 父=아비 부 玞=옥돌 부 祔=합사할 부 符=부신 부 筟=대청 부 簿=장부 부 缶=장군 부 罘=그물 부 罦=그물 부 胕=장부 부 腐=썩을 부 腑=장부 부 膚=살갗 부 艀=작은 배 부 芙=부용 부 芣=질경이 부 苻=귀목풀 부 莩=풀 이름 부 蔀=빈지문 부 蚨=파랑강충이 부 蜉=하루살이 부 袝=성한 옷 부 裒=모을 부 複=겹칠 부 覆=덮을 부, 가리울 부, 고루고루 퍼질 부 訃=부고 부 負=질 부 賦=구실 부 賻=부의 부 赴=나아갈 부 趺=책상다리할 부 跗=발등 부 踣=넘어질 부 部=거느릴 부 釜=가마 부 鈇=도끼 부 阜=언덕 부 阝=언덕 부 附=붙을 부 頫=머리 숙일 부 駙=곁마 부 鮒=붕어 부 鳧=오리 부 鳬=鳧의 俗字 麩=밀기울 부 復=다시 부 [북] 伏= 僰=오랑캐 북 北=북녘 북 [분] 体=용렬할 분 倴=사람이름 분, 둔한 사람 분 僨=넘어질 분 分=나눌 분 匪=나눌 분 吩=뿜을 분 噴=뿜을 분 坌=먼지 분 墳=무덤 분 奔=달릴 분 奮=떨칠 분 帉=걸레 분, 행주 분 忿=성낼 분 憤=결낼 분 扮=꾸밀 분 昐=햇빛 분 朌=頒과 同字 枌=나무 이름 분 棻=棼과 同字 棼=겹들보 분, 삼베 분, 어지러울 분 氛=기운 분 汾=클 분 湓=용솟음할 분 濆=뿜을 분 焚=불사를 분 犇=달아날 분 畚=삼태기 분 盆=동이 분 砏=큰 소리 분 笨=거칠 분 粉=가루 분 糞=똥 분 紛=어지러워질 분 肦=머리 클 분 膹=고기 삶은 국 분 芬=향기로울 분 苯=풀 떨기로 날 분 蕡=들깨 분 賁=클 분 轒=병거 분 雰=안개 분 頒=큰 머리 분 鱝=가오리 분 黺=옷에 오색 수 놓을 분 鼢=두더지 분 [불] 不=아닐 불 乀=파임 불 仏=佛의 古字 佛=부처 불 冹=찰 불 刜=칠 불 咈=어길 불 堋= 岪=산길 불 弗=아닐 불 彿=비슷할 불 払=떨칠 불 拂=떨 불 沸=용솟음할 불 漰= 祓=푸닥거리할 불 紱=인끈 불 艴=발끈할 불 茀=풀 우거질 불 韍=폐슬 불 髴=비슷할 불 鬅= 黻=수 불 不=아닐 불 [붕] 倗=부탁할 붕 傰=성 붕 崩=무너질 붕 朋=벗 붕 棚=시렁 붕 硼=붕산 붕 綳=繃과 同字 繃=묶을 붕 鵬=대붕새 붕 [비] 丕=클 비 仳=떠날 비 伾=힘셀 비 俷=등질 비 俻=하여금 비, 좇을 비, 흘겨볼 비 俾=더할 비 偹=備의 俗字 備=갖출 비 剕=발 벨 비 匕=비수 비 匪=대상자 비 卑=낮을 비 厞=더러울 비 否=막힐 비, 더러울 비, 악할 비 呸=다투는 소리 비 啚=鄙와 同字 啡=코 고는 소리 비 嚊=헐떡거릴 비 嚭=클 비 圮=무너질 비 埤=더할 비 妃=왕비 비 妣=죽은 어미 비 婢=여자종 비 屁=방귀 비 庇=덮을 비 庳=집 낮을 비 悱=표현 못할 비 悲=슬플 비 憊=고달플 비 扉=문짝 비 批=칠 비 斐=오락가락할 비 枇=비파나무 비 棐=도지개 비 椑=술통 비 榌=사닥다리 비 榧=비자나무 비 比=견줄 비 毖=삼갈 비 毗=도울 비 毘=毗와 同字 沘=강 이름 비 沸=끓을 비 泌=샘물 흐르는 모양 비 淝=강 이름 비 淠=강 이름 비 濞=물 소리 비 狉=삵의 새끼 비 狒=비비 비 琵=비파 비 畀=줄 비 痞=뱃속 결릴 비 痹=저릴 비 痺=암메추라기 비 睥=흘겨볼 비 砒=비상 비 碑=돌기둥 비 祕=귀신 비 秕=쭉정이 비 秘=숨길 비 篦=빗치개 비 粃=쭉정이 비 紕=가선 비 緋=붉은 빛 비 羆=큰 곰 비 翡=물총새 비 肥=살찔 비 脾=지라 비 腓=장딴지 비 臂=팔 비 芘=풀 이름 비 芾=작은 모양 비 菲=엷을 비 萆=비해 비 蓖=아주까리 비 蚍=왕개미 비 蜚=바퀴 비 裨=도울 비 誹=헐뜯을 비 譬=비유할 비 貔=비휴 비 費=쓸 비 贔=힘쓸 비 轡=고삐 비 邳=클 비 郫=고을 이름 비 鄙=다라울 비 閟=문 닫을 비 陴=성가퀴 비 霏=눈 펄펄 내릴 비 非=아닐 비 鞴=풀무 비 飛=날 비 騑=곁마 비 騛=빠른 말 비 髀=넓적다리 비 鯡=곤이 비 鼙=마상북 비 鼻=코 비 泌=샘물 흐르는 모양 비 [빈] 份=빛날 빈 儐=인도할 빈 嚬=찡그릴 빈 嬪=아내 빈 彬=빛날 빈 擯=물리칠 빈 斌=빛날 빈 檳=빈랑나무 빈 殯=염할 빈 浜=물가 빈 濱=물가 빈 瀕=물가 빈 牝=암컷 빈 玭=구슬 이름 빈 矉=찡그릴 빈 繽=어지러울 빈 臏=종지뼈 빈 蘋=네가래 빈 豳=나라 이름 빈 貧=가난할 빈 賓=손 빈 賔=손 빈 邠=나라 이름 빈 鑌=강철 빈 霦=옥 광채 빈 頻=자주 빈 顰=찡그릴 빈 髕=종지뼈 빈 鬂=鬢의 俗字 鬢=살쩍 빈 [빙] 俜=비틀거리다 빙 冫=얼음 빙 冰=氷의 本字 凭=기대다 빙 凴=凭과 同字 娉=장가들다 빙 憑=기대다 빙 氷=얼음 빙 聘=찾아가다 빙 騁=달리다 빙 [뿐] 兺=그 뿐 [사] 乍=잠깐 사 亊=事와 同字 事=일 사 些=적을 사 仕=벼슬할 사 伺=엿볼 사 似=같을 사 佀=같을 사 佘=산 이름 사 使=하여금 사 俟=기다릴 사 倳=찌를 사 傞=취하여 춤추는 모양 사 傻=약을 사 僿=잘게 부슬 사 儩=다할 사 写=冩의 略字 冩=베낄 사 剚=찌를 사 卸=짐 부릴 사, 벗을 사 厶=사사 사 叓=事의 古字 史=역사 사 司=맡을 사 咋=잠간 사 唆=부추길 사 喳=예하고 대답하는 소리 사 嗄=목 잠길 사 嗣=이을 사 四=넉 사 士=선비 사 夕=한 움큼 사 奢=사치할 사 姒=동서 사 娑=춤출 사 寫=베낄 사 寺=절 사 射=궁술 사 巳=여섯째 지지 사 師=스승 사 徙=옮길 사 思=생각할 사 捨=버릴 사 斜=비낄 사 斯=이 사 查=査와 同字 柶=수저 사 査=조사할 사, 떼 사 梭=북 사 楂=떼 사 榭=정자 사 死=죽을 사 汜=지류 사 沙=모래 사 泗=물 이름 사 渣=찌끼 사 瀉=토할 사 灼= 犧=술그릇 사 献=獻의 俗字 獅=사자 사 獻=술통 사 痧=쥐통 사 皶=코에 열꽃 돋을 사, 주부코 사, 분가시 사 砂=모래 사 社=토지의 신 사 祀=제사 사 祠=사당 사 私=사사 사 竢=기다릴 사 笥=상자 사 篩=체 사 簑=蓑와 同字 簔=簑와 同字 糸=가는 실 사 紗=깁 사 絲=실 사 缷=卸의 俗字 肆=방자할 사 舍=집 사 莎=향부자 사 蓑=도롱이 사 蛇=뱀 사 蜡=납향 사 裟=가사 사 覗=엿볼 사 詐=속일 사 詞=말씀 사 謝=사례할 사 賜=줄 사 赦=용서할 사 辞=辭의 俗字 辭=말 사 邪=간사할 사 食=밥 먹일 사 飼=먹일 사 駛=달릴 사 駟=사마 사 魦=鯊와 同字 鯊=문절망둑 사 鯋=상어 사, 모래무지 사 鰤=새우 사 麝=사향노루 사 飼=기를 사 [삭] 削=깎을 삭 數=자주 삭 朔=초하루 삭 槊=창 삭 溯=물이름 삭, 빨래한 물 삭 爍=빛날 삭 索=동아줄 삭 蒴=말오줌대 삭 鑠=녹일 삭 數=자주 삭 索=동아줄 삭 [산] 傘=우산 산 删=刪의 略字 刪=깎을 산 剷=깎을 산 匴=관상자 산 姍=헐뜯을 산 姗=姍의 略字 孿=쌍둥이 산 山=뫼 산 散=흩을 산 橵=산자 산 汕=오구 산 潸=눈물흐를 산 澘=潸의 略字 狻=사자 산 珊=산호 산 產=産의 略字 産=낳을 산 疝=산증 산 算=셀 산 繖=일산 산 蒜=달래 산 虄= 訕=헐뜯을 산 跚=비틀거릴 산 酸=초 산 鏟=대패 산 閊=비색할 산 霰=싸라기눈 산 [살] 乷=음역자 살 撒=뿌릴 살 殺=죽일 살 煞=죽일 살 蔡=내칠 살 薩=보살 살 [삼] 三=석 삼 叁=參의 略字 参=參의 略字 參=석 삼 叄=參의 俗字 嘇=머금을 삼 杉=삼나무 삼 森=나무빽빽할 삼 毿=털긴 삼 糝=나물죽 삼 芟=벨 삼 蔘=인삼 삼 衫=적삼 삼 釤=낫 삼 鬖=헝클어질 삼 參=석 삼 [삽] 偛=키작을 삽 卅=서른 삽 唼=쪼아먹을 삽 啃=입 다시는 소리 삽 啑=오리가 텁석텁석 먹을 삽 扱=거둘 삽, 들 삽, 당길 삽, 깊을 삽 插=揷의 略字 揷=꽂을 삽 歃=마실 삽 澁=떫을 삽 翣=운삽 삽 趿=발가락으로잡을 삽 鈒=창 삽 鍤=가래 삽 钑=鈒의 略字 霅=비올 삽 霎=가랑비 삽 颯=바람소리 삽 [상] 丄=上의 古字 上=위 상 傷=상처 상 像=형상 상 償=갚을 상 儴=고생할 상, 훔칠 상, 인연할 상 勨=느즈러질 상, 힘쓸 상, 움직일 상 向=성 상 响= 商=헤아릴 상 喪=죽을 상 嗓=목구멍 상 嘗=맛볼 상 塽=높고밝은땅 상 孀=과부 상 尙=오히려 상 尚=尙의 略字 峠=고개 상 常=항상 상 床=牀의 俗字 庠=학교 상 廂=행랑 상 徜=노닐 상 想=생각할 상 晌=정오 상 桑=뽕나무 상 樣=橡의 略字 橡=상수리나무 상 殤=일찍죽을 상 湘=강이름 상 湯=물흐를 상 爽=시원할 상 牀=평상 상 状=狀의 略字 狀=형상 상 甞=맛볼 상 相=서로 상 祥=상서로울 상 箱=상자 상 緗=담황색 상 翔=빙빙돌아날 상 裳=치마 상 觴=잔 상 詳=자세할 상 象=코끼리 상 賞=상줄 상 鎟=방울소리 상 霜=서리 상 顙=이마 상 鬺=삶을 상 鮝=건어 상 祥=복 상 [새] 塞=변방 새 灑=뿌릴 새, 깜짝 놀랄 새 璽=도장 새 賽=굿할 새 鰓=뿔심 새 [색] 嗇=아낄 색 塞=막힐 색 愬=놀랍고두려울 색 槭=나뭇잎 떨어져 앙상할 색 濇=껄끄러울 색 瀒=濇의 俗字 穡=거둘 색 索=찾을 색 色=빛 색 薔=아낄 색 賾=깊숙할 색 塞=막힐 색 [생] 栍=찌 생 牲=희생 생 生=날 생 甥=생질 생 省=덜 생 眚=눈에백태낄 생 笙=생황 생 鉎=녹 생 省=덜 생 [샤] 仒= [서] 叙=敍의 俗字 噬=씹을 서 墅=농막 서 壻=사위 서 婿=사위 서 嶼=섬 서 序=차례 서 庶=여러 서 庻=庶의 略字 徐=천천할 서 恕=용서할 서 抒=풀 서 捿=깃들일 서 揟=나무이름 서 撕=들 서, 일깨울 서 敍=차례 서 敘=敍의 俗字 暑=더울 서 曙=새벽 서 書=쓸 서 栖=깃들일 서 棲=살 서 湑=거를 서 澨=물가 서 犀=무소 서 瑞=상서 서 筮=점대 서 紓=느슨할 서 絮=솜 서 緒=緖의 略字 緖=실마리 서 署=관청 서 耡=구실이름 서 胥=서로 서 舒=펼 서 芧=상수리 서 薯=참마 서 西=서녘 서 誓=맹세할 서 諝=슬기 서 谞=諝의 略字 逝=갈 서 鉏=호미 서 鋤=호미 서 閪=잃을 서 黍=기장 서 鼠=쥐 서 [석] 冟=고룰 석, 고르지 않을 석, 알맞게 된 밥 석 夕=저녁 석 奭=클 석 射=맞힐 석 席=자리 석 惜=아낄 석 昔=옛 석 晰=밝을 석 晳=밝을 석 析=가를 석 汐=조수 석 沢=澤의 略字 淅=쌀일 석 潟=개펄 석 澙=潟의 俗字 澤=풀 석 石=돌 석 矽=석비레 석 碩=클 석 腊=포 석 舃=신 석 舄=舃의 略字 蓆=자리 석 蜥=도마뱀 석 釈=釋의 俗字 釋=풀 석 鉐=놋쇠 석 錫=주석 석 鼫=석서 석 [선] 亘=구할 선 仙=신선 선 傓=매우 성할 선 僊=춤출 선 僎=갖출 선 先=먼저 선 单=單의 簡體字 単=單의 略字 善=착할 선 單=고을이름 선 墡=백토 선 嫙=예쁠 선 嬋=고울 선 宣=베풀 선 尟=尠과 同字 尠=적을 선 屳=날 선 愃=쾌할 선 扇=사립문 선 敾=글잘쓸 선 旋=돌 선 歚=고을 선 洗=조촐할 선, 율이름 선 渲=바림 선 煽=부칠 선 熯=불 이글이글할 선, 태울 선, 공경할 선 琁=옥 선 瑄=도리옥 선 璇=아름다운옥 선 璿=아름다운옥 선 癬=옴 선 禅=禪의 略字 禪=봉선 선 筅=솔 선 綫=線과 同字 線=실 선 縇=선두를 선 繕=기울 선 缐=線의 簡體字 羡=현이름 선 羨=부러워할 선 脧=줄일 선 腺=샘 선 膳=반찬 선 船=배 선 蘚=이끼 선 蝉=蟬의 略字 蟬=매미 선 詵=많을 선 譔=가르칠 선 譱=善의 古字 跣=맨발 선 躚=춤출 선 選=가릴 선 還=돌 선 銑=끌 선 鏇=갈이틀 선 鐥=복자 선 霰=싸락눈 선, 별 선 饍=膳과 同字 騸=불깔 선 鮮=고울 선 鱓=두렁허리 선 鱔=鱓의 俗字 鱻=생선 선 [설] 偰=맑을 설 僁=소근거릴 설 卨=사람이름 설 囓=齧과 同字 媟=깔볼 설 屑=가루 설 挈=손에들 설 揲=셀 설 暬=설만할 설 楔=문설주 설 泄=샐 설 洩=샐 설 渫=칠 설 爇=불사를 설 碟=가죽다룰 설 稧=볏단 설 紲=고삐 설 舌=혀 설 薛=맑은대쑥 설 褻=더러울 설 設=베풀 설 說=말씀 설 説=説의 略字 雪=눈 설 鱈=대구 설 齧=물 설 [섬] 剡=땅이름 섬 孅=가늘 섬 憸=간사할 섬 摻=섬섬할 섬 暹=해돋을 섬 殲=다죽일 섬 睒=번개빛 섬 繊=가늘 섬 纖=가늘 섬 蟾=두꺼비 섬 譫=헛소리 섬 贍=넉넉할 섬 銛=가래 섬 閃=번쩍할 섬 陝=고을이름 섬 韱=산부추 섬 [섭] 囁=말하려다 멈출 섭, 중얼거릴 섭, 입 다물 섭 懾=무서울 섭, 두려울 섭 摂=懾과 同字 攝=몰아 잡을 섭, 끌 섭, 단정하게 할 섭, 겸할 섭, 거둘 섭, 기록할 섭, 항복할 섭 涉=물 건널 섭, 지나칠 섭, 돌아다닐 섭 渉=涉과 同字 灄=흠치르르할 섭, 물이름 섭, 떼 섭 燮=불에 익힐 섭, 불꽃 섭, 조화로울 섭 聶=소곤거릴 섭, 낄 섭, 성씨 섭 葉=고을이름 섭 躞=족자 마구리 섭, 저벅저벅 걸을 섭 躡=밟을 섭, 신 신을 섭, 오를 섭 鑷=쪽집게 섭 顳=귀밑 뼈 섭 葉=고을이름 섭 [성] 垩=聖과 同字 城=보루 성, 재 성, 서울 성 声=聲의 俗字 姓=일가 성, 아이 낳을 성, 백성 성 宬=사고 성, 도서실 성, 창고 성 性=성품 성, 마음 성, 바탕 성, 색욕 성 惺=깨달을 성, 똑똑할 성, 조용할 성 成=이룰 성, 거듭 성, 마칠 성, 화목할 성 星=별 성, 희뜩희뜩할 성, 세월 성, 성시 성 晟=밝을 성, 햇살 퍼질 성 猩=성성이 성 珹=옥 이름 성, 아름다운 구슬 성 瑆=옥빛 성, 빛날 성 盛=담을 성, 이룰 성, 정제할 성, 많을 성 省=살필 성 筬=바디 성 聖=성인 성, 착할 성, 통할 성, 지극할 성 聲=소리 성, 풍류 성, 명예 성 腥=비린내 성, 더러울 성, 날고기 성 誠=미쁠 성, 공경할 성, 살필 성, 진실 성 醒=술 깰 성, 꿈 깰 성, 깨달을 성 騂=붉은 소 성, 누른말 성, 활 물쩡물쩡할 성 [세] 世=세상 세, 평생 세, 백년 세 勢=권세 세, 위엄 세, 불알 세, 기회 세 卋=世의 古字 帨=차는 수건 세, 손수건 세 彗=대빗자루 세 歲=해 세, 곡식 익을 세, 돐 세, 풍년 세 歳=歲와 同字 洒=씻을 세, 설치할 세 洗=씻을 세, 세수 그릇 세 稅=구실 세, 거둘 세, 놓을 세, 쉴 세 税=稅와 同字 笹=가는 대 세 細=가늘 세, 작을 세, 좀놈 세 繐=가늘고 성긴 베 세 蛻=매미 허물 세 蜕=蛻와 同字 說=달랠 세, 쉴 세 説=說와 同字 貰=빌릴 세, 세 바칠 세 說=달랠 세, 쉴 세 [소] 佋=소개할 소, 사신 소, 댓수의 차례 소 俏=거문고 뒤치는 소리 소 傃=향할 소, 떳떳할 소 卲=높을 소, 성씨 소 召=부를 소, 청할 소, 과부 소 咲=웃을 소 哨=입술 비뚤어질 소, 잔말할 소 喿=새 때지어 울 소 嗉=멀떠구니 소 嘨=嘯와 同字 嘯=휘파람 소, 세게 뿜을 소, 읊을 소 埽=쓸 소, 그릴 소, 언덕 소 塐=塑와 同字 塑=허수아비 소 宵=밤 소, 작을 소, 벌레이름 소 小=작을 소, 좁을 소, 적을 소, 어릴 소, 적게 여길 소 少=적을 소, 조금 소, 멸시할 소, 잠깐 소, 젊을 소 巢=새집 소, 집 지을 소, 새 보금자리 소, 적진 망보는 높을 수레 소, 도둑굴 소, 큰 피리 소, 채소이름 소 愬=고할 소, 참소할 소, 알릴 소 所=바 소, 곳 소, 쯤 소, 가질 소, 얼마 소 捎=덜 소, 흔들거릴 소, 추릴 소, 버릴 소 掃=쓸 소, 상투 소 掻=搔와 同字 搔=긁을 소, 휘저을 소, 분분할 소 昭=소명할 소, 소목 소, 태평세월 소 梳=얼레빗 소 樔=풀막 소, 너스레 소 沼=못 소, 늪 소 泝=거슬러 올라갈 소, 흘러갈 소 消=다할 소, 꺼질 소, 풀릴 소, 해어질 소 涑= 溯=거슬러 올라갈 소 瀟=물 맑을 소, 비바람 몰아칠 소, 강이름 소 炤=밝을 소 焼=燒와 同字 燒=불 붙을 소, 들불 소, 불 놓을 소 甦=깨어날 소, 숨 쉴 소 疋=밭 소 疎=성길 소, 드물 소 疏=뚫릴 소, 나눌 소, 멀 소, 추할 소, 드물 소 瘙=옴 소, 종기 소 穌=깨어날 소, 숨 쉴 소, 기뻐할 소 笑=웃음 소 筱=가는 대 소 筿=篠와 同字 箾=상소 소 篠=가는 대 소 簘=簫와 同字 簫=퉁소 소, 활고지 소 素=흴 소, 생초 소, 빌 소, 바탕 소, 원래 소 紹=이을 소, 얽을 소, 소개할 소 繅=고치 실 뽑을 소 翛=날개치는 소리 소, 모지라질 소 肖=쇠약할 소, 흩어질 소 膆=살찔 소, 멀떠구니 소 艘=배 소 蓀= 蔬=나물 소 蕭=쑥 소, 쓸쓸할 소, 말 우는 소리 소, 바람소리 소 蘇=차조기 소, 나무할 소, 까무러칠 소, 깨어날 소, 성씨 소 蛸=거미알 소, 연가시 알집 소 螦=배좀(穴舟蟲) 소 訴=하소연할 소, 송사할 소 謖= 踈=疎의 譌字 逍=노닐 소, 거닐 소 遡=거스를 소, 맞이할 소, 하소연할 소 邵=땅이름 소, 성씨 소 酥=타락죽 소 銷=녹을 소, 사라질 소 霄=하늘 소, 진눈깨비 소 韶=아름다울 소, 이을 소, 순의 풍류 소, 봄 소 騒=騷와 同字 騷=근심스러울 소, 흔들릴 소, 급할 소, 처량할 소 魈=산도깨비 소 鮹=문어 소, 낙지 소 鰷=피라미 소, 뱅어 소 鰺=비린내 소의 譌字 [속] 俗=익을 속, 버릇 속, 풍속 속, 세상 속 属=屬의 俗字 屬=무리 속, 좇을 속, 붙이 속, 거느릴 속 束=묶을 속, 단나무 속, 약속할 속, 비단 다섯끝 속 洬=비 내릴(降雨) 속 粟=좁쌀 속, 겉곡식 속 続=續의 略字 續=이을 속 觫=곱송거릴 속 贖=속바칠 속, 무역할 속 速=빠를 속, 부를 속, 더러울 속, 사슴 발자취 속 遬=공손할 속, 줄어들 속 [손] 噀=물 뿜을 손 孫=손자 손, 움 돋을 손, 순할 손, 피할 손 巺=巽과 同字 巽=사양할 손, 낮은체 할 손, 부드러울 손, 괘 이름 손, 동과 남의 사이방향 손 損=덜 손, 잃을 손, 피곤할 손, 삼갈 손, 상할 손, 괘 이름 손 遜=순할 손, 겸손할 손, 도망할 손, 사양할 손 飡=飱과 同字 飧=저녁밥 손, 물에 만 밥 손 飱=飧의 俗字 餐=먹을 손, 물에 만 밥 손 [솔] 乺=솔 솔, 땅이름 솔 帥=거느릴 솔, 좇을 솔 率=거느릴 솔, 좇을 솔, 쓸 솔, 대강 솔, 공경할 솔, 뱀 이름 솔 窣=느릿느릿 걸을 솔, 우지직거릴 솔, 구멍으로 나올 솔 蟀=귀뚜라미 솔 [송] 凇=산유화 송 宋=송나라 송, 성씨 송 悚=두려울 송, 송구할 송 松=소나무 송, 향풀 송, 땅이름 송 柗=松과 同字 淞=강이름 송 竦=공경할 송, 두려울 송, 높일 송, 솟을 송 訟=송사할 송, 시비할 송, 꾸짖을 송, 괘 이름 송 誦=풍유할 송, 읽을 송, 말할 송, 원망할 송 送=보낼 송, 가질 송, 활쏘기 능통할 송, 줄 송 頌=기릴 송, 칭송할 송, 찬양하는 노래 송 鬆=터럭 더부룩할 송 [솨] 惢=의심낼 솨 曬= [쇄] 刷=긁을 쇄, 고칠 쇄, 빗을 쇄, 문지를 쇄 嗩=뿔나팔 쇄 灑=뿌릴 쇄, 깜짝 놀랄 쇄 瑣=옥가루 쇄, 가늘 쇄, 좀스러울 쇄, 대궐문 아로새길 쇄 砕=碎와 同字 碎=부술 쇄, 잘 쇄 誶=꾸짖을 쇄 鎖=자물쇠 쇄, 쇠사슬 쇄, 가둘 쇄, 항쇄 쇄 鏁=긴 창 쇄 殺=내릴 쇄, 감할 쇄, 빠를 쇄 [쇠] 殺= 衰=쇠할 쇠, 모손할 쇠, 약할 쇠 釗=사람이름 쇠 [수] 修=닦을 수, 옳게할 수, 정리할 수, 꾸밀 수 倕=무거울 수, 이름 수 凁=싸늘할 수, 얻을 수 受=이을 수, 얻을 수, 담을 수, 받을 수 叟=어른 수, 쌀 씻는 소리 수 售=팔 수, 갚을 수 嗽=기침할 수, 입가실 수 囚=가둘 수, 갇힐 수, 묶일 수 垂=드리울 수, 변방 수, 거의 수, 남길 수 壽=목숨 수, 장수할 수, 나이 수, 축복할 수 嫂=형수 수 守=지킬 수, 보살필 수, 원님 수, 기다릴 수 宿=떼별 수, 성좌 수 寿=壽의 俗字 岫=바위구멍 수 峀=岫와 同字 帥=주장할 수, 장수 수 廋=숨길 수 愁=근심 수, 염려할 수, 탄식할 수 戍=수자리 수, 막을 수, 집 수 手=손 수, 잡을 수, 칠 수 授=줄 수, 부칠 수 搜=찾을 수, 더듬을 수, 화살 빨리 가는 소리 수, 어지러울 수 收=모을 수, 거둘 수, 잡을 수, 수레바퀴 수 数=數의 略字 數=헤아릴 수, 수죄할 수, 몇 수, 이치 수 晬=돐 수, 첫 생일 수 樹=나무 수, 막을 수, 세울 수, 심을 수 殊=죽을 수, 베일 수, 끊어질 수, 지나갈 수 水=물 수, 고를 수 洙=물가 수, 물읾 수 溲=오줌 수, 반족할 수, 적실 수 漱=양치질할 수, 빨래할 수 潚= 濉=睢와 同字 燧=봉화 수, 불 수, 나무 문질러 불낼 수 狩=겨울사냥 수, 순행할 수 獣=獸와 同字 獸=짐승 수 琇=귀막이 수, 옥돌 수 琡= 璲=서옥 수, 패옥 수 璹= 痩=瘦와 同字 瘦=파리할 수, 가늘 수 睟=똑바로 볼 수, 윤택할 수 睡=졸음 수, 잠 수 睢=물이름 수 瞍=소경 수, 장님 수, 판수 수 祟=빌미 수 秀=빼어날 수, 이삭 수, 벼 패일 수, 아름다울 수 穗=이삭 수 竪=세울 수, 서있을 수, 더벅머리 수 籔=조리 수, 곡식 세는 단위 휘 수, 또아리 수 粹=정할 수, 순수할 수 綏=편안할 수, 수레고삐 수, 물러갈 수, 여우모양 수 綬=인끈 수 繍=繡와 同字 繡=수놓을 수, 성씨 수 羞=부끄러울 수, 음식 수 脩=포 수, 길 수, 마를 수 脺=얼굴 윤택할 수, 머리덜미 수 膄=파리할 수 膸=髓와 同字 茱=수유 수 菽= 蒐=꼭두서니 수, 모을 수, 숨을 수, 찾을 수 蓚=기쁠 수, 수산(acid) 수 藪=큰 늪 수, 덤불 수, 똬리 수 袖=소매 수 誰=누구 수, 무엇 수 誶=꾸짖을 수 讎=짝 수, 원수 수, 대거리할 수, 비교할 수, 갚을 수 讐=讎와 同字 豎=세울 수, 내시 수, 더벅머리 수 輸=떨어뜨릴 수, 쏟을 수, 보낼 수, 짐바리 수 遂=사무칠 수, 나아갈 수, 이룰 수, 마침내 수 邃=깊숙할 수 酬=술 권할 수, 갚을 수 銖=저울눈 수 銹=동록 수 鏽=거울에 녹슬 수 陲=변방 수, 위태할 수 隋=수나라 수 随=隨의 譌字 隧=무덤길 수, 구멍 수, 길 수 隨=따를 수, 괘 이름 수, 나라이름 수, 맡길 수 雖=비록 수, 벌레이름 수 需=음식 수, 머뭇거릴 수, 기다릴 수, 찾을 수, 괘 이름 수 須=수염 수, 기다릴 수 颼=바람소리 수 饈=드릴 수, 반찬 수 首=머리 수, 먼저 수, 비롯할 수, 임금 수, 향할 수, 자백할 수 髓=뼛속 기름 수, 마음속 수 鬚=턱수염 수, 아랫수염 수 [숙] 俶=비롯할 숙, 처음 숙, 지을 숙 倏=잠간 숙, 홀연 숙, 개의 빨리 달리는 모양 숙 倐=倏의 俗字 儵=잿빛 숙, 남해 임금 숙, 독화당할 숙, 갑자기 숙 叔=아재비 숙, 주울 숙, 어릴 숙, 끝 숙 塾=사랑방 숙, 기숙사 숙 夙=이를 숙, 이미 숙, 빠를 숙, 일찍 일어날 숙 婌=궁녀 벼슬이름 숙 孰=누구 숙, 어느 숙, 살필 숙, 익을 숙 宿=잘 숙, 지킬 숙, 머물 숙 橚=길고 꼿꼿할 숙 淑=맑을 숙, 착할 숙, 사모할 숙 熟=익힐 숙, 삶을 숙, 풍년들 숙 肅=공손할 숙, 공경할 숙, 경계할 숙 蓿=거여목 숙 驌=좋은말 숙, 숙상말 숙 骕=驌과 同字 鷫=숙상새 숙 [순] 侚=좇을 순, 빠를 순, 조리 돌릴 순 峋=후미질 순 巡=돌 순, 순행할 순, 두루 순 徇=조리 돌릴 순, 따라 죽을 순, 빠를 순, 부릴 순 循=좇을 순, 의지할 순, 돌 순, 차례 순, 돌아다닐 순 恂=진실할 순, 믿을 순, 온공스러울 순 旬=열흘 순, 두루할 순, 고를 순, 가득할 순, 요사스런 별 순 栒=경쇠걸이 순, 순나무 순 楯=난간 순, 방패 순, 뺄 순, 상여 순 橓=무궁화나무 순 殉=죽은 사람을 따라 죽을 순, 구할 순, 좇을 순 洵=웅덩이물 순, 소리없이 눈물흘릴 순, 믿을 순 淳=맑을 순, 순박할 순 狥=徇의 俗字 珣=옥그릇 순, 옥 이름 순 盹=눈 감을 순, 졸 순 盾=방패 순, 벼슬이름 순 眴=눈짓할 순 瞬=눈 깜작일 순, 잠깐 순 笋=초목 성할 순 筍=죽순 순, 대싹 순 紃=신에 실선 두를 순, 실 띠 순, 법 순, 좇을 순 純=실 순, 순수할 순, 온전할 순, 부드러울 순 肫=광대뼈 순, 정성스러울 순 脣=입술 순 舜=순임금 순, 무궁화 순 荀=풀 이름 순, 성씨 순 蓴=순나물 순 蕣=무궁화 순 詢=꾀할 순, 물을 순, 믿을 순 諄=거듭 일러줄 순, 지극할 순 醇=전국술 순, 두터울 순, 삼갈 순, 순수할 순 錞=사발종 순 順=좇을 순, 부드러울 순, 차례 순, 성씨 순 馴=길들일 순, 착할 순 駨=말이 달려갈 순 駿=준마 순, 클 순, 빠를 순, 높을 순 鬊=머리 풀어헤칠 순 鶉=메추라기 순, 옷 해질 순 [술] 噊=위태할 술 戌=개 술, 열한째 지지 술, 때려 부술 술 絉=끈 술, 줄 술 術=재주 술, 심술부릴 술, 술법 술 述=이을 술, 좇을 술, 조회할 술, 밝힐 술 鉥=돗바늘 술, 인도할 술 [숭] 崇=높을 숭, 공경할 숭, 마칠 숭, 산이름 숭 崧=산 불끈 솟을 숭, 산 웅장할 숭, 산이름 숭 嵩=높을 숭, 산이름 숭 菘=배추 숭 [쉬] 倅=버금 쉬, 아직 벼슬자리에 오르지 않은 아들 쉬, 원님 쉬 晬=돐 쉬, 첫 생일 쉬 殳= 泅= 淬=칼 담글 쉬, 물들일 쉬, 범할 쉬 焠=물들일 쉬, 칼날 물에 담글 쉬, 지질 쉬, 태울 쉬 [슬] 厀=膝의 本字 瑟=비파 슬, 거문고 슬, 깨끗한체할 슬, 바람소리 슬 膝=무릎 슬, 종지뼈 슬, 치슬말 슬 虱=蝨과 同字 蝨=이 슬 [습] 塍= 慴=두려울 습, 겁낼 습 拾=주울 습, 거둘 습, 팔찌 습, 벼슬이름 습 湿=濕과 同字 濕=젖을 습, 소 귀 벌룩거릴 습, 근심 습 熠=환할 습, 선명할 습, 반딧불 반짝거릴 습 習=익힐 습, 거듭 습 褶=슬갑 습 襲=옷 덧입을 습, 벼슬 대물릴 습, 반복할 습, 합할 습, 염습할 습, 엄습할 습 隰=진펄 습 [승] 丞=이을 승, 도울 승, 벼슬의 이름 승, 향상할 승 乗=乘의 俗字 乘=오를 승, 곱할 승, 셈하는 단위 승, 같은 물건 네 개 승 僧=중 승 勝=이길 승, 경치가 좋을 승, 가질 승 升=되 승, 오를 승, 피륙의 짜인 날을 세는 단위 새 승, 괘 이름 승 呏=용량의 단위 갤런(gallon) 승 承=받들 승, 이을 승, 도울 승, 차례 승 昇=해 돋을 승, 풍년들 승 甸=다스릴 승, 수레 승 繩=노끈 승, 법 승, 다스릴 승, 이을 승 蠅=파리 승 陞=오를 승, 올릴 승 鬙=터럭 더부룩할 승 [싀] 伜= [시] 乨=始의 古字 使=부릴 시, 하여금 시, 사신 시 侍=모실 시, 가까울 시, 좇을 시 偲=간절히 책망할 시, 살피고 힘쓸 시, 굳셀 시 兕=외뿔난 소 시 凘=성에 시 匙=숟가락 시, 열쇠 시 卶=크게 경사스러울 시 厮=부릴 시, 마부 시, 나눌 시 咶=핥을 시, 이야기할 시 啻=뿐 시, 쯤 시 嘶=말 울 시, 목 쉴 시, 울부짖을 시 塒=홰 시 始=비로소 시, 처음 시, 시작할 시, 별이름 시 媤=시집 시 寺=내관 시 尸=시동 시, 주검 시 屍=주검 시, 송장 시 屎=똥 시 市=저자 시, 흥정할 시, 집 많은 동리 시 廝=부릴 시, 천할 시, 마부 시 弑=윗사람 죽일 시 弒=弑의 本字 恃=믿을 시, 의지할 시, 어머니 시 提=떼지어 날 시, 고을이름 시 施=베풀 시, 쓸 시, 더할 시, 안팎 곱사등이 시, 버릴 시, 줄 시, 은혜 시, 공로 시 是=이 시, 바를 시, 곧을 시 昰=是와 同字 時=때 시, 끼니 시, 이 시, 엿볼 시, 가끔 시 枲=수삼 시, 도꼬마리 시 枾=柹의 本字 柴=섶 시, 불 땔 나무 시, 시제지낼 시 柹=감 시 柿=柹의 俗字 澌=물 잦을 시, 다할 시 猜=의심낼 시, 시기할 시, 두려워할 시, 사나울 시 矢=살 시, 소리살 시, 곧을 시, 베풀 시, 똥 시 示=보일 시, 바칠 시, 가르칠 시 禔=복 시, 편안할 시 緦=보름새베 시, 시마복 시, 석달복 시 翅=날개 시, 깃 시, 뿐 시 翤=翅와 同字 茬= 蒔=소회향 시, 모종낼 시 蓍=뺑대쑥 시, 시초 시 視=볼 시, 견줄 시, 본받을 시, 대접 시 試=시험할 시, 더듬을 시, 비교할 시 詩=귀글 시, 풍류가락 시, 받들 시 諟=이 시, 살필 시, 다스릴 시 諡=행장 시, 시호 시 諰=눈 휘둥글할 시, 곧은말 시 豉=메주 시, 콩자반 시 豕=돼지 시, 돝 시 豺=승냥이 시, 늑대 시 釃=술 거를 시 鍉=숟가락 시, 열쇠 시 顋=뺨 시, 볼 시 飴=기를 시 鰣=준치 시 [식] 喰=먹을 식 埴=찰진흙 식, 흙 이길 식, 더듬어 걸을 식 媳=며느리 식 寔=이 식, 참 식, 뿐 식 式=법 식, 쓸 식, 제도 식, 수레 앞 가로막대 식 息=숨쉴 식, 그칠 식, 자식 식, 기를 식 拭=닦을 식, 다듬을 식 栻=점판 식 植=심을 식, 세울 식, 초목 식 殖=날 식, 심을 식, 성할 식 湜=물 맑을 식, 엄숙할 식 熄=불 꺼질 식, 없어질 식, 마칠 식 篒= 蝕=벌레먹을 식, 일식 식, 월식 식 識=알 식 軾=수레앞 가로막이 나무 식, 수레 안에서 절할 식 食=밥 식, 먹을 식, 씹을 식, 제 식, 헛말할 식 飾=꾸밀 식, 문채날 식, 분 바를 식 [신] 伩=信과 同字 伸=펼 신, 다스릴 신, 기지개 신 侁=떼지어 갈 신 信=믿을 신, 밝힐 신, 맏길 신, 이틀 밤을 잘 신, 사신 신 兟=나아갈 신, 총총 들어설 신 卂=빠를 신, 급히 날 신 吲=비웃을 신 呻=읊조릴 신, 끙끙거릴 신 哂=빙그레 웃을 신, 비웃을 신 噺=이야기 신 囟=숨구멍 신, 정수리 신 姺=나라이름 신 娠=아이밸 신, 마부 신 宸=집 신, 처마 신, 대궐 신 愼=삼갈 신, 정성스러울 신, 고요할 신 新=새 신, 처음 신, 고울 신 晨=샛별 신, 아침을 아뢸 신 汛=물뿌릴 신 瀋= 燼=깜부기불 신, 불똥 신, 재난의 뒤 신 申=펼 신, 기지개켤 신, 거듭 신, 아홉째 지지 신, 원숭이 신 矧=하물며 신, 잇속 드러날 신 神=천신 신, 영검할 신, 신명 신, 정신 신 紳=큰 띠 신, 벼슬아치 신 脤=사직제 지낸 고기 신 腎=콩팥 신, 불알 신, 자지 신 臣=신하 신, 두려울 신 莘=약 이름 신, 많은 모양 신, 나라이름 신 薪=섶 신, 땔나무 신, 월급 신, 성씨 신 藎=갈골 신, 나아갈 신, 남을 신 蜃=큰 조개 신, 이무기 신, 술잔 신 訊=물을 신, 다스릴 신, 죄 조사할 신, 알릴 신, 꾸짖을 신 誶=물을 신 贐=노자 신, 노수 신 身=몸 신, 아이 밸 신, 몸소 신 辛=매울 신, 고생 신, 여덟째 천간 신 辰=날 신 迅=빠를 신, 억셀 신 頣=눈들고 볼 신 顖=囟의 俗字 駪=말 우물거릴 신, 빨리 걸을 신 辰=날 신 神=천신 신, 영검할 신, 신명 신, 정신 신 [실] 失=잃을 실, 그르칠 실 実=實의 略字 室=집 실, 아내 실 實=열매 실 悉=모두 실 蟋=귀뚜라미 실 飋=쓸쓸한 바람 실 [심] 伈=두려워할 심 吢=개가 토할 심 審=살필 심 尋=찾을 심 心=마음 심 梣=물푸레나무 심 沁=스며들 심 沈=성 심 沉=沈과 同字 深=깊을 심 潯=물가 심 燖=삶을 심 甚=심할 심, 무엇 심 芯=등심초 심 葚=뽕나무 열매 심 諗=고할 심, 생각할 심, 꾀할 심 諶=참 심 鐔=칼날 아래 코등이 심 鱏=칼철갑상어 심 鱘=심어 심 沈=성 심 [십] 什=열 사람 십 兙=무게의 단위 데카그램 십 十=열 십, 전부 십 卌=사십 십 拾=十의 갖은자 辻=네거리 십 拾=十의 갖은자 [쌍] 双=雙의 略字 雙=짝 쌍 [씨] 氏=성 씨 [아] 丫=가장귀 아 亜=亞의 略字 亞=버금 아 俄=갑자기 아 俹=기댈 아, 의지할 아, 거만할 아 児=兒의 略字 兒=아이 아 厊=어긋날 아 哦=놀람의 어조사 아 唖=啞의 略字 唲=선웃음칠 아 啊=사랑할 아, 어조사 아 啞=벙어리 아, 놀랄 아 娥=예쁠 아 娿=아리따울 아 婀=娿와 同字 峨=산 높을 아 峩=峨와 同字 御=맞을 아 我=자기 아 牙=어금니 아, 대장 기 아 猗=부드러울 아 疴=앓을 아 砑=갈 아 笌=대싹 아 芽=싹 아 莪=지칭개 아 蛾=누에나방 아 衙=마을 아 訝=맞아들일 아, 의심할 아 迓=마중할 아 錏=투구의 목가림 아 阿=언덕 아, 아름다울 아, 알랑거릴 아 雅=아담할 아 餓=주릴 아 鴉=갈가마귀 아, 검을 아 鵝=거위 아 鵞=鵝와 同字 [악] 偓=거리낄 악 剭=형벌할 악 卾=윗턱 악 咢=놀랄 악 喔=닭 우는 소리 악, 아첨해 웃는 소리 악 噩=놀랄 악 堊=흰 흙 악 岳=큰 산 악 嶽=높은 산 악 幄=장막 악 悪=惡의 略字 惡=나쁠 악 愕=놀랄 악 握=잡을 악, 손아귀 악 樂=풍류 악 渥=두터울 악 腭=잇몸 악 萼=꽃받침 악 葯=구리때 잎 악, 동일 악 覨=오래 볼 악 諤=직언할 악 鄂=나라이름 악 鍔=칼날끝 악 顎=턱 악 鰐=악어 악 鶚=물수리 악 齶=잇몸 악 齷=악착할 악 [안] 侒=편안할 안 偐=거짓 안 唵= 喭=추솔할 안 安=편안할 안, 어찌 안 岸=물가 언덕 안 按=살필 안, 어루만질 안 晏=늦을 안, 편안할 안 案=책상 안, 생각할 안 桉=案과 同字 殷=검붉을 안 犴=들개 안 眼=눈 안 諺=용맹스러울 안, 뻐득뻐득할 안 贋=가짜 안 閼= 雁=鴈과 同字 鞍=안장 안 顏=얼굴 안, 색채 안 顔=顏과 同字 鮟=아귀 안 鴈=기러기 안 [알] 嘎=새소리 알 嘠=嘎의 俗字 戞=창 알 按=막을 알 揠=뽑을 알 斡=돌릴 알, 주선할 알 歹=뼈 앙상할 알, 잔골 알, 살 발린 뼈 알 穵=구멍 알 訐=들추어 낼 알 謁=아뢸 알, 뵈올 알 軋=수레 삐걱거릴 알 遏=막을 알 頞=콧마루 알 鴶=뻐꾸기 알 [암] 啽=잠꼬대 암 媕=머뭇거릴 암 岩=巖의 俗字 嵒=嵓과 同字 嵓=바위 암, 가파를 암 巖=바위 암, 험할 암 庵=초막 암 揜=덮을 암 晻=어두울 암 暗=어두울 암, 몰래 암, 어리석을 암 癌=종양 암 腤=고기 삶을 암 菴=암자 암 葊=풀이름 암 蓭=암자 암 諳=욀 암 闇=어두울 암, 어리석을 암 頷=끄덕일 암 馣=향기로울 암 黯=어두울 암 [압] 儑=잔피할 압, 용렬할 압 匎=사치스럽지 않을 압, 검약할 압 匼= 压=圧과 同字 唈=숨 느껴 쉴 압 圧=壓의 略字 壓=누를 압 押=수결 둘 압, 누를 압 狎=친근할 압, 업신여길 압 鴨=오리 압 [앙] 仰=우러를 앙 佒=몸 거북할 앙 卬=자기 앙 咉=목메어 슬피 울 앙 坱=티끌 앙 央=가운데 앙 怏=원망할 앙 昂=높을 앙 昻=오를 앙, 밝을 앙 殃=재앙 앙 泱=끝없을 앙 盎=동이 앙 秧=모 앙 鞅=가슴걸이 앙, 소고삐 앙 鴦=암원앙새 앙 [애] 僾=어렴풋할 애 厓=언덕 애, 물가 애 呃=재채기할 애 哀=슬플 애, 가여울 애 哎=애통하는 소리 애 唉=대답하는 소리 애 唲=어리광 부릴 애, 응석 부릴 애 啀=물어뜯을 애 喝=목 쉴 애 嗄=목 쉴 애 嘊=비틀거릴 애 噫=트림할 애 噯=트림할 애 埃=티끌 애, 속세 애 娭=계집종 애 崕=崖와 同字 崖=낭떠러지 애 愛=사랑 애 挨=밀칠 애 捱=막을 애 曖=희미할 애 欸=한숨쉴 애 涯=물가 애 漄=물가 애 獃=어리석을 애 皚=흴 애 睚=눈흘길 애 瞹=흐릿할 애 碍=礙의 俗字 磑=맷돌 애 礙=막을 애 艾=쑥 애 薆=숨겨질 애 藹=화기로울 애 阨=隘와 同字 隘=좁을 애 靄=아지랭이 애 靉=구름낄 애 騃=어리석을 애, 말달릴 애 [액] 厄=재앙 액 呝=울 액 嗌=呝과 同字 戹=좁을 액 扼=움켜쥘 액 掖=겨드랑이에 낄 액 搤=움켜쥘 액 液=즙 액 縊=목 맬 액 腋=겨드랑이 액 阨=막힐 액 隘=阨과 同字 額=이마 액, 수량 액 [앵] 嚶=새 소리 앵 嫈=예쁠 앵 桜=벚나무 앵 櫻=앵두나무 앵 罃=술병 앵 罌=술병 앵 鶯=꾀꼬리 앵 鷪=꾀꼬리 앵 鸚=앵무새 앵 [야] 也=단정의 어조사 야 亱=夜의 俗字 倻=땅이름 야 偌=성씨 야, 너무 야 冶=단련할 야, 대장장이 야 喏=공손히 대답할 야 埜=들판 야 夜=밤 야 惹=끌릴 야, 어지러울 야 揶=희롱할 야 斜=고을이름 야 椰=야자나무 야 爺=아비 야, 노인 야 耶=의문의 어조야 야, 아비 야 若=땅이름 야, 지혜(범어의 음역) 야 裸= 邪=의문의 어조사 야, 희롱할 야 野=들판 야 若=땅이름 야, 지혜(범어의 음역) 야 [약] 叒=동방귀신나무 약 喲=감탄하는 어조사 약 嫋=가냘플 약 弱=약할 약, 어릴 약 爚=스러질 약 禴=종묘의 여름제사 약 篛=죽순 약 籥=피리 약, 잠글 약 約=대략 약, 맹세할 약, 간소할 약, 맺을 약 若=같을 약, 자네 약, 만약 약 葯=꽃밥 약 蒻=구약나물 약 薬=藥의 略字 藥=약 약 躍=뛸 약 鑰=자물쇠 약 鰯=멸치 약, 정어리 약 鶸=댓닭 약, 투계 약 龠=피리 약 掠=노략질할 약 略=간략할 약, 노략질할 약, 잔꾀 약 [양] 佯=거짓 양, 어정거릴 양 勨=느즈러질 양, 힘쓸 양, 움직일 양 勷=급할 양 嚷=떠들 양 壌=壤의 略字 壤=흙 양, 풍년들 양 嬢=孃의 略字 孃=계집아이 양 徉=배회할 양 恙=근심 양 揚=드높일 양, 칭찬할 양 攘=물리칠 양, 빼앗을 양 敭=오를 양 暘=해 돋을 양 楊=갯버들 양 樣=모양 양, 모범 양 洋=큰 바다 양, 넘칠 양 漾=물결 출렁거릴 양 瀁=물결 일렁일 양 瀼=이슬 많은 모양 양, 강이름 양 烊=구울 양, 녹일 양 煬=구울 양 痒=가려울 양, 옴 양 瘍=머리헐 양, 종기 양 癢=가려울 양 眻=눈 아름다울 양 禳=푸닥거리할 양 穰=풍년들 양 羊=양 양 蘘=양하 양 襄=오를 양, 장사지낼 양 詳=거짓 양 讓=사양할 양 輰=상여수레 양 釀=술 빚을 양 鑲=거푸집 속 양 陽=볕 양, 드러낼 양, 시월 양, 거짓 양 颺=날릴 양, 높일 양 養=기를 양, 다스릴 양, 봉양할 양 驤=날뛰는 말 양 亮=밝을 량, 임금의 상중 량 兩=두 량 凉=서늘할 량 梁=들보 량, 다리 량 糧=양식 량 良=어질 량, 좋을 량, 남편 량 諒=헤아릴 량 量=헤아릴 량, 용량 량 [어] 唹=고요히 웃을 어 圄=가둘 어 圉=마부 어, 변방 어 御=거느릴 어 敔=금할 어, 풍류그칠 어 於=방향의 어조사 어, 대신할 어 淤=앙금 어, 진흙 어 漁=물고기 잡을 어 瘀=어혈질 어 禦=막을 어, 그칠 어 語=말씀 어 飫=먹기 싫을 어, 배부를 어 馭=말 부릴 어 魚=물고기 어 齬=이 어긋날 어 [억] 億=억 억, 편안할 억, 이바지할 억, 헤아릴 억, 인민 억 憶=생각 억 抑=누를 억, 억울할 억 檍=참죽나무 억, 박달나무 억, 싸리나무 억 繶=땋은 노 억 臆=가슴 억, 가득할 억 [언] 偃=자빠질 언 傿=鄢과 同字 匽=숨길 언, 길 곁 언, 한데 뒷간 언 唁=위문할 언 喭=조문할 언 嘕=기꺼워할 언, 즐거워할 언, 빙그레할 언 堰=방죽 언 嫣=생긋생긋 웃을 언 彥=착한 선비 언, 클 언 彦=彥과 同字 焉=어찌 언, 의심쩍을 언 言=말씀 언, 자기 언, 우뚝할 언 諺=상말 언 讞=죄 의논할 언 這=맞이할 언 鄢=땅이름 언 鼴=두더쥐 언, 소 같은 큰 쥐 언 鼹=鼴과 同字 [얼] 乻=땅이름 얼 噦=재채기할 얼 孼=첩자식 얼, 요물 얼 孽=孼과 同字 臬=법 얼, 문지방 얼, 과녁 얼 蘖=그루터기 얼 隉=위태할 얼 [엄] 俺=자기 엄, 클 엄 儼=공경할 엄 剦= 厂=굴바위 엄, 기슭 엄 厱=언덕 비탈 엄 厳=嚴과 同字 噞=고기 우물거릴 엄 嚴=굳셀 엄, 공경할 엄, 엄할 엄 奄=문득 엄, 가릴 엄, 그칠 엄, 오랠 엄 崦=해 지는 산 이름 엄 巖=높을 엄 广=바윗집 엄 掩=거둘 엄, 가릴 엄 揜=찾아가질 엄, 곤박할 엄 曮=해 다니는 길 엄 欕=엄나무 엄 淹=담글 엄, 오래머물 엄 罨=그물 엄 醃=절일 엄, 김치 엄 閹=고자 엄, 내시 엄 [업] 俺=자기 업, 클 업 嶪=산이 높고 웅장할 업 嶫=嶪과 同字 業=일 업, 위태할 업, 씩씩할 업, 벌써 업, 공경할 업 鄴=땅이름 업, 성씨 업 [엇] 旕=땅이름 엇, 엇 엇 [에] 恚=성낼 에, 원망할 에 曀=음산할 에, 가리울 에 [여] 与=與와 同字 予=자기 여 伃=궁녀 벼슬이름 여, 아름다울 여 余=자기 여, 남을 여 侞=온순할 여 如=같을 여, 만약 여, 어떠할 여, 이를 여 歟=그런가할 어조사 여 汝=물 이름 여, 물에 젖을 여 玙=璵의 簡體字 璵=보배옥 여 礖=여돌 여 絮=성씨 여 舁=마주들 여 與=너울너울할 여, 더불어 여, 같을 여, 미칠 여 艅=나룻배 여 茹=띠 뿌리 여, 받을 여, 헤아릴 여 蘆=꼭두서니 려 輿=수레바탕 여, 짐질 여 轝=輿와 同字 錄=사실할 려 録=録와 同字 餘=남을 여, 나라이름 여 勵=힘쓸 려, 가다듬을 려 呂=풍류 려, 등골뼈 려, 성씨 려 女=계집 녀, 시집보낼 녀 廬=초가 려, 움막 려 旅=나그네 려, 베풀 려 濾=씻을 려, 맑을 려 礪=돌 단단할 려 閭=마을 려 驪=가라말 려, 나라이름 려, 산이름 려 麗=고울 려, 빛날 려, 베풀 려 黎=무리 려, 동틀 려 [역] 亦=또 역, 모두 역 伇=役의 古字 圛=맴돌 역 域=경계 역, 범위 역 嶧=연달아 있는 산 역 役=부릴 역, 국경 지킬 역 懌=기꺼울 역 易=바꿀 역 淢=빨리 흐를 역 疫=염병 역 繹=삭일 역, 베풀 역, 실 끝 찾을 역 訳=譯의 略字 譯=통변할 역, 번역할 역 逆=거스를 역 閾=문지방 역 駅=驛의 略字 驛=잇닿을 역, 쌀 뾰족뾰족할 역, 역말집 역 力=힘 력, 부지런할 력 曆=셀 력, 세월 력 歷=지낼 력, 겪을 력 轢=수레바퀴에 치일 력, 서로 부닥칠 력 [연] 偄=연약할 연, 공손할 연 兖=兗의 俗字 兗=고을이름 연, 믿을 연, 단정할 연 唌=참소할 연 嘫=대답할 연 噮=몹시 달 연 嚥=침 삼킬 연, 목구멍 연 囦=물 깊을 연 埏=땅 가장자리 연 堧=빈 땅 연 妍=姸과 同字 姢=娟과 同字 姸=고을 연, 사랑스러울 연 娟=어여쁠 연, 춤추는 모양 연 嬿=아름다울 연 宴=잔치할 연, 편안할 연 延=미칠 연, 닿을 연 悁=분할 연, 근심할 연 挻=당길 연, 달아날 연, 손바닥으로 칠 연 捐=버릴 연, 병들어 죽을 연 掾=아전 연, 기인할 연 揀=가릴 련, 분별할 련 曣=더울 연, 청명할 연 椽=서까래 연 櫞=연나무 연 沇=물 졸졸 흐를 연 沿=물 따라 내려갈 연, 좇을 연 涎=침 연, 물 졸졸 흐를 연 涓=물방울 떨어질 연, 조촐할 연 淵=못 연, 깊을 연, 북소리 둥둥할 연, 모래톱 연 渷=물 이름 연 演=펼칠 연, 긴 물줄기 연, 통할 연, 윤택할 연, 넓힐 연 烟=煙과 同字 焔= 焰= 然=불사를 연, 그러할 연, 허락할 연, 그러나 연 煙=연기 연 燃=불사를 연, 연등절 연 燕=제비 연, 편안할 연, 잔치 연, 나라이름 연 研=硏과 同字 硏=연마할 연 硯=벼루 연, 돌 연 筵=대자리 연 緣=인연 연, 서두를 연 縁=緣과 同字 縯=길 연, 늘일 연 羡= 羨=광중길 연 臙=목구멍 연, 연지 연 莚=만연할 연, 풀 이름 연 蜵=우렁찰 연, 벌레 이름 연 蠕=벌레 기어갈 연 衍=성할 연, 넓을 연, 물이 넘칠 연, 상자 연, 아름다울 연, 흐를 연 讌=잔치 연, 모여 말할 연 豣=노루 연 軟=부드러울 연 鉛=납 연, 분 연 鳶=솔개 연 鷰=제비 연, 씨름 연 年=해 년, 나이 년, 나아갈 년 憐=불쌍할 련, 사랑할 련 戀=생각할 련, 사모할 련 撚=잡을 년, 닦을 년, 밟을 년, 손 끝으로 비빌 년 漣=물 놀이칠 련, 눈물 줄줄 흘릴 련 煉=쇠 불릴 련, 반죽할 련 璉=종묘 제기 련 秊=年의 本字 練=이길 련, 익힐 련, 겪을 련 聯=잇닿을 련, 관계할 련 輦=당길 련, 궁중의 길 련 蓮=연밥 련, 연꽃 련 連=이을 련, 끌릴 련 鍊=불린 쇠 련, 단련할 련 [열] 吶=말 느리게 할 열, 함성 지를 열 呐=吶과 同字 咽=목 멜 열, 막힐 열 噎=목 멜 열 悅=즐거울 열, 복종할 열, 성씨 열 悦=悅의 略字 熱=뜨거울 열, 쏠릴 열 說=기꺼울 열 説=說의 略字 閱=겪을 열, 군대 점호할 열, 용납할 열 閲=閱의 略字 列=벌릴 렬, 무리에 들어갈 렬, 항렬 렬, 베풀 렬 劣=용렬할 렬, 못날 렬, 어릴 렬, 서툴 렬 咽=목 멜 열, 막힐 열 烈=불 활활 붙을 렬, 빛날 렬, 업적 렬, 아름다울 렬, 사나울 렬 裂=찢어질 렬, 비단 자투리 렬 說=기꺼울 열 [염] 冄=冉과 同字 冉=가는 털 늘어질 염, 남생이 등 언저리 염, 침노할 염 厭=넉넉할 염, 아름다울 염, 게으를 염, 만족할 염, 미워할 염 塩=鹽의 俗字 懕=편안할 염 扊=문 빗장 염 染=꼭두서니 염, 물들일 염 檶=개수통 염 檿=산뽕나무 염 灎=灩의 俗字 灧=灩의 俗字 灩=물 그득할 염, 물결 출렁거릴 염 炎=불꽃 염, 임금의 호 염 琰=아름다운 옥 염, 비취옥 염 稔=풍년들 염, 오랠 염, 해 염 艶=고울 염, 얼굴 탐스러울 염 艷=艷의 本字 苒=풀 우거질 염, 덧없을 염 釅=술맛 텁텁할 염 閻=마을 염, 항간 염, 저승 염 饜=싫을 염, 물릴 염 髥=구레나룻 염 髯=髥의 俗字 魘=잠꼬대할 염 鹽=소금 염, 절일 염, 후렴 염 黶=검은 사마귀 염 廉=맑을 렴, 조촐할 렴, 청렴할 렴, 살필 렴 念=생각할 념, 읽을 념, 스물 념, 대단히 짧은시각 념 捻=손가락으로 찍을 념 殮=염할 염 簾=발 렴 [엽] 偞=가벼울 엽, 낮을 엽, 얼굴 예쁠 엽 僷=얼굴 예쁠 엽, 펴지 않을 엽 厭=제사할 엽, 모을 엽, 덜 엽, 누를 엽, 축하할 엽, 괴로울 엽, 숨길 엽 喦=땅 이름 엽, 다툴 엽 囁=소곤거릴 엽 摂=囁의 略字 攝=가질 녑, 고요할 녑 曄=빛날 엽, 번개 번쩍거릴 엽 曅=曄과 同字 熀=불빛 이글이글할 녑 燁=불 이글글할 엽, 번쩍번쩍할 엽 爗=불 이글글할 엽, 번쩍번쩍할 엽 葉=잎 엽, 세대 엽, 성씨 엽 靨=웃는 볼 옴쏙 들어갈 엽, 얼굴의 검은 사마귀 엽 獵=사냥할 렵, 진동할 렵, 어긋날 렵, 바람소리 렵 [영] 咏=노래할 영, 읊을 영 営=榮과 同字 塋=무덤 영 嬰=어릴 영, 더할 영, 머리치장할 영, 물요괴 영 嬴=성씨 영, 풀어낼 영, 가득할 영, 아름다울 영 嶸=산 높을 영 影=그림자 영, 형상 영 映=비칠 영, 빛날 영 景=그림자 영, 옷 영 暎=비칠 영 栄=榮과 同字 楹=기둥 영, 하관들 영 榮=영화로울 영, 오동나무 영, 추녀 영, 꽃다울 영 永=길 영, 오랠 영 泳=헤엄칠 영 浧=잠길 영, 앙금 영 渶=물 맑을 영 溁=濚과 同字 潁=물 이름 영, 성씨 영 濚=물 돌아나갈 영 濴=물 졸졸 흐를 영 瀛=큰 바다 영, 신선 사는 산 영 瀯=물소리 영, 물 돌아나갈 영, 물웅덩이 영 煐=빛날 영 營=지을 영, 헤아릴 영, 다스릴 영, 진 영 獰=모질 녕, 영악할 녕, 삽살개 털 녕 瑛=옥빛 영, 수정 영 瑩=귀막이 옥 영, 밝을 영 瓔=옥돌 영, 구슬 목걸이 영 癭=목 혹 영 盈=가득할 영, 넘칠 영, 물 흐를 영 碤=물 속 돌 영 穎=이삭 영, 송곳 끝 영, 빼어날 영 縈=얽힐 영, 맬 영 纓=갓끈 영, 말 가슴걸이 영, 얽힐 영 英=꽃부리 영, 영웅 영, 구름 뭉게뭉게 일어날 영, 아름다울 영 蠑=도마뱀 영 詠=읊을 영 贏=이문 남길 영, 멜 영, 자랄 영 迎=맞을 영 郢=땅이름 영 鍈=방울소리 영 锳=鍈과 同字 霙=눈꽃 영, 구름 피어오를 영 韺=풍류이름 영 令=하여금 령, 시킬 령, 가령 령, 개 목소리 령, 벼슬이름 령 囹=감옥 령 寧=편안할 녕, 차라리 녕, 어찌 녕 嶺=고개 령, 봉우리 령 怜=영리할 령 玲=옥소리 쟁그렁거릴 령, 아롱아롱할 령, 정교할 령 瑩=귀막이 옥 영, 밝을 영 羚=영양 령, 큰 뿔 양 령 聆=들을 령, 깨달을 령 鈴=방울 령 零=부서질 령, 비뚝비뚝 떨어질 령, 셈 나머지 령 靈=신령 령, 혼백 령, 좋을 령 領=옷깃 령, 고개 령, 거느릴 령, 받을 령 [예] 乂=풀 벨 예, 다스릴 예 倪=어릴 예, 도울 예, 끝 예 兌=날카로울 예 兑=兌와 同字 刈=풀 벨 예, 죽일 예 勩=수고로울 예 医=화살통 예 叡=밝을 예, 임금 예, 어질 예 呭=말 수다스럴 예 囈=잠꼬대할 예, 헛소리할 예 嫛=유순할 예, 갓난아이 예 拽=당길 예 掜=부칠 예, 비길 예, 잡을 예, 당길 예 曳=끌 예, 당길 예, 천천히 할 예 枘=자루 예 汭=물 이름 예, 물 굽이 예 泄=내칠 예, 날개 훨훨칠 예, 흩을 예 洩=퍼질 예, 날개 훨훨칠 예 濊=흐릴 예, 물 넘칠 예 猊=사자 예 獩=민족이름 예 睨=흘겨볼 예, 해 기울어질 예 睿=슬기로울 예, 밝을 예, 통할 예 瞖=눈에 백태 낄 예 穢=더러울 예, 거칠 예 繄=검푸른 비단 예, 탄식하는 소리 예 翳=어조사 예, 깃 일산 예, 가려 숨길 예, 새이름 예 芮=풀 뾰족뾰족할 예, 물가 예, 방패끈 예, 나라이름 예, 성씨 예 芸=藝의 略字 苅=벨 예, 자를 예 蕊=꽃술 예, 꽃 예 蕋=蕊의 俗字 薉=더러울 예 藝=재주 예, 글 예, 가늠할 예, 극진할 예, 심을 예 蘂=蕊와 同字 蚋=모기 예 蜺=말매미 예, 암무지개 예 裔=옷 뒷자락 예, 변방 예, 후손 예 詣=이를 예, 나아갈 예, 학문 통달할 예 誉=誉와 同字 譽=칭찬할 예, 이름날 예, 즐길 예 豫=기쁠 예, 편안할 예, 미리 예 銳=날카로울 예, 까끄라기 예 鋭=鋭와 同字 霓=암무지개 예 預=미리 예, 참여할 예 鯢=암고래 예 鷖=갈매기 예, 봉황 예 麑=아기사슴 예, 사자 예 例=본보기 례, 견줄 례, 대부분 례 禮=예도 례, 인사 례 醴=단술 례, 고을이름 례 隸=종 례, 노비 례, 검열할 례 [옌] 円= [오] 五=다섯 오 仵=짝 오, 같을 오 伍=五의 갖은자, 다섯 사람 오, 무리 오 俉=맞이할 오 俣=갈래질 오 傲=업신여길 오, 즐길 오 午=낮 오, 남쪽 오, 말 오 吳=오나라 오, 큰소리 지를 오, 성씨 오 吴=吳와 同字 吾=자기 오, 아들 오 呉=吳와 同字 唔=글 읽는 소리 오 啎=거스를 오 嗚=탄식할 오 嗷=여럿이 걱정할 오 嗸=슬픈 소리 오 噁=성낼 오 圬=흙손 오 塢=산 언덕 오, 마을 오 墺=방 구들 오, 물가 언덕 오 夭=끊어 죽일 오, 어릴 오 奥=奧와 同字 奧=속 오, 비밀 오, 깊을 오 娛=즐거울 오 娯=娛와 同字 媪=할미 오, 땅귀신 오 嫯=업신여길 오 寤=잠 깨어날 오, 깨달을 오 忢=悟의 古字 忤=거스릴 오, 미워할 오 悟=깨우칠 오 悪=惡의 略字 惡=미워할 오, 부끄러울 오 慠=거만할 오 懊=원망할 오, 번뇌할 오 捂=부닥칠 오, 거스릴 오 敖=희롱할 오, 거만할 오 於=오홉다 외칠 오 旿=밝을 오 晤=밝을 오, 만날 오 梧=머귀나무 오, 버틸 오 汙=汚와 同字 汚=더러울 오, 웅덩이 오 污=汚와 同字 澳=깊을 오, 물 이름 오 烏=까마귀 오, 검을 오, 어찌 오, 탄식할 오 熬=볶을 오, 애 끓는 소리 오 獒=사나운 개 오 窹=아궁이 오 筽=버들 고리 오 聱=못 들은채 할 오, 말 더듬거릴 오 茣=차조기 오 蜈=지네 오 襖=도포 오 誤=그릇할 오 謷=중얼거릴 오, 거만할 오 迂=굽을 오, 피할 오 迃=迂의 本字 迕=만날 오, 어길 오 遨=노닐 오 鄔=성 이름 오 鏊=번철 오 鏖=무찌를 오, 구리동이 오 隩=감출 오, 물가 언덕 오 驁=준마 오, 깔볼 오 鰲=큰 자라 오 鼇=매우 큰 자라 오 鼯=날다람쥐 오 惡=미워할 오, 부끄러울 오 [옥] 剭=목 벨 옥 墺=방 구들 옥, 물가 언덕 옥 屋=집 옥, 지붕 옥, 거북 덮개 옥 沃=기름질 옥, 부드러울 옥, 손 씻을 옥, 아리따울 옥 澳= 獄=감옥 옥 玉=구슬 옥, 사랑할 옥, 이룰 옥 鈺=보배 옥 鋈=은 올릴 옥 阿=누구 옥 [온] 媼=할미 온, 노파 온, 땅귀신 온 愠=慍의 俗字 慍=성낼 온, 병 온 昷=어질 온 氲=氳의 俗字 氳=기운 어릴 온, 기운 성할 온 温=溫의 俗字 溫=따뜻할 온, 부드러울 온 熅=서린 연기 온, 따뜻할 온, 숯불 온 瑥=사람이름 온 瘟=염병 온, 온역 온 稳=穩의 俗字 穏=穩과 同字 穩=편안할 온, 곡식 걷어 모을 온 緼=縕의 俗字 縕=모시 온, 묵은 솜 온 缊=縕과 同字 蕰=薀의 俗字 薀=마름 온, 쌓일 온 藴=蘊의 俗字 蘊=마름 온, 쌓일 온 轀=온량차 온 醖=醞의 俗字 醞=술 빚을 온 鞰= 韞=감출 온, 붉은 빛 온 饂=밀 국수 온 鰮=멸치 온 [올] 乯= 兀=우뚝할 올, 움직이지 않을 올 卼=위태할 올 嗢=목 멜 올 膃=해구 올, 살찔 올 阢=험할 올 兀=우뚝할 올, 움직이지 않을 올 [옹] 喁=물고기 입 오물거릴 옹 嗈=기러기 짝지어 울 옹 嗡=소 울음소리 옹, 벌레소리 옹 噰=화한 소리 옹 壅=막을 옹, 북돋울 옹 廱=벽옹 옹 擁=안을 옹, 품을 옹, 가질 옹 滃=구름 피어 오를 옹, 안개 자욱할 옹 瓮=항아리 옹 甕=항아리 옹, 물장군 옹 癕=등창 옹 禺=땅 이름 옹 罋=甕과 同字 翁=늙은이 옹, 새 목털 아래 옹 蓊=옹풀 옹, 우거질 옹 邕=막힐 옹, 사람이름 옹 雍=조화로울 옹, 학교 옹 雝=조화로울 옹, 학교 옹 顒=우러를 옹 饔=아침밥 옹 [와] 吪=움직일 와, 거짓말 와, 사투리 와 哇=음란한 소리 와, 게울 와 啝= 囮=새 후릴 와 婐=정숙할 와, 단정할 와 枙=옹이 와 洼=물 이름 와 渦=소용돌이 와, 시끄러울 와 猧=와개 와 瓦=질그릇 와, 기와 와 窊=웅덩이 와 窩=굴 와, 움집 와 窪=도랑 와, 깊을 와 臥=누울 와, 쉴 와 萵=상추 와, 부루 와 蛙=개구리 와 蝸=달팽이 와 訛=거짓말 와, 어긋날 와 譌=거짓 와, 와전될 와, 요사스런 말 와 [완] 刓=깎을 완 剜=깎을 완 唍=방긋 웃을 완 园=둥글게 깎을 완 垸=회 섞어 바를 완 妧=좋을 완, 고울 완 婉=순할 완, 예쁠 완, 젊을 완 完=완전할 완, 끝날 완, 지킬 완 宛=어슴푸레할 완, 언덕 위 언덕 완 岏=산 뾰족할 완 忨=탐할 완, 사랑할 완 惋=한탄할 완, 놀라 탄식할 완 梡=네 발 도마 완, 토막나무 완 椀=주발 완, 사발 완 浣=옷 빨 완, 씻을 완 涴=물 굽이쳐 흐를 완, 진흙 묻을 완 玩=희롱할 완, 보배 완 琓= 琬=보석 완, 아름다운 옥 완 盌=은 바리 완 碗=그릇 완 緩=느즈러질 완, 더딜 완 翫=익숙할 완, 싫을 완, 구경할 완 脘=중완 완 腕=팔뚝 완 莞=빙그레 웃는 모양 완 豌=동부 완, 완두 완 関=關과 同字 闗=關의 俗字 關=화살 먹일 완, 문지방 완, 빗장 완 阮=성씨 완 頑=완고할 완, 완악할 완 [왈] 曰=가로되 왈 [왕] 尫=절름발이 왕, 파리할 왕, 천상바라기 왕 往=갈 왕, 옛 왕, 이따금 왕 旺=고울 왕, 해무리 왕, 성할 왕 枉=굽을 왕, 원통할 왕 汪=물 출렁출렁할 왕, 연못 왕 瀇=아득할 왕, 넓을 왕, 고인 물 썪어 냄새날 왕 王=임금 왕, 할아버지 왕 皇=엄숙할 왕 迋=갈 왕, 두려울 왕 迬=往과 同字 [왜] 倭=나라이름 왜 娃=어여쁜 계집 왜, 얼굴 아름다울 왜 媧=여자이름 왜 歪=기울 왜, 비뚤 왜 矮=난장이 왜 蛙=개구리 왜, 음란한 소리 왜 [외] 偎=사랑할 외, 가물거릴 외 外=바깥 외, 다를 외, 잃을 외, 아버지 외 崴=평평치 아니할 외 嵔=산이름 외, 산 높을 외 嵬=산 뾰족할 외, 산 울뚝질뚝할 외 巍=높을 외, 높고 튼 모양 외 歪=기울 외, 비뚤 외 渨=더러울 외 煨=불에 묻어 구울 외, 그슬릴 외, 사람이름 외 猥=더러울 외, 굽을 외, 섞일 외, 개 새끼 셋 낳을 외 畏=두려울 외, 겁낼 외 碨=돌 자갈 땅 외, 바위 옹두라지 외 磈=돌 사닥다리 외 聵=배냇귀머거리 외 隈=모퉁이 외 隗=높을 외, 성씨 외 [요] 么=幺의 俗字 偠=허리 가늘 요 傜=부릴 요, 별이름 요 僥=거짓 요, 난장이 요 凹=오목할 요 匋=기오 굽는 가마 요 吆=애통하는 소리 요 喓=벌레소리 요 嗂=기꺼울 요 坳=凹와 同字 堯=높을 요, 요임금 요 墝=메마른 밭 요, 자갈 땅 요 夭=어여쁠 요, 무성할 요, 재앙 요, 일찍 죽을 요, 뱃속에 든 아이 요, 끊어 죽일 요 妖=요괴로울 요, 생긋생긋 웃는 모양 요 姚=어여쁠 요, 날랠 요, 멀 요 嬈=예쁜체 할 요 尭=堯와 同字 峣=嶢와 同字 嶢=높을 요 幺=작을 요, 어릴 요 徭=부릴 요 徼=돌아다닐 요, 순라 요, 변방 요, 구할 요 拗=고집스러울 요 搖=흔들 요, 회오리 바람 요, 별이름 요 撓=긁을 뇨, 흔들 뇨, 궁할 뇨 擾=길들일 요, 번거로울 요 曜=해 비칠 요, 요일 요 杳=아득할 요, 깊을 요, 고요할 요 樂=좋아할 요 橈=노 요 殀=단명할 요 澆=걸찰 요, 물 끌어올 요 燿=비칠 요, 빛날 요 瑤=아름다운 옥 요, 못 이름 요 瑶=瑤와 同字 祅=재앙 요 穾=깊숙할 요, 골방 요 窅=움펑눈 요, 까마득할 요 窈=고요할 요, 깊을 요 窯=기와가마 요, 오지그릇 요 約=약속할 요 縟= 繇=따를 요, 성할 요 繞=얽힐 요, 둘릴 요 耀=빛날 요 腰=허리 요 蕘=나무할 요, 거칠 요 蟯=촌백충 요 褥= 要=구할 요, 살필 요, 언약할 요, 허리 요, 기다릴 요, 부를 요, 반드시 요 謠=노래 요, 소문 요 遙=멀 요, 노닐 요 遶=둘릴 요 邀=맞을 요, 구할 요, 부를 요 陶=화락할 요, 순임금의 신하 요 饒=용서할 요, 배부를 요 鰩=날치 요 鷂=장끼 요, 새매 요 齩=뼈 깨물 요 了=마칠 료, 깨달을 료 僚=벗 료, 어여쁠 료 寮=동관 료, 관리 료, 중의 집 료 尿=오줌 뇨 料=말질할 료, 헤아릴 료, 대금 료 樂=좋아할 요 燎=뜰에 세운 횃불 료, 풀 태울 료 療=병 나을 료, 병 고칠 료 蓼=병 나을 료 遼=멀 료, 강이름 료, 나라이름 료 [욕] 嗕=오랑캐 이름 욕 慾=욕심낼 욕, 하고자할 욕 欲=욕심낼 욕, 하고자할 욕 浴=깨끗이할 욕, 못 이름 욕 溽=유월 더위 욕, 무더울 욕 蓐=새싹 욕, 가을 맡은 귀신 욕 谷=성씨 욕, 나라이름 욕 辱=욕될 욕, 굽힐 욕 [용] 俑=시체와 함께 매장하는 허수아비 인형 용 傛=혁혁할 용, 몸 굽힐 용 傭=머슴 용, 지을 용, 삯 용 冗=宂과 同字 勇=날랠 용, 용맹할 용 埇=골목길 용, 길 돋울 용 墉=작은 성 용, 담벽 용 宂=번잡할 용, 바쁠 용, 떠돌아 다닐 용 容=얼굴 용, 감쌀 용, 용서할 용 嵱=봉우리 쭝굿쭝굿할 용 庸=쓸 용, 떳떳할 용, 수고로울 용, 어리석을 용, 물도랑 용 慂=권할 용, 거들어 말할 용 慵=게으를 용 憃=천치 용 桶=곡식 셈하는 단위 휘 용 榕=용나무 용 槦=병기 얹는 시렁 용 涌=물 넘칠 용, 날칠 용 湧=涌의 俗字 溶=물 질펀히 흐를 용, 녹일 용 熔=鎔의 俗字 瑢=패옥소리 용 用=쓸 용, 재물 용, 통할 용 甬=물 솟아 오를 용, 골목길 용, 쇠북 꼭지 용, 곡식 셈하는 단위 휘 용 癰= 硧=숫돌 용 聳=솟을 용, 귀먹을 용, 공경할 용 舂=방아 찧을 용, 쇠북소리 용, 해가 질 용 茸=풀 뾰죽뾰죽 날 용, 못생길 용 蓉=연꽃 용, 약 이름 용 蛹=번데기 용 踊=뛸 용, 뒤축 없는 신 용 踴=뛸 용 鎔=불릴 용, 녹일 용, 거푸집 용 鏞=큰 쇠북 용 頌=얼굴 용, 모양 용 鱅=용어 용 龍=용 룡, 임금 룡 [우] 于=갈 우, 여기 우, 만족할 우, 탄식의 어조사 우 亏=于의 本字 佑=도울 우 偶=짝지울 우, 무리 우, 뜻밖에 우 優=넉넉할 우, 부드러울 우, 나을 우, 결단성 없을 우 区=區와 同字 區=경계 우, 저울 네 눈 우, 숨길 우 又=또 우, 용서할 우 友=벗 우, 합할 우 右=오른쪽 우, 높일 우, 강할 우, 도울 우 吘=부를 우 吽=개 싸울 우, 개 짖는 소리 우 喁=서로 부를 우 噢=슬퍼할 우 噳=뭇 사슴 우물거릴 우 嚘=말 얼버무릴 우, 탄식할 우 宇=집 우, 처마 기슭 우, 하늘 우 寓=살 우, 부탁할 우, 빙자할 우 尤=가장 우, 더욱 우, 탓할 우 愚=어리석을 우, 어두울 우, 업신여길 우 憂=근심 우, 상제될 우, 병 우 旴=해 돋을 우, 새벽 우 樞=느름나무 우 牛=소 우, 별 이름 우 玗=옥돌 우, 우기나무 우 瑀=옥돌 우 盂=바리 우, 사냥하는 진 우 祐=도울 우, 다행할 우 禑= 禹=하우씨 우, 성씨 우, 느릴 우 竽=큰 생황 우 紆=얽힐 우, 굽을 우 羽=깃 우, 오음의 하나 우 耦=쟁기 우, 겨리 우, 짝 맞을 우 耰=고무래 우, 곰방메 우 芋=토란 우 藕=연뿌리 우 虞=염려할 우, 즐거울 우, 갖출 우, 우제 지낼 우 謣=망령되게 말할 우 踽=타달거릴 우 迂=굽을 우, 피할 우, 멀 우 遇=만날 우, 대접할 우, 뜻밖에 우 郵=역말 우, 지날 우, 우편 우 釪=요령 우, 바리때 우 鍝=귀고리 우 隅=모퉁이 우, 기슭 우 雨=비 우 雩=기우제 우 麀=암사슴 우 麌=숫사슴 우 齲=충치 우 羽=깃 우, 오음의 하나 우 [욱] 勖=힘쓸 욱 勗=勖의 譌字 噢=슬퍼할 욱 奥=奧의 俗字 奧=따스할 욱, 모퉁이 욱 彧=빛날 욱, 문채날 욱 旭=빛날 욱, 햇살 치밀 욱, 교만할 욱 昱=햇빛 밝을 욱 栯=산앵두 욱 煜=비칠 욱, 불꽃 욱, 성할 욱 燠=더울 욱 稶=서직 무성할 욱 郁=문채날 욱, 자욱할 욱 頊=머리 굽실거릴 욱, 별이름 욱 [운] 云=이를 운, 움직일 운, 돌아갈 운 喗=입 클 운, 이빨 더러울 운 囩=돌릴 운 惲=의논할 운, 혼후할 운 暈=무리 운, 어지러울 운 橒=나무 무늬 운 殞=죽을 운, 떨어질 운 沄=물 콸콸 흐를 운, 끓을 운 澐=큰 물결 운 熉=누른 빛 운 篔=왕대나무 운 紜=얼크러질 운 耘=길 맬 운 芸=향풀 운, 궁궁이 운, 촘촘할 운, 성씨 운 蕓=운풀 운, 평지 운 運=움직일 운, 운수 운 隕=떨어질 운, 곤란할 운 雲=구름 운, 팔대손 운, 하늘 운 霣=떨어질 운, 천둥에 비 몰아올 운 韵=韻과 同字 韻=울림 운, 소리 맞을 운, 운 운 暈=무리 운, 어지러울 운 [울] 亐= 尉=성씨 울 蔚=고을이름 울 鬰=鬱과 同字 鬱=향기로운 풀 울 [웅] 熊=곰 웅, 빛날 웅 雄=수컷 웅, 영웅 웅, 웅장할 웅 [원] 元=으뜸 원, 착하고 어질 원, 일 년의 첫 날 원, 임금 원, 백성 원, 하늘 원 円=圓의 俗字 冤=원통할 원, 원한 원 原=근본 원, 거듭 원, 언덕 원, 기인할 원, 들판 원 厵=源과 同字 員=관원 원, 둥글 원 圎=圓의 俗字 園=동산 원, 능 원, 울타리 원 圓=둥글 원, 원만할 원, 화폐의 단위 원 圜=옥담 원, 둥글 원, 제단 원 垣=낮은 담 원, 보호하는 사람 원, 별 이름 원 媛=아리따운 여자 원, 여자 벼슬이름 원 嫄=여자이름 원 宛=서쪽 나라이름 원 寃=원통할 원, 굽힐 원, 죄 없을 원 怨=원망할 원, 원수 원, 분낼 원 愿=정성 원, 착할 원, 삼갈 원 援=당길 원, 사다리 원, 구원할 원 杬=몸 주무를 원, 나무이름 원 楥=떡갈나무 원, 실감개 원, 신골 원 楦= 沅=물 이름 원 洹=흐를 원, 물 이름 원 湲=물소리 원, 물 졸졸 흐를 원 源=근원 원, 샘 원, 계속할 원 爰=당길 원, 이끌 원, 가로되 원 猨=猿과 同字 猿=원숭이 원, 잔나비 원 瑗=도리옥 원, 구멍 큰 둥근 옥 원 綩=갓끈 원, 분홍빛 옷 원, 그물 원 芫=고기 잡는 풀 원, 여뀌 원 苑=나랏동산 원, 큰 바람 원 薗=園과 同字 蜿=굼틀거릴 원 袁=옷 치렁거릴 원, 성씨 원 諢=농담 원 謜=천천히 말할 원, 기꺼울 원 轅=진문 원, 멍에 원, 별 이름 원 逺=遠과 同字 遠=멀 원, 심오할 원 鋺=저울 바탕 원 阮=원나라 원, 성씨 원 院=원집 원, 공해 원, 절 원, 학교 원 隕=폭원 원 願=하고자할 원, 바랄 원, 생각할 원 騵=배 희고 갈기 검은 말 원 鴛=숫원앙새 원 鵷=원추새 원 黿=큰 자라 원 阮=원나라 원, 성씨 원 [월] 刖=발꿈치 자를 월 月=달 월 粤=말 내킬 월, 곰곰히 생각할 월, 나라이름 월 粵=粤과 同字 越=넘을 월, 뛸 월, 월나라 월 鉞=도끼 월 [위] 位=벼슬 위, 임금의 신분 위, 자리 위, 방위 위 倭=순한 모양 위, 빙글 돌아올 위 偉=클 위, 넉넉할 위, 기특할 위 偽=僞의 略字 僞=거짓 위, 속일 위 危=위태할 위, 무너질 위, 상할 위, 높을 위, 별 이름 위 厃=우러러 볼 위, 평고대 위 叞=안위할 위, 다리미 위 喟=한숨쉴 위 噅=거짓말 위, 곱사등이 위 噕=噅와 同字 囗=圍의 古字 囲=圍의 略字 圍=둘레 위, 에워 쌀 위, 한아람 위, 지킬 위 委=맡길 위, 버릴 위, 맘에 든든할 위, 벼이삭 고개 숙일 위 威=위엄 위, 두려울 위 尉=벼슬이름 위, 눌릴 위 幃=향낭 위, 홑휘장 위 慰=위로할 위 暐=햇빛 위, 빛 환할 위 渭=물 이름 위, 속 끓일 위 為=爲와 同字 煒=벌그레할 위, 환할 위 熨=다리미 위, 고약 붙일 위 爲=할 위, 다스릴 위, 하여금 위, 어미원숭이 위, 이룰 위 瑋=위옥 위, 노리개 위 痿=습병 위, 잘름거릴 위, 음위증 위 緯=씨줄 위, 별 오른편으로 돌 위 胃=밥통 위, 별 이름 위, 성씨 위 萎=마를 위, 풀 이름 위, 쇠약해질 위 葦=갈대 위, 작은 배 위 葳=초목 성할 위, 위유풀 위 蒍=蔿와 同字 蔚=제비쑥 위, 초목 우거진 모양 위, 잔무늬 위 蔿=풀 위, 성씨 위, 고을이름 위 蝟=고슴도치 위 衛=衞와 同字 衞=막을 위, 지킬 위, 핏기운 위, 나라이름 위 袆=褘와 同字 褘=휘장 위, 아름다울 위 諉=핑계할 위, 버릴 위 謂=고할 위, 이를 위 逶=비틀거릴 위 違=어길 위, 미적거릴 위, 되돌아올 위 闈=대궐안의 문 위 韋=다룬 가죽 위, 훌부들할 위, 군복 위, 성씨 위 韙=옳을 위 韡=꽃 환히 필 위 餧=먹일 위 魏=위나라 위, 대궐 위, 우뚝할 위 [유] 丣=酉의 古字 乳=젖 유, 종유석 유, 낳을 유, 젖먹일 유, 기를 유 亏= 亴= 侑=도울 유, 권할 유, 귀인을 모시고 밥먹을 유 俁= 俞=兪의 俗字 偊= 儒=선비 유, 나장이 유, 유도 유, 광대 유 兪=그럴 유, 대답할 유, 공손할 유 冘=머뭇거릴 유, 갈 유 匬=곡식 셈하는 단위 휘 유 卣=중술통 유 吁= 呦=사슴 우는 소리 유, 새짐승 우는 소리 유 唀=誘와 同字 唯=오직 유, 허락할 유 喩=깨우쳐 줄 유, 알릴 유, 비유할 유 喻=喩와 同字 嚅=말 머뭇거릴 유, 잔말할 유 囿=엔담 유, 고루할 유 堣= 壘= 壝=토담 유, 단 둘러쌓은 담 유 孺=젖먹이 유, 사모할 유, 딸릴 유 宥=너그러울 유, 죄 사할 유, 도울 유 嵎= 帷=휘장 유 幼=어릴 유, 사랑할 유 幽=숨을 유, 그윽할 유, 적을 유, 어두울 유, 귀신 유, 저승 유 庽= 庾=노적 유, 곡식 셈하는 단위 휘 유 悠=멀 유, 생각할 유, 한가할 유, 근심할 유 惟=꾀할 유, 오직 유, 생각할 유 愈=나을 유, 어질 유, 더욱 유, 병 나을 유 愉=기뻐할 유, 즐거울 유 懦=만만할 유, 나약할 유 揄=당길 유, 칭찬할 유, 희롱할 유 揉=풀 유, 부드럽게 할 유, 희일 유 攸=곳 유, 휙 달아날 유, 아득할 유, 대롱거릴 유 斿=깃발 유, 깃술 유, 면류관술 유 有=있을 유, 얻을 유, 과연 유, 또 유 杅= 柔=부드러울 유, 순할 유, 복종할 유 柚=유자 유 楡=느름나무 유, 서쪽 유 楢=부드러운 나무 유, 홰 유 榆=楡와 同字 油=기름 유, 구름 피어오를 유, 공손할 유 泑=물빛이 검을 유, 물이름 유 洧=물이름 유 游=헤엄칠 유, 노닐 유, 깃발 유 濡=적실 유, 막힐 유, 곱고 윤택할 유 牖=엇살창 유, 들창 유, 밝을 유, 인도할 유 猶=어미 원숭이 유, 같을 유, 오히려 유 猷=꾀 유, 그릴 유, 옳을 유, 탄식할 유 瑜=아름다운 옥 유 由=말미암을 유, 쓸 유, 지날 유 疣= 瘉=癒와 同字 瘐=죄인 주려 죽을 유 癒=병 나을 유, 병들 유 盱= 窬=판장문 유 窳=이지러질 유, 약할 유, 짐승이름 유 籲=부르짖을 유 糅=섞일 유, 얽힐 유, 잡곡밥 유 綏=깃발 늘어질 유 維=벼리 유, 이을 유, 맺을 유, 오직 유 緌=관 끈 늘어질 유 繆=어그러질 류 肉=둘레 유, 저울추 유, 살찔 유 腴=아랫배 살찔 유 臾=잠간 유, 착할 유, 나라이름 유, 활이 뒤로 젖혀질 유 莠=가라지 유, 추할 유 萸=수유 유 蕕=냄새나는 풀 유, 유풀 유 蕤=더북할 유 蚰=노래기 유, 땅지네 유 蚴=굼틀거릴 유 蝤=하루살이 유 蠕=굼실거릴 유 裕=넉넉할 유, 너그러울 유 褕=꿩의 깃으로 꾸민 옷 유, 쾌자 유 襦=저고리 유, 베쐐기 갓장이 유 誘=꾀일 유, 가르칠 유, 당길 유 諛=아첨할 유 諭=고할 유, 비유할 유 讉=성낼 유 踰=넘을 유 蹂=밟을 유, 쌀 씻을 유 逌=빙그레할 유 逰=遊의 俗字 逾=갈 유, 지날 유 遊=놀 유, 벗 사귈 유 遺=잃어버릴 유, 남을 유, 끼칠 유 酉=별 유, 열째 지지 유, 나아갈 유 釉=물건 빛날 유 鍮=놋쇠 유 鞣=다룬 가죽 유, 마른 가죽 유 鮪=상어 유 黝=검푸를 유, 검은칠할 유 鼬=청서 유, 족제비 유 龥=부르짖을 유 劉=이길 류, 죽일 류, 베풀 류, 성씨 류 杻=싸리 뉴 柳=버들 류, 별 이름 류 流=흐를 류, 번져나갈 류, 구할 류, 내칠 류, 달아날 류, 무리 류, 귀양보낼 류 溜=처마물 류, 낙수물 류, 증류수 류 琉=유리돌 류, 나라이름 류 留=머무를 류, 그칠 류, 오랠 류, 횡사할 류 硫=석류황 류, 유황 류 紐=단추 뉴, 맺을 뉴 類=같을 류, 나눌 류, 착할 류, 무리 류 [육] 儥=팔 육, 길 육 唷=소리지를 육 喅=뭇 소리 육 堉=기름진 땅 육 毓=기를 육, 어릴 육, 많을 육 粥=팔 육, 북쪽 오랑캐 육 肉=고기 육, 몸 육 育=기를 육, 날 육, 자랄 육 六=여섯 륙, 나라이름 륙 戮=죽일 륙, 육시할 륙, 욕할 륙 陸=뭍 륙, 길 륙, 어긋날 륙, 뛸 륙, 두터울 륙 [윤] 允=미쁠 윤, 마땅할 윤, 옳게 여길 윤, 좇을 윤, 허락할 윤 勻=가지런할 윤, 적을 윤 匀=勻과 同字 奫=물 깊을 윤, 물이 충충할 윤 尹=다스릴 윤, 바를 윤, 벼슬이름 윤, 믿을 윤 昀=햇빛 윤 玧=귀막이 구슬 윤 胤=맏아들 윤, 익힐 윤 論=차례 륜 贇=예쁠 윤, 아름다울 윤 赟=贇의 簡體字 鈗=창 윤 鋆=금(貴金) 윤 倫=인륜 륜, 무리 륜, 조리 륜, 의리 륜, 가릴 륜 崙=곤륜산 륜, 나라이름 륜 淪=빠질 륜, 물놀이칠 륜, 거느릴 륜 輪=바퀴 륜, 땅 길이 륜, 우렁찰 륜, 서릴 륜, 둘레 륜 [율] 凓=찬 기운 률 噊=위태할 율 汩=물 흐를 율, 빨리 걸을 율, 환할 율, 북 울릴 율, 걸을 율 潏=물 흐를 율 矞=송곳질할 율, 상서구름 율, 궤휼할 율, 귀신이름 율 聿=마침내 율, 지을 율, 오직 율, 스스로 율, 붓 율 律=법 률, 풍률 률, 지을 률, 저울질할 률 慄=두려울 률, 쭈그릴 률, 슬플 률, 떨 률 栗=밤 률, 신주 재목 률, 단단할 률, 무서울 률, 공손할 률 率=헤아릴 률, 과녁 률, 홀 한껏 다릴 률 [융] 戎=병장기 융, 싸움수레 융, 클 융, 너 융, 도울 융, 서쪽 오랑캐 융 瀜=물 깊을 륭 狨=원숭이 융 絨=삶은 실 융, 가는 베 융 融=부드러울 융, 밝을 융, 융통할 융, 불길 위로 오를 융, 귀신이름 융 隆=성할 륭, 높을 륭, 가운데 우뚝할 륭, 괘 이름 륭 [윽] 厼= [은] 听=벙긋거릴 은, 들을 은, 입이 큰 모양 은 嚚=어리석을 은, 말다툼할 은, 불칙하게 말할 은 圁=물이름 은 圻=언덕 은 垠=언덕 은, 하늘 가장자리 은, 경계 은 垽=해감 은, 찌끼 은 恩=은혜 은, 신세 은, 사랑할 은 慇=은근할 은, 공손할 은, 간절할 은 憖=물을 은, 공근할 은, 힘쓸 은, 서러워할 은 檼=집 마룻대 은, 대공 은 殷=많을 은, 무리 은, 클 은, 가운데 은, 은나라 은, 융성할 은, 천둥소리 은 溵=물소리 은, 물이름 은 狺=뭇 개 짖는 소리 은 珢=옥돌 은 癮=두드러기 은 言=심사 화평할 은 訔=시비할 은 訚=誾과 同字 誾=화평할 은 鄞=땅이름 은 銀=은 은, 돈 은 隐=隱과 同字 隠=隱의 俗字 隱=숨을 은, 아낄 은, 속걱정할 은, 불쌍히 여길 은, 점칠 은, 의지할 은, 쌓을 은 齗=잇몸 은, 말다툼할 은, 미워할 은 [을] 乙=새 을, 천간 이름 을, 굽힐 을, 생선의 창자 을, 모모 을 鳦=제비 을 [음] 吟=읊을 음, 끙끙거릴 음, 탄식할 음, 턱 끄덕거릴 음, 노래할 음, 말 더듬을 음, 울 음 吽=소 울 음 喑=소리지를 음, 안간힘 쓸 음, 목 쉴 음 婬=간통할 음, 새서방질할 음, 음탕할 음 岑=기슭 음, 언덕 음, 낭떠러지 음 崟=멧부리 음, 산 높을 음 廕=덮을 음 愔=조용할 음, 화평할 음 淫=방탕할 음, 간음할 음, 음란할 음, 넘칠 음, 적실 음, 오랠 음 蔭=덮을 음, 가릴 음, 그늘 음 陰=음기 음, 부인에게 예 가르칠 음, 몰래 음, 세월 음 霪=장마 음 音=소리 음, 편지 음, 음악 음 飮=마실 음 飲=飮과 同字 [읍] 俋=날쌜 읍, 밭 가는 모양 읍 唈=숨 느껴쉴 읍 悒=답답할 읍, 근심할 읍 挹=잡아당길 읍, 잔질할 읍 揖=읍할 읍, 나아갈 읍, 깍지낄 읍, 공손할 읍 泣=눈물 줄줄 흘릴 읍, 부글부글 끓는 소리 읍 浥=젖을 읍, 흠치르르할 읍 煜=비칠 읍, 불꽃 읍, 성할 읍, 불빛 비칠 읍 邑=고을 읍, 답답할 읍 [응] 凝=엉길 응, 이룰 응, 열중할 응 応=應의 略字 應=응당 응, 꼭 응, 사랑할 응, 대답할 응 疑=정할 응 膺=가슴 응, 친할 응, 당할 응, 응할 응, 받을 응 鷹=매 응 [의] 亄=탐할 의, 인색할 의, 아낄 의 依=의지할 의, 기댈 의, 비슷할 의, 따를 의, 비유할 의, 병풍 의 倚=기댈 의, 의지할 의, 믿을 의 偯=울음 끝소리 의 儀=꼴 의, 모양 의, 법도 의, 좋을 의 儗=서로 못믿을 의, 참람할 의 冝=宜의 俗字 凒=눈서리 쌓일 의 劓=코 베일 의, 베일 의 医=醫의 略字 吚=탄식할 의, 신음할 의 宜=옳을 의, 마땅할 의, 유순할 의 崖=언덕 의 嶷=산이름 의 意=뜻 의, 생각 의, 의리 의, 형세 의 懿=아름다울 의, 클 의 擬=의논할 의, 헤아릴 의, 흡사할 의 椅=가래나무 의, 교의 의 欹=아름답다할 의, 거룩하다할 의 毅=굳셀 의, 발끈 성낼 의 涯=물가 언덕 의, 물이름 의 漪=물놀이칠 의 猗=불 깐 개 의, 탄식할 의, 길 의 疑=의심할 의, 두려워할 의, 그럴듯할 의 矣=말 그칠 의 礒=바위 의 縊=목 맬 의 義=옳을 의, 의리 의, 뜻 의 艤=배 닿을 의 薏=연밥 의, 율무 의 螘=목 매어 죽는 벌레 의 蟻=왕개미 의, 검을 의, 술구더기 의 衣=옷 의, 입을 의 誼=옳을 의, 다스릴 의 議=말할 의, 의논할 의, 꾀할 의 醫=의원 의, 병 고칠 의 錡=세발 가마 의, 쇠뇌틀 의, 휘뚝거릴 의 锜=錡와 同字 饐=밥 쉴 의 [읫] 夞= [이] 二=두 이, 풍신 이, 같을 이, 의심할 이 以=써 이, 쓸 이, 까닭 이, 함께 이, 거느릴 이 伊=저 이, 이 이, 오직 이, 답답할 이, 성씨 이 佁=미련스러울 이 佴=버금 이 侇=무리 이, 주검 이 刵=귀 베일 이 勩=수고로울 이 匜=손대야 이, 술잔 이 台=자신 이, 기쁠 이, 기를 이 咡=입 어귀 이 咦=크게 부를 이, 웃을 이 咿=선웃음칠 이, 책 읽는 소리 이 嗌= 坨=땅이름 이 夷=동쪽 오랑캐 이, 평평할 이, 기꺼울 이, 상할 이, 베풀 이, 괘 이름 이 姨=이모 이, 처이모 이 寅=공경할 이, 범 이, 동북 이 尓=爾와 同字 尔=爾와 同字 已=이미 이, 그칠 이, 버릴 이, 너무 이 弍=二의 古字 弛=늦출 이, 활 부릴 이, 방탕할 이, 해이할 이 彛=彝의 俗字 彝=떳떳할 이, 법 이, 종묘 제기 이, 술통 이 彞=彛와 同字 怡=기쁠 이, 즐거울 이 敡=업신여길 이, 쉽게 말할 이 施=비뚤어질 이, 옮길 이, 잘난체할 이, 벗을 이, 미칠 이 易=쉬울 이, 다스릴 이, 게으를 이, 편할 이 栮=버섯 이, 느타리 이 洟=콧물 이, 눈물 이, 못이름 이 爾=너 이, 가까울 이, 오직 이 珆=옥돌 이 珥=귀막이 옥 이, 귀고리 이, 해무리 이 異=다를 이, 괴이할 이, 나눌 이 痍=상할 이, 다칠 이, 흠집 이 移=옮길 이, 모낼 이, 변할 이 而=순접의 어조사 이, 너 이, 말이을 이, 이에 이 耳=귀 이, 조자리 이, 말 그칠 이, 여덟대 손자 이 肄=익힐 이, 수고할 이, 휘추리 이, 곁가지 이 苡=율무 이, 질경이 이 荑=흰 비름 이, 베일 이 蛇=든든할 이 訑=자랑할 이 詑=자랑할 이 詒=줄 이, 느른할 이 貳=二의 갖은자, 버금 이, 의심낼 이, 마음 변할 이, 이별할 이 貽=끼칠 이, 줄 이 迤=든든할 이 迩=邇의 俗字 邇=가까울 이 隶=밑 이 頉=기를 이 頤=턱 이, 턱 끄덕거릴 이, 기를 이, 늙은이 이, 괘 이름 이 飴=엿 이 餌=미끼 이, 이깝 이, 먹일 이, 흰떡 이 骪= 骫= 鮞=곤이 알 이 鮧=창자젓 이 黟=검을 이, 고을이름 이 利=날카로울 리, 이로울 리, 탐할 리, 편리할 리, 이자 리 吏=아전 리, 관리 리 履=가죽신 리, 신을 리, 밟을 리 易=쉬울 이, 다스릴 이, 게으를 이, 편할 이 李=오얏 리, 선비 천거리할 리, 역말 리, 보따리 리 梨=배나무 리 泥=진흙 니, 물이 더러워질 니, 흙손 니, 술취할 니, 이슬 맺힐 니 理=다스릴 리, 바를 리, 누늬낼 리, 성품 리, 이치 리, 고칠 리, 나무결 리 痢=이질 리, 곱똥 리, 설사 리 罹=만날 리, 근심할 리, 걸릴 리 裏=옷 안 리, 속 리 裡=裏의 俗字 里=마을 리, 근심할 리, 잇수 리 離=떠날 리, 베풀 리, 지날 리, 아름다울 리, 둘 리, 외손 리 [익] 弋=주살 익, 취할 익, 홰 익, 검을 익, 벼슬이름 익, 오랑캐 익 瀷=강이름 익 熤=빛날 익, 사람이름 익 益=더할 익 翊=도울 익 翌=다음날 익 翼=날개 익 謚=웃을 익 鷁=익새 익, 돛대 끝 바람개비 익 匿=숨을 닉, 숨길 닉, 덮어둘 닉, 몰래 붙을 닉, 쌀 닉, 술 담는 그릇 닉 溺=빠질 닉, 약할 닉, 헤어 나오지 못할 닉 益=더할 익 [인] 人=사람 인 仁=어질 인 仞=길 인 仭=길 인, 잴 인, 찰 인, 깊을 인 儿=어진사람 인 刃=칼날 인 刄=刃의 俗字 印=도장 인 咽=목구멍 인 囙=因의 俗字 因=인할 인 堙=막을 인 夤=조심할 인 姻=혼인 인 婣=姻과 同字 寅=세째지지 인 引=끌 인 忍=참을 인 扨=그러하나 인 氤=기운성할 인 洇=湮과 同字 湮=잠길 인 煙=김 인, 기운 인, 안개 인, 숯 그을음 인 禋=제사지낼 인 籾=벼 인 絪=기운 인 芢=씨 인 茵=자리 인 蚓=지렁이 인 裀=요 인 認=알 인 靭=韌과 同字 靷=가슴걸이 인 魜=인어 인 吝=아낄 인 燐=도깨비불 인 璘=옥빛 인 藺=골풀 인 隣=鄰의 俗字 鱗=비늘 인 麟=기린 인 [일] 一=한 일 佚=편안할 일 佾=춤 일 劮=기쁠 일 呹=풀 뜯어 먹을 일, 재빠를 일 壱=壹의 略字 壹=한 일 尼=가까울 닐, 정할 닐, 그칠 닐 日=날 일 泆=끊을 일 溢=넘칠 일 軼=앞지를 일 逸=달아날 일 鎰=중량 일 馹=역말 일 驲=馹의 簡體字 逸=달아날 일 [임] 乑=나란히 설 임, 기어 오를 임 任=맡길 임 壬=아홉째천간 임 妊=아이밸 임 姙=妊과 同字 恁=생각할 임 稔=곡식익을 임 絍=짤 임, 길쌈할 임 荏=들깨 임 衽=옷깃 임 賃=품팔이 임 銋=젖을 임 飪=익힐 임 餁=飪과 同字 林=수풀 림, 더북더북 날 림 淋=지적지적할 림, 축일 림, 번지르르할 림 臨=임할 림, 군림할 림, 여럿이 울 림, 굽힐 림 [입] 入=들 입 卄=스물 입 叺=가마니 입 廿=스물 입 込=담을 입 立=설 입 笠=우리 입 粒=알 입 [잉] 仍=인할 잉 剩=남을 잉 媵=보낼 잉 孕=아이밸 잉 芿=새풀싹 잉 [자] 仔=자세할 자 做=지을 자 兹=무성할 자 刺=찌를 자 呰=주차할 자 咨=물을 자 啙=약할 자 嗞=탄식할 자 姉=姊의 俗字 姿=맵시 자 嬨=계집성품너그러고순할 자 子=아들 자 孖=쌍둥이 자 字=글자 자 孜=힘쓸 자 孳=孶와 同字 孶=부지런할 자 恣=방자할 자 慈=사랑할 자 柘=산뽕나무 자 榨=술주자 자 橴=땅이름 자 泚=맑을 자 滋=불을 자 炙=고기구을 자 煑=煮와 同字 煮=삶을 자 牸=암컷 자 玆=이 자 瓷=오지그릇 자 疵=흠 자 眥=흘길 자 眦=眥와 同字 磁=자석 자 積=저출할 자 粢=피 자 紫=자주빛 자 者=놈 자 耔=복돋을 자 胾=고깃점 자 自=스스로 자 茈=지치 자 茨=가시나무 자 茲=무성할 자 莿=풀가시 자 蔗=사탕수수 자 藉=깔개 자 虸=자방벌레 자 觜=털뿔 자 訾=헐뜯을 자 諮=물을 자 貲=재물 자 資=재물 자 赭=붉은흙 자 趑=머뭇거릴 자 鎡=호미 자 雌=암컷 자 頿=코밑수염 자 髭=코밑수염 자 鮓=젓 자 鶿=가마우지 자 鷓=자고 자 齊=상옷 아랫단할 자 [작] 仢=외나무 다리 작 作=지을 작 剒=건목칠 작 勺=구기 작 嚼=씹을 작 妁=중매 작 岝=산 높을 작 怍=부끄러울 작 斫=벨 작 斱=쪼갤 작 昨=어제 작 杓=구기 작 柞=나무이름 작 汋=삶을 작 灼=사를 작 炸=터질 작 焯=밝을 작 爵=벼슬 작 犳=아롱 짐승 작 碏=삼갈 작 綽=너그러울 작 芍=작약 작 趵=차는 소리 작 酌=따를 작 酢=초 작 醋=술잔을 돌릴 작 雀=참새 작 鵲=까치 작 [잔] 僝=욕할 잔 剗=깍을 잔 孱=잔약할 잔 戔=쌓일 잔 棧=잔교 잔 残=해칠 잔 殘=해칠 잔 潺=물이 줄줄 흐르는 모양 잔 盞=작은 술잔 잔 糤= 饊= 馓= 驏=안장 얹지 않은 말 잔 [잘] 乲=봉호 잘 囐=북소리 잘, 나라이름 잘 [잠] 兂=簪의 本字 啿=넉넉할 잠 喒=나 잠 岑=봉우리 잠 暫=잠시 잠 涔=괸물 잠 潛=잠길 잠 潜=潛의 俗字 濳=潛의 俗字 箴=바늘 잠 簪=비녀 잠 蚕=누에 잠 蠶=누에 잠 [잡] 匝=돌 잡 卡=관 잡 咂=빨 잡 啑=唼과 同字 喋=오리와 기러기 텁석거려 먹는 소리 잡 囃=장단 잡을 잡 眨=눈 깜작일 잡 磼=산 높을 잡 襍=雜의 本字 雑=雜의 俗字 雜=섞일 잡 [장] 丈=어른 장 仗=병장기 장 傽=놀랄 장 匞=匠의 本字 匠=장인 장 場=마당 장 墻=牆과 同字 壮=씩씩할 장 壯=씩씩할 장 奘=클 장 奨=奬의 略字 奬=도울 장 妝=꾸밀 장 嬙=궁녀 장 将=將의 略字 將=장차 장 嶂=높고 가파른 산 장 帳=휘장 장막 장 庄=장중할 장 廧=담 장 張=베풀 장 戕=죽일 장 掌=손바닥 장 暲=햇발이 돋아올 장 杖=지팡이 장 樟=녹나무 장 檣=돛대 장 欌=장농 장 漳=강이름 장 漿=미음 장 牂=암양 장 牆=담 장 状=狀의 俗字 狀=모양 형상 장 獐=노루 장 璋=끝의 반을 깎아 뾰족하게 한 홀 장 瘴=장기 장 章=문채 장 粧=단장할 장 糚=妝과 同字 羘=수양 장 腸=창자 장 臓=臟의 略字 臟=오장 장 臧=착할 장 荘=莊의 俗字 莊=엄할 장 萇=나무 이름 장 葬=장사 지낼 장 蒋=蔣의 略字 蔣=줄 장 蔵=藏의 略字 薔=물여뀌 장 藏=감출 장 装=裝의 俗字 裝=차려 입을 장 賬=치부책 장 贓=장물 장 贜=贓의 俗字 鄣=나라이름 장 酱=醬의 簡體字 醤=醬의 略字 醬=장 장 鏘=금옥 소리 장 長=길 장 障=막을 장 餦=산자 장 髒=몸 뚱뚱할 장 麞=노루 장 狀=모양 형상 장 [재] 再=두 번 재, 거듭 재 咦=크게 부를 재, 웃을 재 哉=비로소 재, 답다 재, 그런가 재 喍=개싸움할 재 在=있을 재, 살 재, 살필 재, 곳 재 夈=齋와 同字 宰=주관할 재, 다스릴 재, 재상 재, 으뜸 재, 삶을 재 崽=자식 재, 저 재 才=재주 재, 능할 재, 현인 재, 바탕 재 扗=在의 本字 材=재목 재, 늘미 재, 성품 재, 재주 재 栽=심을 재 梓=가래나무 재, 목수 재, 우러러 볼 재, 고향 재 榟=梓와 同字 渽=맑을 재 滓=앙금 재, 찌끼 재 災=재앙 재, 천벌 재, 횡액 재 灾=災와 同字 縡=일 재, 실을 재 纔=겨우 재, 비롯할 재 裁=마름질할 재, 헤아릴 재, 결단할 재 財=재물 재, 뇌물 재, 보배 재 載=실을 재, 이길 재, 비롯할 재, 가득할 재 齋=재계할 재, 집 재 齎=탄식할 재, 쌀 재, 가질 재 齜=이 갈 재, 이 드러날 재, 뻐드렁니 재 [쟁] 噌=장사꾼 웅성거릴 쟁 崢=가파를 쟁, 산 높을 쟁 槍=혜성 쟁 爭=다툴 쟁, 다스릴 쟁, 분별할 쟁 猙=밉살스럴 쟁, 짐승이름 쟁 琤=옥소리 쟁 瞠=똑바로 볼 쟁 箏=쟁 쟁, 풍경 쟁 諍=간할 쟁 錚=쇳소리 쟁그렁거릴 쟁, 징 쟁 鎗=금석소리 쟁, 창 쟁, 총 쟁 [저] 且=공손할 저, 파초 저, 많을 저 佇=오래 설 저, 기다릴 저, 잠깐 머물 저 低=낮을 저, 값 쌀 저, 소리 약할 저, 숙일 저, 머뭇거릴 저 儲=쌓을 저, 버금 저, 용납할 저 咀=씹을 저, 깨달을 저, 먹을 저 姐=맏누이 저, 아가씨 저, 교만할 저 宁=조회 받는 곳 저, 멈출 저 屠=흉노왕의 이름 저 岨=돌산에 흙 덮일 저 底=밑 저, 그칠 저 抒=당길 저, 북 저 抵=밀칠 저, 당할 저, 막을 저, 다달을 저, 씨름할 저 杵=공이 저, 방망이 저, 혜성 저 杼=북 저, 도토리 저 柢=뿌리 저 楮=닥나무 저, 종이돈 저, 감매나무 저 樗=가죽나무 저 氐=낮을 저, 오랑캐 이름 저, 이를 저, 근본 저, 별이름 저 沮=그칠 저, 막을 저, 무너질 저, 공갈할 저, 물이 번질 저, 나라이름 저 渚=물가 저, 물 갈라질 저 滁=물이름 저 潴=瀦와 同字 瀦=물 괼 저, 못 저 牴=찌를 저, 대강 저, 씨름 저, 당할 저 狙=원숭이 저, 엿볼 저, 살필 저 猪=豬의 俗字 疽=등창 저 箸=젓가락 저 紵=모시 저 纻=紵와 同字 罝=짐승 그물 저 羝=숫양 저 苧=모시 저 苴=암삼 저, 꾸러미 저, 대지팡이 저, 신바닥 저 菹=김치 저, 푸서리 저 著=나타날 저, 널리 알려질 저, 글 지을 저, 옹저 저 藷=마 저, 감자 저 蛆=구더기 저, 지네 저 袛=속적삼 저 褚=주머니 저, 쌓을 저, 옷에 솜 둘 저 觝=찌를 저, 받을 저, 씨름 저 詆=꾸짖을 저, 알소할 저, 비방할 저 詛=방자할 저, 저주할 저, 맹서할 저 豬=돼지 저, 물이 괼 저, 못이름 저 貯=쌓을 저, 감출 저, 둘 저 躇=머뭇거릴 저 這=맞을 저, 이것 저, 여기 저 邸=사처 저, 주막 저, 홀바탕 저, 병풍 저 陼=모래섬 저, 둔덕 저, 언덕 저 雎=저구 저, 증경이 저, 원앙 저 骶=꽁무니 끝 저 齟=이 어긋날 저 猪=豬의 俗字 [적] 乇=풀잎 적 借=빌릴 적, 빚 적, 도울 적, 허락할 적 勣=공적 적, 사업 적 吊=弔의 俗字 啇=나무 뿌리 적, 실과 꼭지 적, 밑둥 적 嫡=정실 적, 맏아들 적 寂=고요할 적, 쓸쓸할 적 弔=이를 적 戝=賊과 同字 摘=딸 적, 돋구어낼 적, 움직일 적 敵=대적할 적, 원수 적, 무리 적, 막을 적 樀=추녀 적, 도토마리 적, 방망이 적 滴=물방울 적, 물 댈 적 炙=고기구이 적, 김 쏘일 적, 냄새 퍼질 적 狄=북방 오랑캐 적, 꿩 그린 옷 적, 멀 적 的=과녁 적, 꼭 그러할 적, 밝을 적 磧=돌무더기 적, 모래벌 적 積=포갤 적, 모을 적, 넓이 적, 부피 적 笛=피리 적, 날라리 적 籍=문서 적, 왁자할 적, 호적 적, 압수할 적, 임금이 가는 밭 적 糴=쌀 사들일 적, 빠를 적 績=길쌈 적, 공 적, 이룰 적, 이을 적 翟=꿩의 깃 적, 황후의 옷 적 芍=연밥 적, 연꽃의 열매 적 荻=갈대 적 菂=연밥 적 藉=어수선할 적, 확자할 적, 임금이 가는 밭 적 覿=볼 적 謫=귀양갈 적, 꾸짖을 적 賊=도적 적, 해칠 적 赤=붉을 적, 금치 적 跡=자취 적 蹟=행적 적, 자취 적 躍=뛸 적 迪=나아갈 적, 순할 적, 열어줄 적 迹=발자국 적, 자취 적, 뒤따를 적 逐=달리는 모양 적 逖=멀 적 適=맞갖을 적, 편안할 적, 깨달을 적, 시집갈 적, 좇을 적, 주장할 적 鏑=화살촉 적 馰=별배기 적, 소태성 적 炙=고기구이 적, 김 쏘일 적, 냄새 퍼질 적 [전] 伝=傳의 略字 佃=밭 맬 전, 머슴꾼 전, 사냥할 전 佺=신선이름 전 倎=두터울 전 傎=엎드러질 전 傳=전할 전, 펼 전, 이을 전, 주막 전, 책 전 全=온전할 전, 갖출 전 典=책 전, 법 전, 맡을 전, 도덕 전 前=앞 전, 옛 전, 인도할 전 剪=가위 전 剸=오로지 전, 저밀 전 厘=전방 전, 터전 전 吮=빨 전 唸=신음할 전 囀=새 지저귈 전, 후렴 전 塡=메일 전, 북소리 전, 순종할 전, 병들 전 填=塼과 同字 塼=벽돌 전 奠=정할 전 嫥=아름다울 전 専=專과 同字 專=오로지 전 屇=구멍 전 展=펼칠 전, 열릴 전, 살필 전 巓=산 꼭대기 전 巔=巓과 同字 廛=전방 전, 터전 전 悛=고칠 전, 차례 전 戦=戰과 同字 戩=복(福) 전, 다할 전, 멸할 전 戰=싸움 전, 경쟁할 전 揃=가를 전, 자를 전, 가지런히 할 전 旃=기 전, 말 그칠 전 栓=말뚝 전 栴=향나무 전 棧= 槙=나무 끝 전, 자빠진 나무 전 殿=대궐 전 氈=단자리 전, 전방석 전 湔=빨 전, 씻을 전, 물 번질 전 澱=찌끼 전, 물 고일 전 澶=물이름 전 煎=달일 전, 불에 말릴 전 牋=글 전, 표 전, 문체이름 전 猠= 琠=옥 이름 전 瑱=귀막이옥 전, 옥이름 전 甎=벽돌 전, 기와 전 田=밭 전, 사냥할 전, 논 전 甸=경기 전 畋=사냥할 전 畑=화전 전, 밭 전 畠=밭 전 痊=병 나을 전 癜=어루러기 전 癲=미칠 전 磚=벽돌 전, 기와 전 竣=일 마칠 전, 물러설 전 筌=통발 전 箋=기록할 전, 글 전 箭=화살 전, 약이름 전 篆=문체이름 전 籛=성씨 전 纏=둘릴 전, 묶을 전, 얽을 전 羶=노린내날 전 翦=베어 없앨 전, 멸할 전 腆=두터울 전, 지극할 전, 많이 차려놓을 전 膞=썰 전, 질그릇 만드는 틀 전 荃=향풀 전, 전풀 전 詮=평론할 전, 갖출 전 謭=얕을 전 趁=밟을 전 躔=햇길 전, 별자리 전 転=轉과 同字 輇=달 전, 잴 전 輾=돌아 누울 전 轉=구를 전, 변할 전, 굴릴 전 邅=머뭇거릴 전 鄽=가게 전 鈿=비녀 전, 보배로 꾸민 그릇 전 銓=사람 가릴 전, 저울질할 전 銭=錢의 簡體字 鋑=鐫의 古字 錢=돈 전, 가래 전 錪=솥 전, 쇠 전 鐫=새길 전 電=번개 전, 전기 전 靛=푸른 대 전 靦=무안할 전, 물끄러미 볼 전 顓=어리석을 전, 오로지 전 顚=이마 전, 엎드러질 전 顛=顚과 同字 顫=사지 떨릴 전, 머리 비뚤이 전 飦=범벅 전, 된죽 전 餞=전별잔치 전, 보낼 전 餰=된죽 전 鬋=수염 깎을 전, 귀밑 털 드릴 전 鱣=전어 전 鸇=구진매 전 [절] 切=끊을 절, 저밀 절, 정성스럴 절, 급할 절, 진맥할 절 卩=몸기 절, 병부 절 姪=조카 절, 조카딸 절 岊=산 모퉁이 우뚝 내밀 절 帙= 截=끊을 절, 말 잘할 절 折=꺾을 절, 자를 절, 휘일 절, 알맞을 절 晢=밝을 절, 비칠 절 浙=쌀 씻을 절, 물이름 절 準=코마루 절 癤=멍울 절, 부스럼 절 窃=竊의 俗字 窒=막을 절, 가득할 절 竊=좀도둑 절, 얕을 절 節=마디 절, 절개 절 絕=끊을 절, 으뜸 절, 멸할 절, 그칠 절 絶=絕과 同字 [점] 佔=엿볼 점, 숙일 점 占=점칠 점, 날씨 볼 점, 점령할 점 厃=우러러 볼 점 唸=신음할 점 坫=병풍 점, 막을 점, 담 점 墊=빠질 점, 축축할 점 奌=點의 略字 岾=고개 점 店=가게 점, 주막 점 漸=번질 점, 물 흘러 들어갈 점, 점점 점, 차차 점 点=點의 略字 玷=옥의 티 점, 흠각 점 笘=분판 점, 채찍 점 簟=삿자리 점, 대 이름 점 粘=붙일 점, 끈끈할 점 苫=이엉 점, 거적자리 점, 글씨 흘려 쓸 점 蔪=풀 벨 점, 보리 팰 점 蛅=쐐기 점 覘=엿볼 점, 기다려볼 점 阽=낭떠러지 점, 낭비탈 점 霑=젖을 점, 비 지정거릴 점 颭=펄렁거릴 점 鮎=메기 점 黏=붙일 점, 풀 점 點=더러울 점, 뭉갤 점, 검은 점 점 [접] 慴=두려울 접, 겁낼 접 接=사귈 접, 잇닿을 접 摺=접을 접, 패할 접 曡= 椄=나무 접붙일 접, 형벌틀 접, 문설주 접 楪=널평상 접 楫=노 접 渫=물결 출렁출렁할 접 蜨=나비 접 蝶=들나비 접 跕=미끄러질 접 蹀=저벅저벅 걸을 접 鰈=가자미 접, 넙치 접 [정] 丁=장정 정, 네째 천간 정 丼=우물 정, 샘 정 井=우물 정, 단정할 정, 괘 이름 정, 천정 정, 저자 정 亭=정자 정, 여관 정, 고를 정 佂=두려워할 정 侹=평평할 정, 멀쑥할 정 停=머무를 정, 늦어질 정 偵=엿볼 정, 정탐할 정, 물을 정 凈=찰 정 叮=단단히 부탁할 정, 정성스러울 정 呈=보일 정, 드러낼 정 姃=단정할 정 婧=조촐할 정, 가냘플 정 婷=아리따울 정, 쌀쌀할 정 定=정할 정, 편안할 정, 고요할 정 幀=그림족자 정 庭=뜰 정, 곧을 정 廷=조정 정, 바를 정, 곧을 정 征=칠 정, 갈 정 怔=황겁할 정, 가슴 두근두근할 정 情=뜻 정, 마음속 정 打=칠 정 挺=빼어날 정, 너그러울 정, 향초이름 정 掟=둘러칠 정 政=정사 정, 바르게 할 정, 조세 정 整=가지런할 정 旌=장목기 정, 표시할 정 晶=수정 정, 맑을 정, 빛날 정 晸=햇발 불그레하게 비칠 정 柾=나무결 바를 정 桯=서안 정, 걸상 정 梃=외줄기 정, 막대 정, 꼿꼿할 정 棖=문설주 정, 막대 정 楨=담틀 마구리대 정, 단단한 나무 정 檉=능수버들 정 正=바를 정, 과녁 정, 남쪽으로 난 창 정, 어른 정, 분별할 정 汀=물가 정, 수렁 정 淀=얕은 물 정, 배 댈 정 淨=맑을 정, 조촐할 정 渟=물 고일 정, 도랑 정, 물가 정 湞=물이름 정 瀞=맑을 정, 정결할 정 灯=불꽃 정 炡=데칠 정, 불 번쩍거릴 정 玎=옥소리 정 珵=노리개 정, 패옥 정 珽=옥 이름 정 町=밭 두덕 정, 정보 정, 시가 정 甼= 疔=헌데 정 睛=눈 검은자위 정, 눈동자 정 碇=닻돌 정, 배 멈출 정 禎=상서로울 정 程=법 정, 한정 정, 과정 정, 품수 정, 헤아릴 정, 길 정 穽=구덩이 정, 함정 정 筳=대쪽 정 精=정교할 정, 세밀할 정, 정할 정, 성실할 정, 신령 정 綎=띠술 정 艇=거룻배 정, 작은 배 정 莛=풀 줄거리 정, 들보 정 訂=바로잡을 정, 의논할 정 証=간할 정 諪=고를 정 貞=곧을 정, 굳을 정 遉=순라군 정, 염탐할 정 鄭=나라이름 정, 성씨 정 酊=비틀거릴 정 酲=술병 정, 술 깰 정 釘=창 정, 못 정 鉦=징 정 鋌=화살촉 정, 달음박질할 정, 쇳덩이 정 鋥=칼날세울 정 錠=촛대 정 阱=함정 정 霆=벼락 정, 번개 정 靖=다스릴 정, 편안할 정, 생각할 정 靚=단장할 정, 밝을 정 靜=고요할 정, 조용할 정, 쉴 정, 편안할 정 頂=이마 정, 꼭대기 정, 관 꼭대기 치장하는 장식 정 飣=굄새 정, 음식 괼 정 饤=飣과 同字 鼎=솥 정, 바야흐로 정, 새로울 정 靖=다스릴 정, 편안할 정, 생각할 정 精=정교할 정, 세밀할 정, 정할 정, 성실할 정, 신령 정 [제] 亝=재계할 제 俤=용모 제 傺=묵을 제 儕=동배 제 制=억제할 제 劑=약 지을 제 呧=꾸짖을 제, 비방할 제 啼=울 제 嗁=啼와 同字 嚌=맛볼 제 堤=둑 제 娣=여동생 제 帝=임금 제 弟=아우 제 悌=공경할 제 折=천천히 할 제 提=끌 제 擠=물리칠 제 晢=별이 반짝반짝 할 제 梯=사다리 제 済=濟의 略字 濟=나루 제 猘=미친개 제 瑅=제당 제 睇=흘끗 볼 제 祭=제사 제 禔=복 제 稊=강아지풀 제 第=집 제 緹=붉은 비단 제 臍=배꼽 제 荑=띠싹 제 薺=냉이 제 製=만들 제 諸=모든 제 踶=찰 제 蹄=굽 제 蹏=蹄와 同字 躋=오를 제 醍=맑은 술 제 鍗=큰 가마 제 除=섬돌 제 隄=堤와 同字 際=사이 제 霽=갤 제 鞮=가죽신 제 韲=양념할 제 題=이마 제 骶=궁둥이 제 鮧=복 제 鯷=메기 제 鱭=갈치 제 鵜=접동새 제 齊=가지런할 제 齏=회 제 諸=모든 제 [조] 佻=방정맞을 조 俎=도마 조 傮=마칠 조 兆=조짐 조 凋=시들 조 刁=바라 조 劋=끊을 조 助=도울 조 厝=措와 同字 召=대추 조 唕=지저귈 조 啁=비웃을 조 嘈=지껄일 조 嘲=조롱할 조 噪=떠들썩할 조 嬥=날씬할 조 弔=위문할 조 弴=그림 그린 활 조 彫=새길 조 徂=갈 조 懆=근심할 조 找=채울 조 抓=긁을 조 挑=돋울 조 措=둘 조 操=잡을 조 早=새벽 조 昭=밝을 조 晁=朝의 古字 曹=무리 조 曺=성 조 朝=아침 조 条=條의 略字 條=가지 조 棗=대추나무 조 槽=구유 조 殂=죽을 조 漕=배로 실어 나를 조 潮=조수 조 澡=씻을 조 炤=照와 同字 照=비출 조 燥=마를 조 爪=손톱 조 琱=옥 다듬을 조, 아로새길 조 璪=면루관 드림 옥 조 皁=하인 조 眺=바라볼 조 祖=조상 조 祚=복 조 祧=조묘 조 租=구실 조 稠=빽빽할 조 窕=정숙할 조 竈=부엌 조 笊=조리 조 粗=거칠 조 糙=매조미쌀 조 糟=지게미 조 糶=쌀 내어 팔 조 組=끈 조 絛=끈 조 絩=견직물 날실 수 조 繰=야청 통견 조 肇=비롯할 조 胙=복 조 臊=누릴 조 艚=거룻배 조 蓚=기쁠 조 蔦=담쟁이 조 藻=조류 조 蚤=벼룩 조 蜩=매미 조 詔=고할 조 誂=꾈 조 調=고를 조 譟=시끄러울 조 趙=조나라 조 跳=뛸 조 躁=떠들 조 造=지을 조 遭=만날 조 釣=낚시 조 鈟=낚시 조 銚=쟁개비 조 鋽=불리지 않은 쇠 조 錯=措와 同字 鑿=뚫을 조 阻=험할 조 阼=동편 층계 조 雕=독수리 조 鯛=도미 조 鰷=피라미 조 鳥=새 조 鵰=수리 조 鼂=朝와 同字 [족] 哫=아첨할 족 族=겨레 족 瘯=피부병 이름 족 簇=모일 족 足=발 족 鏃=화살촉 족 [존] 存=있을 존 尊=존귀할 존 拵=꽂을 존 [졸] 卆=卒과 同字 卒=군사 졸 拙=서툴 졸 猝=갑자기 졸 [종] 从=從의 古字 伀=두려워할 종 倧=상고 신인 종 喠=말 못할 종 宗=마루 종 従=從의 略字 從=좇을 종 悰=즐길 종 慒=생각할 종 慫=권할 종 柊=방망이 종 棕=종려나무 종 椶=棕과 同字 樅=전나무 종 淙=물 소리 종 琮=옥홀 종 瑽=패옥소리 종 瘇=수종 종 種=씨 종 粽=주악 종 終=끝낼 종 綜=모을 종 縦=세로 종 縱=늘어질 종 腫=부스럼 종 螽=누리 종 踪=자취 종 踵=발꿈치 종 蹤=자취 종 鍾=술병 종 鐘=쇠북 종 锺=술병 종 [좌] 佐=도울 좌 侳=욕보일 좌 剉=꺽을 좌 坐=앉을 좌 左=왼 좌 座=자리 좌 挫=꺽을 좌 痤=뾰루지 좌 莝=여물 좌 髽=북상투 좌 [죄] 罪=허물 죄 [주] 丟=갈 주 丢=잃어버릴 주 丶=심지 주 主=주인 주 住=살 주 作=원망할 주 侏=난쟁이 주 侜=속일 주 做=지을 주 儔=무리 주 冑=투구 주 凑=모일 주 厨=廚의 俗字 周=두루 주 呪=빌 주 咒=呪와 同字 咮=부리 주 啁=새소리 주 喌=닭 부르는 소리 주 嗾=부추길 주 噣=부리 주 奏=아뢸 주 姝=예쁠 주 宙=집 주 尌=세울 주 州=고을 주 幬=휘장 주 廚=부엌 주 拄=떠받칠 주 族=풍류가락 주 昼=晝의 略字 晝=낮 주 朱=붉을 주 柱=기둥 주 株=그루 주 注=물댈 주 洲=섬 주 湊=모일 주 澍=단비 주 炷=심지 주 珠=구슬 주 疇=밭두둑 주 硃=주사 주 祝=축문 주 稠=빽빽할 주 籌=투호 살 주 籒=주문 주 紂=껑거리끈 주 紬=명주 주 綢=얽힐 주 肘=팔꿈치 주 胄=후사 주 腠=살결 주 舟=배 주 蔟=태주 주 蛀=나무좀 주 蛛=거미 주 裯=홑이불 주 註=주낼 주 詋=呪와 同字 誅=벨 주 調=아침 주 賙=진휼할 주 赒=賙의 古字 走=달릴 주 趎=사람이름 주 足=지날 주 蹰=머뭇거릴 주 躊=머뭇거릴 주 輈=끌채 주 輳=모일 주 週=돌 주 遒=다가설 주 邾=나라이름 주 酎=세 번 빚은 술 주 酒=술 주 鉒=쇳돌 주 鑄=쇠 부어 만들 주 霌=운우 모양 주 霔=장마 주 駐=머무를 주 麈=큰사슴 주 鼄=거미 주 [죽] 喌= 竹=대 죽 粥=죽 죽 [준] 俊=준걸 준 僎=향음 주인 돕는 사람 준 僔=모을 준 儁=雋·俊과 同字 准=승인할 준 凖=準의 俗字 噂=수군거릴 준 埈=가파를 준 埻=과녘 준 墫=樽·罇과 同字 寯=모일 준 尊=樽·罇과 同字 屯=어려울 준 峻=높을 준 恂=갑자기 준 惷=어수선할 준 撙=누를 준 晙=밝을 준 樽=술그릇 준 浚=깊을 준 準=수준기 준 濬=칠 준 焌=굽을 준 畯=俊과 同字 皴=주름 준 竣=마칠 준 純=선으로 두를 준 綧=피륙의 폭의 넓이 준 罇=樽·尊과 同字 蠢=꿈틀거릴 준 踆=그칠 준 蹲=걸터앉을 준 逡=뒷걸음칠 준 遵=좇을 준 鐏=창고달 준 隼=새매 준 雋=儁·俊과 同字 餕=대궁 준 駿=준마 준 鱒=송어 준 鵔=금계 준 [줄] 乼=줄 줄 啐=지껄일 줄 茁=풀 처음 나는 모양 줄 誶=몰아 세울 줄, 꾸짖을 줄 [중] 中=가운데 중 仲=버금 중 眾=衆의 本字 衆=무리 중 重=무거울 중 [즉] 即=卽의 俗字 卽=곧 즉 鯽=붕어 즉 [즐] 喞=두런거릴 즐 櫛=빗 즐 騭=수말 즐 [즙] 揖=모을 즙 楫=노 즙 檝=楫과 同字 汁=즙 즙 緝=자을 즙 葺=기울 즙 蕺=삼백초 즙 [증] 噌=시끄러울 증 増=더할 증 增=불을 증 嶒=산 높고 험할 증 憎=미워할 증 拯=건질 증 曾=일찍 증 橙=귤 증 烝=김 오를 증 甑=시루 증 症=증세 증 矰=주살 증 繒=비단 증 罾=어망 증 蒸=찔 증 證=증거 증 贈=보낼 증 [지] 之=갈 지 凪=바람이 자고 파도 그칠 지 厎=숫돌 지 只=다만 지 吱=가는 소리 지 咫=길이 지 地=땅 지 址=터 지 坻=모래섬 지 墀=계단 위의 공지 지 底=이룰 지, 정할 지, 이를 지 志=뜻 지 扺=손바닥 지 抵=칠 지 持=가질 지 指=손가락 지 摯=잡을 지 支=가를 지 旨=맛있을 지 智=슬기 지 枝=가지 지 枳=탱자나무 지 榰=주춧돌 지 止=발 지 氏=나라이름 지 池=못 지 沚=물가 지 泜=강 이름 지 漬=담글 지 痣=사마귀 지 知=알 지 砥=숫돌 지 祇=마침 지 祉=복 지 祗=공경할 지 秖=마침 지 秪=벼 처음 익을 지 篪=저 이름 지 紙=종이 지 肢=사지 지 脂=기름 지 至=이를 지 舐=핥을 지 芝=지초 지 芷=구리때 지 蜘=거미 지 誌=기록할 지 識=표할 지 質=贄와 同字 贄=폐백 지 趾=발 지 踟=머뭇거릴 지 躓=넘어질 지 軹=굴대 머리 지 逇=구덩이 지 遅=더딜 지 遟=더딜 지 遲=늦을 지 阯=터 지 鮨=젓갈 지 鷙=맹금 지 識=표할 지 [직] 喞=찍찍거릴 직 直=곧을 직 禝=사람 이름 직 稙=올벼 직 稷=기장 직 織=짤 직 職=벼슬 직 [진] 侲=동자 진 儘=盡과 同字 唇=놀랄 진 嗔=성낼 진 嚍=화낼 진 塡=누를 진 填=塡의 俗字 塵=띠끌 진 尽=盡의 俗字 振=떨칠 진 搢=꽂을 진 晉=進과 同字 晋=晉의 俗字 桭=평고대 진 榛=개암나무 진 殄=끊어질 진 津=나루 진 溱=많을 진 珍=보배 진 珒=옥 이름 진 琎=옥돌 진 瑨=아름다운 돌 진 璡=옥돌 진 甄=질그릇 구울 진 畛=두렁길 진 疹=홍역 진 盡=다할 진 眞=참 진 瞋=부릅뜰 진 秦=벼 이름 진 稹=떨기로 날 진 縉=搢과 同字 縝=삼실 진 臻=이를 진 蓁=우거질 진 蔯=더워지기 진 螴=설렐 진 袗=홑옷 진 診=볼 진 賑=구휼할 진 趁=좇을 진 軫=수레 뒤턱 나무 진 辰=다섯째지지 진 進=나아갈 진 鉁=보배 진 鎭=누를 진 鎮=鎭의 俗字 陣=줄 진 陳=늘어놓을 진 震=벼락 진 鬒=숱 많을 진 [질] 佚=흐릴 질 侄=어리석을 질 儨=바를 질 厔=막을 질 叱=꾸짖을 질 呹=소리 질 垤=개밋둑 질 姪=조카 질 嫉=미워할 질 帙=책갑 질 桎=차꼬 질 瓆=사람 이름 질 疾=병 질 秩=차례 질 窒=막을 질 絰=질 질 腟=膣과 同字 膣=새살 날 질 蒺=납가새 질 蛭=거머리 질 質=바탕 질 跌=넘어질 질 迭=갈마들 질 郅=고을 이름 질 鑕=모루 질 [짐] 斟=술 따를 짐 朕=나 짐 鴆=짐새 짐 [집] 什=세간 집 卙=많을 집 咠=참소할 집 執=잡을 집 戢=그칠 집 汁=진액 집, 진눈깨비 집, 국 집 潗=샘솟을 집 緝=낳을 집 輯=모을 집 鏶=판금 집 集=모일 집 什=세간 집 [짓] 嗭=땅 이름 짓 [징] 徴=부를 징 徵=부를 징 懲=혼날 징 澂=澄과 同字 澄=맑을 징 瀓=맑을 징 癥=적취 징 瞪=바로 볼 징 [차] 且=또 차 仛=위탁할 차 佽=도울 차 侘=실의할 차 借=빌 차 偖=찢을 차 剳=낫 차 劄=차자 차 叉=깍지낄 차 咱=우리 차 唶=탄식할 차 嗟=탄식할 차 嗻=말 많을 차 奓=오만할 차 岔=갈림길 차 嵯=우뚝 솟을 차 差=어긋날 차 徣=빌릴 차 扯=찢어버릴 차 搓=비빌 차 搽=칠할 차 槎=뗏목 차 次=버금 차 此=이 차 瑳=깨끗할 차 硨=조개 이름 차 磋=윤낼 차 箚=차자 차 茶=차 차 蹉=넘어질 차 車=수레 차 遮=막을 차 釵=비녀 차 齄=코가 붉게 부을 차 齜=이를 갈 차 茶=차 차 [착] 丵=풀이 우거질 착 剒=벨 착 戳=창으로 찌를 착 捉=잡을 착 搾=짤 착 擉=찌를 착 斲=깎을 착 昔=옛 착 着=붙을 착 窄=좁을 착 著=분명할 착 諑=헐뜯을 착 躇=머뭇거릴 착 錯=섞일 착 鑿=뚫을 착 齪=악착할 착 [찬] 丳=꼬챙이 찬 儧=모일 찬 儹=모을 찬 兓=도울 찬, 기릴 찬 劗=끊을 찬 囋=기릴 찬 巑=높이 솟을 찬 撰=지을 찬 攢=모일 찬 欑=모일 찬 澯=맑을 찬 燦=빛날 찬 爨=불땔 찬 璨=빛날 찬 瓚=제기 찬 竄=숨을 찬 篡=빼앗을 찬 簒=빼앗을 찬 粲=정미 찬 繤=지을 찬 纂=모을 찬 纉=이을 찬 纘=이을 찬 讃=기릴 찬 讚=기릴 찬 賛=도울 찬 贊=도울 찬 趲=놀라 흩어질 찬 鑽=끌 찬 餐=먹을 찬 饌=반찬 찬 [찰] 刹=절 찰 剎=절 찰 咱=나 찰 哳=새소리 찰 囋=기릴 찰 察=살필 찰 扎=뺄 찰 拶=핍박할 찰 擦=뿌릴 찰 札=패 찰 獺=수달 찰 紮=감을 찰 [참] 僣=교활할 참 僭=참람할 참 儳=어긋날 참 劖=새길 참 厽=흙을 쌓아서 담 쌀 참 参=간여할 참 參=간여할 참 叄=간여할 참 叅=의논할 참 噆=깨물 참 塹=구덩이 참 嶄=높을 참 巉=가파를 참 惨=참혹할 참 慘=참혹할 참 慙=부끄러울 참 慚=부끄러울 참 憯=슬퍼할 참 懺=뉘우칠 참 攙=찌를 참 斬=벨 참 槧=판 참 欃=살별 참 毚=토끼 참 渗=스밀 참 滲=스밀 참 漸=점점 참 站=우두커니 설 참 譖=참소할 참 讒=참소할 참 讖=참서 참 鏨=끌 참 鑱=보습 참 饞=탐할 참 驂=곁마 참 黲=검푸르죽죽할 참 [창] 倀=미칠 창 倉=곳집 창 倡=여광대 창 傖=천할 창 凔=찰 창 刅=해칠 창 刱=비롯할 창 剏=비롯할 창 剙=비롯할 창 創=비롯할 창 唱=노래 창 嗆=새 먹을 창 囪=굴뚝 창 囱=천장 창 娼=몸 파는 여자 창 廠=헛간 창 彰=밝을 창 悵=슬퍼할 창 惝=멍할 창 愴=슬퍼할 창 戧=다칠 창 搶=닿을 창 敞=높을 창 昌=창성할 창 昶=밝을 창 暢=펼 창 椙=삼나무 창 槍=창 창 氅=새털 창 滄=찰 창 漲=불을 창 猖=미쳐 날뛸 창 瑲=옥 소리 창 瘡=부스럼 창 窓=창 창 窗=창 창 窻=창 창 脹=배부를 창 艙=선창 창 菖=창포 창 蒼=푸를 창 蹌=추창할 창 鯧=병어 창 [채] 債=빚 채 囆=사람 이름 채 埰=영지 채 寀=녹봉 채 寨=울짱 채 彩=무늬 채 採=캘 채 柴=섶 채 棌=참나무 채 睬=주목할 채 砦=울타리 채 祭=제사 채 綵=비단 채 茝=구리때 채 菜=나물 채 蔡=거북 채 責=꾸짖을 채 踩=뛸 채 采=캘 채 釵=비녀 채 [책] 冊=책 책 册=책 책 厇=찢을 책 唶=부르짖을 책 嘖=외칠 책 幘=건 책 措=둘 책 柞=나무 이름 책 柵=울짱 책 栅=울짱 책 磔=찢을 책 笧=책 상자 책 策=채찍 책 簀=살평상 책 翟=꿩 책 蚱=벼메뚜기 책 責=꾸짖을 책 [처] 凄=쓸쓸할 처 処=위치할 처 妻=아내 처 悽=슬퍼할 처 淒=쓸쓸할 처 狙=원숭이 처 萋=풀 성하게 우거진 모양 처 處=살 처 褄=깃의 가 처 覷=엿볼 처 郪=고을 이름 처 [척] 俶=시작할 척 倜=대범할 척 刺=찌를 척 剔=바를 척 呎=길이 단위 척 坧=기지 척 塉=메마른 땅 척 尺=자 척 惕=두려워할 척 惖=존경할 척 慼=근심할 척 慽=근심할 척 戚=겨레 척 拓=주울 척 捗=거둘 척 摭=주울 척 擲=던질 척 斥=물리칠 척 滌=씻을 척 瘠=파리할 척 脊=등성마루 척 蜴=도마뱀 척 跖=발바닥 척 蹠=밟을 척 躑=머뭇거릴 척 適=갈 척 陟=오를 척 隻=새 한 마리 척 齣=단락 척 刺=찌를 척 [천] 串=꿸 천 仟=일천 천 俴=엷을 천 倩=예쁠 천 僢=어그러질 천 儃=머뭇거릴 천 兛=킬로그램 천 刋=끊을 천 千=일천 천 喘=헐떡거릴 천 嘽=많을 천 囅=웃는 모양 천 圌=둥근 대그릇 천 天=하늘 천 川=내 천 撰=지을 천, 가질 천, 모을 천, 고를 천 擅=멋대로 천 泉=샘 천 洊=이를 천 浅=얕을 천 淺=얕을 천 濺=흩뿌릴 천 玔=옥고리 천 瓩=킬로그램 천 祆=하늘 천 穿=뚫을 천 粁=킬로메트르 천 臶=거듭 천 舛=어그러질 천 芊=풀 무성할 천 茜=꼭두서니 천 荐=거듭할 천 莤= 蒨=대가 우거질 천 蕆=경계할 천 薦=천거할 천 蚕=지렁이 천 賤=천할 천 践=밟을 천 踐=밟을 천 辿=천천히 걸을 천 遷=옮길 천 釧=팔찌 천 闡=열 천 阡=두렁 천 靝=하늘 천 韆=그네 천 韉=언치 천 [철] 凸=볼록할 철 剟=깎을 철 勶=버릴 철, 일으킬 철, 사무칠 철 叕=이을 철, 잇댈 철 哲=밝을 철 啜=마실 철 喆=哲과 同字 囅=껄껄 웃을 철 埑=밝을 철 徹=통할 철 惙=근심할 철 掇=주울 철 掣=끌 철 撤=거둘 철 歠=마실 철 澈=물 맑을 철 綴=꿰맬 철 輟=그칠 철 轍=바퀴 자국 철 鉄=쇠 철 銕=鐵의 古字 錣=물미 철 鐵=쇠 철 飻=탐할 철 餮=탐할 철 [첨] 僉=다 첨 尖=뾰족할 첨 幨=휘장 첨 忝=더럽힐 첨 惉=팰 첨 槧=편지 첨 檐=처마 첨 櫼=쐐기 첨 沾=더할 첨 添=더할 첨 瀸=적실 첨 甛=달 첨 甜=달 첨 瞻=볼 첨 簷=처마 첨 簽=농 첨 籤=제비 첨 襜=행주치마 첨 詹=이를 첨 諂=아첨할 첨 [첩] 倢=빠를 첩 呫=맛 볼 첩, 귀에 대고 소근거릴 첩, 앙징할 첩 喋=재잘거릴 첩 堞=성가퀴 첩 妾=첩 첩 帖=표제 첩 怗=고요할 첩 捷=이길 첩 牒=글씨판 첩 疊=거듭 첩, 포갤 첩 睫=속눈썹 첩 褶=덧옷 첩, 겹옷 첩 褺=겹옷 첩 諜=염탐할 첩 貼=붙을 첩 輒=문득 첩 [청] 凊=서늘할 청 圊=뒷간 청 庁=관청 청 廳=관청 청 晴=갤 청 淸=맑을 청 清=맑을 청 聴=들을 청 聼=들을 청 聽=들을 청 菁=부추꽃 청 蜻=귀뚜라미 청 請=청할 청 鋹=날카로울 청 錆=자세할 청 閶=천문 청 靑=푸를 청 青=푸를 청 鬯=울창주 청 鯖=청어 청 鶄=교청새 청 鶬=왜가리 청 晴=갤 청 [체] 体=몸 체 切=온통 체 剃=머리 깎을 체 啑=콧김 불 체 嚏=재채기 할 체 嚔=재채기 할 체 帖=표제 체 彘=돼지 체 掣=끌어당길 체 替=바꿀 체 棣=산앵두나무 체 殢=나른할 체 涕=눈물 체 滯=막힐 체 砌=섬돌 체 綴=꿰멜 체 締=맺을 체 蒂=작은 가시 체 蔕=작은 가시 체 蕞=작은 모양 체 諦=살필 체 軆=몸 체 逮=미칠 체 遞=갈마들 체 靆=구름 낄 체 體=몸 체 髰=머리깎을 체, 땋은머리 체 切=자를 체 [초] 偢=얼이 빠져 있을 초 僬=밝게 살필 초 初=처음 초 剿=죽일 초 劭=힘쓸 초 勦=수고롭게 할 초 吵=지저궐 초 哨=망 볼 초 嘮=이야기할 초 噍=먹을 초 嫶=수척할 초 岧=산이 높을 초 峭=가파를 초 嶕=높을 초 怊=슬퍼할 초 悄=근심할 초 愀=정색할 초 憔=수척할 초 抄=베낄 초 招=부를 초 杪=끝 초 梢=나무 끝 초 椒=산초나무 초 楚=회초리 초 樵=땔나무 초 炒=볶을 초 焦=그슬릴 초 燋=홰 초 硝=초석 초 礁=암초 초 礎=주춧돌 초 秒=시간 단위 초 稍=벼 줄기 끝 초 綃=생명주실 초 耖=밭 거듭 갈 초 肖=닮을 초 艸=풀 초 苕=능소화 초 草=풀 초 蕉=파초 초 誚=꾸짖을 초 譙=꾸짖을 초 貂=담비 초 超=뛰어넘을 초 趠=멀 초 軺=수레 초 迢=멀 초 酢=초 초 醋=초산 초 醮=초례 초 鈔=노략질할 초 鍫=가래 초 鍬=가래 초 鞘=칼집 초 顦=야윌 초 髫=다박머리 초 鷦=뱁새 초 齠=이를 갈 초 [촉] 亍=자축거릴 촉, 겨우 디딜 촉 促=핍박할 촉, 촉박할 촉, 좁을 촉, 빠를 촉, 짧을 촉 劚=깎을 촉 嘱=囑의 俗字 囑=부탁할 촉 属=屬의 俗字 屬=이을 촉, 닿을 촉, 부탁할 촉, 모을 촉, 조심할 촉 数=빽빽할 촉 曯=비칠 촉 燭=爥의 俗字 爥=비칠 촉 矗=곧을 촉, 우뚝 솟을 촉 矚=볼 촉 薥=촉규화 촉, 자귀밥 촉 蜀=촉규화벌레 촉, 큰 닭 촉 触=觸의 俗字 觸=받을 촉, 느낄 촉, 지날 촉, 범할 촉 趨=빠를 촉 躅=자취 촉, 강동강동 뛸 촉, 철쭉꽃 촉 髑=해골 촉 [촌] 刌=끊을 촌 吋=인치(inch) 촌 寸=치 촌, 마디 촌, 헤아릴 촌, 조금 촌 忖=헤아릴 촌, 짐작할 촌 村=마을 촌, 밭집 촌, 시골 촌 邨=村과 同字 [촐] 伜= [총] 偬=傯의 俗字 傯=바쁠 총, 곤궁할 총 冢=무덤 총 匆=바쁠 총 叢=떨기 총, 모을 총, 번잡할 총 囪=囱과 同字 囱=굴뚝 총 塚=冢의 俗字 寵=사랑할 총, 임금께 총애받을 총, 은혜 총, 첩 총 怱=悤의 俗字 悤=바쁠 총, 덤빌 총 惣=摠의 譌字 憁=실심할 총, 뜻 같지 않을 총 摠=거느릴 총, 모을 총, 무리 총, 장수 총 総=總과 同字 縂=総과 同字 縦=縱과 同字 縱=바쁠 총 總=꿰맬 총, 거느릴 총, 합할 총, 끄덩이 잡을 총 聰=귀 밝을 총, 민첩할 총 葱=풀 더북할 총 蓯=풀 더북할 총 蔥=파 총, 파 뿌리 총, 푸를 총 銃=도끼 구멍 총, 총 총 鏦=창 총, 찌를 총 騘=驄과 同字 驄=총이말 총 塚=冢의 俗字 [촬] 撮=머리 끄덩이 잡을 촬, 당길 촬, 비칠 촬 [쵀] 啐=부를 쵀, 놀랄 쵀, 맛 볼 쵀 [최] 催=재촉할 최, 핍박할 최, 일어날 최 凗=눈서리 쌓일 최 嗺=입 옴칠 최, 급히 마실 최 嘬=물 최, 산적 한 입에 넣을 최 崔=산 우뚝할 최, 높고 가파를 최, 성씨 최 摧=꺾을 최, 망할 최, 저지할 최 最=가장 최, 우뚝할 최, 넉넉할 최 榱=서까래 최 漼=깊을 최, 고을 최, 눈물 줄줄 흘릴 최, 눈서리 쌓일 최 璀=옥빛 찬란할 최, 구슬 주렁주렁 달릴 최 磪=험하고 높을 최 縗=상복 최, 상옷 최 脧=어린아이 불알 최, 덜릴 최, 덜 최 衰=상복 최 [추] 丑=수갑 추, 사람이름 추 僦=임금 추, 고용할 추 僽=몹시 욕할 추 出=내보낼 추 啾=두런거릴 추, 찍찍거릴 추 墜=떨어질 추, 잃을 추 娵=젊을 추, 물고기 추, 예쁜 여자 추 岀=出와 同字 帚=비 추, 털 추 惆=실심할 추, 섭섭할 추 抽=뺄 추, 뽑을 추, 당길 추, 거둘 추 捶=종아리 칠 추, 짓찧을 추 推=옮길 추, 가릴 추, 궁구할 추 揫=묶을 추, 거둘 추, 모을 추 搥=북 칠 추 杻=수갑 추, 조막손이 추 椎=쇠몽둥이 추, 칠 추, 짓찧을 추, 참나무 추 楸=가래나무 추, 노나무 추, 산유자 추, 바둑판 추 槌=칠 추 樞=밑둥 추, 지두리 추, 고동 추, 북두 첫째 별 추, 긴요할 추, 달 추, 가운데 추 湫=늪 추, 폭포 추, 찌푸릴 추, 서늘할 추 甃=우물 벽돌 추 瘳=병 나을 추, 덜릴 추 皺=쭈그러질 추 秋=가을 추, 세월 추, 때 추, 말이 뛰놀 추, 성씨 추 穐=秋의 古字 箒=비 추 箠=채찍 추, 볼기채 추 簉=버금 추, 가지런히 날 추 縋=줄에 달릴 추 縐=주름 추, 구길 추 芻=꼴 추, 짐승먹이 추 萩=맑은 대쑥 추, 가래나무 추 蒭=芻와 同字 諏=꾀할 추, 물을 추 趨=달아날 추, 추창할 추 追=쫓을 추, 따를 추 鄒=추나라 추 酋=괴수 추, 두목 추, 숙 익을 추, 끝날 추 醜=추할 추, 같을 추, 무리 추, 자라똥구멍 추, 부끄러울 추 錐=송곳 추 錘=저울눈 추, 마치 추, 저울 추 鎚=쇠마치 추, 저울 추 陬=벼루 추, 정월 추, 부끄러울 추, 마을 추 隹=새 추 雛=새 새끼 추, 병아리 추, 어린아이 추 鞦=그네 추, 말고들개 추 騅=청부루말 추 騶=거덜 추, 마부 추, 짐승이름 추 魋=북상투 추 鯫=송사리 추, 따라지 추 鰌=미꾸라지 추, 빙자할 추, 해추 추 鰍=미꾸라지 추 鵻=아롱비둘기 추 鶖=두루미 추 鶵=새 새끼 추, 새 이름 추, 병아리 추, 어린아이 추 鹙=鶖의 簡體字 麄=麤의 俗字 麤=성길 추, 클 추, 거칠 추 龝=秋의 古字 [축] 丑=소 축, 축시 축, 북동쪽 축 噈=입맞출 축 妯=동서 축 柚=북 축 柷=축풍류 축 槭=단풍나무 축 畜=가축 축, 쌓을 축, 그칠 축 祝=빌 축, 끊을 축, 비로소 축 竺=나라이름 축 筑=비파 축 築=다질 축, 쌓을 축 縮=줄어들 축, 물러갈 축, 거둘 축, 모자랄 축 舳=고물 축, 배 꼬리 축 蓄=쌓을 축, 모을 축, 감출 축 豖=발 얽은 돼지걸음 축 趣= 蹙=찡그릴 축, 쭈그러질 축 蹜=발 끌어 디딜 축 蹴=찰 축, 밟을 축 軸=바디집 축, 질책 축, 속바퀴 축, 얇을 축 逐=쫓을 축, 물리칠 축 閦=무리 축, 아축부처 축 鼀=두꺼비 축 [춘] 偆=가멸할 춘, 두터울 춘 春=봄 춘, 남녀의 정 춘, 술 춘, 온화할 춘 椿=참죽나무 춘, 대춘나무 춘, 어르신네 춘 瑃=옥 이름 춘 萅=春의 本字 [출] 出=날 출, 게울 출, 도망할 출, 보일 출, 낳을 출, 물러갈 출, 생질 출 岀=出과 同字 朮=삽주뿌리 출 术= 秫=차조 출 黜=내칠 출, 물리칠 출 [충] 傭=고를 충, 가지런할 충 充=가득찰 충, 막을 충, 당할 충 冲=깊을 충, 온화할 충, 어릴 충 忠=충성 충, 곧을 충 忡=근심할 충 沖=깊을 충, 온화할 충, 어릴 충 珫=귀 옥고리 충 种=어릴 충 虫=벌레 충 蟲=벌레 충, 김 오를 충 衝=충돌할 충, 찌를 충, 거리 충, 돌파할 충 衷=가운데 충, 정성 충, 착할 충, 속곳 충, 마음 충 [췌] 悴=근심할 췌, 파리할 췌, 피폐할 췌 惴=두려워할 췌 膵=첩육경 췌, 지라 췌 萃=모을 췌, 괘 이름 췌 贅=붙일 췌, 데릴사위 췌, 혹 췌, 군더더기 췌 [취] 冣=쌓을 취, 모을 취 取=거둘 취, 찾을 취, 받을 취, 빼앗을 취, 장가들 취 吹=불 취, 숨쉴 취, 악기 불 취, 부를 취, 충동할 취 嘴=부리 취 娶=장가들 취, 중개인 취 就=좇을 취, 이룰 취, 곧 취, 가령 취, 능할 취, 저자 취 揣=잴 취, 시험할 취, 요량할 취 橇=진흙 썰매 취 毳=솜털 취, 연하고 부드러울 취 炊=불 지필 취, 밥 지을 취 疩= 瘁=병들 취, 수고로울 취, 파리할 취 翠=비취 취, 푸를 취 聚=모을 취, 고을 취, 걷을 취, 쌓을 취 脆=연할 취, 약할 취 臭=냄새 취, 향기 취, 썪을 취, 고약한 이름 취 觜=부리 취 趣=추창할 취, 뜻 취 醉=술취할 취, 궤란할 취 顇=파리할 취, 병들 취 驟=몰아갈 취, 달릴 취, 별안간 취 鷲=독수리 취 龡=불 취 [측] 仄=기울 측, 성조 측, 물이 괄괄 흐를 측, 희미할 측, 옆 측, 돈 이름 측 側=곁 측, 기울어질 측, 저물 측, 배반할 측, 가까울 측, 미천할 측, 아플 측 則=법칙 측, 본받을 측, 모범 측, 때 측 厠=뒷간 측, 평상 가장자리 측, 섞일 측 嘁= 惻=슬플 측, 감창할 측, 아플 측, 불쌍할 측 測=측량할 측, 깊을 측, 맑을 측, 날카로울 측 [츤] 儭=속옷 츤 [츰] 闖=엿볼 츰, 머리 넘성거리는 모양 츰, 왈칵거릴 츰 [층] 層=겹 층, 거듭 층, 층층대 층 蹭=어정거릴 층 [치] 侈=사치할 치, 넓을 치, 많을 치, 풍부할 치 値=값 치, 가치있을 치, 만날 치, 당할 치 值=値와 同字 偨=가지런하지 않을 치, 오르락 내리락할 치 偫=기다릴 치, 갖출 치 卮=술잔 치, 연지 치 哆=입 딱 벌일 치 嗤=비웃을 치, 냉소 치 埴=찰진흙 치, 흙 이길 치 寘=둘 치, 폐할 치, 쉴 치 峙=산이 우뚝 솟을 치, 갖출 치, 쌓을 치 嵯=산 울뚝질뚝할 치 差=어긋날 치, 오르락 내리락할 치, 구분지을 치 巵=잔 치, 연지 치 幟=깃대 치 廁=뒷간 치, 평상 가장자리 치, 섞일 치, 버금 치 徴=徵의 略字 徵=치성 치 恥=부끄럼 치, 욕될 치 昃= 梔=치자 치 植=방망이 치, 심을 치, 세울 치, 달굿대 치, 두목 치 樨= 歯=齒의 俗字 治=다스릴 치, 다듬을 치, 익을 치, 치료할 치 淄=물이름 치, 검을 치 熾=불 활활 붙을 치 畤=제터 치 痓=풍병 치, 악할 치 痔=치질 치 痴=癡의 俗字 癡=어리석을 치, 미련할 치, 미치광이 치, 주근깨 치 稚=어린 벼 치, 어릴 치, 늦을 치 穉=稚와 同字 絺=가는 칡베 치, 가는 갈포 치 緇=검을 치 緻=톡톡할 치, 빽빽할 치, 헌 옷 기울 치 置=베풀 치, 버릴 치, 역말 치, 안치할 치 耆= 耻=恥의 俗字 致=이를 치, 극진할 치, 버릴 치, 불러올 치, 풍치 치, 드릴 치, 보낼 치, 연구할 치 菑=따비밭 치 薙=풀 깎을 치 蚩=치벌레 치, 어리석을 치, 업신여길 치 袳=옷 펼칠 치 褫=옷 빼앗을 치, 벗을 치, 넋 잃을 치 觶=잔 치, 벌술잔 치 豸=발 없는 벌레 치, 풀 치, 해치양 치 跱=머뭇거릴 치, 주저할 치, 갖출 치 輜=짐수레 치, 휘장 친 수레 치 錙=저울눈 치, 조금 치 阤=떨어질 치, 헐릴 치, 언덕 치, 사태날 치 雉=꿩 치, 폐백 치, 성 윗담 치, 목맬 치 馳=달릴 치, 거동길 치, 전할 치 鯔=숭어 치 鴙=雉와 同字 鴟=솔개 치, 수알치 치, 부엉이 치, 말똥구리 치, 토란 치, 마음대로 날릴 치, 올빼미 치 鵄=솔개 치 齒=이 치, 나이 치, 같을 치 [칙] 侙=두려워할 칙 則=법칙 칙, 본받을 칙, 모범 칙, 조목 칙 勅=신칙할 칙, 칙령 칙 勑=바를 칙, 다스릴 칙 敕=경계할 칙, 다스릴 칙, 삼갈 칙, 바를 칙, 칙서 칙, 기릴 칙, 신칙할 칙 飭=갖출 칙, 닦을 칙, 부지런할 칙 [친] 嚫=베풀 친 櫬=관 친, 무궁화나무 친, 땔나무 친 藽=무궁화 친 襯=속옷 친, 접근할 친, 베풀 친 親=사랑할 친, 친할 친, 몸소 친, 일가 친, 사돈 친 齔=이 갈 친, 어릴 친 [칠] 七=일곱 칠, 글체이름 칠 柒=漆의 俗字 漆=옻나무 칠, 물이름 칠 [침] 伈=두려워할 침 侵=범할 침, 침노할 침, 습격할 침, 흉작 침 兓=날카로울 침 唚=입맞출 침 寖=젖을 침, 점점 침 寝=寢과 同字 寢=잠잘 침, 쉴 침, 방 침, 못생길 침 忱=믿을 침, 정성 침 惨= 慘= 枕=베개 침, 수레뒤 가로댄 나무 침, 소말뚝 침 椹=모탕 침, 도끼바탕 침, 토막 침 沈=장마물 침, 진펄 침, 잠길 침, 채색할 침, 고요할 침 沉=沈의 俗字 浸=적실 침, 불릴 침, 번질 침, 빠질 침 湛=빠질 침, 잠길 침 琛=보배 침 砧=방칫돌 침, 다듬잇돌 침 郴=땅이름 침 針=바늘 침, 침 침, 바느질할 침, 찌를 침 鋟=새길 침 鍼=바늘 침, 침 침 駸=말 몰아 달릴 침 [칩] 蟄=벌레 움츠릴 칩, 우물거릴 칩 [칭] 偁=稱의 本字 秤=저울 칭, 백 근 칭 称=稱과 同字 稱=저울질할 칭, 일컬을 칭, 헤아릴 칭, 같을 칭 [쾌] 噲=목구멍 쾌, 훨할 쾌 夬=결단할 쾌, 나누어 정할 쾌, 괘 이름 쾌 快=기분이 좋을 쾌, 시원할 쾌, 빠를 쾌 獪=간교할 쾌, 교활할 쾌 [타] 他=다를 타, 저 타, 간사할 타 佗=다를 타, 저 타, 마음에 든든할 타, 더할 타, 입을 타, 짊어질 타 刴=찍을 타, 꺾을 타 吒=咤와 同字 咜=咤의 譌字 咤=꾸짖을 타, 슬플 타, 뿜을 타, 쩍쩍 씹는소리 타 唾=침 타, 버릴 타 嚲=휘늘어질 타 垞=언덕 타 堕=墮와 同字 墮=떨어질 타, 상투 타, 잃을 타 妥=편안할 타, 일 없을 타, 타협할 타, 떨어질 타 惰=게으를 타, 태만할 타 打=때릴 타 拕=끌 타, 당길 타 拖=拕와 同字 揣=헤아릴 타 朵=朶와 同字 朶=나무가지 휘늘어질 타, 떨기 타, 움킬 타 柁=키 타 楕=橢의 略字 橢=둥글길죽할 타, 수레통 가운데그릇 타, 길죽한 그릇 타 池=물이름 타 沱=물이 갈래질 타, 큰 비 타, 눈물이 흐를 타 舵=키 타 詫=자랑할 타, 풍칠 타, 신통할 타 跎=미끄러질 타 躱=피할 타 迤=어정거릴 타 陀=비탈 타, 땅이름 타 馱=탈 타, 짐 실을 타 駄=馱의 俗字 駘= 駝=약대 타, 곱사등이 타 駞=駞와 同字 鮀=모래무지 타 鴕=타조 타 鼉=자라 타 [탁] 仛=부칠 탁, 다를 탁 侂=부칠 탁, 부탁할 탁 倬=환할 탁, 클 탁 剫=쪼갤 탁, 건목칠 탁 卓=높을 탁, 뛰어날 탁, 책상 탁, 성씨 탁 吒=조롱할 탁 啄=쪼을 탁, 문 두드릴 탁 啅=啄과 同字 噣=쪼을 탁 坼=찢을 탁, 터질 탁, 난산할 탁, 싹 트일 탁 度=꾀할 탁, 헤아릴 탁, 벼슬이름 탁 托=밀칠 탁, 떡국 탁, 차반 탁 拆=터질 탁, 찢어질 탁, 열릴 탁 拓=물리칠 탁, 헤칠 탁, 밀칠 탁 擢=뽑을 탁, 뺄 탁, 솟을 탁, 이길 탁 晫=환할 탁, 밝을 탁 柝=쪼갤 탁, 조두 탁, 목탁 탁 橐=전대 탁, 자루 탁, 도가니 탁, 공잇소리 탁, 짐승이름 탁 沰=떨어뜨릴 탁, 돌 던질 탁, 떨어질 탁 涿=물방울 떨어질 탁, 칠 탁, 물이름 탁, 땅이름 탁 濁=흐릴 탁, 더러울 탁, 물이름 탁 濯=씻을 탁, 빨래할 탁, 적실 탁, 클 탁, 빛날 탁, 산 민둥민둥할 탁, 살찔 탁, 놀 탁 琢=옥 쪼을 탁, 옥 다듬을 탁, 가릴 탁 琸=사람이름 탁 矺=나무이름 탁 籜=대 껍질 탁 蘀=떨어질 탁, 마를 탁 託=맡길 탁, 부탁할 탁, 핑계할 탁 讬=託과 同字 踔=우뚝 설 탁, 앙감질 탁 踱=맨발로 걸을 탁, 아금막기할 탁 逴=멀 탁, 절름거릴 탁, 뛰어날 탁 鐸=요령 탁, 목탁 탁 度=꾀할 탁, 헤아릴 탁, 벼슬이름 탁 拓=물리칠 탁, 헤칠 탁, 밀칠 탁 [탄] 僤=도타울 탄, 빠를 탄 吞=呑과 同字 呑=삼킬 탄, 휩쌀 탄, 감출 탄, 멸할 탄 嘆=한숨쉴 탄 嘽=헐떡거릴 탄, 기꺼워할 탄, 많을 탄 坦=너그러울 탄, 평평할 탄, 넓을 탄 弹=彈과 同字 弾=彈의 略字 彈=쏠 탄, 악기부릴 탄, 탄알 탄, 탄핵할 탄 憚=수고로울 탄, 꺼릴 탄 憻=坦과 同字 攤=열 탄, 펼칠 탄 歎=탄식할 탄, 아름답다 할 탄, 화답할 탄 殫=다할 탄 氽=뜰 탄, 헤엄칠 탄 灘=여울 탄, 해 이름 탄 炭=숯 탄, 불똥 탄, 볶일 탄 癱=중풍증 탄, 사지 틀릴 탄 綻=옷 터질 탄, 나타날 탄, 파할 탄 袒=솔기 터질 탄 誕=기를 탄, 클 탄, 속일 탄, 넓을 탄, 탄생할 탄, 방탕할 탄 驒=돈짝무늬총이말 탄 [탈] 侻=간사할 탈, 가벼울 탈, 간략할 탈 奪=빼앗을 탈, 잃어버릴 탈, 좁은 길 탈, 깎을 탈 稅=풀 탈, 끌를 탈 税=稅과 同字 脫=벗어날 탈, 간략할 탈, 뼈 바를 탈, 그르칠 탈 脱=脫과 同字 [탐] 僋=늘어날 탐, 어리석을 탐 嗿=여럿이 먹는 소리 탐 忐=마음 허전할 탐 探=더듬을 탐, 찾을 탐, 취할 탐, 염탐할 탐 眈=노려볼 탐, 즐길 탐 耽=즐길 탐, 귀 축 늘어질 탐, 웅크리고 볼 탐, 즐거울 탐, 깊고 멀 탐 貪=탐할 탐, 욕심낼 탐 酖=술 즐길 탐 [탑] 傝=답답할 탑, 불안할 탑, 어리석을 탑, 용렬할 탑 嗒=우두먼할 탑 嚃=훅 들어마실 탑 塌=낮은 땅 탑, 초벌갈 탑, 떨어질 탑 塔=탑 탑 搨=비문 박을 탑, 베낄 탑 搭=모뜰 탑, 박을 탑 撘=搭과 同字 榻=평상 탑, 모직 탑, 자리 탑 鰨=큰 배 탑 [탕] 偒=헌걸찰 탕 宕=골집 탕, 방탕할 탕, 석수 탕 帑=나라 곳집 탕 湯=물 끓일 탕, 물이름 탕, 씻을 탕 燙=씻을 탕, 불에 델 탕 盪=씻을 탕, 움직일 탕, 진동할 탕, 그릇 부실 탕, 뭍 배질할 탕 碭=무늬진 돌 탕, 흰 기운 탕, 넘칠 탕, 산이름 탕 糖=엿 탕, 사탕 탕 蕩=넓고 클 탕, 없어질 탕, 방탕할 탕, 소탕할 탕 蘯=盪과 同字 糖=엿 탕, 사탕 탕 [태] 兊=兌의 俗字 兌=기쁠 태, 지름길 태, 모일 태, 통할 태, 곧을 태, 구멍 태, 바꿀 태, 괘 이름 태 兑=兌와 同字 台=별 태, 늙을 태 呆= 埭=보뚝 태 大=클 태, 굵을 태 太=클 태, 굵을 태, 심할 태, 처음 태, 콩 태 娧=기뻐할 태, 더딜 태 孡=아이 밸 태 怠=게으를 태, 느릴 태, 거만할 태 態=모양 태, 뜻 태 抬=칠 태 殆=위태할 태, 가까이할 태, 비롯할 태 汰=미끄러울 태, 넘칠 태, 씻길 태, 사치할 태 泰=클 태, 통할 태, 너그러울 태, 편안할 태, 괘 이름 태 笞=볼기칠 태 胎=아이 밸 태, 시작 태 脫=천천할 태, 더딜 태 脱=脫와 同字 苔=이끼 태 詒=속일 태 跆=밟을 태 迨=미칠 태 逮=미칠 태, 쫓을 태 邰=태나라 태 銳=창 태 鋭=銳와 同字 颱=몹시 부는 바람 태 鮐=복 태, 늙은이 등에 복 무늬 날 태 [택] 宅=집 택, 자리 택, 살 택, 정할 택, 묘 구덩이 택 択=擇의 略字 擇=가릴 택, 추릴 택, 차별할 택 沢=澤의 略字 澤=못 택, 진펄 택, 진액 택, 윤택할 택, 비와 이슬 택 宅=집 택, 자리 택, 살 택, 정할 택, 묘 구덩이 택 [탱] 幀= 撐=버틸 탱, 취할 탱, 헤칠 탱 撑=撐의 俗字 牚=버틸 탱, 버팀목 탱 [터] 攄=펼칠 터, 흩을 터, 날칠 터, 비길 터 [토] 兎=兔의 俗字 兔=토끼 토 吐=토할 토, 나올 토, 펼 토 土=흙 토, 뿌리 토, 나라 토, 뭍 토 套=장대할 토, 씌울 토, 캐캐묵을 토, 껍질 토, 땅이 굽어진 곳 토 討=다스릴 토, 칠 토, 찾을 토, 벨 토, 꾸짖을 토 [톤] 啍=입김 톤, 느럭느럭할 톤 噋=啍과 同字 噸= 瓲=단위 톤(ton) 톤 [통] 恫=슬플 통, 아플 통, 앓을 통 慟=서러울 통 桶=엿되들이 통 통 樋=대 홈 통, 어름나무 통 洞=구렁 통, 깊을 통, 빌 통, 밝을 통 痛=아플 통, 상할 통, 심할 통, 몹시 통 筒=사통대 통, 통 통 筩=대나무통 통, 낚시 통 統=거느릴 통, 벼리 통, 실마디 통, 근본 통, 이을 통 通=뚫릴 통, 사무칠 통, 형통할 통, 사귈 통, 다닐 통, 간음할 통 洞=구렁 통, 깊을 통, 빌 통, 밝을 통 [퇴] 堆=흙무더기 퇴 놓을 퇴, 언덕 퇴 推=밀 퇴 敦=쪼을 퇴, 모을 퇴, 다스릴 퇴, 끊을 퇴, 곱송거릴 퇴, 성낼 퇴 槌=몽둥이 퇴, 너스레 퇴, 누에시렁 퇴, 던질 퇴 腿=넓적다리 퇴 褪=옷 벗을 퇴, 꽃빛 옅어질 퇴 追=옥 다듬을 퇴, 쇠북 꼭지 퇴 退=물러갈 퇴, 겸양할 퇴, 물리칠 퇴 鎚=옥 다듬을 퇴 隤=무너질 퇴, 미끄러질 퇴, 부드러울 퇴, 땅이름 퇴 頹=기울어질 퇴, 사나운 바람 퇴, 쇠할 퇴, 무너질 퇴, 대머리 퇴 頽=頹와 同字 [투] 偷=偸와 同字 偸=훔칠 투, 엷을 투, 구차할 투, 인정머리없을 투 套=전례 투 妒=투기할 투, 미워할 투, 강샘할 투, 부러워할 투 妬=투기할 투, 자식 없는 계집 투 投=던질 투, 버릴 투, 줄 투, 의탁할 투 渝=빛 변할 투, 더러워질 투, 고을이름 투 透=통할 투, 사무칠 투, 지나칠 투 骰=주사위 투 鬪=싸움 투 [특] 忒=변할 특, 의심할 특, 어기어질 특 慝=간악할 특, 간사할 특, 더러울 특 特=우뚝할 특, 숫소 특, 뛰어날 특, 다만 특, 세 살 먹은 짐승 특 貸=빌릴 특 [파] 叵=못할 파, 드디어 파, 술잔 파 吧=아이 다툴 파 坡=언덕 파, 제방 파 壩=방죽 파, 둑 파 妑=새앙머리 파, 갈래머리 파 婆=할머니 파, 너풀너풀 춤출 파 岥=산 비알질 파 巴=꼬리 파, 뱀 파, 땅이름 파 帕=머리 동이수건 파 怕=두려울 파 把=잡을 파, 헤칠 파 播=심을 파, 펼칠 파, 버릴 파, 까불 파, 달아날 파 擺=열 파, 헤칠 파, 제거할 파, 손뼉칠 파 朳= 杷=비파나무 파, 써레 파, 칼자루 파, 악기이름 파 汃= 汴= 波=물결 파, 물 젖을 파, 눈 광채 파, 움직일 파, 달빛 파 派=물 갈래 파, 보낼 파, 나눌 파, 파벌 파 灞=물이름 파 爬=긁을 파, 기어다닐 파 爸=아비 파 玻=파려옥 파, 유리옥 파 琶=비파 파 疤=흉터 파 皤=흴 파, 배 불룩할 파, 귀 밑에 희끗희끗할 파 破=깨뜨릴 파, 다할 파, 갈라질 파 笆=가시 대 파, 울타리 파 簸=까부를 파, 키 파 罷=파할 파, 내칠 파 耙=쇠시랑 파 芭=파초 파 菠=시금치 파 葩=꽃봉오리 파 跛=절뚝발이 파 鄱=땅이름 파 靶=고삐 파 頗=비뚤어질 파, 자못 파 [판] 判=판단할 판, 쪼갤 판, 맡을 판 坂=언덕 판, 산비탈 판, 순나라 서울이름 판 板=널조각 판, 널기와 판, 풍류이름 판 版=조각 판, 호적 판, 국경 판, 한 길 판, 인쇄할 판 瓣=외씨 판, 실과씨 판, 꽃잎 판 販=장사 판, 팔 판 辦=힘들일 판, 갖출 판 鈑=불린 금 판 阪=산비탈 판, 언덕 판 [팔] 八=여덟 팔 叭=나팔 팔, 입 벌릴 팔 捌=깨뜨릴 팔, 나눌 팔, 칠 팔 [팟] 巼=땅이름 팟 [패] 伯=우두머리 패, 으뜸 패 佩=패옥 패, 찰 패, 마음에 먹을 패, 물이 흘러서 합할 패 倍=어길 패, 떨어질 패, 암송할 패 唄=염불소리 패, 노래부를 패 孛=혜성 패 悖=거스를 패, 어지러울 패 抜=拔와 同字 拔=밋밋할 패, 휘어 꺾을 패 拨= 敗=헐어질 패, 무너질 패, 깨어질 패, 썪을 패 旆=기 패, 깃발 날릴 패 沛=둥둥 뜰 패, 비 쏟아질 패, 넉넉할 패 浿=물이름 패, 물가 패 牌=방 붙일 패, 호패 패, 방패 패 狽=이리 패 珮=노리개 패, 찰 패 稗=돌피 패, 조그마할 패 肺=성할 패 背=버릴 패, 배반할 패 覇=霸의 俗字 貝=조개 패, 재물 패, 비단 패 邶=패나라 패 霈=비 쏟아질 패 霸=으뜸 패, 패왕 패 [팽] 亨=삶을 팽 伻=부릴 팽, 좇을 팽 傍=마지못할 팽 彭=성씨 팽, 땅이름 팽, 방패 팽, 총소리 팽, 북소리 팽 旁=휘몰아갈 팽 澎=물소리 팽, 물결 부딛는 형세 팽 烹=삶을 팽, 요리 팽 砰=여울 물소리 팽 祊=사당문 제사 팽 膨=배 불룩할 팽 蟚=蟛과 同字 蟛=방게 팽 [퍅] 愎=사나울 퍅, 고집할 퍅 [편] 便=편할 편, 소식 편, 익힐 편, 오줌 편 偏=치우칠 편, 무리 편, 오십명 편, 간사한 모양 편 匾=엷은 그릇 편, 모가 진 모양 편 平=편편할 편 徧=두루 편, 널리 편, 치우칠 편 惼=조급할 편, 편협할 편 扁=특별할 편, 거룻배 편 片=조각 편, 쪼갤 편, 성씨 편 篇=책 편, 편차할 편 編=책편 편, 기록할 편, 첩지 편, 벌릴 편 緶=꿰맬 편 翩=훌쩍 날 편, 오락가락할 편 艑=거룻배 편 萹=마디 풀 편 蝙=박쥐 편 褊=좁을 편, 급할 편, 옷이 몸에 낄 편 諞=공교한 말 편 蹁=돌쳐갈 편, 잘름거릴 편 遍=두루 편 鞭=채찍 편, 볼기채 편, 태장 편 騙=속일 편, 말에 뛰어 오를 편 鯿=병어 편 [폄] 砭=돌침 폄 窆=하관할 폄, 광중 폄 貶=떨어질 폄, 덜릴 폄, 꺾을 폄, 귀양보낼 폄 [평] 匉=크게 소리지를 평 坪=벌판 평, 평평할 평 平=평탄할 평, 바를 평, 고를 평, 다스릴 평, 쉬울 평, 풍년 평, 화친할 평, 재관관 평 怦=맘 급할 평, 칼칼할 평 抨=탄핵할 평 拼=좇을 평 枰=장기판 평, 바둑판 평, 회양목 평 泙=물소리 평, 물결 셀 평 硼=평돌 평 苹=맑은 대쑥 평, 사과 평 萍=마름 평, 머구리밥 평, 개구리밥 평 蓱=마름 평, 머구리밥 평, 개구리밥 평 評=평론할 평, 헤아릴 평, 고칠 평, 기롱할 평 鮃=가자미 평 [폐] 吠=짖을 폐, 땅이름 폐 嬖=사랑할 폐, 윗사람으로부터 사랑받을 폐, 벼슬이름 폐 幣=폐백 폐, 예물 폐, 재물 폐, 돈 폐 廃=廢의 略字 廢=폐할 폐, 내칠 폐, 집 쏠릴 폐, 떨어질 폐 弊=해질 폐, 폐단 폐, 곤할 폐, 곰곰 궁리할 폐, 결단할 폐, 엎드릴 폐 敝=옷 해질 폐, 버릴 폐, 무너질 폐, 실패할 폐, 활줌통 폐 斃=죽을 폐, 엎드러질 폐 杮=대패밥 폐 狴=짐승이름 폐, 옥 폐, 들개 폐 獘=곤할 폐, 폐단 폐, 죽을 폐, 엎드러질 폐 癈=고질병 폐 肺=허파 폐, 부아 폐, 친할 폐, 마음속 폐 蔽=가리울 폐, 다할 폐, 정할 폐 薜=승검초 폐, 돌삼 폐 閉=닫을 폐, 마칠 폐, 가릴 폐 陛=대궐 섬돌 폐 髀=볼기짝 폐 [포] 佈=펼칠 포 儤=번(官府宿直) 들 포, 넘을 포, 건널 포, 곧을 포 刨=깎을 포 勹=꾸릴 포, 쌀 포 包=꾸릴 포, 용납할 포, 더부룩히 날 포, 보따리 포 匍=엉금엉금 길 포, 엎드러질 포 匏=박 포, 바가지 포, 퉁소 포 咆=고함지를 포, 짐승소리 포, 불끈 성낼 포 哺=씹어 먹을 포, 먹일 포 圃=채마밭 포, 밭 갈 포, 곳 포, 산이름 포 布=베 포, 피륙 포, 벌릴 포, 돈 포, 베풀 포 庖=푸줏간 포, 부엌 포 怖=두려울 포, 놀래킬 포 抛=拋와 同字 抱=안을 포, 품을 포, 낄 포 拋=던질 포, 버릴 포, 돌소뇌 포 捕=사로잡을 포 晡=신시 포, 해질 포 暴=사나울 포, 급할 포, 맨손으로 칠 포, 불끈 일어날 포, 마를 포, 상할 포 曓=급할 포, 창졸 포 曝=볕 쬘 포, 볕 쏘일 포 泡=물거품 포, 물이 솟아날 포, 물 흐를 포, 성할 포 浦=물가 포, 갯가 포 瀑=소나기 포, 물거품 포 炮=그슬릴 포, 싸서 구울 포, 형벌 포 炰=그슬 포, 까불거릴 포 疱=부풀 포, 부르틀 포 砲=큰 대포 포, 돌쇠뇌 포, 돌 튀기는 화살 포 胞=태보 포, 한 배 포, 동포 포 脯=포 포 舖=鋪의 俗字 苞=그령풀 포, 밑둥 포, 초목이 다복히 날 포, 꾸러피 포 葡=포도 포, 들머리 포, 나라이름 포 蒲=부들풀 포, 창포 포, 개버들 포 袍=도포 포, 관디 포, 앞섶 포 褒=포장할 포, 옷 뒤길 포, 도포 포, 고을이름 포 誧=꾀할 포, 클 포, 도울 포, 간할 포 逋=달아날 포, 포흠할 포 鉋=대패 포 鋪=전방 포, 베풀 포, 문고리 포, 펼 포, 아플 포 鞄=가방 포, 가죽 다로는 장인 포 飽=배부를 포, 물릴 포, 먹기 싫을 포, 흡족할 포 餔=저녁 곁두리 포, 먹을 포 鮑=절인 생선 포, 성씨 포 鯆=매가리 포, 물아지 포 齙=이 드러날 포 暴=사나울 포, 급할 포, 맨손으로 칠 포, 불끈 일어날 포, 마를 포, 상할 포 [폭] 幅=폭 폭, 겉치레할 폭 暴=햇빛 쪼일 폭, 나타날 폭, 드러날 폭 曝=햇볕에 말릴 폭 瀑=폭포수 폭 爆=불터질 폭 輻=바퀴살통 폭 輻=바퀴살통 폭 [폴] 乶=땅이름 폴 [폿] 喸=땅이름 폿 [표] 俵=나누어 줄 표, 흩어질 표, 가마니 표 僄=몸이 가벼울 표, 진중치 못할 표 儦=떼지어 걷는 모양 표, 많을 표 剽=표독할 표, 긁을 표, 겁박할 표, 끝 표, 찌를 표, 빠를 표 勡=겁탈할 표, 겁박할 표 嘌=휙 불 표, 몰아갈 표 嫖=가벼울 표, 날랠 표, 색에 빠질 표 彪=칡범 표, 문채 표, 작은 범 표 慓=급할 표 摽=칠 표, 두를 표, 찔러 밀칠 표, 가슴 만질 표 杓=북두자루 표 標=표시할 표, 높은 가지 표, 적을 표, 나무 끝 표 殍=굶어 죽을 표 漂=뜰 표, 움직일 표, 으스스할 표, 높이 훨훨 날 표 熛=불똥 튈 표, 성낼 표, 붉을 표, 빛날 표 瓢=표주박 표 票=쪽지 표, 문서 표, 불날릴 표, 훌쩍 날 표, 날랠 표 縹=옥빛 표, 훌쩍 날 표 膘=허구리살 표, 소 볼기 표, 부레 표 莩=굶어죽을 표 表=겉 표, 윗옷 표, 밝을 표 裱=목수건 표 豹=표범 표, 아롱범 표 鏢=칼날 표, 비수 표 鑣=말 재갈 표, 성할 표 飄=회오리바람 표, 나부낄 표, 떨어질 표 飆=飇와 同字 飇=회오리바람 표 驃=날쌜 표, 누런 말 표 髟=머리털 희뜩희뜩할 표, 깃발 날릴 표, 머리 늘일 표 鰾=부레 표 [푼] 分=세는 단위 푼 [품] 品=뭇 품, 품수 품, 가지 품, 벼슬 차례 품 禀=여쭐 품, 사뢸 품, 받을 품, 성품 품 稟=여쭐 품, 줄 품, 받을 품, 성품 품 [풍] 凨=風과 同字 凮=風의 譌字 楓=단풍나무 풍, 신나무 풍 瘋=두풍 풍, 미치광이 풍 葑=무 풍 諷=비유로 간할 풍, 외울 풍 豊=豐의 略字 豐=풍년 풍, 두터울 풍, 왕콩 풍, 괘 이름 풍 闏= 風=바람 풍, 흘레할 풍, 울릴 풍, 풍속 풍, 경치 풍, 위엄 풍, 병풍 풍, 모양 풍 馮=벼슬이름 풍, 성씨 풍, 물귀신이름 풍, 고을이름 풍 [피] 佊=간사할 피 僻=피할 피 彼=저 피 披=헤칠 피, 흩어질 피, 찢어질 피 疲=피곤할 피, 나른할 피 皮=가죽 피, 껍질 피, 성씨 피 罷=느른할 피, 고달플 피, 잔병 피 被=이불 피, 덥힐 피, 미칠 피, 나타날 피, 창피할 피 詖=말 잘할 피, 간사할 피, 알소할 피 跛=기울어 지게 설 피 辟=피할 피 避=숨을 피, 어길 피, 싫어할 피 陂=기울어질 피, 치우칠 피 鞁=말 가슴걸이 피, 안갑 피 髲=머리쓰개 피, 첩지 피 [픽] 腷=뜩 막힐 픽, 답답할 픽, 닭 홰치는 소리 픽 [필] 佖=점잔피울 필, 가득할 필 佛=흥할 필, 도울 필 匹=짝 필, 둘 필, 한마리 필, 벗 필, 무리 필 吡=새소리 필 咇=향기날 필 嗶=울 필, 잔말할 필 弼=도울 필, 도지개 필, 거듭 필 必=반드시 필, 오로지 필, 살필 필, 기약 필 払=拂의 略字 拂=도울 필 泌=도랑물 필, 개천물 필 滭=샘 끓어 솟을 필 珌=칼 장식 옥 필 畢=마칠 필, 토끼그물 필, 다할 필, 편지 필, 책 필, 고기 꿰 다는 나무 필 疋=짝 필, 끝 필 筆=붓 필, 오랑캐 이름 필 篳=대 사립문 필, 나무 실은 수레 필 罼=토끼그물 필 苾=필추풀 필, 향기로울 필, 오랑캐의 부락 필 蓽=휘추리 필, 약이름 필 觱=바람이 쌀쌀할 필, 대평수 필 蹕=길 치울 필 鞸=슬갑 필 韠=슬갑 필 馝=향내날 필 駜=살찐 말 필 鵯=갈가마귀 필 [핍] 乏=없을 핍, 옹색할 핍, 다할 핍 偪=핍박할 핍, 가까울 핍 逼=가까울 핍, 궁핍할 핍, 핍박학 핍 [하] 丅=下의 簡體字 下=아래 하 丷=구결 하 何=어찌 하 假=거짓 하 厦=큰 집 하 呀=입 벌릴 하 哬=꾸짖을 하 嘏=복 하 嚇=놀라게 할 하 夏=여름 하 岈=휑뎅그렁할 하 廈=큰 집 하 懗=속일 하 昰=是와 同字 河=물 하 煆=불사를 하 瑕=티 하 瘕=이질 하 緞=신발 하 罅=틈 하 荷=연 하 蝦=새우 하 賀=축하할 하 遐=멀 하 鍜=목투구 하 霞=놀 하 鰕=새우 하 [학] 嗀=게울 학 嗃=꾸짖을 학 嚛=매울 학 壑=골짜기 학 奭=성대할 학 学=學의 略字 學=배울 학 斈=學의 略字 涸=마를 학 狢=오소리 학 瘧=학질 학 皬=흴 학 确=확실할 학 虐=사나울 학 謔=희롱할 학 郝=고을 이름 학 鶴=두루미 학 鷽=메까치 학 鶴=두루미 학 [한] 佷=잔인할 한 僩=노할 한 厂=사람 이름 한 嫺=우아할 한 嫻=우아할 한 寒=찰 한 恨=한탄할 한 悍=사나울 한 扞=막을 한 捍=막을 한 旱=가물 한 暵=말릴 한 桿=막대기 한 汗=땀 한 漢=한수 한 澣=빨 한 瀚=넓고 큰 한 罕=드물 한 翰=날개 한 邗=고을 이름 한 邯=고을 이름 한 閈=마을 문 한 閑=한가할 한 閒=한가할 한 限=한정할 한 韓=나라 이름 한 駻=사나운 말 한 鷳=소리개 한 鼾=코골 한 [할] 乤=고을 이름 할 割=벨 할 劼=삼갈 할 嗐=감탄사 할 害=손해 할 瞎=애꾸눈 할 轄=다스릴 할 [함] 函=상자 함 凾=상자 함 含=머금을 함 咸=모두 함 唅=머금을 함 啣=재갈 함 喊=소리 함 圅=담을 함 檻=우리 함 涵=젖을 함 濫=넘쳐흐를 함 緘=봉할 함 艦=싸움배 함 莟=꽃봉오리 함 菡=연봉오리 함 諴=화할 함 轞=함거 함 邯=고을 이름 함 銜=재갈 함 闞=범 소리 함 陥=빠질 함 陷=빠질 함 鹹=짤 함 [합] 匌=기운 답답할 합 合=합할 합, 같을 합, 짝 합, 대답할 합 呷=빨아 마실 합, 떠들썩할 합, 벌릴 합, 집오리 우는 소리 합 哈=한 모금 합 嗑=잔말할 합, 웃는 소리 합, 입 다물 합, 괘 이름 합 柙=우리 합, 향나무 합 榼=술그릇 합, 물통 합, 뚜껑 합 溘=문득 합, 이를 합, 의지할 합 盍=덮을 합, 합할 합, 어찌 아니할 합 盒=소반 뚜껑 합, 합 합 盖=蓋과 同字 蓋=이엉 덮을 합 蛤=조개 합 郃=땅이름 합 閤=도장 합, 침방 합, 개구리소리 합 闔=문짝 합, 닫을 합 陜=땅이름 합 [항] 亢=목 항, 높을 항, 별이름 항, 기둥 항, 가릴 항 伉=강직할 항, 우뚝할 항, 배필 항, 겨룰 항 佷=돌아올 항, 고을이름 항 吭=목구멍 항, 새 목구멍 항 夯=멜 항, 다질 항 姮=항아 항, 달에 사는 미녀 항, 달 부르는 다른 이름 항 嫦=姮과 同字 巷=거리 항, 마을 항, 복도 항, 내시 항 恆=恒의 本字 恒=늘 항, 옛 항 抗=막을 항, 들 항, 겨룰 항 杭=건널 항, 거루 항, 고을이름 항 桁=수갑 항, 배다리 항, 횃대 항 沆=큰 물 항, 진펀할 항, 이슬 항 港=물 갈라질 항, 항구 항, 뱃길 항 炕=마를 항, 구울 항, 구들 항 缸=항아리 항 缿=항통 항, 문서함 항, 벙어리 항 肛=똥구멍 항, 배 뚱뚱할 항 航=쌍배 항, 배질할 항 行=시장 항, 항렬 항, 굳셀 항 降=항복할 항 項=목덜미 항, 클 항, 항목 항 頏=목 항, 오르락 내리락할 항 骯=꼿꼿할 항 鬨=싸움소리 항 行=시장 항, 항렬 항, 굳셀 항 降=항복할 항 [해] 亥=열 둘째 지지 해, 서북쪽과 북쪽의 사이 방향 해, 음력 시월 해, 돼지 해 侅=이상할 해 偕=함께할 해, 굳셀 해 劾=안찰할 해, 힘쓸 해 咍=비웃을 해 咳=기침 해, 침 뱉을 해, 방글방글 웃을 해 嗐=하품할 해 垓=땅 가장자리 해, 햇수 해, 계단 해 夥=많을 해, 동무 해 奚=어찌 해, 종 해, 큰 배 해 孩=어린아이 해, 방글방글 웃을 해 害=해할 해, 시기할 해, 죽일 해 嶰=골짝 사이 해, 골 이름 해 廨=관청 해, 공해 해 懈=게으를 해 楷=해나무 해, 본뜰 해, 해자 해, 법 해 欬=기침할 해, 크게 부를 해, 일깨울 해 海=바다 해, 많을 해, 세계 해 瀣=찬이슬 해, 이슬 기운 해 獬=신통한 양 해, 해갓 해 瑎=검은 옥돌 해 痎=학질 해, 하루거리 해 薤=염교 해, 부추 해 蟹=게 해 解=쪼갤 해, 꺠우칠 해, 풀 해, 괘 이름 해, 벗을 해 該=갖출 해, 모두 해, 겸할 해, 마땅할 해 諧=조화할 해, 글 해, 기롱지거리할 해, 고를 해 邂=우연히 만날 해 醢=젓 해, 젓 담글 해, 젓 담그는 형벌 해 陔=층 뜰 해, 언덕 해, 변방 해 頦=턱 해 駭=놀랄 해, 북 울릴 해 骸=뼈 해 鮭=어채 해, 복 해 龤=노래의 가락이 조화될 해 [핵] 劾=캐물을 핵, 핵실할 핵 核=실과 핵, 자세할 핵 翮=깃촉 핵, 쭉지 핵, 칼 갓 핵 覈=핵실할 핵, 겨무거리 핵, 씨 핵, 액색할 핵 輅=수레앞 가로막이 나무 핵, 맞을 핵 [행] 倖=요행 행, 괴일 행, 아당할 행, 친할 행 幸=다행할 행, 바랄 행 悻=발끈 성낼 행 杏=살구 행, 은행 행 荇=마름풀 행, 조아기 행 行=다닐 행, 길귀신 행, 오행 행, 그릇 얄긋거릴 행, 행서 행, 행실 행 [향] 享=드릴 향, 제사지낼 향, 잔치 향, 흠향할 향 向=향할 향, 나아갈 향, 북쪽 창 향, 기울어질 향 嚮=향할 향, 누릴 향, 울릴 향, 받을 향 珦=옥 이름 향 薌=곡기 향, 향기 향, 기장 향 郷=鄕과 同字 鄉=鄕과 同字 鄕=시골 향, 고향 향 響=소리 울릴 향, 소리 마주칠 향, 악기 향 餉=먹일 향, 군량 향, 점심 향 饗=잔치할 향, 흠향할 향 香=향내 향, 약이름 향 [허] 嘘=噓의 俗字 噓=불 허, 뿜을 허 墟=옛 터 허, 장 허, 큰 두덕 허 歔=한숨 쉴 허, 흑흑 느껴 울 허, 코로 숨 내쉴 허 虚=虛의 俗字 虛=빌 허, 헛될 허, 다할 허, 약할 허, 거짓 허, 하늘 허 許=허락할 허, 나아갈 허, 기약할 허, 여럿이 힘쓰는 소리 허 [헌] 仚=날듯할 헌 巚=봉우리 헌, 시루봉 헌 幰=수레 안장 헌, 휘장 헌 憲=법 헌, 표준될 헌, 고시할 헌, 기뻐할 헌 攇=비길 헌, 물건 맬 헌 櫶= 献=獻의 俗字 獻=바칠 헌, 음식 헌, 어진이 헌 軒=초헌 헌, 껄껄 웃을 헌, 주적댈 헌, 추녀끝 헌, 고기 굵게 저밀 헌 [헐] 歇=쉴 헐, 나른할 헐, 다할 헐, 으슥할 헐, 스러질 헐, 흩어질 헐 [험] 崄=嶮과 同字 嶮=산 가파를 험 獫=험윤 오랑캐 험 玁=獫과 同字 険=險의 略字 險=험할 험 験=驗의 略字 驗=시험할 험, 중험할 험, 보람 험 [혀] 暳= [혁] 侐=고요할 혁 嚇=노할 혁, 꾸짖을 혁 奕=아름다울 혁, 클 혁, 차례 혁, 바둑 혁, 빛날 혁, 근심할 혁 弈=바둑둘 혁 洫=넘칠 혁, 빌 혁, 봇도랑 혁 焱=불꽃 혁 爀=불빛 혁, 빛날 혁 赫=불 이글이글할 혁, 빛날 혁, 성할 혁 革=가죽 혁, 고칠 혁, 갑주 혁 鬩=송사할 혁, 싸울 혁 [현] 伣=俔과 同字 俔=연탐할 현, 풍세보는 깃 현 儇=영리할 현, 빠를 현 吅=부르짖을 현 呟=소리 현 哯=아이 젖 토할 현 嬛=산뜻할 현 峴=고개 현, 산이름 현 弦=시위 현, 반달 현, 맥박 잦을 현, 땅이름 현 懸=매달 현, 멀 현 昡=햇빛 현 晛=햇발 현 泫=물 깊을 현, 이슬 맺힐 현, 눈물 줄줄 흘릴 현 洵=멀 현 炫=밝을 현, 불빛 현 玄=검을 현, 검붉을 현, 하늘 현, 아득할 현, 고요할 현 現=나타날 현, 지금 현, 옥빛 현 琄=패옥 늘어질 현 痃=힘줄 당기는 병 현, 적병 현 県=고을 현, 지방 현 眩=아찔할 현, 현혹할 현 睍=물끄러미 볼 현, 고울 현 絃=줄풍류 현 絢=채색무늬 현 縣=매달릴 현, 끊어질 현 繯=얽힐 현, 둘릴 현, 맬 현 翾=파뜩파뜩 날 현, 경박할 현, 영리할 현, 급할 현 舷=뱃전 현 蜆=가막조개 현, 호수이름 현 衒=자랑할 현, 팔릴 현 見=나타날 현, 드러날 현, 있을 현, 보일 현 誢=간하는 말 현 賢=어질 현, 좋을 현, 구멍 현 鉉=솥귀 현 鋗=노구솥 현, 퉁노구 현 顕=顯의 略字 顯=나타날 현, 밝을 현, 통달할 현, 높을 현 駽=돗총이 현, 철총이 현 見=나타날 현, 드러날 현, 있을 현, 보일 현 [혈] 吷=마실 혈, 새소리 혈, 작은소리 혈 孑=외로울 혈, 나머지 혈, 창갈구리 혈 穴=굴 혈, 움 혈, 틈 혈, 굿 혈 絜=헤아릴 혈, 묶을 혈 血=피 혈, 피붙이 혈, 씩씩할 혈 趐=새가 떼로 날 혈, 나아갈 혈 頁=머리 혈, 마리 혈, 페이지(page) 혈 [혐] 嫌=싫어할 혐, 의심할 혐, 유쾌하지 않을 혐 [협] 侠=俠과 同字 俠=의기 협, 사이에 낄 협 劦=힘을 합할 협 勰=생각할 협, 조화할 협 匧=옷상자 협, 꿰맬 협 協=조화할 협, 맞을 협, 도울 협 叶=화합할 협 嗋=들이마실 협 埉=물가 협 夾=곁 협, 낄 협, 잡을 협, 성씨 협, 가까울 협 峽=물 낀 두메 협, 산이름 협 恊=겁낼 협, 위협할 협 悏=생각할 협 愜=쾌할 협, 뜻에 맞을 협 慊=족할 협 挾=낄 협, 도울 협, 품을 협 浹=사무칠 협, 둘릴 협 狹=좁을 협 篋=상자 협, 행담 협 脅=갈빗대 협, 위협할 협 脇=脅과 同字 莢=콩 꼬투리 협, 명협 협 鋏=칼 손잡이 협, 집개 협 陜=좁을 협 頬=頰과 同字 頰=뺨 협, 천천히 말할 협 [형] 亨=형통할 형, 제사 형 侀=이룰 형, 모일 형 兄=맏이 형 刑=형벌 형, 죽일 형 哼=겁낼 형 型=거푸집 형, 본보기 형 夐=멀 형, 바라보는 모양 형 娙=여관 이름 형, 예쁠 형 形=모양 형, 몸 형 桁=시렁 형, 마개 형 泂=멀 형, 깊고 넓은 모양 형, 차가운 형 滎=실개천 형, 물결 일 형 瀅=맑을 형, 개천 형 灐=물 이름 형 炯=빛날 형, 밝을 형 熒=등불 형 營=별이름 형 玹= 珩=노리개 형, 갓끈 형 瑩=밝을 형 荆=광대싸리 형, 가시 형 荊=모형나무 형, 곤장 형 蛍=螢과 同字 螢=개똥벌레 형 衡=저울대 형 詗=염탐할 형, 구할 형 迥=막을 형, 차단할 형 逈=멀 형, 빛날 형 邢=나라 이름 형, 땅 이름 형 鎣=줄 형, 꾸밀 형 陘=지레목 형, 비탈 형 馨=향기 형 [혜] 偕=같을 혜, 화할 혜 傒=묶을 혜 儶=빠를 혜, 잴 혜 兮=어조사 혜 匸=감출 혜, 덮을 혜 嘒=가냘플 혜 寭=밝힐 혜, 깨달을 혜 彗=비 혜, 꼬리별 혜 徯=기다릴 혜, 사잇길 혜 恵=惠의 略字 惠=은혜 혜, 사랑할 혜 慧=슬기로울 혜, 총명할 혜 槥=널 혜, 작은 관 혜 盻=흘겨볼 혜, 돌아볼 혜 蕙=혜초 혜 謑=창피줄 혜 譿=슬기로울 혜 蹊=지름길 혜, 건널 혜 醯=초 혜, 위대로울 혜 鞋=신 혜 鼷=새앙쥐 혜 [호] 乎=인가 호 互=서로 호, 함께 호 儫=영웅 호 冱=찰 호, 얼 호, 막을 호 冴=冱의 俗字 号=號의 略字 吳= 呉= 呺=큰체할 호 呼=부를 호, 숨 내쉴 호 唬=범이 울 호, 외칠 호 嘑=부르짖을 호, 거칠게 말할 호 嘷=짖을 호, 외칠 호 嚎=울부짖을 호 壕=해자 호 壺=병 호, 단지 호 壼= 好=좋을 호, 옳을 호 嫭=嫮와 同字 嫮=아름다울 호, 시기할 호 岵=산 호 弧=활 호 怙=믿을 호 戶=지게 호 户=戶와 同字 戸=戶와 同字 扈=뒤따를 호 昊=하늘 호, 큰 모양 호 晧=밝을 호, 빛날 호 暠=흴 호 毫=가는 털 호 沍=冱의 譌字 浩=클 호 淏=맑을 호 湖=호수 호 滈=장마 호 滬=강 이름 호 滸=물가 호 澔=浩와 同字 濠=해자 호, 강 이름 호 濩=퍼질 호 灝=넓을 호, 콩 삶은 물 호 犒=호궤할 호 狐=여우 호 猢=원숭이 호 琥=호박 호 瑚=산호 호 瓠=표주박 호, 단지 호 皐=부를 호 皓=흴 호, 깨끗할 호 皜=흴 호, 흰 모양 호 皞=밝을 호, 흴 호 祜=복 호 穫=땅 이름 호 箎=긴 대 호 糊=풀 호, 끈끈할 호 縞=명주 호, 흴 호 聕=들릴 호, 긴 귀 호 胡=턱밑살 호 芦=芐와 同字, 蔖의 俗字 葫=마늘 호, 조롱박 호 蒿=쑥 호, 향기날 호, 지칠 호 虎=범 호 號=울부짖을 호 許=이영차 호 護=보호할 호, 감쌀 호 豪=호걸 호, 귀인 호 醐=제호 호 鎬=호경 호 雇=새 이름 호 頀=구할 호, 지킬 호 顥=클 호, 빛나는 모양 호 餬=기식할 호 鬍=수염 호 [혹] 惑=미혹할 혹 或=혹 혹 熇=뜨거울 혹 酷=독할 혹 鵠=고니 혹 [혼] 倱=흐릿할 혼 圂=뒷간 혼 婚=혼인할 혼 惛=흐릴 혼 昆=덩어리 혼, 서쪽 오랑캐 이름 혼 昏=어두울 혼 棍=묶을 혼 混=섞을 혼 渾=흐릴 혼 溷=어지러울 혼 焜=빛날 혼 閽=문지기 혼 魂=넋 혼 鯇=산천어 혼 [홀] 唿=근심할 홀 囫=온전할 홀 忽=소흘히 할 홀 惚=황홀할 홀 核=씨 홀 笏=홀 홀 [홍] 哄=떠들썩할 홍 嗊=노래 홍 弘=넓을 홍 晎=날 밝으려 할 홍 汞=수은 홍 泓=깊을 홍 洪=큰물 홍 澒=수은 홍 烘=횃불 홍 篊=홈통 홍 紅=붉을 홍 虹=무지개 홍 訌=무너질 홍 鉷=돌쇠뇌 홍 閧=싸우는 소리 홍 鬨=싸울 홍 鴻=큰 기러기 홍 [화] 伙=세간 화 俰=화할 화 划=삿대 화 化=될 화 咊=순할 화 和=화할 화 嘩=譁와 同字 婲=예쁠 화 嬅=여자 이름 화 擭=덫 화, 함정 화 樺=자작나무 화 火=불 화 画=畫의 略字 畫=그림 화 畵=그림 화 禍=재화 화 禾=벼 화 花=꽃 화 華=꽃 화 話=말할 화 譁=시끄러울 화 貨=재화 화 靴=신 화 驊=준마 화 髁=넓적다리뼈 화 龢=풍류 조화될 화 [확] 劐=끊을 확 廓=클 확 拡=擴의 略字 擴=넓힐 확 攫=붙잡을 확 獲=낙심할 확 矍=두리번거릴 확 矡=호미 확 確=굳을 확 碻=굳을 확 礭=회초리 확 穫=벼 벨 확 鑊=가마 확 廓=둘레 확 [환] 丸=알 환 亘=굳셀 환 唤=喚과 同字 喚=부를 환 喛=성낼 환, 근심할 환 嚾=지껄일 환 圜=두를 환 奐=빛날 환 宦=벼슬 환 寰=기내 환 幻=변할 환 患=근심 환 懽=기뻐할 환 换=換과 同字 換=바꿀 환 擐=입을 환 晥=환할 환 桓=푯말 환 歓=歡과 同字 歡=기뻐할 환 涣=渙과 同字 渙=흩어질 환 湲=물소리 환, 물 졸졸 흐를 환 烉=煥의 俗字 焕=빛날 환 煥=불꽃 환 環=고리 환 瓛=옥홀 환 皖=샛별 환 眩=요술 환 睆=가득 차 있는 모양 환 紈=흰 비단 환 絙=끈목 환 讙=시끄러울 환 豢=기를 환 轘=환형 환 還=돌아올 환 鍰=무게 단위 환 鐶=고리 환 驩=기뻐할 환 鬟=쪽찐 머리 환 鯇=잉어 환 鰥=환어 환 [활] 咶=핥을 활, 이야기할 활 活=살 활 滑=미끄러울 활 猾=교활할 활 蛞=괄태충 활 豁=뚫린 골 활 越=부들자리 활 闊=트일 활 [황] 偟=노닐 황 况=況의 俗字 凰=봉황새 황 喤=어린아이 울음 황 媓=어머니 황 幌=휘장 황 徨=노닐 황 怳=멍할 황 恍=황홀할 황 惶=두려워할 황 惺= 愰=밝을 황 慌=어렴풋할 황 晃=밝을 황 晄=晃과 同字 榥=책상 황 況=하물며 황 湟=해자 황 滉=물 깊고 넓을 황 潢=웅덩이 황 煌=빛날 황 瑝=옥 소리 황 璜=서옥 황 皇=임금 황 礦=쇳돌 황 篁=대숲 황 簧=혀 황 肓=명치 끝 황 荒=거칠 황 蝗=누리 황 貺=줄 황 遑=허둥거릴 황 鎤=종소리 황 隍=해자 황 鰉=용상어 황 黃=누를 황 黄=누를 황 [홰] 噦=새소리 홰 噧=기운 높여 떠들 홰 [회] 会=會의 俗字 佪=어정거릴 회 劊=끊을 회 匯=물돌 회 回=돌 회 囬=回의 俗字 壞=혹 회 廻=돌 회 廽=돌 회 徊=노닐 회 恢=넓을 회 悔=뉘우칠 회 懷=품을 회 晦=그믐 회 會=모일 회 栃=상수리나무 회 桧=檜의 簡體字 樑= 檜=노송나무 회 洄=거슬러 올라 갈 회 淮=강 이름 회 滙=匯와 同字 澮=봇도랑 회 灰=재 회 烣=넓힐 회 獪=교활할 회 盔=바리 회 繪=그림 회 膾=회 회 茴=회향풀 회 蛔=회충 회, 거위(腹中蟲) 회 蜖=蛔의 簡體字 詼=조롱할 회 誨=가르칠 회 賄=뇌물 회 迴=回와 同字 逥=迴의 簡體字 鄶=나라이름 회 頮=세수할 회 鱠=회 회 [획] 劃=쪼갤 획 嚄=외칠 획 獲=얻을 획 画=畫의 略字 畫=그을 획 畵=畫의 俗字 [횡] 宖=집 울릴 횡 横=비낄 횡 橫=가로 횡 澋=물이 빙 돌 횡 薨=많을 횡 衡=가로 횡 鈜=쇳소리 횡 鐄=종 횡 黌=글방 횡 [효] 俲=본받을 효, 닮을 효, 배울 효 倄=찌를 효, 끙끙 앓을 효, 한탄할 효 傚=본받을 효 効=效의 俗字 呺=큰체할 효 哮=으르렁거릴 효 啋=움직일 효, 시끄러울 효 嗃=성낸 소리 효 嘵=두려워할 효 嚆=울릴 효 嚻=한가할 효 囂=시끄럽다 효 孝=효도 효 崤=산 이름 효 效=본받을 효 敩=斆의 略字 斅=가르칠 효 斆=斅와 同字 暁=曉와 同字 曉=새벽 효 校=학궁 효 梟=올배미 효 殽=섞일 효 涍=성 효 淆=뒤섞일 효 烋=거들거릴 효 熇=불김 효 爻=효 효 皛=나타날 효 肴=안주 효 虓=울부짖을 효 酵=술밑 효 餚=반찬 효 驍=날랠 효 驕=부리 짧은 사냥개 효 骹=발회목뼈 효 [후] 侯=과녁 후 候=물을 후 冔=관 후 厚=두터울 후 后=임금 후 吼=소 우는소리 후, 사자 우는소리 후, 원성 후, 범 성낸소리 후 吽=吼와 同字 喉=목구멍 후 喣=불 후 嗅=맡을 후 嘔=기쁠 후 垕=厚의 古字 堠=봉화대 후 帿=과녁 후 後=뒤 후 朽=섞을 후 涸=물 마를 후 煦=따뜻하게 할 후 猴=원숭이 후 珝=옥 이름 후 篌=공후 후 芋=클 후 蝴= 詡=자랑할 후 譃=망녕된 말 후 逅=만날 후 酗=주정할 후 餱=건량 후 鱟=참게 후 [훈] 勛=勳의 古字 勲=勳의 俗字 勳=공 훈 塤=壎과 同字 壎=진나팔 훈 暈=무리 훈 曛=삭양 빛 훈 焄=연기에 그을릴 훈 煇=지질 훈 熏=연기 낄 훈 燻=연기 낄 훈 爋=불에 말릴 훈 獯=오랑캐 이름 훈 纁=분홍빛 훈 葷=매운 채소 훈 薫=향내 훈 薰=향불 훈 訓=가르칠 훈 鑂=금빛 투색할 훈 馴=가르칠 훈 [훌] 欻=문득 훌 [훙] 薨=죽을 훙 [훤] 咺=섧게 울 훤 喧=의젓할 훤 嚾=지껄일 훤 暄=따뜻할 훤 暖=부드러울 훤 烜=마를 훤 煊=따뜻할 훤 萱=원추리 훤 諠=잊을 훤 諼=속일 훤 讙=시끄러울 훤 [훼] 卉=풀 훼 喙=부리 훼 毀=헐 훼 毁=毀의 俗字 燬=불 훼 芔=풀 훼 虫=벌레 훼 虺=살무사 훼 [휘] 彙=무리 휘 彚=彙와 同字 徽=아름다울 휘 戯=戱의 俗字 戱=기 휘, 대장 깃발 휘 揮=휘두를 휘 撝=찣을 휘 暉=빛 휘 煇=빛날 휘 翚=翬의 簡體字 翬=훨훨날 휘 諱=꺼릴 휘 輝=빛날 휘 麾=대장기 휘 [휴] 休=쉴 휴 倠=추할 휴 儶=끝 휴 咻=떠들 휴 嘼=쌓을 휴 堕=무너뜨릴 휴, 게으를 휴 携=끌 휴, 가질 휴, 떠날 휴, 나눌 휴, 연속할 휴 擕=携와 同字 烋=경사로울 휴 畦=밭두둑 휴 虧=이지러질 휴 貅=비휴 휴 隳=무너뜨릴 휴 髹=옻칠할 휴 鵂=수리부엉이 휴 [휵] 搐=당길 휵 畜=기를 휵, 용납할 휵 [휼] 卹=가엾이 여길 휼 恤=구휼할 휼 譎=속일 휼 [흉] 兇=흉악할 흉 凶=흉할 흉 哅=떠들 흉 忷=恟과 同字 恟=두려워할 흉 洶=물살세찰 흉 胷=胸과 同字 胸=가슴 흉 [흑] 黑=검을 흑 黒=黑과 同字 [흔] 俒=완전할 흔 很=패려궂을 흔 忻=기뻐할 흔 掀=치켜들 흔 昕=아침 흔 欣=기뻐할 흔 炘=화끈거릴 흔 焮=불사를 흔 琿= 痕=흉터 흔 衅=釁과 同字 訢=기뻐할 흔 釁=피바를 흔 [흘] 仡=날랠 흘 吃=말더듬을 흘 屹=산 우뚝솟을 흘 汔=거의 흘 汽=汔과 同字 疙=쥐부스럼 흘 紇=질 낮은 명주실 흘 訖=이를 흘 迄=이를 흘 鷸= 齕=깨물 흘 [흠] 廞=진열할 흠 欠=하품 흠 欽=공경할 흠 歆=받을 흠 [흡] 吸=숨 들이쉴 흡 噏=숨 들이쉴 흡 恰=마치 흡 歙=줄일 흡 洽=윤태하게 할 흡 潝=빨리 흐르는 소리 흡 翕=합할 흡 翖=翕과 同字 [흥] 匈= 興=일 흥 [희] 俙=비슷할 희, 어슴프레할 희, 희미할 희 僖=기쁠 희 凞=빛날 희 呬=쉴 희 咥=허허 웃을 희 唏=슬퍼할 희 喜=기뻐할 희 嘻=웃을 희 噫=탄식할 희 嚱=소리낼 희, 아아 경탄하는 소리 희 囍=쌍희 희 姫=姬의 俗字 姬=성 희 嬉=즐길 희 希=바랄 희 悕=슬퍼할 희 愾=한숨 희 憘=憙의 古字 憙=성할 희 戯=戲의 俗字 戱=戲의 俗字 戲=탄식할 희 晞=마를 희 暿=웃을 희 曦=햇빛 희 欷=흐느낄 희 煕=熙와 同字 熈=熙와 同字 熙=빛날 희 熹=성할 희 熺=熹와 同字 燹=들불 희 爔=불 희 犧=희생 희 禧=복 희 稀=드물 희 羲=숨 희 誒=탄식할 희 豨=멧돼지 희 釐=제사 지내는 고기 희 餼=꾸밀 희 凞=凞와 同字 [힁] 卝=쇠뭉치 힁, 금옥덩어리 힁 [히] 呬=숨 쉴 히 [힐] 犵=오랑캐이름 힐 纈=홀치기염색 힐 襭=옷자락 꽂을 힐 詰=물을 힐 頡=곧은목 힐 黠=약을 힐 nabi-nabi-1.0.1/tables/candidate/nabi-symbol.txt000066400000000000000000000113671430012456200215010ustar00rootroot00000000000000[ㄱ]  = != '= ,= .= /= := ;= ?= ^= _= `= |=  ̄= 、= 。= ·= ‥= …= ¨= 〃= ­= ―= ∥= \= ∼= ´= ~= ˇ= ˘= ˝= ˚= ˙= ¸= ˛= ¡= ¿= ː= [ㄴ] "= (= )= [= ]= {= }= ‘= ’= “= ”= 〔= 〕= 〈= 〉= 《= 》= 「= 」= 『= 』= 【= 】= [ㄷ] += -= <= == >= ±= ×= ÷= ≠= ≤= ≥= ∞= ∴= ♂= ♀= ∠= ⊥= ⌒= ∂= ∇= ≡= ≒= ≪= ≫= √= ∽= ∝= ∵= ∫= ∬= ∈= ∋= ⊆= ⊇= ⊂= ⊃= ∪= ∩= ∧= ∨= ¬= ⇒= ⇔= ∀= ∃= ∮= ∑= ∏= [ㄹ] $= %= ₩= F= ′= ″= ℃= Å= ¢= £= ¥= ¤= ℉= ‰= ?= ㎕= ㎖= ㎗= ㎘= ㏄= ㎣= ㎤= ㎥= ㎦= ㎙= ㎚= ㎛= ㎜= ㎝= ㎞= ㎟= ㎠= ㎡= ㎢= ㏊= ㎍= ㎎= ㎏= ㏏= ㎈= ㎉= ㏈= ㎧= ㎨= ㎰= ㎱= ㎲= ㎳= ㎴= ㎵= ㎶= ㎷= ㎸= ㎹= ㎀= ㎁= ㎂= ㎃= ㎄= ㎺= ㎻= ㎼= ㎽= ㎾= ㎿= ㎐= ㎑= ㎒= ㎓= ㎔= Ω= ㏀= ㏁= ㎊= ㎋= ㎌= ㏖= ㏅= ㎭= ㎮= ㎯= ㏛= ㎩= ㎪= ㎫= ㎬= ㏝= ㏐= ㏓= ㏃= ㏉= ㏜= ㏆= [ㅁ] #= &= *= @= §= ※= ☆= ★= ○= ●= ◎= ◇= ◆= □= ■= △= ▲= ▽= ▼= →= ←= ↑= ↓= ↔= 〓= ▷= ◀= ▷= ▶= ♤= ♠= ♡= ♥= ♧= ⊙= ◈= ▣= ◐= ◑= ▒= ▤= ▥= ▨= ▧= ▦= ▩= ♨= ☏= ☎= ☜= ☞= ¶= †= ‡= ↕= ↗= ↙= ↖= ↘= ♭= ♩= ♪= ♬= ㉿= ㈜= №= ㏇= ™= ㏂= ㏘= ℡= ?= ª= º= [ㅂ] ─= │= ┌= ┐= ┘= └= ├= ┬= ┤= ┴= ┼= ━= ┃= ┏= ┓= ┛= ┗= ┣= ┳= ┫= ┻= ╋= ┠= ┯= ┨= ┷= ┿= ┝= ┰= ┥= ┸= ╂= ┒= ┑= ┚= ┙= ┖= ┕= ┎= ┍= ┞= ┟= ┡= ┢= ┦= ┧= ┩= ┪= ┭= ┮= ┲= ┵= ┶= ┹= ┺= ┽= ┾= ╀= ╁= ╃= ╄= ╅= ╆= ╇= ╈= ╉= ╊= [ㅅ] ㉠= ㉡= ㉢= ㉣= ㉤= ㉥= ㉦= ㉧= ㉨= ㉩= ㉪= ㉫= ㉬= ㉭= ㉮= ㉯= ㉰= ㉱= ㉲= ㉳= ㉴= ㉵= ㉶= ㉷= ㉸= ㉹= ㉺= ㉻= ㈀= ㈁= ㈂= ㈃= ㈄= ㈅= ㈆= ㈇= ㈈= ㈉= ㈊= ㈋= ㈌= ㈍= ㈎= ㈏= ㈐= ㈑= ㈒= ㈓= ㈔= ㈕= ㈖= ㈗= ㈘= ㈙= ㈚= ㈛= [ㅇ] ⓐ= ⓑ= ⓒ= ⓓ= ⓔ= ⓕ= ⓖ= ⓗ= ⓘ= ⓙ= ⓚ= ⓛ= ⓜ= ⓝ= ⓞ= ⓟ= ⓠ= ⓡ= ⓢ= ⓣ= ⓤ= ⓥ= ⓦ= ⓧ= ⓨ= ⓩ= ①= ②= ③= ④= ⑤= ⑥= ⑦= ⑧= ⑨= ⑩= ⑪= ⑫= ⑬= ⑭= ⑮= ⒜= ⒝= ⒞= ⒟= ⒠= ⒡= ⒢= ⒣= ⒤= ⒥= ⒦= ⒧= ⒨= ⒩= ⒪= ⒫= ⒬= ⒭= ⒮= ⒯= ⒰= ⒱= ⒲= ⒳= ⒴= ⒵= ⑴= ⑵= ⑶= ⑷= ⑸= ⑹= ⑺= ⑻= ⑼= ⑽= ⑾= ⑿= ⒀= ⒁= ⒂= [ㅈ] 0= 1= 2= 3= 4= 5= 6= 7= 8= 9= ⅰ= ⅱ= ⅲ= ⅳ= ⅴ= ⅵ= ⅶ= ⅷ= ⅸ= ⅹ= Ⅰ= Ⅱ= Ⅲ= Ⅳ= Ⅴ= Ⅵ= Ⅶ= Ⅷ= Ⅸ= Ⅹ= [ㅊ] ½= ⅓= ⅔= ¼= ¾= ⅛= ⅜= ⅝= ⅞= ¹= ²= ³= ⁴= ⁿ= ₁= ₂= ₃= ₄= [ㅋ] ㄱ= ㄲ= ㄳ= ㄴ= ㄵ= ㄶ= ㄷ= ㄸ= ㄹ= ㄺ= ㄻ= ㄼ= ㄽ= ㄾ= ㄿ= ㅀ= ㅁ= ㅂ= ㅃ= ㅄ= ㅅ= ㅆ= ㅇ= ㅈ= ㅉ= ㅊ= ㅋ= ㅌ= ㅍ= ㅎ= ㅏ= ㅐ= ㅑ= ㅒ= ㅓ= ㅔ= ㅕ= ㅖ= ㅗ= ㅘ= ㅙ= ㅚ= ㅛ= ㅜ= ㅝ= ㅞ= ㅟ= ㅠ= ㅡ= ㅢ= ㅣ= [ㅌ] ㅥ= ㅦ= ㅧ= ㅨ= ㅩ= ㅪ= ㅫ= ㅬ= ㅭ= ㅮ= ㅯ= ㅰ= ㅱ= ㅲ= ㅳ= ㅴ= ㅵ= ㅶ= ㅷ= ㅸ= ㅹ= ㅺ= ㆄ= ㅼ= ㅽ= ㅾ= ㅿ= ㆀ= ㆁ= ㆂ= ㆃ= ㆄ= ㆅ= ㆆ= ㆇ= ㆈ= ㆉ= ㆊ= ㆋ= ㆌ= ㆍ= ㆎ= [ㅍ] A= B= C= D= E= F= G= H= I= J= K= L= M= N= O= P= Q= R= S= T= U= V= W= X= Y= Z= a= b= c= d= e= f= g= h= i= j= k= l= m= n= o= p= q= r= s= t= u= v= w= x= y= z= [ㅎ] Α= Β= Γ= Δ= Ε= Ζ= Η= Θ= Ι= Κ= Λ= Μ= Ν= Ξ= Ο= Π= Ρ= Σ= Τ= Υ= Φ= Χ= Ψ= Ω= α= β= γ= δ= ε= ζ= η= θ= ι= κ= λ= μ= ν= ξ= ο= π= ρ= σ= τ= υ= φ= χ= ψ= ω= [ㄲ] Æ= Ð= Ħ= IJ= Ŀ= Ł= Ø= Œ= Þ= Ŧ= Ŋ= æ= đ= ð= ħ= ı= ij= ĸ= ŀ= ł= ø= œ= ß= þ= ŧ= ŋ= ʼn= [ㄸ] ぁ= あ= ぃ= い= ぅ= う= ぇ= え= ぉ= お= か= が= き= ぎ= く= ぐ= け= げ= こ= ご= さ= ざ= し= じ= す= ず= せ= ぜ= そ= ぞ= た= だ= ち= ぢ= っ= つ= づ= て= で= と= ど= な= に= ぬ= ね= の= は= ば= ぱ= ひ= び= ぴ= ふ= ぶ= ぷ= へ= べ= ぺ= ほ= ぼ= ぽ= ま= み= む= め= も= ゃ= や= ゅ= ゆ= ょ= よ= ら= り= る= れ= ろ= ゎ= わ= ゐ= ゑ= を= ん= [ㅃ] ァ= ア= ィ= イ= ゥ= ウ= ェ= エ= ォ= オ= カ= ガ= キ= ギ= ク= グ= ケ= ゲ= コ= ゴ= サ= ザ= シ= ジ= ス= ズ= セ= ゼ= ソ= ゾ= タ= ダ= チ= ヂ= ッ= ツ= ヅ= テ= デ= ト= ド= ナ= ニ= ヌ= ネ= ノ= ハ= バ= パ= ヒ= ビ= ピ= フ= ブ= プ= ヘ= ベ= ペ= ホ= ボ= ポ= マ= ミ= ム= メ= モ= ャ= ヤ= ュ= ユ= ョ= ヨ= ラ= リ= ル= レ= ロ= ヮ= ワ= ヰ= ヱ= ヲ= ン= ヴ= ヵ= ヶ= [ㅆ] А= Б= В= Г= Д= Е= Ё= Ж= З= И= Й= К= Л= М= Н= О= П= Р= С= Т= У= Ф= Х= Ц= Ч= Ш= Щ= Ъ= Ы= Ь= Э= Ю= Я= а= б= в= г= д= е= ё= ж= з= и= й= к= л= м= н= о= п= р= с= т= у= ф= х= ц= ч= ш= щ= ъ= ы= ь= э= ю= я= nabi-nabi-1.0.1/tables/candidate/nabi.txt000066400000000000000000007100321430012456200201710ustar00rootroot00000000000000[ㄱ]  = != '= ,= .= /= := ;= ?= ^= _= `= |=  ̄= 、= 。= ·= ‥= …= ¨= 〃= ­= ―= ∥= \= ∼= ´= ~= ˇ= ˘= ˝= ˚= ˙= ¸= ˛= ¡= ¿= ː= [ㄴ] "= (= )= [= ]= {= }= ‘= ’= “= ”= 〔= 〕= 〈= 〉= 《= 》= 「= 」= 『= 』= 【= 】= [ㄷ] += -= <= == >= ±= ×= ÷= ≠= ≤= ≥= ∞= ∴= ♂= ♀= ∠= ⊥= ⌒= ∂= ∇= ≡= ≒= ≪= ≫= √= ∽= ∝= ∵= ∫= ∬= ∈= ∋= ⊆= ⊇= ⊂= ⊃= ∪= ∩= ∧= ∨= ¬= ⇒= ⇔= ∀= ∃= ∮= ∑= ∏= [ㄹ] $= %= ₩= F= ′= ″= ℃= Å= ¢= £= ¥= ¤= ℉= ‰= ?= ㎕= ㎖= ㎗= ㎘= ㏄= ㎣= ㎤= ㎥= ㎦= ㎙= ㎚= ㎛= ㎜= ㎝= ㎞= ㎟= ㎠= ㎡= ㎢= ㏊= ㎍= ㎎= ㎏= ㏏= ㎈= ㎉= ㏈= ㎧= ㎨= ㎰= ㎱= ㎲= ㎳= ㎴= ㎵= ㎶= ㎷= ㎸= ㎹= ㎀= ㎁= ㎂= ㎃= ㎄= ㎺= ㎻= ㎼= ㎽= ㎾= ㎿= ㎐= ㎑= ㎒= ㎓= ㎔= Ω= ㏀= ㏁= ㎊= ㎋= ㎌= ㏖= ㏅= ㎭= ㎮= ㎯= ㏛= ㎩= ㎪= ㎫= ㎬= ㏝= ㏐= ㏓= ㏃= ㏉= ㏜= ㏆= [ㅁ] #= &= *= @= §= ※= ☆= ★= ○= ●= ◎= ◇= ◆= □= ■= △= ▲= ▽= ▼= →= ←= ↑= ↓= ↔= 〓= ▷= ◀= ▷= ▶= ♤= ♠= ♡= ♥= ♧= ⊙= ◈= ▣= ◐= ◑= ▒= ▤= ▥= ▨= ▧= ▦= ▩= ♨= ☏= ☎= ☜= ☞= ¶= †= ‡= ↕= ↗= ↙= ↖= ↘= ♭= ♩= ♪= ♬= ㉿= ㈜= №= ㏇= ™= ㏂= ㏘= ℡= ?= ª= º= [ㅂ] ─= │= ┌= ┐= ┘= └= ├= ┬= ┤= ┴= ┼= ━= ┃= ┏= ┓= ┛= ┗= ┣= ┳= ┫= ┻= ╋= ┠= ┯= ┨= ┷= ┿= ┝= ┰= ┥= ┸= ╂= ┒= ┑= ┚= ┙= ┖= ┕= ┎= ┍= ┞= ┟= ┡= ┢= ┦= ┧= ┩= ┪= ┭= ┮= ┲= ┵= ┶= ┹= ┺= ┽= ┾= ╀= ╁= ╃= ╄= ╅= ╆= ╇= ╈= ╉= ╊= [ㅅ] ㉠= ㉡= ㉢= ㉣= ㉤= ㉥= ㉦= ㉧= ㉨= ㉩= ㉪= ㉫= ㉬= ㉭= ㉮= ㉯= ㉰= ㉱= ㉲= ㉳= ㉴= ㉵= ㉶= ㉷= ㉸= ㉹= ㉺= ㉻= ㈀= ㈁= ㈂= ㈃= ㈄= ㈅= ㈆= ㈇= ㈈= ㈉= ㈊= ㈋= ㈌= ㈍= ㈎= ㈏= ㈐= ㈑= ㈒= ㈓= ㈔= ㈕= ㈖= ㈗= ㈘= ㈙= ㈚= ㈛= [ㅇ] ⓐ= ⓑ= ⓒ= ⓓ= ⓔ= ⓕ= ⓖ= ⓗ= ⓘ= ⓙ= ⓚ= ⓛ= ⓜ= ⓝ= ⓞ= ⓟ= ⓠ= ⓡ= ⓢ= ⓣ= ⓤ= ⓥ= ⓦ= ⓧ= ⓨ= ⓩ= ①= ②= ③= ④= ⑤= ⑥= ⑦= ⑧= ⑨= ⑩= ⑪= ⑫= ⑬= ⑭= ⑮= ⒜= ⒝= ⒞= ⒟= ⒠= ⒡= ⒢= ⒣= ⒤= ⒥= ⒦= ⒧= ⒨= ⒩= ⒪= ⒫= ⒬= ⒭= ⒮= ⒯= ⒰= ⒱= ⒲= ⒳= ⒴= ⒵= ⑴= ⑵= ⑶= ⑷= ⑸= ⑹= ⑺= ⑻= ⑼= ⑽= ⑾= ⑿= ⒀= ⒁= ⒂= [ㅈ] 0= 1= 2= 3= 4= 5= 6= 7= 8= 9= ⅰ= ⅱ= ⅲ= ⅳ= ⅴ= ⅵ= ⅶ= ⅷ= ⅸ= ⅹ= Ⅰ= Ⅱ= Ⅲ= Ⅳ= Ⅴ= Ⅵ= Ⅶ= Ⅷ= Ⅸ= Ⅹ= [ㅊ] ½= ⅓= ⅔= ¼= ¾= ⅛= ⅜= ⅝= ⅞= ¹= ²= ³= ⁴= ⁿ= ₁= ₂= ₃= ₄= [ㅋ] ㄱ= ㄲ= ㄳ= ㄴ= ㄵ= ㄶ= ㄷ= ㄸ= ㄹ= ㄺ= ㄻ= ㄼ= ㄽ= ㄾ= ㄿ= ㅀ= ㅁ= ㅂ= ㅃ= ㅄ= ㅅ= ㅆ= ㅇ= ㅈ= ㅉ= ㅊ= ㅋ= ㅌ= ㅍ= ㅎ= ㅏ= ㅐ= ㅑ= ㅒ= ㅓ= ㅔ= ㅕ= ㅖ= ㅗ= ㅘ= ㅙ= ㅚ= ㅛ= ㅜ= ㅝ= ㅞ= ㅟ= ㅠ= ㅡ= ㅢ= ㅣ= [ㅌ] ㅥ= ㅦ= ㅧ= ㅨ= ㅩ= ㅪ= ㅫ= ㅬ= ㅭ= ㅮ= ㅯ= ㅰ= ㅱ= ㅲ= ㅳ= ㅴ= ㅵ= ㅶ= ㅷ= ㅸ= ㅹ= ㅺ= ㆄ= ㅼ= ㅽ= ㅾ= ㅿ= ㆀ= ㆁ= ㆂ= ㆃ= ㆄ= ㆅ= ㆆ= ㆇ= ㆈ= ㆉ= ㆊ= ㆋ= ㆌ= ㆍ= ㆎ= [ㅍ] A= B= C= D= E= F= G= H= I= J= K= L= M= N= O= P= Q= R= S= T= U= V= W= X= Y= Z= a= b= c= d= e= f= g= h= i= j= k= l= m= n= o= p= q= r= s= t= u= v= w= x= y= z= [ㅎ] Α= Β= Γ= Δ= Ε= Ζ= Η= Θ= Ι= Κ= Λ= Μ= Ν= Ξ= Ο= Π= Ρ= Σ= Τ= Υ= Φ= Χ= Ψ= Ω= α= β= γ= δ= ε= ζ= η= θ= ι= κ= λ= μ= ν= ξ= ο= π= ρ= σ= τ= υ= φ= χ= ψ= ω= [ㄲ] Æ= Ð= Ħ= IJ= Ŀ= Ł= Ø= Œ= Þ= Ŧ= Ŋ= æ= đ= ð= ħ= ı= ij= ĸ= ŀ= ł= ø= œ= ß= þ= ŧ= ŋ= ʼn= [ㄸ] ぁ= あ= ぃ= い= ぅ= う= ぇ= え= ぉ= お= か= が= き= ぎ= く= ぐ= け= げ= こ= ご= さ= ざ= し= じ= す= ず= せ= ぜ= そ= ぞ= た= だ= ち= ぢ= っ= つ= づ= て= で= と= ど= な= に= ぬ= ね= の= は= ば= ぱ= ひ= び= ぴ= ふ= ぶ= ぷ= へ= べ= ぺ= ほ= ぼ= ぽ= ま= み= む= め= も= ゃ= や= ゅ= ゆ= ょ= よ= ら= り= る= れ= ろ= ゎ= わ= ゐ= ゑ= を= ん= [ㅃ] ァ= ア= ィ= イ= ゥ= ウ= ェ= エ= ォ= オ= カ= ガ= キ= ギ= ク= グ= ケ= ゲ= コ= ゴ= サ= ザ= シ= ジ= ス= ズ= セ= ゼ= ソ= ゾ= タ= ダ= チ= ヂ= ッ= ツ= ヅ= テ= デ= ト= ド= ナ= ニ= ヌ= ネ= ノ= ハ= バ= パ= ヒ= ビ= ピ= フ= ブ= プ= ヘ= ベ= ペ= ホ= ボ= ポ= マ= ミ= ム= メ= モ= ャ= ヤ= ュ= ユ= ョ= ヨ= ラ= リ= ル= レ= ロ= ヮ= ワ= ヰ= ヱ= ヲ= ン= ヴ= ヵ= ヶ= [ㅆ] А= Б= В= Г= Д= Е= Ё= Ж= З= И= Й= К= Л= М= Н= О= П= Р= С= Т= У= Ф= Х= Ц= Ч= Ш= Щ= Ъ= Ы= Ь= Э= Ю= Я= а= б= в= г= д= е= ё= ж= з= и= й= к= л= м= н= о= п= р= с= т= у= ф= х= ц= ч= ш= щ= ъ= ы= ь= э= ю= я= [가] 个=명당 곁방 가 仮=假의 略字 伽=절 가 佳=아름다울 가 価=價의 略字 假=거짓 가 傢=세간 가 價=값 가 加=더할 가 叚=빌 가 可=옳을 가 呵=꾸짖을 가 咖=커피차 가, 커피의 음차로 쓰는자 가 哥=노래 가 哿=좋을 가 嘉=아름다울 가 嘏= 坷=험할 가 嫁=시집갈 가 宊=家와 同字 家=집 가 斝=옥잔 가 暇=겨를 가 架=시렁 가 枷=목칼 가, 도리깨채 가 柯=가지 가 榎=檟와 同字 檟=오동나무 가 歌=노래 가 珂=옥 이름 가 珈=머리꾸미개 가 痂=헌데 딱지 가 稼=심을 가 笳=갈잎피리 가 耞=도리깨 가 舸=큰 배 가 苛=매울 가 茄=가지 가 葭=갈대 가 街=거리 가 袈=가사 가 訶=꾸짖을 가 謌=歌와 同字 賈=값 가 跏=책상다리할 가 軻=수레 가기 힘들 가 迦=부처이름 가 駕=멍에 가 髂=허리뼈 가 [각] 傕=성 각 刻=새길 각 却=물리칠 각 卻=却의 本字 各=각각 각 咯=토할 각 埆=메마를 각 恪=삼갈 각 慤=삼갈 각 搉=칠 각 擱=놓을 각 桷=서까래 각 殻= 殼=껍질 각 玨=珏의 古字 珏=쌍옥 각 脚=다리 각 覚=覺의 略字 覺=깨달을 각 角=뿔 각 較=수레 귀 각 閣=문설주 각 [간] 乾=마를 간 亁=乾의 俗字 侃=강직할 간 倝=해 돋을 간 偘=侃과 同字 刊=책 펴낼 간 囏=艱의 古字 墾=따비질할 간 奸=범할 간, 간악할 간 姦=간사할 간 干=방패 간 幹=줄기 간, 우물난간 간 慳=아낄 간 懇=정성 간 揀=가릴 간 斡=관리할 간 旰=해질 간 杆=지레 간, 나무이름 간 柬=가릴 간 栞=도표 간 榦=幹의 本字 澗=산골물 간 玕=옥돌 간 珢=부르터 삐어진 흔적 있는 옥 간 癎=경풍 간 看=볼 간 磵=산골 시내 간, 석간수 간 秆=稈과 同字 稈=짚 간 竿=장대 간, 화살대 간, 횃대 간 簡=대쪽 간 肝=간 간 艮=괘이름 간 艱=어려울 간 茛=독초이름 간, 미나리아재비 간 衎=즐길 간, 바를 간 諫=간할 간 赶=달릴 간 迀=구할 간, 권할 간 閒=틈 간 間=틈 간, 사이 간 齦=물을 간 [갈] 丐=거지 갈, 줄 갈 乫=땅이름 갈 匄=청구할 갈, 줄 갈, 빌 갈 咭=쥐 우는 소리 갈 喝=꾸짖을 갈, 성낸 소리 갈 嘠= 噶=벼슬이름 갈, 땅이름 갈 掲=揭과 同字 揭=높이 들 갈, 옷 걷고 물 건널 갈, 등에 질 갈 曷=어찌 갈, 그칠 갈, 벌레이름 갈 楬=패를 써서 표시할 갈 渇=渴과 同字 渴=목마를 갈, 급할 갈 碣=비 갈, 우뚝선 돌 갈, 동해의 산이름 갈 秸=볏짚 갈, 짚 고갱이 갈 竭=다할 갈, 마를 갈 羯=불친 양 갈, 땅이름 갈 葛=칡 갈 蝎=전갈 갈, 빈대 갈 蠍=전갈 갈 褐=털베 갈, 굵은 베 갈, 천한사람 갈, 갈옷 갈 鞨=말갈나라 갈, 말갈보석 갈 頡=긁을 갈, 밟을 갈 鶡=할단새 갈, 관이름 갈 [감] 减=減의 俗字 凵=입 벌릴 감, 위가 벌어진 그릇 감 勘=마감할 감, 정할 감 坎=구덩이 감, 험할 감, 작은 잔 감, 괘 이름 감, 불우하여 뜻을 이루지 못할 감 坩=도가니 감 埳=구덩이 감 堪=견딜 감, 이길 감, 맡을 감, 하늘 감, 산 모양이 기괴할 감 嵁=산 험할 감 嵌=깊은 골 감, 곁굴 감, 깊은 산 감 弇=뚜껑 감, 사람이름 감 感=감동할 감, 찌를 감, 깨달을 감, 느낄 감 憨=어리석을 감, 미련할 감 憾=섭섭할 감, 한할 감, 한혐할 감 戡=찌를 감, 이길 감, 죽일 감 撼=흔들 감, 움직일 감, 깨뜨릴 감 敢=감히 감, 구태여 감, 날랠 감, 용맹할 감 柑=감귤 감, 감자 감 橄=감람나무 감 欠=하픔할 감, 기지개 켤 감, 이지러질 감 欿=서운할 감, 찌푸릴 감, 걱정할 감 減=덜 감, 무지러질 감, 가벼울 감, 물이름 감 甘=달 감, 달게 여길 감 疳=감질병 감, 궤양 감, 창병 감, 종기 아플 감 監=거느릴 감, 살필 감, 볼 감, 벼슬 감, 감옥 감 瞰=굽어볼 감, 내려다 볼 감 紺=아청 감, 보랏빛 감 鍼= 鑑=거울 감, 밝을 감, 비칠 감, 경계할 감 鑒=鑑과 同字 龕=취할 감, 이길 감, 감실 감 [갑] 匣=궤 갑, 상자 갑 合=부를 갑, 홉 갑 岬=산 허구리 갑, 줄이 느런할 갑 押=도울 갑, 단속할 갑, 잡아들일 갑 甲=갑옷 갑, 첫째 천간 갑, 비롯할 갑, 떡잎 날 갑, 법령 갑, 대궐 갑 胛=어깻죽지 갑 鉀=갑옷 갑 閘=문 빗장 갑, 물 문 갑 韐=가죽바지 갑 [강] 傋=아첨 아니할 강 僵=엎드러질 강, 쓰러질 강 剛=굳을 강, 굳셀 강, 꼬장할 강, 바야흐로 강 匟=평상 강 唴=어린아이 울 강, 울어 기진할 강 堈=언덕 강, 밭 두둑 강 壃=疆과 同字 姜=성씨 강, 강할 강 岡=멧동 강, 산등성이 강 崗=岡의 俗字 干=생강 강 康=편안할 강, 즐거울 강, 다섯거리 강 強=强의 本字 强=강할 강, 나머지 강, 바구미 강 彊=굳셀 강, 센 활 강, 사나울 강, 송장 뻣뻣할 강 忼=강개할 강, 뜻이 크고 기개있을 강, 탄식할 강 慶=복 강, 이에 강 慷=강개할 강 扛=마주 들 강 控=칠 강 杠=외나무 다리 강, 깃대 강, 상 앞 가로막대 강, 올릴 강 橿=참죽나무 강, 호미자루 강, 사닥다리 강, 억셀 강 殭=죽어 썩지 않을 강, 마른 누에 강 江=가람 강, 물 강 畺=疆과 同字 疆=땅 경계 강, 갈피 강, 굳셀 강, 변방 강 矼=돌다리 강, 징검다리 강, 성실할 강 穅=겨 강, 악기이름 강 糠=겨 강, 번쇄할 강 絳=깊게 붉을 강, 강초 강 綱=벼리 강, 근본 강, 법 강, 대강 강 繈=繦의 本字 繦=돈꿰미 강 罡=강별 강 羌=오랑캐 강, 말 끝낼 강 羗=羌과 同字 羫=밭 갈 강 腔=창자 강, 속 빌 강, 뼈대 강, 말 허구리 강 舡=오나라 배 강 茳=강리풀 강 薑=생강 강 虹=골이름 강 襁=포대기 강 講=강론할 강, 강구할 강, 익힐 강, 강화할 강 豇=광저기 강 鋼=쇠 강 降=내릴 강, 떨어질 강, 돌아갈 강 韁=고삐 강 鱇=천징어 강 [개] 丐=빌 개 个=낱 개 介=낄 개, 도울 개, 맬 개, 클 개, 중매할 개 价=착할 개, 클 개, 사신 개 佳=착할 개, 좋을 개, 좋아할 개 個=낱 개, 치우칠 개 凱=싸움 이긴 풍류 개, 착할 개, 마파람 개, 좋은 사람 개 剴=낫 개, 가까울 개, 간절할 개 匃=청구할 개, 줄 개, 빌 개 匄=匃와 同字 喈=새소리 개, 빠를 개 嘅=탄식할 개, 성낼 개 塏=시원한 땅 개 恝=걱정 없을 개 愷=탐할 개, 급할 개 愾=한숨 쉴 개, 성낼 개 慨=분할 개, 강개할 개, 슬플 개 揩=문지를 개, 문질러 훔칠 개 改=고칠 개, 거듭할 개, 바꿀 개 概=槪와 同字 槩=槪와 同字 槪=평두목 개, 절개 개, 대강 개, 거리낄 개, 칠한 술통 개 溉=漑와 同字 漑=물 댈 개, 씻을 개, 물 천천히 흐를 개 玠=큰 서옥 개 疥=옴 개 皆=모두 개, 한 가지 개, 같을 개 盖=蓋의 俗字 磕=돌 부딪는 소리 개 箇=낱 개, 개수 개 芥=겨자 개, 갓 개, 지푸라기 개, 티끌 개 蓋=뚜껑 개, 덮개 개, 이엉 개, 우산 개, 가리울 개 解=벗을 개, 풀 개, 헤칠 개, 발신할 개 豈=승전악 개 鎧=투구 개, 갑옷 개 開=열 개, 통할 개, 발할 개, 베풀 개, 풀 개 闓=열 개, 풀 개, 활깍지 개 豈=승전악 개 [객] 喀=기침할 객, 토할 객 客=손님 객, 부칠 객, 나그네 객, 지날 객 [갱] 坑=빠질 갱, 묻을 갱, 구덩이 갱 更=다시 갱 硜=아릿아릿할 갱, 알랑알랑할 갱, 돌소리 갱 粳=메벼 갱 羹=국 갱 賡=이을 갱, 일 갱 鏗=금석 소리 갱, 사람이름 갱 更=다시 갱 [갹] 噱=껄껄 웃을 갹, 입 벌일 갹 醵=술추렴 갹, 추렴 걷을 갹 [거] 佉=나라이름 거 俥=인력거 거 倨=거만할 거, 걸터 앉을 거, 굽을 거 凥=居와 同字 勮=부지런히 힘쓸 거, 두려울 거 厺=去의 本字 去=갈 거, 버릴 거, 오래될 거, 떨어질 거, 쫓을 거, 감출 거 呿=입 딱 벌일 거 居=살 거, 곳 거, 앉을 거, 놓을 거, 쌓을 거 巨=클 거, 많을 거, 억 거 拒=막을 거, 맞설 거, 다닥칠 거, 다다를 거 拠=據의 俗字 据=가질 거, 길거할 거, 의지할 거, 손병 거 據=의지할 거, 기댈 거, 웅거할 거, 짚을 거 擧=들 거, 받들 거, 움직일 거, 일걸을 거 昛=밝을 거 渠=개천 거, 도랑 거, 휑덩그렁할 거, 클 거, 껄껄 웃을 거, 무엇 거 炬=횃불 거, 불 땔 거 祛=물리칠 거, 빌 거, 굳셀 거 秬=검은 기장 거 筥=쌀 담는 광주리 거, 볏단 거 籧=대자리 거, 천상바라기 거, 양잠기 거 胠=열 거, 갈비 거 腒=건치 거, 꿩 포 거 艍= 苣=상추 거, 검은 깨 거 莒=모시풀 거, 나라이름 거, 고을이름 거 蕖=연꽃 거 蘧=패랭이꽃 거, 석죽화 거, 마음에 든든할 거 袪=소매 거, 소매 아귀 거 裾=옷 뒷자락 거 詎=어찌 거, 모를 거 距=며느리 발톱 거, 지낼 거, 뛸 거, 겨룰 거, 미눌 거 踞=걸터앉을 거 車=수레 거, 그물 거, 잇몸 거 遽=급할 거, 두려울 거, 역말 수레 거 醵=술추렴 거, 추렴 걷을 거 鉅=갈고리 거, 클 거, 강한 쇠 거 鋸=톱 거, 다리 꺾는 형벌 거 駏=튀기 거, 거공벌레 거 車=수레 거, 그물 거, 잇몸 거 [걱] 巪=사람 이름자 걱 [건] 乾=하늘 건, 괘 이름 건, 서북쪽 건, 굳셀 건, 임금 건 亁=乾과 同字 件=조건 건, 가지 건, 구별할 건, 나눌 건 健=굳셀 건, 병 없을 건, 탐할 건 囝=아이 건 巾=수건 건, 덮을 건 建=세울 건, 둘 건, 심을 건, 칼집 건, 별이름 건 愆=죄 건, 허물 건, 어기어질 건 揵=멜 건, 막을 건, 들 건 楗=문 빗장 건, 문지방 건 犍=불친 소 건, 짐승이름 건, 촉나라 고을이름 건 睷=눈으로 세어볼 건 腱=힘줄 건 荐= 虔=정성 건, 빼앗을 건, 죽일 건 褰=바지 건, 걷을 건, 발 걷을 건 謇=말 더듬거릴 건, 바른말할 건 蹇=절름거릴 건, 험할 건, 교만할 건 鍵=열쇠 건, 수레 굴대 건 鞬=칼집 건, 동개 건 騫=말 배 앓을 건, 이지러질 건, 휙 뛰어 나아갈 건 [걸] 乞=구걸할 걸, 요구할 걸, 원할 걸, 거지 걸 乬=갈 걸 偈=힘 빼두를 걸, 빠를 걸, 헌걸찰 걸 傑=호걸 걸, 준걸 걸, 뛰어날 걸, 거만할 걸, 떡잎 걸 朅=갈 걸 杰=傑의 俗字 桀=찢을 걸, 홰 걸, 빼어날 걸, 멜 걸, 사나을 걸, 왕이름 걸 榤=닭의 홰 걸 渇=渴과 同字 渴=물 잦을 걸 竭=다할 걸, 마를 걸 [검] 倹=儉의 略字 儉=검소할 검, 흉년들 검, 적을 검, 가난할 검 剣=劍과 同字 劍=칼 검, 칼로 찔러 죽일 검, 칼 쓰는법 검 劎=劍과 同字 劒=劎의 譌字 劔=劎의 俗字 撿=잡을 검, 구속할 검, 관찰할 검, 비교할 검 柑= 検=檢과 同字 檢=교정할 검, 금제할 검, 법 검, 봉할 검, 책메뚜기 검, 수결둘 검 歛=탐할 검, 구걸할 검 泔= 淦= 澉= 瞼=눈시울 검 矙= 芡=마름 검, 가시연밥 검 轗= 酣= 鈐=굴대 비녀장 검, 자물쇠 검, 큰 보습 검 鹻=소금물 검, 잿물 검, 비누 검 黔=검을 검 [겁] 刦=겁탈할 겁, 구속할 겁 刧=刦의 俗字 劫=위협할 겁, 겁탈할 겁, 부지런할 겁, 대궐 층계 겁, 겁 겁, 화재 겁 怯=무서워할 겁, 겁낼 겁, 으를 겁 迲= [것] 唟=땅이름 것 [게] 偈=쉴 게, 게타 게, 글귀 게 卟=점칠 게, 생각할 게 憩=쉴 게 掲=揭와 同字 揭=높이 들 게, 옷 걷고 물 건널 게, 등에 질 게 碣=돌 세울 게 [격] 嗝=딸꾹질할 격, 꿩 울 격 挌=칠 격, 들 격 撃=칠 격, 두드릴 격, 눈에 마주칠 격, 죽일 격 擊=撃과 同字 格=이를 격, 올 격, 바를 격, 대적할 격, 감동할 격 檄=격서 격, 격문 격, 과격할 격 毄=맞부딛는 소리 격, 충돌할 격, 창 격 激=물결 부딪혀 흐를 격, 찌를 격, 맑은 소리 격, 말 과격히 할 격 膈=명치 격 覡=박수 격, 남자무당 격 闃=고요할 격 隔=막을 격, 멀 격 骼=마른 뼈 격, 드러난 뼈 격, 짐승의 뼈 격 鬲=오지병 격, 땅이름 격 鴃=왜가리 격, 때까치 격 [견] 健=탐할 견 堅=굳을 견, 굳셀 견, 반드시 견 樫=떡갈나무 견 牽=당길 견, 이끌 견, 빠를 견, 거리낄 견, 볏줄 견 犬=큰 개 견 狷=고집스러울 견, 조수할 견, 편협할 견 甄=질그릇 견, 살필 견, 표시할 견, 진 이름 견, 면할 견, 밝을 견 甽=畎의 古字 畎=밭 도랑 견, 산골 도랑 견 筧=대 홈통 견 絹=비단 견, 깁 견 縳=올 견, 낳이 실 견 縴=궂은 솜 견 繭=고치 견, 발 부르틀 견, 목 쉴 견, 비단 견 繾=곡진할 견, 마지 않을 견 羂=걸 견, 걸릴 견 肩=어깨 견, 이길 견, 맡길 견, 멜 견, 세 살 된 짐승 견 蠲=밝을 견, 조촐할 견, 반딧불 견 見=볼 견, 만날 견, 당할 견 譴=꾸짖을 견, 성낼 견, 귀양갈 견 豣=큰 돼지 견, 세 살 된 돼지 견 趼=발 부르틀 견 遣=보낼 견, 쫓을 견, 견전제 견 鰹=큰 가물치 견, 물치 견, 강고도리 견 鵑=접동새 견, 두견새 견, 뻐꾹새 견 [결] 僪=해무리 결, 미칠 결 决=決의 俗字 刔=抉과 同字 抉=긁을 결, 당길 결 拮=길거할 결, 열심히 일할 결 決=결단할 결, 물이름 결, 물골 터 놓을 결, 끊을 결, 이별할 결 潔=맑을 결, 정결할 결, 조촐할 결 玦=옥패 결, 활 깍지 결 結=맺을 결, 마칠 결, 나중 결, 몫 결 缺=이지러질 결, 번개 번쩍거릴 결, 깨어질 결, 이 빠질 결 觖=서운할 결, 들쳐낼 결, 바랄 결 訣=이별할 결, 열결할 결, 사례할 결, 비결 결 闋=쉴 결, 다할 결, 풍류 마칠 결, 문 닫을 결 [겸] 傔=겸종 겸 兼=겸할 겸, 아우를 겸, 둘 얻을 겸, 모을 겸 嗛=부족히 여길 겸, 겸손 겸, 입에 밥 물고 있을 겸 岒=산 작고 높을 겸 慊=앙심먹을 겸, 불만족하게 생각할 겸, 싫을 겸 拑=자갈 먹일 겸 歉=흉년들 겸, 적을 겸, 나쁠 겸 箝=재갈 겸, 족집개 겸, 목 잠글 겸 縑=합사비단 겸 蒹=갈대 겸 謙=사양할 겸, 겸손할 겸, 괘 이름 겸 鉗=목사슬 겸, 세력으로써 남을 누를 겸, 입 다물 겸 鎌=낫 겸 黚=얕은 금향빛 겸 鼸=두더쥐 겸 [겹] 侠=俠의 俗字 俠=아오를 겹 唊=망녕되이 말할 겹 郟=그을 이름 겹 [경] 京=서울 경 亰=서울 경 俓=徑과 同字 倞=굳셀 경 傾=기울 경 儆=경계할 경 冂=먼데 경 冏=빛날 경 剄=목 벨 경 剠=鯨과 同字 勁=굳셀 경 勍=셀 경 卿=벼슬 경 哽=목멜 경 囧=冏과 同字 坰=들 경 境=지경 경 庚=일곱째 천간 경 径=통할 경 徑=지름길 경 惸=근심할 경 慶=경사 경 憬=깨달을 경 憼=공경할 경 扃=빗장 경 擎=들 경 敬=공경할 경 景=별 경 暻=밝을 경 更=고칠 경 梗=대개 경 檠=도지개 경 涇=통할 경 炅=빛날 경 烱=빛날 경 焭=근싱할 경 煢=외로울 경 熲=빛날 경 璟=옥 빛 경 璥=경옥 경 瓊=옥 경 畊=耕의 古字 痙=심줄 땅길 경 硬=굳을 경 磬=경쇠 경 竟=다할 경 競=겨룰 경 竸=競과 同字 絅=끌어 쥘 경 経=날 경 綆=두레박줄 경 經=날 경 罄=빌 경 耕=밭갈 경 耿=빛날 경 脛=정강이 경 莖=줄기 경 褧=홑옷 경 謦=기침 경 警=경계할 경 軽=천할 경 輕=가벼울 경 逕=소로 경 鏡=거울 경 頃=밭 넓이 단위 경 頚=頸의 俗字 頸=목 경 顈=홑옷 경 駉=목장 경 驚=놀랄 경 鯁=생선뼈 경 鯨=고래 경 黥=묵형할 경 [계] 乩=점칠 계 係=걸릴 계 启=啓와 同字 啓=열 계 啟=인도할 계 堦=섬돌 계 堺=界와 同字 契=맺을 계 季=끝 계 屆=이를 계 悸=두근거를 계 戒=경계할 계 挈=끊을 계 桂=계수나무 계 械=형틀 계 棨=창 계 溪=시내 계 烓=화덕 계 界=지경 계 瘈=미칠 계 癸=열째 천간 계 磎=谿와 同字 禊=계제 계 稽=머무를 계 筓=비녀 계 系=이을 계 継=繼의 俗字 綮=발 고운 비단 계 縘=繫와 同字 繋= 繫=맬 계, 맺을 계 繼=이을 계 罽=물고기 그물 계 葪=베일 계, 삽주 계 薊=삽주 계 計=꾀 계 誡=경계할 계 谿=시내 계 階=섬돌 계 雞=닭 계 髻=상투 계 鳮=鷄의 俗字 鷄=닭 계 [고] 估=값 고 侤=생각할 고 凅=얼어붙을 고 刳=가를 고 古=옛 고 叩=두드릴 고 吿=告와 同字 告=알릴 고 呱=울 고 咎=허물 고 咕=투덜거릴 고 嚳=고할 고 固=굳을 고 塙=단단할 고 姑=시어미 고 孤=외로울 고 尻=꽁무니 고 庫=곳집 고 拷=가질 고 攷=考의 古字 故=옛 고 敲=두드릴 고 暠=흴 고 杲=밝을 고 枯=마를 고 栲=북나무 고 槀=마를 고 槁=槀와 同字 槹=두레박 고 櫜=활집 고 沽=팔 고 牯=암소 고 痼=고질 고 皋=못 고 皐=부르는 소리 고 盬=염지 고 睾=못 고 瞽=소경 고 稁=稿와 同字 稿=볏집 고 箍=테 고 篙=상앗대 고 糕=떡 고 罟=그물 고 羔=새끼양 고 羖=검은 암양 고 翱= 翺=날 고 考=상고할 고 股=넓적다리 고 胯=사타구니 고 脵= 膏=살찔 고 苦=쓸 고 苽=줄 고 菰=향초 고 藁=마른 나무 고 蠱=독 고 袴=바지 고 觚=술잔 고 詁=주석 고 誥=고할 고 賈=장사 고 辜=허물 고 郜=나라이름 고 酤=계명주 고 鈷=다리미 고 錮=땜질할 고 雇=새이름 고 靠=기댈 고 顧=돌아볼 고 骷=해골 고 高=높을 고 髙=高와 同字 鯝=참마자 고 鴣=자고 고 鷱=새이름 고 鼓=북 고 賈=장사 고 [곡] 吿=告과 同字 告=청할 곡 哭=울 곡 斛=휘 곡 曲=굽을 곡 梏=쇠고랑 곡 榖=穀의 俗字 槲=떡갈나무 곡 玨=珏의 古字 珏=쌍옥 곡 穀=곡식 곡 縠=주름 비단 곡 觳=뿔잔 곡 谷=골짜기 곡 轂=바퀴 곡 鵠=고니 곡 [곤] 丨=뚫을 곤 困=괴로울 곤 坤=땅 곤 堃=따 곤 崐=곤륜산 곤 崑=산이름 곤 悃=정성 곤 捆=두드릴 곤 昆=형 곤 梱=문지방 곤 棍=몽둥이 곤 混=서쪽 오랑캐 곤 滚=滾과 同字 滾=흐를 곤 琨=옥돌 곤 緄=띠 곤 衮=袞과 同字 袞=곤룡포 곤 裍=걷어 올릴 곤 褌=잠방이 곤 錕=붉은 쇠 곤 閫=문지방 곤 髡=머리 깍을 곤 鯀=물고기 이름 곤 鯤=준마 이름 곤 鵾=댓닭 곤 鶤=댓닭 곤 齫=이 빠질 곤 [골] 搰=팔 골 榾=등걸 골 汨=빠질 골 滑=어지러울 골 矻=돌 골 骨=뼈 골 鶻=송골매 골 滑=어지러울 골 [공] 供=이바지할 공 倥=어리석을 공 公=공변될 공 共=함께 공 功=공 공 卭=병될 공 孔=구멍 공 崆=산이름 공 工=장인 공 恐=두려울 공 恭=공손할 공 悾=정성 공 拱=두 손 맞잡을 공 控=당길 공 攻=칠 공 栱=두공 공 槓=지렛대 공 珙=큰 옥 공 空=빌 공 笻=대이름 공 箜=공후 공 紅=상복 이름 공 蚣=지네 공 蛩=메뚜기 공 蛬=귀뚜라미 공 貢=바칠 공 贛=줄 공 跫=발자국 소리 공 邛=언덕 공 釭=굴대 공 銎=도끼 구멍 공 鞏=묶을 공 龔=공손할 공 [곶] 串=땅이름 곶 廤=곳 곶 串=곶 곶 [과] 侉=자랑할 과 剮=바를 과 堝=도가니 과 夥=많을 과 夸=자랑할 과 媧=사람 이름 과 寡=적을 과 戈=창 과 撾=칠 과 果=실과 과 猓=긴 꼬리 원숭이 과 瓜=오이 과 科=과정 과 稞=보리 과 窠=보금자리 과 胯=사타구니 과 菓=과일 과 蝌=올챙이 과 裹=쌀 과 誇=자랑할 과 課=매길 과 跨=타넘을 과 踝=복사뼈 과 過=지날 과 銙=대구 과 鍋=노구솥 과 顆=낟알 과 騍=암말 과 髁=넓적다리뼈 과 [곽] 廓=둘레 곽 椁=관 곽 槨=덧널 곽 癨=곽란 곽 藿=콩잎 곽 躩=바삐 갈 곽 郭=성곽 곽 霍=빠를 곽 鞹=무두질한 가죽 곽 [관] 丱=쌍상투 관 串=익힐 관 倌=수레 모는 사람 관 冠=갓 관 卝=丱과 同字 官=벼슬 관 寛=용서할 관 寬=너그러울 관 慣=버릇 관 棺=널 관 款=정성 관 涫=끓을 관 灌=물 댈 관 爟=봉화 관 琯=옥피리 관 瓘=옥 이름 관 盥=대야 관 祼=강신제 관 窾=빌 관 筦=피리 관 管=피리 관 綰=얽을 관 綸=관건 관 罐=두레박 관 舘=객사 관 莞=골풀 관 菅=골풀 관 覌=볼 관 観=볼 관 觀=볼 관 貫=꿸 관 輨=줏대 관 錧=비녀장 관 鑵=두레박 관 関=쇠사슬 관 闗=빗장 관 關=빗장 관 雚=황새 관 顴=광대뼈 관 館=객사 관 髖=허리뼈 관 鸛=황새 관 館=객사 관 [괄] 佸=힘 쓸 괄 刮=깍을 괄 劀=궂은 살을 잘라낼 괄 恝=걱정 없을 괄 括=묶을 괄 栝=노송나무 괄 檜=전나무 괄, 나라이름 괄 活=물 소리 괄 筈=하눌타리 괄 聒=떠들석할 괄 适=빠를 괄 颳=모진 바람 괄 髺=머리 묶을 괄 鬠=결발할 괄 鴰=재두루미 괄 [광] 侊=성한 모양 광 俇=허둥지둥할 광 光=빛 광 劻=급할 광 匡=바룰 광 壙=광 광 広=廣의 略字 廣=넓을 광 恇=겁낼 광 拡=擴의 略字 擴=넓힐 광 曠=밝을 광 桄=광랑나무 광 框=문테 광 洸=물 용솟음할 광 炚=햇빚 뜨거울 광 爌=불 빛 환할 광 狂=미질 광 獷=사나울 광 珖=옥피리 광 磺=쇳돌 광 礦=쇳돌 광 筐=광주리 광 絖=솜 광 纊=솜 광 胱=오줌통 광 茪=초결명 광 誆=속일 광 誑=속일 광 鄺=성 광 鉱=鑛의 俗字 鑛=쇳돌 광 [괘] 卦=걸 괘 叏=나누어 가를 괘 咼=입 비뚤어질 괘 挂=그림족자 괘 掛=걸 괘 罣=걸 괘 罫=줄 괘 詿=그르칠 괘 [괴] 乖=어그러질 괴 会=會의 略字 傀=클 괴 儈=거간군 괴 凷=흙덩이 괴 劊= 喟=한숨쉴 괴 嘳=한숨쉴 괴 塊=흙덩이 괴 壞=무너질 괴 媿=창피줄 괴 廥=여물광 괴 怪=기이할 괴 恠=怪의 俗字 愧=부끄러워할 괴 拐=속일 괴 會=그림 괴 槐=홰나무 괴 瑰=슬이름 괴 璝=옥돌 괴 蒯=황모 괴 襘=띠매듭 괴 魁=으뜸 괴 [괵] 剨=자끈할 괵 嘓=귀찮을 괵 馘=벨 괵 [굉] 卝=丱과 同字 厷=둥글 굉 宏=클 굉 浤=용솟음할 굉 紘=갓끈 굉 纮=넓을 굉 肱=팔뚝 굉 觥=뿔잔 굉 訇=큰 소리 굉 轟=울릴 굉 鍠=종고 소리 굉 锽=쇠북소리 굉 閎=마을문 굉 [교] 丂=교묘할 교 交=사귈 교 佼=예쁠 교 僑=높을 교 儌=갈 교 咬=새소리 교 啋=움직일 교 喬=높을 교 嘂=크게 부르짖을 교 嘄=부르짖을 교 嘐=닭 울 교 嘺=입 비뚤러질 교 噭=부르짖을 교 嚙=깨물 교 姣=예쁠 교 嬌=아리따울 교 嶠=뾰족하게 높을 교 巧=공교할 교 憍=교만할 교 招=들 교 撟=들 교 撹=攪의 略字 攪=어지러울 교 敎=가르침 교 教=敎의 俗字 敲=두드릴 교 晈=달 밝을 교 暞=밝을 교 校=학교 교 榷=외나무 다리 교 橋=다리 교 狡=교활할 교 皎=달빛 교 矯=바로잡을 교 磽=메마른 땅 교 糾=맺힐 교 絞=목맬 교 翹=꼬리 긴 깃털 교 膠=아교 교 蕎=메밀 교 蛟=교룡 교 覚=覺의 略字 覺=꿈 깰 교 跤=발화목 교 蹺=발돋움할 교 較=견줄 교 轎=가마 교 郊=성 밖 교 鞽=신 교 餃=경단 교 驕=교만할 교 鮫=상어 교 [구] 丘=언덕 구 丠=丘와 同字 丩=넝쿨 구 久=오랠 구 乆=久의 俗字 九=아홉 구 仇=짝 구 佉=나라 이름 구 佝=꼽추 구 俅=공손할 구 俱=함께 구 倃=훼방할 구 倶=俱와 同字 傴=구부릴 구 具=갖출 구 冓=재목 어긋매겨 쌓을 구 劬=수고로울 구 劶=부지런할 구 勼=모을 구 勾=글귀절 구 匓=배불러 싫을 구 匛=관 구, 널 구 匶=柩의 古字 区=區의 略字 區=감출 구 厩=마구 구 厹=세모창 구 口=입 구 句=글귀절 구 叴=소리 높일 구 呴=숨을 내쉴 구 咎=허물 구 嘔=토할 구 坵=丘의 俗字 坸=垢와 同字 垢=때 구, 더러울 구 夻=대구 구 姤=만날 구 媾=겹사돈 구 嫗=할미 구 寇=도둑 구 屨=삼으로 짠 신 구 岣=산이름 구 嶇=산험준할 구 廄=廐와 同字 廏=廐와 同字 廐=마구간 구 彀=활 잔뜩 당길 구 懼=두려워할 구 戵=창 구 扣=두드릴 구 拒=진이름 구 拘=잡을 구 捄=흙파올릴 구 搆=얽어맬 구 摳=치마걷어들 구 救=구원할 구 旧=舊의 略字 昫=해돋아 따뜻할 구 枸=구기자 구 柩=관 구 柾=관 구, 널 구 榘=곡척 구 構=집세울 구 歐=토할 구 毆=때릴 구 毬=제기 구 求=찾을 구 溝=개천 구 漚=물거품 구 灸=지질 구 狗=개 구 玖=옥 다음가는 돌 구 球=옥경쇠 구 璆=옥경쇠 구 甌=사발 구 疚=오랜 병 구 痀=곱사등이 구 癯=여윌 구 瞿=놀라서 볼 구 矩=곡척 구 穀=녹봉 구 究=궁리할 구 窛=노략질할 구 窶=가난하여 예절없을 구 篝=불덮개 구 糗=마른밥가루 구 絿=급박할 구 耇=명길 구 耈=耇와 同字 耉=늙을 구 胊=포(얇게 저미어서 말린 고기) 구 臼=절구 구 舅=외삼촌 구 舊=옛 구 苟=진실로 구 蒟=구장 구 蚯=지렁이 구 衢=네거리 구 裘=갓옷 구 覯=만나볼 구 詬=꾸짖을 구 謳=읊조릴 구 購=살(구입할) 구 軀=몸 구 逑=짝 구 遘=만날 구 邱=언덕 구 釦=그릇에 금테 두를 구 鉤=갈고랑쇠 구 銶=끌 구 鞫= 鞲=팔찌 구 韝=깍지 구 韭=부추 구 韮=韭와 同字 颶=사방풍 구 駆=驅의 略字 駈=驅와 同字 駒=망아지 구 驅=몰 구 鬮=제비뽑을 구 鳩=비둘기 구 鷇=새 새끼 구 鷗=갈매기 구 鸜=구관조 구 鼽=감기들어 코 막힐 구 龜=나라 이름 구 [국] 侷=죄어칠 국 匊=움켜 뜰 국 囗=國의 古字 囶=國의 古字 国=國의 略字 圀=國의 古字 國=나라 국 局=부분 국 掬=두 손으로 움킬 국 菊=국화 국 跼=구부릴 국 鞠=기를 국 麯=麴과 同字 麴=누룩 국 麹=누룩 국 [군] 僒=구부릴 군 君=임금 군 捃=주울 군 桾=고욤나무 군 皸=얼어터질 군 窘=군색할 군 群=무리 군 裙=치마 군 軍=군사 군 郡=고을 군 麇=무리 군 [굴] 倔=딱딱할 굴 厥=나라이름 굴 堀=굴뚝 굴 屈=굽을 굴 崛=산 높을 굴 掘=팔 굴 淈=흐릴 굴 窟=구멍 굴 詘=굽을 굴 [궁] 匑=공손할 궁 宫=宮의 略字 宮=굴궐 궁 弓=활 궁 穹=높을 궁 窮=다할 궁 芎=궁궁이 궁 躬=몸 궁 躳=躬의 本字 [권] 倦=게으를 권 券=엄쪽(어음을 쪼갠 한 쪽) 권 劵=게으를 권, 고달플 권, 수고로울 권 勌=倦과 同字 勧=勸의 略字 勸=권할 권 卷=굽을 권 圈=둥글 권 圏=圈과 同字 巻=卷의 俗字 惓=삼갈 권 拳=주먹 권 捲=거둘 권 棬=휘어만든 나무그릇 권 権=權의 俗字 權=권세 권 淃=물돌아 흐를 권 眷=돌아볼 권 睠=眷과 同字 綣=정다울 권 蜷=움추러질 권 鬈=수염좋을 권 [궐] 亅=갈고리 궐 厥=그 궐 掘=뚫을 궐 獗=도둑 일어날 궐 蕨=고사리 궐 蹶=우물벌레 궐 闕=대궐 궐 鱖=쏘가리 궐 [궤] 佹=포갤 궤 儿=어진 사람 궤 几=안석 궤 劂= 匭=갑 궤 匱=갑 궤 厬=목마를 궤 帰=歸의 俗字 憒=심란할 궤 撅=옷걷을 궤 机=느티나무 궤 樻=가마테나무 궤 櫃=상자 궤 歸=먹일 궤 氿=물가 궤 潰=흩어질 궤 簋=대제기 궤 繢=톱끝 궤 詭=속일 궤 跪=끓어앉을 궤 蹶=급히걸을 궤 軌=수레바퀴 사이 궤 闠=저자문 궤 餽=饋와 同字 饋=먹일 궤 鱖=쏘가리 궤 麂=큰고라니 궤 [귀] 亀=龜의 略字 劌=상할 귀 勾=句와 同字 句=글귀 귀 帰=歸의 俗字 晷=시각 귀 櫷=느티나무 귀 歸=돌아올 귀 貴=높을 귀 鬼=귀신 귀 龜=거북 귀 句=글귀 귀 龜=거북 귀 [규] 九=모을 규 乣=糺의 譌字 刲=찌를 규 叫=부를 규 呌=부르짖을 규 圭=서옥 규 奎=별 규 嫢=가는 허리 규 嬀=성 규 巋=높고 험준할 규 揆=헤아릴 규 暌=해질 규 楏=호미자루 규 槻=물푸레나무 규 樛=나무가지 휘어질 규 潙=물이름 규 珪=圭와 同字 睽=어그러질 규 硅=유리만드는 흙 규 窺=엿볼 규 竅=구멍 규 糺=거둘 규 糾=삼합노 규 葵=해바라기 규 虬=虯와 同字 虯=뿔없는 용 규 規=그림쇠 규 赳=헌걸찰 규 跬=한발자국 규 逵=구거리 규 邽=고을이름 규 閨=색시 규 闚=갸웃이 볼 규 頃=반걸음 규 頍=고깔비녀 규 馗=아홉거리 규 [균] 亀=龜의 略字 勻=고를 균 匀=고를 균 囷=둥근곳집 균 均=고를 균 畇=밭개간할 균 筠=대껍질 균 菌=버섯 균 鈞=서른 근 균 麇=노루 균 麏=고라니 균 龜=(피부가)틀 균 龜=(피부가)틀 균 [귤] 橘=귤나무 귤 [극] 丮=잡을 극 亟=빠를 극 克=이길 극 剋=깍일 극 劇=심할 극 勀=이길 극 可=오랑캐 임금 이름 극 尅=剋과 同字 屐=나막신 극 戟=갈래진 창 극 棘=가시나무 극 極=가운데 극 郄=隙과 同字 郤=틈 극 隙=틈 극 革=위독해질 극 [근] 僅=겨우 근 劤=힘많을 근 勤=부지런할 근 卺=합환주잔 근 厪=적을 근 堇=노란진흙 근 墐=진흙 근 巹=받들 근 廑=작은집 근 懃=은근할 근 斤=근 근 根=뿌리 근 槿=무궁화 근 漌=맑을 근 瑾=붉은옥 근 矜=창자루 근 筋=힘줄 근 芹=미나리 근 菫=오랑캐 꽃 근 覲=뵈올 근 觔=筋과 同字 謹=삼갈 근 跟=발두꿈치 근 近=가까울 근 釿=대패 근 靳=아낄 근 饉=주릴 근 [글] 契=부족 이름 글 契=부족 이름 글 [금] 今=이제 금 僸=우러를 금 凚=쌀쌀하게 추울 금 厼= 唫=입 다물 금 噤=입 다물 금 妗=외숙모 금 嵚=산 솟을 금 嶔=높고 험할 금 擒=사로잡을 금 昑=밝을 금 檎=능금나무 금 琴=거문고 금 禁=금할 금 禽=날짐승 금 笒=첨대 금 芩=풀 이름 금 衾=이불 금 衿=옷깃 금 襟=옷깃 금 金=쇠 금 錦=비단 금 黅=누른 빛 금 黔=귀신 이름 금 金=성 금 [급] 伋=속일 급 及=미칠 급 圾=위태할 급 岌=높을 급 急=급할 급 扱=미칠 급 汲=길을 급 皀=고소할 급 礏=산 높은 모양 급 笈=책상자 급 級=등급 급 給=넉넉할 급 芨=말오줌나무 급 [긍] 亙=뻗칠 긍 兢=삼갈 긍 恒=시위 긍, 두루할 긍 殑=까무라칠 긍 矜=불쌍히 여길 긍 肯=옳이 여길 긍 鹶=짜고 쓸 긍 [기] 丌=책상 기 乞=줄 기 亓=其의 古字 亟=자주 기 企=꾀할 기 伎=재주 기 俟=성씨 기 倚=기이할 기 倛=탈 기 僛=취하여 춤추는 모양 기 僟=삼갈 기 其=그 기 冀=바랄 기 刏=찌를 기 剞=새김칼 기 呮=도사리고 앉을 기 唭=듣지도 보지도 않을 기 嗜=즐길 기 嘰=쪽잘거릴 기 噐=그릇 기 器=그릇 기 圻=경기 기 基=터 기 埼=崎와 同字 墍=맥질할 기 夔=조심할 기 奇=기이할 기 妓=기생 기 寄=부칠 기 居=어조사 기 屺=민둥산 기 岐=갈림길 기 崎=험할 기 己=자기 기 幾=기미 기 庋=시렁 기 弃=棄의 古字 忌=꺼릴 기 忮=해칠 기 怾=산 이름 기 愭=공손할 기 技=재주 기 掎=끌 기 攲=기울기 기 旂=기 기 旗=기 기 既=旣의 訛字 旣=이미 기 暣=볕기운 기 暨= 曁=및 기 朞=돌 기 期=기약할 기 杞=나무 이름 기 枳=해할 기, 사타구니 기 棄=버릴 기 棊=棋와 同字 棋=바둑 기 機=틀 기 欺=속일 기 歧=岐와 同字 気=氣의 略字 氣=기운 기 汽=김 기 沂=물 이름 기 淇=강 이름 기 炁=기운 기 猉= 玘=패옥 기 琦=옥 이름 기 琪=옥 기 璂=피변 꾸미개 기 璣=구슬 기 畸=뙈기 밭 기 畿=경기 기 碁=棋와 同字 磯=물가 기 示=땅 귀신 기 祁=성할 기 祇=토지의 신 기 祈=빌 기 祺=복 기 禨=조짐 기 箕=키 기 紀=벼리 기 綥=비단 쑥색 기 綦=연두빛 비단 기 綺=비단 기 羇=나그네 기 羈=굴레 기 耆=늙은이 기 耭=갈 기 肌=살 기 肵=적대 기 芪=단너삼 기 芰=세발 마름 기 蘄=풀 이름 기 虁=夔와 同字 蜝=방계 기 蟣=서캐 기 覉=구속할 기, 말 굴레 기 覬=바랄 기 記=기록할 기 譏=나무랄 기 豈=어찌 기 起=일어날 기 跂=육발 기 跽=꿇어앉을 기 錡=솥 기 錤=호미 기 锜=세발 가마 기 隑=사닥다리 기 頎=헌걸찰 기 飢=주릴 기 饑=주릴 기 騎=말탈 기 騏=털총이 기 驥=천리마 기 鬐=갈기 기 鰭=지느러미 기 麒=기린 기 黖=물건 생겨날 기 [긴] 緊=굳게 얽힐 긴 [길] 佶=건장할 길 吉=길할 길 咭=웃는 모양 길 姞=성 길 拮=일할 길 桔=도라지 길 蛣=장구벌레 길 鮚=대합 길 [김] 金=사람의 성 김 [끋] 印= [끽] 喫=마실 끽 [나] 儺=역귀 쫓을 나 哪=연귀 쫓는 소리 나 奈=어찌 나 娜=아리따울 나 懦=나약할 나 拏=붙잡을 나 拿=붙잡을 나 挐=붙잡을 나 挪=옮길 나 梛=나무 이름 나 糥=糯와 同字 糯=찰벼 나 那=어찌 나 難=성할 나, 탈 나 喇=나팔 라, 라마교 라 奈=어찌 나 懶=게으를 나 癩=약물 중독 나 羅=새 그물 나 蘿=소나무겨우살이 나 螺=소라 나 裸=벌거벗을 라, 털 없는 벌레 라 邏=돌 나 [낙] 格=막힐 락 諾=대답할 낙 樂=즐길 낙 洛=강 이름 낙 烙=지질 낙 珞=구슬 목걸이 낙 落=떨어질 낙 酪=타락 낙 駱=낙타 낙 [난] 偄=언약할 난 暖=따뜻할 난 煖=따뜻할 난 煗=터울 난 赧=얼굴 붉힐 난 難=어려울 난 餪=풀보기 잔치 난 亂=어지러울 난 卵=알 난 欄=난간 난 爛=문드러질 난 蘭=난초 난 鸞=난새 난 [날] 捏=이길 날 捺=누를 날 涅=앙금 흙 날 [남] 南=남녘 남 喃=재잘거릴 남 枏=녹나무 남 柟=枏의 俗字 楠=녹나무 남 湳=강 이름 남 男=사내 남 嵐=남기 남 濫=퍼질 남 藍=쪽 남 襤=누더기 남 [납] 內=들일 납 内=받아들일 납 納=바칠 납 衲=기울 납 拉=꺽을 납 臘=납향 납 蠟=밀 납 [낭] 嚢= 囊=주머니 낭 娘=아가씨 낭 曩=접때 낭 廊=복도 낭 朗=밝을 낭 浪=물결 낭 狼=이리 낭 郎=사나이 낭 [내] 乃=이에 내 內=안 내 内= 匂=향내 내 奈=어찌 내 奶=젖 내 嬭=젖 내 廼=迺의 俗字 柰=능금나무 내 耐=견딜 내 能=세 발 자라 내 迺=이에 내 鼐=가마솥 내 來=올 내 [냉] 冷=차가울 냉 [녀] 女=계집 녀 挐=이끌 녀 [녁] 惄=마음 졸일 녁 [년] 年=해 년 撚=비틀 년 碾=맷돌 년 秊=年의 本字 [녈] 囓= 涅=죽을 녈 [념] 念=생각 념 恬=편안할 념 拈=집을 념 捻=비틀 념 [녑] 捻=비틀 녑 [녕] 佞=재주 녕 儜=고달플 녕 嚀=정녕할 녕 寕=문안할 녕 寗=편안할 녕 寜=차라리 녕 寧=편안할 녕 濘=진흙 녕 甯=편안할 녕 [녜] 昵=아비사당 녜 [노] 努=힘쓸 노 呶=들랠 노 奴=종 노 孥=자식 노 峱=산이름 노 帑=처자식 노 弩=쇠뇌(여러 개의 화살이나 돌을 잇따라 쏘게 된 큰 활) 노 怒=성낼 노 猱=못할 노 瑙=마노 노 笯=새장 노 臑=팔마디 노 駑=둔할 노 勞=수고할 노 擄=사로잡을 노 櫓=큰 방패 노 爐=화로 노 盧=밥그릇 노 老=늙을 노 蘆=갈대 노 虜=포로 노 路=길 노 露=이슬 노 魯=미련할 노 鷺=해오라기 노 [녹] 角=사람이름 녹 碌=푸른 빛 녹 祿=행복 녹 綠=초록빛 녹 菉=조개풀 녹 錄=기록할 녹 鹿=사슴 녹 [논] 淪=빠질 논 論=말할 논 [농] 儂=나 농 噥=달게 먹을 농 濃=짙을 농 穠=후한 제사 농 竜=두덕 롱 膿=고름 농 農=농사 농 醲=텁텁한 술 농 龐=통통하게 살질 농 壟=밭두둑 농 弄=희롱할 농 籠=대그릇 농 聾=귀머거리 농 [뇌] 匘=살찐 모양 뇌 悩=惱의 俗字 惱=괴로워할 뇌 脳=머리골 뇌 腦=머리 뇌 餒=굶길 뇌 牢=가축우리 뇌 磊=돌이 많이 쌓인 모양 뇌 賂=뇌물 뇌 雷=우뢰 뇌 [뇨] 啂= 嫋=날릴 뇨 嬲=샘낼 뇨 尿=오줌 뇨 淖=진흙 뇨 溺=우줌눌 뇨 磠=약돌 뇨 裊=끄을 뇨 鐃=작은 징 뇨 鬧=시끄러울 뇨 [누] 耨=김맬 누 壘=진 누 屢=(빛이 들어오는)창 누 樓=다락 누 淚=눈물 누 漏=샐 누 累=포갤 누 縷=자세할 누 陋=줍을 누 [눈] 嫩=언약할 눈 [눌] 吶=말 더듬을 눌 呐= 肭=물개 눌 訥=말 더듬거릴 눌 [뉴] 忸=익을 뉴 杻=옷 부드러울 뉴 紐=잡색비단 뉴 靵=단추 뉴 [뉵] 衄=코피 뉵 [늑] 勒=굴레 늑 肋=갈비대 늑 [늠] 凜=찰 늠 [능] 能=능할 능 凌=얼음 능 稜=모질 능 綾=무늬 놓은 비단 능 菱=마름 능 陵=능 능 [늦] 莻=늦을 늦 [니] 你=너 니 呢=소근거릴 니 尼=여승 니 怩=부끄러워할 니 柅=얼레자루 니 泥=막힐 니 祢=아비사당 니 禰=아비사당 니 膩=살찔 니 [닉] 匿=숨쉴 닉 溺=빠질 닉 [닐] 昵=가깝게 할 닐 暱=칠근할 닐 [다] 多=많을 다 爹=아비 다 茶=차풀 다 [단] 丹=붉을 단 亶=믿을 단 但=다만 단 剬=단정할 단 剸=끊을 단 勯=힘다할 단 匰=신주독 단 单=홀로 단 単=單의 略字 唌=참소리 단 單=홀로 단 団=團의 略字 團=둥글 단 壇=제터 단 彖=결단할 단 慱=근심할 단 担=원숭이 같은 짐승 단 断=어질 단 斷=끊을 단 旦=밝을 단 椴=자작나무 단 檀=향나무 단 段=층계 단 湍=여울 단 漙=이슬방울 맺을 단 澾= 癉=황달 단 短=짧을 단 端=끝 단 箪=밥그릇 단 簞=소쿠리 단 糰=경단 단 緞=비단 단 緣=단옷 단 縁= 耑=시초 단 胆=침비깨 단 腶=약포 단 蛋=오랑캐 이름 단 蜑=오랑캐 이름 단 袒=웃옷 벗을 단 踹=발꿈치 단 鄲=조나라 서울 단 鍛=쇠불릴 단 [달] 呾=마주 꾸짖을 달 噠=오랑캐 나라 이름 달 妲=계집의 이름 달 怛=깜짝 놀랄 달 撻=매질할 달 獺=수달 달 疸=황달 달 達=통달할 달 闥=대문 달 靼=다룬가죽 달 韃=칠 달 [담] 倓=편안할 담 儋=기운차고 날쌜해집 담 啖=씹을 담 啗=씹을 담 啿=많을 담 嘾=탐할 담 噇=먹는 모양 담 噉=씹을 담 嚪=먹을 담 坍=물이 언덕 찰 담 墰=목긴 술병 담 壜=술병 담 憺=고요할 담 擔=질 담 曇=날 흐릴 담 毯=담자리 담 淡=물모양 담 湛=즐거울 담 潭=깊을 담 澹=맑을 담 痰=가래 담 禫=담제 담 罎=壜과 同字 聃=노자이름 담 膽=쓸개 담 蕁=말 담 薝=치자나무 담 覃=미칠 담 談=말씀 담 譚=클 담 郯=나라이름 담 錟=긴 창 담 黮=검을 담 黵=문신할 담 [답] 匒=포갤 답 沓=거듭 답 畓=논 답 答=젖을 답 踏=떨어지는 소리 답 遝=가다가설 답 [당] 倘=혹시 당 儻=빼어날 당 党=黨의 略字 唐=당나라 당 堂=집 당 塘=연못 당 幢=기 당 当=當의 略字 戇=어리석을 당 搪=당동할 당 撞=두드릴 당 棠=아가위 당 檔=책상 당 溏=진수렁 당 瑭=옥이름 당 璫=귀고리 당 當=마땅할 당 瞠=바로볼 당 礑=밑바닥 당 糖=엿 당 螳=버마 재비 당 蟷=사마귀 당 襠=잠방이 당 讜=곧은 말 당 鏜=북방축소 당 鐺=죄인 자물쇠 당 餳=엿 당 餹=엿 당 黨=무리 당 [대] 代=대신할 대 儓=하인 대 坮=들 대 垈=터 대 大=클 대 对=對의 略字 対=對의 略字 對=마주볼 대 岱=태산 대 带=띠 대 帯= 帶=띠 대 待=기다릴 대 懟=원망할 대 戴=받들 대 擡=들 대 旲=햇빛 대 枱= 檯=등대 대 歹=거스릴 대 汏=씻을 대 玳=대모(바다거북) 대 碓=방아 대 臺=능 대 袋=자루 대 貸=빌릴 대 錞=창고달 대 鐓=창고달 대 隊=군대 대 黛=눈썹 그릴 대, 새파랄 대 [댁] 宅=집 댁 [덕] 徳=德의 略字 德=큰 덕 悳=德의 古字 惪= [도] 倒=넘어질 도 刀=칼 도 刂=刀와 同字 到=이를 도 匋=질그릇 도 叨=탐할 도 咷=아이 울음 끈질길 도 啕=수도할 도 嘟=칭찬할 도 図=圖의 俗字 圖=그림 도 圗=그림 도 堵=담 도 塗=바를 도 壔=작은 성 도 導=이끌 도 屠=잡을 도 島=섬 도 嶋=섬 도 度=법도 도 弢=활집 도 徒=무리 도 忉=근심할 도 悼=슬퍼할 도 慆=기뻐할 도 挑=돋을 도 掉=흔들 도 掏=가릴(선택)할 도 搗=찧을 도 搯=두드릴 도 擣=찧을 도 桃=복숭아 나무 도 棹=노 저을 도 檮=그루터기 도 櫂=상앗대 도 洮=달아날 도 涂=길 도 淘=일 도 渡=건널 도 滔=물 넘칠 도 濤=물결 도 燾=비칠 도 盜=도둑 도 睹=볼 도 祷= 禱=빌 도 稌=찰벼 도 稲=稻의 俗字 稻=벼 도 綢=쌀 도 纛=클 깃발 도 菟=고을 이름 도 萄=포도나무 도 覩=睹와 同字 賭=노름 도 跳=뛸 도 蹈=밟을 도 逃=달아날 도 途=길 도 道=길 도 都=도읍 도 酴=두번 빚은 술 도 鍍=도금할 도 闍=성문 층대 도 陶=질 그도 도 鞀=소고 도 鞱=너그러울 도 韜=활집 도 饕=탐할 도 鼗=땡땡이 도 都=도읍 도 [독] 匵=손궤 독 櫝=함 독 毒=독 독 涜= 瀆=도랑 독 牘=편지 독 犢=송아지 독 独=獨의 俗字 獨=홀로 독 督=감독할 독 禿=대머리 독 秃= 竺=두터울 독 篤=도타울 독 読=교활할 독 讀=읽을 독 黷=더러울 독 [돈] 伅=어두울 돈 囤=작을 곳집 돈 墩=돈대 돈 弴=그림 그린 활 돈 惇=두터울 돈 敦=도타울 돈 旽=늘 돋을 돈 暾=아침해 돈 沌=기름 덩어리 돈 潡=큰 물 돈 焞=귀갑 지지는 불 돈 燉=불 성할 돈 犜=돈피 돈 獤=돈피 돈 盾=사람이름 돈 豚=돼지 돈 躉=거룻배 돈 遁=달아날 돈 頓=조아릴 돈 [돌] 乭=이름 돌 凸=뾰족할 돌, 내밀 돌, 도도록할 돌 咄=꾸짖을 돌 堗=굴똑 돌 突=부딪칠 돌 [동] 仝=同의 古字 侗=무지할 동 倲=어리석을 동 偅=흐리멍텅할 동 働=궁닐 동 僮=아이 동 冬=겨울 동 凍=얼 동 動=움직일 동 同=같을 동 哃=클말할 동 垌=항아리 동 峒=산이름 동 彤=붉은 칠 동 憧=동경할 동 朣=달 뜰 동 東=동녘 동 桐=오동나무 동 棟=용마루 동 橦=나무이름 동 洞=마을 동 涷=마룻대 동 潼=물 이름 동 炵=불꽃 동 疼=아플 동 瞳=눈동자 동 童=아이 동 胴=큰 창자 동 艟=배 동 苳=겨울살이 동 茼=쏙갓 동 董=바로잡을 동 蕫=황모 동 蝀=무지개 동 銅=구리 동 錬=보습날 동 鮗=전어 동 鼕=북소리 동 [두] 亠=뜻 없는 토 두 侸=마를 두 兜=투구 두 吺=말 많을 두 土=뿌리 두 抖=퍼주거릴 두 斁=섞을 두 斗=말 두 杜=막을 두 枓=두공 두 痘=마마 두 竇=구멍 두 肚=밥통 두 脰=목 두 荳=콩 두 蚪=올챙이 두 蠹=좀 두 読= 讀=귀절 두 豆=콩 두 逗=머무를 두 陡=절벽 두 頭=머리 두 讀=구절 두 [둔] 吨=말 분명치 못할 둔 屯=진칠 둔 窀=광중 둔 臀=볼기 둔 芚=채소 이름 둔 迍=머뭇거릴 둔 遁=달아날 둔 遯=달아날 둔 鈍=무딜 둔 頓=조아릴 둔 [둘] 乧=음역자 둘 [득] 得=얻을 득 [등] 凳=걸상 등 墱=자드락길 등 嶝=고개 등 朩= 橙=등자나무 등 滕=물 솟을 등 灯=燈의 略字 燈=등잔 등 登=오를 등 磴=돌 비탈길 등 等=가지런할 등 籐=대 기구 등 縢=봉할 등 腾= 藤=등나무 등 螣=등사 등 謄=베낄 등 鄧=나라 이름 등 鐙=등자 등 騰=오를 등 [라] 亽= 倮=알몸 라 儸=간능할 라 喇=나팔 라 嗠= 囉=소리 읽힐 라 懶=게으를 라 曪=날 흐릴 라 瘰=연주창 라 癩=약물 중독 라 砢=돌 쌓일 라 羅=새그물 라 臝=벌거벗을 라 蘿=무 라 螺=소라 라 蠃=나나니벌 라 裸=벌거벗을 라 邏=순행할 라 鑼=징 라 陏=오이 라, 풀열매 라 騾=노새 라 驘=옹 솥 라 拏=붙잡을 라 [락] 樂=즐길 락 洛=강이름 락 烙=지질 락 犖=얼룩소 락 珞=구슬 목걸이 락 絡=헌솜 락 落=떨어질 락 諾=대답할 락 酪=진한 유즙 락 雒=수리부엉이 락 駱=낙타 락 樂=즐거울 락 諾=대답할 락 [란] 乱=어지러울 란 亂=어지러울 란 卵=알 란 囒=거짓말 할 란 圝=둥글 란 嬾=게으를 란 幱=내리다지 란 懶=게으를 란 攔=막을 란 欄=난간 란 欒=나무 이름 란 瀾=물결 란 灓=적실 란 爛=문드러질 란 蘭=난초 란 襴=난삼 란 鑾=방울 란 闌=가막을 란 鸞=난새 란 丹=붉을 란 [랄] 剌=어그러질 랄 喇=말굽히할 랄 埒=바자울 랄 辢=辣과 同字 辣=매울 랄 [람] 啉=술순배 람 嚂=먹을 람 婪=탐할 람 嵐=남기 람 惏=떨릴 람 擥=攬과 同字 攬=잡을 람 欖=감람나무 람 濫=퍼질 람 籃=바구니 람 纜=닻줄 람 藍=쪽 람 襤=누더기 람 覧=볼 람 覽=볼 람 [랍] 拉=꺽을 랍 臘=납향 랍 蝋= 蠟=밀 랍 鑞=땜납 랍 [랑] 廊=복도 랑 朗=밝을 랑 榔=나무 이름 랑 浪=물결 랑 狼=이리 랑 琅=옥 이름 랑 瑯=고을 이름 랑 硠=돌 부딪는 소라 랑 稂=강아지 풀 랑 莨=수크령 랑 蜋=사마귀 랑 螂=蜋과 同字 郎=남편 랑 郞=사나이 랑 閬=솟을 대문 랑 [래] 來=올 래 儽=게으를 래 勑=위로할 래 崍=산 이름 래 徠=올 래 淶=강 이름 래 莱=명아주 래 萊=명아주 래 騋=큰 말 래 黧=검을 래 [랭] 冷=찰 랭 [략] 剠=鯨과 同字 掠=노략질할 략 略=다스릴 략 畧=略과 同字 [량] 両=兩의 俗字 两=쌍 량 亮=밝을 량 俍=良과 同字 倆=재주 량 兩=두 량 凉=涼의 俗字 剠=鯨과 同字 喨=소리 맑을 량 悢=슬퍼할 량 掠=볼기칠 량 梁=푸조나무 량 椋=들보 량 樑=서늘할 량 涼=서늘할 량 粮=糧과 同字 粱=기장 량 糧=양식 량 良=좋을 량 諒=믿을 량 踉=뛸 량 輛=수레 량 量=헤아릴 량 魎=도깨비 량 [레] 螺= [려] 侣= 侶=짝 려 儢=맘에 하기 싫을 려 儷=짝 려 刕= 励=勵의 略字 勴=마음으로 도울 려 勵=힘쓸 려 厉=厲의 略字 厲=갈 려 吕= 呂=음률 려 唳=울 려 廬=오두막집 려 慮=생각할 려 戻=수레 옆문 려 戾=여그러질 려 攊= 旅=군사 려 梠=평고대 려 櫚=종려나무 려 濾=겨를 려 癘=창질 려 砺=礪의 略字 礪=거친 숫돌 려 糲=현미 려 膂=등골 뼈 려 臚=살갗 려 藜=나라 이름 려 蠡=좀먹을 려 蠣=굴 려 邌=천천히 걸을 려 鑢=줄 려 閭=이문 려 驢=나귀 려 驪=가라말 려 鱺=뱀장어 려 麗=고울 려 黎=검을 려 黧=검을 려 [력] 力=힘 력 厤=다스릴 력 嚦=소리 력 曆=책력 력 櫟=상수리나무 력 櫪=말구유 력 歷=지낼 력 瀝=거를 력 癧=연주창 력 礫=조약돌 력 躒=움직일 력 轢=삐걱거릴 력 轣=갈 력 酈=땅 이름 력 靂=벼락 력 [련] 僆=쌍둥이 련 嗹=길게 말할 련 孌=아름다울 련 怜=연리할 련 恋=戀의 俗字 憐=불쌍히 여길 련 戀=사모할 련 挒= 攣=걸릴 련 楝=멀구슬나무 련 湅=누일 련 漣=물놀이 련 煉=불릴 련 璉=호련 련 練=익힐 련 聫= 聮=연할 련 聯=잇달 련 臠=저민고기 련 蓮=연밥 련 輦=손수레 련 連=잇닿을 련 錬= 鍊=불릴 련 鏈=쇠사슬 련 零=조용히 오는 비 련 鰊=고기 이름 련 鰱=연어 련 零=조용히 오는 비 련 [렬] 冽=찰 렬 列=줄 렬 劣=못할 렬 咧=새소리 렬 哷=닭 우는 소리 렬 戻= 戾=어그러질 렬, 휘어질 렬 捩=비틀 렬 洌=맑을 렬 烈=세찰 렬 裂=찢을 렬 颲=사나운 바람 렬 [렴] 亷= 匲=경대 렴 匳=경대 렴 奩=화장 상자 렴 帘=주막기 렴 廉=청렴할 렴 斂=거둘 렴 殮=염할 렴 濂=내 이름 렴 瀲=넘칠 렴 磏=거친 숫돌 렴 簾=발 렴 [렵] 儠=풍신 좃을 렵 獵=사냥 렵 躐=밟을 렵 鬣=갈기 렵 [령] 令=명령 령, 시킬 령 伶=영리할 령, 악공 령, 광대 령 另=나눌 령, 다를 령, 헤어질 령 呤=속삭일 령 呬=왁자할 령 囹=옥 령 姈=계집 슬기로울 령 岭=산 이름 령 岺=재 령 嶺=재 령 怜=영리할 령 昤=날 빛 영롱할 령 欞=격자창 령 泠=깨우칠 령 灵=靈의 俗字 玲=옥이름 령 秢=벼 처음 익을 령 笭=도꼬마리 령 羚=영양 령 翎=깃 령 聆=들을 령 苓=도꼬마리 령 蛉=장자리 령 軨=사냥 수레 령 逞=굳셀 령 鈴=방울 령 零=조용히 오는 비 령 靈=신령 령 領=옷깃 령 鴒=할미새 령 鹷=나이 령 齡=나이 령 寧=편안할 령 [례] 例=법식 례 劙=가를 례 澧=강 이름 례 礼=禮의 古字 禮=예도 례 豊=禮의 古字 醴=단술 례 隷=隸와 同字 隸=붙을 례 鱧=가물치 례 礼=禮의 略字 [로] 労=勞의 略字 勞=일할 로 哰=말 알아듣지 못할 로 嚕=아까워할 로 嚧=웃을 로 壚=흑토 로 撈=잡을 로 擄=사로잡을 로 櫓=방패 로 滷=소금밭 로 潞=강 이름 로 瀘=강 이름 로 炉=爐의 略字 爐=화로 로 牢=우리 로 玈=검을 로 癆=종독 로 盧=밥그릇 로 窂=우리 로 老=늙은이 로 艪=艫와 同字 艫=뱃머리 로 蘆=갈대 로 虜=포로 로 賂=뇌물 줄 로 路=길 로 輅=수레 로 轤=고패 로 鐪=부레 로 鑪=화로 로 露=이슬 로 顱=머리뼈 로 髗=해골 로 魯=노둔할 로 鱸=농어 로 鷺=해오라기 로 鸕=가마우지 로 鹵=소금 로 怒=성냉 로 [록] 圥=버섯 록 彔=나무 깍을 록 淥=밭을 록 渌= 漉=거를 록 碌=돌 모양 록 祿=복 록 簏=대 상자 록 綠=초록빛 록 緑= 菉=조개풀 록 轆=도르래 록 錄=기록할 록 録=희학질할 록 騄=말이름 록 鹿=사슴 록 麓=신기슭 록 [론] 論=말할 론 [롱] 儱=건목칠 롱 哢=지저귈 롱 嚨=목구멍 롱 壟=언덕 롱 弄=희롱할 롱 攂=攏의 本字 攏=누를 롱 曨=어스레할 롱 朧=흐릿할 롱 礱=갈 롱 篭=籠과 同字 籠=대그릇 롱 聾=귀머거리 롱 蘢=개여뀌 롱 隴=고개 이름 롱 龍=언덕 롱 [뢰] 儡=영락할 뢰 瀨=여울 뢰 瀬=여울 뢰 牢=우리 뢰 磊=돌무더기 뢰 礌=돌 굴러내릴 뢰 礧=바위너설 뢰 籟=세 구멍 퉁소 뢰 纇=실 마디 뢰 罍=술독 뢰 耒=쟁기 뢰 蕾=꽃봉오리 뢰 誄=뇌사 뢰 賂=뇌물 줄 뢰 賚=줄 뢰 賴=힘 입을 뢰 酹=부을 뢰 雷=우뢰 뢰 頼=賴의 俗字 顂=덮을 뢰 [료] 了=마칠 료 僚=동료 료 嘹=울 료 嫽=외조모 료 寥=쓸쓸할 료 寮=벼슬아쳐 료 廖=공허할 료 撩=다스릴 료 料=되질할 료 暸=밝을 료 潦=큰 비 료 燎=화톳불 료 獠=밤사냥 료 療=병고칠 료 瞭=밝을 료 繚=감길 료 聊=귀 울 료 膋=발기름 료 蓼=여뀌 료 遼=멀 료 醪=막걸리 료 鐐=은 료 飂=높이 부는 바람 료 飉=바람 료 鬧=시끄러울 료 [룡] 瀧=비 올 룡 瓏=옥소리 룡 竜=龍의 古字 龍=용 룡 龒=龍의 古字 [루] 僂=구부릴 루 嘍=시끄러울 루 壘=진 루 婁=별 이름 루 屢=창 루 嶁=봉우리 루 慺=정성스러울 루 楼=樓의 俗字 樓=다락 루 涙= 淚=눈물 루 漏=샐 루 瘻=부스럼 루 累=묶을 루 縷=실 루 耬=씨 뿌리는 기구 루 蔞=쑥 루 螻=땅강아지 루 褸=남루할 루 鏤=새길 루 陋=줍을 루 髏=해굴 루 [뤼] 厽=흙을 쌓아서 담 쌓을 뤼 [류] 刘=劉의 略字 劉=죽일 류 嚠=瀏와 同字 旒=깃발 류 柳=버들 류 榴=석류나무 류 橊=榴의 本字 流=흐를 류 溜=방울져 떨어질 류 瀏=맑을 류 琉=유리 류 瑠=琉와 同字 留=머무를 류 瘤=혹 류 硫=유황 류 类=나눌 류 縲=포승 류 纍=갇힐 류 謬=그릇될 류 遛=머무를 류 鎏=급속 류 類=무리 류 鶹=올빼미 류 [륙] 僇=욕보일 륙 六=여섯 륙 剹=깎을 륙 勠=협력할 륙 戮=죽일 륙 陸=뭍 륙 [륜] 侖=둥글 륜 倫=인륜 륜 嗧=갤런 륜 圇=완전할 륜 崙=산 이름 륜 掄=가릴 륜 淪=물놀이 륜 潤=젖을 륜 綸=낚싯줄 륜 輪=바퀴 륜 閏=윤달 륜 [률] 嵂=가파를 률 律=법 률 慄=두려워할 률 栗=밤나무 률 溧=강 이름 률 率=거느릴 률 篥=대 이름 률 率=헤아릴 률 [륭] 癃=느른할 륭 窿=활꼴 륭 隆=클 륭 [륵] 仂=나머지 륵 勒=굴레 륵 嘞=어조사 륵 泐=돌 갈라질 륵 肋=갈비 륵 鰳=준치 륵 [름] 凛=찰 름 凜=찰 름 廩=곳집 름 澟=서늘할 름 [릉] 倰=속일 릉 凌=능가할 릉 楞=모 릉 稜=모 릉 綾=비단 릉 菱=蔆과 同字 蔆=마름 릉 陵=큰 언덕 릉 鯪=천산갑 릉 [리] 俐=똑똑할 리 俚=속될 리 刕=벨 리 利=날카로울 리 剓=뱃길 리 剺=벗길 리 劙=가를 리 厘=釐의 俗字 吏=벼슬아치 리 哩=어조사 리 唎=가는 소리 리 嫠=과부 리 履=신 리 悧=영리할 리 李=오얏 리 梨=태나무 리 浬=해리 리 涖=다다를 리 漓=스며들 리 犁=얼룩소 리 狸=貍와 同字 理=다스릴 리 璃=유리 리 痢=설사 리 离=산신 리 籬=울타리 리 罹=근심 리 羸=여윌 리 莅=다다를 리 莉=말리 리 蒞=莅의 俗字 蜊=참조개 리 螭=교륭 리 裏=속 리 裡=裏와 同字 貍=삵 리 邐=이어질 리 里=마을 리 釐=다스릴 리 離=떼 놓을 리 魑=도깨비 리 鯉=잉어 리 鱺=뱀장어 리 麗=고울 리 黐=끈끈이 리 黧=검을 리 異=다를 리 [린] 厸=鄰의 古字 吝=아낄 린 嶙=가파를 린 悋=아낄 린 潾=맑을 린 燐=도깨비불 린 獜=튼튼할 린 璘=옥빛 린 磷=돌 을 틈물이 흐르는 모양 린 粦=도깨비 불 린 粼=물 맑을 린 繗=이을 린 藺=골풀 린 躙=짓밟을 린 躪=짓밟을 린 轔=수레 소리 린 鄰=이웃 린 鏻=굳셀 린 隣=鄰의 俗字 驎=워라말 린 鱗=비늘 린 麟=기린 린 [림] 林=수풀 림 淋=물뿌릴 림 琳=아름다운 옥 림 痳=임질 림 臨=임할 림 霖=장마 림 [립] 岦=산 우뚝할 립 砬=돌 소리 립 立=설 립 笠=우리 립 粒=알 립 [마] 亇=망치 마 亍=땅 이름 마 傌=욕할 마 劘=깍을 마 哶=양울 마 嗎=꾸짖을 마 嘛=나마 마 媽=어미 마 摩=갈 마 瑪=마노 마 痲=저릴 마 碼=마노 마 磨=갈 마 螞=말거머리 마 蟇=개구리 마 馬=말 마 魔=마귀 마 麻=삼 마 麼=작을 마 麽=잘 마 麿=갈 마 [막] 嗼=고요할 막 寞=쓸쓸할 막 幕=막 막 漠=사막 막 瞙=눈 흐릴 막 膜=막 막 莫=없을 막 貌=모뜰 막 邈=멀 막 鏌=칼 이름 막 [만] 万=일만 만 僈=얕볼 만 卍=만자 만 卐= 墁=흙손 만 娩=해산할 만 嫚=업신여길 만 巒=뫼 만 幔=막 만 彎=굽을 만 慢=게으를 만 挽=당길 만 晚= 晩=저물 만 曼=끌 만 滿=찰 만 漫=질펀할 만 灣=물굽이 만 瞞=속일 만 縵=무늬 없는 비단 만 萬=일만 만 蔓=덩굴 만 蛮=蠻의 略字 蠻=오랑캐 만 謾=속일 만 蹣=비틀거릴 만 輓=끌 만 鏋=금 만 鏝=흙손 만 鞔=신울 만 饅=만두 만 鬘=머리장식 만 鰻=뱀장어 만 [말] 唜=끌 말 帕=머리띠 말 抹=바랄 말 末=끝 말 沫=거품 말 秣=꼴 말 茉=말리 말 襪=버선 말 靺=버선 말 [망] 亡=망할 망 亾= 兦=없을 망 妄=허망할 망 孟=맹랑할 망 忘=잊을 망 忙=바쁠 망 惘=멍할 망 望=바랄 망 汒=황급할 망 漭=넓을 망 網=그물 망 罔=그물 망 芒=까끄라기 망 茫=아득할 망 莽=우거질 망 莾=마디 짧은 대 망 蟒=이무기 망 輞=바퀴테 망 邙=산 이름 망 魍=도깨비 망 [매] 勱=힘쓸 매 呅=웃을 매 呆=어리석을 매 嚜=거짓말할 매 埋=묻을 매 売=賣의 略字 妹=누이 매 媒=중매 매 寐=잠잘 매 昧=새벽 매 枚=줄기 매 某=매화나무 매 梅=매화나무 매 楳=梅의 古字 毎= 每=매양 매 沬=지명 매 煤=그을음 매 玫=매괴 매 眛=어두울 매 罵=욕할 매 苺=딸기 매 莓=나무딸기 매 買=살 매 賣=팔 매 邁=갈 매 酶=술밑 매 霉=매우 매 霾=흙비 올 매 魅=도깨비 매 [맥] 百=힘쓸 맥 脈=맥 맥 脉=脈의 古字 貃=오랑캐 맥 貊=북방 종족 맥 貘=짐승 이름 맥 陌=두렁 맥 驀=말탈 맥 麥=보리 맥 麦=麥의 俗字 [맹] 孟=맏 맹 氓=백성 맹 猛=사나울 맹 盟=맹세할 맹 盲=소경 맹 萌=싹 맹 [먀] 乜=사팔 뜨기 먀 [멋] 矃= [멍] 儚= 甍= 甿= 虻= [며] 旀=하며 며 [멱] 冖=덮을 멱 冪=덮을 멱 幎=덮을 멱 汨=물이름 멱 覓=찾을 멱 [면] 丏=가릴 면 俛=힘쓸 면 偭=향할 면 免=면할 면 冕=면류관 면 勉=힘쓸 면 棉=목화 면 沔=물 흐를 면 湎=빠질 면 眄=애꾸눈 면 眠=잠잘 면 瞑=눈 감을 면 糆=麪과 同字 綿=이어질 면 緜=햇솜 면 緬=가는 실 면 面=낯 면 麪=밀가루 면 麵=麪과 同字 麺= [멸] 滅=멸망할 멸 篾=대 껍질 멸 蔑=업신여길 멸 衊=모독할 멸 [명] 冥=어두울 명 名=이름 명 命=목숨 명 明=밝을 명 暝=어두울 명 椧=홈 통 명 洺=강 이름 명 溟=어두울 명 皿=그릇 명 瞑=눈 감을 명 茗=차 싹 명 蓂=명협 명 螟=마디충 명 酩=술 취할 명 銘=새길 명 鳴=울 명 [몌] 袂=소매 몌 [모] 侔=가지런 할 모 侮=업신여길 모 冃=어린이 머리 건 모 冐=冒의 俗字 冒=가릴 모 募=모을 모 姆=여스승 모 姥=할미 모 媢=강새암 할 모 嫫=예쁠 모 帽=모자 모 恈=탐할 모 慕=그리워할 모 摸=찾을 모 摹=베낄 모 旄=깃대 장식 모 暮=저물 모 木=나무에 서화를 새길 모, 목각활자 모 某=아무 모 模=법 모 母=어미 모 毛=털 모 牟=소 우는 소리 모 牡=수컷 모 瑁=서옥 모 皃=貌와 同字 眊=눈 흐릴 모 眸=눈동자 모 矛=창 모 粍=밀리메트로 모 糢=模의 俗字 耄=늙은이 모 耗=줄 모 膜=무릎 꿇을 모 芼=풀 우거질 모 茅=띠 모 莫=저물 모 蝥=해충 모 蟊=蝥와 同字 謀=꾀할 모 謨=꾀 모 貌=얼굴 모 鉾=칼 끝 모 髦=다팔머리 모 麰=보리 모 [목] 冒=무릅쓸 목 凩=찬바람 목 匹=집 오리 목 木=나무 목 沐=머리감을 목 牧=칠 목 目=눈 목 睦=화목할 목 穆=화목할 목 苜=거여목 목 鶩=집오리 목 [몰] 勿=없을 몰 歿=죽을 몰 殁= 沒=가라 앉을 몰 [몽] 冡=덮어쓸 몽 夢=꿈 몽 幪=덮을 몽 懞=어두울 몽 曚=어두울 몽 朦=풍부할 몽 溕= 濛=가랑비 올 몽 瞢=어두울 몽 矇=소경 몽 艨=싸움배 몽 蒙=입을 몽 雺=안개 몽 鸏=비둘기 몽 [묘] 卯=토끼 묘 吵=지저귈 묘 墓=무덤 묘 妙=묘할 묘 廟=사당 묘 描=그릴 묘 昴=별자리 이름 묘 杳=어두울 묘 淼=물 아득할 묘 渺=아득할 묘 猫=고양이 묘 眇=애꾸눈 묘 秒=까끄라기 묘 竗=땅 이름 묘 緲=아득할 묘 苗=모 묘 藐=작을 묘 貓=猫와 同字 錨=닻 묘 [무] 亡=없을 무 亾= 儛=舞와 同字 兦=없을 무 務=일 무, 힘쓸 무, 권장할 무 嘸=분명하지 않을 무, 모호한 모양 무 巫=무당 무, 산 이름 무 廡=집 무, 처마 무, 지붕 무 憮=어루만질 무, 애무할 무 懋=힘쓸 무, 노력할 무 戊=다섯째 천간 무, 무성할 무 拇=엄지손가락 무 撫=어루만질 무, 누를 무 无=없을 무 楙=무성할 무, 아름다울 무 武=굳셀 무, 자만할 무, 군인 무 毋=말 무 無=없을 무 珷=옥돌 무 畝=이랑 무 畮=畝의 正字 繆=묶을 무, 얽을 무, 삼 무 膴=포 무, 크게 저민 고기 무 舞=춤출 무 茂=우거질 무, 무성할 무 蕪=거칠어질 무, 거친풀 무 袤=길이 무 誣=무고할 무, 깔볼 무 貿=바꿀 무, 물건 살 무 鍪=투구 무, 가마 무 霧=안개 무, 어두울 무 騖=달릴 무, 질주할 무 鵡=앵무새 무 [묵] 万=성씨 묵 嘿=고요할 묵, 말 아니할 묵 嚜=거짓 묵, 불만스러운 모양 묵 墨=먹 묵, 형벌 이름 묵 默=묵묵할 묵, 고요할 묵 [문] 亹=땅이름 문 們=들 문, 무리 문 免=해산할 문, 통건 쓸 문 刎=목 벨 문, 자를 문, 끊을 문 勽=덮을 문 匁=몸메 문 吻=입술 문, 입가 문 呅=웃을 문 問=물을 문, 알릴 문 悗=잊어버릴 문 懣=번거로울 문 抆=닦을 문, 문지를 문 捫=어루만질 문, 쓰다듬을 문 文=무늬 문, 얼룩 문 汶=내 이름 문, 수치 문 炆=따뜻할 문 璊=붉은 옥 문 紊=어지러울 문 紋=무늬 문, 주름 문 聞=들을 문 蚊=모기 문 門=문 문 雯=구름 무늬 문 [물] 勿=말 물, 아닐 물, 깃발 물 沕=아득할 물, 숨길 물 物=만물 물, 무리 물 [므] 謬= [미] 亹=힘쓸 미, 문채가 있는 모양 미 侎=어루만질 미 冞=점점 미, 두루 다닐 미 味=맛 미, 뜻 미 咩=양 울 미 咪=咩와 同字 娓=장황할 미, 힘쓸 미 媄=빛 고울 미 媚=아첨할 미, 풍치가 아름다울 미 媺=착하고 아름다울 미 尾=꼬리 미, 등 미 嵋=산이름 미 弥=彌와 同字 弭=활고자 미, 그칠 미 彌=두루 미, 널리 미 微=작을 미, 자질구레할 미 敉=어루만질 미 未=아닐 미 梶=나무 끝 미 楣=문미 미, 처마 미 渼=물놀이 미, 내 이름 미 湄=물 가 미, 더운 물 미 瀰=물 넓을 미 獼=원숭이 미 眉=눈썹 미, 노인 미 米=쌀 미 糜=죽 미, 싸라기 미 縻=고삐 미, 얽어맬 미 羋=양 울 미 美=아름다울 미, 맛이 좋을 미 芈=양이 울 미, 성씨 미 苿= 菋=오미자 미 薇=고삐 미 蘼=장미 미, 천궁 미 謎=수수께끼 미 迷=미혹할 미, 전념할 미 靡=쓰러질 미, 쏠릴 미 麋=큰사슴 미, 부서질 미 黴=곰팡이 미, 검을 미, 썪을 미 [민] 僶=어거지로 할 민 勔=권면할 민, 힘쓸 민 岷=산이름 민 忞=강인할 민 忟=강인할 민 悶=번민할 민 愍=근심할 민 憫=불쌍히 여길 민 敏=민첩할 민 旻=하늘 민 旼=온화할 민 暋=굳셀 민 民=백성 민 泯=망할 민 湣=낚시줄 민 玟=옥돌 민 珉=아름다운돌 민 緍=낚시줄 민 緡=낚시줄 민 罠=그물 민 苠=속대 민 閔=위문할 민 閩=종족이름 민 鰵=대구 민 黽=힘쓸 민 [밀] 宻=密의 俗字 密=빽빽할 밀 樒=침향 밀 滵=물 흐르는 모양 밀 蜜=꿀 밀 謐=고요할 밀 [박] 亳=땅이름 박 剝=벗길 박 剥= 博=넓을 박 嚗=역정낼 박, 지팡이 던지는 소리 박 拍=칠 박 搏=칠 박 撲=업어질 박 朴=나무껍질 박 樸=통나무 박 欂=주두 박 泊=머무를 박 溥=빽빽할 박 爆=지질 박 牔=박공 박 珀=호박 박 璞=옥덩어리 박 箔=발 박 簿=잠박 박 粕=지게미 박 縛=묶을 박 膊=포 박 舶=배 박 薄=숲 박 趵=차는 소리 박 迫=닥칠 박 鉑=금박 박 鎛=종 박 雹=누리 박 駁=얼룩말 박 駮=짐승이름 박 髆=어깨쭉지 박 [반] 仮=反과 同字 伴=짝 반 冸=녹을 반 半=반 반 反=돌이킬 반 叛=배반할 반 媻=비틀거릴 반 弁=즐거워할 반 扮=꾸밀 반 扳=끌 반 拌=버릴 반 搫=덜 반 搬=옮길 반 攀=더위잡을 반 攽=나눌 반 斑=얼룩 반 朌=구실 반 槃=쟁반 반 泮=학교 반 潘=뜨물 반 班=나눌 반 畔=지경 반 番=갈아치울 반, 차례 반, 땅이름 반 瘢=흉터 반 盤=소반 반 盼=곁눈질 할 반 磐=넓을 반 磻=강이름 반 礬=명반 반 竝=짝지을 반, 고을이름 반 絆=줄 반 繁=뱃대끈 반 肦=나눌 반 胖=희생 반 般=옮길 반 螌=가뢰 반 蟠=서릴 반 返=돌이킬 반 頒=나눌 반 頖=풀릴 반 飯=밥 반 飯=밥 반 [발] 勃=갑작스러울 발 哱=어지러울 발 彂= 悖=우쩍 일어날 발 抜= 拔=뺄 발 拨= 撥=다스릴 발 浌= 浡=일어날 발 渤=바다이름 발 溌= 潑=뿌릴 발 発=일어날 발 發=쏠 발 脖=배꼽 발 跋=밟을 발 酦=술기운 발 醗= 醱=술 괼 발 鈸=방울 발 鉢=바리때 발 髮=터럭 발 魃=가물 귀신 발 鵓=집비둘기 발 [방] 仿=헤멜 방 倣=본뜰 방 傍=곁 방 匚=상자 방 厖=클 방 哤=난잡할 방 嗙=웃을 방 坊=동네 방 妨=방해할 방 尨=삽살개 방 幇=幫과 同字 幚= 幫=도울 방 彭=많을 방 彷=거닐 방 徬=시중들 방 房=방 방 搒=배저을 방 放=놓을 방 方=모 방 旁=두루 방 旊=옹기장 방 昉=마침 방 枋=다목 방 梆=목어 방 榜=매 방 滂=비 퍼부을 방 牓=패 방 磅=돌 떨어지는 소리 방 紡=자을 방 肪=기름 방 膀=쌍배 방 舫=배 방 舽=배 방 芳=꽃다울 방 蒡=인동 덩굴 방 蚌=방합 방 螃=방게 방 訪=찾을 방 謗=헐뜯을 방 邡=고을 이름 방 邦=나라 방 鎊=깎을 방 防=둑 방 髣=비슷할 방 魴=방어 방 龍=잿빛 방 龐=어지러울 방 [배] 俳=광대 배 倍=곱 배 偝=버릴 배 啡=코 고는 소리 배 坏=언덕 배 坯=坏와 同字 培=북돋을 배 徘=노닐 배 扒=뺄 배 拜=절 배 排=밀칠 배 杯=잔 배 湃=물결 이는 모양 배 焙=불에 쬘 배 牌=배지 배 琲=구슬 꿰미 배 白=땅이름 배 盃=杯의 俗字 背=등 배 胚=아이 밸 배 蓓=꽃봉오리 배 裴=옷 치렁치렁할 배 賠=물어줄 배 輩=무리 배 配=아내 배 陪=쌓아올릴 배 [백] 伯=맏 백 兡=헥트르램 백 帛=비단 백 柏=나무 이름 백 栢=柏의 俗字 白=흰 백 百=일백 백 粨=힉터메트르 백 覇=霸의 俗字 霸=달력 백 魄=넋 백 [번] 反=되돌릴 번 噃=산돼지 번, 소리 번 幡=기 번 樊=울 번 潘=넘칠 번 煩=괴로워할 번 燔=구울 번 番=갈마들 번 磻=강이름 번 繁=많을 번 繙=되풀이 풀이할 번 翻=날 번 膰=제사 고기 번 蕃=우거질 번 藩=덮을 번 蘩=산흰쑥 번 袢=속옷 번 蹯=짐승 발바닥 번 飜=뒤칠 번 磻=강이름 번 [벌] 伐=칠 벌 橃=떼 벌 筏=떼 벌 罰=죄 벌 罸=罰과 同字 閥=공훈 벌 [범] 凡=무릇 범 凢=凡의 俗字 凣=凡의 俗字 帆=돛 범 梵=범어 범 氾=넘칠 범 汎=뜰 범 泛=뜰 범 犯=범할 범 笵=법 범 範=법 범 范=풀 이름 범 訉=말 많을 범 颿=돛 범 [법] 法=법 법 琺=법랑 법 [베] 北= 裵= 褙= 北= [벡] 佰= [벽] 僻=후미질 벽 劈=쪼갤 벽 壁=벽 벽 擗=가슴칠 벽 擘=엄지손가락 벽 檗=황벽나무 벽 璧=동근 옥 벽 甓=벽돌 벽 疈=가를 벽 癖=적취 벽 碧=푸를 벽 薜=승검초 벽 蘗=황경나무 벽 襞=주름 벽 辟=임금 벽 闢=열 벽 霹=벼락 벽 鷿=농병아리 벽 鼊=거북 벽 [변] 便=똥오줌 변 匥=관갑 변, 옷상자 변, 대그릇 변 卞=조급할 변 变= 変=變의 俗字 弁=고깔 변 忭=기뻐할 변 扁=현판 변, 모난 그릇 변, 비천할 변 抃=손뼉칠 변 籩=제기 이름 변 編=땋을 변 胼=腁의 俗字 腁=살갗 틀 변 變=변할 변 賆= 辨=분별할 변 辮= 辯=말잘할 변 边= 辺=邊의 俗字 邊=가 변 釆=분별할 변 駢=騈의 俗字 騈=나란히 할 변 骿=통갈비 변 鴘=매 변 便=똥오줌 변 [별] 丿=삐침 별 別=나눌 별 别=別의 俗字 彆=활 뒤틀릴 별 憋=악할 별 批=거스를 별 瞥=언뜻 볼 별 蹩=절름발이 별 閉=막을 별 鱉=鼈과 同字 鷩=금계 별 鼈=자라 별 龞= [병] 丙=남녘 병 並=竝과 同字 併=倂의 俗字 倂=아우를 병 兵=군사 병 塀=담 병 屏=屛의 俗字 屛=병풍 병 并=幷의 俗字 摒=제거할 병 昞=밝을 병 昺=昞과 同字 柄=자루 병 棅=柄과 同字 榜=게시판 병, 방 써붙일 병, 매 병, 볼기칠 병 炳=밝을 병 瓶=甁의 俗字 甁=병 병 病=병 병 秉=잡을 병 竝=아우를 병 絣=무늬없는 비단 병, 이을 병, 먹줄 튀길 병 缾=두레박 병 軿=輧의 俗字 輧=거마 소리 병 迸=달아날 병 邴=고을 이름 병 鈵= 鉼=판금 병 鋲=넓은 못 병, 징 병 餅=餠의 俗字 餠=떡 병 駢=騈의 俗字 騈=나란히 할 병 [보] 俌=도울 보 保=지킬 보 呆=保와 同字 堡=작은 성 보 報=갚을 보 宝=寶의 俗字 寳=寶의 俗字 寶=보배 보 普=널리 보 椺=들보 보 步=걸을 보 歩=步의 俗字 洑=보 보 湺= 潽= 父=남자 미칭 보 珤=寶의 古字 甫=클 보 盙=簠의 本字 簠=제기 이름 보 菩=보살 보 葆=풀 더부룩할 보 補=기울 보 褓=포대기 보 譜=계보 보 輔=덧방나무 보 靌= 鴇=능에 보 黼=수 보 [복] 伏=엎드릴 복 僕=종 복 副=버금 복 匐=길 복 卜=점 복 墣=흙덩이 복 宓=성 복 幞=건 복 復=돌아올 복 扑=칠 복 撲=닦을 복 服=옷 복 樸=총생할 복 濮=강 이름 복 福=복 복 箙=전동 복 腹=배 복 茯=복령 복 菔=무 복 蔔=무우 복 蝠=박쥐 복 蝮=살무사 복 袱=보 복 複=겹옷 복 覆=뒤집힐 복 踣=넘어질 복 蹼=물갈퀴 복 輹=복토 복 輻=바퀴살 복 馥=향기 복 鰒=전복 복 鵩=새 이름 복 福=복 복 [본] 本=밑 본 [봉] 丰=예쁠 봉 俸=녹 봉 唪=껄껄 웃을 봉 塜=먼지 일 봉 夆=끌 봉 奉=받들 봉 封=봉할 봉 尨=헝클어진 모양 봉 峯=봉우리 봉 峰=峯과 同字 捧=받들 봉 棒=몽둥이 봉 汎=뜰 봉 泛=엎을 봉 烽=봉화 봉 熢=연기 자욱할 봉 琫=칼집 장식 봉 篷=뜸 봉 綘=縫과 同字 縫=꿰맬 봉 菶=풀 무성할 봉 蓬=쑥 봉 蜂=벌 봉 逢=만날 봉 鋒=칼끝 봉 鳯=鳳의 俗字 鳳=봉새 봉 鴌=鳳의 古字 [부] 不=아닐 부 仆=엎드릴 부 付=줄 부 伏=알 안을 부 俘=사로잡을 부 俯=구푸릴 부 偩=본뜰 부 傅=스승 부 冨=富의 俗字 剖=쪼갤 부 副=버금 부 否=아닐 부 咐=분부할 부 哹=부는 소리 부, 물새 우는 소리 부 埠=선창 부 培=무덤 부 報=나아갈 부 夫=지아비 부 婦=며느리 부 媍=婦와 同字 孚=미쁠 부 孵=알 깔 부 富=가멸 부 巬= 巭=공부할 부 府=곳집 부 復=다시 부 扶=도울 부 抔=움킬 부 拊=어루만질 부 掊=그러모을 부 敷=펼 부 斧=도끼 부 桴=마룻대 부 榑=부상 부 浮=뜰 부 涪=물거품 부 溥=펼 부 父=아비 부 玞=옥돌 부 祔=합사할 부 符=부신 부 筟=대청 부 簿=장부 부 缶=장군 부 罘=그물 부 罦=그물 부 胕=장부 부 腐=썩을 부 腑=장부 부 膚=살갗 부 艀=작은 배 부 芙=부용 부 芣=질경이 부 苻=귀목풀 부 莩=풀 이름 부 蔀=빈지문 부 蚨=파랑강충이 부 蜉=하루살이 부 袝= 裒=모을 부 複=겹칠 부 覆=덮을 부, 가리울 부, 고루고루 퍼질 부 訃=부고 부 負=질 부 賦=구실 부 賻=부의 부 赴=나아갈 부 趺=책상다리할 부 跗=발등 부 踣=넘어질 부 部=거느릴 부 釜=가마 부 鈇=도끼 부 阜=언덕 부 阝=언덕 부 附=붙을 부 頫=머리 숙일 부 駙=곁마 부 鮒=붕어 부 鳧=오리 부 鳬=鳧의 俗字 麩=밀기울 부 復=다시 부 [북] 僰=오랑캐 북 北=북녘 북 [분] 体=용렬할 분 倴=사람이름 분, 둔한 사람 분 僨=넘어질 분 分=나눌 분 匪=나눌 분 吩=뿜을 분 噴=뿜을 분 坌=먼지 분 墳=무덤 분 奔=달릴 분 奮=떨칠 분 帉=걸레 분, 행주 분 忿=성낼 분 憤=결낼 분 扮=꾸밀 분 昐= 朌=頒과 同字 枌=나무 이름 분 棻= 棼=마룻대 분 氛=기운 분 汾=클 분 湓=용솟음할 분 濆=뿜을 분 焚=불사를 분 犇=달아날 분 畚=삼태기 분 盆=동이 분 砏=큰 소리 분 笨=거칠 분 粉=가루 분 糞=똥 분 紛=어지러워질 분 肦=머리 클 분 膹=고기 삶은 국 분 芬=향기로울 분 苯=풀 떨기로 날 분 蕡=들깨 분 賁=클 분 轒=병거 분 雰=안개 분 頒=큰 머리 분 鱝=가오리 분 黺=옷에 오색 수 놓을 분 鼢=두더지 분 [불] 不=아닐 불 乀=파임 불 仏=佛의 古字 佛=부처 불 冹=찰 불 刜=칠 불 咈=어길 불 堋= 岪=산길 불 弗=아닐 불 彿=비슷할 불 払=떨칠 불 拂=떨 불 沸=용솟음할 불 漰= 祓=푸닥거리할 불 紱=인끈 불 艴=발끈할 불 茀=풀 우거질 불 韍=폐슬 불 髴=비슷할 불 鬅= 黻=수 불 不=아닐 불 [붕] 倗=부탁할 붕 傰=성 붕 崩=무너질 붕 朋=벗 붕 棚=시렁 붕 硼=붕산 붕 綳= 繃=묶을 붕 鵬=대붕새 붕 [비] 丕=클 비 仳=떠날 비 伾=힘셀 비 俷=등질 비 俻=하여금 비, 좇을 비, 흘겨볼 비 俾=더할 비 偹= 備=깆출 비 剕=발 벨 비 匕=비수 비 匪=대상자 비 卑=낮을 비 厞=더러울 비 否=막힐 비, 더러울 비, 악할 비 呸=다투는 소리 비 啚=鄙와 同字 啡=코 고는 소리 비 嚊=헐떡거릴 비 嚭=클 비 圮=무너질 비 埤=더할 비 妃=왕비 비 妣=죽은 어미 비 婢=여자종 비 屁=방귀 비 庇=덮을 비 庳=집 낮을 비 悱=표현 못할 비 悲=슬플 비 憊=고달플 비 扉=문짝 비 批=칠 비 斐=오락가락할 비 枇=비파나무 비 棐=도지개 비 椑=술통 비 榌=사닥다리 비 榧=비자나무 비 比=견줄 비 毖=삼갈 비 毗=도울 비 毘=毗와 同字 沘=강 이름 비 沸=끓을 비 泌=샘물 흐르는 모양 비 淝=강 이름 비 淠=강 이름 비 濞=물 소리 비 狉=삵의 새끼 비 狒=비비 비 琵=비파 비 畀=줄 비 痞=뱃속 결릴 비 痹=저릴 비 痺=암메추라기 비 睥=흘겨볼 비 砒=비상 비 碑=돌기둥 비 祕=귀신 비 秕=쭉정이 비 秘=숨길 비 篦=빗치개 비 粃=쭉정이 비 紕=가선 비 緋=붉은 빛 비 羆=큰 곰 비 翡=물총새 비 肥=살찔 비 脾=지라 비 腓=장딴지 비 臂=팔 비 芘=풀 이름 비 芾=작은 모양 비 菲=엷을 비 萆=비해 비 蓖=아주까리 비 蚍=왕개미 비 蜚=바퀴 비 裨=도울 비 誹=헐뜯을 비 譬=비유할 비 貔=비휴 비 費=쓸 비 贔=힘쓸 비 轡=고삐 비 邳=클 비 郫=고을 이름 비 鄙=다라울 비 閟=문 닫을 비 陴=성가퀴 비 霏=눈 펄펄 내릴 비 非=아닐 비 鞴=풀무 비 飛=날 비 騑=곁마 비 騛=빠른 말 비 髀=넓적다리 비 鯡=곤이 비 鼙=마상북 비 鼻=코 비 泌=샘물 흐르는 모양 비 [빈] 份=빛날 빈 儐=인도할 빈 嚬=찡그릴 빈 嬪=아내 빈 彬=빛날 빈 擯=물리칠 빈 斌=빛날 빈 檳=빈랑나무 빈 殯=염할 빈 浜=물가 빈 濱=물가 빈 瀕=물가 빈 牝=암컷 빈 玭=구슬 이름 빈 矉=찡그릴 빈 繽=어지러울 빈 臏=종지뼈 빈 蘋=네가래 빈 豳=나라 이름 빈 貧=가난할 빈 賓=손 빈 賔=손 빈 邠=나라 이름 빈 鑌=강철 빈 霦=옥 광채 빈 頻=자주 빈 顰=찡그릴 빈 髕=종지뼈 빈 鬂=鬢의 俗字 鬢=살쩍 빈 [빙] 俜=비틀거리다 빙 冫=얼음 빙 冰=氷의 本字 凭=기대다 빙 凴=凭과 同字 娉=장가들다 빙 憑=기대다 빙 氷=얼음 빙 聘=찾아가다 빙 騁=달리다 빙 [뿐] 兺=그 뿐 [사] 乍=잠깐 사 亊= 事=일 사 些=적을 사 仕=벼슬할 사 伺=엿볼 사 似=같을 사 佀=같을 사 佘=산 이름 사 使=하여금 사 俟=기다릴 사 倳=찌를 사 傞=취하여 춤추는 모양 사 傻=약을 사 僿=잘게 부슬 사 儩=다할 사 写=冩의 略字 冩=베낄 사 剚=찌를 사 卸=풀 사 厶=사사 사 叓=事의 古字 史=역사 사 司=맡을 사 咋=잠간 사 唆=부추길 사 喳=예하고 대답하는 소리 사 嗄=목 잠길 사 嗣=이을 사 四=넉 사 士=선비 사 夕=한 움큼 사 奢=사치할 사 姒=동서 사 娑=춤출 사 寫=베낄 사 寺=절 사 射=궁술 사 巳=여섯째 지지 사 師=스승 사 徙=옮길 사 思=생각할 사 捨=버릴 사 斜=비낄 사 斯=이 사 查= 柶=수저 사 査=사실할 사 梭=북 사 楂=떼 사 榭=정자 사 死=죽을 사 汜=지류 사 沙=모래 사 泗=물 이름 사 渣=찌끼 사 瀉=토할 사 灼= 犧=술그릇 사 献= 獅=사자 사 獻=술통 사 痧=쥐통 사 皶= 砂=모래 사 社=토지의 신 사 祀=제사 사 祠=사당 사 私=사사 사 竢=기다릴 사 笥=상자 사 篩=체 사 簑=蓑와 同字 簔= 糸=가는 실 사 紗=깁 사 絲=실 사 缷= 肆=방자할 사 舍=집 사 莎=향부자 사 蓑=도롱이 사 蛇=뱀 사 蜡=납향 사 裟=가사 사 覗=엿볼 사 詐=속일 사 詞=말씀 사 謝=사례할 사 賜=줄 사 赦=용서할 사 辞=辭의 俗字 辭=말 사 邪=간사할 사 食=밥 먹일 사 飼=먹일 사 駛=달릴 사 駟=사마 사 魦=鯊와 同字 鯊=문절망둑 사 鯋=상어 사, 모래무지 사 鰤=새우 사 麝=사향노루 사 飼=기를 사 [삭] 削=깎을 삭 數=자주 삭 朔=초하루 삭 槊=창 삭 溯=물이름 삭, 빨래한 물 삭 爍=빛날 삭 索=동아줄 삭 蒴=말오줌대 삭 鑠=녹일 삭 數=자주 삭 索=동아줄 삭 [산] 傘=우산 산 删=刪의 略字 刪=깎을 산 剷=깎을 산 匴=관상자 산 姍=헐뜯을 산 姗=姍의 略字 孿=쌍둥이 산 山=뫼 산 散=흩을 산 橵=산자 산 汕=오구 산 潸=눈물흐를 산 澘=潸의 略字 狻=사자 산 珊=산호 산 產=産의 略字 産=낳을 산 疝=산증 산 算=셀 산 繖=일산 산 蒜=달래 산 虄= 訕=헐뜯을 산 跚=비틀거릴 산 酸=초 산 鏟=대패 산 閊=비색할 산 霰=싸라기눈 산 [살] 乷=음역자 살 撒=뿌릴 살 殺=죽일 살 煞=죽일 살 蔡=내칠 살 薩=보살 살 [삼] 三=석 삼 叁=參의 略字 参=參의 略字 參=석 삼 叄=參의 俗字 嘇=머금을 삼 杉=삼나무 삼 森=나무빽빽할 삼 毿=털긴 삼 糝=나물죽 삼 芟=벨 삼 蔘=인삼 삼 衫=적삼 삼 釤=낫 삼 鬖=헝클어질 삼 參=석 삼 [삽] 偛=키작을 삽 卅=서른 삽 唼=쪼아먹을 삽 啃=입 다시는 소리 삽 啑=오리가 텁석텁석 먹을 삽 扱=거둘 삽, 들 삽, 당길 삽, 깊을 삽 插=揷의 略字 揷=꽂을 삽 歃=마실 삽 澁=떫을 삽 翣=운삽 삽 趿=발가락으로잡을 삽 鈒=창 삽 鍤=가래 삽 钑=鈒의 略字 霅=비올 삽 霎=가랑비 삽 颯=바람소리 삽 [상] 丄= 上=위 상 傷=상처 상 像=형상 상 償=갚을 상 儴=고생할 상, 훔칠 상, 인연할 상 勨=느즈러질 상, 힘쓸 상, 움직일 상 向=성 상 响= 商=헤아릴 상 喪=죽을 상 嗓=목구멍 상 嘗=맛볼 상 塽=높고밝은땅 상 孀=과부 상 尙=오히려 상 尚=尙의 略字 峠=고개 상 常=항상 상 床=牀의 俗字 庠=학교 상 廂=행랑 상 徜=노닐 상 想=생각할 상 晌=정오 상 桑=뽕나무 상 樣=橡의 略字 橡=상수리나무 상 殤=일찍죽을 상 湘=강이름 상 湯=물흐를 상 爽=시원할 상 牀=평상 상 状=狀의 略字 狀=형상 상 甞=맛볼 상 相=서로 상 祥=상서로울 상 箱=상자 상 緗=담황색 상 翔=빙빙돌아날 상 裳=치마 상 觴=잔 상 詳=자세할 상 象=코끼리 상 賞=상줄 상 鎟=방울소리 상 霜=서리 상 顙=이마 상 鬺=삶을 상 鮝=건어 상 祥=복 상 [새] 塞=변방 새 灑=뿌릴 새, 깜짝 놀랄 새 璽=도장 새 賽=굿할 새 鰓=뿔심 새 [색] 嗇=아낄 색 塞=막힐 색 愬=놀랍고두려울 색 槭=나뭇잎 떨어져 앙상할 색 濇=껄끄러울 색 瀒=濇의 俗字 穡=거둘 색 索=찾을 색 色=빛 색 薔=아낄 색 賾=깊숙할 색 塞=막힐 색 [생] 栍=찌 생 牲=희생 생 生=날 생 甥=생질 생 省=덜 생 眚=눈에백태낄 생 笙=생황 생 鉎=녹 생 省=덜 생 [샤] 仒= [서] 叙=敍의 俗字 噬=씹을 서 墅=농막 서 壻=사위 서 婿=사위 서 嶼=섬 서 序=차례 서 庶=여러 서 庻=庶의 略字 徐=천천할 서 恕=용서할 서 抒=풀 서 捿=깃들일 서 揟=나무이름 서 撕= 敍=차례 서 敘=敍의 俗字 暑=더울 서 曙=새벽 서 書=쓸 서 栖=깃들일 서 棲=살 서 湑=거를 서 澨=물가 서 犀=무소 서 瑞=상서 서 筮=점대 서 紓=느슨할 서 絮=솜 서 緒=緖의 略字 緖=실마리 서 署=관청 서 耡=구실이름 서 胥=서로 서 舒=펼 서 芧=상수리 서 薯=참마 서 西=서녘 서 誓=맹세할 서 諝=슬기 서 谞=諝의 略字 逝=갈 서 鉏=호미 서 鋤=호미 서 閪=잃을 서 黍=기장 서 鼠=쥐 서 [석] 冟=고룰 석, 고르지 않을 석, 알맞게 된 밥 석 夕=저녁 석 奭=클 석 射=맞힐 석 席=자리 석 惜=아낄 석 昔=옛 석 晰=밝을 석 晳=밝을 석 析=가를 석 汐=조수 석 沢=澤의 略字 淅=쌀일 석 潟=개펄 석 澙=潟의 俗字 澤=풀 석 石=돌 석 矽=석비레 석 碩=클 석 腊=포 석 舃=신 석 舄=舃의 略字 蓆=자리 석 蜥=도마뱀 석 釈=釋의 俗字 釋=풀 석 鉐=놋쇠 석 錫=주석 석 鼫=석서 석 [선] 亘=구할 선 仙=신선 선 傓=매우 성할 선 僊=춤출 선 僎=갖출 선 先=먼저 선 单=單의 簡體字 単=單의 略字 善=착할 선 單=고을이름 선 墡=백토 선 嫙=예쁠 선 嬋=고울 선 宣=베풀 선 尟=尠과 同字 尠=적을 선 屳=날 선 愃=쾌할 선 扇=사립문 선 敾=글잘쓸 선 旋=돌 선 歚=고을 선 洗=조촐할 선, 율이름 선 渲=바림 선 煽=부칠 선 熯=불 이글이글할 선, 태울 선, 공경할 선 琁=옥 선 瑄=도리옥 선 璇=아름다운옥 선 璿=아름다운옥 선 癬=옴 선 禅=禪의 略字 禪=봉선 선 筅=솔 선 綫=線과 同字 線=실 선 縇=선두를 선 繕=기울 선 缐=線의 簡體字 羡=현이름 선 羨=부러워할 선 腺=샘 선 膳=반찬 선 船=배 선 蘚=이끼 선 蝉=蟬의 略字 蟬=매미 선 詵=많을 선 譔=가르칠 선 譱=善의 古字 跣=맨발 선 躚=춤출 선 選=가릴 선 還=돌 선 銑=끌 선 鏇=갈이틀 선 鐥=복자 선 霰=싸락눈 선, 별 선 饍=膳과 同字 騸=불깔 선 鮮=고울 선 鱓=두렁허리 선 鱔=鱓의 俗字 鱻=생선 선 [설] 偰=맑을 설 僁=소근거릴 설 卨=사람이름 설 囓=齧과 同字 媟=깔볼 설 屑=가루 설 挈=손에들 설 揲=셀 설 暬=설만할 설 楔=문설주 설 泄=샐 설 洩=샐 설 渫=칠 설 爇=불사를 설 碟=가죽다룰 설 稧=볏단 설 紲=고삐 설 舌=혀 설 薛=맑은대쑥 설 褻=더러울 설 設=베풀 설 說=말씀 설 説=説의 略字 雪=눈 설 鱈=대구 설 齧=물 설 [섬] 剡=땅이름 섬 孅=가늘 섬 憸=간사할 섬 摻=섬섬할 섬 暹=해돋을 섬 殲=다죽일 섬 睒=번개빛 섬 繊=가늘 섬 纖=가늘 섬 蟾=두꺼비 섬 譫=헛소리 섬 贍=넉넉할 섬 銛=가래 섬 閃=번쩍할 섬 陝=고을이름 섬 韱=산부추 섬 [섭] 囁=말하려다 멈출 섭, 중얼거릴 섭, 입 다물 섭 懾=무서울 섭, 두려울 섭 摂=懾과 同字 攝=몰아 잡을 섭, 끌 섭, 단정하게 할 섭, 겸할 섭, 거둘 섭, 기록할 섭, 항복할 섭 涉=물 건널 섭, 지나칠 섭, 돌아다닐 섭 渉=涉과 同字 灄=흠치르르할 섭, 물이름 섭, 떼 섭 燮=불에 익힐 섭, 불꽃 섭, 조화로울 섭 聶=소곤거릴 섭, 낄 섭, 성씨 섭 葉=고을이름 섭 躞=족자 마구리 섭, 저벅저벅 걸을 섭 躡=밟을 섭, 신 신을 섭, 오를 섭 鑷=쪽집게 섭 顳=귀밑 뼈 섭 葉=고을이름 섭 [성] 垩=聖과 同字 城=보루 성, 재 성, 서울 성 声=聲의 俗字 姓=일가 성, 아이 낳을 성, 백성 성 宬=사고 성, 도서실 성, 창고 성 性=성품 성, 마음 성, 바탕 성, 색욕 성 惺=깨달을 성, 똑똑할 성, 조용할 성 成=이룰 성, 거듭 성, 마칠 성, 화목할 성 星=별 성, 희뜩희뜩할 성, 세월 성, 성시 성 晟=밝을 성, 햇살 퍼질 성 猩=성성이 성 珹= 瑆= 盛=담을 성, 이룰 성, 정제할 성, 많을 성 省=살필 성 筬=바디 성 聖=성인 성, 착할 성, 통할 성, 지극할 성 聲=소리 성, 풍류 성, 명예 성 腥=비린내 성, 더러울 성, 날고기 성 誠=미쁠 성, 공경할 성, 살필 성, 진실 성 醒=술 깰 성, 꿈 깰 성, 깨달을 성 騂=붉은 소 성, 누른말 성, 활 물쩡물쩡할 성 [세] 世=세상 세, 평생 세, 백년 세 勢=권세 세, 위엄 세, 불알 세, 기회 세 卋=世의 古字 帨=차는 수건 세, 손수건 세 彗= 歲=해 세, 곡식 익을 세, 돐 세, 풍년 세 歳=歲와 同字 洒=씻을 세, 설치할 세 洗=씻을 세, 세수 그릇 세 稅=구실 세, 거둘 세, 놓을 세, 쉴 세 税=稅와 同字 笹=가는 대 세 細=가늘 세, 작을 세, 좀놈 세 繐=가늘고 성긴 베 세 蛻=매미 허물 세 蜕=蛻와 同字 說=달랠 세, 쉴 세 説=說와 同字 貰=빌릴 세, 세 바칠 세 說=달랠 세, 쉴 세 [소] 佋=소개할 소, 사신 소, 댓수의 차례 소 俏=거문고 뒤치는 소리 소 傃=향할 소, 떳떳할 소 卲=높을 소, 성씨 소 召=부를 소, 청할 소, 과부 소 咲=웃을 소 哨=입술 비뚤어질 소, 잔말할 소 喿=새 때지어 울 소 嗉=멀떠구니 소 嘨=嘯와 同字 嘯=휘파람 소, 세게 뿜을 소, 읊을 소 埽=쓸 소, 그릴 소, 언덕 소 塐=塑와 同字 塑=허수아비 소 宵=밤 소, 작을 소, 벌레이름 소 小=작을 소, 좁을 소, 적을 소, 어릴 소, 적게 여길 소 少=적을 소, 조금 소, 멸시할 소, 잠깐 소, 젊을 소 巢=새집 소, 집 지을 소, 새 보금자리 소, 적진 망보는 높을 수레 소, 도둑굴 소, 큰 피리 소, 채소이름 소 愬=고할 소, 참소할 소, 알릴 소 所=바 소, 곳 소, 쯤 소, 가질 소, 얼마 소 捎=덜 소, 흔들거릴 소, 추릴 소, 버릴 소 掃=쓸 소, 상투 소 掻=搔와 同字 搔=긁을 소, 휘저을 소, 분분할 소 昭=소명할 소, 소목 소, 태평세월 소 梳=얼레빗 소 樔=풀막 소, 너스레 소 沼=못 소, 늪 소 泝=거슬러 올라갈 소, 흘러갈 소 消=다할 소, 꺼질 소, 풀릴 소, 해어질 소 涑= 溯=거슬러 올라갈 소 瀟=물 맑을 소, 비바람 몰아칠 소, 강이름 소 炤=밝을 소 焼=燒와 同字 燒=불 붙을 소, 들불 소, 불 놓을 소 甦=깨어날 소, 숨 쉴 소 疋=밭 소 疎=성길 소, 드물 소 疏=뚫릴 소, 나눌 소, 멀 소, 추할 소, 드물 소 瘙=옴 소, 종기 소 穌=깨어날 소, 숨 쉴 소, 기뻐할 소 笑=웃음 소 筱=가는 대 소 筿=篠와 同字 箾=상소 소 篠=가는 대 소 簘=簫와 同字 簫=퉁소 소, 활고지 소 素=흴 소, 생초 소, 빌 소, 바탕 소, 원래 소 紹=이을 소, 얽을 소, 소개할 소 繅=고치 실 뽑을 소 翛=날개치는 소리 소, 모지라질 소 肖=쇠약할 소, 흩어질 소 膆=살찔 소, 멀떠구니 소 艘=배 소 蓀= 蔬=나물 소 蕭=쑥 소, 쓸쓸할 소, 말 우는 소리 소, 바람소리 소 蘇=차조기 소, 나무할 소, 까무러칠 소, 깨어날 소, 성씨 소 蛸=거미알 소, 연가시 알집 소 螦= 訴=하소연할 소, 송사할 소 謖= 踈=疎의 譌字 逍=노닐 소, 거닐 소 遡=거스를 소, 맞이할 소, 하소연할 소 邵=땅이름 소, 성씨 소 酥=타락죽 소 銷=녹을 소, 사라질 소 霄=하늘 소, 진눈깨비 소 韶=아름다울 소, 이을 소, 순의 풍류 소, 봄 소 騒=騷와 同字 騷=근심스러울 소, 흔들릴 소, 급할 소, 처량할 소 魈=산도깨비 소 鮹=문어 소, 낙지 소 鰷= 鰺=비린내 소의 譌字 [속] 俗=익을 속, 버릇 속, 풍속 속, 세상 속 属=屬의 俗字 屬=무리 속, 좇을 속, 붙이 속, 거느릴 속 束=묶을 속, 단나무 속, 약속할 속, 비단 다섯끝 속 洬= 粟=좁쌀 속, 겉곡식 속 続=續의 略字 續=이을 속 觫=곱송거릴 속 贖=속바칠 속, 무역할 속 速=빠를 속, 부를 속, 더러울 속, 사슴 발자취 속 遬=공손할 속, 줄어들 속 [손] 噀=물 뿜을 손 孫=손자 손, 움 돋을 손, 순할 손, 피할 손 巺=巽과 同字 巽=사양할 손, 낮은체 할 손, 부드러울 손, 괘 이름 손, 동과 남의 사이방향 손 損=덜 손, 잃을 손, 피곤할 손, 삼갈 손, 상할 손, 괘 이름 손 遜=순할 손, 겸손할 손, 도망할 손, 사양할 손 飡=飱과 同字 飧=저녁밥 손, 물에 만 밥 손 飱=飧의 俗字 餐=먹을 손, 물에 만 밥 손 [솔] 乺=솔 솔, 땅이름 솔 帥=거느릴 솔, 좇을 솔 率=거느릴 솔, 좇을 솔, 쓸 솔, 대강 솔, 공경할 솔, 뱀 이름 솔 窣=느릿느릿 걸을 솔, 우지직거릴 솔, 구멍으로 나올 솔 蟀=귀뚜라미 솔 [송] 凇=산유화 송 宋=송나라 송, 성씨 송 悚=두려울 송, 송구할 송 松=소나무 송, 향풀 송, 땅이름 송 柗=松과 同字 淞=강이름 송 竦=공경할 송, 두려울 송, 높일 송, 솟을 송 訟=송사할 송, 시비할 송, 꾸짖을 송, 괘 이름 송 誦=풍유할 송, 읽을 송, 말할 송, 원망할 송 送=보낼 송, 가질 송, 활쏘기 능통할 송, 줄 송 頌=기릴 송, 칭송할 송, 찬양하는 노래 송 鬆=터럭 더부룩할 송 [솨] 惢=의심낼 솨 曬= [쇄] 刷=긁을 쇄, 고칠 쇄, 빗을 쇄, 문지를 쇄 嗩=뿔나팔 쇄 灑=뿌릴 쇄, 깜짝 놀랄 쇄 瑣=옥가루 쇄, 가늘 쇄, 좀스러울 쇄, 대궐문 아로새길 쇄 砕=碎와 同字 碎=부술 쇄, 잘 쇄 誶=꾸짖을 쇄 鎖=자물쇠 쇄, 쇠사슬 쇄, 가둘 쇄, 항쇄 쇄 鏁=긴 창 쇄 殺=내릴 쇄, 감할 쇄, 빠를 쇄 [쇠] 殺= 衰=쇠할 쇠, 모손할 쇠, 약할 쇠 釗= [수] 修=닦을 수, 옳게할 수, 정리할 수, 꾸밀 수 倕=무거울 수, 이름 수 凁=싸늘할 수, 얻을 수 受=이을 수, 얻을 수, 담을 수, 받을 수 叟=어른 수, 쌀 씻는 소리 수 售=팔 수, 갚을 수 嗽=기침할 수, 입가실 수 囚=가둘 수, 갇힐 수, 묶일 수 垂=드리울 수, 변방 수, 거의 수, 남길 수 壽=목숨 수, 장수할 수, 나이 수, 축복할 수 嫂=형수 수 守=지킬 수, 보살필 수, 원님 수, 기다릴 수 宿=떼별 수, 성좌 수 寿=壽의 俗字 岫=바위구멍 수 峀=岫와 同字 帥=주장할 수, 장수 수 廋=숨길 수 愁=근심 수, 염려할 수, 탄식할 수 戍=수자리 수, 막을 수, 집 수 手=손 수, 잡을 수, 칠 수 授=줄 수, 부칠 수 搜=찾을 수, 더듬을 수, 화살 빨리 가는 소리 수, 어지러울 수 收=모을 수, 거둘 수, 잡을 수, 수레바퀴 수 数=數의 略字 數=헤아릴 수, 수죄할 수, 몇 수, 이치 수 晬= 樹=나무 수, 막을 수, 세울 수, 심을 수 殊=죽을 수, 베일 수, 끊어질 수, 지나갈 수 水=물 수, 고를 수 洙=물가 수, 물읾 수 溲=오줌 수, 반족할 수, 적실 수 漱=양치질할 수, 빨래할 수 潚= 濉= 燧=봉화 수, 불 수, 나무 문질러 불낼 수 狩=겨울사냥 수, 순행할 수 獣=獸와 同字 獸=짐승 수 琇=귀막이 수, 옥돌 수 琡= 璲=서옥 수, 패옥 수 璹= 痩=瘦와 同字 瘦=파리할 수, 가늘 수 睟=똑바로 볼 수, 윤택할 수 睡=졸음 수, 잠 수 睢=물이름 수 瞍=소경 수, 장님 수, 판수 수 祟=빌미 수 秀=빼어날 수, 이삭 수, 벼 패일 수, 아름다울 수 穗=이삭 수 竪=세울 수, 서있을 수, 더벅머리 수 籔=조리 수, 곡식 세는 단위 휘 수, 또아리 수 粹=정할 수, 순수할 수 綏=편안할 수, 수레고삐 수, 물러갈 수, 여우모양 수 綬=인끈 수 繍=繡와 同字 繡=수놓을 수, 성씨 수 羞=부끄러울 수, 음식 수 脩=포 수, 길 수, 마를 수 脺=얼굴 윤택할 수, 머리덜미 수 膄=파리할 수 膸=髓와 同字 茱=수유 수 菽= 蒐=꼭두서니 수, 모을 수, 숨을 수, 찾을 수 蓚= 藪=큰 늪 수, 덤불 수, 똬리 수 袖=소매 수 誰=누구 수, 무엇 수 誶=꾸짖을 수 讎=짝 수, 원수 수, 대거리할 수, 비교할 수, 갚을 수 讐=讎와 同字 豎=세울 수, 내시 수, 더벅머리 수 輸=떨어뜨릴 수, 쏟을 수, 보낼 수, 짐바리 수 遂=사무칠 수, 나아갈 수, 이룰 수, 마침내 수 邃=깊숙할 수 酬=술 권할 수, 갚을 수 銖=저울눈 수 銹=동록 수 鏽=거울에 녹슬 수 陲=변방 수, 위태할 수 隋=수나라 수 随=隨의 譌字 隧=무덤길 수, 구멍 수, 길 수 隨=따를 수, 괘 이름 수, 나라이름 수, 맡길 수 雖=비록 수, 벌레이름 수 需=음식 수, 머뭇거릴 수, 기다릴 수, 찾을 수, 괘 이름 수 須=수염 수, 기다릴 수 颼=바람소리 수 饈=드릴 수, 반찬 수 首=머리 수, 먼저 수, 비롯할 수, 임금 수, 향할 수, 자백할 수 髓=뼛속 기름 수, 마음속 수 鬚=턱수염 수, 아랫수염 수 [숙] 俶=비롯할 숙, 처음 숙, 지을 숙 倏=잠간 숙, 홀연 숙, 개의 빨리 달리는 모양 숙 倐=倏의 俗字 儵=잿빛 숙, 남해 임금 숙, 독화당할 숙, 갑자기 숙 叔=아재비 숙, 주울 숙, 어릴 숙, 끝 숙 塾=사랑방 숙, 기숙사 숙 夙=이를 숙, 이미 숙, 빠를 숙, 일찍 일어날 숙 婌=궁녀 벼슬이름 숙 孰=누구 숙, 어느 숙, 살필 숙, 익을 숙 宿=잘 숙, 지킬 숙, 머물 숙 橚=길고 꼿꼿할 숙 淑=맑을 숙, 착할 숙, 사모할 숙 熟=익힐 숙, 삶을 숙, 풍년들 숙 肅=공손할 숙, 공경할 숙, 경계할 숙 蓿=거여목 숙 驌=좋은말 숙, 숙상말 숙 骕=驌과 同字 鷫=숙상새 숙 [순] 侚=좇을 순, 빠를 순, 조리 돌릴 순 峋=후미질 순 巡=돌 순, 순행할 순, 두루 순 徇=조리 돌릴 순, 따라 죽을 순, 빠를 순, 부릴 순 循=좇을 순, 의지할 순, 돌 순, 차례 순, 돌아다닐 순 恂=진실할 순, 믿을 순, 온공스러울 순 旬=열흘 순, 두루할 순, 고를 순, 가득할 순, 요사스런 별 순 栒=경쇠걸이 순, 순나무 순 楯=난간 순, 방패 순, 뺄 순, 상여 순 橓=무궁화나무 순 殉=죽은 사람을 따라 죽을 순, 구할 순, 좇을 순 洵=웅덩이물 순, 소리없이 눈물흘릴 순, 믿을 순 淳=맑을 순, 순박할 순 狥=徇의 俗字 珣=옥그릇 순, 옥 이름 순 盹=눈 감을 순, 졸 순 盾=방패 순, 벼슬이름 순 眴=눈짓할 순 瞬=눈 깜작일 순, 잠깐 순 笋=초목 성할 순 筍=죽순 순, 대싹 순 紃=신에 실선 두를 순, 실 띠 순, 법 순, 좇을 순 純=실 순, 순수할 순, 온전할 순, 부드러울 순 肫=광대뼈 순, 정성스러울 순 脣=입술 순 舜=순임금 순, 무궁화 순 荀=풀 이름 순, 성씨 순 蓴=순나물 순 蕣=무궁화 순 詢=꾀할 순, 물을 순, 믿을 순 諄=거듭 일러줄 순, 지극할 순 醇=전국술 순, 두터울 순, 삼갈 순, 순수할 순 錞=사발종 순 順=좇을 순, 부드러울 순, 차례 순, 성씨 순 馴=길들일 순, 착할 순 駨= 駿=준마 순, 클 순, 빠를 순, 높을 순 鬊=머리 풀어헤칠 순 鶉=메추라기 순, 옷 해질 순 [술] 噊=위태할 술 戌=개 술, 열한째 지지 술, 때려 부술 술 絉= 術=재주 술, 심술부릴 술, 술법 술 述=이을 술, 좇을 술, 조회할 술, 밝힐 술 鉥=돗바늘 술, 인도할 술 [숭] 崇=높을 숭, 공경할 숭, 마칠 숭, 산이름 숭 崧=산 불끈 솟을 숭, 산 웅장할 숭, 산이름 숭 嵩=높을 숭, 산이름 숭 菘=배추 숭 [쉬] 倅=버금 쉬, 아직 벼슬자리에 오르지 않은 아들 쉬, 원님 쉬 晬=돐 쉬, 첫 생일 쉬 殳= 泅= 淬=칼 담글 쉬, 물들일 쉬, 범할 쉬 焠=물들일 쉬, 칼날 물에 담글 쉬, 지질 쉬, 태울 쉬 [슬] 厀=膝의 本字 瑟=비파 슬, 거문고 슬, 깨끗한체할 슬, 바람소리 슬 膝=무릎 슬, 종지뼈 슬, 치슬말 슬 虱=蝨과 同字 蝨=이 슬 [습] 塍= 慴= 拾=주울 습, 거둘 습, 팔찌 습, 벼슬이름 습 湿=濕과 同字 濕=젖을 습, 소 귀 벌룩거릴 습, 근심 습 熠=환할 습, 선명할 습, 반딧불 반짝거릴 습 習=익힐 습, 거듭 습 褶=슬갑 습 襲=옷 덧입을 습, 벼슬 대물릴 습, 반복할 습, 합할 습, 염습할 습, 엄습할 습 隰=진펄 습 [승] 丞=이을 승, 도울 승, 벼슬의 이름 승, 향상할 승 乗=乘의 俗字 乘=오를 승, 곱할 승, 셈하는 단위 승, 같은 물건 네 개 승 僧=중 승 勝=이길 승, 경치가 좋을 승, 가질 승 升=되 승, 오를 승, 피륙의 짜인 날을 세는 단위 새 승, 괘 이름 승 呏=용량의 단위 갤런(gallon) 승 承=받들 승, 이을 승, 도울 승, 차례 승 昇=해 돋을 승, 풍년들 승 甸=다스릴 승, 수레 승 繩=노끈 승, 법 승, 다스릴 승, 이을 승 蠅=파리 승 陞=오를 승, 올릴 승 鬙=터럭 더부룩할 승 [시] 乨= 使= 侍=모실 시, 가까울 시, 좇을 시 偲=간절히 책망할 시, 살피고 힘쓸 시, 굳셀 시 兕=외뿔난 소 시 凘=성에 시 匙=숟가락 시, 열쇠 시 卶=크게 경사스러울 시 厮=부릴 시, 마부 시, 나눌 시 咶=핥을 시, 이야기할 시 啻=뿐 시, 쯤 시 嘶=말 울 시, 목 쉴 시, 울부짖을 시 塒=홰 시 始=비로소 시, 처음 시, 시작할 시, 별이름 시 媤=시집 시 寺=내관 시 尸=시동 시, 주검 시 屍=주검 시, 송장 시 屎=똥 시 市=저자 시, 흥정할 시, 집 많은 동리 시 廝=부릴 시, 천할 시, 마부 시 弑=윗사람 죽일 시 弒=弑의 本字 恃=믿을 시, 의지할 시, 어머니 시 提=떼지어 날 시, 고을이름 시 施=베풀 시, 쓸 시, 더할 시, 안팎 곱사등이 시, 버릴 시, 줄 시, 은혜 시, 공로 시 是=이 시, 바를 시, 곧을 시 昰=是와 同字 時=때 시, 끼니 시, 이 시, 엿볼 시, 가끔 시 枲=수삼 시, 도꼬마리 시 枾=柹의 本字 柴=섶 시, 불 땔 나무 시, 시제지낼 시 柹=감 시 柿=柹의 俗字 澌=물 잦을 시, 다할 시 猜=의심낼 시, 시기할 시, 두려워할 시, 사나울 시 矢=살 시, 소리살 시, 곧을 시, 베풀 시, 똥 시 示=보일 시, 바칠 시, 가르칠 시 禔=복 시, 편안할 시 緦=보름새베 시, 시마복 시, 석달복 시 翅=날개 시, 깃 시, 뿐 시 翤= 茬= 蒔=소회향 시, 모종낼 시 蓍=뺑대쑥 시, 시초 시 視=볼 시, 견줄 시, 본받을 시, 대접 시 試=시험할 시, 더듬을 시, 비교할 시 詩=귀글 시, 풍류가락 시, 받들 시 諟=이 시, 살필 시, 다스릴 시 諡=행장 시, 시호 시 諰=눈 휘둥글할 시, 곧은말 시 豉=메주 시, 콩자반 시 豕=돼지 시, 돝 시 豺=승냥이 시, 늑대 시 釃=술 거를 시 鍉=숟가락 시, 열쇠 시 顋=뺨 시, 볼 시 飴=기를 시 鰣=준치 시 [식] 喰=먹을 식 埴=찰진흙 식, 흙 이길 식, 더듬어 걸을 식 媳=며느리 식 寔=이 식, 참 식, 뿐 식 式=법 식, 쓸 식, 제도 식, 수레 앞 가로막대 식 息=숨쉴 식, 그칠 식, 자식 식, 기를 식 拭=닦을 식, 다듬을 식 栻=점판 식 植=심을 식, 세울 식, 초목 식 殖=날 식, 심을 식, 성할 식 湜=물 맑을 식, 엄숙할 식 熄=불 꺼질 식, 없어질 식, 마칠 식 篒= 蝕=벌레먹을 식, 일식 식, 월식 식 識=알 식 軾=수레앞 가로막이 나무 식, 수레 안에서 절할 식 食=밥 식, 먹을 식, 씹을 식, 제 식, 헛말할 식 飾=꾸밀 식, 문채날 식, 분 바를 식 [신] 伩=信과 同字 伸=펼 신, 다스릴 신, 기지개 신 侁=떼지어 갈 신 信=믿을 신, 밝힐 신, 맏길 신, 이틀 밤을 잘 신, 사신 신 兟=나아갈 신, 총총 들어설 신 卂=빠를 신, 급히 날 신 吲=비웃을 신 呻=읊조릴 신, 끙끙거릴 신 哂=빙그레 웃을 신, 비웃을 신 噺=이야기 신 囟=숨구멍 신, 정수리 신 姺=나라이름 신 娠=아이밸 신, 마부 신 宸=집 신, 처마 신, 대궐 신 愼=삼갈 신, 정성스러울 신, 고요할 신 新=새 신, 처음 신, 고울 신 晨=샛별 신, 아침을 아뢸 신 汛=물뿌릴 신 瀋= 燼=깜부기불 신, 불똥 신, 재난의 뒤 신 申=펼 신, 기지개켤 신, 거듭 신, 아홉째 지지 신, 원숭이 신 矧=하물며 신, 잇속 드러날 신 神=천신 신, 영검할 신, 신명 신, 정신 신 紳=큰 띠 신, 벼슬아치 신 脤=사직제 지낸 고기 신 腎=콩팥 신, 불알 신, 자지 신 臣=신하 신, 두려울 신 莘=약 이름 신, 많은 모양 신, 나라이름 신 薪=섶 신, 땔나무 신, 월급 신, 성씨 신 藎=갈골 신, 나아갈 신, 남을 신 蜃=큰 조개 신, 이무기 신, 술잔 신 訊=물을 신, 다스릴 신, 죄 조사할 신, 알릴 신, 꾸짖을 신 誶=물을 신 贐=노자 신, 노수 신 身=몸 신, 아이 밸 신, 몸소 신 辛=매울 신, 고생 신, 여덟째 천간 신 辰=날 신 迅=빠를 신, 억셀 신 頣=눈들고 볼 신 顖=囟의 俗字 駪=말 우물거릴 신, 빨리 걸을 신 辰=날 신 神=천신 신, 영검할 신, 신명 신, 정신 신 [실] 失=잃을 실, 그르칠 실 実=實의 略字 室=집 실, 아내 실 實=열매 실 悉=모두 실 蟋=귀뚜라미 실 飋=쓸쓸한 바람 실 [심] 伈=두려워할 심 吢=개가 토할 심 審=살필 심 尋=찾을 심 心=마음 심 梣=물푸레나무 심 沁=스며들 심 沈=성 심 沉=沈과 同字 深=깊을 심 潯=물가 심 燖=삶을 심 甚=심할 심, 무엇 심 芯=등심초 심 葚=뽕나무 열매 심 諗=고할 심, 생각할 심, 꾀할 심 諶=참 심 鐔=칼날 아래 코등이 심 鱏=칼철갑상어 심 鱘=심어 심 沈=성 심 [십] 什=열 사람 십 兙= 十=열 십, 전부 십 卌=사십 십 拾=十의 갖은자 辻=네거리 십 拾=十의 갖은자 [쌍] 双=雙의 略字 雙=짝 쌍 [씨] 氏=성 씨 [아] 丫=가장귀 아 亜=亞의 略字 亞=버금 아 俄=갑자기 아 俹=기댈 아, 의지할 아, 거만할 아 児=兒의 略字 兒=아이 아 厊=어긋날 아 哦=놀람의 어조사 아 唖=啞의 略字 唲=선웃음칠 아 啊=사랑할 아, 어조사 아 啞=벙어리 아, 놀랄 아 娥=예쁠 아 娿=아리따울 아 婀=娿와 同字 峨=산 높을 아 峩=峨와 同字 御=맞을 아 我=자기 아 牙=어금니 아, 대장 기 아 猗=부드러울 아 疴=앓을 아 砑=갈 아 笌=대싹 아 芽=싹 아 莪=지칭개 아 蛾=누에나방 아 衙=마을 아 訝=맞아들일 아, 의심할 아 迓=마중할 아 錏=투구의 목가림 아 阿=언덕 아, 아름다울 아, 알랑거릴 아 雅=아담할 아 餓=주릴 아 鴉=갈가마귀 아, 검을 아 鵝=거위 아 鵞=鵝와 同字 [악] 偓=거리낄 악 剭=형벌할 악 卾=윗턱 악 咢=놀랄 악 喔=닭 우는 소리 악, 아첨해 웃는 소리 악 噩=놀랄 악 堊=흰 흙 악 岳=큰 산 악 嶽=높은 산 악 幄=장막 악 悪=惡의 略字 惡=나쁠 악 愕=놀랄 악 握=잡을 악, 손아귀 악 樂=풍류 악 渥=두터울 악 腭=잇몸 악 萼=꽃받침 악 葯=구리때 잎 악, 동일 악 覨=오래 볼 악 諤=직언할 악 鄂=나라이름 악 鍔=칼날끝 악 顎=턱 악 鰐=악어 악 鶚=물수리 악 齶=잇몸 악 齷=악착할 악 [안] 侒=편안할 안 偐=거짓 안 唵= 喭=추솔할 안 安=편안할 안, 어찌 안 岸=물가 언덕 안 按=살필 안, 어루만질 안 晏=늦을 안, 편안할 안 案=책상 안, 생각할 안 桉=案과 同字 殷=검붉을 안 犴=들개 안 眼=눈 안 諺=용맹스러울 안, 뻐득뻐득할 안 贋=가짜 안 閼= 雁=鴈과 同字 鞍=안장 안 顏=얼굴 안, 색채 안 顔=顏과 同字 鮟=아귀 안 鴈=기러기 안 [알] 嘎=새소리 알 嘠=嘎의 俗字 戞=창 알 按=막을 알 揠=뽑을 알 斡=돌릴 알, 주선할 알 歹=뼈 앙상할 알, 잔골 알, 살 발린 뼈 알 穵=구멍 알 訐=들추어 낼 알 謁=아뢸 알, 뵈올 알 軋=수레 삐걱거릴 알 遏=막을 알 頞=콧마루 알 鴶=뻐꾸기 알 [암] 啽=잠꼬대 암 媕=머뭇거릴 암 岩=巖의 俗字 嵒=嵓과 同字 嵓=바위 암, 가파를 암 巖=바위 암, 험할 암 庵=초막 암 揜=덮을 암 晻=어두울 암 暗=어두울 암, 몰래 암, 어리석을 암 癌=종양 암 腤=고기 삶을 암 菴=암자 암 葊=풀이름 암 蓭=암자 암 諳=욀 암 闇=어두울 암, 어리석을 암 頷=끄덕일 암 馣=향기로울 암 黯=어두울 암 [압] 儑=잔피할 압, 용렬할 압 匎=사치스럽지 않을 압, 검약할 압 匼= 压= 唈=숨 느껴 쉴 압 圧=壓의 略字 壓=누를 압 押=수결 둘 압, 누를 압 狎=친근할 압, 업신여길 압 鴨=오리 압 [앙] 仰=우러를 앙 佒=몸 거북할 앙 卬=자기 앙 咉=목메어 슬피 울 앙 坱=티끌 앙 央=가운데 앙 怏=원망할 앙 昂=높을 앙 昻=오를 앙, 밝을 앙 殃=재앙 앙 泱=끝없을 앙 盎=동이 앙 秧=모 앙 鞅=가슴걸이 앙, 소고삐 앙 鴦=암원앙새 앙 [애] 僾=어렴풋할 애 厓=언덕 애, 물가 애 呃=재채기할 애 哀=슬플 애, 가여울 애 哎=애통하는 소리 애 唉=대답하는 소리 애 唲=어리광 부릴 애, 응석 부릴 애 啀=물어뜯을 애 喝=목 쉴 애 嗄=목 쉴 애 嘊=비틀거릴 애 噫=트림할 애 噯=트림할 애 埃=티끌 애, 속세 애 娭=계집종 애 崕=崖와 同字 崖=낭떠러지 애 愛=사랑 애 挨=밀칠 애 捱=막을 애 曖=희미할 애 欸=한숨쉴 애 涯=물가 애 漄=물가 애 獃=어리석을 애 皚=흴 애 睚=눈흘길 애 瞹=흐릿할 애 碍=礙의 俗字 磑=맷돌 애 礙=막을 애 艾=쑥 애 薆=숨겨질 애 藹=화기로울 애 阨=隘와 同字 隘=좁을 애 靄=아지랭이 애 靉=구름낄 애 騃=어리석을 애, 말달릴 애 [액] 厄=재앙 액 呝=울 액 嗌=呝과 同字 戹=좁을 액 扼=움켜쥘 액 掖=겨드랑이에 낄 액 搤=움켜쥘 액 液=즙 액 縊=목 맬 액 腋=겨드랑이 액 阨=막힐 액 隘=阨과 同字 額=이마 액, 수량 액 [앵] 嚶=새 소리 앵 嫈=예쁠 앵 桜=벚나무 앵 櫻=앵두나무 앵 罃=술병 앵 罌=술병 앵 鶯=꾀꼬리 앵 鷪=꾀꼬리 앵 鸚=앵무새 앵 [야] 也=단정의 어조사 야 亱= 倻=땅이름 야 偌=성씨 야, 너무 야 冶=단련할 야, 대장장이 야 喏=공손히 대답할 야 埜=들판 야 夜=밤 야 惹=끌릴 야, 어지러울 야 揶=희롱할 야 斜=고을이름 야 椰=야자나무 야 爺=아비 야, 노인 야 耶=의문의 어조야 야, 아비 야 若=땅이름 야, 지혜(범어의 음역) 야 裸= 邪=의문의 어조사 야, 희롱할 야 野=들판 야 若=땅이름 야, 지혜(범어의 음역) 야 [약] 叒=동방귀신나무 약 喲=감탄하는 어조사 약 嫋=가냘플 약 弱=약할 약, 어릴 약 爚=스러질 약 禴=종묘의 여름제사 약 篛=죽순 약 籥=피리 약, 잠글 약 約=대략 약, 맹세할 약, 간소할 약, 맺을 약 若=같을 약, 자네 약, 만약 약 葯=꽃밥 약 蒻=구약나물 약 薬=藥의 略字 藥=약 약 躍=뛸 약 鑰=자물쇠 약 鰯=멸치 약, 정어리 약 鶸=댓닭 약, 투계 약 龠=피리 약 掠=노략질할 약 略=간략할 약, 노략질할 약, 잔꾀 약 [양] 佯=거짓 양, 어정거릴 양 勨=느즈러질 양, 힘쓸 양, 움직일 양 勷=급할 양 嚷=떠들 양 壌=壤의 略字 壤=흙 양, 풍년들 양 嬢=孃의 略字 孃=계집아이 양 徉=배회할 양 恙=근심 양 揚=드높일 양, 칭찬할 양 攘=물리칠 양, 빼앗을 양 敭=오를 양 暘=해 돋을 양 楊=갯버들 양 樣=모양 양, 모범 양 洋=큰 바다 양, 넘칠 양 漾=물결 출렁거릴 양 瀁=물결 일렁일 양 瀼=이슬 많은 모양 양, 강이름 양 烊=구울 양, 녹일 양 煬=구울 양 痒=가려울 양, 옴 양 瘍=머리헐 양, 종기 양 癢=가려울 양 眻=눈 아름다울 양 禳=푸닥거리할 양 穰=풍년들 양 羊=양 양 蘘=양하 양 襄=오를 양, 장사지낼 양 詳=거짓 양 讓=사양할 양 輰=상여수레 양 釀=술 빚을 양 鑲=거푸집 속 양 陽=볕 양, 드러낼 양, 시월 양, 거짓 양 颺=날릴 양, 높일 양 養=기를 양, 다스릴 양, 봉양할 양 驤=날뛰는 말 양 亮=밝을 량, 임금의 상중 량 兩=두 량 凉=서늘할 량 梁=들보 량, 다리 량 糧=양식 량 良=어질 량, 좋을 량, 남편 량 諒=헤아릴 량 量=헤아릴 량, 용량 량 [어] 唹=고요히 웃을 어 圄=가둘 어 圉=마부 어, 변방 어 御=거느릴 어 敔=금할 어, 풍류그칠 어 於=방향의 어조사 어, 대신할 어 淤=앙금 어, 진흙 어 漁=물고기 잡을 어 瘀=어혈질 어 禦=막을 어, 그칠 어 語=말씀 어 飫=먹기 싫을 어, 배부를 어 馭=말 부릴 어 魚=물고기 어 齬=이 어긋날 어 [억] 億=억 억, 편안할 억, 이바지할 억, 헤아릴 억, 인민 억 憶=생각 억 抑=누를 억, 억울할 억 檍=참죽나무 억, 박달나무 억, 싸리나무 억 繶=땋은 노 억 臆=가슴 억, 가득할 억 [언] 偃=자빠질 언 傿=鄢과 同字 匽=숨길 언, 길 곁 언, 한데 뒷간 언 唁=위문할 언 喭=조문할 언 嘕=기꺼워할 언, 즐거워할 언, 빙그레할 언 堰=방죽 언 嫣=생긋생긋 웃을 언 彥=착한 선비 언, 클 언 彦=彥과 同字 焉=어찌 언, 의심쩍을 언 言=말씀 언, 자기 언, 우뚝할 언 諺=상말 언 讞=죄 의논할 언 這=맞이할 언 鄢=땅이름 언 鼴=두더쥐 언, 소 같은 큰 쥐 언 鼹=鼴과 同字 [얼] 乻= 噦=재채기할 얼 孼=첩자식 얼, 요물 얼 孽=孼과 同字 臬=법 얼, 문지방 얼, 과녁 얼 蘖=그루터기 얼 隉=위태할 얼 [엄] 俺=자기 엄, 클 엄 儼=공경할 엄 剦= 厂=굴바위 엄, 기슭 엄 厱=언덕 비탈 엄 厳=嚴과 同字 噞=고기 우물거릴 엄 嚴=굳셀 엄, 공경할 엄, 엄할 엄 奄=문득 엄, 가릴 엄, 그칠 엄, 오랠 엄 崦=해 지는 산 이름 엄 巖=높을 엄 广=바윗집 엄 掩=거둘 엄, 가릴 엄 揜=찾아가질 엄, 곤박할 엄 曮=해 다니는 길 엄 欕=엄나무 엄 淹=담글 엄, 오래머물 엄 罨=그물 엄 醃=절일 엄, 김치 엄 閹=고자 엄, 내시 엄 [업] 俺=자기 업, 클 업 嶪=산이 높고 웅장할 업 嶫=嶪과 同字 業=일 업, 위태할 업, 씩씩할 업, 벌써 업, 공경할 업 鄴=땅이름 업, 성씨 업 [엇] 旕=땅이름 엇, 엇 엇 [에] 恚=성낼 에, 원망할 에 曀=음산할 에, 가리울 에 [여] 与=與와 同字 予=자기 여 伃=궁녀 벼슬이름 여, 아름다울 여 余=자기 여, 남을 여 侞=온순할 여 如=같을 여, 만약 여, 어떠할 여, 이를 여 歟=그런가할 어조사 여 汝=물 이름 여, 물에 젖을 여 玙= 璵=보배옥 여 礖=여돌 여 絮=성씨 여 舁=마주들 여 與=너울너울할 여, 더불어 여, 같을 여, 미칠 여 艅=나룻배 여 茹=띠 뿌리 여, 받을 여, 헤아릴 여 蘆=꼭두서니 려 輿=수레바탕 여, 짐질 여 轝=輿와 同字 錄=사실할 려 録=録와 同字 餘=남을 여, 나라이름 여 勵=힘쓸 려, 가다듬을 려 呂=풍류 려, 등골뼈 려, 성씨 려 女=계집 녀, 시집보낼 녀 廬=초가 려, 움막 려 旅=나그네 려, 베풀 려 濾=씻을 려, 맑을 려 礪=돌 단단할 려 閭=마을 려 驪=가라말 려, 나라이름 려, 산이름 려 麗=고울 려, 빛날 려, 베풀 려 黎=무리 려, 동틀 려 [역] 亦=또 역, 모두 역 伇=役의 古字 圛=맴돌 역 域=경계 역, 범위 역 嶧=연달아 있는 산 역 役=부릴 역, 국경 지킬 역 懌=기꺼울 역 易=바꿀 역 淢=빨리 흐를 역 疫=염병 역 繹=삭일 역, 베풀 역, 실 끝 찾을 역 訳=譯의 略字 譯=통변할 역, 번역할 역 逆=거스를 역 閾=문지방 역 駅=驛의 略字 驛=잇닿을 역, 쌀 뾰족뾰족할 역, 역말집 역 力=힘 력, 부지런할 력 曆=셀 력, 세월 력 歷=지낼 력, 겪을 력 轢=수레바퀴에 치일 력, 서로 부닥칠 력 [연] 偄=연약할 연, 공손할 연 兖=兗의 俗字 兗=고을이름 연, 믿을 연, 단정할 연 唌=참소할 연 嘫=대답할 연 噮=몹시 달 연 嚥=침 삼킬 연, 목구멍 연 囦=물 깊을 연 埏=땅 가장자리 연 堧=빈 땅 연 妍=姸과 同字 姢=娟과 同字 姸=고을 연, 사랑스러울 연 娟=어여쁠 연, 춤추는 모양 연 嬿=아름다울 연 宴=잔치할 연, 편안할 연 延=미칠 연, 닿을 연 悁=분할 연, 근심할 연 挻=당길 연, 달아날 연, 손바닥으로 칠 연 捐=버릴 연, 병들어 죽을 연 掾=아전 연, 기인할 연 揀=가릴 련, 분별할 련 曣=더울 연, 청명할 연 椽=서까래 연 櫞=연나무 연 沇=물 졸졸 흐를 연 沿=물 따라 내려갈 연, 좇을 연 涎=침 연, 물 졸졸 흐를 연 涓=물방울 떨어질 연, 조촐할 연 淵=못 연, 깊을 연, 북소리 둥둥할 연, 모래톱 연 渷=물 이름 연 演=펼칠 연, 긴 물줄기 연, 통할 연, 윤택할 연, 넓힐 연 烟=煙과 同字 焔= 焰= 然=불사를 연, 그러할 연, 허락할 연, 그러나 연 煙=연기 연 燃=불사를 연, 연등절 연 燕=제비 연, 편안할 연, 잔치 연, 나라이름 연 研=硏과 同字 硏=연마할 연 硯=벼루 연, 돌 연 筵=대자리 연 緣=인연 연, 서두를 연 縁=緣과 同字 縯=길 연, 늘일 연 羡= 羨=광중길 연 臙=목구멍 연, 연지 연 莚=만연할 연, 풀 이름 연 蜵=우렁찰 연, 벌레 이름 연 衍=성할 연, 넓을 연, 물이 넘칠 연, 상자 연, 아름다울 연, 흐를 연 讌=잔치 연, 모여 말할 연 豣=노루 연 軟=부드러울 연 鉛=납 연, 분 연 鳶=솔개 연 鷰=제비 연, 씨름 연 年=해 년, 나이 년, 나아갈 년 憐=불쌍할 련, 사랑할 련 戀=생각할 련, 사모할 련 撚=잡을 년, 닦을 년, 밟을 년, 손 끝으로 비빌 년 漣=물 놀이칠 련, 눈물 줄줄 흘릴 련 煉=쇠 불릴 련, 반죽할 련 璉=종묘 제기 련 秊=年의 本字 練=이길 련, 익힐 련, 겪을 련 聯=잇닿을 련, 관계할 련 輦=당길 련, 궁중의 길 련 蓮=연밥 련, 연꽃 련 連=이을 련, 끌릴 련 鍊=불린 쇠 련, 단련할 련 [열] 吶=말 느리게 할 열, 함성 지를 열 呐= 咽=목 멜 열, 막힐 열 噎=목 멜 열 悅=즐거울 열, 복종할 열, 성씨 열 悦=悅의 略字 熱=뜨거울 열, 쏠릴 열 說=기꺼울 열 説=說의 略字 閱=겪을 열, 군대 점호할 열, 용납할 열 閲=閱의 略字 列=벌릴 렬, 무리에 들어갈 렬, 항렬 렬, 베풀 렬 劣=용렬할 렬, 못날 렬, 어릴 렬, 서툴 렬 咽=목 멜 열, 막힐 열 烈=불 활활 붙을 렬, 빛날 렬, 업적 렬, 아름다울 렬, 사나울 렬 裂=찢어질 렬, 비단 자투리 렬 說=기꺼울 열 [염] 冄=冉과 同字 冉=가는 털 늘어질 염, 남생이 등 언저리 염, 침노할 염 厭=넉넉할 염, 아름다울 염, 게으를 염, 만족할 염, 미워할 염 塩=鹽의 俗字 懕=편안할 염 扊=문 빗장 염 染=꼭두서니 염, 물들일 염 檶=개수통 염 檿=산뽕나무 염 灎=灩의 俗字 灧=灩의 俗字 灩=물 그득할 염, 물결 출렁거릴 염 炎=불꽃 염, 임금의 호 염 琰=아름다운 옥 염, 비취옥 염 稔=풍년들 염, 오랠 염, 해 염 艶=고울 염, 얼굴 탐스러울 염 艷=艷의 本字 苒=풀 우거질 염, 덧없을 염 釅=술맛 텁텁할 염 閻=마을 염, 항간 염, 저승 염 饜=싫을 염, 물릴 염 髥=구레나룻 염 髯=髥의 俗字 魘=잠꼬대할 염 鹽=소금 염, 절일 염, 후렴 염 黶=검은 사마귀 염 廉=맑을 렴, 조촐할 렴, 청렴할 렴, 살필 렴 念=생각할 념, 읽을 념, 스물 념, 대단히 짧은시각 념 捻=손가락으로 찍을 념 殮=염할 염 簾=발 렴 [엽] 偞=가벼울 엽, 낮을 엽, 얼굴 예쁠 엽 僷=얼굴 예쁠 엽, 펴지 않을 엽 厭=제사할 엽, 모을 엽, 덜 엽, 누를 엽, 축하할 엽, 괴로울 엽, 숨길 엽 喦=땅 이름 엽, 다툴 엽 囁=소곤거릴 엽 摂= 攝=가질 녑, 고요할 녑 曄=빛날 엽, 번개 번쩍거릴 엽 曅=曄과 同字 熀=불빛 이글이글할 녑 燁=불 이글글할 엽, 번쩍번쩍할 엽 爗=불 이글글할 엽, 번쩍번쩍할 엽 葉=잎 엽, 세대 엽, 성씨 엽 靨=웃는 볼 옴쏙 들어갈 엽, 얼굴의 검은 사마귀 엽 獵=사냥할 렵, 진동할 렵, 어긋날 렵, 바람소리 렵 [영] 咏=노래할 영, 읊을 영 営=榮과 同字 塋=무덤 영 嬰=어릴 영, 더할 영, 머리치장할 영, 물요괴 영 嬴=성씨 영, 풀어낼 영, 가득할 영, 아름다울 영 嶸=산 높을 영 影=그림자 영, 형상 영 映=비칠 영, 빛날 영 景=그림자 영, 옷 영 暎=비칠 영 栄=榮과 同字 楹=기둥 영, 하관들 영 榮=영화로울 영, 오동나무 영, 추녀 영, 꽃다울 영 永=길 영, 오랠 영 泳=헤엄칠 영 浧=잠길 영, 앙금 영 渶=물 맑을 영 溁=濚과 同字 潁=물 이름 영, 성씨 영 濚=물 돌아나갈 영 濴=물 졸졸 흐를 영 瀛=큰 바다 영, 신선 사는 산 영 瀯=물소리 영, 물 돌아나갈 영, 물웅덩이 영 煐=빛날 영 營=지을 영, 헤아릴 영, 다스릴 영, 진 영 獰=모질 녕, 영악할 녕, 삽살개 털 녕 瑛=옥빛 영, 수정 영 瑩=귀막이 옥 영, 밝을 영 瓔=옥돌 영, 구슬 목걸이 영 癭=목 혹 영 盈=가득할 영, 넘칠 영, 물 흐를 영 碤=물 속 돌 영 穎=이삭 영, 송곳 끝 영, 빼어날 영 縈=얽힐 영, 맬 영 纓=갓끈 영, 말 가슴걸이 영, 얽힐 영 英=꽃부리 영, 영웅 영, 구름 뭉게뭉게 일어날 영, 아름다울 영 蠑=도마뱀 영 詠=읊을 영 贏=이문 남길 영, 멜 영, 자랄 영 迎=맞을 영 郢=땅이름 영 鍈=방울소리 영 锳=鍈과 同字 霙=눈꽃 영, 구름 피어오를 영 韺=풍류이름 영 令=하여금 령, 시킬 령, 가령 령, 개 목소리 령, 벼슬이름 령 囹=감옥 령 寧=편안할 녕, 차라리 녕, 어찌 녕 嶺=고개 령, 봉우리 령 怜=영리할 령 玲=옥소리 쟁그렁거릴 령, 아롱아롱할 령, 정교할 령 瑩=귀막이 옥 영, 밝을 영 羚=영양 령, 큰 뿔 양 령 聆=들을 령, 깨달을 령 鈴=방울 령 零=부서질 령, 비뚝비뚝 떨어질 령, 셈 나머지 령 靈=신령 령, 혼백 령, 좋을 령 領=옷깃 령, 고개 령, 거느릴 령, 받을 령 [예] 乂=풀 벨 예, 다스릴 예 倪=어릴 예, 도울 예, 끝 예 兌=날카로울 예 兑= 刈=풀 벨 예, 죽일 예 勩=수고로울 예 医=화살통 예 叡=밝을 예, 임금 예, 어질 예 呭=말 수다스럴 예 囈=잠꼬대할 예, 헛소리할 예 嫛=유순할 예, 갓난아이 예 拽=당길 예 掜=부칠 예, 비길 예, 잡을 예, 당길 예 曳=끌 예, 당길 예, 천천히 할 예 枘=자루 예 汭=물 이름 예, 물 굽이 예 泄=내칠 예, 날개 훨훨칠 예, 흩을 예 洩=퍼질 예, 날개 훨훨칠 예 濊=흐릴 예, 물 넘칠 예 猊=사자 예 獩=민족이름 예 睨=흘겨볼 예, 해 기울어질 예 睿=슬기로울 예, 밝을 예, 통할 예 瞖=눈에 백태 낄 예 穢=더러울 예, 거칠 예 繄=검푸른 비단 예, 탄식하는 소리 예 翳=어조사 예, 깃 일산 예, 가려 숨길 예, 새이름 예 芮=풀 뾰족뾰족할 예, 물가 예, 방패끈 예, 나라이름 예, 성씨 예 芸= 苅=벨 예, 자를 예 蕊=꽃술 예, 꽃 예 蕋=蕊의 俗字 薉=더러울 예 藝=재주 예, 글 예, 가늠할 예, 극진할 예, 심을 예 蘂=蕊와 同字 蚋=모기 예 蜺=말매미 예, 암무지개 예 裔=옷 뒷자락 예, 변방 예, 후손 예 詣=이를 예, 나아갈 예, 학문 통달할 예 誉=誉와 同字 譽=칭찬할 예, 이름날 예, 즐길 예 豫=기쁠 예, 편안할 예, 미리 예 銳=날카로울 예, 까끄라기 예 鋭=鋭와 同字 霓=암무지개 예 預=미리 예, 참여할 예 鯢=암고래 예 鷖=갈매기 예, 봉황 예 麑=아기사슴 예, 사자 예 例=본보기 례, 견줄 례, 대부분 례 禮=예도 례, 인사 례 醴=단술 례, 고을이름 례 隸=종 례, 노비 례, 검열할 례 [옌] 円=圓의 俗字 [오] 五=다섯 오 仵=짝 오, 같을 오 伍=五의 갖은자, 다섯 사람 오, 무리 오 俉=맞이할 오 俣=갈래질 오 傲=업신여길 오, 즐길 오 午=낮 오, 남쪽 오, 말 오 吳=오나라 오, 큰소리 지를 오, 성씨 오 吴=吳와 同字 吾=자기 오, 아들 오 呉=吳와 同字 唔=글 읽는 소리 오 啎=거스를 오 嗚=탄식할 오 嗷=여럿이 걱정할 오 嗸=슬픈 소리 오 噁=성낼 오 圬=흙손 오 塢=산 언덕 오, 마을 오 墺=방 구들 오, 물가 언덕 오 夭=끊어 죽일 오, 어릴 오 奥=奧와 同字 奧=속 오, 비밀 오, 깊을 오 娛=즐거울 오 娯=娛와 同字 媪=할미 오, 땅귀신 오 嫯=업신여길 오 寤=잠 깨어날 오, 깨달을 오 忢= 忤=거스릴 오, 미워할 오 悟=깨우칠 오 悪=惡의 略字 惡=미워할 오, 부끄러울 오 慠=거만할 오 懊=원망할 오, 번뇌할 오 捂=부닥칠 오, 거스릴 오 敖=희롱할 오, 거만할 오 於=오홉다 외칠 오 旿=밝을 오 晤=밝을 오, 만날 오 梧=머귀나무 오, 버틸 오 汙=汚와 同字 汚=더러울 오, 웅덩이 오 污=汚와 同字 澳=깊을 오, 물 이름 오 烏=까마귀 오, 검을 오, 어찌 오, 탄식할 오 熬=볶을 오, 애 끓는 소리 오 獒=사나운 개 오 窹=아궁이 오 筽=버들 고리 오 聱=못 들은채 할 오, 말 더듬거릴 오 茣=차조기 오 蜈=지네 오 襖=도포 오 誤=그릇할 오 謷=중얼거릴 오, 거만할 오 迂= 迃= 迕=만날 오, 어길 오 遨=노닐 오 鄔=성 이름 오 鏊=번철 오 鏖=무찌를 오, 구리동이 오 隩=감출 오, 물가 언덕 오 驁=준마 오, 깔볼 오 鰲=큰 자라 오 鼇=매우 큰 자라 오 鼯=날다람쥐 오 惡=미워할 오, 부끄러울 오 [옥] 剭=목 벨 옥 墺=방 구들 옥, 물가 언덕 옥 屋=집 옥, 지붕 옥, 거북 덮개 옥 沃=기름질 옥, 부드러울 옥, 손 씻을 옥, 아리따울 옥 澳= 獄=감옥 옥 玉=구슬 옥, 사랑할 옥, 이룰 옥 鈺=보배 옥 鋈=은 올릴 옥 阿=누구 옥 [온] 媼= 愠=慍의 俗字 慍=성낼 온, 병 온 昷=어질 온 氲=氳의 俗字 氳=기운 어릴 온, 기운 성할 온 温=溫의 俗字 溫=따뜻할 온, 부드러울 온 熅=서린 연기 온, 따뜻할 온, 숯불 온 瑥=사람이름 온 瘟=염병 온, 온역 온 稳=穩의 俗字 穏=穩과 同字 穩=편안할 온, 곡식 걷어 모을 온 緼=縕의 俗字 縕=모시 온, 묵은 솜 온 缊=縕과 同字 蕰=薀의 俗字 薀=마름 온, 쌓일 온 藴=蘊의 俗字 蘊=마름 온, 쌓일 온 轀=온량차 온 醖=醞의 俗字 醞=술 빚을 온 鞰= 韞=감출 온, 붉은 빛 온 饂=밀 국수 온 鰮=멸치 온 [올] 乯= 兀=우뚝할 올, 움직이지 않을 올 卼=위태할 올 嗢=목 멜 올 膃=해구 올, 살찔 올 阢=험할 올 兀=우뚝할 올, 움직이지 않을 올 [옹] 喁=물고기 입 오물거릴 옹 嗈=기러기 짝지어 울 옹 嗡=소 울음소리 옹, 벌레소리 옹 噰=화한 소리 옹 壅=막을 옹, 북돋울 옹 廱=벽옹 옹 擁=안을 옹, 품을 옹, 가질 옹 滃=구름 피어 오를 옹, 안개 자욱할 옹 瓮=항아리 옹 甕=항아리 옹, 물장군 옹 癕=등창 옹 禺=땅 이름 옹 罋=甕과 同字 翁=늙은이 옹, 새 목털 아래 옹 蓊=옹풀 옹, 우거질 옹 邕=막힐 옹, 사람이름 옹 雍=조화로울 옹, 학교 옹 雝=조화로울 옹, 학교 옹 顒=우러를 옹 饔=아침밥 옹 [와] 吪=움직일 와, 거짓말 와, 사투리 와 哇=음란한 소리 와, 게울 와 啝= 囮=새 후릴 와 婐=정숙할 와, 단정할 와 枙=옹이 와 洼=물 이름 와 渦=소용돌이 와, 시끄러울 와 猧=와개 와 瓦=질그릇 와, 기와 와 窊=웅덩이 와 窩=굴 와, 움집 와 窪=도랑 와, 깊을 와 臥=누울 와, 쉴 와 萵=상추 와, 부루 와 蛙=개구리 와 蝸=달팽이 와 訛=거짓말 와, 어긋날 와 譌=거짓 와, 와전될 와, 요사스런 말 와 [완] 刓=깎을 완 剜=깎을 완 唍=방긋 웃을 완 园=둥글게 깎을 완 垸=회 섞어 바를 완 妧=좋을 완, 고울 완 婉=순할 완, 예쁠 완, 젊을 완 完=완전할 완, 끝날 완, 지킬 완 宛=어슴푸레할 완, 언덕 위 언덕 완 岏=산 뾰족할 완 忨=탐할 완, 사랑할 완 惋=한탄할 완, 놀라 탄식할 완 梡=네 발 도마 완, 토막나무 완 椀=주발 완, 사발 완 浣=옷 빨 완, 씻을 완 涴=물 굽이쳐 흐를 완, 진흙 묻을 완 玩=희롱할 완, 보배 완 琓= 琬=보석 완, 아름다운 옥 완 盌=은 바리 완 碗=그릇 완 緩=느즈러질 완, 더딜 완 翫=익숙할 완, 싫을 완, 구경할 완 脘=중완 완 腕=팔뚝 완 莞=빙그레 웃는 모양 완 豌=동부 완, 완두 완 関=關과 同字 闗=關의 俗字 關=화살 먹일 완, 문지방 완, 빗장 완 阮=성씨 완 頑=완고할 완, 완악할 완 [왈] 曰=가로되 왈 [왕] 尫=절름발이 왕, 파리할 왕, 천상바라기 왕 往=갈 왕, 옛 왕, 이따금 왕 旺=고울 왕, 해무리 왕, 성할 왕 枉=굽을 왕, 원통할 왕 汪=물 출렁출렁할 왕, 연못 왕 瀇=아득할 왕, 넓을 왕, 고인 물 썪어 냄새날 왕 王=임금 왕, 할아버지 왕 皇=엄숙할 왕 迋=갈 왕, 두려울 왕 迬=往과 同字 [왜] 倭=나라이름 왜 娃=어여쁜 계집 왜, 얼굴 아름다울 왜 媧=여자이름 왜 矮=난장이 왜 蛙=개구리 왜, 음란한 소리 왜 [외] 偎=사랑할 외, 가물거릴 외 外=바깥 외, 다를 외, 잃을 외, 아버지 외 崴=평평치 아니할 외 嵔=산이름 외, 산 높을 외 嵬=산 뾰족할 외, 산 울뚝질뚝할 외 巍=높을 외, 높고 튼 모양 외 歪= 渨=더러울 외 煨=불에 묻어 구울 외, 그슬릴 외, 사람이름 외 猥=더러울 외, 굽을 외, 섞일 외, 개 새끼 셋 낳을 외 畏=두려울 외, 겁낼 외 碨=돌 자갈 땅 외, 바위 옹두라지 외 磈=돌 사닥다리 외 聵=배냇귀머거리 외 隈=모퉁이 외 隗=높을 외, 성씨 외 [요] 么=幺의 俗字 偠=허리 가늘 요 傜=부릴 요, 별이름 요 僥=거짓 요, 난장이 요 凹=오목할 요 匋=기오 굽는 가마 요 吆=애통하는 소리 요 喓=벌레소리 요 嗂=기꺼울 요 坳=凹와 同字 堯=높을 요, 요임금 요 墝=메마른 밭 요, 자갈 땅 요 夭=어여쁠 요, 무성할 요, 재앙 요, 일찍 죽을 요, 뱃속에 든 아이 요, 끊어 죽일 요 妖=요괴로울 요, 생긋생긋 웃는 모양 요 姚=어여쁠 요, 날랠 요, 멀 요 嬈=예쁜체 할 요 尭=堯와 同字 峣=嶢와 同字 嶢=높을 요 幺=작을 요, 어릴 요 徭=부릴 요 徼=돌아다닐 요, 순라 요, 변방 요, 구할 요 拗=고집스러울 요 搖=흔들 요, 회오리 바람 요, 별이름 요 撓=긁을 뇨, 흔들 뇨, 궁할 뇨 擾=길들일 요, 번거로울 요 曜=해 비칠 요, 요일 요 杳= 樂=좋아할 요 橈=노 요 殀=단명할 요 澆=걸찰 요, 물 끌어올 요 燿=비칠 요, 빛날 요 瑤=아름다운 옥 요, 못 이름 요 瑶=瑤와 同字 祅=재앙 요 穾=깊숙할 요, 골방 요 窅=움펑눈 요, 까마득할 요 窈=고요할 요, 깊을 요 窯=기와가마 요, 오지그릇 요 約=약속할 요 縟= 繇=따를 요, 성할 요 繞=얽힐 요, 둘릴 요 耀=빛날 요 腰=허리 요 蕘=나무할 요, 거칠 요 蟯=촌백충 요 褥= 要=구할 요, 살필 요, 언약할 요, 허리 요, 기다릴 요, 부를 요, 반드시 요 謠=노래 요, 소문 요 遙=멀 요, 노닐 요 遶=둘릴 요 邀=맞을 요, 구할 요, 부를 요 陶=화락할 요, 순임금의 신하 요 饒=용서할 요, 배부를 요 鰩=날치 요 鷂=장끼 요, 새매 요 了=마칠 료, 깨달을 료 僚=벗 료, 어여쁠 료 寮=동관 료, 관리 료, 중의 집 료 尿=오줌 뇨 料=말질할 료, 헤아릴 료, 대금 료 樂=좋아할 요 燎=뜰에 세운 횃불 료, 풀 태울 료 療=병 나을 료, 병 고칠 료 蓼=병 나을 료 遼=멀 료, 강이름 료, 나라이름 료 [욕] 嗕=오랑캐 이름 욕 慾=욕심낼 욕, 하고자할 욕 欲=욕심낼 욕, 하고자할 욕 浴=깨끗이할 욕, 못 이름 욕 溽=유월 더위 욕, 무더울 욕 蓐=새싹 욕, 가을 맡은 귀신 욕 谷=성씨 욕, 나라이름 욕 辱=욕될 욕, 굽힐 욕 [용] 俑=시체와 함께 매장하는 허수아비 인형 용 傛=혁혁할 용, 몸 굽힐 용 傭=머슴 용, 지을 용, 삯 용 冗=宂과 同字 勇=날랠 용, 용맹할 용 埇=골목길 용, 길 돋울 용 墉=작은 성 용, 담벽 용 宂=번잡할 용, 바쁠 용, 떠돌아 다닐 용 容=얼굴 용, 감쌀 용, 용서할 용 嵱=봉우리 쭝굿쭝굿할 용 庸=쓸 용, 떳떳할 용, 수고로울 용, 어리석을 용, 물도랑 용 慂=권할 용, 거들어 말할 용 慵=게으를 용 憃=천치 용 桶=곡식 셈하는 단위 휘 용 榕=용나무 용 槦=병기 얹는 시렁 용 涌=물 넘칠 용, 날칠 용 湧=涌의 俗字 溶=물 질펀히 흐를 용, 녹일 용 熔=鎔의 俗字 瑢=패옥소리 용 用=쓸 용, 재물 용, 통할 용 甬=물 솟아 오를 용, 골목길 용, 쇠북 꼭지 용, 곡식 셈하는 단위 휘 용 癰= 硧= 聳=솟을 용, 귀먹을 용, 공경할 용 舂=방아 찧을 용, 쇠북소리 용, 해가 질 용 茸=풀 뾰죽뾰죽 날 용, 못생길 용 蓉=연꽃 용, 약 이름 용 蛹=번데기 용 踴=뛸 용 鎔=불릴 용, 녹일 용, 거푸집 용 鏞=큰 쇠북 용 頌=얼굴 용, 모양 용 鱅=용어 용 龍=용 룡, 임금 룡 [우] 于=갈 우, 여기 우, 만족할 우, 탄식의 어조사 우 亏= 佑=도울 우 偶=짝지울 우, 무리 우, 뜻밖에 우 優=넉넉할 우, 부드러울 우, 나을 우, 결단성 없을 우 区=區와 同字 區=경계 우, 저울 네 눈 우, 숨길 우 又=또 우, 용서할 우 友=벗 우, 합할 우 右=오른쪽 우, 높일 우, 강할 우, 도울 우 吘=부를 우 吽=개 싸울 우, 개 짖는 소리 우 喁=서로 부를 우 噢=슬퍼할 우 噳=뭇 사슴 우물거릴 우 嚘=말 얼버무릴 우, 탄식할 우 宇=집 우, 처마 기슭 우, 하늘 우 寓=살 우, 부탁할 우, 빙자할 우 尤=가장 우, 더욱 우, 탓할 우 愚=어리석을 우, 어두울 우, 업신여길 우 憂=근심 우, 상제될 우, 병 우 旴=해 돋을 우, 새벽 우 樞=느름나무 우 牛=소 우, 별 이름 우 玗=옥돌 우, 우기나무 우 瑀=옥돌 우 盂=바리 우, 사냥하는 진 우 祐=도울 우, 다행할 우 禑= 禹=하우씨 우, 성씨 우, 느릴 우 竽=큰 생황 우 紆=얽힐 우, 굽을 우 羽=깃 우, 오음의 하나 우 耦=쟁기 우, 겨리 우, 짝 맞을 우 耰=고무래 우, 곰방메 우 芋=토란 우 藕=연뿌리 우 虞=염려할 우, 즐거울 우, 갖출 우, 우제 지낼 우 謣=망령되게 말할 우 踽=타달거릴 우 迂=굽을 우, 피할 우, 멀 우 遇=만날 우, 대접할 우, 뜻밖에 우 郵=역말 우, 지날 우, 우편 우 釪=요령 우, 바리때 우 鍝=귀고리 우 隅=모퉁이 우, 기슭 우 雨=비 우 雩=기우제 우 麀=암사슴 우 麌=숫사슴 우 齲=충치 우 羽=깃 우, 오음의 하나 우 [욱] 勖=힘쓸 욱 勗=勖의 譌字 噢=슬퍼할 욱 奥=奧의 俗字 奧=따스할 욱, 모퉁이 욱 彧=빛날 욱, 문채날 욱 旭=빛날 욱, 햇살 치밀 욱, 교만할 욱 昱=햇빛 밝을 욱 栯=산앵두 욱 煜=비칠 욱, 불꽃 욱, 성할 욱 燠=더울 욱 稶=서직 무성할 욱 郁=문채날 욱, 자욱할 욱 頊=머리 굽실거릴 욱, 별이름 욱 [운] 云=이를 운, 움직일 운, 돌아갈 운 喗=입 클 운, 이빨 더러울 운 囩=돌릴 운 惲=의논할 운, 혼후할 운 暈=무리 운, 어지러울 운 橒=나무 무늬 운 殞=죽을 운, 떨어질 운 沄=물 콸콸 흐를 운, 끓을 운 澐=큰 물결 운 熉=누른 빛 운 篔=왕대나무 운 紜=얼크러질 운 耘=길 맬 운 芸=향풀 운, 궁궁이 운, 촘촘할 운, 성씨 운 蕓=운풀 운, 평지 운 運=움직일 운, 운수 운 隕=떨어질 운, 곤란할 운 雲=구름 운, 팔대손 운, 하늘 운 霣=떨어질 운, 천둥에 비 몰아올 운 韵=韻과 同字 韻=울림 운, 소리 맞을 운, 운 운 暈=무리 운, 어지러울 운 [울] 亐= 尉=성씨 울 蔚=고을이름 울 鬰=鬱과 同字 鬱=향기로운 풀 울 [웅] 熊=곰 웅, 빛날 웅 雄=수컷 웅, 영웅 웅, 웅장할 웅 [원] 元=으뜸 원, 착하고 어질 원, 일 년의 첫 날 원, 임금 원, 백성 원, 하늘 원 冤=원통할 원, 원한 원 原=근본 원, 거듭 원, 언덕 원, 기인할 원, 들판 원 厵=源과 同字 員=관원 원, 둥글 원 圎=圓의 俗字 園=동산 원, 능 원, 울타리 원 圓=둥글 원, 원만할 원, 화폐의 단위 원 圜=옥담 원, 둥글 원, 제단 원 垣=낮은 담 원, 보호하는 사람 원, 별 이름 원 媛=아리따운 여자 원, 여자 벼슬이름 원 嫄=여자이름 원 宛=서쪽 나라이름 원 寃=원통할 원, 굽힐 원, 죄 없을 원 怨=원망할 원, 원수 원, 분낼 원 愿=정성 원, 착할 원, 삼갈 원 援=당길 원, 사다리 원, 구원할 원 杬=몸 주무를 원, 나무이름 원 楥=떡갈나무 원, 실감개 원, 신골 원 楦= 沅=물 이름 원 洹=흐를 원, 물 이름 원 湲=물소리 원, 물 졸졸 흐를 원 源=근원 원, 샘 원, 계속할 원 爰=당길 원, 이끌 원, 가로되 원 猨=猿과 同字 猿=원숭이 원, 잔나비 원 瑗=도리옥 원, 구멍 큰 둥근 옥 원 綩= 芫=고기 잡는 풀 원, 여뀌 원 苑=나랏동산 원, 큰 바람 원 薗=園과 同字 蜿=굼틀거릴 원 袁=옷 치렁거릴 원, 성씨 원 諢=농담 원 謜=천천히 말할 원, 기꺼울 원 轅=진문 원, 멍에 원, 별 이름 원 逺=遠과 同字 遠=멀 원, 심오할 원 鋺=저울 바탕 원 阮=원나라 원, 성씨 원 院=원집 원, 공해 원, 절 원, 학교 원 隕=폭원 원 願=하고자할 원, 바랄 원, 생각할 원 騵=배 희고 갈기 검은 말 원 鴛=숫원앙새 원 鵷=원추새 원 黿=큰 자라 원 阮=원나라 원, 성씨 원 [월] 刖=발꿈치 자를 월 月=달 월 粤=말 내킬 월, 곰곰히 생각할 월, 나라이름 월 粵=粤과 同字 越=넘을 월, 뛸 월, 월나라 월 鉞=도끼 월 [위] 位=벼슬 위, 임금의 신분 위, 자리 위, 방위 위 倭=순한 모양 위, 빙글 돌아올 위 偉=클 위, 넉넉할 위, 기특할 위 偽=僞의 略字 僞=거짓 위, 속일 위 危=위태할 위, 무너질 위, 상할 위, 높을 위, 별 이름 위 厃=우러러 볼 위, 평고대 위 叞=안위할 위, 다리미 위 喟=한숨쉴 위 噅=거짓말 위, 곱사등이 위 噕=噅와 同字 囗=圍의 古字 囲=圍의 略字 圍=둘레 위, 에워 쌀 위, 한아람 위, 지킬 위 委=맡길 위, 버릴 위, 맘에 든든할 위, 벼이삭 고개 숙일 위 威=위엄 위, 두려울 위 尉=벼슬이름 위, 눌릴 위 幃=향낭 위, 홑휘장 위 慰=위로할 위 暐=햇빛 위, 빛 환할 위 渭=물 이름 위, 속 끓일 위 為=爲와 同字 煒=벌그레할 위, 환할 위 熨=다리미 위, 고약 붙일 위 爲=할 위, 다스릴 위, 하여금 위, 어미원숭이 위, 이룰 위 瑋=위옥 위, 노리개 위 痿=습병 위, 잘름거릴 위, 음위증 위 緯=씨줄 위, 별 오른편으로 돌 위 胃=밥통 위, 별 이름 위, 성씨 위 萎=마를 위, 풀 이름 위, 쇠약해질 위 葦=갈대 위, 작은 배 위 葳=초목 성할 위, 위유풀 위 蒍=蔿와 同字 蔚=제비쑥 위, 초목 우거진 모양 위, 잔무늬 위 蔿=풀 위, 성씨 위, 고을이름 위 蝟=고슴도치 위 衛=衞와 同字 衞=막을 위, 지킬 위, 핏기운 위, 나라이름 위 袆=褘와 同字 褘=휘장 위, 아름다울 위 諉=핑계할 위, 버릴 위 謂=고할 위, 이를 위 逶=비틀거릴 위 違=어길 위, 미적거릴 위, 되돌아올 위 闈=대궐안의 문 위 韋=다룬 가죽 위, 훌부들할 위, 군복 위, 성씨 위 韙=옳을 위 韡=꽃 환히 필 위 餧=먹일 위 魏=위나라 위, 대궐 위, 우뚝할 위 [유] 丣=酉의 古字 乳=젖 유, 종유석 유, 낳을 유, 젖먹일 유, 기를 유 亏= 亴= 侑=도울 유, 권할 유, 귀인을 모시고 밥먹을 유 俁= 俞=兪의 俗字 偊= 儒=선비 유, 나장이 유, 유도 유, 광대 유 兪=그럴 유, 대답할 유, 공손할 유 冘=머뭇거릴 유, 갈 유 匬=곡식 셈하는 단위 휘 유 卣=중술통 유 吁= 呦=사슴 우는 소리 유, 새짐승 우는 소리 유 唀=誘와 同字 唯=오직 유, 허락할 유 喩=깨우쳐 줄 유, 알릴 유, 비유할 유 喻=喩와 同字 嚅=말 머뭇거릴 유, 잔말할 유 囿=엔담 유, 고루할 유 堣= 壘= 壝=토담 유, 단 둘러쌓은 담 유 孺=젖먹이 유, 사모할 유, 딸릴 유 宥=너그러울 유, 죄 사할 유, 도울 유 嵎= 帷=휘장 유 幼=어릴 유, 사랑할 유 幽=숨을 유, 그윽할 유, 적을 유, 어두울 유, 귀신 유, 저승 유 庽= 庾=노적 유, 곡식 셈하는 단위 휘 유 悠=멀 유, 생각할 유, 한가할 유, 근심할 유 惟=꾀할 유, 오직 유, 생각할 유 愈=나을 유, 어질 유, 더욱 유, 병 나을 유 愉=기뻐할 유, 즐거울 유 懦=만만할 유, 나약할 유 揄=당길 유, 칭찬할 유, 희롱할 유 揉=풀 유, 부드럽게 할 유, 희일 유 攸=곳 유, 휙 달아날 유, 아득할 유, 대롱거릴 유 斿=깃발 유, 깃술 유, 면류관술 유 有=있을 유, 얻을 유, 과연 유, 또 유 杅= 柔=부드러울 유, 순할 유, 복종할 유 柚=유자 유 楡=느름나무 유, 서쪽 유 楢=부드러운 나무 유, 홰 유 榆=楡와 同字 油=기름 유, 구름 피어오를 유, 공손할 유 泑=물빛이 검을 유, 물이름 유 洧=물이름 유 游=헤엄칠 유, 노닐 유, 깃발 유 濡=적실 유, 막힐 유, 곱고 윤택할 유 牖=엇살창 유, 들창 유, 밝을 유, 인도할 유 猶=어미 원숭이 유, 같을 유, 오히려 유 猷=꾀 유, 그릴 유, 옳을 유, 탄식할 유 瑜=아름다운 옥 유 由=말미암을 유, 쓸 유, 지날 유 疣= 瘉=癒와 同字 瘐=죄인 주려 죽을 유 癒=병 나을 유, 병들 유 盱= 窬=판장문 유 窳=이지러질 유, 약할 유, 짐승이름 유 籲=부르짖을 유 糅=섞일 유, 얽힐 유, 잡곡밥 유 綏=깃발 늘어질 유 維=벼리 유, 이을 유, 맺을 유, 오직 유 繆=어그러질 류 肉=둘레 유, 저울추 유, 살찔 유 腴=아랫배 살찔 유 臾=잠간 유, 착할 유, 나라이름 유, 활이 뒤로 젖혀질 유 莠=가라지 유, 추할 유 萸=수유 유 蕕=냄새나는 풀 유, 유풀 유 蕤=더북할 유 蚰=노래기 유, 땅지네 유 蚴=굼틀거릴 유 蝤=하루살이 유 裕=넉넉할 유, 너그러울 유 褕=꿩의 깃으로 꾸민 옷 유, 쾌자 유 襦=저고리 유, 베쐐기 갓장이 유 誘=꾀일 유, 가르칠 유, 당길 유 諛=아첨할 유 諭=고할 유, 비유할 유 讉=성낼 유 踰=넘을 유 蹂=밟을 유, 쌀 씻을 유 逌=빙그레할 유 逰=遊의 俗字 逾=갈 유, 지날 유 遊=놀 유, 벗 사귈 유 遺=잃어버릴 유, 남을 유, 끼칠 유 酉=별 유, 열째 지지 유, 나아갈 유 釉=물건 빛날 유 鍮=놋쇠 유 鞣=다룬 가죽 유, 마른 가죽 유 鮪=상어 유 黝=검푸를 유, 검은칠할 유 鼬=청서 유, 족제비 유 龥=부르짖을 유 劉=이길 류, 죽일 류, 베풀 류, 성씨 류 杻=싸리 뉴 柳=버들 류, 별 이름 류 流=흐를 류, 번져나갈 류, 구할 류, 내칠 류, 달아날 류, 무리 류, 귀양보낼 류 溜=처마물 류, 낙수물 류, 증류수 류 琉=유리돌 류, 나라이름 류 留=머무를 류, 그칠 류, 오랠 류, 횡사할 류 硫=석류황 류, 유황 류 紐=단추 뉴, 맺을 뉴 類=같을 류, 나눌 류, 착할 류, 무리 류 [육] 儥=팔 육, 길 육 唷=소리지를 육 喅=뭇 소리 육 堉=기름진 땅 육 毓=기를 육, 어릴 육, 많을 육 粥=팔 육, 북쪽 오랑캐 육 肉=고기 육, 몸 육 育=기를 육, 날 육, 자랄 육 六=여섯 륙, 나라이름 륙 戮=죽일 륙, 육시할 륙, 욕할 륙 陸=뭍 륙, 길 륙, 어긋날 륙, 뛸 륙, 두터울 륙 [윤] 允=미쁠 윤, 마땅할 윤, 옳게 여길 윤, 좇을 윤, 허락할 윤 勻=가지런할 윤, 적을 윤 匀=勻과 同字 奫=물 깊을 윤, 물이 충충할 윤 尹=다스릴 윤, 바를 윤, 벼슬이름 윤, 믿을 윤 昀= 玧=귀막이 구슬 윤 胤=맏아들 윤, 익힐 윤 論=차례 륜 贇= 赟= 鈗=창 윤 鋆= 倫=인륜 륜, 무리 륜, 조리 륜, 의리 륜, 가릴 륜 崙=곤륜산 륜, 나라이름 륜 淪=빠질 륜, 물놀이칠 륜, 거느릴 륜 輪=바퀴 륜, 땅 길이 륜, 우렁찰 륜, 서릴 륜, 둘레 륜 [율] 凓=찬 기운 률 噊=위태할 율 汩=물 흐를 율, 빨리 걸을 율, 환할 율, 북 울릴 율, 걸을 율 潏=물 흐를 율 矞=송곳질할 율, 상서구름 율, 궤휼할 율, 귀신이름 율 聿=마침내 율, 지을 율, 오직 율, 스스로 율, 붓 율 律=법 률, 풍률 률, 지을 률, 저울질할 률 慄=두려울 률, 쭈그릴 률, 슬플 률, 떨 률 栗=밤 률, 신주 재목 률, 단단할 률, 무서울 률, 공손할 률 率=헤아릴 률, 과녁 률, 홀 한껏 다릴 률 [융] 戎=병장기 융, 싸움수레 융, 클 융, 너 융, 도울 융, 서쪽 오랑캐 융 瀜=물 깊을 륭 狨=원숭이 융 絨=삶은 실 융, 가는 베 융 融=부드러울 융, 밝을 융, 융통할 융, 불길 위로 오를 융, 귀신이름 융 隆=성할 륭, 높을 륭, 가운데 우뚝할 륭, 괘 이름 륭 [윽] 厼= [은] 听=벙긋거릴 은, 들을 은, 입이 큰 모양 은 嚚=어리석을 은, 말다툼할 은, 불칙하게 말할 은 圁=물이름 은 圻=언덕 은 垠=언덕 은, 하늘 가장자리 은, 경계 은 垽=해감 은, 찌끼 은 恩=은혜 은, 신세 은, 사랑할 은 慇=은근할 은, 공손할 은, 간절할 은 憖=물을 은, 공근할 은, 힘쓸 은, 서러워할 은 檼=집 마룻대 은, 대공 은 殷=많을 은, 무리 은, 클 은, 가운데 은, 은나라 은, 융성할 은, 천둥소리 은 溵=물소리 은, 물이름 은 狺=뭇 개 짖는 소리 은 珢=옥돌 은 癮=두드러기 은 言=심사 화평할 은 訔=시비할 은 訚=誾과 同字 誾=화평할 은 鄞=땅이름 은 銀=은 은, 돈 은 隐=隱과 同字 隠=隱의 俗字 隱=숨을 은, 아낄 은, 속걱정할 은, 불쌍히 여길 은, 점칠 은, 의지할 은, 쌓을 은 齗=잇몸 은, 말다툼할 은, 미워할 은 [을] 乙=새 을, 천간 이름 을, 굽힐 을, 생선의 창자 을, 모모 을 鳦=제비 을 [음] 吟=읊을 음, 끙끙거릴 음, 탄식할 음, 턱 끄덕거릴 음, 노래할 음, 말 더듬을 음, 울 음 吽=소 울 음 喑=소리지를 음, 안간힘 쓸 음, 목 쉴 음 婬=간통할 음, 새서방질할 음, 음탕할 음 岑=기슭 음, 언덕 음, 낭떠러지 음 崟=멧부리 음, 산 높을 음 廕=덮을 음 愔=조용할 음, 화평할 음 淫=방탕할 음, 간음할 음, 음란할 음, 넘칠 음, 적실 음, 오랠 음 蔭=덮을 음, 가릴 음, 그늘 음 陰=음기 음, 부인에게 예 가르칠 음, 몰래 음, 세월 음 霪=장마 음 音=소리 음, 편지 음, 음악 음 飮=마실 음 飲=飮과 同字 [읍] 俋=날쌜 읍, 밭 가는 모양 읍 唈=숨 느껴쉴 읍 悒=답답할 읍, 근심할 읍 挹=잡아당길 읍, 잔질할 읍 揖=읍할 읍, 나아갈 읍, 깍지낄 읍, 공손할 읍 泣=눈물 줄줄 흘릴 읍, 부글부글 끓는 소리 읍 浥=젖을 읍, 흠치르르할 읍 煜=비칠 읍, 불꽃 읍, 성할 읍, 불빛 비칠 읍 邑=고을 읍, 답답할 읍 [응] 凝=엉길 응, 이룰 응, 열중할 응 応=應의 略字 應=응당 응, 꼭 응, 사랑할 응, 대답할 응 疑=정할 응 膺=가슴 응, 친할 응, 당할 응, 응할 응, 받을 응 鷹=매 응 [의] 亄=탐할 의, 인색할 의, 아낄 의 依=의지할 의, 기댈 의, 비슷할 의, 따를 의, 비유할 의, 병풍 의 倚=기댈 의, 의지할 의, 믿을 의 偯=울음 끝소리 의 儀=꼴 의, 모양 의, 법도 의, 좋을 의 儗=서로 못믿을 의, 참람할 의 冝=宜의 俗字 凒=눈서리 쌓일 의 劓=코 베일 의, 베일 의 医=醫의 略字 吚=탄식할 의, 신음할 의 宜=옳을 의, 마땅할 의, 유순할 의 崖=언덕 의 嶷=산이름 의 意=뜻 의, 생각 의, 의리 의, 형세 의 懿=아름다울 의, 클 의 擬=의논할 의, 헤아릴 의, 흡사할 의 椅=가래나무 의, 교의 의 欹=아름답다할 의, 거룩하다할 의 毅=굳셀 의, 발끈 성낼 의 涯=물가 언덕 의, 물이름 의 漪=물놀이칠 의 猗=불 깐 개 의, 탄식할 의, 길 의 疑=의심할 의, 두려워할 의, 그럴듯할 의 矣=말 그칠 의 礒=바위 의 縊=목 맬 의 義=옳을 의, 의리 의, 뜻 의 艤=배 닿을 의 薏=연밥 의, 율무 의 螘=목 매어 죽는 벌레 의 蟻=왕개미 의, 검을 의, 술구더기 의 衣=옷 의, 입을 의 誼=옳을 의, 다스릴 의 議=말할 의, 의논할 의, 꾀할 의 醫=의원 의, 병 고칠 의 錡=세발 가마 의, 쇠뇌틀 의, 휘뚝거릴 의 锜=錡와 同字 饐=밥 쉴 의 [읫] 夞= [이] 二=두 이, 풍신 이, 같을 이, 의심할 이 以=써 이, 쓸 이, 까닭 이, 함께 이, 거느릴 이 伊=저 이, 이 이, 오직 이, 답답할 이, 성씨 이 佁=미련스러울 이 佴=버금 이 侇=무리 이, 주검 이 刵=귀 베일 이 勩=수고로울 이 匜=손대야 이, 술잔 이 台=자신 이, 기쁠 이, 기를 이 咡=입 어귀 이 咦=크게 부를 이, 웃을 이 咿=선웃음칠 이, 책 읽는 소리 이 嗌= 坨= 夷=동쪽 오랑캐 이, 평평할 이, 기꺼울 이, 상할 이, 베풀 이, 괘 이름 이 姨=이모 이, 처이모 이 寅=공경할 이, 범 이, 동북 이 尓=爾와 同字 尔=爾와 同字 已=이미 이, 그칠 이, 버릴 이, 너무 이 弍=二의 古字 弛=늦출 이, 활 부릴 이, 방탕할 이, 해이할 이 彛=彝의 俗字 彝=떳떳할 이, 법 이, 종묘 제기 이, 술통 이 彞=彛와 同字 怡=기쁠 이, 즐거울 이 敡=업신여길 이, 쉽게 말할 이 施=비뚤어질 이, 옮길 이, 잘난체할 이, 벗을 이, 미칠 이 易=쉬울 이, 다스릴 이, 게으를 이, 편할 이 栮=버섯 이, 느타리 이 洟=콧물 이, 눈물 이, 못이름 이 爾=너 이, 가까울 이, 오직 이 珆= 珥=귀막이 옥 이, 귀고리 이, 해무리 이 異=다를 이, 괴이할 이, 나눌 이 痍=상할 이, 다칠 이, 흠집 이 移=옮길 이, 모낼 이, 변할 이 而=순접의 어조사 이, 너 이, 말이을 이, 이에 이 耳=귀 이, 조자리 이, 말 그칠 이, 여덟대 손자 이 肄=익힐 이, 수고할 이, 휘추리 이, 곁가지 이 苡=율무 이, 질경이 이 荑=흰 비름 이, 베일 이 蛇=든든할 이 訑=자랑할 이 詑=자랑할 이 詒=줄 이, 느른할 이 貳=二의 갖은자, 버금 이, 의심낼 이, 마음 변할 이, 이별할 이 貽=끼칠 이, 줄 이 迤=든든할 이 迩=邇의 俗字 邇=가까울 이 隶=밑 이 頉=기를 이 頤=턱 이, 턱 끄덕거릴 이, 기를 이, 늙은이 이, 괘 이름 이 飴=엿 이 餌=미끼 이, 이깝 이, 먹일 이, 흰떡 이 骪= 骫= 鮞=곤이 알 이 鮧=창자젓 이 黟=검을 이, 고을이름 이 利=날카로울 리, 이로울 리, 탐할 리, 편리할 리, 이자 리 吏=아전 리, 관리 리 履=가죽신 리, 신을 리, 밟을 리 易=쉬울 이, 다스릴 이, 게으를 이, 편할 이 李=오얏 리, 선비 천거리할 리, 역말 리, 보따리 리 梨=배 리, 벌레이름 리 泥=진흙 니, 물이 더러워질 니, 흙손 니, 술취할 니, 이슬 맺힐 니 理=다스릴 리, 바를 리, 누늬낼 리, 성품 리, 이치 리, 고칠 리, 나무결 리 痢=이질 리, 곱똥 리, 설사 리 罹=만날 리, 근심할 리, 걸릴 리 裏=옷 안 리, 속 리 裡=裏의 俗字 里=마을 리, 근심할 리, 잇수 리 離=떠날 리, 베풀 리, 지날 리, 아름다울 리, 둘 리, 외손 리 [익] 弋=주살 익, 취할 익, 홰 익, 검을 익, 벼슬이름 익, 오랑캐 익 瀷=강이름 익 熤=빛날 익, 사람이름 익 益=더할 익 翊=도울 익 翌=다음날 익 翼=날개 익 謚=웃을 익 鷁=익새 익, 돛대 끝 바람개비 익 匿=숨을 닉, 숨길 닉, 덮어둘 닉, 몰래 붙을 닉, 쌀 닉, 술 담는 그릇 닉 溺=빠질 닉, 약할 닉, 헤어 나오지 못할 닉 益=더할 익 [인] 人=사람 인 仁=어질 인 仞=길 인 仭=길 인, 잴 인, 찰 인, 깊을 인 儿=어진사람 인 刃=칼날 인 刄=刃의 俗字 印=도장 인 咽=목구멍 인 囙=因의 俗字 因=인할 인 堙=막을 인 夤=조심할 인 姻=혼인 인 婣=姻과 同字 寅=세째지지 인 引=끌 인 忍=참을 인 扨=그러하나 인 氤=기운성할 인 洇=湮과 同字 湮=잠길 인 煙=김 인, 기운 인, 안개 인, 숯 그을음 인 禋=제사지낼 인 籾=벼 인 絪=기운 인 芢=씨 인 茵=자리 인 蚓=지렁이 인 裀=요 인 認=알 인 靭=韌과 同字 靷=가슴걸이 인 魜=인어 인 吝=아낄 인 燐=도깨비불 인 璘=옥빛 인 藺=골풀 인 隣=鄰의 俗字 鱗=비늘 인 麟=기린 인 [일] 一=한 일 佚=편안할 일 佾=춤 일 劮=기쁠 일 呹=풀 뜯어 먹을 일, 재빠를 일 壱=壹의 略字 壹=한 일 尼=가까울 닐, 정할 닐, 그칠 닐 日=날 일 泆=끊을 일 溢=넘칠 일 軼=앞지를 일 逸=달아날 일 鎰=중량 일 馹=역말 일 驲= 逸=달아날 일 [임] 乑=나란히 설 임, 기어 오를 임 任=맡길 임 壬=아홉째천간 임 妊=아이밸 임 姙=妊과 同字 恁=생각할 임 稔=곡식익을 임 絍=짤 임, 길쌈할 임 荏=들깨 임 衽=옷깃 임 賃=품팔이 임 銋=젖을 임 飪=익힐 임 餁=飪과 同字 林=수풀 림, 더북더북 날 림 淋=지적지적할 림, 축일 림, 번지르르할 림 臨=임할 림, 군림할 림, 여럿이 울 림, 굽힐 림 [입] 入=들 입 卄=스물 입 叺=가마니 입 廿=스물 입 込=담을 입 立=설 입 笠=우리 입 粒=알 입 [잉] 仍=인할 잉 剩=남을 잉 媵=보낼 잉 孕=아이밸 잉 芿=새풀싹 잉 [자] 仔=자세할 자 做=지을 자 兹=무성할 자 刺=찌를 자 呰=주차할 자 咨=물을 자 啙=약할 자 嗞=탄식할 자 姉=姊의 俗字 姿=맵시 자 嬨=계집성품너그러고순할 자 子=아들 자 孖=쌍둥이 자 字=글자 자 孜=힘쓸 자 孳= 孶=부지런할 자 恣=방자할 자 慈=사랑할 자 柘=산뽕나무 자 榨=술주자 자 橴=땅이름 자 泚=맑을 자 滋=불을 자 炙=고기구을 자 煑= 煮=삶을 자 牸=암컷 자 玆=이 자 瓷=오지그릇 자 疵=흠 자 眥=흘길 자 眦=眥와 同字 磁=자석 자 積=저출할 자 粢=피 자 紫=자주빛 자 者=놈 자 耔=복돋을 자 胾=고깃점 자 自=스스로 자 茈=지치 자 茨=가시나무 자 茲=무성할 자 莿=풀가시 자 蔗=사탕수수 자 藉=깔개 자 觜=털뿔 자 訾=헐뜯을 자 諮=물을 자 貲=재물 자 資=재물 자 赭=붉은흙 자 趑=머뭇거릴 자 鎡=호미 자 雌=암컷 자 頿=코밑수염 자 髭=코밑수염 자 鮓=젓 자 鶿=가마우지 자 鷓=자고 자 齊=상옷 아랫단할 자 [작] 仢=외나무 다리 작 作=지을 작 剒=건목칠 작 勺=구기 작 嚼=씹을 작 妁=중매 작 岝=산 높을 작 怍=부끄러울 작 斫=벨 작 斱=쪼갤 작 昨=어제 작 杓=구기 작 柞=나무이름 작 汋=삶을 작 灼=사를 작 炸=터질 작 焯=밝을 작 爵=벼슬 작 犳=아롱 짐승 작 碏=삼갈 작 綽=너그러울 작 芍=작약 작 趵=차는 소리 작 酌=따를 작 酢=초 작 醋=술잔을 돌릴 작 雀=참새 작 鵲=까치 작 [잔] 僝=욕할 잔 剗=깍을 잔 孱=잔약할 잔 戔=쌓일 잔 棧=잔교 잔 残=해칠 잔 殘=해칠 잔 潺=물이 줄줄 흐르는 모양 잔 盞=작은 술잔 잔 糤= 饊= 馓= 驏=안장 얹지 않은 말 잔 [잘] 乲=봉호 잘 囐=북소리 잘, 나라이름 잘 [잠] 兂= 啿=넉넉할 잠 喒=나 잠 岑=봉우리 잠 暫=잠시 잠 涔=괸물 잠 潛=잠길 잠 潜=潛의 俗字 濳=潛의 俗字 箴=바늘 잠 簪=비녀 잠 蚕=누에 잠 蠶=누에 잠 [잡] 匝=돌 잡 卡=관 잡 咂=빨 잡 啑=唼과 同字 喋=오리와 기러기 텁석거려 먹는 소리 잡 囃=장단 잡을 잡 眨=눈 깜작일 잡 磼=산 높을 잡 襍=雜의 本字 雑=雜의 俗字 雜=섞일 잡 [장] 丈=어른 장 仗=병장기 장 傽=놀랄 장 匞=匠의 本字 匠=장인 장 場=마당 장 墻=牆과 同字 壮=씩씩할 장 壯=씩씩할 장 奘=클 장 奨=奬의 略字 奬=도울 장 妝=꾸밀 장 嬙=궁녀 장 将=將의 略字 將=장차 장 嶂=높고 가파른 산 장 帳=휘장 장막 장 庄=장중할 장 廧=담 장 張=베풀 장 戕=죽일 장 掌=손바닥 장 暲=햇발이 돋아올 장 杖=지팡이 장 樟=녹나무 장 檣=돛대 장 欌=장농 장 漳=강이름 장 漿=미음 장 牂=암양 장 牆=담 장 状=狀의 俗字 狀=모양 형상 장 獐=노루 장 璋=끝의 반을 깎아 뾰족하게 한 홀 장 瘴=장기 장 章=문채 장 粧=단장할 장 糚=妝과 同字 羘=수양 장 腸=창자 장 臓= 臟=오장 장 臧=착할 장 荘=莊의 俗字 莊=엄할 장 萇=나무 이름 장 葬=장사 지낼 장 蒋=蔣의 略字 蔣=줄 장 蔵= 薔=물여뀌 장 藏=감출 장 装=裝의 俗字 裝=차려 입을 장 賬=치부책 장 贓=장물 장 贜= 鄣=나라이름 장 酱= 醤=醬의 略字 醬=장 장 鏘=금옥 소리 장 長=길 장 障=막을 장 餦=산자 장 髒=몸 뚱뚱할 장 麞=노루 장 狀=모양 형상 장 [재] 再=두 번 재, 거듭 재 咦=크게 부를 재, 웃을 재 哉=비로소 재, 답다 재, 그런가 재 喍=개싸움할 재 在=있을 재, 살 재, 살필 재, 곳 재 夈= 宰=주관할 재, 다스릴 재, 재상 재, 으뜸 재, 삶을 재 崽=자식 재, 저 재 才=재주 재, 능할 재, 현인 재, 바탕 재 扗= 材=재목 재, 늘미 재, 성품 재, 재주 재 栽=심을 재 梓=가래나무 재, 목수 재, 우러러 볼 재, 고향 재 榟= 渽=맑을 재 滓=앙금 재, 찌끼 재 災=재앙 재, 천벌 재, 횡액 재 灾=災와 同字 縡=일 재, 실을 재 纔=겨우 재, 비롯할 재 裁=마름질할 재, 헤아릴 재, 결단할 재 財=재물 재, 뇌물 재, 보배 재 載=실을 재, 이길 재, 비롯할 재, 가득할 재 齋=재계할 재, 집 재 齎=탄식할 재, 쌀 재, 가질 재 齜=이 갈 재, 이 드러날 재, 뻐드렁니 재 [쟁] 噌=장사꾼 웅성거릴 쟁 崢=가파를 쟁, 산 높을 쟁 槍=혜성 쟁 爭=다툴 쟁, 다스릴 쟁, 분별할 쟁 猙=밉살스럴 쟁, 짐승이름 쟁 琤=옥소리 쟁 瞠=똑바로 볼 쟁 箏=쟁 쟁, 풍경 쟁 諍=간할 쟁 錚=쇳소리 쟁그렁거릴 쟁, 징 쟁 鎗=금석소리 쟁, 창 쟁, 총 쟁 [저] 且=공손할 저, 파초 저, 많을 저 佇=오래 설 저, 기다릴 저, 잠깐 머물 저 低=낮을 저, 값 쌀 저, 소리 약할 저, 숙일 저, 머뭇거릴 저 儲=쌓을 저, 버금 저, 용납할 저 咀=씹을 저, 깨달을 저, 먹을 저 姐=맏누이 저, 아가씨 저, 교만할 저 宁=조회 받는 곳 저, 멈출 저 屠=흉노왕의 이름 저 岨=돌산에 흙 덮일 저 底=밑 저, 그칠 저 抒=당길 저, 북 저 抵=밀칠 저, 당할 저, 막을 저, 다달을 저, 씨름할 저 杵=공이 저, 방망이 저, 혜성 저 杼=북 저, 도토리 저 柢=뿌리 저 楮=닥나무 저, 종이돈 저, 감매나무 저 樗=가죽나무 저 氐=낮을 저, 오랑캐 이름 저, 이를 저, 근본 저, 별이름 저 沮=그칠 저, 막을 저, 무너질 저, 공갈할 저, 물이 번질 저, 나라이름 저 渚=물가 저, 물 갈라질 저 滁=물이름 저 潴=瀦와 同字 瀦=물 괼 저, 못 저 牴=찌를 저, 대강 저, 씨름 저, 당할 저 狙=원숭이 저, 엿볼 저, 살필 저 猪=豬의 俗字 疽=등창 저 箸=젓가락 저 紵=모시 저 纻=紵와 同字 罝=짐승 그물 저 羝=숫양 저 苧=모시 저 苴=암삼 저, 꾸러미 저, 대지팡이 저, 신바닥 저 菹=김치 저, 푸서리 저 著=나타날 저, 널리 알려질 저, 글 지을 저, 옹저 저 藷=마 저, 감자 저 蛆=구더기 저, 지네 저 袛=속적삼 저 褚=주머니 저, 쌓을 저, 옷에 솜 둘 저 觝=찌를 저, 받을 저, 씨름 저 詆=꾸짖을 저, 알소할 저, 비방할 저 詛= 豬=돼지 저, 물이 괼 저, 못이름 저 貯=쌓을 저, 감출 저, 둘 저 躇=머뭇거릴 저 這=맞을 저, 이것 저, 여기 저 邸=사처 저, 주막 저, 홀바탕 저, 병풍 저 陼=모래섬 저, 둔덕 저, 언덕 저 雎=저구 저, 증경이 저, 원앙 저 骶=꽁무니 끝 저 齟=이 어긋날 저 猪=豬의 俗字 [적] 乇=풀잎 적 借=빌릴 적, 빚 적, 도울 적, 허락할 적 勣=공적 적, 사업 적 吊=弔의 俗字 啇=나무 뿌리 적, 실과 꼭지 적, 밑둥 적 嫡=정실 적, 맏아들 적 寂=고요할 적, 쓸쓸할 적 弔=이를 적 戝= 摘=딸 적, 돋구어낼 적, 움직일 적 敵=대적할 적, 원수 적, 무리 적, 막을 적 樀=추녀 적, 도토마리 적, 방망이 적 滴=물방울 적, 물 댈 적 炙=고기구이 적, 김 쏘일 적, 냄새 퍼질 적 狄=북방 오랑캐 적, 꿩 그린 옷 적, 멀 적 的=과녁 적, 꼭 그러할 적, 밝을 적 磧=돌무더기 적, 모래벌 적 積=포갤 적, 모을 적, 넓이 적, 부피 적 笛=피리 적, 날라리 적 籍=문서 적, 왁자할 적, 호적 적, 압수할 적, 임금이 가는 밭 적 糴=쌀 사들일 적, 빠를 적 績=길쌈 적, 공 적, 이룰 적, 이을 적 翟=꿩의 깃 적, 황후의 옷 적 芍=연밥 적, 연꽃의 열매 적 荻=갈대 적 菂=연밥 적 藉=어수선할 적, 확자할 적, 임금이 가는 밭 적 覿=볼 적 謫=귀양갈 적, 꾸짖을 적 賊=도적 적, 해칠 적 赤=붉을 적, 금치 적 跡=자취 적 蹟=행적 적, 자취 적 躍=뛸 적 迪=나아갈 적, 순할 적, 열어줄 적 迹=발자국 적, 자취 적, 뒤따를 적 逐=달리는 모양 적 逖=멀 적 適=맞갖을 적, 편안할 적, 깨달을 적, 시집갈 적, 좇을 적, 주장할 적 鏑=화살촉 적 馰=별배기 적, 소태성 적 炙=고기구이 적, 김 쏘일 적, 냄새 퍼질 적 [전] 伝=傳의 略字 佃=밭 맬 전, 머슴꾼 전, 사냥할 전 佺=신선이름 전 倎=두터울 전 傎=엎드러질 전 傳=전할 전, 펼 전, 이을 전, 주막 전, 책 전 全=온전할 전, 갖출 전 典=책 전, 법 전, 맡을 전, 도덕 전 前=앞 전, 옛 전, 인도할 전 剪=가위 전 剸=오로지 전, 저밀 전 厘=전방 전, 터전 전 吮=빨 전 唸=신음할 전 囀=새 지저귈 전, 후렴 전 塡=메일 전, 북소리 전, 순종할 전, 병들 전 填=塼과 同字 塼=벽돌 전 奠=정할 전 嫥=아름다울 전 専=專과 同字 專=오로지 전 屇=구멍 전 展=펼칠 전, 열릴 전, 살필 전 巓=산 꼭대기 전 巔=巓과 同字 廛=전방 전, 터전 전 悛=고칠 전, 차례 전 戦=戰과 同字 戩= 戰=싸움 전, 경쟁할 전 揃=가를 전, 자를 전, 가지런히 할 전 旃=기 전, 말 그칠 전 栓=말뚝 전 栴=향나무 전 棧= 槙=나무 끝 전, 자빠진 나무 전 殿=대궐 전 氈=단자리 전, 전방석 전 湔=빨 전, 씻을 전, 물 번질 전 澱=찌끼 전, 물 고일 전 澶=물이름 전 煎=달일 전, 불에 말릴 전 牋=글 전, 표 전, 문체이름 전 猠= 琠= 瑱=귀막이옥 전, 옥이름 전 甎=벽돌 전, 기와 전 田=밭 전, 사냥할 전, 논 전 甸=경기 전 畋=사냥할 전 畑=화전 전, 밭 전 畠=밭 전 痊=병 나을 전 癜=어루러기 전 癲=미칠 전 磚=벽돌 전, 기와 전 竣=일 마칠 전, 물러설 전 筌=통발 전 箋=기록할 전, 글 전 箭=화살 전, 약이름 전 篆=문체이름 전 籛=성씨 전 纏=둘릴 전, 묶을 전, 얽을 전 羶=노린내날 전 翦=베어 없앨 전, 멸할 전 腆=두터울 전, 지극할 전, 많이 차려놓을 전 膞=썰 전, 질그릇 만드는 틀 전 荃=향풀 전, 전풀 전 詮=평론할 전, 갖출 전 謭=얕을 전 趁=밟을 전 躔=햇길 전, 별자리 전 転=轉과 同字 輇=달 전, 잴 전 輾=돌아 누울 전 轉=구를 전, 변할 전, 굴릴 전 邅=머뭇거릴 전 鄽=가게 전 鈿=비녀 전, 보배로 꾸민 그릇 전 銓=사람 가릴 전, 저울질할 전 銭= 鋑= 錢=돈 전, 가래 전 錪=솥 전, 쇠 전 鐫=새길 전 電=번개 전, 전기 전 靛=푸른 대 전 靦=무안할 전, 물끄러미 볼 전 顓=어리석을 전, 오로지 전 顚=이마 전, 엎드러질 전 顛=顚과 同字 顫=사지 떨릴 전, 머리 비뚤이 전 飦=범벅 전, 된죽 전 餞=전별잔치 전, 보낼 전 餰=된죽 전 鬋=수염 깎을 전, 귀밑 털 드릴 전 鱣=전어 전 鸇=구진매 전 [절] 切=끊을 절, 저밀 절, 정성스럴 절, 급할 절, 진맥할 절 卩=몸기 절, 병부 절 姪=조카 절, 조카딸 절 岊=산 모퉁이 우뚝 내밀 절 帙= 截=끊을 절, 말 잘할 절 折=꺾을 절, 자를 절, 휘일 절, 알맞을 절 晢=밝을 절, 비칠 절 浙=쌀 씻을 절, 물이름 절 準=코마루 절 癤=멍울 절, 부스럼 절 窃=竊의 俗字 窒=막을 절, 가득할 절 竊=좀도둑 절, 얕을 절 節=마디 절, 절개 절 絕=끊을 절, 으뜸 절, 멸할 절, 그칠 절 絶=絕과 同字 [점] 佔=엿볼 점, 숙일 점 占=점칠 점, 날씨 볼 점, 점령할 점 厃=우러러 볼 점 唸=신음할 점 坫=병풍 점, 막을 점, 담 점 墊=빠질 점, 축축할 점 奌=點의 略字 岾=고개 점 店=가게 점, 주막 점 漸=번질 점, 물 흘러 들어갈 점, 점점 점, 차차 점 点=點의 略字 玷=옥의 티 점, 흠각 점 笘= 簟=삿자리 점, 대 이름 점 粘=붙일 점, 끈끈할 점 苫=이엉 점, 거적자리 점, 글씨 흘려 쓸 점 蔪=풀 벨 점, 보리 팰 점 蛅= 覘= 阽=낭떠러지 점, 낭비탈 점 霑=젖을 점, 비 지정거릴 점 颭=펄렁거릴 점 鮎=메기 점 黏=붙일 점, 풀 점 點=더러울 점, 뭉갤 점, 검은 점 점 [접] 慴=두려울 접, 겁낼 접 接=사귈 접, 잇닿을 접 摺=접을 접, 패할 접 曡= 椄=나무 접붙일 접, 형벌틀 접, 문설주 접 楪=널평상 접 楫=노 접 渫=물결 출렁출렁할 접 蜨=나비 접 蝶=들나비 접 跕=미끄러질 접 蹀=저벅저벅 걸을 접 鰈=가자미 접, 넙치 접 [정] 丁=장정 정, 네째 천간 정 丼=우물 정, 샘 정 井=우물 정, 단정할 정, 괘 이름 정, 천정 정, 저자 정 亭=정자 정, 여관 정, 고를 정 佂=두려워할 정 侹=평평할 정, 멀쑥할 정 停=머무를 정, 늦어질 정 偵=엿볼 정, 정탐할 정, 물을 정 凈=찰 정 叮=단단히 부탁할 정, 정성스러울 정 呈=보일 정, 드러낼 정 姃= 婧= 婷=아리따울 정, 쌀쌀할 정 定=정할 정, 편안할 정, 고요할 정 幀=그림족자 정 庭=뜰 정, 곧을 정 廷=조정 정, 바를 정, 곧을 정 征=칠 정, 갈 정 怔=황겁할 정, 가슴 두근두근할 정 情=뜻 정, 마음속 정 打=칠 정 挺=빼어날 정, 너그러울 정, 향초이름 정 掟=둘러칠 정 政=정사 정, 바르게 할 정, 조세 정 整=가지런할 정 旌=장목기 정, 표시할 정 晶=수정 정, 맑을 정, 빛날 정 晸= 柾=나무결 바를 정 桯=서안 정, 걸상 정 梃=외줄기 정, 막대 정, 꼿꼿할 정 棖=문설주 정, 막대 정 楨=담틀 마구리대 정, 단단한 나무 정 檉=능수버들 정 正=바를 정, 과녁 정, 남쪽으로 난 창 정, 어른 정, 분별할 정 汀=물가 정, 수렁 정 淀=얕은 물 정, 배 댈 정 淨=맑을 정, 조촐할 정 渟=물 고일 정, 도랑 정, 물가 정 湞=물이름 정 瀞=맑을 정, 정결할 정 灯= 炡=데칠 정, 불 번쩍거릴 정 玎=옥소리 정 珵=노리개 정, 패옥 정 珽=옥 이름 정 町=밭 두덕 정, 정보 정, 시가 정 甼= 疔=헌데 정 睛=눈 검은자위 정, 눈동자 정 碇=닻돌 정, 배 멈출 정 禎=상서로울 정 程=법 정, 한정 정, 과정 정, 품수 정, 헤아릴 정, 길 정 穽=구덩이 정, 함정 정 筳=대쪽 정 精=정교할 정, 세밀할 정, 정할 정, 성실할 정, 신령 정 綎=띠술 정 艇=거룻배 정, 작은 배 정 莛=풀 줄거리 정, 들보 정 訂=바로잡을 정, 의논할 정 証=간할 정 諪= 貞=곧을 정, 굳을 정 遉=순라군 정, 염탐할 정 鄭=나라이름 정, 성씨 정 酊=비틀거릴 정 酲=술병 정, 술 깰 정 釘=창 정, 못 정 鉦=징 정 鋌=화살촉 정, 달음박질할 정, 쇳덩이 정 鋥= 錠=촛대 정 阱=함정 정 霆=벼락 정, 번개 정 靖=다스릴 정, 편안할 정, 생각할 정 靚=단장할 정, 밝을 정 靜=고요할 정, 조용할 정, 쉴 정, 편안할 정 頂=이마 정, 꼭대기 정, 관 꼭대기 치장하는 장식 정 飣=굄새 정, 음식 괼 정 饤=飣과 同字 鼎=솥 정, 바야흐로 정, 새로울 정 靖=다스릴 정, 편안할 정, 생각할 정 精=정교할 정, 세밀할 정, 정할 정, 성실할 정, 신령 정 [제] 亝=재계할 제 俤=용모 제 傺=묵을 제 儕=동배 제 制=억제할 제 劑=약 지을 제 呧=꾸짖을 제, 비방할 제 啼=울 제 嗁=啼와 同字 嚌=맛볼 제 堤=둑 제 娣=여동생 제 帝=임금 제 弟=아우 제 悌=공경할 제 折=천천히 할 제 提=끌 제 擠=물리칠 제 晢=별이 반짝반짝 할 제 梯=사다리 제 済=濟의 略字 濟=나루 제 猘=미친개 제 瑅=제당 제 睇=흘끗 볼 제 祭=제사 제 禔=복 제 稊=강아지풀 제 第=집 제 緹=붉은 비단 제 臍=배꼽 제 荑=띠싹 제 薺=냉이 제 製=만들 제 諸=모든 제 踶=찰 제 蹄=굽 제 蹏=蹄와 同字 躋=오를 제 醍=맑은 술 제 鍗=큰 가마 제 除=섬돌 제 隄=堤와 同字 際=사이 제 霽=갤 제 鞮=가죽신 제 韲=양념할 제 題=이마 제 骶=궁둥이 제 鮧=복 제 鯷=메기 제 鱭=갈치 제 鵜=접동새 제 齊=가지런할 제 齏=회 제 諸=모든 제 [조] 佻=방정맞을 조 俎=도마 조 傮=마칠 조 兆=조짐 조 凋=시들 조 刁=바라 조 劋=끊을 조 助=도울 조 厝=措와 同字 召=대추 조 唕=지저귈 조 啁=비웃을 조 嘈=지껄일 조 嘲=조롱할 조 噪=떠들썩할 조 嬥=날씬할 조 弔=위문할 조 弴=그림 그린 활 조 彫=새길 조 徂=갈 조 懆=근심할 조 找=채울 조 抓=긁을 조 挑=돋울 조 措=둘 조 操=잡을 조 早=새벽 조 昭=밝을 조 晁=朝의 古字 曹=무리 조 曺=성 조 朝=아침 조 条=條의 略字 條=가지 조 棗=대추나무 조 槽=구유 조 殂=죽을 조 漕=배로 실어 나를 조 潮=조수 조 澡=씻을 조 炤=照와 同字 照=비출 조 燥=마를 조 爪=손톱 조 璪=면루관 드림 옥 조 皁=하인 조 眺=바라볼 조 祖=조상 조 祚=복 조 祧=조묘 조 租=구실 조 稠=빽빽할 조 窕=정숙할 조 竈=부엌 조 笊=조리 조 粗=거칠 조 糙=매조미쌀 조 糟=지게미 조 糶=쌀 내어 팔 조 組=끈 조 絛=끈 조 絩=견직물 날실 수 조 繰=야청 통견 조 肇=비롯할 조 胙=복 조 臊=누릴 조 艚=거룻배 조 蓚=기쁠 조 蔦=담쟁이 조 藻=조류 조 蚤=벼룩 조 蜩=매미 조 詔=고할 조 誂=꾈 조 調=고를 조 譟=시끄러울 조 趙=조나라 조 跳=뛸 조 躁=떠들 조 造=지을 조 遭=만날 조 釣=낚시 조 鈟=낚시 조 銚=쟁개비 조 鋽=불리지 않은 쇠 조 錯=措와 同字 鑿=뚫을 조 阻=험할 조 阼=동편 층계 조 雕=독수리 조 鯛=도미 조 鰷=피라미 조 鳥=새 조 鵰=수리 조 鼂=朝와 同字 [족] 哫=아첨할 족 族=겨레 족 瘯=피부병 이름 족 簇=모일 족 足=발 족 鏃=화살촉 족 [존] 存=있을 존 尊=존귀할 존 拵=꽂을 존 [졸] 卆=卒과 同字 卒=군사 졸 拙=서툴 졸 猝=갑자기 졸 [종] 从=從의 古字 伀=두려워할 종 倧=상고 신인 종 喠=말 못할 종 宗=마루 종 従=從의 略字 從=좇을 종 悰=즐길 종 慒=생각할 종 慫=권할 종 柊=방망이 종 棕=종려나무 종 椶=棕과 同字 樅=전나무 종 淙=물 소리 종 琮=옥홀 종 瑽=패옥소리 종 瘇=수종 종 種=씨 종 粽=주악 종 終=끝낼 종 綜=모을 종 縦=세로 종 縱=늘어질 종 腫=부스럼 종 螽=누리 종 踪=자취 종 踵=발꿈치 종 蹤=자취 종 鍾=술병 종 鐘=쇠북 종 锺=술병 종 [좌] 佐=도울 좌 侳=욕보일 좌 剉=꺽을 좌 坐=앉을 좌 左=왼 좌 座=자리 좌 挫=꺽을 좌 痤=뾰루지 좌 莝=여물 좌 髽=북상투 좌 [죄] 罪=허물 죄 脧= [주] 丟=갈 주 丢=잃어버릴 주 丶=심지 주 主=주인 주 住=살 주 作=원망할 주 侏=난쟁이 주 侜=속일 주 做=지을 주 儔=무리 주 冑=투구 주 凑=모일 주 厨=廚의 俗字 周=두루 주 呪=빌 주 咒=呪와 同字 咮=부리 주 啁=새소리 주 喌=닭 부르는 소리 주 嗾=부추길 주 噣=부리 주 奏=아뢸 주 姝=예쁠 주 宙=집 주 尌=세울 주 州=고을 주 幬=휘장 주 廚=부엌 주 拄=떠받칠 주 族=풍류가락 주 昼=晝의 略字 晝=낮 주 朱=붉을 주 柱=기둥 주 株=그루 주 注=물댈 주 洲=섬 주 湊=모일 주 澍=단비 주 炷=심지 주 珠=구슬 주 疇=밭두둑 주 硃=주사 주 祝=축문 주 稠=빽빽할 주 籌=투호 살 주 籒=주문 주 紂=껑거리끈 주 紬=명주 주 綢=얽힐 주 肘=팔꿈치 주 胄=후사 주 腠=살결 주 舟=배 주 蔟=태주 주 蛀=나무좀 주 蛛=거미 주 裯=홑이불 주 註=주낼 주 詋=呪와 同字 誅=벨 주 調=아침 주 賙=진휼할 주 赒=賙의 古字 走=달릴 주 趎=사람이름 주 足=지날 주 蹰=머뭇거릴 주 躊=머뭇거릴 주 輈=끌채 주 輳=모일 주 週=돌 주 遒=다가설 주 邾=나라이름 주 酎=세 번 빚은 술 주 酒=술 주 鉒=쇳돌 주 鑄=쇠 부어 만들 주 霌=운우 모양 주 霔=장마 주 駐=머무를 주 麈=큰사슴 주 鼄=거미 주 [죽] 喌= 竹=대 죽 粥=죽 죽 [준] 俊=준걸 준 僎=향음 주인 돕는 사람 준 僔=모을 준 儁=雋·俊과 同字 准=승인할 준 凖=準의 俗字 噂=수군거릴 준 埈=가파를 준 埻=과녘 준 墫=樽·罇과 同字 寯=모일 준 尊=樽·罇과 同字 屯=어려울 준 峻=높을 준 恂=갑자기 준 惷=어수선할 준 撙=누를 준 晙=밝을 준 樽=술그릇 준 浚=깊을 준 準=수준기 준 濬=칠 준 焌=굽을 준 畯=俊과 同字 皴=주름 준 竣=마칠 준 純=선으로 두를 준 綧=피륙의 폭의 넓이 준 罇=樽·尊과 同字 蠢=꿈틀거릴 준 踆=그칠 준 蹲=걸터앉을 준 逡=뒷걸음칠 준 遵=좇을 준 鐏=창고달 준 隼=새매 준 雋=儁·俊과 同字 餕=대궁 준 駿=준마 준 鱒=송어 준 鵔=금계 준 [줄] 乼=줄 줄 啐=지껄일 줄 茁=풀 처음 나는 모양 줄 誶=몰아 세울 줄, 꾸짖을 줄 [중] 中=가운데 중 仲=버금 중 眾=衆의 本字 衆=무리 중 重=무거울 중 [즉] 即=卽의 俗字 卽=곧 즉 鯽=붕어 즉 [즐] 喞=두런거릴 즐 櫛=빗 즐 騭=수말 즐 [즙] 揖=모을 즙 楫=노 즙 檝=楫과 同字 汁=즙 즙 緝=자을 즙 葺=기울 즙 蕺=삼백초 즙 [증] 噌=시끄러울 증 増=더할 증 增=불을 증 嶒=산 높고 험할 증 憎=미워할 증 拯=건질 증 曾=일찍 증 橙=귤 증 烝=김 오를 증 甑=시루 증 症=증세 증 矰=주살 증 繒=비단 증 罾=어망 증 蒸=찔 증 證=증거 증 贈=보낼 증 [지] 之=갈 지 凪=바람이 자고 파도 그칠 지 厎=숫돌 지 只=다만 지 吱=가는 소리 지 咫=길이 지 地=땅 지 址=터 지 坻=모래섬 지 墀=계단 위의 공지 지 底=이룰 지, 정할 지, 이를 지 志=뜻 지 扺=손바닥 지 抵=칠 지 持=가질 지 指=손가락 지 摯=잡을 지 支=가를 지 旨=맛있을 지 智=슬기 지 枝=가지 지 枳=탱자나무 지 榰=주춧돌 지 止=발 지 氏=나라이름 지 池=못 지 沚=물가 지 泜=강 이름 지 漬=담글 지 痣=사마귀 지 知=알 지 砥=숫돌 지 祇=마침 지 祉=복 지 祗=공경할 지 秖=마침 지 秪=벼 처음 익을 지 篪=저 이름 지 紙=종이 지 肢=사지 지 脂=기름 지 至=이를 지 舐=핥을 지 芝=지초 지 芷=구리때 지 蜘=거미 지 誌=기록할 지 識=표할 지 質=贄와 同字 贄=폐백 지 趾=발 지 踟=머뭇거릴 지 躓=넘어질 지 軹=굴대 머리 지 逇=구덩이 지 遅=더딜 지 遟=더딜 지 遲=늦을 지 阯=터 지 鮨=젓갈 지 鷙=맹금 지 識=표할 지 [직] 喞=찍찍거릴 직 直=곧을 직 禝=사람 이름 직 稙=올벼 직 稷=기장 직 織=짤 직 職=벼슬 직 [진] 侲=동자 진 儘=盡과 同字 唇=놀랄 진 嗔=성낼 진 嚍=화낼 진 塡=누를 진 填=塡의 俗字 塵=띠끌 진 尽=盡의 俗字 振=떨칠 진 搢=꽂을 진 晉=進과 同字 晋=晉의 俗字 桭=평고대 진 榛=개암나무 진 殄=끊어질 진 津=나루 진 溱=많을 진 珍=보배 진 珒=옥 이름 진 琎=옥돌 진 瑨=아름다운 돌 진 璡=옥돌 진 甄=질그릇 구울 진 畛=두렁길 진 疹=홍역 진 盡=다할 진 眞=참 진 瞋=부릅뜰 진 秦=벼 이름 진 稹=떨기로 날 진 縉=搢과 同字 縝=삼실 진 臻=이를 진 蓁=우거질 진 蔯=더워지기 진 螴=설렐 진 袗=홑옷 진 診=볼 진 賑=구휼할 진 趁=좇을 진 軫=수레 뒤턱 나무 진 辰=다섯째지지 진 進=나아갈 진 鉁=보배 진 鎭=누를 진 鎮=鎭의 俗字 陣=줄 진 陳=늘어놓을 진 震=벼락 진 鬒=숱 많을 진 [질] 佚=흐릴 질 侄=어리석을 질 儨=바를 질 厔=막을 질 叱=꾸짖을 질 呹=소리 질 垤=개밋둑 질 姪=조카 질 嫉=미워할 질 帙=책갑 질 桎=차꼬 질 瓆=사람 이름 질 疾=병 질 秩=차례 질 窒=막을 질 絰=질 질 腟=膣과 同字 膣=새살 날 질 蒺=납가새 질 蛭=거머리 질 質=바탕 질 跌=넘어질 질 迭=갈마들 질 郅=고을 이름 질 鑕=모루 질 [짐] 斟=술 따를 짐 朕=나 짐 鴆=짐새 짐 [집] 什=세간 집 卙=많을 집 咠=참소할 집 執=잡을 집 戢=그칠 집 汁=진액 집, 진눈깨비 집, 국 집 潗=샘솟을 집 緝=낳을 집 輯=모을 집 鏶=판금 집 集=모일 집 什=세간 집 [짓] 嗭=땅 이름 짓 [징] 徴=부를 징 徵=부를 징 懲=혼날 징 澂=澄과 同字 澄=맑을 징 瀓=맑을 징 癥=적취 징 瞪=바로 볼 징 [차] 且=또 차 仛=위탁할 차 佽=도울 차 侘=실의할 차 借=빌 차 偖=찢을 차 剳=낫 차 劄=차자 차 叉=깍지낄 차 咱=우리 차 唶=탄식할 차 嗟=탄식할 차 嗻=말 많을 차 奓=오만할 차 岔=갈림길 차 嵯=우뚝 솟을 차 差=어긋날 차 徣=빌릴 차 扯=찢어버릴 차 搓=비빌 차 搽=칠할 차 槎=뗏목 차 次=버금 차 此=이 차 瑳=깨끗할 차 硨=조개 이름 차 磋=윤낼 차 箚=차자 차 茶=차 차 蹉=넘어질 차 車=수레 차 遮=막을 차 釵=비녀 차 齄=코가 붉게 부을 차 齜=이를 갈 차 茶=차 차 [착] 丵=풀이 우거질 착 剒=벨 착 戳=창으로 찌를 착 捉=잡을 착 搾=짤 착 擉=찌를 착 斲=깎을 착 昔=옛 착 着=붙을 착 窄=좁을 착 著=분명할 착 諑=헐뜯을 착 躇=머뭇거릴 착 錯=섞일 착 鑿=뚫을 착 齪=악착할 착 [찬] 丳=꼬챙이 찬 儧=모일 찬 儹=모을 찬 兓=도울 찬, 기릴 찬 劗=끊을 찬 囋=기릴 찬 巑=높이 솟을 찬 撰=지을 찬 攢=모일 찬 欑=모일 찬 澯=맑을 찬 燦=빛날 찬 爨=불땔 찬 璨=빛날 찬 瓚=제기 찬 竄=숨을 찬 篡=빼앗을 찬 簒=빼앗을 찬 粲=정미 찬 繤=지을 찬 纂=모을 찬 纉=이을 찬 纘=이을 찬 讃=기릴 찬 讚=기릴 찬 賛=도울 찬 贊=도울 찬 趲=놀라 흩어질 찬 鑽=끌 찬 餐=먹을 찬 饌=반찬 찬 [찰] 刹=절 찰 剎=절 찰 咱=나 찰 哳=새소리 찰 囋=기릴 찰 察=살필 찰 扎=뺄 찰 拶=핍박할 찰 擦=뿌릴 찰 札=패 찰 獺=수달 찰 紮=감을 찰 [참] 僣=교활할 참 僭=참람할 참 儳=어긋날 참 劖=새길 참 厽=흙을 쌓아서 담 쌀 참 参=간여할 참 參=간여할 참 叄=간여할 참 叅=의논할 참 噆=깨물 참 塹=구덩이 참 嶄=높을 참 巉=가파를 참 惨=참혹할 참 慘=참혹할 참 慙=부끄러울 참 慚=부끄러울 참 憯=슬퍼할 참 懺=뉘우칠 참 攙=찌를 참 斬=벨 참 槧=판 참 欃=살별 참 毚=토끼 참 渗=스밀 참 滲=스밀 참 漸=점점 참 站=우두커니 설 참 譖=참소할 참 讒=참소할 참 讖=참서 참 鏨=끌 참 鑱=보습 참 饞=탐할 참 驂=곁마 참 黲=검푸르죽죽할 참 [창] 倀=미칠 창 倉=곳집 창 倡=여광대 창 傖=천할 창 凔=찰 창 刅=해칠 창 刱=비롯할 창 剏=비롯할 창 剙=비롯할 창 創=비롯할 창 唱=노래 창 嗆=새 먹을 창 囪=굴뚝 창 囱=천장 창 娼=몸 파는 여자 창 廠=헛간 창 彰=밝을 창 悵=슬퍼할 창 惝=멍할 창 愴=슬퍼할 창 戧=다칠 창 搶=닿을 창 敞=높을 창 昌=창성할 창 昶=밝을 창 暢=펼 창 椙=삼나무 창 槍=창 창 氅=새털 창 滄=찰 창 漲=불을 창 猖=미쳐 날뛸 창 瑲=옥 소리 창 瘡=부스럼 창 窓=창 창 窗=창 창 窻=창 창 脹=배부를 창 艙=선창 창 菖=창포 창 蒼=푸를 창 蹌=추창할 창 鯧=병어 창 [채] 債=빚 채 囆=사람 이름 채 埰=영지 채 寀=녹봉 채 寨=울짱 채 彩=무늬 채 採=캘 채 柴=섶 채 棌=참나무 채 睬=주목할 채 砦=울타리 채 祭=제사 채 綵=비단 채 茝=구리때 채 菜=나물 채 蔡=거북 채 責=꾸짖을 채 踩=뛸 채 采=캘 채 釵=비녀 채 [책] 冊=책 책 册=책 책 厇=찢을 책 唶=부르짖을 책 嘖=외칠 책 幘=건 책 措=둘 책 柞=나무 이름 책 柵=울짱 책 栅=울짱 책 磔=찢을 책 笧=책 상자 책 策=채찍 책 簀=살평상 책 翟=꿩 책 蚱=벼메뚜기 책 責=꾸짖을 책 [처] 凄=쓸쓸할 처 処=위치할 처 妻=아내 처 悽=슬퍼할 처 淒=쓸쓸할 처 狙=원숭이 처 萋=풀 성하게 우거진 모양 처 處=살 처 褄=깃의 가 처 覷=엿볼 처 郪=고을 이름 처 [척] 俶=시작할 척 倜=대범할 척 刺=찌를 척 剔=바를 척 呎=길이 단위 척 坧=기지 척 塉=메마른 땅 척 尺=자 척 惕=두려워할 척 惖=존경할 척 慼=근심할 척 慽=근심할 척 戚=겨레 척 拓=주울 척 捗=거둘 척 摭=주울 척 擲=던질 척 斥=물리칠 척 滌=씻을 척 瘠=파리할 척 脊=등성마루 척 蜴=도마뱀 척 跖=발바닥 척 蹠=밟을 척 躑=머뭇거릴 척 適=갈 척 陟=오를 척 隻=새 한 마리 척 齣=단락 척 刺=찌를 척 [천] 串=꿸 천 仟=일천 천 俴=엷을 천 倩=예쁠 천 僢=어그러질 천 儃=머뭇거릴 천 兛=킬로그램 천 刋=끊을 천 千=일천 천 喘=헐떡거릴 천 嘽=많을 천 囅=웃는 모양 천 圌=둥근 대그릇 천 天=하늘 천 川=내 천 撰=지을 천, 가질 천, 모을 천, 고를 천 擅=멋대로 천 泉=샘 천 洊=이를 천 浅=얕을 천 淺=얕을 천 濺=흩뿌릴 천 玔=옥고리 천 瓩=킬로그램 천 祆=하늘 천 穿=뚫을 천 粁=킬로메트르 천 臶=거듭 천 舛=어그러질 천 芊=풀 무성할 천 荐=거듭할 천 莤= 蒨=대가 우거질 천 蕆=경계할 천 薦=천거할 천 蚕=지렁이 천 賤=천할 천 践=밟을 천 踐=밟을 천 辿=천천히 걸을 천 遷=옮길 천 釧=팔찌 천 闡=열 천 阡=두렁 천 靝=하늘 천 韆=그네 천 韉=언치 천 [철] 凸=볼록할 철 剟=깎을 철 勶=버릴 철, 일으킬 철, 사무칠 철 叕=이을 철, 잇댈 철 哲=밝을 철 啜=마실 철 喆=哲과 同字 囅=껄껄 웃을 철 埑=밝을 철 徹=통할 철 惙=근심할 철 掇=주울 철 掣=끌 철 撤=거둘 철 歠=마실 철 澈=물 맑을 철 綴=꿰맬 철 輟=그칠 철 轍=바퀴 자국 철 鉄=쇠 철 銕=鐵의 古字 錣=물미 철 鐵=쇠 철 飻=탐할 철 餮=탐할 철 [첨] 僉=다 첨 尖=뾰족할 첨 幨=휘장 첨 忝=더럽힐 첨 惉=팰 첨 槧=편지 첨 檐=처마 첨 櫼=쐐기 첨 沾=더할 첨 添=더할 첨 瀸=적실 첨 甛=달 첨 甜=달 첨 瞻=볼 첨 簷=처마 첨 簽=농 첨 籤=제비 첨 襜=행주치마 첨 詹=이를 첨 諂=아첨할 첨 [첩] 倢=빠를 첩 呫=맛 볼 첩, 귀에 대고 소근거릴 첩, 앙징할 첩 喋=재잘거릴 첩 堞=성가퀴 첩 妾=첩 첩 帖=표제 첩 怗=고요할 첩 捷=이길 첩 牒=글씨판 첩 疊=거듭 첩, 포갤 첩 睫=속눈썹 첩 褶=덧옷 첩, 겹옷 첩 褺=겹옷 첩 諜=염탐할 첩 貼=붙을 첩 輒=문득 첩 [청] 凊=서늘할 청 圊=뒷간 청 庁=관청 청 廳=관청 청 晴=갤 청 淸=맑을 청 清=맑을 청 聴=들을 청 聼=들을 청 聽=들을 청 菁=부추꽃 청 蜻=귀뚜라미 청 請=청할 청 鋹=날카로울 청 錆=자세할 청 閶=천문 청 靑=푸를 청 青=푸를 청 鬯=울창주 청 鯖=청어 청 鶄=교청새 청 鶬=왜가리 청 晴=갤 청 [체] 体=몸 체 切=온통 체 剃=머리 깎을 체 啑=콧김 불 체 嚏=재채기 할 체 嚔=재채기 할 체 帖=표제 체 彘=돼지 체 掣=끌어당길 체 替=바꿀 체 棣=산앵두나무 체 殢=나른할 체 涕=눈물 체 滯=막힐 체 砌=섬돌 체 綴=꿰멜 체 締=맺을 체 蒂=작은 가시 체 蔕=작은 가시 체 蕞=작은 모양 체 諦=살필 체 軆=몸 체 逮=미칠 체 遞=갈마들 체 靆=구름 낄 체 體=몸 체 髰= 切=자를 체 [초] 偢=얼이 빠져 있을 초 僬=밝게 살필 초 初=처음 초 剿=죽일 초 劭=힘쓸 초 勦=수고롭게 할 초 吵=지저궐 초 哨=망 볼 초 嘮=이야기할 초 噍=먹을 초 嫶=수척할 초 岧=산이 높을 초 峭=가파를 초 嶕=높을 초 怊=슬퍼할 초 悄=근심할 초 愀=정색할 초 憔=수척할 초 抄=베낄 초 招=부를 초 杪=끝 초 梢=나무 끝 초 椒=산초나무 초 楚=회초리 초 樵=땔나무 초 炒=볶을 초 焦=그슬릴 초 燋=홰 초 硝=초석 초 礁=암초 초 礎=주춧돌 초 秒=시간 단위 초 稍=벼 줄기 끝 초 綃=생명주실 초 耖=밭 거듭 갈 초 肖=닮을 초 艸=풀 초 苕=능소화 초 草=풀 초 蕉=파초 초 誚=꾸짖을 초 譙=꾸짖을 초 貂=담비 초 超=뛰어넘을 초 趠=멀 초 軺=수레 초 迢=멀 초 酢=초 초 醋=초산 초 醮=초례 초 鈔=노략질할 초 鍫=가래 초 鍬=가래 초 鞘=칼집 초 顦=야윌 초 髫=다박머리 초 鷦=뱁새 초 齠=이를 갈 초 [촉] 亍=자축거릴 촉, 겨우 디딜 촉 促=핍박할 촉, 촉박할 촉, 좁을 촉, 빠를 촉, 짧을 촉 劚=깎을 촉 嘱=囑의 俗字 囑=부탁할 촉 属=屬의 俗字 屬=이을 촉, 닿을 촉, 부탁할 촉, 모을 촉, 조심할 촉 数=빽빽할 촉 曯=비칠 촉 燭=爥의 俗字 爥=비칠 촉 矗=곧을 촉, 우뚝 솟을 촉 矚=볼 촉 薥=촉규화 촉, 자귀밥 촉 蜀=촉규화벌레 촉, 큰 닭 촉 触=觸의 俗字 觸=받을 촉, 느낄 촉, 지날 촉, 범할 촉 趨=빠를 촉 躅=자취 촉, 강동강동 뛸 촉, 철쭉꽃 촉 髑=해골 촉 [촌] 刌=끊을 촌 吋=인치(inch) 촌 寸=치 촌, 마디 촌, 헤아릴 촌, 조금 촌 忖=헤아릴 촌, 짐작할 촌 村=마을 촌, 밭집 촌, 시골 촌 邨=村과 同字 [촐] 伜= [총] 偬=傯의 俗字 傯=바쁠 총, 곤궁할 총 冢=무덤 총 匆=바쁠 총 叢=떨기 총, 모을 총, 번잡할 총 囪=囱과 同字 囱=굴뚝 총 塚=冢의 俗字 寵=사랑할 총, 임금께 총애받을 총, 은혜 총, 첩 총 怱=悤의 俗字 悤=바쁠 총, 덤빌 총 惣=摠의 譌字 憁=실심할 총, 뜻 같지 않을 총 摠=거느릴 총, 모을 총, 무리 총, 장수 총 総=總과 同字 縂=総과 同字 縦=縱과 同字 縱=바쁠 총 總=꿰맬 총, 거느릴 총, 합할 총, 끄덩이 잡을 총 聰=귀 밝을 총, 민첩할 총 葱=풀 더북할 총 蓯=풀 더북할 총 蔥=파 총, 파 뿌리 총, 푸를 총 銃=도끼 구멍 총, 총 총 鏦=창 총, 찌를 총 騘=驄과 同字 驄=총이말 총 塚=冢의 俗字 [촬] 撮=머리 끄덩이 잡을 촬, 당길 촬, 비칠 촬 [쵀] 啐=부를 쵀, 놀랄 쵀, 맛 볼 쵀 [최] 催=재촉할 최, 핍박할 최, 일어날 최 凗=눈서리 쌓일 최 嗺=입 옴칠 최, 급히 마실 최 嘬=물 최, 산적 한 입에 넣을 최 崔=산 우뚝할 최, 높고 가파를 최, 성씨 최 摧=꺾을 최, 망할 최, 저지할 최 最=가장 최, 우뚝할 최, 넉넉할 최 榱=서까래 최 漼=깊을 최, 고을 최, 눈물 줄줄 흘릴 최, 눈서리 쌓일 최 璀=옥빛 찬란할 최, 구슬 주렁주렁 달릴 최 磪=험하고 높을 최 縗=상복 최, 상옷 최 衰=상복 최 [추] 丑=수갑 추, 사람이름 추 僦=임금 추, 고용할 추 僽=몹시 욕할 추 出=내보낼 추 啾=두런거릴 추, 찍찍거릴 추 墜=떨어질 추, 잃을 추 娵=젊을 추, 물고기 추, 예쁜 여자 추 岀=出와 同字 帚=비 추, 털 추 惆=실심할 추, 섭섭할 추 抽=뺄 추, 뽑을 추, 당길 추, 거둘 추 捶=종아리 칠 추, 짓찧을 추 推=옮길 추, 가릴 추, 궁구할 추 揫=묶을 추, 거둘 추, 모을 추 搥=북 칠 추 杻=수갑 추, 조막손이 추 椎=쇠몽둥이 추, 칠 추, 짓찧을 추, 참나무 추 楸=가래나무 추, 노나무 추, 산유자 추, 바둑판 추 槌=칠 추 樞=밑둥 추, 지두리 추, 고동 추, 북두 첫째 별 추, 긴요할 추, 달 추, 가운데 추 湫=늪 추, 폭포 추, 찌푸릴 추, 서늘할 추 甃=우물 벽돌 추 瘳=병 나을 추, 덜릴 추 皺=쭈그러질 추 秋=가을 추, 세월 추, 때 추, 말이 뛰놀 추, 성씨 추 穐=秋의 古字 箒=비 추 箠=채찍 추, 볼기채 추 簉=버금 추, 가지런히 날 추 縋=줄에 달릴 추 縐=주름 추, 구길 추 芻=꼴 추, 짐승먹이 추 萩=맑은 대쑥 추, 가래나무 추 蒭=芻와 同字 諏=꾀할 추, 물을 추 趨=달아날 추, 추창할 추 追=쫓을 추, 따를 추 鄒=추나라 추 酋=괴수 추, 두목 추, 숙 익을 추, 끝날 추 醜=추할 추, 같을 추, 무리 추, 자라똥구멍 추, 부끄러울 추 錐=송곳 추 錘=저울눈 추, 마치 추, 저울 추 鎚=쇠마치 추, 저울 추 陬=벼루 추, 정월 추, 부끄러울 추, 마을 추 隹=새 추 雛=새 새끼 추, 병아리 추, 어린아이 추 鞦=그네 추, 말고들개 추 騅=청부루말 추 騶=거덜 추, 마부 추, 짐승이름 추 魋=북상투 추 鯫=송사리 추, 따라지 추 鰌=미꾸라지 추, 빙자할 추, 해추 추 鰍=미꾸라지 추 鵻=아롱비둘기 추 鶖=두루미 추 鶵= 鹙=鶖와 同字 麄= 麤=성길 추, 클 추, 거칠 추 龝=秋의 古字 [축] 丑=소 축, 축시 축, 북동쪽 축 噈=입맞출 축 妯=동서 축 柚=북 축 柷=축풍류 축 槭=단풍나무 축 畜=가축 축, 쌓을 축, 그칠 축 祝=빌 축, 끊을 축, 비로소 축 竺=나라이름 축 筑=비파 축 築=다질 축, 쌓을 축 縮=줄어들 축, 물러갈 축, 거둘 축, 모자랄 축 舳=고물 축, 배 꼬리 축 蓄=쌓을 축, 모을 축, 감출 축 豖=발 얽은 돼지걸음 축 趣= 蹙=찡그릴 축, 쭈그러질 축 蹜=발 끌어 디딜 축 蹴=찰 축, 밟을 축 軸=바디집 축, 질책 축, 속바퀴 축, 얇을 축 逐=쫓을 축, 물리칠 축 閦=무리 축, 아축부처 축 鼀=두꺼비 축 [춘] 偆=가멸할 춘, 두터울 춘 春=봄 춘, 남녀의 정 춘, 술 춘, 온화할 춘 椿=참죽나무 춘, 대춘나무 춘, 어르신네 춘 瑃= 萅= [출] 出=날 출, 게울 출, 도망할 출, 보일 출, 낳을 출, 물러갈 출, 생질 출 岀=出과 同字 朮=삽주뿌리 출 术= 秫=차조 출 黜=내칠 출, 물리칠 출 [충] 傭=고를 충, 가지런할 충 充=가득찰 충, 막을 충, 당할 충 冲=깊을 충, 온화할 충, 어릴 충 忠=충성 충, 곧을 충 忡=근심할 충 沖=깊을 충, 온화할 충, 어릴 충 珫= 种=어릴 충 虫=벌레 충 蟲=벌레 충, 김 오를 충 衝=충돌할 충, 찌를 충, 거리 충, 돌파할 충 衷=가운데 충, 정성 충, 착할 충, 속곳 충, 마음 충 [췌] 悴=근심할 췌, 파리할 췌, 피폐할 췌 惴=두려워할 췌 膵=첩육경 췌, 지라 췌 萃=모을 췌, 괘 이름 췌 贅=붙일 췌, 데릴사위 췌, 혹 췌, 군더더기 췌 [취] 冣=쌓을 취, 모을 취 取=거둘 취, 찾을 취, 받을 취, 빼앗을 취, 장가들 취 吹=불 취, 숨쉴 취, 악기 불 취, 부를 취, 충동할 취 嘴=부리 취 娶=장가들 취, 중개인 취 就=좇을 취, 이룰 취, 곧 취, 가령 취, 능할 취, 저자 취 揣=잴 취, 시험할 취, 요량할 취 橇=진흙 썰매 취 毳=솜털 취, 연하고 부드러울 취 炊=불 지필 취, 밥 지을 취 疩= 瘁= 翠=비취 취, 푸를 취 聚=모을 취, 고을 취, 걷을 취, 쌓을 취 脆=연할 취, 약할 취 臭=냄새 취, 향기 취, 썪을 취, 고약한 이름 취 觜=부리 취 趣=추창할 취, 뜻 취 醉=술취할 취, 궤란할 취 顇= 驟=몰아갈 취, 달릴 취, 별안간 취 鷲=독수리 취 龡=불 취 [측] 仄=기울 측, 성조 측, 물이 괄괄 흐를 측, 희미할 측, 옆 측, 돈 이름 측 側=곁 측, 기울어질 측, 저물 측, 배반할 측, 가까울 측, 미천할 측, 아플 측 則=법칙 측, 본받을 측, 모범 측, 때 측 厠=뒷간 측, 평상 가장자리 측, 섞일 측 嘁= 惻=슬플 측, 감창할 측, 아플 측, 불쌍할 측 測=측량할 측, 깊을 측, 맑을 측, 날카로울 측 [츤] 儭=속옷 츤 [층] 層=겹 층, 거듭 층, 층층대 층 蹭=어정거릴 층 [치] 侈=사치할 치, 넓을 치, 많을 치, 풍부할 치 値=값 치, 가치있을 치, 만날 치, 당할 치 值=値와 同字 偨=가지런하지 않을 치, 오르락 내리락할 치 偫=기다릴 치, 갖출 치 卮=술잔 치, 연지 치 哆=입 딱 벌일 치 嗤=비웃을 치, 냉소 치 埴=찰진흙 치, 흙 이길 치 寘=둘 치, 폐할 치, 쉴 치 峙=산이 우뚝 솟을 치, 갖출 치, 쌓을 치 嵯=산 울뚝질뚝할 치 差=어긋날 치, 오르락 내리락할 치, 구분지을 치 巵=잔 치, 연지 치 幟=깃대 치 廁=뒷간 치, 평상 가장자리 치, 섞일 치, 버금 치 徴=徵의 略字 徵=치성 치 恥=부끄럼 치, 욕될 치 昃= 梔=치자 치 植=방망이 치, 심을 치, 세울 치, 달굿대 치, 두목 치 樨= 歯=齒의 俗字 治=다스릴 치, 다듬을 치, 익을 치, 치료할 치 淄=물이름 치, 검을 치 熾=불 활활 붙을 치 畤=제터 치 痓=풍병 치, 악할 치 痔=치질 치 痴=癡의 俗字 癡=어리석을 치, 미련할 치, 미치광이 치, 주근깨 치 稚=어린 벼 치, 어릴 치, 늦을 치 穉=稚와 同字 絺=가는 칡베 치, 가는 갈포 치 緇=검을 치 緻=톡톡할 치, 빽빽할 치, 헌 옷 기울 치 置=베풀 치, 버릴 치, 역말 치, 안치할 치 耆= 耻=恥의 俗字 致=이를 치, 극진할 치, 버릴 치, 불러올 치, 풍치 치, 드릴 치, 보낼 치, 연구할 치 菑=따비밭 치 薙=풀 깎을 치 蚩=치벌레 치, 어리석을 치, 업신여길 치 袳=옷 펼칠 치 褫=옷 빼앗을 치, 벗을 치, 넋 잃을 치 觶=잔 치, 벌술잔 치 豸=발 없는 벌레 치, 풀 치, 해치양 치 跱=머뭇거릴 치, 주저할 치, 갖출 치 輜=짐수레 치, 휘장 친 수레 치 錙=저울눈 치, 조금 치 阤=떨어질 치, 헐릴 치, 언덕 치, 사태날 치 雉=꿩 치, 폐백 치, 성 윗담 치, 목맬 치 馳=달릴 치, 거동길 치, 전할 치 鯔=숭어 치 鴙=雉와 同字 鴟=솔개 치, 수알치 치, 부엉이 치, 말똥구리 치, 토란 치, 마음대로 날릴 치, 올빼미 치 鵄=솔개 치 齒=이 치, 나이 치, 같을 치 [칙] 侙=두려워할 칙 則=법칙 칙, 본받을 칙, 모범 칙, 조목 칙 勅=신칙할 칙, 칙령 칙 勑=바를 칙, 다스릴 칙 敕=경계할 칙, 다스릴 칙, 삼갈 칙, 바를 칙, 칙서 칙, 기릴 칙, 신칙할 칙 飭=갖출 칙, 닦을 칙, 부지런할 칙 [친] 嚫=베풀 친 櫬=관 친, 무궁화나무 친, 땔나무 친 藽= 襯=속옷 친, 접근할 친, 베풀 친 親=사랑할 친, 친할 친, 몸소 친, 일가 친, 사돈 친 齔=이 갈 친, 어릴 친 [칠] 七=일곱 칠, 글체이름 칠 柒=漆의 俗字 漆=옻나무 칠, 물이름 칠 [침] 伈=두려워할 침 侵=범할 침, 침노할 침, 습격할 침, 흉작 침 兓=날카로울 침 唚=입맞출 침 寖=젖을 침, 점점 침 寝=寢과 同字 寢=잠잘 침, 쉴 침, 방 침, 못생길 침 忱=믿을 침, 정성 침 惨= 慘= 枕=베개 침, 수레뒤 가로댄 나무 침, 소말뚝 침 椹=모탕 침, 도끼바탕 침, 토막 침 沈=장마물 침, 진펄 침, 잠길 침, 채색할 침, 고요할 침 沉=沈의 俗字 浸=적실 침, 불릴 침, 번질 침, 빠질 침 湛=빠질 침, 잠길 침 琛=보배 침 砧=방칫돌 침, 다듬잇돌 침 郴=땅이름 침 針=바늘 침, 침 침, 바느질할 침, 찌를 침 鋟=새길 침 鍼=바늘 침, 침 침 駸=말 몰아 달릴 침 [칩] 蟄=벌레 움츠릴 칩, 우물거릴 칩 [칭] 偁=稱의 本字 秤=저울 칭, 백 근 칭 称=稱과 同字 稱=저울질할 칭, 일컬을 칭, 헤아릴 칭, 같을 칭 [쾌] 噲=목구멍 쾌, 훨할 쾌 夬=결단할 쾌, 나누어 정할 쾌, 괘 이름 쾌 快=기분이 좋을 쾌, 시원할 쾌, 빠를 쾌 獪=간교할 쾌, 교활할 쾌 [타] 他=다를 타, 저 타, 간사할 타 佗=다를 타, 저 타, 마음에 든든할 타, 더할 타, 입을 타, 짊어질 타 刴=찍을 타, 꺾을 타 吒=咤와 同字 咜=咤의 譌字 咤=꾸짖을 타, 슬플 타, 뿜을 타, 쩍쩍 씹는소리 타 唾=침 타, 버릴 타 嚲=휘늘어질 타 垞= 堕=墮와 同字 墮=떨어질 타, 상투 타, 잃을 타 妥=편안할 타, 일 없을 타, 타협할 타, 떨어질 타 惰=게으를 타, 태만할 타 打=때릴 타 拕=끌 타, 당길 타 拖=拕와 同字 揣=헤아릴 타 朵=朶와 同字 朶=나무가지 휘늘어질 타, 떨기 타, 움킬 타 柁=키 타 楕=橢의 略字 橢=둥글길죽할 타, 수레통 가운데그릇 타, 길죽한 그릇 타 池=물이름 타 沱=물이 갈래질 타, 큰 비 타, 눈물이 흐를 타 舵=키 타 詫=자랑할 타, 풍칠 타, 신통할 타 跎=미끄러질 타 躱=피할 타 迤=어정거릴 타 陀=비탈 타, 땅이름 타 馱=탈 타, 짐 실을 타 駄=馱의 俗字 駘= 駝=약대 타, 곱사등이 타 駞=駞와 同字 鮀=모래무지 타 鴕=타조 타 鼉=자라 타 [탁] 仛=부칠 탁, 다를 탁 侂=부칠 탁, 부탁할 탁 倬=환할 탁, 클 탁 剫=쪼갤 탁, 건목칠 탁 卓=높을 탁, 뛰어날 탁, 책상 탁, 성씨 탁 吒=조롱할 탁 啄=쪼을 탁, 문 두드릴 탁 啅=啄과 同字 噣=쪼을 탁 坼=찢을 탁, 터질 탁, 난산할 탁, 싹 트일 탁 度=꾀할 탁, 헤아릴 탁, 벼슬이름 탁 托=밀칠 탁, 떡국 탁, 차반 탁 拆=터질 탁, 찢어질 탁, 열릴 탁 拓=물리칠 탁, 헤칠 탁, 밀칠 탁 擢=뽑을 탁, 뺄 탁, 솟을 탁, 이길 탁 晫=환할 탁, 밝을 탁 柝=쪼갤 탁, 조두 탁, 목탁 탁 橐=전대 탁, 자루 탁, 도가니 탁, 공잇소리 탁, 짐승이름 탁 沰=떨어뜨릴 탁, 돌 던질 탁, 떨어질 탁 涿=물방울 떨어질 탁, 칠 탁, 물이름 탁, 땅이름 탁 濁=흐릴 탁, 더러울 탁, 물이름 탁 濯=씻을 탁, 빨래할 탁, 적실 탁, 클 탁, 빛날 탁, 산 민둥민둥할 탁, 살찔 탁, 놀 탁 琢=옥 쪼을 탁, 옥 다듬을 탁, 가릴 탁 琸=사람이름 탁 矺=나무이름 탁 籜=대 껍질 탁 蘀=떨어질 탁, 마를 탁 託=맡길 탁, 부탁할 탁, 핑계할 탁 讬=託과 同字 踔=우뚝 설 탁, 앙감질 탁 踱=맨발로 걸을 탁, 아금막기할 탁 逴=멀 탁, 절름거릴 탁, 뛰어날 탁 鐸=요령 탁, 목탁 탁 度=꾀할 탁, 헤아릴 탁, 벼슬이름 탁 拓=물리칠 탁, 헤칠 탁, 밀칠 탁 [탄] 僤=도타울 탄, 빠를 탄 吞=呑과 同字 呑=삼킬 탄, 휩쌀 탄, 감출 탄, 멸할 탄 嘆=한숨쉴 탄 嘽=헐떡거릴 탄, 기꺼워할 탄, 많을 탄 坦=너그러울 탄, 평평할 탄, 넓을 탄 弹=彈과 同字 弾=彈의 略字 彈=쏠 탄, 악기부릴 탄, 탄알 탄, 탄핵할 탄 憚=수고로울 탄, 꺼릴 탄 憻=坦과 同字 攤=열 탄, 펼칠 탄 歎=탄식할 탄, 아름답다 할 탄, 화답할 탄 殫=다할 탄 氽=뜰 탄, 헤엄칠 탄 灘=여울 탄, 해 이름 탄 炭=숯 탄, 불똥 탄, 볶일 탄 癱=중풍증 탄, 사지 틀릴 탄 綻=옷 터질 탄, 나타날 탄, 파할 탄 袒=솔기 터질 탄 誕=기를 탄, 클 탄, 속일 탄, 넓을 탄, 탄생할 탄, 방탕할 탄 驒=돈짝무늬총이말 탄 [탈] 侻=간사할 탈, 가벼울 탈, 간략할 탈 奪=빼앗을 탈, 잃어버릴 탈, 좁은 길 탈, 깎을 탈 稅=풀 탈, 끌를 탈 税=稅과 同字 脫=벗어날 탈, 간략할 탈, 뼈 바를 탈, 그르칠 탈 脱=脫과 同字 [탐] 僋=늘어날 탐, 어리석을 탐 嗿=여럿이 먹는 소리 탐 忐= 探=더듬을 탐, 찾을 탐, 취할 탐, 염탐할 탐 眈=노려볼 탐, 즐길 탐 耽=즐길 탐, 귀 축 늘어질 탐, 웅크리고 볼 탐, 즐거울 탐, 깊고 멀 탐 貪=탐할 탐, 욕심낼 탐 酖=술 즐길 탐 [탑] 傝=답답할 탑, 불안할 탑, 어리석을 탑, 용렬할 탑 嗒=우두먼할 탑 嚃=훅 들어마실 탑 塌=낮은 땅 탑, 초벌갈 탑, 떨어질 탑 塔=탑 탑 搨=비문 박을 탑, 베낄 탑 搭=모뜰 탑, 박을 탑 榻=평상 탑, 모직 탑, 자리 탑 鰨=큰 배 탑 [탕] 偒=헌걸찰 탕 宕=골집 탕, 방탕할 탕, 석수 탕 帑=나라 곳집 탕 湯=물 끓일 탕, 물이름 탕, 씻을 탕 燙=씻을 탕, 불에 델 탕 盪=씻을 탕, 움직일 탕, 진동할 탕, 그릇 부실 탕, 뭍 배질할 탕 碭=무늬진 돌 탕, 흰 기운 탕, 넘칠 탕, 산이름 탕 糖= 蕩=넓고 클 탕, 없어질 탕, 방탕할 탕, 소탕할 탕 蘯=盪과 同字 糖= [태] 兊=兌의 俗字 兌=기쁠 태, 지름길 태, 모일 태, 통할 태, 곧을 태, 구멍 태, 바꿀 태, 괘 이름 태 兑=兌와 同字 台=별 태, 늙을 태 呆= 埭=보뚝 태 大=클 태, 굵을 태 太=클 태, 굵을 태, 심할 태, 처음 태, 콩 태 娧=기뻐할 태, 더딜 태 孡= 怠=게으를 태, 느릴 태, 거만할 태 態=모양 태, 뜻 태 抬=칠 태 殆=위태할 태, 가까이할 태, 비롯할 태 汰=미끄러울 태, 넘칠 태, 씻길 태, 사치할 태 泰=클 태, 통할 태, 너그러울 태, 편안할 태, 괘 이름 태 笞=볼기칠 태 胎=아이 밸 태, 시작 태 脫=천천할 태, 더딜 태 脱=脫와 同字 苔=이끼 태 詒=속일 태 跆=밟을 태 迨=미칠 태 逮=미칠 태, 쫓을 태 邰=태나라 태 銳=창 태 鋭=銳와 同字 颱=몹시 부는 바람 태 鮐=복 태, 늙은이 등에 복 무늬 날 태 [택] 宅=집 택, 자리 택, 살 택, 정할 택, 묘 구덩이 택 択=擇의 略字 擇=가릴 택, 추릴 택, 차별할 택 沢=澤의 略字 澤=못 택, 진펄 택, 진액 택, 윤택할 택, 비와 이슬 택 宅=집 택, 자리 택, 살 택, 정할 택, 묘 구덩이 택 [탱] 幀= 撐=버틸 탱, 취할 탱, 헤칠 탱 撑=撐의 俗字 牚= [터] 攄=펼칠 터, 흩을 터, 날칠 터, 비길 터 [토] 兎=兔의 俗字 兔=토끼 토 吐=토할 토, 나올 토, 펼 토 土=흙 토, 뿌리 토, 나라 토, 뭍 토 套=장대할 토, 씌울 토, 캐캐묵을 토, 껍질 토, 땅이 굽어진 곳 토 討=다스릴 토, 칠 토, 찾을 토, 벨 토, 꾸짖을 토 [톤] 啍=입김 톤, 느럭느럭할 톤 噋=啍과 同字 噸= 瓲= [통] 恫=슬플 통, 아플 통, 앓을 통 慟=서러울 통 桶=엿되들이 통 통 樋=대 홈 통, 어름나무 통 洞=구렁 통, 깊을 통, 빌 통, 밝을 통 痛=아플 통, 상할 통, 심할 통, 몹시 통 筒=사통대 통, 통 통 筩=대나무통 통, 낚시 통 統=거느릴 통, 벼리 통, 실마디 통, 근본 통, 이을 통 通=뚫릴 통, 사무칠 통, 형통할 통, 사귈 통, 다닐 통, 간음할 통 洞=구렁 통, 깊을 통, 빌 통, 밝을 통 [퇴] 堆=흙무더기 퇴 놓을 퇴, 언덕 퇴 推=밀 퇴 敦=쪼을 퇴, 모을 퇴, 다스릴 퇴, 끊을 퇴, 곱송거릴 퇴, 성낼 퇴 槌=몽둥이 퇴, 너스레 퇴, 누에시렁 퇴, 던질 퇴 腿=넓적다리 퇴 褪=옷 벗을 퇴, 꽃빛 옅어질 퇴 追=옥 다듬을 퇴, 쇠북 꼭지 퇴 退=물러갈 퇴, 겸양할 퇴, 물리칠 퇴 鎚=옥 다듬을 퇴 隤=무너질 퇴, 미끄러질 퇴, 부드러울 퇴, 땅이름 퇴 頹=기울어질 퇴, 사나운 바람 퇴, 쇠할 퇴, 무너질 퇴, 대머리 퇴 頽=頹와 同字 [투] 偷=偸와 同字 偸=훔칠 투, 엷을 투, 구차할 투, 인정머리없을 투 套=전례 투 妒=투기할 투, 미워할 투, 강샘할 투, 부러워할 투 妬=투기할 투, 자식 없는 계집 투 投=던질 투, 버릴 투, 줄 투, 의탁할 투 渝=빛 변할 투, 더러워질 투, 고을이름 투 透=통할 투, 사무칠 투, 지나칠 투 骰=주사위 투 鬪=싸움 투 [퉁] 佟= [특] 忒=변할 특, 의심할 특, 어기어질 특 慝=간악할 특, 간사할 특, 더러울 특 特=우뚝할 특, 숫소 특, 뛰어날 특, 다만 특, 세 살 먹은 짐승 특 貸=빌릴 특 [틈] 闖= [파] 叵=못할 파, 드디어 파, 술잔 파 吧=아이 다툴 파 坡=언덕 파, 제방 파 壩=방죽 파, 둑 파 妑=새앙머리 파, 갈래머리 파 婆=할머니 파, 너풀너풀 춤출 파 岥=산 비알질 파 巴=꼬리 파, 뱀 파, 땅이름 파 帕=머리 동이수건 파 怕=두려울 파 把=잡을 파, 헤칠 파 播=심을 파, 펼칠 파, 버릴 파, 까불 파, 달아날 파 擺=열 파, 헤칠 파, 제거할 파, 손뼉칠 파 朳= 杷=비파나무 파, 써레 파, 칼자루 파, 악기이름 파 汃= 汴= 波=물결 파, 물 젖을 파, 눈 광채 파, 움직일 파, 달빛 파 派=물 갈래 파, 보낼 파, 나눌 파, 파벌 파 灞=물이름 파 爬=긁을 파, 기어다닐 파 爸=아비 파 玻=파려옥 파, 유리옥 파 琶=비파 파 疤=흉터 파 皤=흴 파, 배 불룩할 파, 귀 밑에 희끗희끗할 파 破=깨뜨릴 파, 다할 파, 갈라질 파 笆=가시 대 파, 울타리 파 簸=까부를 파, 키 파 罷=파할 파, 내칠 파 耙=쇠시랑 파 芭=파초 파 菠=시금치 파 葩=꽃봉오리 파 跛=절뚝발이 파 鄱=땅이름 파 靶=고삐 파 頗=비뚤어질 파, 자못 파 [판] 判=판단할 판, 쪼갤 판, 맡을 판 坂=언덕 판, 산비탈 판, 순나라 서울이름 판 板=널조각 판, 널기와 판, 풍류이름 판 版=조각 판, 호적 판, 국경 판, 한 길 판, 인쇄할 판 瓣=외씨 판, 실과씨 판, 꽃잎 판 販=장사 판, 팔 판 辦=힘들일 판, 갖출 판 鈑=불린 금 판 阪=산비탈 판, 언덕 판 [팔] 八=여덟 팔 叭=나팔 팔, 입 벌릴 팔 捌=깨뜨릴 팔, 나눌 팔, 칠 팔 [팟] 巼=땅이름 팟 [패] 伯=우두머리 패, 으뜸 패 佩=패옥 패, 찰 패, 마음에 먹을 패, 물이 흘러서 합할 패 倍=어길 패, 떨어질 패, 암송할 패 唄=염불소리 패, 노래부를 패 孛=혜성 패 悖=거스를 패, 어지러울 패 抜=拔와 同字 拔=밋밋할 패, 휘어 꺾을 패 拨= 敗=헐어질 패, 무너질 패, 깨어질 패, 썪을 패 旆=기 패, 깃발 날릴 패 沛=둥둥 뜰 패, 비 쏟아질 패, 넉넉할 패 浿=물이름 패, 물가 패 牌=방 붙일 패, 호패 패, 방패 패 狽=이리 패 珮=노리개 패, 찰 패 稗=돌피 패, 조그마할 패 肺=성할 패 背=버릴 패, 배반할 패 覇=霸의 俗字 貝=조개 패, 재물 패, 비단 패 邶=패나라 패 霈=비 쏟아질 패 霸=으뜸 패, 패왕 패 [팽] 亨=삶을 팽 伻=부릴 팽, 좇을 팽 傍=마지못할 팽 彭=성씨 팽, 땅이름 팽, 방패 팽, 총소리 팽, 북소리 팽 旁=휘몰아갈 팽 澎=물소리 팽, 물결 부딛는 형세 팽 烹=삶을 팽, 요리 팽 砰=여울 물소리 팽 祊=사당문 제사 팽 膨=배 불룩할 팽 蟚=蟛과 同字 蟛=방게 팽 [퍅] 愎=사나울 퍅, 고집할 퍅 [편] 便=편할 편, 소식 편, 익힐 편, 오줌 편 偏=치우칠 편, 무리 편, 오십명 편, 간사한 모양 편 匾= 平=편편할 편 徧= 惼=조급할 편, 편협할 편 扁=특별할 편, 거룻배 편 片=조각 편, 쪼갤 편, 성씨 편 篇=책 편, 편차할 편 編=책편 편, 기록할 편, 첩지 편, 벌릴 편 緶=꿰맬 편 翩=훌쩍 날 편, 오락가락할 편 艑=거룻배 편 萹= 蝙=박쥐 편 褊=좁을 편, 급할 편, 옷이 몸에 낄 편 諞=공교한 말 편 蹁=돌쳐갈 편, 잘름거릴 편 遍=두루 편 鞭=채찍 편, 볼기채 편, 태장 편 騙=속일 편, 말에 뛰어 오를 편 鯿=병어 편 [폄] 砭=돌침 폄 窆=하관할 폄, 광중 폄 貶=떨어질 폄, 덜릴 폄, 꺾을 폄, 귀양보낼 폄 [평] 匉=크게 소리지를 평 坪=벌판 평, 평평할 평 平=평탄할 평, 바를 평, 고를 평, 다스릴 평, 쉬울 평, 풍년 평, 화친할 평, 재관관 평 怦=맘 급할 평, 칼칼할 평 抨=탄핵할 평 拼=좇을 평 枰=장기판 평, 바둑판 평, 회양목 평 泙=물소리 평, 물결 셀 평 硼=평돌 평 苹=맑은 대쑥 평, 사과 평 萍=마름 평, 머구리밥 평, 개구리밥 평 蓱=마름 평, 머구리밥 평, 개구리밥 평 評=평론할 평, 헤아릴 평, 고칠 평, 기롱할 평 鮃=가자미 평 [폐] 吠=짖을 폐, 땅이름 폐 嬖=사랑할 폐, 윗사람으로부터 사랑받을 폐, 벼슬이름 폐 幣=폐백 폐, 예물 폐, 재물 폐, 돈 폐 廃=廢의 略字 廢=폐할 폐, 내칠 폐, 집 쏠릴 폐, 떨어질 폐 弊=해질 폐, 폐단 폐, 곤할 폐, 곰곰 궁리할 폐, 결단할 폐, 엎드릴 폐 敝=옷 해질 폐, 버릴 폐, 무너질 폐, 실패할 폐, 활줌통 폐 斃=죽을 폐, 엎드러질 폐 杮=대패밥 폐 狴=짐승이름 폐, 옥 폐, 들개 폐 獘=곤할 폐, 폐단 폐, 죽을 폐, 엎드러질 폐 癈=고질병 폐 肺=허파 폐, 부아 폐, 친할 폐, 마음속 폐 蔽=가리울 폐, 다할 폐, 정할 폐 薜=승검초 폐, 돌삼 폐 閉=닫을 폐, 마칠 폐, 가릴 폐 陛=대궐 섬돌 폐 髀=볼기짝 폐 [포] 佈=펼칠 포 儤= 刨=깎을 포 勹=꾸릴 포, 쌀 포 包=꾸릴 포, 용납할 포, 더부룩히 날 포, 보따리 포 匍=엉금엉금 길 포, 엎드러질 포 匏=박 포, 바가지 포, 퉁소 포 咆=고함지를 포, 짐승소리 포, 불끈 성낼 포 哺=씹어 먹을 포, 먹일 포 圃=채마밭 포, 밭 갈 포, 곳 포, 산이름 포 布=베 포, 피륙 포, 벌릴 포, 돈 포, 베풀 포 庖=푸줏간 포, 부엌 포 怖=두려울 포, 놀래킬 포 抛=拋와 同字 抱=안을 포, 품을 포, 낄 포 拋=던질 포, 버릴 포, 돌소뇌 포 捕=사로잡을 포 晡=신시 포, 해질 포 暴=사나울 포, 급할 포, 맨손으로 칠 포, 불끈 일어날 포, 마를 포, 상할 포 曓=급할 포, 창졸 포 曝=볕 쬘 포, 볕 쏘일 포 泡=물거품 포, 물이 솟아날 포, 물 흐를 포, 성할 포 浦=물가 포, 갯가 포 瀑=소나기 포, 물거품 포 炮=그슬릴 포, 싸서 구울 포, 형벌 포 炰=그슬 포, 까불거릴 포 疱=부풀 포, 부르틀 포 砲=큰 대포 포, 돌쇠뇌 포, 돌 튀기는 화살 포 胞=태보 포, 한 배 포, 동포 포 脯=포 포 舖=鋪의 俗字 苞=그령풀 포, 밑둥 포, 초목이 다복히 날 포, 꾸러피 포 葡=포도 포, 들머리 포, 나라이름 포 蒲=부들풀 포, 창포 포, 개버들 포 袍=도포 포, 관디 포, 앞섶 포 褒=포장할 포, 옷 뒤길 포, 도포 포, 고을이름 포 誧=꾀할 포, 클 포, 도울 포, 간할 포 逋=달아날 포, 포흠할 포 鉋=대패 포 鋪=전방 포, 베풀 포, 문고리 포, 펼 포, 아플 포 鞄=가방 포, 가죽 다로는 장인 포 飽=배부를 포, 물릴 포, 먹기 싫을 포, 흡족할 포 餔=저녁 곁두리 포, 먹을 포 鮑=절인 생선 포, 성씨 포 鯆=매가리 포, 물아지 포 齙=이 드러날 포 暴=사나울 포, 급할 포, 맨손으로 칠 포, 불끈 일어날 포, 마를 포, 상할 포 [폭] 幅=폭 폭, 겉치레할 폭 暴=햇빛 쪼일 폭, 나타날 폭, 드러날 폭 曝=햇볕에 말릴 폭 瀑=폭포수 폭 爆=불터질 폭 輻=바퀴살통 폭 輻=바퀴살통 폭 [폴] 乶=땅이름 폴 [폿] 喸=땅이름 폿 [표] 俵=나누어 줄 표, 흩어질 표, 가마니 표 僄=몸이 가벼울 표, 진중치 못할 표 儦=떼지어 걷는 모양 표, 많을 표 剽=표독할 표, 긁을 표, 겁박할 표, 끝 표, 찌를 표, 빠를 표 勡=겁탈할 표, 겁박할 표 嘌=휙 불 표, 몰아갈 표 嫖=가벼울 표, 날랠 표, 색에 빠질 표 彪=칡범 표, 문채 표, 작은 범 표 慓=급할 표 摽=칠 표, 두를 표, 찔러 밀칠 표, 가슴 만질 표 杓=북두자루 표 標=표시할 표, 높은 가지 표, 적을 표, 나무 끝 표 殍=굶어 죽을 표 漂=뜰 표, 움직일 표, 으스스할 표, 높이 훨훨 날 표 熛=불똥 튈 표, 성낼 표, 붉을 표, 빛날 표 瓢=표주박 표 票=쪽지 표, 문서 표, 불날릴 표, 훌쩍 날 표, 날랠 표 縹=옥빛 표, 훌쩍 날 표 膘=허구리살 표, 소 볼기 표, 부레 표 莩=굶어죽을 표 表=겉 표, 윗옷 표, 밝을 표 裱=목수건 표 豹=표범 표, 아롱범 표 鏢=칼날 표, 비수 표 鑣=말 재갈 표, 성할 표 飄=회오리바람 표, 나부낄 표, 떨어질 표 飆=飇와 同字 飇=회오리바람 표 驃=날쌜 표, 누런 말 표 髟=머리털 희뜩희뜩할 표, 깃발 날릴 표, 머리 늘일 표 鰾=부레 표 [푼] 分=세는 단위 푼 [품] 品=뭇 품, 품수 품, 가지 품, 벼슬 차례 품 禀=여쭐 품, 사뢸 품, 받을 품, 성품 품 稟=여쭐 품, 줄 품, 받을 품, 성품 품 [풍] 凨=風과 同字 凮=風의 譌字 楓=단풍나무 풍, 신나무 풍 瘋=두풍 풍, 미치광이 풍 葑=무 풍 諷=비유로 간할 풍, 외울 풍 豊=豐의 略字 豐=풍년 풍, 두터울 풍, 왕콩 풍, 괘 이름 풍 闏= 風=바람 풍, 흘레할 풍, 울릴 풍, 풍속 풍, 경치 풍, 위엄 풍, 병풍 풍, 모양 풍 馮=벼슬이름 풍, 성씨 풍, 물귀신이름 풍, 고을이름 풍 [피] 佊=간사할 피 僻=피할 피 彼=저 피 披=헤칠 피, 흩어질 피, 찢어질 피 疲=피곤할 피, 나른할 피 皮=가죽 피, 껍질 피, 성씨 피 罷=느른할 피, 고달플 피, 잔병 피 被=이불 피, 덥힐 피, 미칠 피, 나타날 피, 창피할 피 詖=말 잘할 피, 간사할 피, 알소할 피 跛=기울어 지게 설 피 辟=피할 피 避=숨을 피, 어길 피, 싫어할 피 陂=기울어질 피, 치우칠 피 鞁=말 가슴걸이 피, 안갑 피 髲=머리쓰개 피, 첩지 피 [픽] 腷=뜩 막힐 픽, 답답할 픽, 닭 홰치는 소리 픽 [필] 佖=점잔피울 필, 가득할 필 佛=흥할 필, 도울 필 匹=짝 필, 둘 필, 한마리 필, 벗 필, 무리 필 吡=새소리 필 咇=향기날 필 嗶=울 필, 잔말할 필 弼=도울 필, 도지개 필, 거듭 필 必=반드시 필, 오로지 필, 살필 필, 기약 필 払=拂의 略字 拂=도울 필 泌=도랑물 필, 개천물 필 滭=샘 끓어 솟을 필 珌=칼 장식 옥 필 畢=마칠 필, 토끼그물 필, 다할 필, 편지 필, 책 필, 고기 꿰 다는 나무 필 疋=짝 필, 끝 필 筆=붓 필, 오랑캐 이름 필 篳=대 사립문 필, 나무 실은 수레 필 罼=토끼그물 필 苾= 蓽=휘추리 필, 약이름 필 觱=바람이 쌀쌀할 필, 대평수 필 蹕=길 치울 필 鞸=슬갑 필 韠=슬갑 필 馝=향내날 필 駜=살찐 말 필 鵯=갈가마귀 필 [핍] 乏=없을 핍, 옹색할 핍, 다할 핍 偪=핍박할 핍, 가까울 핍 逼=가까울 핍, 궁핍할 핍, 핍박학 핍 [하] 丅=下의 簡體字 下=아래 하 丷=구결 하 何=어찌 하 假=거짓 하 厦=큰 집 하 呀=입 벌릴 하 哬=꾸짖을 하 嘏=복 하 嚇=놀라게 할 하 夏=여름 하 岈=휑뎅그렁할 하 廈=큰 집 하 懗=속일 하 昰=是와 同字 河=물 하 煆=불사를 하 瑕=티 하 瘕=이질 하 緞=신발 하 罅=틈 하 荷=연 하 蝦=새우 하 賀=축하할 하 遐=멀 하 鍜=목투구 하 霞=놀 하 鰕=새우 하 [학] 嗀=게울 학 嗃=꾸짖을 학 嚛=매울 학 壑=골짜기 학 奭=성대할 학 学=學의 略字 學=배울 학 斈=學의 略字 涸=마를 학 狢=오소리 학 瘧=학질 학 皬=흴 학 确=확실할 학 虐=사나울 학 謔=희롱할 학 郝=고을 이름 학 鶴=두루미 학 鷽=메까치 학 鶴=두루미 학 [한] 佷=잔인할 한 僩=노할 한 厂=사람 이름 한 嫺=우아할 한 嫻=우아할 한 寒=찰 한 恨=한탄할 한 悍=사나울 한 扞=막을 한 捍=막을 한 旱=가물 한 暵=말릴 한 桿=막대기 한 汗=땀 한 漢=한수 한 澣=빨 한 瀚=넓고 큰 한 罕=드물 한 翰=날개 한 邗=고을 이름 한 邯=고을 이름 한 閈=마을 문 한 閑=한가할 한 閒=한가할 한 限=한정할 한 韓=나라 이름 한 駻=사나운 말 한 鷳=소리개 한 鼾=코골 한 [할] 乤=고을 이름 할 割=벨 할 劼=삼갈 할 嗐=감탄사 할 害=손해 할 瞎=애꾸눈 할 轄=다스릴 할 [함] 函=상자 함 凾=상자 함 含=머금을 함 咸=모두 함 唅=머금을 함 啣=재갈 함 喊=소리 함 圅=담을 함 檻=우리 함 涵=젖을 함 濫=넘쳐흐를 함 緘=봉할 함 艦=싸움배 함 莟=꽃봉오리 함 菡=연봉오리 함 諴=화할 함 轞=함거 함 邯=고을 이름 함 銜=재갈 함 闞=범 소리 함 陥=빠질 함 陷=빠질 함 鹹=짤 함 [합] 匌=기운 답답할 합 合=합할 합, 같을 합, 짝 합, 대답할 합 呷=빨아 마실 합, 떠들썩할 합, 벌릴 합, 집오리 우는 소리 합 哈=한 모금 합 嗑=잔말할 합, 웃는 소리 합, 입 다물 합, 괘 이름 합 柙=우리 합, 향나무 합 榼=술그릇 합, 물통 합, 뚜껑 합 溘=문득 합, 이를 합, 의지할 합 盍=덮을 합, 합할 합, 어찌 아니할 합 盒=소반 뚜껑 합, 합 합 盖=蓋과 同字 蓋=이엉 덮을 합 蛤=조개 합 郃=땅이름 합 閤=도장 합, 침방 합, 개구리소리 합 闔=문짝 합, 닫을 합 陜=땅이름 합 [항] 亢=목 항, 높을 항, 별이름 항, 기둥 항, 가릴 항 伉=강직할 항, 우뚝할 항, 배필 항, 겨룰 항 佷=돌아올 항, 고을이름 항 吭=목구멍 항, 새 목구멍 항 夯=멜 항, 다질 항 姮=항아 항, 달에 사는 미녀 항, 달 부르는 다른 이름 항 嫦=姮과 同字 巷=거리 항, 마을 항, 복도 항, 내시 항 恆=恒의 本字 恒=늘 항, 옛 항 抗=막을 항, 들 항, 겨룰 항 杭=건널 항, 거루 항, 고을이름 항 桁=수갑 항, 배다리 항, 횃대 항 沆=큰 물 항, 진펀할 항, 이슬 항 港=물 갈라질 항, 항구 항, 뱃길 항 炕=마를 항, 구울 항, 구들 항 缸=항아리 항 缿=항통 항, 문서함 항, 벙어리 항 肛=똥구멍 항, 배 뚱뚱할 항 航=쌍배 항, 배질할 항 行=시장 항, 항렬 항, 굳셀 항 降=항복할 항 項=목덜미 항, 클 항, 항목 항 頏=목 항, 오르락 내리락할 항 骯=꼿꼿할 항 鬨=싸움소리 항 行=시장 항, 항렬 항, 굳셀 항 降=항복할 항 [해] 亥=열 둘째 지지 해, 서북쪽과 북쪽의 사이 방향 해, 음력 시월 해, 돼지 해 侅=이상할 해 偕=함께할 해, 굳셀 해 劾=안찰할 해, 힘쓸 해 咍=비웃을 해 咳=기침 해, 침 뱉을 해, 방글방글 웃을 해 嗐=하품할 해 垓=땅 가장자리 해, 햇수 해, 계단 해 夥=많을 해, 동무 해 奚=어찌 해, 종 해, 큰 배 해 孩=어린아이 해, 방글방글 웃을 해 害=해할 해, 시기할 해, 죽일 해 嶰=골짝 사이 해, 골 이름 해 廨=관청 해, 공해 해 懈=게으를 해 楷=해나무 해, 본뜰 해, 해자 해, 법 해 欬=기침할 해, 크게 부를 해, 일깨울 해 海=바다 해, 많을 해, 세계 해 瀣=찬이슬 해, 이슬 기운 해 獬=신통한 양 해, 해갓 해 瑎= 痎=학질 해, 하루거리 해 薤=염교 해, 부추 해 蟹=게 해 解=쪼갤 해, 꺠우칠 해, 풀 해, 괘 이름 해, 벗을 해 該=갖출 해, 모두 해, 겸할 해, 마땅할 해 諧=조화할 해, 글 해, 기롱지거리할 해, 고를 해 邂=우연히 만날 해 醢=젓 해, 젓 담글 해, 젓 담그는 형벌 해 陔=층 뜰 해, 언덕 해, 변방 해 頦=턱 해 駭=놀랄 해, 북 울릴 해 骸=뼈 해 鮭=어채 해, 복 해 龤=노래의 가락이 조화될 해 [핵] 劾=캐물을 핵, 핵실할 핵 核=실과 핵, 자세할 핵 翮=깃촉 핵, 쭉지 핵, 칼 갓 핵 覈=핵실할 핵, 겨무거리 핵, 씨 핵, 액색할 핵 輅=수레앞 가로막이 나무 핵, 맞을 핵 [행] 倖=요행 행, 괴일 행, 아당할 행, 친할 행 幸=다행할 행, 바랄 행 悻=발끈 성낼 행 杏=살구 행, 은행 행 荇=마름풀 행, 조아기 행 行=다닐 행, 길귀신 행, 오행 행, 그릇 얄긋거릴 행, 행서 행, 행실 행 [향] 享=드릴 향, 제사지낼 향, 잔치 향, 흠향할 향 向=향할 향, 나아갈 향, 북쪽 창 향, 기울어질 향 嚮=향할 향, 누릴 향, 울릴 향, 받을 향 珦= 薌=곡기 향, 향기 향, 기장 향 郷=鄕과 同字 鄉=鄕과 同字 鄕=시골 향, 고향 향 響=소리 울릴 향, 소리 마주칠 향, 악기 향 餉=먹일 향, 군량 향, 점심 향 饗=잔치할 향, 흠향할 향 香=향내 향, 약이름 향 [허] 嘘=噓의 俗字 噓=불 허, 뿜을 허 墟=옛 터 허, 장 허, 큰 두덕 허 歔=한숨 쉴 허, 흑흑 느껴 울 허, 코로 숨 내쉴 허 虚=虛의 俗字 虛=빌 허, 헛될 허, 다할 허, 약할 허, 거짓 허, 하늘 허 許=허락할 허, 나아갈 허, 기약할 허, 여럿이 힘쓰는 소리 허 [헌] 仚=날듯할 헌 巚=봉우리 헌, 시루봉 헌 幰=수레 안장 헌, 휘장 헌 憲=법 헌, 표준될 헌, 고시할 헌, 기뻐할 헌 攇=비길 헌, 물건 맬 헌 櫶= 献=獻의 俗字 獻=바칠 헌, 음식 헌, 어진이 헌 軒=초헌 헌, 껄껄 웃을 헌, 주적댈 헌, 추녀끝 헌, 고기 굵게 저밀 헌 [헐] 歇=쉴 헐, 나른할 헐, 다할 헐, 으슥할 헐, 스러질 헐, 흩어질 헐 [험] 崄=嶮과 同字 嶮=산 가파를 험 獫=험윤 오랑캐 험 玁=獫과 同字 険=險의 略字 險=험할 험 験=驗의 略字 驗=시험할 험, 중험할 험, 보람 험 [혀] 暳= [혁] 侐=고요할 혁 嚇=노할 혁, 꾸짖을 혁 奕=아름다울 혁, 클 혁, 차례 혁, 바둑 혁, 빛날 혁, 근심할 혁 弈=바둑둘 혁 洫=넘칠 혁, 빌 혁, 봇도랑 혁 焱=불꽃 혁 爀=불빛 혁, 빛날 혁 赫=불 이글이글할 혁, 빛날 혁, 성할 혁 革=가죽 혁, 고칠 혁, 갑주 혁 鬩=송사할 혁, 싸울 혁 [현] 伣=俔과 同字 俔=연탐할 현, 풍세보는 깃 현 儇=영리할 현, 빠를 현 吅=부르짖을 현 呟=소리 현 哯=아이 젖 토할 현 嬛=산뜻할 현 峴=고개 현, 산이름 현 弦=시위 현, 반달 현, 맥박 잦을 현, 땅이름 현 懸=매달 현, 멀 현 昡=햇빛 현 晛=햇발 현 泫=물 깊을 현, 이슬 맺힐 현, 눈물 줄줄 흘릴 현 洵=멀 현 炫=밝을 현, 불빛 현 玄=검을 현, 검붉을 현, 하늘 현, 아득할 현, 고요할 현 現=나타날 현, 지금 현, 옥빛 현 琄= 痃=힘줄 당기는 병 현, 적병 현 県=고을 현, 지방 현 眩=아찔할 현, 현혹할 현 睍=물끄러미 볼 현, 고울 현 絃=줄풍류 현 絢=채색무늬 현 縣=매달릴 현, 끊어질 현 繯=얽힐 현, 둘릴 현, 맬 현 翾=파뜩파뜩 날 현, 경박할 현, 영리할 현, 급할 현 舷=뱃전 현 蜆=가막조개 현, 호수이름 현 衒=자랑할 현, 팔릴 현 見=나타날 현, 드러날 현, 있을 현, 보일 현 誢= 賢=어질 현, 좋을 현, 구멍 현 鉉=솥귀 현 鋗=노구솥 현, 퉁노구 현 顕=顯의 略字 顯=나타날 현, 밝을 현, 통달할 현, 높을 현 駽=돗총이 현, 철총이 현 見=나타날 현, 드러날 현, 있을 현, 보일 현 [혈] 吷=마실 혈, 새소리 혈, 작은소리 혈 孑=외로울 혈, 나머지 혈, 창갈구리 혈 穴=굴 혈, 움 혈, 틈 혈, 굿 혈 絜=헤아릴 혈, 묶을 혈 血=피 혈, 피붙이 혈, 씩씩할 혈 趐=새가 떼로 날 혈, 나아갈 혈 頁=머리 혈, 마리 혈, 페이지(page) 혈 [혐] 嫌=싫어할 혐, 의심할 혐, 유쾌하지 않을 혐 [협] 侠=俠과 同字 俠=의기 협, 사이에 낄 협 劦=힘을 합할 협 勰=생각할 협, 조화할 협 匧=옷상자 협, 꿰맬 협 協=조화할 협, 맞을 협, 도울 협 叶=화합할 협 嗋=들이마실 협 埉= 夾=곁 협, 낄 협, 잡을 협, 성씨 협, 가까울 협 峽=물 낀 두메 협, 산이름 협 恊=겁낼 협, 위협할 협 悏= 愜=쾌할 협, 뜻에 맞을 협 慊=족할 협 挾=낄 협, 도울 협, 품을 협 浹=사무칠 협, 둘릴 협 狹=좁을 협 篋=상자 협, 행담 협 脅=갈빗대 협, 위협할 협 脇=脅과 同字 莢=콩 꼬투리 협, 명협 협 鋏=칼 손잡이 협, 집개 협 陜=좁을 협 頬=頰과 同字 頰=뺨 협, 천천히 말할 협 [형] 亨=형통할 형, 제사 형 侀=이룰 형, 모일 형 兄=맏이 형 刑=형벌 형, 죽일 형 哼=겁낼 형 型=거푸집 형, 본보기 형 夐=멀 형, 바라보는 모양 형 娙=여관 이름 형, 예쁠 형 形=모양 형, 몸 형 桁=시렁 형, 마개 형 泂=멀 형, 깊고 넓은 모양 형, 차가운 형 滎=실개천 형, 물결 일 형 瀅=맑을 형, 개천 형 灐=물 이름 형 炯=빛날 형, 밝을 형 熒=등불 형 營=별이름 형 玹= 珩=노리개 형, 갓끈 형 瑩=밝을 형 荆=광대싸리 형, 가시 형 荊=모형나무 형, 곤장 형 蛍=螢과 同字 螢=개똥벌레 형 衡=저울대 형 詗=염탐할 형, 구할 형 迥=막을 형, 차단할 형 逈=멀 형, 빛날 형 邢=나라 이름 형, 땅 이름 형 鎣=줄 형, 꾸밀 형 陘=지레목 형, 비탈 형 馨=향기 형 [혜] 偕=같을 혜, 화할 혜 傒=묶을 혜 儶=빠를 혜, 잴 혜 兮=어조사 혜 匸=감출 혜, 덮을 혜 嘒=가냘플 혜 寭=밝힐 혜, 깨달을 혜 彗=비 혜, 꼬리별 혜 徯=기다릴 혜, 사잇길 혜 恵= 惠=은혜 혜, 사랑할 혜 慧=슬기로울 혜, 총명할 혜 槥=널 혜, 작은 관 혜 盻=흘겨볼 혜, 돌아볼 혜 蕙=혜초 혜 謑=창피줄 혜 譿=슬기로울 혜 蹊=지름길 혜, 건널 혜 醯=초 혜, 위대로울 혜 鞋=신 혜 鼷=새앙쥐 혜 [호] 乎=인가 호 互=서로 호, 함께 호 儫=영웅 호 冱=찰 호, 얼 호, 막을 호 冴=冱의 俗字 号=號의 略字 吳= 呉= 呺=큰체할 호 呼=부를 호, 숨 내쉴 호 唬=범이 울 호, 외칠 호 嘑=부르짖을 호, 거칠게 말할 호 嘷=짖을 호, 외칠 호 嚎=울부짖을 호 壕=해자 호 壺=병 호, 단지 호 壼= 好=좋을 호, 옳을 호 嫮=아름다울 호, 시기할 호 岵=산 호 弧=활 호 怙=믿을 호 戶=지게 호 户= 戸= 扈=뒤따를 호 昊=하늘 호, 큰 모양 호 晧=밝을 호, 빛날 호 暠=흴 호 毫=가는 털 호 沍=冱의 譌字 浩=클 호 淏=맑을 호 湖=호수 호 滈=장마 호 滬=강 이름 호 滸=물가 호 澔=浩와 同字 濠=해자 호, 강 이름 호 濩=퍼질 호 灝=넓을 호, 콩 삶은 물 호 犒=호궤할 호 狐=여우 호 猢=원숭이 호 琥=호박 호 瑚=산호 호 瓠=표주박 호, 단지 호 皐=부를 호 皓=흴 호, 깨끗할 호 皜=흴 호, 흰 모양 호 皞=밝을 호, 흴 호 祜=복 호 穫=땅 이름 호 箎=긴 대 호 糊=풀 호, 끈끈할 호 縞=명주 호, 흴 호 聕=들릴 호, 긴 귀 호 胡=턱밑살 호 芦=芐와 同字, 蔖의 俗字 葫=마늘 호, 조롱박 호 蒿=쑥 호, 향기날 호, 지칠 호 虎=범 호 號=울부짖을 호 許=이영차 호 護=보호할 호, 감쌀 호 豪=호걸 호, 귀인 호 醐=제호 호 鎬=호경 호 雇=새 이름 호 頀=구할 호, 지킬 호 顥=클 호, 빛나는 모양 호 餬=기식할 호 鬍=수염 호 [혹] 惑=미혹할 혹 或=혹 혹 熇=뜨거울 혹 酷=독할 혹 鵠=고니 혹 [혼] 倱=흐릿할 혼 圂=뒷간 혼 婚=혼인할 혼 惛=흐릴 혼 昆=덩어리 혼, 서쪽 오랑캐 이름 혼 昏=어두울 혼 棍=묶을 혼 混=섞을 혼 渾=흐릴 혼 溷=어지러울 혼 焜=빛날 혼 閽=문지기 혼 魂=넋 혼 鯇=산천어 혼 [홀] 唿=근심할 홀 囫=온전할 홀 忽=소흘히 할 홀 惚=황홀할 홀 核=씨 홀 笏=홀 홀 [홍] 哄=떠들썩할 홍 嗊=노래 홍 弘=넓을 홍 晎=날 밝으려 할 홍 汞=수은 홍 泓=깊을 홍 洪=큰물 홍 澒=수은 홍 烘=횃불 홍 篊=홈통 홍 紅=붉을 홍 虹=무지개 홍 訌=무너질 홍 鉷=돌쇠뇌 홍 閧=싸우는 소리 홍 鬨=싸울 홍 鴻=큰 기러기 홍 [화] 伙=세간 화 俰=화할 화 划=삿대 화 化=될 화 咊=순할 화 和=화할 화 嘩=譁와 同字 婲=예쁠 화 嬅=여자 이름 화 擭=덫 화, 함정 화 樺=자작나무 화 火=불 화 画=畫의 略字 畫=그림 화 畵=그림 화 禍=재화 화 禾=벼 화 花=꽃 화 華=꽃 화 話=말할 화 譁=시끄러울 화 貨=재화 화 靴=신 화 驊=준마 화 髁=넓적다리뼈 화 龢=풍류 조화될 화 [확] 劐=끊을 확 廓=클 확 拡=擴의 略字 擴=넓힐 확 攫=붙잡을 확 獲=낙심할 확 矍=두리번거릴 확 矡=호미 확 確=굳을 확 碻=굳을 확 礭=회초리 확 穫=벼 벨 확 鑊=가마 확 廓=둘레 확 [환] 丸=알 환 亘=굳셀 환 唤=喚과 同字 喚=부를 환 喛=성낼 환, 근심할 환 嚾=지껄일 환 圜=두를 환 奐=빛날 환 宦=벼슬 환 寰=기내 환 幻=변할 환 患=근심 환 懽=기뻐할 환 换=換과 同字 換=바꿀 환 擐=입을 환 晥=환할 환 桓=푯말 환 歓=歡과 同字 歡=기뻐할 환 涣=渙과 同字 渙=흩어질 환 湲=물소리 환, 물 졸졸 흐를 환 烉=煥의 俗字 焕=빛날 환 煥=불꽃 환 環=고리 환 瓛=옥홀 환 皖=샛별 환 眩=요술 환 睆=가득 차 있는 모양 환 紈=흰 비단 환 絙=끈목 환 讙=시끄러울 환 豢=기를 환 轘=환형 환 還=돌아올 환 鍰=무게 단위 환 鐶=고리 환 驩=기뻐할 환 鬟=쪽찐 머리 환 鯇=잉어 환 鰥=환어 환 [활] 咶=핥을 활, 이야기할 활 活=살 활 滑=미끄러울 활 猾=교활할 활 蛞=괄태충 활 豁=뚫린 골 활 越=부들자리 활 闊=트일 활 [황] 偟=노닐 황 况=況의 俗字 凰=봉황새 황 喤=어린아이 울음 황 媓=어머니 황 幌=휘장 황 徨=노닐 황 怳=멍할 황 恍=황홀할 황 惶=두려워할 황 惺= 愰=밝을 황 慌=어렴풋할 황 晃=밝을 황 晄=晃과 同字 榥=책상 황 況=하물며 황 湟=해자 황 滉=물 깊고 넓을 황 潢=웅덩이 황 煌=빛날 황 瑝=옥 소리 황 璜=서옥 황 皇=임금 황 礦=쇳돌 황 篁=대숲 황 簧=혀 황 肓=명치 끝 황 荒=거칠 황 蝗=누리 황 貺=줄 황 遑=허둥거릴 황 鎤=종소리 황 隍=해자 황 鰉=용상어 황 黃=누를 황 黄=누를 황 [홰] 噦=새소리 홰 噧=기운 높여 떠들 홰 [회] 会=會의 俗字 佪=어정거릴 회 劊=끊을 회 匯=물돌 회 回=돌 회 囬=回의 俗字 壞=혹 회 廻=돌 회 廽=돌 회 徊=노닐 회 恢=넓을 회 悔=뉘우칠 회 懷=품을 회 晦=그믐 회 會=모일 회 栃=상수리나무 회 樑= 檜=노송나무 회 洄=거슬러 올라 갈 회 淮=강 이름 회 滙=匯와 同字 澮=봇도랑 회 灰=재 회 烣=넓힐 회 獪=교활할 회 盔=바리 회 繪=그림 회 膾=회 회 茴=회향풀 회 蛔=거위 회 蜖= 詼=조롱할 회 誨=가르칠 회 賄=뇌물 회 迴=回와 同字 逥= 鄶=나라이름 회 頮=세수할 회 鱠=회 회 [획] 劃=쪼갤 획 嚄=외칠 획 獲=얻을 획 画=畫의 略字 畫=그을 획 畵=畫의 俗字 [횡] 宖=집 울릴 횡 横=비낄 횡 橫=가로 횡 澋=물이 빙 돌 횡 薨=많을 횡 衡=가로 횡 鈜=쇳소리 횡 鐄=종 횡 黌=글방 횡 [효] 俲=본받을 효, 닮을 효, 배울 효 倄=찌를 효, 끙끙 앓을 효, 한탄할 효 傚=본받을 효 効=效의 俗字 呺=큰체할 효 哮=으르렁거릴 효 啋= 嗃=성낸 소리 효 嘵=두려워할 효 嚆=울릴 효 嚻=한가할 효 囂=시끄럽다 효 孝=효도 효 崤=산 이름 효 效=본받을 효 敩=斆의 略字 斅=가르칠 효 斆=斅와 同字 暁=曉와 同字 曉=새벽 효 校=학궁 효 梟=올배미 효 殽=섞일 효 涍=성 효 淆=뒤섞일 효 烋=거들거릴 효 熇=불김 효 爻=효 효 皛=나타날 효 肴=안주 효 虓=울부짖을 효 酵=술밑 효 餚=반찬 효 驍=날랠 효 驕=부리 짧은 사냥개 효 [후] 侯=과녁 후 候=물을 후 冔=관 후 厚=두터울 후 后=임금 후 吼=울 후 吽= 喉=목구멍 후 喣=불 후 嗅=맡을 후 嘔=기쁠 후 垕=厚의 古字 堠=봉화대 후 帿=과녁 후 後=뒤 후 朽=섞을 후 涸=물 마를 후 煦=따뜻하게 할 후 猴=원숭이 후 珝=옥 이름 후 篌=공후 후 芋=클 후 蝴= 詡=자랑할 후 譃=망녕된 말 후 逅=만날 후 酗=주정할 후 餱=건량 후 鱟=참게 후 [훈] 勛=勳의 古字 勲=勳의 俗字 勳=공 훈 塤=壎과 同字 壎=진나팔 훈 暈=무리 훈 曛=삭양 빛 훈 焄=연기에 그을릴 훈 煇=지질 훈 熏=연기 낄 훈 燻=연기 낄 훈 爋=불에 말릴 훈 獯=오랑캐 이름 훈 纁=분홍빛 훈 葷=매운 채소 훈 薫=향내 훈 薰=향불 훈 訓=가르칠 훈 鑂=금빛 투색할 훈 馴=가르칠 훈 [훌] 欻=문득 훌 [훙] 薨=죽을 훙 [훤] 咺=섧게 울 훤 喧=의젓할 훤 嚾=지껄일 훤 暄=따뜻할 훤 暖=부드러울 훤 烜=마를 훤 煊=따뜻할 훤 萱=원추리 훤 諠=잊을 훤 諼=속일 훤 讙=시끄러울 훤 [훼] 卉=풀 훼 喙=부리 훼 毀=헐 훼 毁=毀의 俗字 燬=불 훼 芔=풀 훼 虫=벌레 훼 虺=살무사 훼 [휘] 彙=무리 휘 彚=彙와 同字 徽=아름다울 휘 戯=戱의 俗字 戱=기 휘, 대장 깃발 휘 揮=휘두를 휘 撝=찣을 휘 暉=빛 휘 煇=빛날 휘 翚= 翬=훨훨날 휘 諱=꺼릴 휘 輝=빛날 휘 麾=대장기 휘 [휴] 休=쉴 휴 倠=추할 휴 儶=끝 휴 咻=떠들 휴 嘼=쌓을 휴 堕=무너뜨릴 휴, 게으를 휴 携=끌 휴, 가질 휴, 떠날 휴, 나눌 휴, 연속할 휴 擕=携와 同字 烋=경사로울 휴 畦=밭두둑 휴 虧=이지러질 휴 貅=비휴 휴 隳=무너뜨릴 휴 髹=옻칠할 휴 鵂=수리부엉이 휴 [휵] 搐=당길 휵 畜=기를 휵, 용납할 휵 [휼] 卹=가엾이 여길 휼 恤=구휼할 휼 譎=속일 휼 [흉] 兇=흉악할 흉 凶=흉할 흉 哅=떠들 흉 忷=恟과 同字 恟=두려워할 흉 洶=물살세찰 흉 胷=胸과 同字 胸=가슴 흉 [흑] 黑=검을 흑 黒=黑과 同字 [흔] 俒=완전할 흔 很=패려궂을 흔 忻=기뻐할 흔 掀=치켜들 흔 昕=아침 흔 欣=기뻐할 흔 炘=화끈거릴 흔 焮=불사를 흔 琿= 痕=흉터 흔 衅=釁과 同字 訢=기뻐할 흔 釁=피바를 흔 [흘] 仡=날랠 흘 吃=말더듬을 흘 屹=산 우뚝솟을 흘 汔=거의 흘 汽=汔과 同字 疙=쥐부스럼 흘 紇=질 낮은 명주실 흘 訖=이를 흘 迄=이를 흘 鷸= 齕=깨물 흘 [흠] 廞=진열할 흠 欠=하품 흠 欽=공경할 흠 歆=받을 흠 [흡] 吸=숨 들이쉴 흡 噏=숨 들이쉴 흡 恰=마치 흡 歙=줄일 흡 洽=윤태하게 할 흡 潝=빨리 흐르는 소리 흡 翕=합할 흡 翖=翕과 同字 [흥] 匈= 興=일 흥 [희] 俙=비슷할 희, 어슴프레할 희, 희미할 희 僖=기쁠 희 凞=빛날 희 呬=쉴 희 咥=허허 웃을 희 唏=슬퍼할 희 喜=기뻐할 희 嘻=웃을 희 噫=탄식할 희 嚱=소리낼 희, 아아 경탄하는 소리 희 囍=쌍희 희 姫=姬의 俗字 姬=성 희 嬉=즐길 희 希=바랄 희 悕=슬퍼할 희 愾=한숨 희 憘=憙의 古字 憙=성할 희 戯=戲의 俗字 戱=戲의 俗字 戲=탄식할 희 晞=마를 희 暿=웃을 희 曦=햇빛 희 欷=흐느낄 희 煕=熙와 同字 熈=熙와 同字 熙=빛날 희 熹=성할 희 熺=熹와 同字 燹=들불 희 爔=불 희 犧=희생 희 禧=복 희 稀=드물 희 羲=숨 희 誒=탄식할 희 豨=멧돼지 희 釐=제사 지내는 고기 희 餼=꾸밀 희 凞=凞와 同字 [히] 呬=숨 쉴 히 [힐] 犵=오랑캐이름 힐 纈=홀치기염색 힐 襭=옷자락 꽂을 힐 詰=물을 힐 頡=곧은목 힐 黠=약을 힐 nabi-nabi-1.0.1/tables/compose/000077500000000000000000000000001430012456200162455ustar00rootroot00000000000000nabi-nabi-1.0.1/tables/compose/default000066400000000000000000000026711430012456200176220ustar00rootroot00000000000000# test compose map file for Nabi [default] 1100 1100 1101 # choseong kiyeok + kiyeok = ssangkiyeok 1103 1103 1104 # choseong tikeut + tikeut = ssangtikeut 1107 1107 1108 # choseong pieup + pieup = ssangpieup 1109 1109 110a # choseong sios + sios = ssangsios 110c 110c 110d # choseong cieuc + cieuc = ssangcieuc 1169 1161 116a # jungseong o + a = wa 1169 1162 116b # jungseong o + ae = wae 1169 1175 116c # jungseong o + i = oe 116e 1165 116f # jungseong u + eo = weo 116e 1166 1170 # jungseong u + e = we 116e 1175 1171 # jungseong u + i = wi 1173 1175 1174 # jungseong eu + i = yi 11a8 11a8 11a9 # jongseong kiyeok + kiyeok = ssangekiyeok 11a8 11ba 11aa # jongseong kiyeok + sios = kiyeok-sois 11ab 11bd 11ac # jongseong nieun + cieuc = nieun-cieuc 11ab 11c2 11ad # jongseong nieun + hieuh = nieun-hieuh 11af 11a8 11b0 # jongseong rieul + kiyeok = rieul-kiyeok 11af 11b7 11b1 # jongseong rieul + mieum = rieul-mieum 11af 11b8 11b2 # jongseong rieul + pieup = rieul-pieup 11af 11ba 11b3 # jongseong rieul + sios = rieul-sios 11af 11c0 11b4 # jongseong rieul + thieuth = rieul-thieuth 11af 11c1 11b5 # jongseong rieul + phieuph = rieul-phieuph 11af 11c2 11b6 # jongseong rieul + hieuh = rieul-hieuh 11b8 11ba 11b9 # jongseong pieup + sios = pieup-sios 11ba 11ba 11bb # jongseong sios + sios = ssangsios nabi-nabi-1.0.1/tables/compose/full000066400000000000000000000272121430012456200171360ustar00rootroot00000000000000# nabi compose file for yet hangul [full] 1100 1100 1101 # CHOSEONG SSANGKIYEOK = KIYEOK + KIYEOK 1102 1100 1113 # CHOSEONG NIEUN-KIYEOK = NIEUN + KIYEOK 1102 1102 1114 # CHOSEONG SSANGNIEUN = NIEUN + NIEUN 1102 1103 1115 # CHOSEONG NIEUN-TIKEUT = NIEUN + TIKEUT 1102 1107 1116 # CHOSEONG NIEUN-PIEUP = NIEUN + PIEUP 1103 1100 1117 # CHOSEONG TIKEUT-KIYEOK = TIKEUT + KIYEOK 1103 1103 1104 # CHOSEONG SSANGTIKEUT = TIKEUT + TIKEUT 1105 1102 1118 # CHOSEONG RIEUL-NIEUN = RIEUL + NIEUN 1105 1105 1119 # CHOSEONG SSANGRIEUL = RIEUL + RIEUL 1105 110b 111b # CHOSEONG KAPYEOUNRIEUL = RIEUL + IEUNG 1105 1112 111a # CHOSEONG RIEUL-HIEUH = RIEUL + HIEUH 1106 1107 111c # CHOSEONG MIEUM-PIEUP = MIEUM + PIEUP 1106 110b 111d # CHOSEONG KAPYEOUNMIEUM = MIEUM + IEUNG 1107 1100 111e # CHOSEONG PIEUP-KIYEOK = PIEUP + KIYEOK 1107 1102 111f # CHOSEONG PIEUP-NIEUN = PIEUP + NIEUN 1107 1103 1120 # CHOSEONG PIEUP-TIKEUT = PIEUP + TIKEUT 1107 1107 1108 # CHOSEONG SSANGPIEUP = PIEUP + PIEUP 1107 1109 1121 # CHOSEONG PIEUP-SIOS = PIEUP + SIOS 1107 110b 112b # CHOSEONG KAPYEOUNPIEUP = PIEUP + IEUNG 1107 110c 1127 # CHOSEONG PIEUP-CIEUC = PIEUP + CIEUC 1107 110e 1128 # CHOSEONG PIEUP-CHIEUCH = PIEUP + CHIEUCH 1107 1110 1129 # CHOSEONG PIEUP-THIEUTH = PIEUP + THIEUTH 1107 1111 112a # CHOSEONG PIEUP-PHIEUPH = PIEUP + PHIEUPH 1108 110b 112c # CHOSEONG KAPYEOUNSSANGPIEUP = SSANGPIEUP + IEUNG 1109 1100 112d # CHOSEONG SIOS-KIYEOK = SIOS + KIYEOK 1109 1102 112e # CHOSEONG SIOS-NIEUN = SIOS + NIEUN 1109 1103 112f # CHOSEONG SIOS-TIKEUT = SIOS + TIKEUT 1109 1105 1130 # CHOSEONG SIOS-RIEUL = SIOS + RIEUL 1109 1106 1131 # CHOSEONG SIOS-MIEUM = SIOS + MIEUM 1109 1107 1132 # CHOSEONG SIOS-PIEUP = SIOS + PIEUP 1109 1109 110a # CHOSEONG SSANGSIOS = SIOS + SIOS 1109 110b 1135 # CHOSEONG SIOS-IEUNG = SIOS + IEUNG 1109 110c 1136 # CHOSEONG SIOS-CIEUC = SIOS + CIEUC 1109 110e 1137 # CHOSEONG SIOS-CHIEUCH = SIOS + CHIEUCH 1109 110f 1138 # CHOSEONG SIOS-KHIEUKH = SIOS + KHIEUKH 1109 1110 1139 # CHOSEONG SIOS-THIEUTH = SIOS + THIEUTH 1109 1111 113a # CHOSEONG SIOS-PHIEUPH = SIOS + PHIEUPH 1109 1112 113b # CHOSEONG SIOS-HIEUH = SIOS + HIEUH 110a 1109 1134 # CHOSEONG SIOS-SSANGSIOS = SSANGSIOS + SIOS 110b 1100 1141 # CHOSEONG IEUNG-KIYEOK = IEUNG + KIYEOK 110b 1103 1142 # CHOSEONG IEUNG-TIKEUT = IEUNG + TIKEUT 110b 1106 1143 # CHOSEONG IEUNG-MIEUM = IEUNG + MIEUM 110b 1107 1144 # CHOSEONG IEUNG-PIEUP = IEUNG + PIEUP 110b 1109 1145 # CHOSEONG IEUNG-SIOS = IEUNG + SIOS 110b 110b 1147 # CHOSEONG SSANGIEUNG = IEUNG + IEUNG 110b 110c 1148 # CHOSEONG IEUNG-CIEUC = IEUNG + CIEUC 110b 110e 1149 # CHOSEONG IEUNG-CHIEUCH = IEUNG + CHIEUCH 110b 1110 114a # CHOSEONG IEUNG-THIEUTH = IEUNG + THIEUTH 110b 1111 114b # CHOSEONG IEUNG-PHIEUPH = IEUNG + PHIEUPH 110b 1140 1146 # CHOSEONG IEUNG-PANSIOS = IEUNG + PANSIOS 110c 110b 114d # CHOSEONG CIEUC-IEUNG = CIEUC + IEUNG 110c 110c 110d # CHOSEONG SSANGCIEUC = CIEUC + CIEUC 110e 110f 1152 # CHOSEONG CHIEUCH-KHIEUKH = CHIEUCH + KHIEUKH 110e 1112 1153 # CHOSEONG CHIEUCH-HIEUH = CHIEUCH + HIEUH 1111 1107 1156 # CHOSEONG PHIEUPH-PIEUP = PHIEUPH + PIEUP 1111 110b 1157 # CHOSEONG KAPYEOUNPHIEUPH = PHIEUPH + IEUNG 1112 1112 1158 # CHOSEONG SSANGHIEUH = HIEUH + HIEUH 1121 1100 1122 # CHOSEONG PIEUP-SIOS-KIYEOK = PIEUP-SIOS + KIYEOK 1121 1103 1123 # CHOSEONG PIEUP-SIOS-TIKEUT = PIEUP-SIOS + TIKEUT 1121 1107 1124 # CHOSEONG PIEUP-SIOS-PIEUP = PIEUP-SIOS + PIEUP 1121 1109 1125 # CHOSEONG PIEUP-SSANGSIOS = PIEUP-SIOS + SIOS 1121 110c 1126 # CHOSEONG PIEUP-SIOS-CIEUC = PIEUP-SIOS + CIEUC 1132 1100 1133 # CHOSEONG SIOS-PIEUP-KIYEOK = SIOS-PIEUP + KIYEOK 113c 113c 113d # CHOSEONG CHITUEUMSSANGSIOS = CHITUEUMSIOS + CHITUEUMSIOS 113e 113e 113f # CHOSEONG CEONGCHIEUMSSANGSIOS = CEONGCHIEUMSIOS + CEONGCHIEUMSIOS 114e 114e 114f # CHOSEONG CHITUEUMSSANGCIEUC = CHITUEUMCIEUC + CHITUEUMCIEUC 1150 1150 1151 # CHOSEONG CEONGCHIEUMSSANGCIEUC = CEONGCHIEUMCIEUC + CEONGCHIEUMCIEUC 1161 1169 1176 # JUNGSEONG A-O = A + O 1161 116e 1177 # JUNGSEONG A-U = A + U 1161 1175 1162 # JUNGSEONG AE = A 1163 1169 1178 # JUNGSEONG YA-O = YA + O 1163 116d 1179 # JUNGSEONG YA-YO = YA + YO 1163 1175 1164 # JUNGSEONG YAE = YA 1165 1169 117a # JUNGSEONG EO-O = EO + O 1165 116e 117b # JUNGSEONG EO-U = EO + U 1165 1173 117c # JUNGSEONG EO-EU = EO + EU 1165 1175 1166 # JUNGSEONG E = EO 1167 1169 117d # JUNGSEONG YEO-O = YEO + O 1167 116e 117e # JUNGSEONG YEO-U = YEO + U 1167 1175 1168 # JUNGSEONG YE = YEO 1169 1161 116a # JUNGSEONG WA = O + A 1169 1165 117f # JUNGSEONG O-EO = O + EO 1169 1166 1180 # JUNGSEONG O-E = O + E 1169 1168 1181 # JUNGSEONG O-YE = O + YE 1169 1169 1182 # JUNGSEONG O-O = O + O 1169 116e 1183 # JUNGSEONG O-U = O + U 1169 1175 116c # JUNGSEONG OE = O 116a 1175 116b # JUNGSEONG WAE = WA 116d 1163 1184 # JUNGSEONG YO-YA = YO + YA 116d 1164 1185 # JUNGSEONG YO-YAE = YO + YAE 116d 1167 1186 # JUNGSEONG YO-YEO = YO + YEO 116d 1169 1187 # JUNGSEONG YO-O = YO + O 116d 1175 1188 # JUNGSEONG YO-I = YO + I 116e 1161 1189 # JUNGSEONG U-A = U + A 116e 1162 118a # JUNGSEONG U-AE = U + AE 116e 1165 116f # JUNGSEONG WEO = U + EO 116e 1168 118c # JUNGSEONG U-YE = U + YE 116e 116e 118d # JUNGSEONG U-U = U + U 116e 1175 1171 # JUNGSEONG WI = U 116f 1173 118b # JUNGSEONG U-EO-EU = WEO + EU 116f 1175 1170 # JUNGSEONG WE = WEO 1172 1161 118e # JUNGSEONG YU-A = YU + A 1172 1165 118f # JUNGSEONG YU-EO = YU + EO 1172 1166 1190 # JUNGSEONG YU-E = YU + E 1172 1167 1191 # JUNGSEONG YU-YEO = YU + YEO 1172 1168 1192 # JUNGSEONG YU-YE = YU + YE 1172 116e 1193 # JUNGSEONG YU-U = YU + U 1172 1175 1194 # JUNGSEONG YU-I = YU + I 1173 116e 1195 # JUNGSEONG EU-U = EU + U 1173 1173 1196 # JUNGSEONG EU-EU = EU + EU 1173 1175 1174 # JUNGSEONG YI = EU 1174 116e 1197 # JUNGSEONG YI-U = YI + U 1175 1161 1198 # JUNGSEONG I-A = I + A 1175 1163 1199 # JUNGSEONG I-YA = I + YA 1175 1169 119a # JUNGSEONG I-O = I + O 1175 116e 119b # JUNGSEONG I-U = I + U 1175 1173 119c # JUNGSEONG I-EU = I + EU 1175 119e 119d # JUNGSEONG I-ARAEA = I 119e 1165 119f # JUNGSEONG ARAEA-EO = ARAEA + EO 119e 116e 11a0 # JUNGSEONG ARAEA-U = ARAEA + U 119e 1175 11a1 # JUNGSEONG ARAEA-I = ARAEA + I 119e 119e 11a2 # JUNGSEONG SSANGARAEA = ARAEA + ARAEA 11a8 11a8 11a9 # JONGSEONG SSANGKIYEOK = KIYEOK + KIYEOK 11a8 11af 11c3 # JONGSEONG KIYEOK-RIEUL = KIYEOK + RIEUL 11a8 11ba 11aa # JONGSEONG KIYEOK-SIOS = KIYEOK 11aa 11a8 11c4 # JONGSEONG KIYEOK-SIOS-KIYEOK = KIYEOK-SIOS + KIYEOK 11ab 11a8 11c5 # JONGSEONG NIEUN-KIYEOK = NIEUN + KIYEOK 11ab 11ae 11c6 # JONGSEONG NIEUN-TIKEUT = NIEUN + TIKEUT 11ab 11ba 11c7 # JONGSEONG NIEUN-SIOS = NIEUN + SIOS 11ab 11bd 11ac # JONGSEONG NIEUN-CIEUC = NIEUN 11ab 11c0 11c9 # JONGSEONG NIEUN-THIEUTH = NIEUN + THIEUTH 11ab 11c2 11ad # JONGSEONG NIEUN-HIEUH = NIEUN 11ab 11eb 11c8 # JONGSEONG NIEUN-PANSIOS = NIEUN 11ae 11a8 11ca # JONGSEONG TIKEUT-KIYEOK = TIKEUT + KIYEOK 11ae 11af 11cb # JONGSEONG TIKEUT-RIEUL = TIKEUT + RIEUL 11af 11a8 11b0 # JONGSEONG RIEUL-KIYEOK = RIEUL + KIYEOK 11af 11ab 11cd # JONGSEONG RIEUL-NIEUN = RIEUL + NIEUN 11af 11ae 11ce # JONGSEONG RIEUL-TIKEUT = RIEUL + TIKEUT 11af 11af 11d0 # JONGSEONG SSANGRIEUL = RIEUL + RIEUL 11af 11b7 11b1 # JONGSEONG RIEUL-MIEUM = RIEUL 11af 11b8 11b2 # JONGSEONG RIEUL-PIEUP = RIEUL 11af 11ba 11b3 # JONGSEONG RIEUL-SIOS = RIEUL 11af 11bf 11d8 # JONGSEONG RIEUL-KHIEUKH = RIEUL + KHIEUKH 11af 11c0 11b4 # JONGSEONG RIEUL-THIEUTH = RIEUL 11af 11c1 11b5 # JONGSEONG RIEUL-PHIEUPH = RIEUL 11af 11c2 11b6 # JONGSEONG RIEUL-HIEUH = RIEUL 11af 11eb 11d7 # JONGSEONG RIEUL-PANSIOS = RIEUL 11af 11f9 11d9 # JONGSEONG RIEUL-YEORINHIEUH = RIEUL 11b0 11ba 11cc # JONGSEONG RIEUL-KIYEOK-SIOS = RIEUL-KIYEOK + SIOS 11b1 11a8 11d1 # JONGSEONG RIEUL-MIEUM-KIYEOK = RIEUL-MIEUM + KIYEOK 11b1 11ba 11d2 # JONGSEONG RIEUL-MIEUM-SIOS = RIEUL-MIEUM + SIOS 11b2 11ba 11d3 # JONGSEONG RIEUL-PIEUP-SIOS = RIEUL-PIEUP + SIOS 11b2 11bc 11d5 # JONGSEONG RIEUL-KAPYEOUNPIEUP = RIEUL-PIEUP + IEUNG 11b2 11c2 11d4 # JONGSEONG RIEUL-PIEUP-HIEUH = RIEUL-PIEUP + HIEUH 11b3 11ba 11d6 # JONGSEONG RIEUL-SSANGSIOS = RIEUL-SIOS + SIOS 11b7 11a8 11da # JONGSEONG MIEUM-KIYEOK = MIEUM + KIYEOK 11b7 11af 11db # JONGSEONG MIEUM-RIEUL = MIEUM + RIEUL 11b7 11b8 11dc # JONGSEONG MIEUM-PIEUP = MIEUM + PIEUP 11b7 11ba 11dd # JONGSEONG MIEUM-SIOS = MIEUM + SIOS 11b7 11bc 11e2 # JONGSEONG KAPYEOUNMIEUM = MIEUM + IEUNG 11b7 11be 11e0 # JONGSEONG MIEUM-CHIEUCH = MIEUM + CHIEUCH 11b7 11c2 11e1 # JONGSEONG MIEUM-HIEUH = MIEUM + HIEUH 11b7 11eb 11df # JONGSEONG MIEUM-PANSIOS = MIEUM 11b8 11af 11e3 # JONGSEONG PIEUP-RIEUL = PIEUP + RIEUL 11b8 11ba 11b9 # JONGSEONG PIEUP-SIOS = PIEUP 11b8 11bc 11e6 # JONGSEONG KAPYEOUNPIEUP = PIEUP + IEUNG 11b8 11c1 11e4 # JONGSEONG PIEUP-PHIEUPH = PIEUP + PHIEUPH 11b8 11c2 11e5 # JONGSEONG PIEUP-HIEUH = PIEUP + HIEUH 11ba 11a8 11e7 # JONGSEONG SIOS-KIYEOK = SIOS + KIYEOK 11ba 11ae 11e8 # JONGSEONG SIOS-TIKEUT = SIOS + TIKEUT 11ba 11af 11e9 # JONGSEONG SIOS-RIEUL = SIOS + RIEUL 11ba 11b8 11ea # JONGSEONG SIOS-PIEUP = SIOS + PIEUP 11ba 11ba 11bb # JONGSEONG SSANGSIOS = SIOS + SIOS 11bc 11a8 11ec # JONGSEONG IEUNG-KIYEOK = IEUNG + KIYEOK 11bc 11bc 11ee # JONGSEONG SSANGIEUNG = IEUNG + IEUNG 11bc 11bf 11ef # JONGSEONG IEUNG-KHIEUKH = IEUNG + KHIEUKH 11c1 11b8 11f3 # JONGSEONG PHIEUPH-PIEUP = PHIEUPH + PIEUP 11c1 11bc 11f4 # JONGSEONG KAPYEOUNPHIEUPH = PHIEUPH + IEUNG 11c2 11ab 11f5 # JONGSEONG HIEUH-NIEUN = HIEUH + NIEUN 11c2 11af 11f6 # JONGSEONG HIEUH-RIEUL = HIEUH + RIEUL 11c2 11b7 11f7 # JONGSEONG HIEUH-MIEUM = HIEUH + MIEUM 11c2 11b8 11f8 # JONGSEONG HIEUH-PIEUP = HIEUH + PIEUP 11ce 11c2 11cf # JONGSEONG RIEUL-TIKEUT-HIEUH = RIEUL-TIKEUT + HIEUH 11dd 11ba 11de # JONGSEONG MIEUM-SSANGSIOS = MIEUM-SIOS + SIOS 11ec 11a8 11ed # JONGSEONG IEUNG-SSANGKIYEOK = IEUNG-KIYEOK + KIYEOK 11f0 11ba 11f1 # JONGSEONG YESIEUNG-SIOS = YESIEUNG + SIOS 11f0 11eb 11f2 # JONGSEONG YESIEUNG-PANSIOS = YESIEUNG + PANSIOS nabi-nabi-1.0.1/tables/keyboard/000077500000000000000000000000001430012456200164005ustar00rootroot00000000000000nabi-nabi-1.0.1/tables/keyboard/2qwerty000066400000000000000000000035241430012456200177440ustar00rootroot00000000000000# this file is test keyboard map file for Nabi Name: 2 set Type2 U0041 U1106 # XK_A: choseong mieum U0042 U1172 # XK_B: jungseong yu U0043 U110e # XK_C: choseong chieuch U0044 U110b # XK_D: choseong ieung U0045 U1104 # XK_E: choseong ssangtikeut U0046 U1105 # XK_F: choseong rieul U0047 U1112 # XK_G: choseong hieuh U0048 U1169 # XK_H: jungseong o U0049 U1163 # XK_I: jungseong ya U004a U1165 # XK_J: jungseong eo U004b U1161 # XK_K: jungseong a U004c U1175 # XK_L: jungseong i U004d U1173 # XK_M: jungseong eu U004e U116e # XK_N: jungseong u U004f U1164 # XK_O: jungseong yae U0050 U1168 # XK_P: jungseong ye U0051 U1108 # XK_Q: choseong ssangpieup U0052 U1101 # XK_R: choseong ssangkiyeok U0053 U1102 # XK_S: choseong nieun U0054 U110a # XK_T: choseong ssangsios U0055 U1167 # XK_U: jungseong yeo U0056 U1111 # XK_V: choseong phieuph U0057 U110d # XK_W: choseong ssangcieuc U0058 U1110 # XK_X: choseong thieuth U0059 U116d # XK_Y: jungseong yo U005a U110f # XK_Z: choseong khieukh U0061 U1106 # XK_a: choseong mieum U0062 U1172 # XK_b: jungseong yu U0063 U110e # XK_c: choseong chieuch U0064 U110b # XK_d: choseong ieung U0065 U1103 # XK_e: choseong tikeut U0066 U1105 # XK_f: choseong rieul U0067 U1112 # XK_g: choseong hieuh U0068 U1169 # XK_h: jungseong o U0069 U1163 # XK_i: jungseong ya U006a U1165 # XK_j: jungseong eo U006b U1161 # XK_k: jungseong a U006c U1175 # XK_l: jungseong i U006d U1173 # XK_m: jungseong eu U006e U116e # XK_n: jungseong u U006f U1162 # XK_o: jungseong ae U0070 U1166 # XK_p: jungseong e U0071 U1107 # XK_q: choseong pieup U0072 U1100 # XK_r: choseong kiyeok U0073 U1102 # XK_s: choseong nieun U0074 U1109 # XK_t: choseong sios U0075 U1167 # XK_u: jungseong yeo U0076 U1111 # XK_v: choseong phieuph U0077 U110c # XK_w: choseong cieuc U0078 U1110 # XK_x: choseong thieuth U0079 U116d # XK_y: jungseong yo U007a U110f # XK_z: choseong khieukh nabi-nabi-1.0.1/tables/keyboard/32qwerty000066400000000000000000000055041430012456200200270ustar00rootroot00000000000000Name: 3 set with 2 set layout U0041 U11B7 # GDK_A: jongseong mieum U0042 U1172 # GDK_B: jungseong yu U0043 U11BE # GDK_C: jongseong chieuch U0044 U11BC # GDK_D: jongseong ieung U0045 U11AE # GDK_E: jongseong tikeut U0046 U11AF # GDK_F: jongseong rieul U0047 U11C2 # GDK_G: jongseong hieuh U0048 U1169 # GDK_H: jungseong o U0049 U1163 # GDK_I: jungseong ya U004A U1165 # GDK_J: jungseong eo U004B U1161 # GDK_K: jungseong a U004C U1175 # GDK_L: jungseong i U004D U1173 # GDK_M: jungseong eu U004E U116E # GDK_N: jungseong u U004F U1164 # GDK_O: jungseong yae U0050 U1168 # GDK_P: jungseong ye U0051 U11B8 # GDK_Q: jongseong pieup U0052 U11A8 # GDK_R: jongseong kiyeok U0053 U11AB # GDK_S: jongseong nieun U0054 U11BA # GDK_T: jongseong sios U0055 U1167 # GDK_U: jungseong yeo U0056 U11C1 # GDK_V: jongseong phieuph U0057 U11BD # GDK_W: jongseong cieuc U0058 U11C0 # GDK_X: jongseong thieuth U0059 U116D # GDK_Y: jungseong yo U005A U11BF # GDK_Z: jongseong khieukh U0061 U1106 # GDK_a: choseong mieum U0062 U1172 # GDK_b: jungseong yu U0063 U110E # GDK_c: choseong chieuch U0064 U110B # GDK_d: choseong ieung U0065 U1103 # GDK_e: choseong tikeut U0066 U1105 # GDK_f: choseong rieul U0067 U1112 # GDK_g: choseong hieuh U0068 U1169 # GDK_h: jungseong o U0069 U1163 # GDK_i: jungseong ya U006A U1165 # GDK_j: jungseong eo U006B U1161 # GDK_k: jungseong a U006C U1175 # GDK_l: jungseong i U006D U1173 # GDK_m: jungseong eu U006E U116E # GDK_n: jungseong u U006F U1162 # GDK_o: jungseong ae U0070 U1166 # GDK_p: jungseong e U0071 U1107 # GDK_q: choseong pieup U0072 U1100 # GDK_r: choseong kiyeok U0073 U1102 # GDK_s: choseong nieun U0074 U1109 # GDK_t: choseong sios U0075 U1167 # GDK_u: jungseong yeo U0076 U1111 # GDK_v: choseong phieuph U0077 U110C # GDK_w: choseong cieuc U0078 U1110 # GDK_x: choseong thieuth U0079 U116D # GDK_y: jungseong yo U007A U110F # GDK_z: choseong khieukh nabi-nabi-1.0.1/tables/keyboard/39qwerty000066400000000000000000000121311430012456200200300ustar00rootroot00000000000000Name: 3 set 390 U0021 U11BD # GDK_exclam: jongseong cieuc U0022 U0022 # GDK_quotedbl: quotatioin mark U0023 U0023 # GDK_numbersign: number sign U0024 U0024 # GDK_dollar: dollar sign U0025 U0025 # GDK_percent: percent sign U0026 U0026 # GDK_ampersand: ampersand U0027 U1110 # GDK_apostrophe: choseong thieuth U0028 U0028 # GDK_parenleft: left parenthesis U0029 U0029 # GDK_parenright: right parenthesis U002A U002A # GDK_asterisk: asterisk U002B U002B # GDK_plus: plus sign U002C U002C # GDK_comma: comma U002D U002D # GDK_minus: minus sign U002E U002E # GDK_period: period U002F U1169 # GDK_slash: jungseong o U0030 U110F # GDK_0: choseong khieukh U0031 U11C2 # GDK_1: jongseong hieuh U0032 U11BB # GDK_2: jongseong ssangsios U0033 U11B8 # GDK_3: jongseong pieup U0034 U116D # GDK_4: jungseong yo U0035 U1172 # GDK_5: jungseong yu U0036 U1163 # GDK_6: jungseong ya U0037 U1168 # GDK_7: jungseong ye U0038 U1174 # GDK_8: jungseong yi U0039 U116E # GDK_9: jungseong u U003A U003A # GDK_colon: colon U003B U1107 # GDK_semicolon: choseong pieup U003C U0032 # GDK_less: 2 U003D U003D # GDK_equal: euals sign U003E U0033 # GDK_greater: 3 U003F U003F # GDK_question: question mark U0040 U0040 # GDK_at: commertial at U0041 U11AE # GDK_A: jongseong tikeut U0042 U0021 # GDK_B: exclamation mark U0043 U11B1 # GDK_C: jongseong rieul-mieum U0044 U11B0 # GDK_D: jongseong rieul-kiyeok U0045 U11BF # GDK_E: jongseong khieukh U0046 U11A9 # GDK_F: jongseong ssangkiyeok U0047 U002F # GDK_G: slash U0048 U0027 # GDK_H: apostrophe U0049 U0038 # GDK_I: 8 U004A U0034 # GDK_J: 4 U004B U0035 # GDK_K: 5 U004C U0036 # GDK_L: 6 U004D U0031 # GDK_M: 1 U004E U0030 # GDK_N: 0 U004F U0039 # GDK_O: 9 U0050 U003E # GDK_P: greater-than sign U0051 U11C1 # GDK_Q: jongseong phieuph U0052 U1164 # GDK_R: jungseong yae U0053 U11AD # GDK_S: jongseong nieun-hieuh U0054 U003B # GDK_T: semicolon U0055 U0037 # GDK_U: 7 U0056 U11B6 # GDK_V: jongseong rieul-hieuh U0057 U11C0 # GDK_W: jongseong thikeuth U0058 U11B9 # GDK_X: jongseong pieup-sios U0059 U003C # GDK_Y: less-than sign U005A U11BE # GDK_Z: jongseong chieuch U005B U005B # GDK_bracketleft: left bracket U005C U005C # GDK_backslash: backslash U005D U005D # GDK_bracketright: right bracket U005E U005E # GDK_asciicircum: circumflex accent U005F U005F # GDK_underscore: underscore U0060 U0060 # GDK_quoteleft: grave accent U0061 U11BC # GDK_a: jongseong ieung U0062 U116E # GDK_b: jungseong u U0063 U1166 # GDK_c: jungseong e U0064 U1175 # GDK_d: jungseong i U0065 U1167 # GDK_e: jungseong yeo U0066 U1161 # GDK_f: jungseong a U0067 U1173 # GDK_g: jungseong eu U0068 U1102 # GDK_h: choseong nieun U0069 U1106 # GDK_i: choseong mieum U006A U110B # GDK_j: choseong ieung U006B U1100 # GDK_k: choseong kiyeok U006C U110C # GDK_l: choseong cieuc U006D U1112 # GDK_m: choseong hieuh U006E U1109 # GDK_n: choseong sios U006F U110E # GDK_o: choseong chieuch U0070 U1111 # GDK_p: choseong phieuph U0071 U11BA # GDK_q: jongseong sios U0072 U1162 # GDK_r: jungseong ae U0073 U11AB # GDK_s: jongseong nieun U0074 U1165 # GDK_t: jungseong eo U0075 U1103 # GDK_u: choseong tikeut U0076 U1169 # GDK_v: jungseong o U0077 U11AF # GDK_w: jongseong rieul U0078 U11A8 # GDK_x: jongseong kiyeok U0079 U1105 # GDK_y: choseong rieul U007A U11B7 # GDK_z: jongseong mieum U007B U007B # GDK_braceleft: left brace U007C U007C # GDK_bar: vertical line(bar) U007D U007D # GDK_braceright: right brace U007E U007E # GDK_asciitilde: tilde nabi-nabi-1.0.1/tables/keyboard/3fqwerty000066400000000000000000000074651430012456200201230ustar00rootroot00000000000000Name: 3 set final U0021 U11A9 # GDK_exclam: jongseong ssangkiyeok U0022 U00B7 # GDK_quotedbl: middle dot U0023 U11BD # GDK_numbersign: jognseong cieuc U0024 U11B5 # GDK_dollar: jongseong rieul-phieuph U0025 U11B4 # GDK_percent: jongseong rieul-thieuth U0026 U201C # GDK_ampersand: left double quotation mark U0027 U1110 # GDK_apostrophe: choseong thieuth U0028 U0027 # GDK_parenleft: apostrophe U0029 U007E # GDK_parenright: Tilde U002A U201D # GDK_asterisk: right double quotation mark U002B U002B # GDK_plus: plus sign U002C U002C # GDK_comma: comma U002D U0029 # GDK_minus: right parenthesis U002E U002E # GDK_period: period U002F U1169 # GDK_slash: jungseong o U0030 U110F # GDK_0: choseong khieukh U0031 U11C2 # GDK_1: jongseong hieuh U0032 U11BB # GDK_2: jongseong ssangsios U0033 U11B8 # GDK_3: jongseong pieup U0034 U116D # GDK_4: jungseong yo U0035 U1172 # GDK_5: jungseong yu U0036 U1163 # GDK_6: jungseong ya U0037 U1168 # GDK_7: jungseong ye U0038 U1174 # GDK_8: jungseong yi U0039 U116E # GDK_9: jungseong u U003A U0034 # GDK_colon: 4 U003B U1107 # GDK_semicolon: choseong pieup U003C U002C # GDK_less: comma U003D U003E # GDK_equal: greater-than sign U003E U002E # GDK_greater: period U003F U0021 # GDK_question: exclamation mark U0040 U11B0 # GDK_at: jongseong rieul-kiyeok U0041 U11AE # GDK_A: jongseong tikeut U0042 U003F # GDK_B: question mark U0043 U11BF # GDK_C: jongseong khieukh U0044 U11B2 # GDK_D: jongseong rieul-pieup U0045 U11AC # GDK_E: jongseong nieun-cieuc U0046 U11B1 # GDK_F: jongseong rieul-mieum U0047 U1164 # GDK_G: jungseong yae U0048 U0030 # GDK_H: 0 U0049 U0037 # GDK_I: 7 U004A U0031 # GDK_J: 1 U004B U0032 # GDK_K: 2 U004C U0033 # GDK_L: 3 U004D U0022 # GDK_M: double quotation mark U004E U002D # GDK_N: minus sign U004F U0038 # GDK_O: 8 U0050 U0039 # GDK_P: 9 U0051 U11C1 # GDK_Q: jongseong phieuph U0052 U11B6 # GDK_R: jongseong rieul-hieuh U0053 U11AD # GDK_S: jongseong nieun-hieuh U0054 U11B3 # GDK_T: jongseong rieul-sios U0055 U0036 # GDK_U: 6 U0056 U11AA # GDK_V: jongseong kiyeok-sios U0057 U11C0 # GDK_W: jongseong thikeuth U0058 U11B9 # GDK_X: jongseong pieup-sios U0059 U0035 # GDK_Y: 5 U005A U11BE # GDK_Z: jongseong chieuch U005B U0028 # GDK_bracketleft: left parenthesis U005C U003A # GDK_backslash: colon U005D U003C # GDK_bracketright: less-than sign U005E U003D # GDK_asciicircum: equals sign U005F U003B # GDK_underscore: semicolon U0060 U002A # GDK_quoteleft: asterisk U0061 U11BC # GDK_a: jongseong ieung U0062 U116E # GDK_b: jungseong u U0063 U1166 # GDK_c: jungseong e U0064 U1175 # GDK_d: jungseong i U0065 U1167 # GDK_e: jungseong yeo U0066 U1161 # GDK_f: jungseong a U0067 U1173 # GDK_g: jungseong eu U0068 U1102 # GDK_h: choseong nieun U0069 U1106 # GDK_i: choseong mieum U006A U110B # GDK_j: choseong ieung U006B U1100 # GDK_k: choseong kiyeok U006C U110C # GDK_l: choseong cieuc U006D U1112 # GDK_m: choseong hieuh U006E U1109 # GDK_n: choseong sios U006F U110E # GDK_o: choseong chieuch U0070 U1111 # GDK_p: choseong phieuph U0071 U11BA # GDK_q: jongseong sios U0072 U1162 # GDK_r: jungseong ae U0073 U11AB # GDK_s: jongseong nieun U0074 U1165 # GDK_t: jungseong eo U0075 U1103 # GDK_u: choseong tikeut U0076 U1169 # GDK_v: jungseong o U0077 U11AF # GDK_w: jongseong rieul U0078 U11A8 # GDK_x: jongseong kiyeok U0079 U1105 # GDK_y: choseong rieul U007A U11B7 # GDK_z: jongseong mieum U007B U0025 # GDK_braceleft: percent sign U007C U005C # GDK_bar: backslash U007D U002F # GDK_braceright: slash U007E U203B # GDK_asciitilde: reference mark nabi-nabi-1.0.1/tables/keyboard/3sqwerty000066400000000000000000000060421430012456200201260ustar00rootroot00000000000000Name: 3 set no-shift U0021 U0021 # exclam: exclamation mark U0022 U0022 # quotedbl: quotatioin mark U0023 U0023 # numbersign: number sign U0024 U0024 # dollar: dollar sign U0025 U0025 # percent: percent sign U0026 U0026 # ampersand: ampersand U0027 U1110 # apostrophe: choseong thieuth U0028 U0028 # parenleft: left parenthesis U0029 U0029 # parenright: right parenthesis U002A U002A # asterisk: asterisk U002B U002B # plus: plus sign U002C U002C # comma: comma U002D U11BD # minus: jongseong cieuc U002E U002E # period: period U002F U11AE # slash: jongseong tikeut U0030 U1164 # 0: choseong yae U0031 U11C2 # 1: jongseong hieuh U0032 U11BB # 2: jongseong ssangsios U0033 U11B8 # 3: jongseong pieup U0034 U116D # 4: jungseong yo U0035 U1172 # 5: jungseong yu U0036 U1163 # 6: jungseong ya U0037 U1168 # 7: jungseong ye U0038 U1174 # 8: jungseong yi U0039 U110F # 9: choseong khieukh U003A U003A # colon: colon U003B U1107 # semicolon: choseong pieup U003C U0032 # less: 2 U003D U11BE # equal: jongseong chieuch U003E U0033 # greater: 3 U003F U003F # question: question mark U0040 U0040 # at: commertial at U0041 U11BC # A: jongseong ieung U0042 U0021 # B: exclamation mark U0043 U005C # C: backslash U0044 U005D # D: right bracket U0045 U1167 # E: jungseong yeo U0046 U1161 # F: jungseong a U0047 U002F # G: slash U0048 U0027 # H: apostrophe U0049 U0038 # I: 8 U004A U0034 # J: 4 U004B U0035 # K: 5 U004C U0036 # L: 6 U004D U0031 # M: 1 U004E U0030 # N: 0 U004F U0039 # O: 9 U0050 U003E # P: greater-than sign U0051 U11BA # Q: jongseong sios U0052 U1162 # R: jungseong ae U0053 U005B # S: left bracket U0054 U003B # T: semicolon U0055 U0037 # U: 7 U0056 U1169 # V: jungseong o U0057 U11AF # W: jongseong rieul U0058 U003D # X: equals sign U0059 U003C # Y: less-than sign U005A U002D # Z: minus sign U005B U11C0 # bracketleft: jongseong thieuth U005C U11BF # backslash: jongseong khieukh U005D U11C1 # bracketright: jongseong phieuph U005E U005E # asciicircum: circumflex accent U005F U005F # underscore: underscore U0060 U0060 # quoteleft: grave accent U0061 U11BC # a: jongseong ieung U0062 U116E # b: jungseong u U0063 U1166 # c: jungseong e U0064 U1175 # d: jungseong i U0065 U1167 # e: jungseong yeo U0066 U1161 # f: jungseong a U0067 U1173 # g: jungseong eu U0068 U1102 # h: choseong nieun U0069 U1106 # i: choseong mieum U006A U110B # j: choseong ieung U006B U1100 # k: choseong kiyeok U006C U110C # l: choseong cieuc U006D U1112 # m: choseong hieuh U006E U1109 # n: choseong sios U006F U110E # o: choseong chieuch U0070 U1111 # p: choseong phieuph U0071 U11BA # q: jongseong sios U0072 U1162 # r: jungseong ae U0073 U11AB # s: jongseong nieun U0074 U1165 # t: jungseong eo U0075 U1103 # u: choseong tikeut U0076 U1169 # v: jungseong o U0077 U11AF # w: jongseong rieul U0078 U11A8 # x: jongseong kiyeok U0079 U1105 # y: choseong rieul U007A U11B7 # z: jongseong mieum U007B U007B # braceleft: left brace U007C U007C # bar: vertical line(bar) U007D U007D # braceright: right brace U007E U007E # asciitilde: tilde nabi-nabi-1.0.1/tables/keyboard/3yqwerty000066400000000000000000000100561430012456200201340ustar00rootroot00000000000000Name: 3 set yetguel Compose: full Output: jamo U0021 U11bd # GDK_exclam: jongseong cieuc U0022 U0022 # GDK_quotedbl: quotatioin mark U0023 U0023 # GDK_numbersign: number sign U0024 U0024 # GDK_dollar: dollar sign U0025 U0025 # GDK_percent: percent sign U0026 U0026 # GDK_ampersand: ampersand U0027 U1110 # GDK_apostrophe: choseong thieuth U0028 U0028 # GDK_parenleft: left parenthesis U0029 U0029 # GDK_parenright: right parenthesis U002A U002a # GDK_asterisk: asterisk U002B U002b # GDK_plus: plus sign U002C U002c # GDK_comma: comma U002D U002d # GDK_minus: minus sign U002E U002e # GDK_period: period U002F U1169 # GDK_slash: jungseong o U0030 U110f # GDK_0: choseong khieukh U0031 U11c2 # GDK_1: jongseong hieuh U0032 U11bb # GDK_2: jongseong ssangsios U0033 U11b8 # GDK_3: jongseong pieup U0034 U116d # GDK_4: jungseong yo U0035 U1172 # GDK_5: jungseong yu U0036 U1163 # GDK_6: jungseong ya U0037 U1168 # GDK_7: jungseong ye U0038 U1174 # GDK_8: jungseong yi U0039 U116e # GDK_9: jungseong u U003A U003a # GDK_colon: colon U003B U1107 # GDK_semicolon: choseong pieup U003C U113c # GDK_less: choseong chitueumsios U003D U003d # GDK_equal: euals sign U003E U113e # GDK_greater: choseong ceongchieumsios U003F U003f # GDK_question: question mark U0040 U11eb # GDK_at: jongseong pansios U0041 U11ae # GDK_A: jongseong tikeut U0042 U116e # GDK_B: jungseong u U0043 U11b1 # GDK_C: jongseong rieul-mieum U0044 U11b0 # GDK_D: jongseong rieul-kiyeok U0045 U11bf # GDK_E: jongseong khieukh U0046 U11a9 # GDK_F: jongseong ssangkiyeok U0047 U119e # GDK_G: jungseong araea U0048 U1102 # GDK_H: choseong nieun U0049 U1154 # GDK_I: choseong chitueumchieuch U004A U114c # GDK_J: choseong yesieung U004B U114e # GDK_K: choseong chitueumcieuc U004C U1150 # GDK_L: choseong ceongchieumcieuc U004D U1159 # GDK_M: choseong yeorinhieuh U004E U1140 # GDK_N: choseong pansios U004F U1155 # GDK_O: choseong ceongchieumchieuch U0050 U1111 # GDK_P: choseong phieuph U0051 U11c1 # GDK_Q: jongseong phieuph U0052 U1164 # GDK_R: jungseong yae U0053 U11ad # GDK_S: jongseong nieun-hieuh U0054 U1165 # GDK_T: jungseong eo U0055 U302e # GDK_U: single dot tone mark U0056 U11b6 # GDK_V: jongseong rieul-hieuh U0057 U11c0 # GDK_W: jongseong thikeuth U0058 U11b9 # GDK_X: jongseong pieup-sios U0059 U302f # GDK_Y: double dot tone mark U005A U11be # GDK_Z: jongseong chieuch U005B U005b # GDK_bracketleft: left bracket U005C U005c # GDK_backslash: backslash U005D U005d # GDK_bracketright: right bracket U005E U005e # GDK_asciicircum: circumflex accent U005F U005f # GDK_underscore: underscore U0060 U11f9 # GDK_quoteleft: jongseong yeorinhieuh U0061 U11bc # GDK_a: jongseong ieung U0062 U116e # GDK_b: jungseong u U0063 U1166 # GDK_c: jungseong e U0064 U1175 # GDK_d: jungseong i U0065 U1167 # GDK_e: jungseong yeo U0066 U1161 # GDK_f: jungseong a U0067 U1173 # GDK_g: jungseong eu U0068 U1102 # GDK_h: choseong nieun U0069 U1106 # GDK_i: choseong mieum U006A U110b # GDK_j: choseong ieung U006B U1100 # GDK_k: choseong kiyeok U006C U110c # GDK_l: choseong cieuc U006D U1112 # GDK_m: choseong hieuh U006E U1109 # GDK_n: choseong sios U006F U110e # GDK_o: choseong chieuch U0070 U1111 # GDK_p: choseong phieuph U0071 U11ba # GDK_q: jongseong sios U0072 U1162 # GDK_r: jungseong ae U0073 U11ab # GDK_s: jongseong nieun U0074 U1165 # GDK_t: jungseong eo U0075 U1103 # GDK_u: choseong tikeut U0076 U1169 # GDK_v: jungseong o U0077 U11af # GDK_w: jongseong rieul U0078 U11a8 # GDK_x: jongseong kiyeok U0079 U1105 # GDK_y: choseong rieul U007A U11b7 # GDK_z: jongseong mieum U007B U007b # GDK_braceleft: left brace U007C U007c # GDK_bar: vertical line(bar) U007D U007d # GDK_braceright: right brace U007E U11f0 # GDK_asciitilde: jongseong yesieung nabi-nabi-1.0.1/tables/keyboard_layouts000066400000000000000000000220171430012456200201050ustar00rootroot00000000000000[Dvorak] 0x0022 0x0051 # XK_quotedbl -> XK_Q 0x0027 0x0071 # XK_apostrophe -> XK_q 0x002b 0x007d # XK_plus -> XK_braceright 0x002c 0x0077 # XK_comma -> XK_w 0x002d 0x0027 # XK_minus -> XK_apostrophe 0x002e 0x0065 # XK_period -> XK_e 0x002f 0x005b # XK_slash -> XK_bracketleft 0x003a 0x005a # XK_colon -> XK_Z 0x003b 0x007a # XK_semicolon -> XK_z 0x003c 0x0057 # XK_less -> XK_W 0x003d 0x005d # XK_equal -> XK_bracketright 0x003e 0x0045 # XK_greater -> XK_E 0x003f 0x007b # XK_question -> XK_braceleft 0x0042 0x004e # XK_B -> XK_N 0x0043 0x0049 # XK_C -> XK_I 0x0044 0x0048 # XK_D -> XK_H 0x0045 0x0044 # XK_E -> XK_D 0x0046 0x0059 # XK_F -> XK_Y 0x0047 0x0055 # XK_G -> XK_U 0x0048 0x004a # XK_H -> XK_J 0x0049 0x0047 # XK_I -> XK_G 0x004a 0x0043 # XK_J -> XK_C 0x004b 0x0056 # XK_K -> XK_V 0x004c 0x0050 # XK_L -> XK_P 0x004e 0x004c # XK_N -> XK_L 0x004f 0x0053 # XK_O -> XK_S 0x0050 0x0052 # XK_P -> XK_R 0x0051 0x0058 # XK_Q -> XK_X 0x0052 0x004f # XK_R -> XK_O 0x0053 0x003a # XK_S -> XK_colon 0x0054 0x004b # XK_T -> XK_K 0x0055 0x0046 # XK_U -> XK_F 0x0056 0x003e # XK_V -> XK_greater 0x0057 0x003c # XK_W -> XK_less 0x0058 0x0042 # XK_X -> XK_B 0x0059 0x0054 # XK_Y -> XK_T 0x005a 0x003f # XK_Z -> XK_question 0x005b 0x002d # XK_bracketleft -> XK_minus 0x005d 0x003d # XK_bracketright -> XK_equal 0x005f 0x0022 # XK_underscore -> XK_quotedbl 0x0062 0x006e # XK_b -> XK_n 0x0063 0x0069 # XK_c -> XK_i 0x0064 0x0068 # XK_d -> XK_h 0x0065 0x0064 # XK_e -> XK_d 0x0066 0x0079 # XK_f -> XK_y 0x0067 0x0075 # XK_g -> XK_u 0x0068 0x006a # XK_h -> XK_j 0x0069 0x0067 # XK_i -> XK_g 0x006a 0x0063 # XK_j -> XK_c 0x006b 0x0076 # XK_k -> XK_v 0x006c 0x0070 # XK_l -> XK_p 0x006e 0x006c # XK_n -> XK_l 0x006f 0x0073 # XK_o -> XK_s 0x0070 0x0072 # XK_p -> XK_r 0x0071 0x0078 # XK_q -> XK_x 0x0072 0x006f # XK_r -> XK_o 0x0073 0x003b # XK_s -> XK_semicolon 0x0074 0x006b # XK_t -> XK_k 0x0075 0x0066 # XK_u -> XK_f 0x0076 0x002e # XK_v -> XK_period 0x0077 0x002c # XK_w -> XK_comma 0x0078 0x0062 # XK_x -> XK_b 0x0079 0x0074 # XK_y -> XK_t 0x007a 0x002f # XK_z -> XK_slash 0x007b 0x005f # XK_braceleft -> XK_underscore 0x007d 0x002b # XK_braceright -> XK_plus [Colemak] 0x003a 0x0050 # XK_colon -> XK_P 0x003b 0x0070 # XK_semicolon -> XK_p 0x0044 0x0047 # XK_D -> XK_G 0x0045 0x004b # XK_E -> XK_K 0x0046 0x0045 # XK_F -> XK_E 0x0047 0x0054 # XK_G -> XK_T 0x0049 0x004c # XK_I -> XK_L 0x004a 0x0059 # XK_J -> XK_Y 0x004b 0x004e # XK_K -> XK_N 0x004c 0x0055 # XK_L -> XK_U 0x004e 0x004a # XK_N -> XK_J 0x004f 0x003a # XK_O -> XK_colon 0x0050 0x0052 # XK_P -> XK_R 0x0052 0x0053 # XK_R -> XK_S 0x0053 0x0044 # XK_S -> XK_D 0x0054 0x0046 # XK_T -> XK_F 0x0055 0x0049 # XK_U -> XK_I 0x0059 0x004f # XK_Y -> XK_O 0x0064 0x0067 # XK_d -> XK_g 0x0065 0x006b # XK_e -> XK_k 0x0066 0x0065 # XK_f -> XK_e 0x0067 0x0074 # XK_g -> XK_t 0x0069 0x006c # XK_i -> XK_l 0x006a 0x0079 # XK_j -> XK_y 0x006b 0x006e # XK_k -> XK_n 0x006c 0x0075 # XK_l -> XK_u 0x006e 0x006a # XK_n -> XK_j 0x006f 0x003b # XK_o -> XK_semicolon 0x0070 0x0072 # XK_p -> XK_r 0x0072 0x0073 # XK_r -> XK_s 0x0073 0x0064 # XK_s -> XK_d 0x0074 0x0066 # XK_t -> XK_f 0x0075 0x0069 # XK_u -> XK_i 0x0079 0x006f # XK_y -> XK_o [French] 0x0021 0x002f # XK_exclam -> XK_slash 0x0022 0x0033 # XK_quotedbl -> XK_3 0x0024 0x005d # XK_dollar -> XK_bracketright 0x0025 0x0022 # XK_percent -> XK_quotedbl 0x0026 0x0031 # XK_ampersand -> XK_1 0x0027 0x0034 # XK_apostrophe -> XK_4 0x0028 0x0035 # XK_parenleft -> XK_5 0x0029 0x002d # XK_parenright -> XK_minus 0x002a 0x005c # XK_asterisk -> XK_backslash 0x002c 0x006d # XK_comma -> XK_m 0x002d 0x0036 # XK_minus -> XK_6 0x002e 0x003c # XK_period -> XK_less 0x002f 0x003e # XK_slash -> XK_greater 0x0030 0x0029 # XK_0 -> XK_parenright 0x0031 0x0021 # XK_1 -> XK_exclam 0x0032 0x0040 # XK_2 -> XK_at 0x0033 0x0023 # XK_3 -> XK_numbersign 0x0034 0x0024 # XK_4 -> XK_dollar 0x0035 0x0025 # XK_5 -> XK_percent 0x0036 0x005e # XK_6 -> XK_asciicircum 0x0037 0x0026 # XK_7 -> XK_ampersand 0x0038 0x002a # XK_8 -> XK_asterisk 0x0039 0x0028 # XK_9 -> XK_parenleft 0x003a 0x002e # XK_colon -> XK_period 0x003b 0x002c # XK_semicolon -> XK_comma 0x003f 0x004d # XK_question -> XK_M 0x0041 0x0051 # XK_A -> XK_Q 0x004d 0x003a # XK_M -> XK_colon 0x0051 0x0041 # XK_Q -> XK_A 0x0057 0x005a # XK_W -> XK_Z 0x005a 0x0057 # XK_Z -> XK_W 0x005f 0x0038 # XK_underscore -> XK_8 0x0061 0x0071 # XK_a -> XK_q 0x006d 0x003b # XK_m -> XK_semicolon 0x0071 0x0061 # XK_q -> XK_a 0x0077 0x007a # XK_w -> XK_z 0x007a 0x0077 # XK_z -> XK_w 0x00a3 0x007d # XK_sterling -> XK_braceright 0x00a7 0x003f # XK_section -> XK_question 0x00b0 0x005f # XK_degree -> XK_underscore 0x00b2 0x0060 # XK_twosuperior -> XK_grave 0x00b5 0x007c # XK_mu -> XK_bar 0x00e0 0x0030 # XK_agrave -> XK_0 0x00e7 0x0039 # XK_ccedilla -> XK_9 0x00e8 0x0037 # XK_egrave -> XK_7 0x00e9 0x0032 # XK_eacute -> XK_2 0x00f9 0x0027 # XK_ugrave -> XK_apostrophe 0xfe52 0x005b # XK_dead_circumflex -> XK_bracketleft 0xfe57 0x007b # XK_dead_diaeresis -> XK_braceleft [Germany] 0x0022 0x0040 # XK_quotedbl -> XK_at 0x0023 0x005c # XK_numbersign -> XK_backslash 0x0026 0x005e # XK_ampersand -> XK_asciicircum 0x0027 0x007c # XK_apostrophe -> XK_bar 0x0028 0x002a # XK_parenleft -> XK_asterisk 0x0029 0x0028 # XK_parenright -> XK_parenleft 0x002a 0x007d # XK_asterisk -> XK_braceright 0x002b 0x005d # XK_plus -> XK_bracketright 0x002d 0x002f # XK_minus -> XK_slash 0x002f 0x0026 # XK_slash -> XK_ampersand 0x003a 0x003e # XK_colon -> XK_greater 0x003b 0x003c # XK_semicolon -> XK_less 0x003d 0x0029 # XK_equal -> XK_parenright 0x003f 0x005f # XK_question -> XK_underscore 0x0059 0x005a # XK_Y -> XK_Z 0x005a 0x0059 # XK_Z -> XK_Y 0x005e 0x0060 # XK_asciicircum -> XK_grave 0x005f 0x003f # XK_underscore -> XK_question 0x0079 0x007a # XK_y -> XK_z 0x007a 0x0079 # XK_z -> XK_y 0x00a7 0x0023 # XK_section -> XK_numbersign 0x00b0 0x007e # XK_degree -> XK_asciitilde 0x00c4 0x0022 # XK_Adiaeresis -> XK_quotedbl 0x00d6 0x003a # XK_Odiaeresis -> XK_colon 0x00dc 0x007b # XK_Udiaeresis -> XK_braceleft 0x00df 0x002d # XK_ssharp -> XK_minus 0x00e4 0x0027 # XK_adiaeresis -> XK_apostrophe 0x00f6 0x003b # XK_odiaeresis -> XK_semicolon 0x00fc 0x005b # XK_udiaeresis -> XK_bracketleft 0xfe50 0x002b # XK_dead_grave -> XK_plus 0xfe51 0x003d # XK_dead_acute -> XK_equal 0xfe52 0x0060 # XK_dead_circumflex -> XK_grave nabi-nabi-1.0.1/tables/symbol.txt000066400000000000000000000240171430012456200166520ustar00rootroot00000000000000# Copyright (c) 2005,2006 Choe Hwanjin # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # 3. Neither the name of the author nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. ㄱ: : ㄱ:!: ㄱ:': ㄱ:,: ㄱ:.: ㄱ:/: ㄱ::: ㄱ:;: ㄱ:?: ㄱ:^: ㄱ:_: ㄱ:`: ㄱ:|: ㄱ: ̄: ㄱ:、: ㄱ:。: ㄱ:·: ㄱ:‥: ㄱ:…: ㄱ:¨: ㄱ:〃: ㄱ:­: ㄱ:―: ㄱ:∥: ㄱ:\: ㄱ:∼: ㄱ:´: ㄱ:~: ㄱ:ˇ: ㄱ:˘: ㄱ:˝: ㄱ:˚: ㄱ:˙: ㄱ:¸: ㄱ:˛: ㄱ:¡: ㄱ:¿: ㄱ:ː: ㄲ:Æ: ㄲ:Ð: ㄲ:Ħ: ㄲ:IJ: ㄲ:Ŀ: ㄲ:Ł: ㄲ:Ø: ㄲ:Œ: ㄲ:Þ: ㄲ:Ŧ: ㄲ:Ŋ: ㄲ:æ: ㄲ:đ: ㄲ:ð: ㄲ:ħ: ㄲ:ı: ㄲ:ij: ㄲ:ĸ: ㄲ:ŀ: ㄲ:ł: ㄲ:ø: ㄲ:œ: ㄲ:ß: ㄲ:þ: ㄲ:ŧ: ㄲ:ŋ: ㄲ:ʼn: ㄴ:": ㄴ:(: ㄴ:): ㄴ:[: ㄴ:]: ㄴ:{: ㄴ:}: ㄴ:‘: ㄴ:’: ㄴ:“: ㄴ:”: ㄴ:〔: ㄴ:〕: ㄴ:〈: ㄴ:〉: ㄴ:《: ㄴ:》: ㄴ:「: ㄴ:」: ㄴ:『: ㄴ:』: ㄴ:【: ㄴ:】: ㄷ:+: ㄷ:-: ㄷ:<: ㄷ:=: ㄷ:>: ㄷ:±: ㄷ:×: ㄷ:÷: ㄷ:≠: ㄷ:≤: ㄷ:≥: ㄷ:∞: ㄷ:∴: ㄷ:♂: ㄷ:♀: ㄷ:∠: ㄷ:⊥: ㄷ:⌒: ㄷ:∂: ㄷ:∇: ㄷ:≡: ㄷ:≒: ㄷ:≪: ㄷ:≫: ㄷ:√: ㄷ:∽: ㄷ:∝: ㄷ:∵: ㄷ:∫: ㄷ:∬: ㄷ:∈: ㄷ:∋: ㄷ:⊆: ㄷ:⊇: ㄷ:⊂: ㄷ:⊃: ㄷ:∪: ㄷ:∩: ㄷ:∧: ㄷ:∨: ㄷ:¬: ㄷ:⇒: ㄷ:⇔: ㄷ:∀: ㄷ:∃: ㄷ:∮: ㄷ:∑: ㄷ:∏: ㄸ:ぁ: ㄸ:あ: ㄸ:ぃ: ㄸ:い: ㄸ:ぅ: ㄸ:う: ㄸ:ぇ: ㄸ:え: ㄸ:ぉ: ㄸ:お: ㄸ:か: ㄸ:が: ㄸ:き: ㄸ:ぎ: ㄸ:く: ㄸ:ぐ: ㄸ:け: ㄸ:げ: ㄸ:こ: ㄸ:ご: ㄸ:さ: ㄸ:ざ: ㄸ:し: ㄸ:じ: ㄸ:す: ㄸ:ず: ㄸ:せ: ㄸ:ぜ: ㄸ:そ: ㄸ:ぞ: ㄸ:た: ㄸ:だ: ㄸ:ち: ㄸ:ぢ: ㄸ:っ: ㄸ:つ: ㄸ:づ: ㄸ:て: ㄸ:で: ㄸ:と: ㄸ:ど: ㄸ:な: ㄸ:に: ㄸ:ぬ: ㄸ:ね: ㄸ:の: ㄸ:は: ㄸ:ば: ㄸ:ぱ: ㄸ:ひ: ㄸ:び: ㄸ:ぴ: ㄸ:ふ: ㄸ:ぶ: ㄸ:ぷ: ㄸ:へ: ㄸ:べ: ㄸ:ぺ: ㄸ:ほ: ㄸ:ぼ: ㄸ:ぽ: ㄸ:ま: ㄸ:み: ㄸ:む: ㄸ:め: ㄸ:も: ㄸ:ゃ: ㄸ:や: ㄸ:ゅ: ㄸ:ゆ: ㄸ:ょ: ㄸ:よ: ㄸ:ら: ㄸ:り: ㄸ:る: ㄸ:れ: ㄸ:ろ: ㄸ:ゎ: ㄸ:わ: ㄸ:ゐ: ㄸ:ゑ: ㄸ:を: ㄸ:ん: ㄹ:$: ㄹ:%: ㄹ:₩: ㄹ:F: ㄹ:′: ㄹ:″: ㄹ:℃: ㄹ:Å: ㄹ:¢: ㄹ:£: ㄹ:¥: ㄹ:¤: ㄹ:℉: ㄹ:‰: ㄹ:€: ㄹ:㎕: ㄹ:㎖: ㄹ:㎗: ㄹ:ℓ: ㄹ:㎘: ㄹ:㏄: ㄹ:㎣: ㄹ:㎤: ㄹ:㎥: ㄹ:㎦: ㄹ:㎙: ㄹ:㎚: ㄹ:㎛: ㄹ:㎜: ㄹ:㎝: ㄹ:㎞: ㄹ:㎟: ㄹ:㎠: ㄹ:㎡: ㄹ:㎢: ㄹ:㏊: ㄹ:㎍: ㄹ:㎎: ㄹ:㎏: ㄹ:㏏: ㄹ:㎈: ㄹ:㎉: ㄹ:㏈: ㄹ:㎧: ㄹ:㎨: ㄹ:㎰: ㄹ:㎱: ㄹ:㎲: ㄹ:㎳: ㄹ:㎴: ㄹ:㎵: ㄹ:㎶: ㄹ:㎷: ㄹ:㎸: ㄹ:㎹: ㄹ:㎀: ㄹ:㎁: ㄹ:㎂: ㄹ:㎃: ㄹ:㎄: ㄹ:㎺: ㄹ:㎻: ㄹ:㎼: ㄹ:㎽: ㄹ:㎾: ㄹ:㎿: ㄹ:㎐: ㄹ:㎑: ㄹ:㎒: ㄹ:㎓: ㄹ:㎔: ㄹ:Ω: ㄹ:㏀: ㄹ:㏁: ㄹ:㎊: ㄹ:㎋: ㄹ:㎌: ㄹ:㏖: ㄹ:㏅: ㄹ:㎭: ㄹ:㎮: ㄹ:㎯: ㄹ:㏛: ㄹ:㎩: ㄹ:㎪: ㄹ:㎫: ㄹ:㎬: ㄹ:㏝: ㄹ:㏐: ㄹ:㏓: ㄹ:㏃: ㄹ:㏉: ㄹ:㏜: ㄹ:㏆: ㅁ:#: ㅁ:&: ㅁ:*: ㅁ:@: ㅁ:§: ㅁ:※: ㅁ:☆: ㅁ:★: ㅁ:○: ㅁ:●: ㅁ:◎: ㅁ:◇: ㅁ:◆: ㅁ:□: ㅁ:■: ㅁ:△: ㅁ:▲: ㅁ:▽: ㅁ:▼: ㅁ:→: ㅁ:←: ㅁ:↑: ㅁ:↓: ㅁ:↔: ㅁ:〓: ㅁ:◁: ㅁ:◀: ㅁ:▷: ㅁ:▶: ㅁ:♤: ㅁ:♠: ㅁ:♡: ㅁ:♥: ㅁ:♧: ㅁ:♣: ㅁ:⊙: ㅁ:◈: ㅁ:▣: ㅁ:◐: ㅁ:◑: ㅁ:▒: ㅁ:▤: ㅁ:▥: ㅁ:▨: ㅁ:▧: ㅁ:▦: ㅁ:▩: ㅁ:♨: ㅁ:☏: ㅁ:☎: ㅁ:☜: ㅁ:☞: ㅁ:¶: ㅁ:†: ㅁ:‡: ㅁ:↕: ㅁ:↗: ㅁ:↙: ㅁ:↖: ㅁ:↘: ㅁ:♭: ㅁ:♩: ㅁ:♪: ㅁ:♬: ㅁ:㉿: ㅁ:㈜: ㅁ:№: ㅁ:㏇: ㅁ:™: ㅁ:㏂: ㅁ:㏘: ㅁ:℡: ㅁ:®: ㅁ:ª: ㅁ:º: ㅂ:─: ㅂ:│: ㅂ:┌: ㅂ:┐: ㅂ:┘: ㅂ:└: ㅂ:├: ㅂ:┬: ㅂ:┤: ㅂ:┴: ㅂ:┼: ㅂ:━: ㅂ:┃: ㅂ:┏: ㅂ:┓: ㅂ:┛: ㅂ:┗: ㅂ:┣: ㅂ:┳: ㅂ:┫: ㅂ:┻: ㅂ:╋: ㅂ:┠: ㅂ:┯: ㅂ:┨: ㅂ:┷: ㅂ:┿: ㅂ:┝: ㅂ:┰: ㅂ:┥: ㅂ:┸: ㅂ:╂: ㅂ:┒: ㅂ:┑: ㅂ:┚: ㅂ:┙: ㅂ:┖: ㅂ:┕: ㅂ:┎: ㅂ:┍: ㅂ:┞: ㅂ:┟: ㅂ:┡: ㅂ:┢: ㅂ:┦: ㅂ:┧: ㅂ:┩: ㅂ:┪: ㅂ:┭: ㅂ:┮: ㅂ:┱: ㅂ:┲: ㅂ:┵: ㅂ:┶: ㅂ:┹: ㅂ:┺: ㅂ:┽: ㅂ:┾: ㅂ:╀: ㅂ:╁: ㅂ:╃: ㅂ:╄: ㅂ:╅: ㅂ:╆: ㅂ:╇: ㅂ:╈: ㅂ:╉: ㅂ:╊: ㅃ:ァ: ㅃ:ア: ㅃ:ィ: ㅃ:イ: ㅃ:ゥ: ㅃ:ウ: ㅃ:ェ: ㅃ:エ: ㅃ:ォ: ㅃ:オ: ㅃ:カ: ㅃ:ガ: ㅃ:キ: ㅃ:ギ: ㅃ:ク: ㅃ:グ: ㅃ:ケ: ㅃ:ゲ: ㅃ:コ: ㅃ:ゴ: ㅃ:サ: ㅃ:ザ: ㅃ:シ: ㅃ:ジ: ㅃ:ス: ㅃ:ズ: ㅃ:セ: ㅃ:ゼ: ㅃ:ソ: ㅃ:ゾ: ㅃ:タ: ㅃ:ダ: ㅃ:チ: ㅃ:ヂ: ㅃ:ッ: ㅃ:ツ: ㅃ:ヅ: ㅃ:テ: ㅃ:デ: ㅃ:ト: ㅃ:ド: ㅃ:ナ: ㅃ:ニ: ㅃ:ヌ: ㅃ:ネ: ㅃ:ノ: ㅃ:ハ: ㅃ:バ: ㅃ:パ: ㅃ:ヒ: ㅃ:ビ: ㅃ:ピ: ㅃ:フ: ㅃ:ブ: ㅃ:プ: ㅃ:ヘ: ㅃ:ベ: ㅃ:ペ: ㅃ:ホ: ㅃ:ボ: ㅃ:ポ: ㅃ:マ: ㅃ:ミ: ㅃ:ム: ㅃ:メ: ㅃ:モ: ㅃ:ャ: ㅃ:ヤ: ㅃ:ュ: ㅃ:ユ: ㅃ:ョ: ㅃ:ヨ: ㅃ:ラ: ㅃ:リ: ㅃ:ル: ㅃ:レ: ㅃ:ロ: ㅃ:ヮ: ㅃ:ワ: ㅃ:ヰ: ㅃ:ヱ: ㅃ:ヲ: ㅃ:ン: ㅃ:ヴ: ㅃ:ヵ: ㅃ:ヶ: ㅅ:㉠: ㅅ:㉡: ㅅ:㉢: ㅅ:㉣: ㅅ:㉤: ㅅ:㉥: ㅅ:㉦: ㅅ:㉧: ㅅ:㉨: ㅅ:㉩: ㅅ:㉪: ㅅ:㉫: ㅅ:㉬: ㅅ:㉭: ㅅ:㉮: ㅅ:㉯: ㅅ:㉰: ㅅ:㉱: ㅅ:㉲: ㅅ:㉳: ㅅ:㉴: ㅅ:㉵: ㅅ:㉶: ㅅ:㉷: ㅅ:㉸: ㅅ:㉹: ㅅ:㉺: ㅅ:㉻: ㅅ:㈀: ㅅ:㈁: ㅅ:㈂: ㅅ:㈃: ㅅ:㈄: ㅅ:㈅: ㅅ:㈆: ㅅ:㈇: ㅅ:㈈: ㅅ:㈉: ㅅ:㈊: ㅅ:㈋: ㅅ:㈌: ㅅ:㈍: ㅅ:㈎: ㅅ:㈏: ㅅ:㈐: ㅅ:㈑: ㅅ:㈒: ㅅ:㈓: ㅅ:㈔: ㅅ:㈕: ㅅ:㈖: ㅅ:㈗: ㅅ:㈘: ㅅ:㈙: ㅅ:㈚: ㅅ:㈛: ㅆ:А: ㅆ:Б: ㅆ:В: ㅆ:Г: ㅆ:Д: ㅆ:Е: ㅆ:Ё: ㅆ:Ж: ㅆ:З: ㅆ:И: ㅆ:Й: ㅆ:К: ㅆ:Л: ㅆ:М: ㅆ:Н: ㅆ:О: ㅆ:П: ㅆ:Р: ㅆ:С: ㅆ:Т: ㅆ:У: ㅆ:Ф: ㅆ:Х: ㅆ:Ц: ㅆ:Ч: ㅆ:Ш: ㅆ:Щ: ㅆ:Ъ: ㅆ:Ы: ㅆ:Ь: ㅆ:Э: ㅆ:Ю: ㅆ:Я: ㅆ:а: ㅆ:б: ㅆ:в: ㅆ:г: ㅆ:д: ㅆ:е: ㅆ:ё: ㅆ:ж: ㅆ:з: ㅆ:и: ㅆ:й: ㅆ:к: ㅆ:л: ㅆ:м: ㅆ:н: ㅆ:о: ㅆ:п: ㅆ:р: ㅆ:с: ㅆ:т: ㅆ:у: ㅆ:ф: ㅆ:х: ㅆ:ц: ㅆ:ч: ㅆ:ш: ㅆ:щ: ㅆ:ъ: ㅆ:ы: ㅆ:ь: ㅆ:э: ㅆ:ю: ㅆ:я: ㅇ:ⓐ: ㅇ:ⓑ: ㅇ:ⓒ: ㅇ:ⓓ: ㅇ:ⓔ: ㅇ:ⓕ: ㅇ:ⓖ: ㅇ:ⓗ: ㅇ:ⓘ: ㅇ:ⓙ: ㅇ:ⓚ: ㅇ:ⓛ: ㅇ:ⓜ: ㅇ:ⓝ: ㅇ:ⓞ: ㅇ:ⓟ: ㅇ:ⓠ: ㅇ:ⓡ: ㅇ:ⓢ: ㅇ:ⓣ: ㅇ:ⓤ: ㅇ:ⓥ: ㅇ:ⓦ: ㅇ:ⓧ: ㅇ:ⓨ: ㅇ:ⓩ: ㅇ:①: ㅇ:②: ㅇ:③: ㅇ:④: ㅇ:⑤: ㅇ:⑥: ㅇ:⑦: ㅇ:⑧: ㅇ:⑨: ㅇ:⑩: ㅇ:⑪: ㅇ:⑫: ㅇ:⑬: ㅇ:⑭: ㅇ:⑮: ㅇ:⒜: ㅇ:⒝: ㅇ:⒞: ㅇ:⒟: ㅇ:⒠: ㅇ:⒡: ㅇ:⒢: ㅇ:⒣: ㅇ:⒤: ㅇ:⒥: ㅇ:⒦: ㅇ:⒧: ㅇ:⒨: ㅇ:⒩: ㅇ:⒪: ㅇ:⒫: ㅇ:⒬: ㅇ:⒭: ㅇ:⒮: ㅇ:⒯: ㅇ:⒰: ㅇ:⒱: ㅇ:⒲: ㅇ:⒳: ㅇ:⒴: ㅇ:⒵: ㅇ:⑴: ㅇ:⑵: ㅇ:⑶: ㅇ:⑷: ㅇ:⑸: ㅇ:⑹: ㅇ:⑺: ㅇ:⑻: ㅇ:⑼: ㅇ:⑽: ㅇ:⑾: ㅇ:⑿: ㅇ:⒀: ㅇ:⒁: ㅇ:⒂: ㅈ:0: ㅈ:1: ㅈ:2: ㅈ:3: ㅈ:4: ㅈ:5: ㅈ:6: ㅈ:7: ㅈ:8: ㅈ:9: ㅈ:ⅰ: ㅈ:ⅱ: ㅈ:ⅲ: ㅈ:ⅳ: ㅈ:ⅴ: ㅈ:ⅵ: ㅈ:ⅶ: ㅈ:ⅷ: ㅈ:ⅸ: ㅈ:ⅹ: ㅈ:Ⅰ: ㅈ:Ⅱ: ㅈ:Ⅲ: ㅈ:Ⅳ: ㅈ:Ⅴ: ㅈ:Ⅵ: ㅈ:Ⅶ: ㅈ:Ⅷ: ㅈ:Ⅸ: ㅈ:Ⅹ: ㅊ:½: ㅊ:⅓: ㅊ:⅔: ㅊ:¼: ㅊ:¾: ㅊ:⅛: ㅊ:⅜: ㅊ:⅝: ㅊ:⅞: ㅊ:¹: ㅊ:²: ㅊ:³: ㅊ:⁴: ㅊ:ⁿ: ㅊ:₁: ㅊ:₂: ㅊ:₃: ㅊ:₄: ㅋ:ㄱ: ㅋ:ㄲ: ㅋ:ㄳ: ㅋ:ㄴ: ㅋ:ㄵ: ㅋ:ㄶ: ㅋ:ㄷ: ㅋ:ㄸ: ㅋ:ㄹ: ㅋ:ㄺ: ㅋ:ㄻ: ㅋ:ㄼ: ㅋ:ㄽ: ㅋ:ㄾ: ㅋ:ㄿ: ㅋ:ㅀ: ㅋ:ㅁ: ㅋ:ㅂ: ㅋ:ㅃ: ㅋ:ㅄ: ㅋ:ㅅ: ㅋ:ㅆ: ㅋ:ㅇ: ㅋ:ㅈ: ㅋ:ㅉ: ㅋ:ㅊ: ㅋ:ㅋ: ㅋ:ㅌ: ㅋ:ㅍ: ㅋ:ㅎ: ㅋ:ㅏ: ㅋ:ㅐ: ㅋ:ㅑ: ㅋ:ㅒ: ㅋ:ㅓ: ㅋ:ㅔ: ㅋ:ㅕ: ㅋ:ㅖ: ㅋ:ㅗ: ㅋ:ㅘ: ㅋ:ㅙ: ㅋ:ㅚ: ㅋ:ㅛ: ㅋ:ㅜ: ㅋ:ㅝ: ㅋ:ㅞ: ㅋ:ㅟ: ㅋ:ㅠ: ㅋ:ㅡ: ㅋ:ㅢ: ㅋ:ㅣ: ㅌ:ㅥ: ㅌ:ㅦ: ㅌ:ㅧ: ㅌ:ㅨ: ㅌ:ㅩ: ㅌ:ㅪ: ㅌ:ㅫ: ㅌ:ㅬ: ㅌ:ㅭ: ㅌ:ㅮ: ㅌ:ㅯ: ㅌ:ㅰ: ㅌ:ㅱ: ㅌ:ㅲ: ㅌ:ㅳ: ㅌ:ㅴ: ㅌ:ㅵ: ㅌ:ㅶ: ㅌ:ㅷ: ㅌ:ㅸ: ㅌ:ㅹ: ㅌ:ㅺ: ㅌ:ㅻ: ㅌ:ㅼ: ㅌ:ㅽ: ㅌ:ㅾ: ㅌ:ㅿ: ㅌ:ㆀ: ㅌ:ㆁ: ㅌ:ㆂ: ㅌ:ㆃ: ㅌ:ㆄ: ㅌ:ㆅ: ㅌ:ㆆ: ㅌ:ㆇ: ㅌ:ㆈ: ㅌ:ㆉ: ㅌ:ㆊ: ㅌ:ㆋ: ㅌ:ㆌ: ㅌ:ㆍ: ㅌ:ㆎ: ㅍ:A: ㅍ:B: ㅍ:C: ㅍ:D: ㅍ:E: ㅍ:F: ㅍ:G: ㅍ:H: ㅍ:I: ㅍ:J: ㅍ:K: ㅍ:L: ㅍ:M: ㅍ:N: ㅍ:O: ㅍ:P: ㅍ:Q: ㅍ:R: ㅍ:S: ㅍ:T: ㅍ:U: ㅍ:V: ㅍ:W: ㅍ:X: ㅍ:Y: ㅍ:Z: ㅍ:a: ㅍ:b: ㅍ:c: ㅍ:d: ㅍ:e: ㅍ:f: ㅍ:g: ㅍ:h: ㅍ:i: ㅍ:j: ㅍ:k: ㅍ:l: ㅍ:m: ㅍ:n: ㅍ:o: ㅍ:p: ㅍ:q: ㅍ:r: ㅍ:s: ㅍ:t: ㅍ:u: ㅍ:v: ㅍ:w: ㅍ:x: ㅍ:y: ㅍ:z: ㅎ:Α: ㅎ:Β: ㅎ:Γ: ㅎ:Δ: ㅎ:Ε: ㅎ:Ζ: ㅎ:Η: ㅎ:Θ: ㅎ:Ι: ㅎ:Κ: ㅎ:Λ: ㅎ:Μ: ㅎ:Ν: ㅎ:Ξ: ㅎ:Ο: ㅎ:Π: ㅎ:Ρ: ㅎ:Σ: ㅎ:Τ: ㅎ:Υ: ㅎ:Φ: ㅎ:Χ: ㅎ:Ψ: ㅎ:Ω: ㅎ:α: ㅎ:β: ㅎ:γ: ㅎ:δ: ㅎ:ε: ㅎ:ζ: ㅎ:η: ㅎ:θ: ㅎ:ι: ㅎ:κ: ㅎ:λ: ㅎ:μ: ㅎ:ν: ㅎ:ξ: ㅎ:ο: ㅎ:π: ㅎ:ρ: ㅎ:σ: ㅎ:τ: ㅎ:υ: ㅎ:φ: ㅎ:χ: ㅎ:ψ: ㅎ:ω: nabi-nabi-1.0.1/test/000077500000000000000000000000001430012456200143055ustar00rootroot00000000000000nabi-nabi-1.0.1/test/Makefile000066400000000000000000000021631430012456200157470ustar00rootroot00000000000000# Makefile CFLAGS = -I/usr/X11R6/include -Wall -g CXXFLAGS = -I/usr/X11R6/include -Wall -g LIBS = -L/usr/X11R6/lib -lX11 QT3_CXXFLAGS = -I$(QTDIR)/include QT3_LIBS = -L$(QTDIR)/lib -lqt-mt QT4_CXXFLAGS = $(shell pkg-config --cflags QtGui) QT4_LIBS = $(shell pkg-config --libs QtGui) GTK1_CFLAGS = $(shell gtk--config --cflags) GTK1_LIBS = $(shell gtk--config --libs) GTK2_CFLAGS = $(shell pkg-config --cflags gtk+-2.0) GTK2_LIBS = $(shell pkg-config --libs gtk+-2.0) GTK3_CFLAGS = $(shell pkg-config --cflags gtk+-3.0) GTK3_LIBS = $(shell pkg-config --libs gtk+-3.0) all: xlib gtk2 gtk3 qt4 xim_filter.so clean: rm -f xlib gtk1 gtk2 gtk3 qt3 qt4 xlib: xlib.cpp g++ $(CXXFLAGS) xlib.cpp -o xlib $(LIBS) gtk1: gtk1.c gcc -Wall -g `gtk-config --cflags --libs` gtk1.c -o gtk1 gtk2: gtk.c gcc -Wall -g $(GTK2_CFLAGS) $< -o $@ $(GTK2_LIBS) gtk3: gtk.c gcc -Wall -g $(GTK3_CFLAGS) $< -o $@ $(GTK3_LIBS) qt3: qt.cpp g++ -Wall -g $(QT3_CXXFLAGS) $< -o $@ $(QT3_LIBS) xim_filter.so: xim_filter.c gcc -Wall -g -shared -fPIC xim_filter.c -o xim_filter.so -ldl qt4: qt4.cpp g++ -Wall -g -O0 $(QT4_CXXFLAGS) $< -o $@ $(QT4_LIBS) nabi-nabi-1.0.1/test/gtk.c000066400000000000000000000020361430012456200152370ustar00rootroot00000000000000#include void on_destroy(GtkWidget *widget, gpointer data) { gtk_main_quit(); } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *vbox; GtkWidget *entry; GtkWidget *textview; GtkWidget *scrolled; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(on_destroy), NULL); gtk_window_set_default_size(GTK_WINDOW(window), 300, 200); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); entry = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, TRUE, 0); textview = gtk_text_view_new(); scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_container_add(GTK_CONTAINER(scrolled), textview); gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0); gtk_widget_show_all(window); gtk_main(); return 0; } nabi-nabi-1.0.1/test/gtk1.c000066400000000000000000000015601430012456200153210ustar00rootroot00000000000000#include #include void on_destroy(GtkWidget *widget, gpointer data) { gtk_main_quit(); } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *vbox; GtkWidget *entry; GtkWidget *text; gtk_set_locale(); gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(on_destroy), NULL); gtk_widget_set_usize(window, 300, 200); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); entry = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, TRUE, 0); text = gtk_text_new(NULL, NULL); gtk_text_set_editable(GTK_TEXT(text), TRUE); gtk_box_pack_start(GTK_BOX(vbox), text, TRUE, TRUE, 0); gtk_widget_show_all(window); gtk_main(); return 0; } nabi-nabi-1.0.1/test/qt.cpp000066400000000000000000000010051430012456200154310ustar00rootroot00000000000000#include #include #include #include int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget widget; widget.resize(300, 200); QBoxLayout *layout = new QVBoxLayout(&widget); QLineEdit *lineedit = new QLineEdit(&widget, 0); layout->addWidget(lineedit); QTextEdit *textedit = new QTextEdit(&widget, 0); layout->addWidget(textedit); app.setMainWidget(&widget); widget.show(); return app.exec(); } nabi-nabi-1.0.1/test/qt4.cpp000066400000000000000000000007371430012456200155300ustar00rootroot00000000000000#include #include #include #include int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget widget; widget.resize(300, 200); QBoxLayout *layout = new QVBoxLayout(&widget); QLineEdit *lineedit = new QLineEdit(&widget); layout->addWidget(lineedit); QTextEdit *textedit = new QTextEdit(&widget); layout->addWidget(textedit); widget.show(); return app.exec(); } nabi-nabi-1.0.1/test/xim_filter.c000066400000000000000000000125151430012456200166170ustar00rootroot00000000000000#define _GNU_SOURCE #include #include #include static int (*orig_XNextEvent)( Display* /* display */, XEvent* /* event_return */ ) = NULL; static XIM (*orig_XOpenIM)( Display* /* dpy */, struct _XrmHashBucketRec* /* rdb */, char* /* res_name */, char* /* res_class */ ) = NULL; static Status (*orig_XCloseIM)( XIM /* im */ ) = NULL; static void (*orig_XDestroyIC)( XIC /* ic */ ) = NULL; static void (*orig_XSetICFocus)( XIC /* ic */ ) = NULL; static void (*orig_XUnsetICFocus)( XIC /* ic */ ) = NULL; static Bool (*orig_XFilterEvent)( XEvent* /* event */, Window /* window */ ) = NULL; static int (*orig_XmbLookupString)( XIC /* ic */, XKeyPressedEvent* /* event */, char* /* buffer_return */, int /* bytes_buffer */, KeySym* /* keysym_return */, Status* /* status_return */ ) = NULL; static Bool (*orig_XRegisterIMInstantiateCallback)( Display* /* dpy */, struct _XrmHashBucketRec* /* rdb */, char* /* res_name */, char* /* res_class */, XIDProc /* callback */, XPointer /* client_data */ ) = NULL; static Bool (*orig_XUnregisterIMInstantiateCallback)( Display* /* dpy */, struct _XrmHashBucketRec* /* rdb */, char* /* res_name */, char* /* res_class */, XIDProc /* callback */, XPointer /* client_data */ ) = NULL; __attribute__((constructor)) void init() { orig_XNextEvent = dlsym(RTLD_NEXT, "XNextEvent"); orig_XOpenIM = dlsym(RTLD_NEXT, "XOpenIM"); orig_XCloseIM = dlsym(RTLD_NEXT, "XCloseIM"); orig_XDestroyIC = dlsym(RTLD_NEXT, "XDestroyIC"); orig_XSetICFocus = dlsym(RTLD_NEXT, "XSetICFocus"); orig_XUnsetICFocus = dlsym(RTLD_NEXT, "XUnsetICFocus"); orig_XFilterEvent = dlsym(RTLD_NEXT, "XFilterEvent"); orig_XmbLookupString = dlsym(RTLD_NEXT, "XmbLookupString"); orig_XRegisterIMInstantiateCallback = dlsym(RTLD_NEXT, "XRegisterIMInstantiateCallback"); orig_XUnregisterIMInstantiateCallback = dlsym(RTLD_NEXT, "XUnregisterIMInstantiateCallback"); } int XNextEvent( Display* display, XEvent* event_return ) { int ret; ret = orig_XNextEvent(display, event_return); if (event_return->type == KeyPress || event_return->type == KeyRelease) { char t = event_return->type == KeyPress ? 'P' : 'R'; printf("%s: (%c, c:0x%x, w:0x%x)\n", __func__, t, event_return->xkey.keycode, (unsigned int)event_return->xkey.window); } return ret; } XIM XOpenIM( Display* dpy, struct _XrmHashBucketRec* rdb, char* res_name, char* res_class ) { printf("%s:\n", __func__); return orig_XOpenIM(dpy, rdb, res_name, res_class); } Status XCloseIM( XIM im ) { printf("%s:\n", __func__); return orig_XCloseIM(im); } void XDestroyIC( XIC ic ) { printf("%s: %p\n", __func__, ic); return orig_XDestroyIC(ic); } void XSetICFocus( XIC ic ) { unsigned int* p = (unsigned int*)ic; printf("%s: %p: focus window: %x %x\n", __func__, ic, p[3], p[5]); return orig_XSetICFocus(ic); } void XUnsetICFocus( XIC ic ) { printf("%s: %p\n", __func__, ic); return orig_XUnsetICFocus(ic); } Bool XFilterEvent( XEvent* event, Window window ) { if (window != None) { if (event->type == KeyPress || event->type == KeyRelease) { Bool ret = orig_XFilterEvent(event, window); char t = event->type == KeyPress ? 'P' : 'R'; printf("%s: (%c, c:0x%x, w:0x%x), window=0x%x, ret: %d\n", __func__, t, event->xkey.keycode, (unsigned int)event->xkey.window, (unsigned int)window, ret); return ret; } } return orig_XFilterEvent(event, window); } int XmbLookupString( XIC ic, XKeyPressedEvent* event, char* buffer_return, int bytes_buffer, KeySym* keysym_return, Status* status_return ) { printf("%s: %p\n", __func__, ic); return orig_XmbLookupString(ic, event, buffer_return, bytes_buffer, keysym_return, status_return); } Bool XRegisterIMInstantiateCallback( Display* dpy, struct _XrmHashBucketRec* rdb, char* res_name, char* res_class, XIDProc callback, XPointer client_data ) { printf("%s:\n", __func__); return orig_XRegisterIMInstantiateCallback(dpy, rdb, res_name, res_class, callback, client_data); } Bool XUnregisterIMInstantiateCallback( Display* dpy, struct _XrmHashBucketRec* rdb, char* res_name, char* res_class, XIDProc callback, XPointer client_data ) { printf("%s:\n", __func__); return orig_XUnregisterIMInstantiateCallback(dpy, rdb, res_name, res_class, callback, client_data); } nabi-nabi-1.0.1/test/xlib.cpp000066400000000000000000000562401430012456200157560ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #define NELEMENTS(buf) (sizeof(buf) / sizeof(buf[0])) class TextView { public: TextView(); void create(Display *display, Window parent, int inputStyle); void destroy(); void setTitle(const char *title); bool isDestroyed(); void onExpose(); void onFocusIn(); void onFocusOut(); void onKeyPress(XKeyPressedEvent *event); void onClientMessage(const XClientMessageEvent *event); // for XIM void registerInstantiateCallback(); // IM instantiate callback static void IMInstantiateCallback(Display *display, XPointer client_data, XPointer data); // IM destroy callbacks static void IMDestroyCallback(XIM xim, XPointer client_data, XPointer data); // on the spot callbacks static void preeditStartCallback(XIM xim, XPointer client_data, XPointer data); static void preeditDoneCallback(XIM xim, XPointer client_data, XPointer data); static void preeditDrawCallback(XIM xim, XPointer client_data, XPointer data); static void preeditCaretCallback(XIM xim, XPointer client_data, XPointer data); static void statusStartCallback(XIM xim, XPointer client_data, XPointer data); static void statusDoneCallback(XIM xim, XPointer client_data, XPointer data); static void statusDrawCallback(XIM xim, XPointer client_data, XPointer data); // string conversion callback static void stringConversionCallback(XIM xim, XPointer client_data, XPointer data); private: // for XIM interaction void openIM(); void closeIM(); void createIC(bool useStringConversion); void destroyIC(); void setPreeditString(const wchar_t *str, int pos, int length); void setPreeditCaret(int pos); void getSpotLocation(XPoint &point); void updateSpotLocation(); // keyevent void onKeyReturn(); void onKeyDelete(); void onKeyBackspace(); void onKeyHome(); void onKeyEnd(); void onKeyEscape(); void insert(const wchar_t *str); void moveCaret(int x, int y); void draw(); static std::string fontsetString; Display *m_display; Window m_window; GC m_gc; GC m_preeditGC; XIM m_im; XIC m_ic; Atom m_WMDeleteWindow; int m_width; int m_height; XFontSet m_fontset; XRectangle m_fontsetRect; int m_inputStyle; int m_nrow; int m_ncol; XPoint m_caret; // coord. in row/col std::wstring m_preeditString; int m_preeditCaret; std::vector m_text; }; std::string TextView::fontsetString = "*,*"; TextView::TextView() : m_display(NULL), m_window(0), m_gc(0), m_preeditGC(0), m_ic(0), m_width(300), m_height(200), m_fontset(NULL), m_nrow(10), m_ncol(80), m_preeditCaret(0) { m_fontsetRect.x = 0; m_fontsetRect.y = 0; m_fontsetRect.width = 0; m_fontsetRect.height = 0; m_caret.x = 0; m_caret.y = 0; m_text.push_back(new std::wstring(L"")); } bool TextView::isDestroyed() { return m_window == 0; } void TextView::registerInstantiateCallback() { XRegisterIMInstantiateCallback(m_display, NULL, NULL, NULL, TextView::IMInstantiateCallback, (XPointer)this); } void TextView::openIM() { m_im = XOpenIM(m_display, NULL, NULL, NULL); if (m_im == NULL) { printf("Can't open XIM\n"); return; } printf("XIM is opened\n"); XUnregisterIMInstantiateCallback(m_display, NULL, NULL, NULL, IMInstantiateCallback, (XPointer)this); // register destroy callback XIMCallback destroy; destroy.callback = IMDestroyCallback; destroy.client_data = (XPointer)this; XSetIMValues(m_im, XNDestroyCallback, &destroy, NULL); bool useStringConversion = false; XIMValuesList* ic_values = NULL; XGetIMValues(m_im, XNQueryICValuesList, &ic_values, NULL); if (ic_values != NULL) { for (int i = 0; i < ic_values->count_values; i++) { if (strcmp(ic_values->supported_values[i], XNStringConversionCallback) == 0) { useStringConversion = true; break; } } } createIC(useStringConversion); } void TextView::closeIM(void) { XCloseIM(m_im); m_im = NULL; printf("XIM is closed\n"); } void TextView::createIC(bool useStringConversion) { if (m_im == NULL) return; if ((m_inputStyle & XIMPreeditCallbacks) == XIMPreeditCallbacks) { XIMCallback preedit_start; XIMCallback preedit_done; XIMCallback preedit_draw; XIMCallback preedit_caret; preedit_start.callback = preeditStartCallback; preedit_start.client_data = (XPointer)this; preedit_done.callback = preeditDoneCallback; preedit_done.client_data = (XPointer)this; preedit_draw.callback = preeditDrawCallback; preedit_draw.client_data = (XPointer)this; preedit_caret.callback = preeditCaretCallback; preedit_caret.client_data = (XPointer)this; XVaNestedList p_attr = XVaCreateNestedList(0, XNPreeditStartCallback, &preedit_start, XNPreeditDoneCallback, &preedit_done, XNPreeditDrawCallback, &preedit_draw, XNPreeditCaretCallback, &preedit_caret, NULL); XIMCallback status_start; XIMCallback status_done; XIMCallback status_draw; status_start.callback = statusStartCallback; status_start.client_data = (XPointer)this; status_done.callback = statusDoneCallback; status_done.client_data = (XPointer)this; status_draw.callback = statusDrawCallback; status_draw.client_data = (XPointer)this; XVaNestedList s_attr = XVaCreateNestedList(0, XNStatusStartCallback, &status_start, XNStatusDoneCallback, &status_done, XNStatusDrawCallback, &status_draw, NULL); m_ic = XCreateIC(m_im, XNInputStyle, XIMPreeditCallbacks, XNClientWindow, m_window, XNPreeditAttributes, p_attr, XNStatusAttributes, s_attr, NULL); XFree(p_attr); XFree(s_attr); } else if ((m_inputStyle & XIMPreeditPosition) == XIMPreeditPosition) { XRectangle area; area.x = 0; area.y = 0; area.width = m_width; area.height = m_height; XPoint spotLocation; getSpotLocation(spotLocation); XVaNestedList attr = XVaCreateNestedList(0, XNSpotLocation, &spotLocation, XNArea, &area, XNFontSet, m_fontset, NULL); m_ic = XCreateIC(m_im, XNInputStyle, XIMPreeditPosition, XNClientWindow, m_window, XNPreeditAttributes, attr, NULL); XFree(attr); } else if ((m_inputStyle & XIMPreeditArea) == XIMPreeditArea) { XRectangle area; area.x = 0; area.y = 0; area.width = m_width; area.height = m_height; XVaNestedList attr = XVaCreateNestedList(0, XNArea, &area, XNFontSet, m_fontset, NULL); m_ic = XCreateIC(m_im, XNInputStyle, XIMPreeditArea, XNClientWindow, m_window, XNPreeditAttributes, attr, NULL); XFree(attr); } else if ((m_inputStyle & XIMPreeditNothing) == XIMPreeditNothing) { m_ic = XCreateIC(m_im, XNInputStyle, XIMPreeditNothing, XNClientWindow, m_window, NULL); } else if ((m_inputStyle & XIMPreeditNone) == XIMPreeditNone) { m_ic = XCreateIC(m_im, XNInputStyle, XIMPreeditNone, XNClientWindow, m_window, NULL); } if (m_ic != NULL) { unsigned long fevent = 0; XGetICValues(m_ic, XNFilterEvents, &fevent, NULL); unsigned long mask = ExposureMask | KeyPressMask | FocusChangeMask; XSelectInput(m_display, m_window, mask | fevent); if (useStringConversion) { XIMCallback strconv; strconv.callback = stringConversionCallback; strconv.client_data = (XPointer)this; XSetICValues(m_ic, XNStringConversionCallback, &strconv, NULL); } printf("XIC is created\n"); } else { printf("cannot create XIC\n"); } } void TextView::destroyIC() { if (m_ic != NULL) { XDestroyIC(m_ic); m_ic = NULL; printf("XIC is destroyed\n"); } } void TextView::create(Display *display, Window parent, int inputStyle) { // create window m_display = display; int screen = DefaultScreen(m_display); if (parent == 0) parent = RootWindow(display, screen); m_window = XCreateSimpleWindow(m_display, parent, 0, 0, m_width, m_height, 0, BlackPixel(m_display, screen), WhitePixel(m_display, screen)); // load fontset char **missing_list = NULL; int missing_count = 0; char *default_string = NULL; m_fontset = XCreateFontSet(display, fontsetString.c_str(), &missing_list, &missing_count, &default_string); if (m_fontset == NULL) { printf("Can't create font set: %s\n", fontsetString.c_str()); exit(0); } XFontStruct **font_struct; char **font_names; int n = XFontsOfFontSet(m_fontset, &font_struct, &font_names); if (n > 0) { printf("fonset:"); for (int i = 0; i < n; i++) { printf("\t%s\n", font_names[i]); } } XFontSetExtents *fontset_ext = XExtentsOfFontSet(m_fontset); m_fontsetRect = fontset_ext->max_logical_extent; // create GC XGCValues values; values.foreground = BlackPixel(m_display, screen); values.background = WhitePixel(m_display, screen); m_gc = XCreateGC(display, m_window, GCForeground | GCBackground, &values); values.foreground = WhitePixel(m_display, screen); values.background = BlackPixel(m_display, screen); m_preeditGC = XCreateGC(display, m_window, GCForeground | GCBackground, &values); // set input style m_inputStyle = inputStyle; // register instantiate callback registerInstantiateCallback(); unsigned long mask = ExposureMask | KeyPressMask | KeyReleaseMask | FocusChangeMask; XSelectInput(m_display, m_window, mask); m_WMDeleteWindow = XInternAtom(m_display, "WM_DELETE_WINDOW", False); XSetWMProtocols(m_display, m_window, &m_WMDeleteWindow, 1); XMapWindow(m_display, m_window); } void TextView::setTitle(const char *title) { if (m_window != 0) XStoreName(m_display, m_window, title); } void TextView::destroy() { for (std::vector::iterator iter = m_text.begin(); iter != m_text.end(); ++iter) { delete (*iter); } destroyIC(); closeIM(); XDestroyWindow(m_display, m_window); m_window = 0; m_display = NULL; } void TextView::draw() { XClearWindow(m_display, m_window); int i, x = 0, y = 0; for (i = 0; i < (int)m_text.size(); i++) { if (i == m_caret.y) { int xpos = 0; std::wstring before = m_text[i]->substr(0, m_caret.x); std::wstring after = m_text[i]->substr(m_caret.x, m_text[i]->size() - m_caret.x); XwcDrawImageString(m_display, m_window, m_fontset, m_gc, xpos, y - m_fontsetRect.y, before.c_str(), before.size()); xpos += XwcTextEscapement(m_fontset, before.c_str(), before.size()); XwcDrawImageString(m_display, m_window, m_fontset, m_preeditGC, xpos, y - m_fontsetRect.y, m_preeditString.c_str(), m_preeditString.size()); xpos += XwcTextEscapement(m_fontset, m_preeditString.c_str(), m_preeditString.size()); XwcDrawImageString(m_display, m_window, m_fontset, m_gc, xpos, y - m_fontsetRect.y, after.c_str(), after.size()); } else { XwcDrawImageString(m_display, m_window, m_fontset, m_gc, x, y - m_fontsetRect.y, m_text[i]->c_str(), m_text[i]->size()); } y += m_fontsetRect.height; } // draw caret; std::wstring fullstring = *m_text[m_caret.y]; fullstring.insert(m_caret.x, m_preeditString); std::wstring substring = fullstring.substr(0, m_caret.x + m_preeditCaret); x = XwcTextEscapement(m_fontset, substring.c_str(), substring.size()); y = m_fontsetRect.height * m_caret.y; XDrawLine(m_display, m_window, m_gc, x, y, x, y + m_fontsetRect.height); } void TextView::insert(const wchar_t *str) { m_text[m_caret.y]->insert(m_caret.x, str); m_caret.x += wcslen(str); } void TextView::moveCaret(int x, int y) { if (x > 0) { if (m_caret.x < (int)m_text[m_caret.y]->size()) { m_caret.x++; } else if (m_caret.y < (int)m_text.size() - 1) { m_caret.x = 0; m_caret.y++; } } else if (x < 0) { if (m_caret.x > 0) { m_caret.x--; } else if (m_caret.y > 0) { m_caret.x = (int)m_text[m_caret.y - 1]->size(); m_caret.y--; } } if (y > 0) { if (m_caret.y < (int)m_text.size() - 1) { m_caret.y++; if (m_caret.x > (int)m_text[m_caret.y]->size()) m_caret.x = m_text[m_caret.y]->size(); } } else if (y < 0) { if (m_caret.y > 0) { m_caret.y--; if (m_caret.x > (int)m_text[m_caret.y]->size()) m_caret.x = m_text[m_caret.y]->size(); } } updateSpotLocation(); } void TextView::updateSpotLocation() { if (m_ic == NULL) return; if ((m_inputStyle | XIMPreeditPosition) == XIMPreeditPosition) { XPoint spotLocation = { 0, 0 }; getSpotLocation(spotLocation); XVaNestedList attr = XVaCreateNestedList(0, XNSpotLocation, &spotLocation, NULL); XSetICValues(m_ic, XNPreeditAttributes, attr, NULL); XFree(attr); } } void TextView::setPreeditCaret(int pos) { m_preeditCaret = pos; } void TextView::setPreeditString(const wchar_t *str, int pos, int length) { if (str == NULL) { m_preeditString.erase(pos, length); } else { if (length > 0) { m_preeditString.replace(pos, length, str); } else { m_preeditString.insert(pos, str); } } } void TextView::getSpotLocation(XPoint &point) { std::wstring tmp = m_text[m_caret.y]->substr(0, m_caret.x); int width = XwcTextEscapement(m_fontset, tmp.c_str(), tmp.size()); if (width > 0) point.x = width + 1; else point.x = 0; point.y = m_fontsetRect.height * m_caret.y - m_fontsetRect.y; } void TextView::onExpose() { draw(); } void TextView::onFocusIn() { if (m_ic == NULL) return; XSetICFocus(m_ic); } void TextView::onFocusOut() { if (m_ic == NULL) return; wchar_t *str = XwcResetIC(m_ic); m_preeditString.clear(); if (str != NULL) { insert(str); draw(); } XUnsetICFocus(m_ic); } void TextView::onKeyPress(XKeyPressedEvent *event) { char buf[256] = { '\0', }; wchar_t wbuf[256] = { L'\0', }; KeySym keysym = 0; Status status = XLookupNone; if (m_ic == NULL) { XLookupString(event, buf, sizeof(buf), &keysym, NULL); mbstowcs(wbuf, buf, strlen(buf)); status = XLookupChars; } else { XwcLookupString(m_ic, event, wbuf, NELEMENTS(wbuf), &keysym, &status); } if (status == XLookupChars || status == XLookupKeySym || status == XLookupBoth) { if (keysym == XK_Return) { onKeyReturn(); } else if (keysym == XK_Delete) { onKeyDelete(); } else if (keysym == XK_BackSpace) { onKeyBackspace(); } else if (keysym == XK_Escape) { onKeyEscape(); return; } else if (keysym == XK_Left) { moveCaret(-1, 0); } else if (keysym == XK_Right) { moveCaret(1, 0); } else if (keysym == XK_Up) { moveCaret(0, -1); } else if (keysym == XK_Down) { moveCaret(0, 1); } else if (keysym == XK_Home) { onKeyHome(); } else if (keysym == XK_End) { onKeyEnd(); } else { if ((status == XLookupChars || status == XLookupBoth) && ((event->state & ControlMask) != ControlMask) && ((event->state & Mod1Mask) != Mod1Mask)) insert(wbuf); } updateSpotLocation(); draw(); } } void TextView::onKeyReturn() { if (m_caret.x < (int)m_text[m_caret.y]->size()) { std::wstring last = m_text[m_caret.y]->substr(m_caret.x, m_text[m_caret.y]->size() - m_caret.x); m_text[m_caret.y]->erase(m_caret.x, last.size()); m_text.insert(m_text.begin() + m_caret.y + 1, new std::wstring(last)); } else { m_text.insert(m_text.begin() + m_caret.y + 1, new std::wstring(L"")); } // move the cursor m_caret.x = 0; m_caret.y++; } void TextView::onKeyDelete() { if (m_caret.x < (int)m_text[m_caret.y]->size()) { m_text[m_caret.y]->erase(m_caret.x, 1); } else { if (m_caret.y < (int)m_text.size() - 1) { if (m_text[m_caret.y + 1]->size() > 0) { m_text[m_caret.y]->append(*m_text[m_caret.y + 1]); } delete m_text[m_caret.y + 1]; m_text.erase(m_text.begin() + m_caret.y + 1); } } } void TextView::onKeyBackspace() { if (m_caret.x > 0) { m_caret.x--; m_text[m_caret.y]->erase(m_caret.x, 1); } else { if (m_caret.y > 0) { m_caret.x = m_text[m_caret.y - 1]->size(); m_caret.y--; if (m_text[m_caret.y + 1]->size() > 0) { m_text[m_caret.y]->append(*m_text[m_caret.y + 1]); } delete m_text[m_caret.y + 1]; m_text.erase(m_text.begin() + m_caret.y + 1); } } } void TextView::onKeyHome() { m_caret.x = 0; } void TextView::onKeyEnd() { m_caret.x = m_text[m_caret.y]->size(); } void TextView::onKeyEscape() { destroy(); } void TextView::onClientMessage(const XClientMessageEvent *event) { if(event->data.l[0] == (long)m_WMDeleteWindow){ destroy(); } } void TextView::IMInstantiateCallback(Display *display, XPointer client_data, XPointer data) { if (client_data == NULL) return; printf("XIM is available now\n"); TextView *textview = reinterpret_cast(client_data); textview->openIM(); } void TextView::IMDestroyCallback(XIM im, XPointer client_data, XPointer data) { printf("xim is destroyed\n"); if (client_data == NULL) return; TextView *textview = reinterpret_cast(client_data); textview->m_im = NULL; textview->m_ic = NULL; textview->registerInstantiateCallback(); } void TextView::preeditStartCallback(XIM xim, XPointer user_data, XPointer data) { printf("preedit start\n"); } void TextView::preeditDoneCallback(XIM xim, XPointer user_data, XPointer data) { printf("preedit done\n"); if (user_data == NULL) return; TextView *textview = reinterpret_cast(user_data); textview->setPreeditString(NULL, 0, 0); } void TextView::preeditDrawCallback(XIM xim, XPointer user_data, XPointer data) { if (user_data == NULL || data == NULL) return; TextView *textview = reinterpret_cast(user_data); XIMPreeditDrawCallbackStruct *draw_data = reinterpret_cast(data); textview->setPreeditCaret(draw_data->caret); if (draw_data->text == NULL) { textview->setPreeditString(NULL, draw_data->chg_first, draw_data->chg_length); } else { if (draw_data->text->encoding_is_wchar) { textview->setPreeditString(draw_data->text->string.wide_char, draw_data->chg_first, draw_data->chg_length); } else { wchar_t str[256] = { L'\0', }; mbstowcs(str, draw_data->text->string.multi_byte, sizeof(str)); textview->setPreeditString(str, draw_data->chg_first, draw_data->chg_length); } } textview->draw(); } void TextView::preeditCaretCallback(XIM xim, XPointer user_data, XPointer data) { if (user_data == NULL || data == NULL) return; TextView *textview = reinterpret_cast(user_data); XIMPreeditCaretCallbackStruct *caret_data = reinterpret_cast(data); switch (caret_data->direction) { case XIMForwardChar: textview->moveCaret(1, 0); break; case XIMBackwardChar: textview->moveCaret(-1, 0); break; case XIMDontChange: break; default: printf("preedit caret: %d\n", caret_data->direction); break; } textview->draw(); } void TextView::statusStartCallback(XIM xim, XPointer user_data, XPointer data) { printf("status start\n"); } void TextView::statusDoneCallback(XIM xim, XPointer user_data, XPointer data) { printf("status done\n"); } void TextView::statusDrawCallback(XIM xim, XPointer user_data, XPointer data) { printf("status draw\n"); } void TextView::stringConversionCallback(XIM xim, XPointer client_data, XPointer data) { short position; TextView *textview = reinterpret_cast(client_data); XIMStringConversionCallbackStruct* strconv; strconv = reinterpret_cast(data); position = (short)strconv->position; printf("position: %d\n", position); printf("direction: %d\n", strconv->direction); printf("operation: %d\n", strconv->operation); printf("factor: %d\n", strconv->factor); std::wstring* curline = textview->m_text[textview->m_caret.y]; ssize_t begin = textview->m_caret.x + position; size_t end = begin; if (strconv->direction == XIMBackwardChar) { begin -= strconv->factor; } else if (strconv->direction == XIMForwardChar) { end += strconv->factor; } else if (strconv->direction == XIMBackwardWord) { } else if (strconv->direction == XIMForwardWord) { } if (begin < 0) begin = 0; if ((size_t)begin > curline->length()) begin = curline->length(); if (end > curline->length()) end = curline->length(); if (strconv->operation == XIMStringConversionRetrieval) { std::wstring ret; if (end > (size_t)begin) ret.assign(*curline, begin, end - begin); if (!ret.empty()) { XIMStringConversionText* text; text = (XIMStringConversionText*)malloc(sizeof(*text)); if (text != NULL) { size_t size_in_bytes; text->length = ret.length(); text->feedback = NULL; text->encoding_is_wchar = True; size_in_bytes = sizeof(wchar_t) * (text->length + 1); text->string.wcs = (wchar_t*)malloc(size_in_bytes); if (text->string.wcs != NULL) { memcpy(text->string.wcs, ret.c_str(), size_in_bytes); strconv->text = text; } else { free(text); } } } } else if (strconv->operation == XIMStringConversionSubstitution) { if (end > (size_t)begin) curline->erase(begin, end - begin); textview->m_caret.x = begin; } } int main(int argc, char *argv[]) { Display *display = XOpenDisplay(""); if (display == NULL) { printf("Can't open display\n"); return 0; } char *locale = setlocale(LC_CTYPE, ""); if (locale == NULL) { printf("Can't set locale\n"); XCloseDisplay(display); return 0; } printf("locale: %s\n", locale); if (!XSupportsLocale()) { printf("X does not support locale\n"); XCloseDisplay(display); return 0; } char *modifiers = XSetLocaleModifiers(""); if (modifiers == NULL) { printf("Can't set locale modifiers\n"); XCloseDisplay(display); return 0; } printf("modifiers: %s\n", modifiers); int inputStyle = XIMPreeditCallbacks; const char *title = "XIM client - On the spot"; if (argc >= 2) { if (strcmp(argv[1], "-on") == 0) { inputStyle = XIMPreeditCallbacks | XIMStatusCallbacks; title = "XIM client - On the spot"; } else if (strcmp(argv[1], "-over") == 0) { inputStyle = XIMPreeditPosition; title = "XIM client - over the spot"; } else if (strcmp(argv[1], "-off") == 0) { inputStyle = XIMPreeditArea; title = "XIM client - off the spot"; } else if (strcmp(argv[1], "-root") == 0) { inputStyle = XIMPreeditNothing; title = "XIM client - root window"; } } TextView textview; textview.create(display, 0, inputStyle); textview.setTitle(title); XEvent event; for (;;) { XNextEvent(display, &event); if (XFilterEvent(&event, None)) continue; switch(event.type){ case FocusIn: textview.onFocusIn(); break; case FocusOut: textview.onFocusOut(); break; case Expose: textview.onExpose(); break; case KeyPress: textview.onKeyPress(&event.xkey); break; case ClientMessage: textview.onClientMessage(&event.xclient); break; default: break; } if (textview.isDestroyed()) { break; } } XCloseDisplay(display); return 0; } nabi-nabi-1.0.1/themes/000077500000000000000000000000001430012456200146135ustar00rootroot00000000000000nabi-nabi-1.0.1/themes/.cvsignore000066400000000000000000000000251430012456200166100ustar00rootroot00000000000000Makefile Makefile.in nabi-nabi-1.0.1/themes/Jini/000077500000000000000000000000001430012456200155045ustar00rootroot00000000000000nabi-nabi-1.0.1/themes/Jini/README000066400000000000000000000000661430012456200163660ustar00rootroot00000000000000Kitae Kim http://jini.kldp.net/ nabi-nabi-1.0.1/themes/Jini/english.png000066400000000000000000000557451430012456200176630ustar00rootroot00000000000000PNG  IHDRMOsBIT|dtEXtSoftwarewww.inkscape.org< IDATxwX\߻tD,UB9e;rcǎ\~Nq8ݎ878-w[rSⒸ%n5:ݽ?VHg+ϳ$8A̙dYFEEEŖh&C QEEE¢2ij%ɶA>O*KV f'4; Ťjb"W<;2Hjxj% D~ŏ vGʼnP= Ӣ3ߵ̙ssT*,.O,Ɗ|SPp.R#Zה6@L@hD,nePQj%wE# TaqAԬj%_1s^V(;͏ڼz8cT$/fLD6ؙHL0Yde򽛄RUX\ RXR{c_J:5!"*'0(3M{D|a {U^F^Fdh4nDF{Z4bx q xxzZtpm4VZY\)#,x \IE6:gL<>IVZ ’DI3hQ}kc&J KrVL`WaIJ^y^cѸ5hhc 4P"aN2? 1*baIJ({!6qss',2DcT8ݝ¹43UDőLӚ€L,!;ژq#2&h\6Nc|dGST_eTӋm QgGGXd ژx}PZp]SR0+ADF+2: C6)h4ͺ%JKUaq!.xa6nSkcl34 sEenVr˫IžL(,yrOVAS3#8Kш>_8ToY1ZR u\Gb g1ے1Yr 8H]:"O{*Ol2Co!",vۇLʘf]{Ӎ(-U.E"84xƨˌPn2pww'flN(UZ `.__9+ z*g0'YDXSW^<T²|ݥ_W%aN2;?V\1WhwTRZT̐GIX=UXTD0̐GIX ?"4R&%^6両j%<)T@d$nd&2ۡTgo[TvHEb"a2\*,*CcUX<*-Qqyf&ŸQD)mb,60EGDTRUX8VȎ *++؟5Tlqz Ed"˲ډ4###ݛiokB?2Q_u\$s`ϧ"KSv6GN(z,yrej͍63j/c-0tFTu`-|830"[!PCfQz$o܏k$:B=3ta`3aQ侤H,u5΅z@TX'!#GKiiB$>xw;\3Y F ٘gUƣc rBC3R޶ Z$@I۠/ÛjQ=AbC=glsY\oOײ\dfBu|AA~-rNT  l9ScgFGTXiSvHe *OV9($A"KSj9TDHXepa K֡}FﷃU΋2 g\z,pMRT_] E[ܨ!Ʀr!WߚaS]uF8?33C؀SUԞ:a=t 'z,m= } XY)*,mR+AH0 63wҹZIoaSajY);Z`הi93l;bcpY2F?bʒ$of~zn\s^h&,%E/mgΆzfuzyhWZwpKl_9.vTu1c5|Gު_b|iIP=E+Qn$K߿X>;;Q3Y:+U+yۡ (%7qw0,k'H+ZthuR7@ؽQ|l.,J%&$Y7nĤ4?_}u;\XhkМÁ{0]Ȗ4x>-ޙQͅ.J 4\c !^{5fzq aaqSz^SPh4Rw܃`,-<X|n\x,..,cyS?\ k4~c#9wwqZIpcJ\]X s:%I綷,qww'fQ u;4E0KXNT,wua)9b_Ų~ۜzg$Az,p++˩4fܼ֜^`rg!aQ<K}kLo7]1?b snw6Ԕaevuߠ`fI7^ۢ̐kaC+pMjRXpi扸):&<[!.O%AB4DHĭw|od`J5 ԷZ)X݄ o\466P}Ј8εXΊ՗Y|lOXl|#\Z r^4NI).;oWW "-%44Mf${ijjږ ar+,.P}(-7F͊kmq 9_?/n-FM9Ǣ̽Mwɟ3w!6yFŚPIdf=ČPrV `7Gh+ lnm+җl\^{r9fx,L;b%v M~2~ so}"B[s54j[ 84Btrb,zPE:(U+Y>^RŮ]Xj_ #&̙;ooor۝mީ S GŮcErG טh.&3̴E#84A8n`0(fdRW:"wnx$t6>*,p`&&Dhg2+򌍹۾ܖƓlye'Gq8RK=.+xJLo9^Xn{xzMz [}Ԇ3BR=mQ %^ZDNPיM3ODtL,mѪ{߶EnjV!a QfeP6'i1hnN"-^#I拴n>YDD+^WCNr)'#2OOOnVd걌CVo%K3O굗0ͺX]ۻF534qL"C"LWjHH Ls۝إ|)L7 Ta8DXJV6iKl\<^qUlkO"aV(&U+Y޸F.[zٖ%7t'ac3%c+ ԓNC[8q`&{xxbmf[Cuu'hin77'z^~1{z;s7C:hgT!Fev|+g?f)ĢPq֖ZZii2`7n6}^c]9|6]R4 q.Dir5dX%,yrgV$N/,’b4smm 'hii/m|֢2ʧhKœdUX(hS(snٱRM4dyyxx456DKK-M &{ ³Os& j-˔aܜm1mN$-MtuFgG-JgG'[L$*I\{ κ/`x7,U+BGLT쏭Eg-H3ۇDgQ@;dIAҀqB#IYbÅGq33C)n;b&Er--T/V\RKIAN 7ɠLU?&>ww`r"',N ' 0dd Nܬ[@~nvFZ1dUXm:wMH6h {Œ0CBpp83B `֬g~ߡDh$|Y.[$%IdQ8` ͺy$)-Λl3 xzM#8$0 #88Phbbڍ;~uȖ{c] ,QDywGrɪmQ>M=*,+W|I[ֲؗhS*[m`yJNJSEqt0gGZNI]iX˭߃u#x$Iw_^8hX|Ъ 8v(7+S?ىPZK\L.:34Vo, L2gR\c!5}q߼.+)`Eb'0V <ꓜ:Y.*&Eki\{ÝV#|.njΝOV*,N>ƚ;oq<_q s/nEbM%^LZLc>l-Ic} u)cFfhNVrly2)F˔{yljX49KYu_ m ##قpMQ"tFc2e.Ӿs.M7m|/ki8+۞EQ M-t5380`NJS HrXCB[mrݟñ%6D528\X`r2C(^ ,X&]3Z!&S"($\t*,̤dݷ Ł!1$%_?nnn\sf $ˋxWm`Ĩ$Yr ٠d4+~1.$߷_b6j|%j%/Xl,,-Zsҫlrn=}Mw.fx,zT c9~XyƝ.f_\!t#l}ww'}};t:ز`9̌͜3lIhX$uB͔h$ rPnDj㈊'"2(4jfh`3aɫZRZHI(|aWFikm>b5izoã&""t* ?p=]"Veuw:APgB YI^`,<0L77 in8IsIuUPa $b.FqaۡB|HKőlShkmZgv(:U+ZlUcD(?qBs/:L!29ZtI¬AhEh\M ","0-aᑄEh5kA6VI9;l媰L.|h9.,,np,p^70"Djc "~f"3g:4 3%4U+b)';#IR$'eYnl{M%^KJ]f!eK f{OX$I1dޕe7Iso w}{(?ށqCBGyqsSVvhZߎ7]x:a`tpwi I6I?~l8zFc2˲<9iax,TW%h(2#z~N?i~?>>懏/#1qmqF4 ?0z^M7Ļ˕W^0Fw׀;I&˲q$)) IDATyI>We מ([#,,M 驸6bQ xIHXAL" `:Ӄ1#.qr-?ύpGa3sv5]ozìIT !˲ $I0N~XUsARRwר`א$IcLao68CXȽe@C)bg&*tFrJ77m,QhbE\\*ӟD?[? ~hhkO>kݖ'}QQT!c*$ޒeYwBI|VKCCCxYz 122Lnn?vFWi^է_Ht,'!dZ#7`Zrog Et,QqhHHٶ-S9Ѡ֭[?_|˖- ۷ogͶIQ%Y%I*;}z [|m^fϞ=݋Q$sb/a9,Y^[V\/c'{>#6n1$'/ $n.``_ӧO'dѢE̙3O([n{ehhF 篵t b?i<߹첯"IWttwwqB0׶w^1c"ޒeX%,Y{mP/:ow}:777HNN&))$/^4Çٹs'P__?@5fLJ/\u5H&dYf֬YsFX222y뭷عs'&*={w%,cL)կnsT0^{-̾oc#[nU~Qw^ʇD`SGww->| r-n:_E.ZgsT 6mb.u]Ug?A  lNzxx7t ~^Ovv6}}}Z o dddpqBCCh$?Aff&6)[X cKXn߀CXd4NÜ4}}}lܸu]rr2%%ƬoSSwq~Y2S#͛]9~tqJKKIMM%66Vq` [@<<<ޝ#wu!$ pfK===`˖- ]Emm-~)~;篼'SeAVUWj4|~[xx(娯'''xRRR@ ́D|||򢮮h0^eMs.$'Dp踩hHeb(++cǎq1)--=o HII'P,sssc޼y 7@HH?|v|45]UO#飸ÇGzzɬةS줮,aQVbԋ!w˲$^NPq_|%IRիW72}'~>sv8o{gGx{+3 ;;a-[Gt: ֯_O?TVVRYYI[ 2ǎNl~flZo˲B{TޒW/jdxF(bJTƝwi(ئO=rwr|PSPP@CCK.%,,&˲eˈ36r`,^lyFhN8 rsPSSCcѡoؽ;7|?}}VCw%I&˲3iPE̞0y}vǀ0'a[jv-<Ѓ+=z('--ZNǡCk1rc餤_Fңg}<7|;XsIv]2$%%a<<୷!;;Ϥ=qK U+mYx'6]eٳiix>sbb":׿5|b}{Ы޾Nvv6,YDB{{;{!22K*62ojjW_]cIONNY[UC?!44Dk⭷7ߡBⳲ,oOSX~K"Q/۾#WU&R.Ҡnnn}ٸR?*v,,4 K.e4a233g_(088HNN===OCC6mdӦK5;|:eJ,˰|xNq!Ѹqjww{T&Ǐs-PZZJxx8WWsnURR#<»kuu#2Qappq3SR\\LII +W$&F?mmmjINNF$ deeq =""4VXLP Sj9unmmzN2MII'`p3Y9v'N %%E` //*V^MDX_j=JRR ?r# 2}z AAE7a 6aixjRˏ9UޞnjN'4"ˆ -G̙Oo!))UVVR\\Lbb"W]uĉpB^ƍ{˛pKMMM555um:522±c崶A ɲtv̟̿eY+&\u`8?fw{'7tݙM__?y2?o>߸?4b0inCgO{\Yin;iyTUm?-(6lyK.hX} oEjjj8tg SPP ˖-SQ~dajkk'-X09qqƂ<ѣihhRॗ!cѱ CXuTUPWs! zCs/iӦc+6|Ǵ1HKK#2RlLkǖQ]]͢E[&R__OFFX_QTTDyyO###tuuq瞻7~KС<==EgJi1!O gZ41AݾTTT`6 rXnV $$$qFkٷo###\veg͟?X. yʂ'6X9|8!EQ`7OE=/YM6p:aq5Z1ON% qrS1b ߸AqX)--墋.ꫯ`0ɓ'Yr%ZƣW"ԯyxx,YzOQ[[KAA>/y)55u9R-/z:˽|_i*,Vi9o2*$p ~nVPPP@\\W^ypYEE̟?_MQXXHww7K,1zrQ/*// 2 `**]0/exx]2Rrm۫ر[׀;eWڮ’W/j6@(j248HݩJjήJ\ 6=0bh4~!Nݕ;ߏDNNaaa\~SZZZ$22R BT^^.)n:222j|ߘ^GK2zz,PGK0nr*ӏ1 xe $i-;K_g*WG)//رc$&&2wyǏSPP@JJ PRRܹsLXt NǏlȲe4 c>/~ /D˲<[B.,Zi/Vp]8_<$IZQP.^k֬GFTyY*'99٬3^y4xxXetVQ’K7PGy^M$I0 Ukl8f0v.MMM… XH~Xz5bCF{ 4%--$qc)~&OϘȺu >: yg8rDq8wɲ|ؒ-QM?>cyrZ$I)"ڻqx'$nFNN ɡUVUR__ϑ#GHLL744w^Z-˗/W|2wR|FbѢd/w;"# bEv?R;3xe"΄$Is1Vހ2kV<$-0Vc.YvpWz06/))ѣ|rk{zz%\"}ƍ3D"!!3XnY  Jss [kǡCe.'X9xzzk_YG$'' 2bi >@ee%Ǐ'%%) sajjjX~WUWWG~~b|ۋUҘ5xZe&p޳g?fW1聿e[G0aQC@ǧ_❑͍?p7|p ʘ={6]t϶gDGG+VѣdggpB,Xx?{'&Ʊreڙ]X83ϼ`iWcVZ*,N$I~❑ƿopw7/{IJJJ9sbko\|}}Yp$fCPPVRܒ._a͚tN_k ++Sy&t')Te$9 i~!!^>'s !%%֔SXXH__iiiBz(b =sROrǀsg|3BNN3lCB8>,xQe$cS%^>yyypB2*--%--ͬ8h.\(,F,s XdP?c)~J?kE33,gjI|xH)]#Ii&s}\9Vrss dfel HLc,3{lٳIX|ݲ,S^^Nqq1##ʉǔ9/(5 J網oEFF/e%;8I<_OS|}Ŷ = fQƖ/[̬6pi^OFF/fѢE&ѡ\ 5}z-#<ܸ&#Yy42 GK7I܁[{o~~&''FCzzPOs%33777KG dYHЪxhjrJ'gg[ȑ#TTT(W$.L"-WerjϿ޽f}M9$K.vVTa׀飳x7&0м8dggHOOw.֔ziii1m>',\ssscŊlذF Ogݺe22-<|8z^8s{N"b$I8Va暫 hc 77,Yb,`f×n3Z>c N__B2.LB`09RBss֧^xݻ ?jɲӒIn/?Fu0ttt&Ԓq<,-c`8??VkQ-L{{;'NP\ijj;Cq}XX0-c V99yAV\ܹsͪiiookz/Eɣ˓UHLB$aQ嗷'_?F۲,hŮ$}l!!߾0N״ֲc;&dˌ3[a200ٿ?}}}g`ݺu]v|dee7ߟ}kٷo;w vuu$ܭ+6odY$fUlQׁȲlQ ƕPFHQo_rku:>~+jjjعsݝ+d233Rz5}t .\xccL[p!W_}Ug[Z &'_/SfΌ*W&|ʲ%"I2=`ӦMx׿:3J/!!HD " Ctb̃BI5tziQ].AD Jmġ@RP  !39!Mg= 9{sZyg{_rRصk'O nDFF2|p*++ٶmee(//m۶98Yݜ-**"''\,Npp+fΌeĈa?~\K ljsrMϹ)z0ZΨQׯ/11W.UU.^}u٦A !\|Khժ;wo߾ql߾l^^%%Od œ9Biy=` ѻnO>7^B0KJՉ7j󶞐R{Um{gk hN׮ҥR)++#%% C=.,\8}pJJJ-Jr)▓a+{ 0SʦW_K="^z1p@[WyvGÉ':9Tvp\?LbFxxxRjm&EN੧FG~.VviӇ|ǖ?ϞMV'h(ag{vyL2Js̘9?  ]tPx<2uglxxˎ].xxo?fVL:K -팥y5lK)m8(aguu]/;uifϞtYů=bSN4;!Rrssxwhݺ5dggS]m.gCvsxdffgᣏq7/'`u⍌zFd^k[n/m9/V>TΜܛ}Lr LѪUK}1~L<*?c%33~ %%rMsrrȰsza rrIMM5%*AADFNH4+*a7>}2ݻZ)%|9-#*$)p%*P+@8\v]TePfOdI׹DDD4qtUUedddc0{3cǯԺHXX(sNcAWĐZ#.n [L݄?JX!~Wu]w" i'phEPPzrp:+9s&{X`wuyFVV̩SMG1Ù6m2ZD4SlP l߾w6K(^R:QQ%, Yt0DDDPN?=zsrXDFF^q㡪Izz:.̘͐1uN'KijcoS=nwKہ,8xy5|af8Ra %, DMdj6>'MTQrf?~4 y?\+94*233)/78p8=:S'l|__]?U̘1'xÁZ~~ê7aժM\=irQn4 Bɼҽ{wy_=qn%{eBйsgRJ\jrss-ysOoϟMn\ر^:t0sN#,L炂B~ƒRV\c7t?O!JX!D@]>!Æ ;ogtcG.20@v0gT~ohFBB{ .M?_f?턃%RJ߉ (ai`u] !&&p#vy{Y9z{@6m oV]OG3qi+>'O{)^m;v(0QJydy40BYq uҺukbbb {^Cx%޽K=nS_~͛Nx5J38N:q:,R:²e+Z{^R+U\JX!Dkpq;Ξ(^{m9۶@v 99tO@DDgϟɀ}!L-%%aut:_3W)LVC U@Ѹ`bbb ?=v 6vk׾Ǻu@L7PPVV.˽x}M5**!6ײeKƌ%0whzLmN\JۥÆ a֬Xڴ mM8}'==Jj֭֯SZzcB UBq nAAAxocIw_=ngYe->,%94*%%%SG֤#Lw\E]@OAAA<$ Z̬ٓ9u*E^250S5{%nRRN5Zvټy GvL#L:QQ(a!_}mYȬY)**bFv83ghj*;ƆizY.]g{o|؍-V'*%,׈c/0fBCC}kFl8BCCX`1%%̝;AjYY9ĉMa.%++8aC١hX\Cj?gѴi8 c.4k气UlJ' Iee徏 κu\VnDC 5r+0hl5jm۶5Omn3*%77eVrh@7au\z(aBgԙ|͛3rH&Q$*j=to=NYYǎ%;U/b͚uQ ,Ri繊넚$M(cĈt=СvEh<{6z |8F7a2gG.Pr!ޱcGw_?F|V8JHHH*wݶV)~VMYYթN`1LJX3`f͚EN ۧOOƎiQN-ɽ"Z={wap݄)dŵG uH*`X?N.7wƄ ~?4*e߾Xb5Ŗ\RZ.jQ\?(aBs8 6H{FDtbʔ A]UUMRRrQQQ:୷ֲk?L?noPgl:GqG}nݺ޳]L:biRJi.c,[Vz?/*F%E2df@MhhӦE9PtVnHugLOFK冭~QHB,hb{ lw⦛5%&%$.n͹kr`2ajԿ]AR.B88qܹMӸ^+N<{. 600N2S4j4"5@㯾 )%={ZXԩ-Y[U SG K#CJ )ͧS_iի1ey<6o[0e0}nuq"\[#.>+޾4Mw^W:kBgbڪ݄rf񢄥"X#.>+vލi[;7; P4>x6lk4SJՉƏFrb4!xC4S!.nII'Vt&˙FS!tG5K{E4=`)%k7PUe J礔:QѴPRB;}i ’ϲe+9r䘝U&L PdRC(*iwnDzs׬Y .G7aZeMUyB =gϞd image/svg+xml nabi-nabi-1.0.1/themes/Jini/hangul.png000066400000000000000000000613571430012456200175040ustar00rootroot00000000000000PNG  IHDRMOsBIT|dtEXtSoftwarewww.inkscape.org< IDATxwx[ه#Y{$<;& waClRh(@hˆ UFI q8δ)-kKCqHm%Yv}]2sy Ie|j PPP~(¢saQPP9(((EX V lC`0|iD fA0M(¢otZ)@&1nqLSd$%E'tZIҏ|#JG!P<#ߵ&s",ÌcD'8V4{?EXå N+]4>}<(89",O(2 Q%RE#'"(2 QNN+EY㇢q%#JDFEcYZ[8tZIR8Q0~0X6>#df'#kcI=mBoEX'R={~5$idd#s82ǻ#kiل5>G1o|aBp0列g/#ql FT*5GyD42ƌ;ꁤFگԦKR%22r`Mo0FTjfA>gF35-?Yi",ÌV2 GR'݂1R7괒7('  N+!eӎJfĨEC1M8<=!WdY40(1 ¢JIx2}`GaĨtF>A4#$$(K2[?KI?:4XBx!f(20rT:j̍X-,_@2ф 5-8u$1bTڰOh3bT #Y'0*=Դ?Ffԑ'&@63(QT;E*28%4,ܽMIps66sH=!WDX&鴒ZoI*,zܩJxn/$$^4O?q0`<Ͽ(OG 5@zlKڌ>S'C XX$G]u:m(?:Џ(a a>I9& zT@)'Áqhp8잖*aE")e ncTZ& I)#$$>Xi",Ä nbf-8cؑoC8'8V dk lR9#s+rKԸcz;n_. U徱DaXɐǓxXaQ˚!!'āUEA1c'R K)2 SXم&ǵ5(<FZfREX"#)96 ihۢ_,,l x!OE * 4(¢0=Pea.% Þqpt<71 0܉&5-Cd",Ce+P[(0DǢ(dxAZcYijQ /j#!vHG(ɁτEISAr>9!bHJIYF )PN+im(Ir (q(%2]VeQDX?>BKSQ8Pe#*, iSvHA',iC!ad-*Aq(@Bpiб}-P?L& _5Օ4a2pQDGǠMQF BdOȥh2?c>Qolٲ}{iomf\.b"PNfx/e1Q믹@ o|뱜i]]]477LEE9Jllb6c1md $2ClX?"4ォ,t%4>dFYIOO _#,SZ0Ԅ 99y-\g[r4ِTDFőBbb2Y㘿`999Aq\ʊØLFe{ $!I*BBB '::xƏȒN'3,#Z̞?V⧗c$oZ+}GjנbXx٧ٸ[f"Dlذ9UFLbR #R̙3n: >ܷL&^ oPAT0/=:ن.Ș;?aWǁ"yBa0VX ך(6jWPp8xztJubh "DFdT II)$$;y s'++ iL&z~vmC$bC\L&LqײwE.Fo! ~[a9un$!)y v;z}m+M8c?12uTsO&7d9H1mh^|>KfOO#a',y:y:wqᠩ,f() &R?B"fNdd)x2ܫCBBHMM6οW\HmGD%0(ʻdhHe pU+yZETDhcw83B48iAX\0x<-R%xl7y?ԺEe0Pqŗ5^ e;4D'JoeV2cZKpQWW_;*!D58t貆Ldd$s8|D?UaJi Nav^ijdlCNl K4ZpJp*>222Ț HJeamSaBˆ'1%{x.\LNn.!!n`"xR mKN:Zi.z*++9.c'FcVs.ȈE@NczbנM.+$<[NdT4iT,`OapxPU~8N*++q\DGG3bNZZZhhhPC]]- X,f,fȨS#.i!,4p *NŁ@GNM2O_攩3Hjjl*dFXVwa4%p[);TnFH!ahBQTHȟnXeAƅap݉Tӎ FM&F}HJ Cܨ~ޱXT!DHBBc3g|rss9p`?!*K)ۻkr1]t%o}no0=>kB99X6@|9Eu#pf&Ob̞3^1Ӧλrۭ!jQ2hmmꯗt(5C{,\pp8r0X7& ͅ*$xOHbfϙǤI9NRAn^K/Kxq2J*s _a'xlFw?7DiGwM. $&{s sg> aᒥ[<,RB?::7|oO\& KFTGD)̙3qt8_>}ON&txRRinY>EX~ 贒i_K9 yذ~ rUml;ˑLșƽ@^^OF,'K㍰(&{Zt9FM77z^hr: EIͤSO?|SO?1Fd%;<Oo 0"CU9&33G{;xW9tp/6s Q\ڻdfOe_A _( PKv<$::zH fhx0Pa񈡪cǴȲ̆ (H5juNlC]#~;oJlIW{]I&4,Hc%*: r`!ƍ;.oDV d?Q~e$ p"8{y 0\N409/n -`ӦM+4$"q &Z:rR];>xBBI1l.Rt\ %W,XI&L<{:~u+ P!Q!l5Ȳp[,V;> Ov-Ic=n$I0_}e,LZfa3Pa<_1WR~#2!QZ}Z#wyN) _EbT*F(\ c@¢7mIdm Kee%֮$2ӜNģ=ZeqeN5WO"80,DWq8LɛǸqdo@lW^~! Y&,챔RU^hUs U#/OGL瑭$Qyv=Vy&KcJ)E;rb"<)FgM"9999Sp8<9m|3^ )^K8%Hl6tvYX$x{z˯c`g2ƌ#$D8Y YV6N9/4n:ab+kJF!c8劰fL]Bժ#Nk~\B2QQQ?HDHq(mM455"1/E-O Bs{~l01Q,>ƍl^+ٷAD<P[;sTT-? pcء<JEA_K"3C >aj+55O9ER2Bl ˑIt"kMXrZx"44^/=ԋ\V|ߤ?*,m-M]>zJsbۑ (@ %) TX Cq8BZ~466"bEO9z\Xi;%gkOMM)7ɛ劰'ǒQjh oغe1Qb#l8Q1 OT%8=hS$ukk)?\F#v\OEo;`uQ^:1w2q~;8Jp #dŒ$QSu Bk;:-q~; {,@ U97!}lxDG.VGhb-ʜE=,A4sheR^EfQGZ-9*p>(qA'u24~xFUT.D(?0Uhig6 .!Dm+ :",6=3[h@SO>g|GeE[7~Kx`<3$5('CC \uOiذk 8v~ QabIqV&he봒hDI V(Ȅe'7qnErq/na*Ýwg *ګ[ /lUTt4CQnsMQ_Gx eq~BDD+5CC_ K= tL\D IDATnn8$l [7_FbjxCݍ"qXn~n`('CC ;qH0z,aaacC&{gyʏ/qO~У"2U4 V˲/\IJLX4 *i:%X6 \ Y lq .i9<܋W_} S[5=W%lV/hpHQxMƍ 6\vlYZ7• M7,rPn$I'h$*"}\yٹOu =GEm2^muZiV v ++˯.w Qfc姯sEgP]Q+oFnӟ(S’Jb@TII4jm7>ci6@Oba3AZ_ktVݏ؋4Q%0&{p3ӧuje…?K._Ws+{g.ycY6 <t$nrsW{؀ۓPeZ`0n OlȲLSS;魢6F#.#6 ':& FIrr2#2^z)|I駹;n\tKv,dK4hq{2ɲԹ ˓"I)))0u6$I7ޠ;3.eXVJ_>_$N6 _ Id>e9 L6ٷ' |'D0Vpӟ$䮟_N:QAx6~/>OXwS vkܞeYn,C!,@%[000~S5h4̛7s9e˖qꩧɺ)_dN,2]]YE.$)5`@sgGJ%''5k OV`G~CXT_PӍ:@;:5kZ>s93 ˗/s@R՜vi>˟ӗ[8nu^}u֮].6q?KX6sD\|nlܸ+Wk׮~KѰzj-Z4 ^yn6VkWIߏt# '::gy>I|"##lڴzuaDޗe*X%,\&̯~6(ʕ+Yr%| mmm^]cqw okkc۶mlݺ۷}>eArh5<\pEHR dY.\xTX[}[L&I}?*pQrY!Znn֭[z3uuGm61/"ׯrŸE@m7r$ QO GG? _f6o̤IuFaɒ%,Yʕ+Y~=1W$Iɲݻ  86k}6(FVZʕ+YjUō+V[o ^z%^{5zvB`G-z?F IAA]]]̟?r!&/RI8p 6:З`>>KX~ #vĨtVbNcXbOoK˲իy5 )2bSͧ,SRT_^!j\s!!S%8@II :L].v"??ϭ_\\26mԣ;',RA 5h4)UFO4 p-x ^x^z"<<'|zʲ^2[u6FRq=wqM7x34 l߾1cpRnX(((`ӦMBH{;D%\BXX555l޼Yh #/I-,^UȲzC飳dB)+I/EEE]=U*'Nd̙̚5+doWai@m'Y*cJh:ö6nJtt4˖-6jjjضmf_ff3QQQ,]3@42`$I?neYh:",ÇOe~asuױdfϞc-S\֯p{(|rmpw$l6SPPfc޼y}98q\,Y1cƐJYYeee47{_Wk۷QF_ć~JCOH{$I,=_Eo:Ԋ`L9^̙##$tRn.BqyDP| (7t=wukN'EEE2k,Fn}}=֭cٌ=pogQZZJYYxVPDc5kyo5cdcI^e3SAs=, [o%f\6O5?O{+C8p{eʔ)L>ϵ-[E]gx&OLkk+6[/LRa2uQR9]VY4.= Qb~v 7J@_-,B9Cew}K.ھQsss~V/l½At#KyKZo0(,,<Ԋzf͚Evv~֭[YfM(Y հcGQ“="##KKhll⣏>?@ߧ=wAg@^nY7{!~;F|A>ǦSN9YfqUWqiy}۷sW_ /<~D)!---Ì3< miiaڵ5YfyowqwU?6;RR^SYY9^拲,OSXݥ#i@i4\eÇcZ$CxlYgɣNmۆJb֬Yl66l؀dbɒ%XYYUUUX,o.TM\\ wYw^>/WRYYI /Ul)ۼ𦸸x?x}L/^O<ΨQ'\lfX,fΜ)bϞ=3o<22innFףjE܍KJJضmz̜9sHL%SYYMee?479@Ro tE,آ04ٿ?s|e<ddvz=̜9-YX~=t:0fBj5yyym6 j4 7p5yy:'Iq#zz|.#r[ ^4T+rr7TS]QJuy)U** [)xN7g},fb1{lטf1?It.={IH5!!>3<>^תT*V GyeNÇ+9*Й}4 9_lV+5Ra*nsV:-K>=ɓsyg/8YetxTWRoF{/09݂샖#&痓3,2øq 0dǎz\vP!Z[[),,dĈuYk`ժU^TUUPUUs}rv;DSSg :U^o¢7ȲN+1"%ij;*LjHuE)m-ާۏFƌ /<ԩy `@דy(7n$==K/TŽ;p:̟?_h_|{a;.g7R\O= KU>A!ᠮ[<ʰ|껠k/gY JSS$$$pYg 5_F9#$,SRR`@ӑ$|anժUvs'ȅRRRtTԉY,Vv܃d aBɾ fʲ+UQ[]8\Pot9_Μ9v  eɒ%B`ٺu+,\D 555޽ &py%|TUݣSrߏŕe(*+Xfe}FփFXkq8J.hom9i+4.n.Ʈ~7>JRR"= -Atdb۶m8f͚%4())a̙,X@YҥK[[[ꫯlXt:q:)VXX\}G7]]& 2Ed2giէ\NjЦ=Yi9iybi~<"( >/38bZ}̜9Sx+RUUŖ-[?~<]vP0fQTTbaBseYf^w~glFuuu[SOdhwBb y)kko*>4",n6bq4Q^JMalV N4 JTTO?8s^{1m OΨQbilذX." ***6mǖ  9r$s#g׮]:th'N{{;=ϴ [nફ~tKio`˖턆z ^|JJ }#gq_P s˖c:CUGKvow} (%C-(jFx/(c9t%%%L8 /PŎ;8|0C=@OFoNtt4~Pfƶmۨ`GvEzNzdTH6FvS[}#$JKϴ=wߝGwhWd~~ hm [uZX-j*˨*?>ڪrѺa,C:>@AQTw߽\Sg1e˖ OyhlldÆ 5J8 Bt!NqԐV/t>uKw5uO^ʮ]TWͷn-^_Wf#"X `w]>qi3#`Du[~~;""{vwR3L̜9c{c)..3f0o}:#G{رc˄fLO8p99={k|W;}zB]%˲"Jf@Y}Y3|`X:}zo2h$I[P.N=u*˗?رC~IIISONw"ƍZ,X8!\ݽNx:6eGq理 ᄄ8/͈IGSXXDssP]}}>w{\% ,o%P.p}zlT< IdƗ ڻrrrXY&NVl߾Xt:WU۷o`00|X wfܸqZ֭[VeΜ9bYk*>J%1mZ.yyLLX56ס6ࡁ$@p96xEr? I&Δ رټsrTn="<]x4F7ݳzBBB?p+>e„ dgNuttbfk׮>S=4l֬S9GÇ+()9p|f { w94 K='G@s? I8VXŧ w---t:aOlB[[ ,J7)))yB[@CX`PbÇٵkǣݴT-EL#lYP!QinnIak{`p,؟c ,v؝q fG0!IH/`aLL >$g+Aq8ڵ:M&#EQQeee̞= l6tR6mDNNyyyc?P s1iN{ZNW^xxp0N|DR=_ *#$) wcBDDDOpy Ҁ NgN2e 999uGn ڏ5kE<ވ…3z$&k7]kk++VĶmB@1n/e{.$Ay H;ʴ挚P3MI04Cf?MK +MRK˲|5SW83]fʩ)fD@A r X`Z >k?{K7s}597$G333(5(M+wҥKXt)+;SRRB||<;wfذah\&јRRR0`&8ݻw#`ԨQn[JɩSHIIjuv#FgIM=+\/4\Q4nC  _l63bU2&0od2pHS)**QSUe~TNI)w n !o{Ot]S\]] ʒzKAI '$$͛7vnϟvuueܸ*:9 p|s=}<ߚW B vJf4`HJJaÆѣf97OvRuS^^Naaמsdr1!>HUYƍ`ǎ9␿]Op[J&{ѣGb96%%lÉsJ'OA*++ԕ9}47oi(((,a9 b[媨D|}}Uʑ#^st |xNJbK 4|ͬ\ChZPv;w$==sc4.3ffLN:M7ݤKjjjuU,bKEȑx;ZmS6]pVWW}tH@Jzp{CS"g`>`f{Pqwɱc?|w8q"&LPp8NXXݻk$''E^뮻46֭[U%g),,tbР}3f:tPϞ%5׳ģ^έ7K|<#OcEAA K:t(C Q yyylݺL, GfРAjZJKKCZZ۵v.ݎbmEr2lXEo^K(J) n/B^ەe˖pl6IUkqaǎ8qBճ2{i&1\OqYvܩZPɔ)S믷iDr!,-'Lԩ8v$ESRr[iħSRJ]!,-D}a=88￟\jkϫW} Z! AfsJ(/cǎݛnFmۦ:9[\\LEI䩧'00< |W_}6X,_F򶅐RZ:|fͯ9מO0Bns>腝H^=yɹxz(--gʔYӧȭnAAXVNbfV}+֐)/ERJu _90By>o~sѩKPu,Y2ozd2ѫW/Z!J:wLee%թգG?G@nnLM=!&vK>3IFKi 5cK #;wfUv҅%OͿP% ξ؛{Gfs\ѱcԽxzz2{̟>>>X,ck{}#&f 'OvVb7A .=zh 7[EEYYY\i)+WCEbܣ9EMM5ddd?BC]OHT+*|z-7YY޽5K_#*<)彆رBp σ9S,^2|J:u"$$Վkkk1Us=Y1ؾV\Gev.]y}1zYCJ*؆b¤/2 ai%>9sq>>,\4GSӟV8='$$EV+K ٧Us-榛.WK/ƩS#`ƌ{Yp>;vp7 m;xnhDr@1B<攐Lq^(=Haa/'ބ68nS[kXyG2&wNW}kSAn෿}AnGJKXz ك24JUJԏL@y5y /r!ҘG;jlV7qd21},GNg_zS:vO<}Md2a9v섣ԤnF0wZ%\b4"BQ9eL8U<ӧO뺰lN{Y[q"M7<{s?q9{tqnfvJSرYt*`XHHH[,w) IZVR]ɯA0BtN׺ZשS'f͚h<ƛl5~~~BZZ,[$ܢRJΜugR, !~krF.吞`}rB<ݺN:գ_ɦM7CT}j2lZm/z+ߢ@sV6rB|LwC̊=Gزe11kuOt'Gӵjp8dffOZ)\WWLJ~—_nݲG۠!,W!u>T;1^ۅ'ǡC_5ut=0mSR^^ARRphޥggsz#pv=j+;n?|n :_ӉKsT/[[5Ufi/ZfB So<\a݀pwk9sۑ~,^<2{eJK/F6L̘q/?>WuլVJJΑ|܆ӧϰbśdff(n<!twח3ffG}wβeK/:O---6%_~DŽeZ ZCX~!ꏡnuLJ3frsϽLEE%O? W5늼yDC.%//58~"bkfAb/H}V`L>]\g23g}äiVjj,2>rM>VsZ9UZ [Y~ n?ݺus{ݦq422]JQQ1V=ߎb¤aUeVMbڴiNM.eʔ;3fd *]EؤPYyua>]nC1a:'׍u"wkM&'OOף7Ϝ93vR\\b?v,p8tR:̚5(/< EJ!JwL&&M"445CBzwyummǏ.ij~}vܭ'<ޠɱ)mCXrˁvd2q]wѿ Ƃ/K)+MOϔRJ]vqɬZ%%紆ځ4LT;36P…%))buݐK-6}_oKmpbKA;8pk2lX\)Ĭ!?_9w=xx0aj]A \.1nֱc7kƂݮ=GjZOؼy(&L'i aiCH)W֋Z 4޵kRJvkS2y3gtUտ ,3L?1(Ni.~aaaM1WU$r]IDAT~ؙnO?O?c”b@!,m)p0tPX. })gΜeŊ5dd說 mCX(Rʏ_ˊ{p8|n0@[O0=)@!,m)B+pp7v~~11k8~GńI!,m)V!TG5Kp0|xcG̋sRJf_.xFJ CXRBBqss!rKO~VZKRR6L vr.]Uqqq8FͮXvwDuu[QLynQyB@එpذa <s}(&Lz /C(&.7&L0"4k#Z~ƦU2eHK%S(ַbcBCڌˤ0%C{K;~,pJG+0-;_ B`hMCKmرJR#QL]QDbc+D1x 47z| NIENDB`nabi-nabi-1.0.1/themes/Jini/hangul.svg000066400000000000000000003106651430012456200175160ustar00rootroot00000000000000 image/svg+xml nabi-nabi-1.0.1/themes/Jini/none.png000066400000000000000000001031461430012456200171560ustar00rootroot00000000000000PNG  IHDRMOsBIT|dtEXtSoftwarewww.inkscape.org< IDATxw|[s5,ٲvBh̄@B@i@ 4ePVe2&UF Id˖%[xeGc'x=9#Kgbpqqyťq KN5,...kX\\\:װt:aqqqt\xx (F<M+-37!"_LNßqx.=װ2DD2גoЁ(\K/c@hF``ʲ~lP.=װ";V=e@z^#r驸K^BEfeD\^bmn:0;c%x nQIJO_orѸ3^5yt1lK/t-7*C q3(+ӲjR+ ҹ#tɸ"YDE5V~t|T.װXdP5eV伝emrbۚ-yp\osjug,.J@[㢄/^u\zaչq ЪA>0VDd֞n&0\҃B +tD+j8tyz?ҏ˃p,,>xEݼb˘HIl6xkXz4P$*϶A4| E8aid ƈ%#ϰ]za!TXSWX="ѽi>Pm憎]VS囄u)װ*P p{鳛_7*@jH.ؗh `ť \3ȌtKqpʀƐ *_V.(-iWװkX9Vh$[[^ֳ LF흖pfhi3K!q?NQ +T^mGWR;[ Fu' Z\RSa~dSxKQQǓ `@x bK!p Kd? + hZ^r) װtS*]>HEfK 6=sD\KrKz ǫ"5˗/u/NLDYۥyڿmɱۀ+jLJ?y5GTbImer$Pny]nI{6Sܴ(Ay޻E[y/GE$/7`z Ms\\= hoK.]Zwÿ\`ߤ꧖ 3Kɦy}VhxFAd¤vKىDND%/alR@5L4 ޽dؖ!Гf^[w K^\=P@Nw"A6G%?ʈe߯7~װ5,ݓ^aFeXA.+u-]~ "ƏckcqɋkX' cwUX> _^=Ʋ/6m|yӤ&K^ֻa yǿ[?,O y;az',]w4hb>@`W+' <p/zua+h4 @}u)]r>Srm| y^jQ])i+JP IN&׬O/;m{ڎNgpYj;X0%CWV7;vtkT\ a}Xa3Z M&v/ZW#0}:M)Q]2Jb[{R -I~ "ŹoA8˙nʤ U> 6 Y/%L3ȅ*4~4,:J8*Z*6JRpEGJhn`no3c]WuTVvwes6&GDoڳ)ε:ZfO""aO(vB K%['݄ſ%wrrqoX鳜/ɟpn\O %WAz^4,af%N,#w u[|uTc5_'p2KJJ3w<״ VѯȞ%>V(K/fh2y,Y1jleTch}v {NjEhHLEv[kѿÄ_ tde?La3ϔf׬o1-¸a}+?IwB0Cg/Cd%?&qyT(HL-bFQ-|HrTAu#v &$t^o+RmG +& v4Ra^rgYλrַa7f!NV+BMY1rLtL$y,(KY,UZGYW4Ql" 8i{rEumaύh⍕ zs"yڎcn0^eR8ͥ^SS!_bb:U!BϺez5GTĊ_r^ȋ#[I4-GA%պ$&YZcao쐧,Ln0dO?~"nqhr #BS#P61Iqτ<~GK/[Qd/>cF4*mI-? [%Kˬ'R>Rl'eb&^hbAD7䪕dӞ*NȆ0,b$)ө# 'N oJh}l|GB+}3k# c1,( &&٢w5xVig&Y$*7f]z J^6"waqQ;iҁ ׬&V  Z\yUmCQcD4Wus5lWے2,ŹfpTl-D4X/hnrʙ fȋ\-(ҎWX.]zvs&!jM&~K0TǼ=ۜmwi'+=x8OYWHh_DoUh5IC(G#x8[m|}0hy}rﭔLԥM\r!u\nYNTkC:z[d`lHAɬm&uNGҍ tL )D#"|k4o ¾>RrGr?rȒ~GD]A6P-J|@+/w?2*@Ag8{0u>,*:^3,dbÝZvrZr9 O  }$X ,SSE_ ӢvM jf(QeT2)S&Ņ8JFd04lo5'^GWpex%n"rxw7j;jWqvtj;D0S^n-M&8_N;hMC֩QgDo} z71xEKlqbj]D&jmlvS-E2O񵹄p6 UR#?)encM^mq.x: aĴh2z6z"uf/^@smٹAy. +$ @_ ^,Q`cwT]3TDpË ]wX}k P*[ZG"/$Zjg)y{S-Ohӈ&VL?t7ʁ-{<5/dIJKmO/]Qd< 1 rԠɇ^Lh2&zl>ܸH˶iHtlw~F_띌 @xv0~?XCRY֯Vk?h5Z?BCȮ%a 5K7Nm&LlTќLDũp| ӼM C,#A3nXDG{%>Z`k6跍>^Gb.,]^G }$}$f):{^g' \eѺg#vXQ=yJPdNoDMor<԰S֫jn \':tkd@<_᳃˗F ˄(g!̂i}"xLfnߗ(rx(dj7ЖIåW$ SU{)6֮65fzտWRMJ{t^ !KZʶj^-ڑHUkħE:`%"% WӾ Y>O$s'+& Z)I2N[丼vKG5,ZN\ZVJ9Bd6t6FG4~yDch5;BL^_V7џ`4K:b 7lBVh#ZDyZbw951,EM`A}o!Hd%{gtY@<]z]fWRoţM /ZpHe(Pjw 'I+Z-,r$>O]^:N';qe8uMG/'Dx|#5wC7UYZEo/ )œ] cq|~86_$V$olL[ɪkCBR'( IDAT-n8xpO&/(胶znRA)U c߁bo si; TU=,) 2`qD#bIcMZҭ4Q* zM@&5h<}\z]ưGT%O1aKmDz0\'$6'!-bp};  !tۢe }T$JSr/e5F㙍>zgQ`(AD(^?ea? ,h^R/,d&z̪vΞ;4hrVv^BW2,TLsF lks Edi射?Q9ge[Vx ͋&{-JQ?L!|6>Ni_԰E4qifi(hZ9aBLR& V,) e_Gՠɜ ..+l_ yƮIiX0Y,b#_a zR&l{5&[} +f~P/%Ill J婙N{8&,aoz/_foe_`E-qw\ XFU+Wom^~>gZWRt7ш$P"HZu!Nxh{4B5&8KfǢade0f~oSUp]Yp7, (E<e.9>1Y`)E8 0=ĩXyɐPU~Yu&89qZ&2FM Pa({|v^Òh?4T#8PAhqԨ(5꣧ 3Q{;n>rMтX1J5oZu,쵑17Lq l$lPi[Ź_t^'*pwL =}μ&& y`XoIsD+'T~TVdVU`ogMl兌ϥgӥ Jy1;C`*Hx!'2޴UdA팗GLaKHעa6 ݴQ/ZTUnnDo9S[b^;SenG;Mh׻r@.rhJ.An9P1YqkHX\pMW9϶r-rPODvXmwcݚl- hA II|ǡKԂ.Iƹk[dYN~y2`'? fT q2,fݰK! XF>Ȳ&{QYYm.11F U9=EroH0.\.:cidhCcW?rB? &KE0`oCl@e uݻvU1.YB[t̒⩘sRoJ.,ܤc"p* C>~SWTe?|Mv$sܥ% CeU W+ 8* |QE|6]y=PU6%c;U`̱`*w/˩M[Yԣe1rfq[H&g/vbPa-1pT}SqZa{Ϥ[7%V<:~Hs_:y}3ǍwMΘrB$K;(zЫ? ־M:]z]yی&"a u6c LKY9J^U%ۮJ@GP8/0Z+$ gPLBt8?1=iF%ٖ~xC y_G:S'ĔYuL ٛ.ݝ.mX,y&6$40) &)ٔ%).jfтFUgw\" J_Y⠝ 0*Z{gۧJ/qkv$6c,"2e@Z S p [Mťk.9S7FTV$(+^]ZR:7z,~<9R#T* r1@&6˳b G}L+?IW%8t4yܘV,4E7jd-u;\K̠FYm]>IhzdPॶG7O a*9[D2_atUrp+ҧ{af3]:>ּ$q6z>|([5 YƋK/[hlB8D?Ԉ}.UQ+&k[/ƛ.hB(kB"d/ `EIC,Y/OkFU JѹymÑi^ߤC`4'3?e<  gr@u\iEt)Ò2(ɻ6KR+|&JHlnLS ?壁qP9cc5*ɜEqfXF?:~Hs\(O?1yܘBa=D u̎U5*1cɤW&=/&U5O=΅y>wDa_yllzq>|z;ތe86v6G5,"fs2r[U_b֥q3r_ّBcN4*`]pv"{En uXddXyvu 1tc(3YJ"SvSg| &cY~S :~vqR@_O7"r+a~-mYl>R~\=ưw'-pʪƚx|+)%"n%0ڶTG~ϲ "m]L+RqRlLNjV;P ?1,yDui{]Ip[Y.ekOn9 )O ऻSJ^yj,j[?ˏNX ʎ~`oopŔW[ha**`Jd".t濐"QIZWlw_vy(☪j #-rTf{ܽW`H338?uƭ{<uM91bUuڰMF`ׯ*/Ҥ&/-џ JёlǼ7?phfEMXdWm.,}/-C= K&yQ@<h당Ai>n9g1aYÁvR?yR;DgVF?^@p *h ^q9ﻣAs&N&2ŀx8b3fjc[`3/v9XEdfI6MU/^ʥKm &9.u"nH=b1߻;w]E3 xsh.Tѻ1<8jY0@2}"^Ƹݧވq BkaFr0'EdU @m%%ip Άeùײ*s 38.RfAQOa#1|LY+#rQfM^xLI 9M.󖜘 RAfg('""_MwtgK?sڽ_Gv8N dIӏ N-F,CL犎FdR~ߠ0_tj_4DQ#%;36yTUթ\.ٰ8xIJ,T+;WvCr_Y%GJ?}17)Єr?޸ :u'p='; |kQР;043$R""cd~vT@IIeC[Pf㫹AUu].6@W-# &uF[%=Uj-"$]*x7h39 Z^S赮@l-nSy8[{NFfr_Y9&QF=]8Ɂ}HزԿJ`;Y{c5{ɍrKP&eX%-7A5t* *mw,B.=nkX}e;9Y20 yK"/\pH8r~eAKDqC+^(Px>f*dKDeZÎϻaw55x-n$úeo ĉv6*{I-g]z0ݰd3 '{5#{1^sxQNR`]ĉ6@(|@y <~t#A aBeL,|1[&xh4zU.=nX*ɯea/T_QUFfyRlx61kV [~ 6.;>ޠ_fXajTNO3Œ)NU5m8jf'"70N܎!zaohsZDJ 9]V(D)PXou~ "7bfF1նYb`v ~rdv̚wy>dr'~}ޞD2,徲?M"xi\fjɚy #ė2!O4P4Z3sٖ@i\@(h %f7`"tdّ9xn=&~^Ump'`PGnܧOo{7\b fΜ)oدbb xnJdJGES)"{"k~ɶ &?Is,Fg噂s!ˋ C_l4 {KD] HNDn`7Q0L M$9/|/ug[30ٖuA^koVB%L|#7\jjjz< o& 륪cyW]}n6@dd$a/T {sVm2ŭ8bZTCB7!&w';& }^yޜ~Cr{s7 ,}zZ)HߪA@5?VTjdcᵴ-0L5!HDZSV#o;|)JJ\kv|@\| NX߷ 'FD,sr ** 8 $J)S=@4TGxR\6 e W_RDYYs9XZc2ػw/~)vNÃ/Ngr ,zlVs{QtU>='>]u%*SMg3E@C| X @lU=.2䵾~ki..2mWM@h~b&]-'ǻǭRʵtCS҇iB\?S>_8dK);? !Qwc[4OHٱ@4:fTw???^y%-qiXee%g̘1i#f(jldA3+)+.yXzM ma `m,gyBw~>:LJ)as7I t^!TjZ$J% *-cj)?p@N{&LE^"`EDt4Qc'zzuF6#YPi9'fx_JF$Kq3*v)-6&q;q&|||x?qM79Z,bccc֬Yk[DeeeIF2۷/: ##h.)[iB~t9o @roq@0t>kB|귱= 6%T`y=Ye{1ABd˫??߻HVv+BnR~8[zz)׵9$#]'99֫۫ Bt\+"ll;ҥ㛯uzE=H)f=o mMxyyOswAx0##tLСJbZ9t LJGEEK?L(ADyX.s3ӯ7'yVb3nOC6Šnĉu;&'%Py?KNSO=w߃TXQQqqq >t:FXJ$ ??? ٿ?%%]үhBU~(_B`մ ZT<[3ъWOUSVfvK'@OK7`ߪC~}^E0OHjޭ}³8y2kLW`l'J8oXTїÏh!O*UL VNK#2V(RjKmXu^^PV6yh/dM;t+꺽 cRn"..F/ϻFiƾU:ԛ?ճlmI/y`4{{!ĕb@#?=O3ghWm6j2|N!''J "ArQ ǃ."-RJ)p6bjn,ʠ8MN-mwzs"[cO|%bJl!&<> @ [/_z#B/\dp\X!x-EPh-B\ (\W.|Ius9`XHJJSrᅎwtOL6aÆc0&''L'A^^: ()Q ygݻ#ٲ|7uɱ{| +26GBGh]R.}zKKuaoAUz?MP1 b$փVmx/ |@6-=v_!dͫ'v]#$jusRb*ssm? |յ%VKY0ɊLᓷ\#ZZS@JK7Nu6k!J>MJmBLGNSX m~oEEE3|p.]E$##Nʈ#5t+ j`.&u t+[l%;[sRJ_B`yf 贡m+@磄(TF zK ~p7س.|kiodp,gDV1utپ FJK1 uli+X+}8qt:SN{wܦ&gaK#999`4ĉNу@Y /vy%>>-[}w;p'*{|K,Q*m6O(磨NC5QM4{r_B / z Mz]ŞOV\lDpqkavLLi-GW!'u2ɼ񨀲NjΛ7W_; v>uh$""yTҘ9s&C8UꟐ7nBV+ĐIåDD1cdzv]j;vc {r@{tu`  Q '׏}zjגwF['Bw`ts`Z$[Cν ۝u:3"]A'jf̘kʐ!io2HHHu.RRRBTT#F`ʔ)9ˋɓ'-WLJUnbd555'HK;\WgSV-*9ߓk3,SiP~ҁeN ^4Hinݻ=,zy*xX-O*^Y"x!HTf:48e$֭[Eikk)?~8'Ofڴ444,YB@":Jjj*eeeѫ֥^zqWpBnJ||ݱ:F#Æi[Y,rs9vd045ݧ%X_ iR pA5TpoQ tp[B:`N/liXnZ5 /,3/ٽds~(ة͐qlذQI)9rdsV+ 1{lצ Ç;v,'3Haa!۷o'''__ wo}UUzRScX۬4 NK (`AqWj^MTsRT-E@[8X 2?xDHq[͏^;x`GACӻ 3ZE';/dcCК!55#GrWkdffHhh(_z +PSSÎ;HHHg d2qH+|fmhity`:^&׶mU}z^ 0lN_)pM@hJ>:Xo3Hݓ=A!NV=:iOl}s.M60qd"4h/vz 8x޽ <˗kc4ILLb0k,M[%PoH"##ill9C_{va5]Ww-4\Tj`)yJT1ʰTl_JHݍK%ܞL$s>yaݾ?pT/~VB{QRwT<Yr`}g{tö1`=A:G<+~u"`bݥ7=_+sl_$I^MﶡDiv|)~.3},jbccedTVV2gzRXXHJJ \r j+g۶m8˳]8a8~SRJ ִ:vݻm"[ѻGξm>.w|m^ʫhڧ4ͮn{`Ϟ_/¡}kO}DDDhފpFEhhdnSSIIIFœV ^_P0ǏM8g-Æ<jZ^Yr#ss: e^dzۻj@0,7Hiαň`"+8[K9zi7E{(Nivޝ5k΢E*߷AXXh+DGGӳgOf̘)pQ4iSɄ_~̘1NѣG9tYYY'L&;vuxUx㲓yyƻԢn]%XB[wP,] wnq \o.ʈ!sMI R^Ss (Zmϫҥסi (-ۗl&N53۷̙i699#F0j(Msjjjd21o<Vt:}u]x{k+--%.. /I&iZ5̀Д0aMaa! 8iӦm0X,=zÇUi}k ٱC8~HӱlUUn 7^ `?LnSvx /w}PO$Z(fv42O!V}+A~h^ y:PQ<ڄS{W{^'66nݺh̞=ۦ-ILLdȐ!3F Quu5QQQXV̙N]Ws=ɐ!zvܣ)T]]oOd^c?`2ϕIgE` P@!W]W WA[.Qq!nx BGV%<*Γ\yZ=y:Տ秽F:uf$LLL eee̞= .ЖS'>>L鄥X;ٳ544ıc iNCJILLz}5~~Ο'2r/oRLKסoV \).B )+`%*8ΐ Ҹ38i6ZDq` 

R:pXB :)1]iܬރQwݤTC !娀2կ񗿼h߶(egg3vX.A)V+dgg3c  r֓yj^zz:%%%L2ESDzj%%%C1eʔhiF_ֽ{7̉`S<ӏj5***fÆ7IMMw:}RJ{`!) Nϛs(Q';m n{!lQvZ_~Z\VVGaȑZn8##$BBB7Ζ߼m HKKc̘1K󉎎fذaL: l&-- cǎdڴI&;wѬGt7x xRJyںOK` Ӏm0ith,;g*`AAlE1P.̙ūA"//T9BQQgСL2Es` >>>}0aMz=?̝;iHR|{كs1pfŴ|+VRRڵVz6pr;]KU o/xT1+7s3H=ӱѫ:wy  -UԩYÆ/,,$))Ai~sٻw/ݻwgƌ ILLd2iE`49p%%%̝;iV)~{L0 'Owٵ+=I,l߾͛?+S+*k}Х%X?nizik| 0&ÚԹmP 3fuhv3pug:rŗ4Khh{Pd{ٳgM֥EC/Pz0Ǝ0J񏒞CW ͛ƅ9y$*+ JKXn))n'gTK%~][ 탅T.3HcƢ2a.Y 7?[ 4H-v A_G'ǎƍ=zK$..={2eǿrqqq1k,XHIIaȑO 8ӧ;}ë`o@L4ɓǟ\ DF'0P[7||xx3n%Y\+Z7/k hZc(ic~j߶mDnGmr XjU gZ>!p=SGiƏҥZl. ӬJ<--ÇbrK TPV__OTT\zNO\pA/͛F>jo_ Fc-`YY9׿Arrӱ6H@R~Vh+gJɵ|GQ2vc@u_%4 vXnFrϣzz:eG:t6mIaPN8All,:p<-%\ĉ55)YȆ4ݷE%==3f0r(-^^:&0q☓I钒2bc5Rv{}N]JCgO Q#17JT~PT/jqgqiN㭮l;"m|}8__ODt\ (DDDE{`߾qzf͚+r0-xx{{3k,RpK.Ѽ]!22ʼy&:iԩ?*+77=?y j*B}ɑ3ᙦ+GV ¿?e&Suv4pCk=ڍiNbPB {6g;qzͻT=zTUU1e+8``.M߾}Yp|EK"8++ٳgk*СCNv ܹS T+&vWSPbÆ7Ot:;nM>tv2j+dl)?mEվ#X?rٰIulFEgB~({``` r)f:DII &MrAT"))MƐ!HHH`ʔ)۷c2ydxz>L>1cN:>|O~qouu.R+-t6\f+-`ῑ½fV\l'i|B\xxNfͫ,^Dm8qC#{໢1 QZzvM@@su{`ذA̙qrER_=њ^gƷq+Z93B,3o@ *ޤ7%(yV_Pre{'3=yi,,oTf4ޥuE{oP<חW_}k]}Kr4''qƹtۂ%999ddd)((`VU$&&:o1kV_vRJSԜp޳'zZ/v$G(<<  V+vv5'|_(v20qύ"Sڕl/Ȋ7|ѣG5jGv*>KNNfN_[sabcc t\J).XȑØ93줴P޽5'z6*VvB=-Je(w۷ ӴUx gWU{^#zޮwsssIKK㢋.r* ` wKA֭سg{f֬YN$-Jq1xn̙aZ//mȽt`E}8>+8 rҐR lZ` eX]I{(ߤN<X^>-I 2,й&#,,L_ o>***?{-8\1`̘>}WZZN\\UJuu56˾}nud<|3l ,xs9FWzu%Nz\;O>}ݏ+V~"!!~i.oM!Wzz%-"OjFRJRRRHJJ"<<\*Oܚ̝;Al&:VԼۻw?6Bz)V5܅ںh% U Diy.@)@mnxчxGwMӪx>޹KLppO͛F~j7Dd>VpdӦw0n6?Sz)6Y\TBxs=pxgwSGqjjjCIS=DGGr ~Kҭ_|Ai___&L455Bvv ! KX+I)9z4M`/z}~)ڥ\T'w&\=MW{ q뉍l6ɖ=)X,R^^R[ |-\bƌ,X5̼yӸ7ϥmqlEHMEg;rB GPoEpkY /޽+xw J𳳳>}K%pm.HJJbNpꈈT/ !4t,:UFYYOmmowi|;RsjZ.Fq+JSmW]u%Kk>MMM$&& $h wKA%8p[0UUU|df:NԊ N/MW/aY6lx*9xxt* xK" I'.t>+ #Lrr2L<;pL ~]] 2i$OZ?@iim߆NgyHHhX,⒨PWWǻ~ΝP(@)sz!fP9s:*wynjj*yyyE#K/^R ~KP!,,̭_|%%[hjjC^djY3p`?ΝJϞ媬$5$֯JTR|\t ,]*@ssd SXv ÇVjuk.233c.3go999dee1aZCC}111NS^^nhllX|}}6mcǪܹdXfY__{}߻)R~sO`:\JD 4>=n]v~Zc\verVr233 r9)))2x` l̶m4%g)--u8h4Ȝ9tﮎ IK;,)׿TR|\t> ,](-QVΗ:VFǏlPZR?p1V\id2Ctt4z'2~vȢ"mFNNF3g2fjZGFFӱ*يh4ˬYa9Pe{ T4oG pkw&/x]bt{;p}X!6afqp9~8;wȑ#W^r-m4Lؿ?{jcܹv;`ȵ^4@Y,صkluu5ee-Zo~H)%''ߥCRYnee_#RJ1E!~2@@@oe˖؜k6KꬴUk.5,YqMLLSӫ`-ZDhh׬V+gΝ448 eҥ6z]MΖ(7n4O?]4zqh4y'l߾CVK)pg'tB%,^+lٯl~bQ+)=Ů]8z󽔪5ÇsW_ݦuuuۗkdpr59)))lf؃XҥHO?JIIK䩩]:v )ҭD'tM%zru6+l\M/(..| zB8 -QYYPM=2d&MbررCsrj'-W`jjNfq(P+>_}柵R]K"&!G5w&al0rwÈطoCu)7hyFNLIKsnbnXD>ʤIX,'S]]RPb͚ ?^yN+H)JX!8MBBB7o#/}:]ۣᴴ#sϯcذa.)L&'Na0ݻ7C2~Zu+7޸ ooo**Tv%fl>-"Plqu/ O`b,[ᮻ:2x?p;ާUU,Y СC]@>]X,jkk)**tJ3vAmM&ii̝;a2K袊F^^><5%p9.FqgϞԥ_ y;X\zғ/:|ڞRJNz[~ jjj(..I-Ԁx≇9s*2-pehX_LsRzQ)'N% ,]"d6>(([nMul޽y;OV|=f߿V]A]]UUT؜ѣGwjkm{Λhl$&&ŵKaaklQ6؆*vs ?yHOjrssۼVYUڵP] (*]RR9pzJJTu `pZJXX(&w'˨.)%_} >[wCJy'grBI߯_?Pnx;ٷ /@ vڎBsj=f7q]nw^<Ƚ\ye7ېKUVVΚ5IM(&: , !D a_M ??VJ套^yrѭ[7 ֥& |ͫѣG2aB[~?:B/{s=cZȶ?^j Ž;y5-W'z'&wl2l0,](Nn~ɦ~/ÇqbH~~>&fppK\iwd4y|cQ1c.'aOW]]CllˆiUUz֯D50u:҃&<4lZC;Qܲ 7Ϟ̿3VF 8Xl sg_~[Szŵ.Fa6[HO?bҹ*eOѼƻaZaD;R\>rB2'ѣY`,[ /OeB0dRJL&\l2e"W?}tzr.h(^^:]Hj:W6R}wl oxIDAT.׫PR:ÙX~f,:u]G߾}^&d _|;"L(&Nfi<BJ9l‰?qJDVVkl1V{D<CJPiXVBBB쎩W/fgO?ʧnuG%=x9~j2qDo0vnϱcFݪ7Je.r"Wsp7-** ʤI}&fV/O>R]Xa[ˀ+{j2eM...a͚>|ԝG%gO`9ǑRnB,E)9]ڿ?V֊msRJf| ηI~-Չ/<<@JW(5:=j2uWN ֭Drr;#:x1KIENDB`nabi-nabi-1.0.1/themes/Jini/none.svg000066400000000000000000002762111430012456200171750ustar00rootroot00000000000000 image/svg+xml nabi-nabi-1.0.1/themes/KingSejong/000077500000000000000000000000001430012456200166515ustar00rootroot00000000000000nabi-nabi-1.0.1/themes/KingSejong/.cvsignore000066400000000000000000000000251430012456200206460ustar00rootroot00000000000000Makefile Makefile.in nabi-nabi-1.0.1/themes/KingSejong/README000066400000000000000000000001221430012456200175240ustar00rootroot00000000000000이 테마는 성현 신 님이 보내주신 것입니다. nabi-nabi-1.0.1/themes/KingSejong/english.png000066400000000000000000000030321430012456200210060ustar00rootroot00000000000000PNG  IHDR szzbKGDJ`Zn pHYs  ~tIME(IDATx_]Wk}ν3ɤ6 )mu і-:-mhbP|胐b!} &D-ՎN)ff0ɽ^>;Οl} g⃏cILLL|sjj/N:yO~9uĉjm#Nnŏ,9rd|hh跗gZ/n~c̮0v';ʢ/>]b CIUU2qw₁a:;ԁr SLvǁsL1SC.UE$}'QLsxqέlwqW"!DBH 3I5!%C L^9~ ge:yf^VUEiUQR1^S^sڜoB"b jpPgos UE(+"z/7g '9p^*8t] 0B,HY"'CTϰ~p*x'^31[9*`b* ߴ1{j |h B f,KO23; ޱ6U$5#85$K`T*ڻx-ӗxeص kUmNdW[moJjeND8^ w\!wӯJiY;ni;G ɮ wv#w y =o=-ĩ;0gdž}מ|o=G^$iy_];:Y#Ub?~Dvg%H3㭷/^;O?61 -jF'bŕy,S\,9@@DOf)'B*0tZ`>@֢*BF-@*9uj)E**t~&KvD qŧ \@~Èe@v;vlۓm @aX03juX">e y)(;IENDB`nabi-nabi-1.0.1/themes/KingSejong/hangul.png000066400000000000000000001044361430012456200206450ustar00rootroot00000000000000PNG  IHDRxHw pHYs  ~tIME -^A IDATxT[mYv&˜kwDk*++fl#[64ۀFCKh!_ T۔]Y׮TfU^O9'Nľ5c0WDBGq"vc}&'_^%"i"f46<Ϫz<ζ."T#"K))%UJ>CiL uګ4M|l&9d""L"#n AQ l:h0b wl/@ɋ-KMyI33QJRQJZsӠRZ)<"`[k̒RZE̘ՅYU͌ܣVwWyLDHDiZ.8OZ3LDJ)QJ9YbNiX"31d#4g@D˲(1 % * E{,33E{9XD¼MDa3UѯL;'hΧZU5"zED;3o/Hp88N':y5Lx<{y=jVlsr\,  #bBHSVGҬNJ `=+A[k DØ}p [Y#<"pܛAfDDpw811D ],"Jk.ªpV!Q)nFDDԗ/3Ś7 }faֈ9sJ K){;4ZD ˺iZ;"" ax;` DBՈ " iH0EI((Z 333f"D"rZJRNP29][=rέs-7^kZk(3{ό52W͸iVR^I4YRZe =ob 033S"gB<ģ)oFfS2pb̍EI3 E"D,"ui}|-$%` &@ 3S"rRqdUy)Г֣У882ϽADU[k։xn=WZk< M ""Z5Pfo @j Yc.j  pQDTʽ{߀H ~JXKD0 XZ"Vvnwsuy9MR_\\89֢YD,ZR^I...tOvy7Z #p dڼ 4YI<40%-s B rԉAà bq,_=0%%U f yx #`k f/3UT̬Q i"fׅ!m[w!"N$6Dl8 yeF#4LD4cz~~^Jf2 fP`cvJ!IJ9ѱ0ɴm%$ww&eu(!! zrm"n@ ,;rDG)Q8M<Дp:\y)173Dج  Xj Dms~an՚#sRN,,ͩբI%3'՛G'Ͷ,) dm/YNf.9SNJ-Éb(ÙaUN@U33!Fhn",qsd1nLY3֘HH;qZoNfDZcʹ|<rέV"˭W.U%B":973"ҬUqrΙ5q8,( T8DEksasb,0HI|?&YYD[X!tliDPd`@D;"pVcvM@NJP̔XD#"xq?^:y4|:{QuAUMJ_^˘XwBU:¹cJ)k9^͔ҦY!Np[%:yǑthU<9ekY8x|~eV]D  53P Vź{s-"R"P "bͧnˢeY$HEDj/CA)i_Tr~q%Ax}ʻ;g yvl阬JqQ9f)WR^V|9==`IcXc֎.Zܙ^AE賄cL^7 "0EDxzZh_}/yDZg-LYZ+}oU">7ga_o,[4j"e%"D 1E=<2uMDdKw0nAXn2RE  1E[$ =M~߷ꇪ&65"1N#D'`O~~$ikP/fmZbfcRP n=~o0^ةn0yYvT_xeCwa;K+Ab (ߩ#a0 7SOn"J)ps9~y)V nliP;O'{y/~%]*Vjqt0:X1(P[HxȣcA H9AffN 9ijWtj gyf)%'t:0n=ckMu~$Ip jĔK? 067~Kgwp&`"~z|.9#_-A)px%!",AФKYBɘmՍ`(c IBDJ ^$IS&&sqڔRDt:SA4 0*kRZӜ:C)6qap8LۍE&MIIXx@HY^m2ab=?>y<-mwqsOqs5 |s<*;=y<~Ú yS;|u7q*W#Lh=TUT-UQ%LSʃ"+sm-%q AmͣJRVnYkfΪ: c]ܿ"b^5q_AJ*Q,- o"a\ʜ7V:syH"]e`!׀m6#qBHYgxxcsD{QFd[J$_Ui4}7}5*uuFqySJya6<"XėZ`D`6 D9.RV 83!ByHfT<;3UuJ7 I8a9u^t}`f7[Z^Q;EPlq${54M̙[33 '{=kqL}amr?ܽqٟ_{vO$ʐiwzo~$MB aZ$lf@P+YȜ`k,ɼQ V%PE)&)Y+npNy9kJ,fB CSUQ,ׇvC>~zͬAx,捤F([d0۰_~H;1q(GUy +u?z'Ky ^TbCX5z5S,ɎO8o<)KX$AJiԣ xnNﻮ &VQwb%VfH< 4YDj pOaxIsr ̽Dč½֚snnshGYY1`^:'S3I+ZiᏟӹȹ5y{z|p}'_V\88jbeA<,y͘5L)IhcfV=Zphih]2""[)S>ZlFoEkh5j+o 0I-mZVTysWM fvZXyKYtᡎa~wҎuA8%*cg\}_RUhۖJAxl-XZҎQ_y*cjm,$ܢyʹ3z}< w.x"FS V+{UdLY50%nRa&IVSX?0s֍R%gDg tፄlO"li{ U-ҔX,<'(y?S4 sA_N(yq}˟ۈ[QOqڒCU u}/8}x9`քVaTꜳ.iƔ1el6x "Zuk04@(Jwp)sDtZ, vӌaIS "BLvf; ܝ!XU=,ɽ ."U2ciTܵrNj%;Ϯf:C8f ,p'I%S?ߠ^ώWyn/.Z fYxj@4c_Y^̆a!/r尊[U0?1u# ѧ;jeIIRbpq֬U*}p]<"ZW8NCVU vwT]&m7z#ߵa)hܘ&c%Hb1+~ZOO@ /?oo]_kFlƉ!Sҡe%;F4>Mɹ]?|g=+[or~zK{ޝyE:소f!:g~F$ERJy4"ԖyhD3 YngX!ePBD[7U*Auw67 CW害T;Y^V hQZW}GD}r}XN%zkVk;-1mbζӯ/LW_x5ʲɽmt};Y7 RTGJTReA{+fZKP7i@d:)V y@7*3AWwn7I$VC@0#p $?g~E{^g($JNחݻWO|? %_執QηyZ(OCsihJ3fgKKY?hƌi5$0 UC{x@A`joZ#R #`&&GֶHG+ƾfDd͆!TK2 yܴ2)".KDx1N GQa!V2݉y[Wigp8#ެn<5'o_M8'2j) %UfqCa3i_#AdfJL"rӛ1p3"‡a@{ŬֺOo[ ):% jtxLB!%Nx&m>;@/̜3>ޙg0 s) HєV;Χ?oe$l/%?fnGeYYăpWc);auʀ45q8#,Cr80FJ*9H^9)n[{iֺ34";fsv3v;c;n`5 !P}Ջy8 ̪״QtKALYD,ꐙƣE0ڈ`F"]o@É J>q՝BP=jfBspe !̘VZYȣ55Fy:ԛ&ޭH}jg̽UjnnQLU2tO3! 8`88`TtogmTuHVkDh1ifD0nnDnEDr뉾uR^JCVkEGވ"[WUK-zq5YuG-xvyG!noLwxdGUPw. XWrLtje;}&`v]6q΢or[QO(8@Ve_8`a!}n֎kV9,4&rFxXk63INF̱5[))*w*U5) 䒴D=(Y0/J^X rHrXNl$%p~#e0*-!B4@4]-Vn[7w8j]UP8 ;D QFGRYkPu)ɄAN021qΰʬHX.-=@`II@ŏ ӀR(t3A<&ZkpF75j-U,)rK?޻RѤT8lX6u/!%[-VVH` a zVb IDAT X=nǤR33 xuO` 0Q8@r/50H09rH%qm½4'vyzgʯ!Th %D0E""hԽfZkefaZݺ/"[E8H@J rh͊[gTYY/dZ{,Nn inBj-9 &gxhu ஆy9 Zh4l>v6|ێcy<-ް|P-p~ 0>-(DDN})W/J7j͏&Bg0 .<'F#fPHHsbz4EB}VlHF0Y:<+G[4պb9fUi?BN}Trw>z,ƈY,5(ul`;@`ROU[Y"e/ L*  < y$V*bEĬ"V*S){W$ZZNbtYn.PyH)47K+Ew2gy/";,ץRp=rVI{Ŏ $On@goM-ZҴ.PG9V }YM0nH]Xa5օY@&g"k8@ A_Y4[P0*tvuVM-:p:qLYɣ0Q&w1|<}[0ϳrulN]}ZA;@@,9u#;sΫ֌e- ` riDD(w(N3d`#"Df Bp &Zs &֕~ty4])̳d 6J(Bؽ kd,bż3;Z GadXea4em&Z'8TXOܵV(F?gs4O ݸ@ a; BJ䞰Z* ],iB 1hff 0cكcޣ -z٥m Ͽp4n 7ޚvldLWfz0ƌ1ok S,?E "ηU}BStRrw2z&V3H;Ҕ +K X㆓uV0&;_?~ʶrLw{~ ;gVNQB<5˵m>6pM;n6+J}λO_;:7wti~gr:88ʱDtB#A(:tB*݌#p**.K|њspxMXG=Z,7asY~6o^z _W_z}Wnp!@zF֎?O ݴ]gvZarxxҖ˨WϞ1_zٟ?敗90/aC5 8:eFDz@s0P(G@>_KTfT#u k68ƒoBw N h=\X J\S˳_—_x_8z~iBDBDQیm!gHx(K0e=mh򨉗_7K_o?~~g{y6?OEvvP㓺hD(굹y a}8FaJM ڲ,iЈf RB[ M4,T$)><~./' j}?kwf3\Ptt9{Ͽm>ܗ_哏!}7z㫯РX"n;pxtnmh,捻" N`Xսz$/B^эõ$ kt>f h!IN ܁n Xkm&POݢ[N,T2dE?zw<Ҵf+U_6wi'O_/ùfQㄦoo|;_|ᣯ+S;K^Hϑcnx5lq 5V~0z@ _n-bf]a MQ,B[[)i[YHV˝ԖEUi@k)hT‘J gt5N<-h6[`Gi.Φ/} WG\R~ᕏ~r{#&\?zmniS>y?f܍G[^n[z7 ZyڕO>ٸ !#ܶcc!2BlSm߾9{r}*i?0xתkUNc|7Z?pEj ƒ ͼӅ!a[zlU^y}{/,"14)6#XBHidzPk&4,unYm:5@6H' 㽣Բ:9[yگUar[' DU g4l2JfzsqqfHkho3T}K'_g u^f"F =[~m{)}HB!F bbbw 9K=0(19e:mZ}dt+*"J&:uzffdIp3ϩ;m1{ުk ؑDGжTz#FHYm}F%V[0ה&uj0np7Ʋzpp[//$?ttGݫ:W^*}_VW~oCA)f3}}}vu㗿O #wwyd~K郳h٬Q81n4ƨq( ptN׉Qp["ɬ&Ҷڰ}3I 14A)|dg$Y_.G).pNJ2r⭕j:B2m|Ha&lG )eSK:HE:$ ;%f:Bn"6tqrB;i]J!^zݯs_t LN>p^DϽpvd{{Az'sf(A5 fq494-M8\mn9F" *A'hpQTZ^ڹ&5Ƥ}o &F:33XwT"VZE;[s{OZPLZa',"98G@k(J]E=#TMYz:!p_ԸNm` t"5`uұ(O˅2u!B#D脳,WX,U`" ,`5i/15.b/\pNpŮʺnCDβCuJm1"P#iM[Zc,:x;'T!or!% `43ĉ( B+rNg *b>Vuv8>1[la\_ҁR4.pv-,nl_m2]"d E؜*ؠG ZSڮ6(ޓRf"BT]Ʈ|W1HI)JsOx1^˹%H/_ 1Fͼq1CXmHcTсݪN#hۛ{xקG{w<z(2p<Ϋ=B, mjfD9Hk&q2:5͓ØW${?؋b6'[{=6%6h ܡ[뜇b~5oU[~E~m3d4!^#-1:<%"qKo82m[b"Eu]he B N a Lk]l۷،~uɧ3j×sI99?jsvViSLԵ/APi Vu mn1f8m@w.R ٮ'ސYlᴲˎ+i=!Ra3Tz~ϱl@z%Jk}[Ij^/#ZCĤgO/.Nn}(OQ<+{AF9<'+ɾ "N2#I2b3/fD~Bl˿ۊ"5wP_(gUx_pFQFbA`I =3 zs$عC$AM)xQր@ `~xtxйf2 B{LۅuU4-p?;<.\$dCn7፷YQYq}Q.ѷ/8ʉx87 G&xbJ{?nWx^Y33^!fV̻䆨w13,{U< 8K7* Dy.3C<L&?vtnIY9~XtVO}Ʃ;>Zvu?MgG?O^޾tO"!r 6 `xȠ> ADR LU =;?;b$YB=><;vPEY)"&^Hgu$`r>BdjGHQI\/9*HzLUCt)H#Iƒ%|GGצj\[ IDAT:9"/0;D!xmV|:ͨ\7Sxו&=$P@d)z,"L/kH[  a=VA:aq~f+=?'p "`F Ͱwm:Q?IATd!*0my9g>O.wH+&hJ Ǩc55Q㸓*.%0`0It6$\ꇐk:_B P'FqJ"nAsNb>*K_)B?%pA9,#< Jzî{҂"`H /.- u<;du 7Q60C]U2~Z$d8;>D#@EމJ)(墚 fğ~?z[.uAM۞2RMP$ Y׮^iZ\/g<}w~m"$ܒ40Š@FK$D"Azm愨!,4Ҷở?xܜ~voR:!HTGg&<Ӄ˯r^Il{I:Tnd7~YOtpHB@)D]v4 FG}>BީCpz5/.lA瞔AD=$ x~mlU =@G>5DTSzso0e[{ZEjDS\+| g{7OouPFmmRP w5iUї H_v' (U -+ l`d׌}>؏;³'?(nn=AY]m$If"! B@#0\k=]SWǃ¤H  xwa1 DTO~rw~ä կq}8{m~Q BF6bb7H@Bi! amg菏;!+FG?NsD#ސGY#ıǚ-0OW^z'~1WuqS8%T1-ɷs+Efq@~( &}E+0-Vx+ 'v"/3R&PϟnҤv+EB,Pm[mS!BK[3I@-pDͱ J9ɻlã?)V䙩֘b_-6Wns݁"#8V,'9u`jlM|xhrK:t'cV$ƢQ ttT4BL1ؾH$.m;߶y=} }t/Jg6%2 Hn zh641!0LFҪeW<9&/}sN>OxU(VvH$'ޫ端~zV rӬ]1ќ$*iɇ;;?ZR0:5b*I\>^*tFlxYoh (y1bZ>a1\(W^eBӶ&Q#Hd0E 0aos\rGǿOo[GA+]~`oQHte {p;˯\5׍M iB]MIMUp(ŭ\<'V6 2:MQqbJN@w~}^{@} xB,$ELQO{G:O~3.d|j/W-DQT[Uet8̞޻ל]%qyV?lޮb(}XW*,;i8[ƩT~{ZkmRݣ{sNKCHiQ[w 3m{%~a>0e @veA=@o@ A{H A:k?.Oʹ1Fb2z^jo?dt(=ڭˋ>j?6-]ۦS]86?ޗLH{̓8ڟy`S`R8rݥi8A)^xkίO+|1]I{ m.,%*Ք!h2Zec 7H*-.;bzΒ`+$BܳkWH` )R}w~ P"bhX7zuɣ[~N6IS$.WNtWK{GǬw~׾c(hNlx(M|<=9{O+|cmG>e#̒mc~vU΋fhW/d +{ }Wc?609ؼQ &Tz.-$ac41GTֱsY7&O $ɱQF-@)nZ "1%Kp;3HZQf[[BǶm _S;#ugݧ~d5yZ74Rt`F+AuQ$+3PefjSf/Wεf[/W9$ J cGW:ԓVv4nI7 2iH࣏q6;;y‹Ml5a)~[ѓw?n^Nl*!j >S"/[.zj^""ջ!HrD%c9hs7uMoa1{{cTΥuW:M4Mu皲$zVF=ZO]:*bpDtF'\?Xwn63o޾<щ`:G ]́y/FbƶU6Rҵmٖ7oݙ(֠xm\"LF9M6t#uetKr"X'`Tج*3J9Άyj*F?ԩj'ghGH3E ClG E_~'1!!מ?>UYkN-+W*=;9G "-4V6ɘDԠU^gnKj(va12>Zpbt)>)7oݼ6[._ӋLЅvpiQ*QC!m6U nQ㡞.W1UW6rxʌ UwǗ2 >{T#ϣ9 (O4W{wMa1$^ۯ|~e94[f.E6]0>rV,Fa;o6To;;ŪE;(TaP$]SLD,#ԍVHʚC@;xBQN O uS&c|:%h*81Z\e@H3 EHR %G|05(æ+^>wy8{+Ut9IW!"C B=9peu)ߛ_>@ϪwGG<,YTZ}:%>Rh<˴RIb7^s 1h".r=ulLBfjYlX(r^A<iDmb~(*JrINR֋qyuIAGǮ4eX)tY],_piB,+%2YnH|tw?zӬ]bR%dهNƯGgُn %k6 BZ[TwrAP<@͛;M+_KOg3ڔjyKHflhRt*u5޷Ű1.X64bQ\5(-))D|[johu\)wlfPXE3oyZʢ,oݓ{Okw0Pz脙+bwo.Ӵ:nOnݏ_2n]3WX%Y]~kCSX=sy\mP5&6r3(ꆵAies1g"t:EZk97MIb-z;r Qp? h˺t,f_-s&]Uo(@7nph-%t>z.kGɷ*뵗 Carz1{VW:M6>ܸyû| oV-Cu?Y~)kp{TK oLqj_g?6lx/uaR/o_^;CS+G)ʫ*tgij]MZkוf&T(6{wb̦m"#cNDS]lEgøneSS] mG&`SGMӬ^b8z&hu4ɳ*VA8";ɰ ]y4&Me]iVI-D(fntcBmj\x:}w|Mf7^?zOhxhc=Xlbh/:h/]9[*誽17^: 횣fCGR(E]?;93֧4&dh}VI jB4B.r0K]Ӎ:%FZRiF5*MEk@̳Q9Pٴ</LEҜ1&zi]눮udE r=O2rEtlJ1*;)~+fw||Ri.6z4\poFn;hY6뺒Lb*êfAuo#rrt6ܛQ7k/MrAS"@[3ڛoC{۟ˌԯO o^ݿtՍ5^Y&ѱd rzӧW?b::Fl0:ڐBدVf&M%zsݺ4&mMmlBհ Fٔ:;hv!&!(x(Vkc9 IR7F%כ[W_yiOgKVUӮխ߸Ϟ~&!o"_wnn]\n2:"ZK"tz:^/;74xԝw+7HCtRʴmD!Q]ֵ1wnaY +01kJwL]kZ]9evQX 7ڀb;,%ܦVNg(c&hs^vӧzY^n9Im6kN >k|tt{:Kfկ}՗޹uY7IPG'vWIUmX̻`%iybTq~gBt~raiӄmO.'./&:?齓PQdhR/8EM'8B$F9sB!ٞ+WtܭWʦT&Z]gC("M@<z YvUo:,6DDpjJVu}3Ept4p>zzOѲ ^>)/3IRlIb߉1;\}gD5MnT5\Vs͓] lFHYX}}-2e jU9y {> a"XP5"@3qƑVqAQ4J1&@I@- `GD 'ƉA `$I0{"A ǁƖ JXb^VPؓ)H "BƉLC o)=7;_i!U3͝VKbDt&4a$ KSĵWpYF|Jl<`ĆAN$4y lAAO  agRJ1 洧Io[(FyLӉlQA"ihLP,Ip ܩ89(a$$NpBX|_9$1 ,bY "8.˲?bAAHQuq]EE8a 8D Nb~ L CHX`VoПfwl[$|V#i^TNSwdAume iT K/ˎQ8:p:hne p\Mw<:mf#_u\N! s1EKp-LAH"1yqp%i$H|:Gq0,(\N' 0Dq I0!Ir<7bS! 1Y9<aA8#5jhx8Y0K0fٙɀ3 M@t ZN8\x|p2SWs3as[\X:>ȇ" ey]G ø>47 19Of}qO/p%x@ i,(a i(8{&Q @x h:jU<1ZQ@4y`ZbΜ^P)GtZ T1'qlyR\.;W' * -A"Ŏgw C@ .f |#nye6Qit?=nz4( M7cA8N~r{O_>}6LG__$$w,osei1ü`2  ,+NbNQAz.N`b >by p|76nO[G}dzz/4'3t0tyQyF.C@5$Ͷl87ĀL0HX}ߕv'Z:g,% 1hr>9P/*rl93|)7bJiY-2#ソޘooίE+bz$ei#@$9!PhqA "i 0NSBwisY,SFB.v mݼ{Aa[iKEķNzkbj&lϯ@^z`d| 4d%U<$1c$K0#&`,`,A[S(3Wn`Q;ƞ8qah<} &A V>9? vЌ뗋3_w"@|qh?z3А2QgߥI djN `iJQjE1Sd4b,al-+"'n&a>L>qk._oly'6}ᚼTbˬ <+v&`"MЏn4>{D?a,|( ! BS$ `8L@H11/ Rrpz`uTXJۧNM 0])M_y7l)QoWsk󛫻{+{OTk^21a[@ g.uw:Nv qsZ1I$c I&\,Bʋ`ШmotF4p9sN~s,Pl)y3saZJ~jiak Jn, ~Ŷc1w8:WoRTYCLyD@c(ƈq0N$/UӇ߾:ITemۊb.ə^P1eQ-TgNsPL1?oW޿Y~J$9gvݫ.~w7nN:9!z޻ #[cq,DQa$qEV@1Q"S AV[ow=R8V9c8^Wd͟k*"o-xNdJHt` ݋yhr^r>l:5pnm`&1Λ 8R@0hIptNg߼ر\}.0z;h0ܾs7.GhÊSj9!ZY0u¹ӓ7򧊚_lR(,_|vuðJj[_KgSBt2E ∑0QĀaxR *bVsrv2ZX(ݼ2#L94Y;>6{d鳳7gZEtq}v;xs 'R-X߼y|ʚkGNdQ3+LL`8#L FE ę, ʛ Wk¥׏{gg҇|W;4 l:|淟}7~ڶB/5k+~/?Ƶ)EVմ:`* \V+GoImq& b; B~Z?D> ^GgmXS) MǶV/l2EHw8[XB*U[ O`I7O7f6IX>זkJA~|X?`1I!~Ɠ֩[.NrO_ǟ|B줜˥W7_&,.s+nO퐰l#MHA‚ H ( Ä,($W?xszGk7#]y$DaȽ:JN41!ehz߻<I/,s7.N1{Q:I+i^V_'Mn6 qp{ ,%HE140 Γ#AOR; /\)tᠣSs /Tף;ӏ?)@c~YZ[Zq4ט999 y4ɴ{FP~SeKw*BM/]~U¸b6+))j,%AB$TS3;~4:=+9/n%H0Wxi>< GŹVocK3Ke=WiiOzf ND˜,>n+^NSī<;E&)PĀD$ ( KSOn䛝kOtLJqX?.{6זx` )jƘ;78`lQ"ƄHoܽm$˗w˗rNɹf@9IzX4k6cTOA60D<I4SLj?\^p)@ŌZl791=SHka Eޤ7]|?/TM4Ч Kk=7P+ڒݣp\rZζK$MXuS(1cBKgKp۸|i:Hn! S)6xIq2&`ム%M<=6 2P; twyJovjzmbHʶ&JAGpnieN"N$!fpFqvR!4 s),ɥ]]Y{h-3z"_&(%f'(F^HK_lzShpuK˾=~؟/@k_jk_zu$;\Cq"f$b!5C$frhh_<`fȥOn &'yU.~/_AQ BꜢ3L! DԔToL{~ob:j'\zc9IDAT[TJj 뚢4uUSƅjJJcfz\QW/?ull񈢀ģJʌ|gTQ 鏞qD4J9t^1qJg:yrbfup0$U-zs+jcIs Jh<:  t1Z n^%Yn,*Ä*ڹDm~xAΐ[n?;~^UL!:$5)YdN!W!( -ΖÓr2a=مڒ ÃוPT\6U[w'ià KӇS.N{60EMO$;JPL;곱4?|xׯވISJp`#A85Oڹܕӎ31[[akJaw{|&BDfucjCwm1&cLw|KA \Y2_ .lỎ_gō(*W5Qڙt.7;#XOU$@vc58.!\7/?`~yw`h vdp>:uo#n\\P3;lpj`[~՗O^=9{*6 G_X?iԳ LMsII[~fyD(O*l6pW_Xgz 1^8|1+Vrr%|9,ATxR^\LH„ **8%8ND?z홏>~lS>A\&$gYl}}uY3T[^0ƌ3 L3zd8\>:c(M idL-sBiig%]ԗ&qؕtQU|ZJEQRk[k6O ,jO( W/a9TY{7c oj"JQ}hi6[sY5s/=/eݼv\*<>./޼5$Ѥf?b1~ۧw<{UVrJV*Ս\nZYw<ݢ#S4T)tav@h,g ٽ*1-D b5ޣJrcF>w{X@ļ edR:q5 cub&l{o,Inܺx~;}ߒ;;̓cØ4JxWt]mn^SSt|i! _~H"5Be`?29^s`} D:LXB`b/<u i%W>z9{-U6ϯ{se9+~w7rjsAgNR::H`1IkefsW5/nBf2?t'[ WO-T)q1$AjPDR,L8=/tˍ2VZ;x}9w?tƹl^_`ᅮ_Fc6nu\?\iriJpMTT%Kf ٹnj1S<ΗRFK-.f%brc><* U^v?pMw3\hB\]^^DXd/{9=͋C#W #'_\߼G>|%QRAϛj:_BZ+om^da'qF0W“>N0M8iH\BZ\YE$l̗7/72_?n5?$AIENDB`nabi-nabi-1.0.1/themes/KingSejong/none.png000066400000000000000000000361161430012456200203250ustar00rootroot00000000000000PNG  IHDR>agAMA abKGD pHYs  #utIME ,mM< IDATxyYVY{w;wTƮ馠1 (%Š&NA)bE(ȶ;ah P5tMo~i>x}%;{9뻦Zk8S9S9S9S9S9S9S9S9S9S9S9S9S9S9S9S9S9oӏEiR,Աyq)ٔ L#ŭ׳xª]t8'I+]#QWX3>>ζ' }ڏNڳvVݚ6$wK+Yj˦)wy?cCnCrߚ{}x ?A2{3]g~zfN(cCъ9*=Y[?kK[Y&b7GlE} F PSdѰ!?; 7.aTM{S$?L3Ox~_~>/-m~Ю/`c; Xb ` !b{2)' ڡܦ݅F޴/GyCkO s {hW֓ b$bKlfrCb(E2uo!orPR#FC/:o8ON?zǏS2'gόSmwoOg83 ~"Lo3Zw%^at!y :M-X6H!d Ո"P_&TTn">fK3.o48G*Sb=mIS||Ob9۵ 1٢%{cD*]#_| 0 !#ڰ I ڀ֠-H͑G<, bm-0 b71ycD`:l%×oY'~w{7_^?]g7~$?ECt =h=c⿢#Dk A"g"h#@]\YPn#K+] ?D%Z c\Kݣ*ONre^]s7߲|֮;u-s% GԻctF+ &3PUuIs5%Gʗ$<7p~HoAL 5g{M}w~xN6rKm7~侀t>ז 2PeR_ dԋw@.%u iR:բbu054&O3(S50௾N45vuL; 6f:3 AV|ݞp{ʅL~7n%4 !CڼGl#QPM[$sT:h6Y59hH&H! m8b0eI*GELH ۍ6Hupe}y1ͭV/K;]aL&aRDD&V1c#9/|F3Er6 !$@ iS5HU\'H RFI81 QAr z`r.h 1A',w3;&oŸQq|7[[Z0fʯ~\61(,h[%E`L@ S;.Yz(A} UԙTuӵB&[n| ]x@#GCD~NyJ]}W4g?}1Ϟyﺇ?t Ҽԯa3MtaNR^)"(*mAUirn 4JSea2Ȉ`\@<%Ȣ\ := <@3b4tLU˛Vt:k #]{8'Lv}&88bap^1z *1vыHҎuHv%s(#fRSw'5I!8Ac FKFbq<߉^Bf4+Decst/[EgbSKOKlf|?&a@20RH*h M  H B;SDA  A !60Ӕ,E#0dh%0B8)2J2q^cϮ=v EUYG2 9Gԓ ~vƳ|}ǩ;#wO|[ ?O: ~i+ty$)CA:8mh[b0B*DM!VP*hT0hДP6)Ѐ) RݖXyz=E6 ꯣ o"(Z?7}/`g4s~rO=?J_)‹_^XrI1C43 fo1AdJ<,MH bV;+h06rA$"Xv1TI^%J~8i=@e:|.ELR14}q]L bE@VlWYŐ:zK[$: j 4JQElD0牓X r 4+@"vR e,̺A1uL^4T j:%l %1.Ɏ}[LBqQ 7z C[ Ɉuu:A ٠e7 $ "mӣٸ5BR|Whf)9cE#)TF{?DJCS5k~C jaAgQyKWoP3WOn#nn"&Ut쑝k~Yb*=nӪ+yK)/hϢй8=O B17pu߆!v hwi͈E YW@x%*:FR*+RXkP 6Sd`ʠvÐ_'tR;Տ3M?.}˒g7DqL_E7~3{aƈJ.-7\qA&"(lWW-04|8bz^Cthv'I %bl/#ph0P!Lb-nO;?jn 17W563*Z!0}%D?7͈3޾E堎+Ooѻoqoh9hLz# y" N"DJFY &u4MrrtE^oh}?7>$/S/1n^m>9&W8輁ٔl9#O~i 31![|[$8b ާ_D}I ͛l|ڊDGwKXzfHU]/]G4E & ]a *>q FرHfk0gwӣ97OKnu Ǖ,w=?"OS˒HΏ ` .bb V;dg~i(υ˄!vku}_,_dELse$Lf[҂1 A>ޤqT%zJD5 MjYyG0Av!jr̈́4nhzb}>mރ#yo(L?[OLjZ!6m퐟YuMjH/)PD j rŗ7q۸soҹI3O&g>Ic2{7Pܜz>Ec)!wÀD_ Pjr˰C%[SH@$RzDn"ykbQ38 {ah;@VaoR>4J3nC;G@\pٜ4-IbVD>-Y}?M=~9m_˟64k4/n¬ƚN3J@.ߢQI&E#h[Q1_jc׺ = b Vpp;Wၠ.Ox+icJwov~l0|ȷΈkF!.D kbJ;NXYcUi}>yd)rڃ12u2"YWn Y]GVb} aw>ΫT+~S/ގ]|7wYڶEMa~v{_dqʣm|amLw ~p৊4ˁWOAƎM'ؾn2U!+2@k:V j8luF_ۇ&3Yd 4'BlS7mT1.uM Ddl#˫HC=jS-U}ǀRqw73m=?Y,mQюv)_mPui`0NuH^JQ--CfF~tROpP!֑ap$ |+FPUO]Q:-"Wd646ѿH;q1JL/m̐!2#䐺͘FF۞`P]p ;!סMG#5bYbqh]6)qjfAB= D\n `Ϭ! 2x` ՖvvH.HqGP2 "f5V_cmƗ=b5# oիeC/t0ޅi]3T Rlf0&tqw`h3&4~>Uūa u}w)/][ǟ'OO?_MAJ,Q^!561]l!b$=a֗7GXc1B7pjF]}!FH#mNFV !Qh4Lيc~6aZBD5fvDGg| ~}Rl@,%ot^ v'&qGi@]=A zL6M˛ 6z iīvhUA0s/~;b*:_gRRT!D_O(`t1iGP:`,Di/KEE 0%D08,=`\іXhB5Vn6+(aNƃE[')}GNTڄŢ#ƀYG*NsDiHӎ BH(K;j0B f N+ַ[XZA3 ͍/wQKլ?뫴Uxń5npi{%OƐu#lW>ͫ hl`0%<Õt^@j!ÚF#Ǭ&>]@q%[8 э5e. < p{?Mg@\n#P@)ZīvRKC')J[p4E@}@sc:{'Z W-R8FBPH*E=sۿDs4wzBX~> M@ІŒi'Lw81h%ZG]Ȣ 0,YަDz}=ܳ9dޭ=d{ZW[Hg lÌ+_E`| @b0Y`>-MbI{BCI?9~<`{/[tϟE-lM ɣBp`Dk,:`!F(R >e#fg%FzHwT#s Y^j(D}us-N<ÇUp/&:gN]%B:NmH[(h;G#-]p`|Fbk0YSEk JxPפ!L2&N"/9AYդ*EUlBPЄh%92L=&D~hRa}q8pX 60>-չCzW}n{_Ĕ~mYueLEsc{=3I6 [ptIc1k Q|Cf6%- GB^RFhnbeڀpm6$``0b̡1Ȋsئ۴W6#,5o[ qIDATkBSc\DrNut:Worf͕|jDAsOv+7?-ν\Zd(5!4C]A˰p\&M>Kܲ)\YDghl{MgMϲFֺb\9=ɓuS!>XP ?-h]ɬb>m14X1ۇlٰ;T!P+ꩢMp qq$0 bݹi,[;^HA!QmzQZIݿ*gaqS*LјAA\*{ti LiXC6mkAmG/DA ¼Eeqjם"S*ѧ+_*1 yEl +6"1ŝP> ,P~ KO Q Z^A4h4]% t YKg82cc wf f;5}<7fJ`zVwY;W9~R"(Hux; `ǡ:ۼݗL8siu wh!̔@Tk!j]fD{AdeX,r.,Z8iO2CA R7i6t ŮYA tO"qc:E끱dٜFY y$rOuiXB:ʗL;bK"~rGn | :-Vvn{v&ypB4¼m,>V}wP;q'] 벀Nڐ(&%-x0"a: e$i햠u ey(V,4՗IDeB v%pf~" ":y B,+¨%m M |5( ]{V;A*ZFkv8ְs2¸UZV Wu8:9}s`]~ugom8lhet25s^d((P[û6m0M6`nmQ7:ֿL~w2AF;opA4b"=,5g|Pl}g* b6J&M/Hq5y$Bg mAæ Ulݒonb/}sx@=Aۚ4A怌i&mn29\1ΜIai%4>xgh㾗w1o4NI̿x>o_m+ç#-Bi*ԅSQ̊#yդB\R z(6# A0YH'e$ XğǭeHr `a!K<4A2G}? ,?M,ha -gXA5etuv#oMSs0 [ p"Fj|'XI׽@m,[߅'QI wҵ䚏<3s GS Y֡|ʼni&Ċ)fGl!}Mj:,jG  +4ѯaRQyx4L f2X|9y"s!qq4%.hɍ}^׾|[36(f(W[]a[׹]gu@V>|Z?bϙ5%B}C61Y@ K!~T&*&[OBkѮu$[ˉ4=1(,ѳk_Y'?cO=`,֋%4c=޼Ƶyu/؟Ԍ0BlU{3*Jnf5 ? չڝ fl^..)&7N9ڪH h!냳lc@(q}]‚`ml笠8fo.܏1y9voGmvqȕkSnUL@ BeRq'X| 'xpWX9{6w毳wB#k'wLm"b뜡wIFz+^-1z杺@ 1%f BL{y,t[<fG}9A\s-=!1%VQd7en~+/NyƔiӱ>lW!^(, ~< J~<1 '`_Zg|l6FD.BeQE3~wiO Z@aWu YIୠb@v]MziȲ#Nq}l#Ab?ߣlo͊?3^#K?|%o!dSTnQ\8v*549"i{x# WH>`2!5MV#2?N#Ib3!sFX4GGL^}Wv.s}fb4j)R!Dk0'Ii`6}{ʛqc یr`x~ nэbcSlK9zgZg{[cԇL:K #P6έíyM =Cd|޹qqsΙݵc;v4є"H'w$ x)6mkw3;saN:H{wז1uJHPcYF~:11'>7rs|Wg'`7X,9GdDBvy0|ړYL}]ʹ$56mWOoegqoch-8_:3dRhdi+B?ZjA:ޮ3~]") A%xQR%HS^!!@c!x GJ>N/q1ժ<*C/\X[/ \JG4NիsH`sKGyuRy_Dr]*{Uw9~`@tLu¥7BzKgrA|B8fx3sdz9;|f *Px(#w<̋i^H!Ǵy}EMsu5|- "d`(/"zROx'f8KkzL6]\J h駨d\'9"$ǸL 3\^ڦ~[\ ~?_7 ! !rm_'Yd;ugJ cŇqIЇ`  b y`N nU7K0+B!6?}AЁG'Ggs.>.I I8;g,D#!+ Ӗs㓼=G~) srB4<*Hdԓ-.sH]'Y;I`vgr(-uYGFG:UH@h`_'YWo͉/J^Kyp{rO%2b]aK{ ]l9D (>D[VkyݗWhU{\%S"`$!&rm>(+!W>#n)WsW.}pQGb+ے[7һ]UfK`hO`;(AiD5^D-A|%Po{@QՑ* ]Dh7:UbmѣXɹ%:I K 'M놎Џu21:j:$W~vM̶m; kL'ѵ]KZ׷:[5djMܱ}e&I6W U=Ò5u5OcRS\uC۴hTۤ_E]!*L1U̼XCG@ #ջnWUPk?*CHL47Il#F̶+qD6sV=_[t1`LLtp[3bW*o_"-ͮ:xc _뒠LEBȮǢCY:@W4"Mi0m{wK.@lLb4-X1ɿ3kB\ߺ]C$=Z H;̃GCG./`(D)D'H|g >A Xz3lϱѥGp![$__6,4.o@qomgk)oy=$Cߒi$0 dMH@'<iH< 41/Md*C|0P+ _ڶ0 yu4P':&`ý4p Ěo5/3 n轉ᆈʁ9999999999w!xIENDB`nabi-nabi-1.0.1/themes/KingSejong2/000077500000000000000000000000001430012456200167335ustar00rootroot00000000000000nabi-nabi-1.0.1/themes/KingSejong2/README000066400000000000000000000002351430012456200176130ustar00rootroot00000000000000이 테마는 크래머 스테판 님이 만든 테마입니다. 한글: 세종대왕 (世宗大王) 로마자: Gaius Iulius Caesar nabi-nabi-1.0.1/themes/KingSejong2/english.png000066400000000000000000000167501430012456200211030ustar00rootroot00000000000000PNG  IHDRi7@bKGD̿ pHYs  tIME yIDATxIu;p;<1$$HmR,ORfʕDrRlERURI"Q*[*Y!$%R 1D7z7cϮFt t{yy{??p :G8kG1=#]r9Cj\sMK9?Emߕȼld1s!r.cWP E='zrFmS0r ڷid`"uǷmOj\v[eSgfئ?)m8Pzc~}soT{uܦBoҙۗ=LidJ)/3vڻq?=]0p(`b)B&֩ dkzǧ l۵|ik .T -%rԡijnj͵2"N"s5w? IRY[ 92DJ-hmivﮯX8K7Kv144H4zJg-Ug9߶ v–睖 (޳qEdlm"HUfF"D$Va)Zn EczSijy΁#*ud $RD15T2Zki(xE Jd{^{~.E761G3I{R\"rU8^X(MU+C?tqCW+Osrw?M%8+D,EbinSK4"ȑP%Uz]^\V4~6V:_}"ZbhimJ*Ekԋt"GzZi XSy+^g5qO<(-m F-kSH'QT2Fee?r;Θ `W|9usw]݉pbGjj-6H5"Hg6r]kO2HǴ/ cxۖkN|?sTX;-VMU̬TDs{*/y[γ[cg5.8RYiH9!^nJlZZ6-J8ek 3 o׼E#.)!Rp~I~qh#Joz w}EM<#O:Nر248YMlrig}`?%w5ZyhUbֆyN킱Jq(Q)u"KN_瞋.8p'o>jLTKXiZ-r-6lE:Ff`m!6[۶4Y"w˞yM"Љ8)ujHYHi5bTkPYXZZŎ)?y-\v>| n:-Ћu:1Zvͬ%rDgmh=O}οt:~Yo_iYe'OMCdvg&Vtb֮EhkBmOenRBPtԖW[.йW, ,:{y̡V ʡJ-D+ y_Z{~Ԥ kvu  *S{z)GVbK ^/5 "jl`-yK55s;3=.-% B:Cge+"CSSΘ[7v^lhbgmNZMMUbO6Ξ(_m#Pڴԡ__qm# \qLi.Sc[o`me&қy07DO+PcfnO7ԹSn۳ga-wP-XT\ng'' #4{eįD .+1oS*vH?uVNgY90 *K>oO+k%Nِb(1bJ0`m3zp)pϦ]ݑ9ce=j1Uz(ɴzڏHx5*ne*J3;-mJL-L,ՁR+Uj`lڦs򾩹XQӪ֖rB=K3FR##ȎT g5e m+%׻c%,eZwO2uEme/xQ$ErGe׾)C2Zmb*_),u$6T:+.w`fK: ZYB?K?=gLXd(vNH=922rNЛ=cĮ 3}JSơ=֖2\le-kI;g)id̍zr#{n"}gmX VJs-C4vM"\lGiK44J,n*u斶fb7BzԶ\$ӟ`ݱ4ku5xddDc,Hidl+p%'01wI"D-(LfRR&3S!cM۶*t}N-R  Zo?0r SMεzc#XcSD$H%֪O*LP;mԚ["ȕR;"ecY-κ }MڷUf2#XdCmm e,$ RPT L|'~aOYk,-1ˌ,%Z'l;XԘiU&"koK'[xݟY$"sXn.JTrKy8߅-+ۖ"MR J"74ke kUbZ˜: g@@, سfǶ8g;t(t2`mHP0K°U \0\g.2Q)"(,Hbg\4JZ&4BS*Z'lgh}bce ,|_lGlFN@nC+W' Ze"aRR!jĨliBmGZ*tFb̏ ?P66 EFؔrmSʡBV¾V7ag- }JƁZZٲ) gSSCLmN(mq,~zsmR/6RVVV&:6yvYlK4V6 --sBkfm(l&4>-8BZY#aIX<#Іl+J#{r4RNKVZ3{aDTbxTl<}bD4"[?xffZEXr,<#H/77*zF 4IgLZ$Db3 Za}y+B@,׭dyX83a}L S;J.KZJj%b^Gi Z5xbR449V"ӊE2V֋ eZ"WTb;Z2UDrP"ݯǖru[0z 4ƖJkVT RUn)eΨZ#ޑu3:6F$lXRX)V agJSZ4 ICP Tb%jڰy!њ b)5?f 5)&D&ax%҉L$"?^5JHmaXR'34 ϭ}Ç} tjE,7/D^laHpc3N+ 22k5JKYhzq C*U?[] @! ~RZJ$9RYzI;:4M'`4m@ыz9f*C8tu%8:*ڙ^q(Bj珉*Lbo z qPlj u_x0.=V7-ЪD*Y}G얘.P2ujL/ ӧwma'mf*bH?KЋtFt<ȹ^u*(>>Q HFchbo*Vk"ks 7H"?:J4uBR"׈\UJDz:HDMrlER3⾠ކb+3iŸSh·`FwoҋA߭Da24GQ83pR2M:&:[k"uVx*&a|``m^0lIDV2nmr#^9Pn A&RCmV. Ta, ig{TD!ib]N|"B@|iV V*<恕"wuhXoa7YjtmPJe2(dֺ 檥pЇ`Z)MK(DZ\j<҄#JkR ȶ J&Qڷx@Cp*l=.SL#2 ^ctC&۶% 5jdz+SH >W8ž]=O* U*CkEXRyR™SeA ^A 6Q.K(>C$J4<ېUj@mVV;<0UZ<^q @\@bfxQZ% 3|ӗjRJ"\mX/eR @o*3?NHc.X>| lS[ ~x)?Ah6HZY4[RP6U"XB$ٰbO9|9w֎L wqvHݟ NަNcj27u'Yv8tAm# pZ0Xlɱ[Jb4dD0~) ZfLkd~ǮڥO<t0 Z8abKGD pHYs  tIME  6$y IDATxڌI-YvDgVV2K@$%SlB"E[LxgyJyb0x,lÖeEHV,VY{۝6xwĉs"pp=4^k905!\WWL'c9GU1FmRDV)D!)C8J(H]1 p??D4ZD"1F!+"mk>E!P'<9{n\>,͔1? ) o _}ΞSK !bU7(Z㽧k1L&ڶ%wDG|px1NEzM۶ !s_q u iL) -' ]C -ε)1 R(iQ#DbVB@DBipuF!B !] b6-7*B$=y@J6S L A1t1?(Y4튓;q|U],ԗTULj9`S #Π 4hmֆdL:Bx1 1Q!]OH Bѓ.A@)V P@ FB\}CDQApՈ(|L Z"Rh wmu6-! tSP*-BL.ߟbFD@r|S\|lu 1"rrۼD|2Ɣa 9Dطpu5b"%GwO9uyzyIiGrĴ-fjRw^B^nM/kG\]][A'-!@ Q,OUU}/J/x"{Jҿ7=v#rWzkKLUG"JI#=uS!$+"'\`"1xTH_޻鹴sI AQ|Cڼ%AHkX5[K9U;ߛ|b~]_Z<']>˰_僟߻oPi%i2tՀVHhv%-&7TBP:-zgAՂ֊#>3be Qο`zP*b(q!c58`ʙG2QT <-*Prh٬J9y|gP"ٰUHSRgM hOUDJhdiT1)%ppQǼQ``98~N).MC"P__o5T-yen.i 9(,J (Bl1FӮ TUE  >**mV >/ﭟBlܬ /?t>mA J:z,u\ !F\(D. ٽ'ѷYc0+H_>孷|/7ܻuV{8[YT{xO?o~ e fꪥu ..@ZlaRi' Ff|O1c[% T -xʃsrŧ@G ۴!{ ?|fβv+ĐfmE" (EމPFPʠ$W@^:i/'z."x$h-! MܒƨQbPB6EQ(Kqs:e5@G@B> AE(1$yW(:x~߬X(~!xMɷZ^{s#.*L, `G3hav>{'. SKa&8kr`\S$H.BN@MJ@THeAߙ1pg+1'`'ԉZ4" AUDQ"#!$Hɥ t'}r#5YYnN'0!\ܒR4(0 qO>|9N^e<pd":k{AZ~G|3ssoL(혃Y8?wD.a3GZǬ̗ɐB|^ZT*!6w.>è`7hԋBId HѡETȖ+(b0H*Q 4%ATFJŜd?G$b y4PJ xѠy e ;zMXL[V!xzC#UuEZ>~t:xNƞzϟo0LvF UB!`9t]>Gb2؁8B>"Cb? iShkWBKB:H:@!TƢ{cT(rW2 D2AzDTXd(t5$TW ޷QX:m.8B|>?zMEl NZ&C-(Gc#71j6e F<6w٤SJB Wdb hR&/1s6o$A֟L忥',P [7& Ob{Ayk$2 1O9&KSI"E5{]$Yo nF%KQ(=ؗI(E3(0>ӿ᳊z5S%]RQтFXw;Ѵ]Q)inN^:_LMHhBh"ĴuB-Zm6LEI+v!8 ŧ΃d,yl31Dӆ64˟Ql)a- Q2- ʍi1qŭJ{tSD[Mhb@ſw?5^ +g(g[.lB:E[aW0K/ݢ,TՆウ}O>?[P)(:MetIn&(>!SyN@!@2ɟZ2/T1SQt E18ZO%-Q-(%H*)+Ob1hkE'"NŹKpZ' $:pm2D ]`,PcCkC5=幼̿++*s|Ͼ`d4{s\\?wryasqWo$8&6s jҴp އ|z& . GI6λ4(C_>AؗZr^$HZh+ Xʟ>;!>R>}˷ r | .UZ ;i0җ 1FaZ0&`J0^UTgcCP "u bYR Ӈ<֖oExb( kk5QLo6>sL,pU?zu(m2\SNy,]?aF8Sfe^y5x/ц珿 hlq|zuS'% pZj4ZUa dxW:wuX -xzQw<[I0E!tb3Ƥ'V)b&nTbBЛ]icN,rZ2֥(g,_dͦG8?j>/Z,Zn8ut>Qϰ/}br`cj8{6g{PGx>_sg\` U./(^Lt P/։SQ{:3wG0`f8пXepXo=A2Q%(҂\|)hgǞPOP FQ11hZq>õ M u8>ȪJo0G{fSZ8}5N9?яJe {LJӒ=`l=`CiZ-'%]u#ZJp6.Z|a%a4䍴 u7F#fƁt#tM`Zhqe9(B^ŷ6ƠG!£}/J]`,&(zƧ $zVsxpzrjASh*Gi0fu2CS9R 7.Mjkǖ; 8D0t;5Q_ZwMRn.̼ȫЅ`0nT]T;>jzBUTZe8O=JؾWei#Er  BG66~r mSJʲGh ޷sB 6gKFڵKl1]omi>B4*+6Lww&?*ܔX߹5vw2=V E;Q1XDP4>,_zKNG<|pWx0i84 =(sɝuk6ƠܟN*u#&H Pm^GCX8Ng4NMB150$^]?"Bt\OҮɻu@vs7LePq%{D5.bIPJKTx@7$a*$duVtLǧADHDhIL>h6l=N'Uc]RX- ߻m mmi7 k,蔸jhr]BдIB-w}K݀w;`:Ew)TĨHY;BE  %יqmK.#&5GO ) ֨, .5MdV#5`"PD")hW`Jłu]8|jj6a96=Z F j m(GM*D%cP'An$"r2e Rc -R)AzBB׿v N@z( ).S45%&Z"2P!*Y>KrJ:z٨B^ϑK 'ѐկ;x{Sl*taQV b]2#;p._$'nxH78Q,NʞEmw+TJ6, m,mvOhPR$Qd=\r}׾"[ZЂ17আ<%>$I+6K6Oh68Z3"uk|RK@9+PBaJ+pMj¦cl(CƉ*{ʮ@=| ; BM/1n]q*ka01po9!wW"אH$]hRBȶlI .&7KJ*cAef4, McMc[:EauSMMh֖j<'a\C O5ŌMIjj[kXlX8uzQ݀*k%u΅}Kw [}U<;{L/O( CLDQi56Nĵ({#)1us$ zkWpr9*#h[fz~=Loi]',W9o[h&oڹH}hp5*T'p92ÊQ^`3|uK0k w#snQ4&LH [PńR7RWp1o}0D-ZR-7:9eƌՈGs>{ ?m)eY_.OrͭuZst،.Z*OVӕױ.WHJkrwe%V ZǤu*R7H?-b}z"#D^#y17~ &d~Uх @%[hm,eL;}7^{ =xg'1>?_S]=E)ƴ/h{cye\.Vۖr@MaobZPu9 = < !dn+RUO%mGKJ 9bAwF' /zmԛU_wuGfr )O&hv>O ؽug_r:S՜&Sڦl؛y^pF>ϟg S`5alm$7ð>x$sw3CH(Tޱ]d0My`WiP\;4WniG]ٺ_U UXEٙ2a<SVUj"O3sUbZc4(i_ՒW<3&1GG'5W%>G/xf?|Ə{|{ߣm=+ ;foZbRz.*Ҳ]&Ԫ/n|Ѓ`6G;즁dsFVqSGm14}Awdj ;ӯzAK˻&!dIyNis~ow88=6Fp =cQ] wof4*Ǽկ>K=yx\W`o4ý~1_>s_\αVc7mEUymFァMvm[ƒ+TFѶ-Z[k!m\k G!zgOJ(ӻۻH0}b^T-_B0㘧Z1)u DO%9=٤u3Z(ePe$G%ҴSMJg`Xpy_{7xe7f,Z`2S ?e G4ӓ}kRͶ6~vYSާ }|?k-7yĬ|3+3ܕ]ufA (F`#^$f tQ2h6LS7iΑĠPrit>BS;.;& />@p-(V9W( C[ս 㝯hՊS&qggA`\_+bFGPk:j@t*{ݖɆ z$+Ǻ2yP#m_Ҳ\΁WpS5i^%5bϟF8?ȽجLQhGYkhޤ Z;NPo-~vӨ+t C7D8;TwDMO! A"K# .Rk9@H/&hRM`M)tFۭWKv&DkcK˪PeJǺZЄ 4M:#kPkh"ں?C%{{^'˳@O ޻/ t )MQ]IWvѸQK&4.eVq|xÆۜovI@Ř-:' ji4.Q*]@gh]$\!:ZhcPNƌ#ʉnVjX9(Xl6-mQ*PojzC9˷{X)lf$|CM =׉c7Te9`9?,[kmvbroc cǏFW ?ɺM%kxt$õF"4> ^`V#!ur: e`hZ a6cQm6\Hh٬ܻʑ&Ow49\~k =,]hty}WaN%I7F#_x=H!Om^1ױ`n1PЃBJm*JBEY V`KB0CĖ;҈Vsڶa4#x~vAYqv('h]R&U &gPZEϿ`T&2d(@HA cJ^okmJL]7N\͝:ZsqG *$ܼȯV ܥq_2cwЛz8:b5*'R)@ixZ>M&L,+rmcOWQ1p՗bPF^l8p6a9i[i7=rvr1^ pnT66ܼ2t3Lo絻;E ~w!rCF"n6}^I\^T]O,/ګDω#jY!2b/ΰeCh(Giq.`̈́۷^86y krxhM 9+F=v֎=M[ۊ^Tdd U5Ocd;6tt9ȥs>b?m8FO׆v~No9VTLʖ M: Ɉc}߮Fzz;۹nhC.gH-(stLBiTuKa'4SOG2O9::`٠M[>:dtbhe;ꆺZTeSTUY׀nB ZBh@S7>n{+wcumI)ȹ>zi;)n^#qa)9c >lqs!( Ĕ1S&S7OYlj8?8w|cx䥗1PSw'ox%Ɩ*EQmdvGeg@&Q]? !ޅk$-gWIwowU?B]7mͅ˻v%>#)cT=vjީY}lZ4ChOzګ+ZpDUU,UvE{hey1qph88cK.,/Ƽ}fGBRTX.TU/0lÀ,ӽ//ifPȢ׮"u-~tw{'VJԼn!fH5۾BsMs q.@w\ѱ:d]v0q|Cgw}$tMSHԵPLlfԕ g*sϨ񜞞kR eihd#>s꛼r GSX}CbSyjzsP-r\j[us{>[fJ8ĥax}竡 CEw׊ISgױWLw3!s򈦿U\;h4t=#Qyf%-2(AEO\ԍ}=ڶ kD)}D;bywO/x [j~L12ds $ą^nȝ)JFJQX=H!Q=BS7^oUA#9/^5t jؖk½7 4_<Ç6+fɭ³9vRX/[3s˧ܿgo8P鑺ӝ}Zn{AK aӦi@Q 9t$0LȺ{jcҍ|wʜTj /3>"IN ss&t{%1pxr%WA1>|LqdftW^{ɸpՆ'}6#0 WhXX͟P&bC32<;oFsQ/5x9iښ9(EmhDA P^ m |$ Q4yܾ7VJwYͭ:YKTuNp%hؼema`,ǖkOV7|~}̄~Jt2#4s3bYsz>F&/~xl|˧L'ZM2&xY,Z zL9c:Ьkˊֶ/||A9~]>z P5-#Z'rBb mm $v:P, O4IZM4ƌcVV!2]?6Ũ5. YBp_Wn]Qt:8$T΍*pprVO#ܘOZo5E~Y-VܿwQMAG0p1/ ''Nz'L垕Y+P@a{7HJTG#RFRH/|c{li$4(M4ƎB Wy|8Y @DH)R/O xI̟;ǩ^ds{;̨)A?Q6͕>;v -Lq!vb f\/ c$WWo F>&;N#]DYiYg?ym',&yY0cǫ9bעܙs+@(W| zCNh-Op a+<\TB G)BG5' k2;4 T&AY|+"tVX_ TlR!i8)*V9V:@+qRu٘J걁T_,HhL&GڱVbF?2'G8Rzs+ո?ϒMF~4 aZ!j u<_߇,*>_(d ePkAJMb%) '(<`RD0[,mP:YT?==46$N961:?H@ FYlO7«_edgh18;m5f4s{]J 0egm2 c.l|U>~S/ )d# #Gч0,˫82ukEz<뷟D9%5 ٘.\RsbLެzԊԚOqĚV8.:Ϡ٘}Ng[$^cku n#G^fu+&$1ΫmjRP)Whڄɭ\B@9qtNO2LLFv4~׿d\Ġk%fYcӥ>`fFi擬Oő i؜H I  /S11X)$t)jp LwS U6O26WhCY2р@):;[,=)4 XzfHFIƣ5WAWS'G(@d q3R(}DLMrLjPuR͋ 8N3i i3\&'b?Bxڸ"#&5c+`?&%DmڇC`sy5 Tf'i!p'kMAcj`1n.B@Y]FhəV9$Xfgh˸&cGhkK+&iwdKk P663ssԦɆaH K%P$q#iBZȫsEP*EqWb|@46sd~|{Z{yu]u5LZk>c>A;dk8EIh3j E[L2Ӳ,. )ի,op1!s(O4eKGNkovCQd*WDFs83vq-GS"S o;\$'kMT% #6V3Ua9CdP =Q#dl IJ^@OCO?OVK:z4X|2~J[)PJ(9 (k.Ҩ.0;q@Ըmm6,Tg"vo%LUxZaLJgwOj|c:% C:.߼Co&}1׉S(L 3Jb2ih6'h֛z $ Esy/ᥛؘLJ"Lkvxt :79d0q}67Vo3CJkXDUMff.IR:߯3Oӵ%ǧM}0'Z~=p36*t,'Ve=M\J@ynp%n1܃z哤 %/8QĤ/iorV`[/=MT6vXir~j,E(h=٠R+sH(0eiB۷q]SJhg5D.)0}h)v67Xʡ3-Vn/RT^|č1]N, EhLd]za$)K4h~'۝pC<"bH:Wd'Dsc>W1$iJP* 1V4s׾c@A &\6`,KIb8Md)t@'@*M!18pp"p5RzwqJߡ.T *vLZ.sS @2 Lh k+>^ S8aNC$\#R&O#B5ʵ&r'KO83+gѺ~W{±x(zʤ :=t汽c2 ^ =0cuv9ssF}>R ǚbҟ8Np=MĤ&aJ!t識s41+Ƥc3e:HG8VsЁ)Ial_y t:s ~J{86Y"U#efɓ'mL桊M4#]m趢<,q̛,(EvZLK>_ӄK")8ă(̣;wj/Ḽ{wЮfuundNsrް.Kk<}b{ ϹDklYѨx$cPR5z턡3E.3ufa\ehǭ]2e>4`399MCjA I! ah1u=#IS27(VH"}Rc!͇d_od6Z8O OxA y@%0ֹ1['S#"high(7Hq鹓.iu@:HU@I7WDy ' h90{+ ѹk2DǡOkW鱚g)8RМy *D|C~{n_/>+lݽ-V*=I'lkBt!I4Vhkl DFP,k4fgתvڴ:16b֍%RIfRZ0q#Q`Q.~fwa-Jڽql(T0#FขgnzHvT}g#>QT/d~(5?b{{%u{WY[ƽN&A1$$  kSbe) ܂`>)xL,TO!N m%~wn>av_{i6I~g)I٦488cc#&OiJAaq}x*ODaLR RkhJ&#!;CCC}N7Q (8~voE8HFA{H8 ҐM;'4&,`IEc4h6Ncog,~oȳys(ѦZ&)HbyHQcLNo&M1cUт:5Z (dž檓XO)!usH$2`"?߿u\ʀSss7V:,7 ᠅ `o0`mu3(JJGm^4YȊAUl r ,2$vzDfyIPǚp˜`DQǑ](=րhW(U!y  ){;tKׯqdlgjąs|s/WQ 7nqg4.eAS d6uRoWA{^^G_mŽz"6hsdT"D6o6/LHgr@N<eax/]f2%s0)z3SӬolR =Lu;GxZ1D!h` QVdkUt("}<&)Q'j;d&;6~7GQP4ԫ4$5Q8㦯BPFq L;jjwn,s哜8=OIv66p?tIܹͨ[K1/>i܆`Z =O2qU'؃7~۰Yz0-QZM]NqY 9^9w3`u717@d`%hg4P(FfhG܂nAj8e ÐJɥxIW8^]Z>O9z6(3GC&eN>#n߽p/WxݎFFAlI2(HgD֎u簸QI#sa %Zy}*A T'="An߯3UZWߏ?4f9QmұS;N\>t0y|pkU$aHF(!ynL}XLPPiw {DYT(eԥMh@$&?n QDirpq D!INt]vcvv9tdt٩2YҥXrcſd(fcZl9Ji2+$FQ(I  ~0 "_,qno| 2z161ڱ=M IdVR3H;5W9wS)M+u^4F=d/Lԑ |Rrv nʹ1=р$Ez PHo>IȬ!\\t. Al x^I jҥ"5ʤ"biw8 |!PM2C5)Ć;D ٳ3y]VG堐,8c8G}4hl 'N&f94[Jy~K?+Qƣ5\vz;l,? 0TkU "Ū(J+ym q\< ,g"K;R,Ȥ  fW_}?O]arf ?gem8VqQ\/a <9V#~M.Rz<{,kkpUF!NY5)$K1)((iI 2 M65dQx8y (&%S!<f$?䁅( Jbd%.8֐hI7)bv0ܹ;osmן]?wjA_d{m=,R;7n'Ưay&iNWyÍ <ܹE0)3s6Qfk;dyGK8Z x1͌1)}iBb n8xʡJ!EF*2%qЮF2pF$J!+-VWtQxʙXL! x >q8b.r #$!`>A  "a)uY L"fNe,'yx{񵯱pnh=YeabnH0?N'd)i0Ỉc(KꅄI_h{5L*0inJ2ƀؐXA!(bNMl2R8'qco=!zCX|f_{g/D݂ fe?|ͷʅYtN%fzmsT G9TpOKPaKNFT$ b0J\#LJ{w-2a2AI7lRUlmR.O> H)6ʈGRᰍyLDe$vY&04lvzڲ1cX_$3.xHQE2KyoRdb+w o1=Yㄽ=Mѥ<~/ܳtzklvQzfxO:a+J_Qox~J?'(H& '[߻N~//yN>^:3@mv#~ExWeΜ:C]6R+4 S+0(NFl-n(I3F'X8| 71ķ߼?}C8uSg\_c/sEFF=6o֝5^~s,4;IwK& [8=KD93X#ɯ|X`DTG؏p3EE6Ȳʡ GFQv=c}I$5tH*#aP8ڐ7,%dFP72TBCWQ {{m~> _Ya5NH]_fvi-/S,a8 ewok8|t\8%jn^޼ė^"_emӇìDcKܺUG2٣R˝4gKWz.5?}]F"c<2'2ߺKcQm 3A E+ģ*( IDAT݌ ^zylPq}?_(*zZMT.9uK6F!F -[k4f&0u8*hQw |NDdJf0D*7˸Xl8$3Y% 25ZhEs쭵x$½Gq&ګ\s# ,>4[,oɉ<;OيP>Il!͸@cAcFs +XQѨ›?CÅ,Kc3gO#\K?ǝ[#d*dem ;=ȃ͓%lpvJ<{3>쬴 |WcENM5[cvr[gnYcȀdCXh6t%3i\#11chHPcЏ1aFB%xȨ;$&,EJ&#G2Ck@')*5V;.Y+E!A/9z)Ks"WQ?`ۣ15OcFm>_arzV0hp)MVW6+v;_7)j.SNS>;|;Џ){z$N.b R׉~zܺy'U R̸y_\v2{`>kTj\DsnSgN! Ȣ.^^Ro.rxJ@$It/L(7 ߻Gh!#MvVKtȡA´ NP%L4AgŘ#PhR2HJ.%˒MFwyŬg˃>d\ǝu%blBT*0qO64d_h d&C<K# (TH#XHԎγ7 Orwk!KYz³/$2kYhGcgc WѐfmZmJ^qbe7$'f8x_Kot#vvv9r(RK~!,>{iLK2ۛ=>S,:Ńk)76)VD )ZBD6_w9}B6&޻yG{[D!kyTe/ dI̗1~Έ!mAV)\"OMY[ ;~/xr@B'c3X),U lB:aZ.r0&0R O$QiI0A]*3r,6 n 7osw lt SΝGr";dqoΞj075E+ʣ%ڻۜ<02SXeU:-8vhhGWϽ vrMFQ/]:dn'᭟6GLq"tC揝ƭ{!ν@l,Nol1;;.Vge}M0:v|szf antJP跺BnCV%LS2WD{6;"SO VaʭTf7Qx'=s*h ?~Dc(x,XJbH|N2 3aQLgA; Ns=58'N:n/k:זS/".T6}VJ8"^QH(*1iB2 c%*1,0Y]1Dn]cSNSxs { ؔ3h4&HLH>O66k+-Ngoa B9Өse6 '8xs1hw:hWs+;oï~W_8K < Kw0SopamST :a\* gOSX^yړ>3S춸y J lPP@++x'0%HQʌ.),r?~/C}f p+ǧU΀/^xAOɓ?eQ\.·1y0GNĹSY޻qJp0b:IN𵏒 ØjqQHǧT,*nߺ^m?_ӏW߰+>W ǎ"Kb6X_ J"gO10S(LquVWu/` ]e{So\xY')7ߺʹgO0wMD`!'u ^}9&x"%c١Y/k?yj*N]olʠ㫗xwhXΟ?Ư}un_4g'j 6LRk龾> 7b+vQB)$%YdGŒ'yI9I!>)α}WYTdv$@$@tl_l3;>y{,LD])!'5 5MO`~zͣ X86mnWmzz BOn|N߱z{hTLNy烏qi},̢bȧ,* bꈪUTT"h6"d" jɷRF'hC\`#jDu4H#(bbS' QA$G,"HF=l6#}HRXF4cecH"iW{ t^Ήj}HbVVhJ͌1?ÿD-ЫDtl,. YBr$g{xg0$ܻm.fDZ+"#6* zz?2ԔURf7^a9|ğ5"e8~ -anme8V-d-2 '?9f3z`7pI|78;03?g}c ezz3QzzT(TRj;ۇO X:TJZFgΣ5\.NAUQ#FRFMJs xΞ8N.i%Js _^\_Yeae?^Fa6(dK%2Kح˯$4:'"bEG(4FWh³jl2^/dp2:F1 :mpC9#F{W7G4lA^!Kg,֫b z]DC*#V.i)e=ayj̈́ Jxg25^{#cT"x@8VI<;5 :[^Ln{;.ۿᰗ\z)M_|p?ć7n i5)4+bhH4MDB"&'ie9tĵX}݇ ;= \-JTBL'ޅd!ko~(\c8NbhAW[ǯ{9ZyVW6+4|ѧzXXZP*Hĵ/>ƭ]d 1rHՃiFQ!(4E#y6wpLNy `6I+\6Q~7Pf. E4TiO*b iY DY+'α(?5T*Hib!j;bj G%9{r!lF%Yn:݄d+eVW_"OϳMQ_W$9&+z~;DBiN2Bd6)A(W-V*4RlYG Wfu=J.W9o|2&wdԡRkx&#ӽCkqjFVQU۵LL 3}$V[' s˴8Z4KhjVwpPQEclorbj?HR#LpI64L݂Ղ&YK"$V g?D2#SX˝9/"RF 'pjkITT)M Va.SS,lPQ:ϗK+ܞZVݡbAh1p8m}>R-rDx76qU$~\6l.bTBgx2$=#ܻ@*f|xGX-8JhuѨlU4 ~p"=P#Ju YQ l {ۂZ/O̙t&d*ݍh◟"7{>?sr T>RJwr!A"-aК72;W[4JOkGn/d A7x^-*P(JCks-P*$ ۰yG\bD.&W.Rt:gfdLb1FFU"4, vH{z uo+kCf71<:T˗NZݼa0rYv-|Q$M?ݝ.džXZ^ 63B{B>D*qLVf7Q,U8;(Uj5A6'F0ꕘ DB8R adrcvg`b_fRAgБYy^x$RZLKN"f-[ƒ_jtO((PXb(vnFYB!!$YD*[Cdyq Ijh.ʇ}L1 an#QR?F!9L±v~S/"a~ˆBCNAD\*U:FgW^ckc@ωKVppZ317UL6|ăѨ)j[]-ʲ  {tasC*(qoVDrrtwQ'/I%eGb9,'Z?bbx,I'CN&T+nX) WHq:lmЬ6tw½;; 7ExO7$Oai{ R`K1P@QSަ'VLS3|~MQǿO0LN rvJE}tN3׍TRV͢WQ), Z%LQKo\J:~Rui|ykխ8|u{/sCfv}diǫ,<8@%3Ie7%,nha=_IоmD".MSAWP"o`ai}^or}{ .^3Z?t)m*N SSmS.$(Y1LHYJ^&Z6L lih`3~`K/g?2o?_rvx-£Y]}/c~v6X*LJVCQ1I%Lv rx6Hų p"TFoP.fNR(.Q1d e*=BVL`VYZ ֛; yOj ~𣟓_ N>`ljy|~t.M(ˏ#Z nNIh*G)ish׾ [L$" 2>6lyFG(%@fF6󳴰RjF&xxD.K|ߐ&~|u&#ghkTr,J)BQJTGAh2&ywȟ;pB7G[T(zLR"7X^- zhlv*;Inz=lzYoF@^ajj^~|eJ([z_ޘx.a64?FcD$)LiǦQŴ8GwIT*8;18Q>MSn\a DPD$161@,o1jIמ?Alsfrl2K0F6Ջ/[HbG>viS{!/ostRDDH&`bhMC&ENRݤbQ m>/<'ܸKzt t!Z@>y\ZR*P.(W+ .\>Mp+SWNM*kL {w0itleaCȷZKROs9L6W7y%xx@E*&À@8*|AIR$c< cl8r_;[9őOOG'&ʓ5Hf-(u"}Glo3h uC#tvu")d EL.OTd`YH3\z2l&#)`P˛hU*&'Orlk\kL ˧om(%V(-F ΎA[%WmW:H҈'\\)7@P`f:xvF\t:R)l!X )XH&P ijeVvΑ/isH"nIgjgNvO,4(ITj;{]㳻!.Jl=RVbqQHbVGN.~\%#Ͽt2:f揸ta\2˃+hF&uIţ$ TM-tJ!Ca'iƗ7,-a1ɥ8-v kS( tVE|$Ύ^'|| H Z |b~ q@"*HhGg E 8j`ٕ=̞cy7)U 8/&B*Ve1I9?B.cV\JX`.ᥨ7!\9dquoF=*f FOoj8<-YƹZWe}w5Rs3\Y?I6КT\6Sk TA]MhL\D=fAPPVZQg8v].X][E$ }aB,ba2U_?Rt3w {a!)o՘QiL"'DLcL}2ˏ4M Qz. 0vPdֳP)%31ȣ5Xx3t␏?xaG4O:Дͩ3'qv^F<١"HPⷞ{v:-vg ;ܾC,@$+6E6Xܸ;QH-EibYwPמ*d^\VpsMFpyfY[#vchdL dyEZk衻m/MQN3D3"yx{kDH L*mXtJ2>FAg8wvV;qm'7}?7q9z8>2KE bܹ%bD4Ӯ嗞3'晋)C 9 G#DMw2Os|۸m?`ue@-)QIx`<5M(K+9zٹR2dW_9ʼnnR#GTZPx)\*EVN0j2Ⱛ5Ҙ 3Fތłnl5#UHƳVZsoO:uF.ifyWa߿GΟclbۿbiqt&ŃC&ܽl TLYkX}lF$l.CR:&BӨ`R()%㤣>{臯sjbBW~'¢Q"xa⠜.2s.--Dl"Th >ѣij>QC:BҨ+)3L;K+ Tr%-#2nHhQiS($e ,llmr{hzr =l3%_,Dȫx")?J EI +9=j4D#%rzbOMxײL HD"\v'd2i5VK`ޏD]gl8w~*R JYj2[`p`gfv&&_'zA=qb[=D#q(e\ {KA]g_!Сjw9 KH3zV$zC_P.,Z [[mV"1Fq1w/_,U]XHTh}m*"$eFDkK+fn1b6Q$Mnr@2R(6(tvW%C;n`S(YXo/)/ e]G)O]8ˇ{{LOMo+v7xlj'O1s3nѧQi2B JN<.U1ȵT D'bDQ,xGZ =R kwdy*m:# :Qj\;ԕa pHYs  gAMA|Q cHRMz%u0`:o_F$IDATxb?( F`dM#h FĂKq( 3a#XĆ,5e$bHΥeQ(,t  >0p ߟhϟϟ?}#>}~s}=d@1љ3yXm\=߿%=¯W @Zg_/#X ~ω?~. a1KJ I8‑'܏ 3(x 0Z0a`E6>˘٠ /xߓg6Rb;X,h($p$t K$03,e/; _2~O?~@_ `?l`1feE@߿}9o DK xP% ˌ8c$҅fpAM}w߿(E?@ hP& x`Bt~{o |.^Y B,1 *483W;s@?o^fP} ~FwHE:,(w4Q"A%+,!#%Z ߳?}tw^"%?]= SG|zrP?~a7k /2'` )ꁑ)ک&X|&P"`@M 0;߿Oqg&A R5 C7{%e5@Eo` bx!vw9vPNH'"1KD-@إ|~󗎄O@ Ư8J&9fS33k͟7 QO1 5`}PvN!PB*lXrxb;`D Mt`@ݹ|bsA_9 ώ0=G:+$8!KPB`% hcX-|笠'AhBA4 \gW bc?~P׏n`Pxs~(E<A,,ȇ?z{ϧЄ\u z'PgʫĒ>dxٓ 61ͰXFV6p_6|ZR~h?Zx z&Vyew 70<ܿC7 &"m@~ϟ|VPJ;@+0-3Xl}6s= 0(pH;j>k?h"U@#MxEv ~ex\O9|s=1~gڙA#X8yw /_#=s>E# @ʠ4Y~n3JIDw ļE&ܼ»~g/>3>|g&0{tF>pP7T 20a22*03U 1h܄-DU s>( mf3p}7{vu ff`bf4\C_2~MCh"|4 T@{5 a@HL5;}C"AlNV~7E|%ب!f"xß$XODޞu?|_~fx ,Au6x9x}ف95g>,iOnJd0vaGJ_(Ix j& c' `C] ov ȇE@MK|P"%P Xz/ }?̬? /r,Z *EJ`x;9F Uo e%J'e8"%@QzI0k6h݇7Wke#^w@"9VX{4[P 1%7.gr a ZOpk~`|P1/ @ .܉:@U33$|@= JޗQ4Zdۯ` b7]7ܦU{@ 3 TT%# [Mt"9>4>m._.?_enPE>@$%Nn'R eĐ 8IDI`rfeO?u>hA`bzbP܃6 J,,Xfc`ndb(F>/U@~)y?i0hg ?ot>*L f L hU) @& Q?|/ &Pwo>?v* *%_`UJzDnA ;@CAVp:PDK,/ lzB#R IL3["sGsEy{Or#&Xϔ! 䁖DDFga_//88hrP,0!%`̋33x@#R HML>1ӜYa˸A>?Жl0`pQ 'x)i 32xAs>7)@1yw@V~6@c˼0hy1(wKlRA>ZpAi@}#@=@E`JذcFĘ0cdp|.(&8.@L$~f~P6)j, A6?Ir vF"X)@`t HI,,l7A%(!~p {p[P{ ,H`bp|Njg)@&&;VeA?G^O 5H#8XP.R)+[4$_mN4a-Ġ xB@XجA?JiR4 Zo 9`T pk 1 Ⱦa'vȍH^=b(BE4pUDTsu`A(WR+%vȐPuP %piaDz;`d/wFmD@f :#4 8h? # Frga4#Ra&j  Z~3ɀ~As_s hWH~(a9!l@W@sc̀6]Dch 3l׀@1s ڂѬ`(LjJ$|2r?FC % ,cԁ_hS&$e@1d @)P`$ *A%7tX/뿌.!hTf@A)@g5G_#|b| 0@ILPb/)"'@Lc,2P@API02 JQ /$FIB(o߀@43# Жl~5$%d:@ LFhW *1Dp4>}7 Wd.+PJb!+OwEb ]E5b?3Ļ]gs1(8?fBJ( JĀF 1Fqu?+.C3#<|д A.Ԁ& H q@3D48Ŧ0$Jt񣈏 f~g(aEV䣃E5Ti E %)@Qx Cv7IfPiR ' @USfQi@?=^D &b $ew*4@Jr =Xs(%@Lbk.E5+vqa( @x%(J)p>VPK>+D9jY` IZeA:mqj &8>J$K䣴P[=@r(춂(R`` @@L JUG!O&xa0n4/fO~#gz?!@1J2&PDP;meS!5p%?o;"# FFA+>(z΁)@s ?× Xr?J 됮 ' :xWcJ41T5_* $"xl-x3@Eb.4yDjxK~ %_o~ HC2T%ѫ-@L_MG>ƵD|? 6Nh#.z/7Q 7gA@OĠUT-?n# DJ8 @ߟ4DᝂFa.8b {@ otIPqXVݕ?w. 0@W|<w(mă4-hz:^0~PZf ʓ?g`#H&Z@  B#0Ϳxtgl* DX"1+RR AJ!e`Xc\  !}](Z&x @]7)13/2qPbGK_ >"_ 8n! B րӾ ~oeg؄@n ?ڿ>/_`"5_z8~P"`g0m$_!X;H>jHOT"g{8'eߦ>|ݞ|( s?(D4>`w|GX~_H @$Aejm&wn@K? 2z=>~sٖJcX #6@{@/ʁSDa- F(瓚a>No1 KI @$P@*/_W߸@UQ`">[ y<O!04<D|ò L$u@h[ pڟߠQ? (=#A r[ּzaI1#2r> I"'d~T_@śǶuK34?C3_b~ Jr?tWt2bq"-KR(AуadX $]("(C2;%1;,/χz!w_/a;(%:g t- /4XW)wvi[`VA?G*a~@s{ ~ o~Xr"@J /'$^U/$p,C"GOA tMEk, L1|5a#}bR·5H'DkS`MLbEJrLܜ 2Ldΰꐮ@}/=E/q%qDr@Q; 4 %І8,H}u@NF>F w:W[3@"LqV.li\ \*a m >~ZD hV/7"QE>zUw?Pw"PGND-@18k0&r 1j^FfIцV L4 #IxȾ}PC?S`ajͮP7s’?RZcKDء)Q>,D,&sv1>&!"#:E=rănCVgx2wbV9O>U"9r"`F:4!0R#UfX4F N`i, aUy>~_-GR9Y Z M"g@9>6գJ#'G@R"j=؍ڈ%IXf"?/* /* (* H'5hl 2ص- G<߼{EcM|P+{L[5!tXÎRtP74AT惺tPvP?v=ТY}V>l.V.;@ T@`]E.8|%Z3euf4F+P ؁U' 1v+%ZfPb`z l/4@NAso ZD`QG0IENDB`nabi-nabi-1.0.1/themes/MSWindows/000077500000000000000000000000001430012456200165055ustar00rootroot00000000000000nabi-nabi-1.0.1/themes/MSWindows/.cvsignore000066400000000000000000000000251430012456200205020ustar00rootroot00000000000000Makefile Makefile.in nabi-nabi-1.0.1/themes/MSWindows/english.png000066400000000000000000000004271430012456200206470ustar00rootroot00000000000000PNG  IHDR00,PLTEƄWPtRNS@fbKGDH pHYs  ~tIME -.T {IDATx !PZhh迄*ѫs%1]2A0?IW]ppYVF mچLJ xyYXk]xi"[.?5/K /"B*IENDB`nabi-nabi-1.0.1/themes/MSWindows/hangul.png000066400000000000000000000004321430012456200204700ustar00rootroot00000000000000PNG  IHDR00,PLTEƄތDtRNS@fbKGDH pHYs  ~tIME -70x&{IDATx 0 Ьp+dBWp}GoA(6@a25FD>NjDNBʃD $471u>;w yWղcJH~%pD@bIENDB`nabi-nabi-1.0.1/themes/MSWindows/none.png000066400000000000000000000004261430012456200201540ustar00rootroot00000000000000PNG  IHDR00,PLTEƄHtRNS@fbKGDH pHYs  ~tIME -$IDATx @Q "H`$z0&%7`<+h0b !x\rػ R2D;XǢRCtQ%&)LfS2|J|Jjks @kL+IENDB`nabi-nabi-1.0.1/themes/MSWindowsXP/000077500000000000000000000000001430012456200167555ustar00rootroot00000000000000nabi-nabi-1.0.1/themes/MSWindowsXP/english.png000066400000000000000000000003461430012456200211170ustar00rootroot00000000000000PNG  IHDRw=bKGD pHYs tqtIME # `'sIDATxc` 8SbPd0b S*TFafJYAĩӧT5=` 3`yPl!_Ă_ } F@$3IIENDB`nabi-nabi-1.0.1/themes/MSWindowsXP/hangul.png000066400000000000000000000003741430012456200207450ustar00rootroot00000000000000PNG  IHDRw=bKGD pHYs tqtIME $w'PIDATxc` 8SbPd0bOPK B.~*b6^1lj`oc8b6NHX-8-eX@MKF25,!-f)8# R\`EC΂Q0Ed=IENDB`nabi-nabi-1.0.1/themes/MSWindowsXP/none.png000066400000000000000000000002441430012456200204220ustar00rootroot00000000000000PNG  IHDRw=bKGD pHYs tqtIME $ H1IDATxc` 8SbPd0bZ0j`x `IENDB`nabi-nabi-1.0.1/themes/Mac/000077500000000000000000000000001430012456200153135ustar00rootroot00000000000000nabi-nabi-1.0.1/themes/Mac/.cvsignore000066400000000000000000000000251430012456200173100ustar00rootroot00000000000000Makefile Makefile.in nabi-nabi-1.0.1/themes/Mac/README000066400000000000000000000000571430012456200161750ustar00rootroot00000000000000만든사람: Kim Seok-Jin nabi-nabi-1.0.1/themes/Mac/english.png000066400000000000000000000104401430012456200174510ustar00rootroot00000000000000PNG  IHDR>a pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb?( F`dM#h FdxZg0@#.|\'yiLH FZxЈJׯ’gtM 1+FJH|O?0=|2P١ >]9? ~|gߏ} LęS*&P`LDGO4t#Y"]p?zoHiF>#0d 2~_I|R$߰I4$#?#PEYXYHD@LC2GǏ" _"`aa%i!h a|P^Lr>h!e>@M֏2 `@1F>%(Q MpT^ߓCz(4K|\%$&eW"$$ '$M4̤)³“ Tp1 V 54d$F48IC{;"3 D@LOa"(ALB\+8YeJAhеuck6lQ?pﭒwߢ| j|jРJC&3"  F# /H:X̬#ĵ̅uж i4Gv" ى F#d'bi4Gv" D L?b@tO8ï*}5j_6N@tK#. %zo*y~H" $+ dTUoݚ{w_n;|<70b*|>ED@L? Cʢ?3#o /ǒVasi%#kh0 DwJ&Fp"` f[,čii481d=#x: 33o7ۢfA.DBD@ToF>mpG^OlJe_￝9&K6@1Fp-+TZZ,@%$X(iƀ8%@1F'Хe$'`W¸2hD@L?@1FN4#;hD@L?D0pQ"P"O%ϸw_O;X@D'? equo01/0|LIND0bcD;g4<M#C^:煤$|x^"ӟ? `a4O4ww2_ :~d6 _ p't%sYtW@2FYDPuj# ?Q_NkRI:sk]9d__>#ß NMP ¯x[T|0n? lu/A) iA*wp ? " 6"F fbd(^JA1@T#oH y~PQ _h @ULTq;Pr fd`eD$Q00R f L/@8 ~ jGhu g@1ï+~ @@_@CSh `#%Rof#°Y3p˗6 7`6U(wA3"a@oWW}X|M*F|`C; ſ7f3/- ؗ6mhGwh} &< a_U%&AHm0!Ą_%!{9|ǒFGE@ @=Ą}?,j JK#(o4 t俇Ќw)@1l@N 0 `& @LG'%DOh)*FЉ| y$`HF>Qf`"8_hxV mM;A Xu$ FFFLdilbdbc*B %022?N "i>_IꣿMђ`PG> S0~4` , FKA @d+ `-$8Z b!h%O~`"lLy%| J<P@?:M7A X(4:$M8A X9wN5A XO`pG>*`MC'A Y&! @,h":B %0B#0@z؆x"JB 6@#$A^84=2 Xh &[D.  [P"B!&0! =JFxU0ث @, B4mʔ0Cdĉ`(G>w-7 1-Y-]~ϢE]Y?b{ȧ: n%>nDNq"DބAM . K@ @DgpV)A ,;$,*S"n4|>n,`8F>Ѐc3*,|(%p|AqDZ X"Α4hy&8P`G>Р: )a@;މ`$D>Р;m0$ @򨿁L#)A Y$HF>A@OR`4E)| qA'H"mHwH|!s3DPK`1A b?f LCA"2@F:IQ (b"-/|!w;˟ d0 j|0!WS(33NcdP~P) Td3As?zݰ1#h&@jxY'C|Fб ;v O"%%HIJ74jbF>АO8$%j>^`"`@ˑ @"`IH@@Q2@]ď;`@& %P;)`IOKg|?#-A U@KVA"'K/:)0g4GL@ %T2Duo= m> P"b~hߡIFJ@0 St|lPq. iDqDD>аM\oH 'H|ap$lHmؼ({G>аO8] ]8""a+;v戈|9TGPЈKXa@#:T4IENDB`nabi-nabi-1.0.1/themes/Mac/hangul.png000066400000000000000000000222141430012456200173000ustar00rootroot00000000000000PNG  IHDR>a pHYs  gAMA|Q cHRMz%u0`:o_F$IDATxb?( F`dM#h FĂKq( 3a#XĆ,5e$bHΥeQ(,t  >0p ߟhϟϟ?}#>}~s}=d@1љ3yXm\=߿%=¯W @Zg_/#X ~ω?~. a1KJ I8‑'܏ 3(x 0Z0a`E6>˘٠ /xߓg6Rb;X,h($p$t K$03,e/; _2~O?~@_ `?l`1feE@߿}9o DK xP% ˌ8c$҅fpAM}w߿(E?@ hP& x`Bt~{o |.^Y B,1 *483W;s@?o^fP} ~FwHE:,(w4Q"A%+,!#%Z ߳?}tw^"%?]= SG|zrP?~a7k /2'` )ꁑ)ک&X|&P"`@M 0;߿Oqg&A R5 C7{%e5@Eo` bx!vw9vPNH'"1KD-@إ|~󗎄O@ Ư8J&9fS33k͟7 QO1 5`}PvN!PB*lXrxb;`D Mt`@ݹ|bsA_9 ώ0=G:+$8!KPB`% hcX-|笠'AhBA4 \gW bc?~P׏n`Pxs~(E<A,,ȇ?z{ϧЄ\u z'PgʫĒ>dxٓ 61ͰXFV6p_6|ZR~h?Zx z&Vyew 70<ܿC7 &"m@~ϟ|VPJ;@+0-3Xl}6s= 0(pH;j>k?h"U@#MxEv ~ex\O9|s=1~gڙA#X8yw /_#=s>E# @ʠ4Y~n3JIDw ļE&ܼ»~g/>3>|g&0{tF>pP7T 20a22*03U 1h܄-DU s>( mf3p}7{vu ff`bf4\C_2~MCh"|4 T@{5 a@HL5;}C"AlNV~7E|%ب!f"xß$XODޞu?|_~fx ,Au6x9x}ف95g>,iOnJd0vaGJ_(Ix j& c' `C] ov ȇE@MK|P"%P Xz/ }?̬? /r,Z *EJ`x;9F Uo e%J'e8"%@QzI0k6h݇7Wke#^w@"9VX{4[P 1%7.gr a ZOpk~`|P1/ @ .܉:@U33$|@= JޗQ4Zdۯ` b7]7ܦU{@ 3 TT%# [Mt"9>4>m._.?_enPE>@$%Nn'R eĐ 8IDI`rfeO?u>hA`bzbP܃6 J,,Xfc`ndb(F>/U@~)y?i0hg ?ot>*L f L hU) @& Q?|/ &Pwo>?v* *%_`UJzDnA ;@CAVp:PDK,/ lzB#R IL3["sGsEy{Or#&Xϔ! 䁖DDFga_//88hrP,0!%`̋33x@#R HML>1ӜYa˸A>?Жl0`pQ 'x)i 32xAs>7)@1yw@V~6@c˼0hy1(wKlRA>ZpAi@}#@=@E`JذcFĘ0cdp|.(&8.@L$~f~P6)j, A6?Ir vF"X)@`t HI,,l7A%(!~p {p[P{ ,H`bp|Njg)@&&;VeA?G^O 5H#8XP.R)+[4$_mN4a-Ġ xB@XجA?JiR4 Zo 9`T pk 1 Ⱦa'vȍH^=b(BE4pUDTsu`A(WR+%vȐPuP %piaDz;`d/wFmD@f :#4 8h? # Frga4#Ra&j  Z~3ɀ~As_s hWH~(a9!l@W@sc̀6]Dch 3l׀@1s ڂѬ`(LjJ$|2r?FC % ,cԁ_hS&$e@1d @)P`$ *A%7tX/뿌.!hTf@A)@g5G_#|b| 0@ILPb/)"'@Lc,2P@API02 JQ /$FIB(o߀@43# Жl~5$%d:@ LFhW *1Dp4>}7 Wd.+PJb!+OwEb ]E5b?3Ļ]gs1(8?fBJ( JĀF 1Fqu?+.C3#<|д A.Ԁ& H q@3D48Ŧ0$Jt񣈏 f~g(aEV䣃E5Ti E %)@Qx Cv7IfPiR ' @USfQi@?=^D &b $ew*4@Jr =Xs(%@Lbk.E5+vqa( @x%(J)p>VPK>+D9jY` IZeA:mqj &8>J$K䣴P[=@r(춂(R`` @@L JUG!O&xa0n4/fO~#gz?!@1J2&PDP;meS!5p%?o;"# FFA+>(z΁)@s ?× Xr?J 됮 ' :xWcJ41T5_* $"xl-x3@Eb.4yDjxK~ %_o~ HC2T%ѫ-@L_MG>ƵD|? 6Nh#.z/7Q 7gA@OĠUT-?n# DJ8 @ߟ4DᝂFa.8b {@ otIPqXVݕ?w. 0@W|<w(mă4-hz:^0~PZf ʓ?g`#H&Z@  B#0Ϳxtgl* DX"1+RR AJ!e`Xc\  !}](Z&x @]7)13/2qPbGK_ >"_ 8n! B րӾ ~oeg؄@n ?ڿ>/_`"5_z8~P"`g0m$_!X;H>jHOT"g{8'eߦ>|ݞ|( s?(D4>`w|GX~_H @$Aejm&wn@K? 2z=>~sٖJcX #6@{@/ʁSDa- F(瓚a>No1 KI @$P@*/_W߸@UQ`">[ y<O!04<D|ò L$u@h[ pڟߠQ? (=#A r[ּzaI1#2r> I"'d~T_@śǶuK34?C3_b~ Jr?tWt2bq"-KR(AуadX $]("(C2;%1;,/χz!w_/a;(%:g t- /4XW)wvi[`VA?G*a~@s{ ~ o~Xr"@J /'$^U/$p,C"GOA tMEk, L1|5a#}bR·5H'DkS`MLbEJrLܜ 2Ldΰꐮ@}/=E/q%qDr@Q; 4 %І8,H}u@NF>F w:W[3@"LqV.li\ \*a m >~ZD hV/7"QE>zUw?Pw"PGND-@18k0&r 1j^FfIцV L4 #IxȾ}PC?S`ajͮP7s’?RZcKDء)Q>,D,&sv1>&!"#:E=rănCVgx2wbV9O>U"9r"`F:4!0R#UfX4F N`i, aUy>~_-GR9Y Z M"g@9>6գJ#'G@R"j=؍ڈ%IXf"?/* /* (* H'5hl 2ص- G<߼{EcM|P+{L[5!tXÎRtP74AT惺tPvP?v=ТY}V>l.V.;@ T@`]E.8|%Z3euf4F+P ؁U' 1v+%ZfPb`z l/4@NAso ZD`QG0IENDB`nabi-nabi-1.0.1/themes/Mac/none.png000066400000000000000000000376361430012456200167770ustar00rootroot00000000000000PNG  IHDR>a pHYs  gAMA|Q cHRMz%u0`:o_F?IDATxb?( XGCt !3<@MܠN4dE>#3s0'#&hh -alrrr988899˃33 D@ Us<) WVV) D@ X;ox㊍+++D0@&Js~ O @4J /^*X{@аbu@'Oa(@[4E-+,y#AիW޼ySTS?4G>3WVVL\JǏ>}(XzއuXyyy~fff?~0|ϧߐ"bAh4`~Xxi`_*a~XXo7"@_$<@&ܣ}l.|`VZ.ߋ_B|/( JA[h1D.A]>`TO _P6 B* u@1F~$XbQPg 4HCS0. x)N[De~:-]׃3-^mIͧCpcO pJ)ǂ3h%2EmVBEՋ$º6)9uc~qqnʫ?J YlO),C*L$8Q7">M{0 0)UqJ\o5a O A\{/n=p!(R릠1潙hBi{3l>FEn'NfT,]۫/CӫnmP+$@+ƴ<+O%ZVh ZuVHdfpISbn @ @m -dg h X`$!?>I1<1F _VKCNgXS80f80ԡ܈pH ~JV?r}t7IOFaQ0> Q*ܷ!"پ(J8b [ }\ٟYl7)n ~>ǝv'R7u#.lPAW.ɏWRꖒ|]`IcY_{\<>j5+08 GO>/1< | o_a-ic?GrʂXQa3ߑ1( ñͧsڬUAݩz^-hvwg <pm땖ñ5|xwgY?lɆl&a.H?ҟDԟQ:k^T-f0 I_~ xL ҬhWQӐvvw҆/CTJS>["FDvQ֙j * nrh8@OGL 1\_lpm}. d y5qFlT׉^_aR52cF@]JGT)XX g*;`L 0|& ?@20PDD>̈D%$ǒX?y= lTǦ3p20}]Dc\hZ܏cz7':vAR@,FȘP̰$ ,?@% L@eL! Y&FDwgG#%ȇ7U JKH%H[?sp5oxEO?2Z292Vt/fh-As5i!r:RB@t, phKFx+VBP%2!<0A?>9\3C" H`]8X"sh @aU+|S99n b3omKثd6-rG)`p hfADF, A \@+} u,Ck3"؇ψ\ڀB=!9԰zfwxu珟̬\>}BdJxG>lM!rI Ohlb(OB̆P5Dh2 P{6MpHtm" `Fx ^D?r)@T>u% (Q޺Gs7\ /F8:\*@e#|1ِ1!L8"kB b7@ ԡ!F ], ς:ZQs?3TcdFS q20=s \۷/ *Z _?C}HJHF*B u_xQO|'*d6Cp@]GfFb#Ai 2i/T T숃Ǭ_Xi??Hs?<%_T6v.Y }e`d=CDE޽!cXp&P5x'H|?#a31Ako@$' *zG ~H1'0@ 3Z3]CH4R 4c{Wws? ϟD\c`F>rI*`e1" j?(E>rGar> y"ko ("aAQg|xv/(!0CF@|0bT n02| ش&h_`(%vA4& xC:ȷ.b|RO n j2 _ "[Æ#>~aJ!)sbafè[PU?˻  L4j>8s>4ٰg2L" d }Ơxx"6g6`B_ \ .>HbS4v=g1p I t~}  _W =01rY%#RDx&(BrD @ ~|+f/u￈ 4kg^?= ρ߿}cԷd30"wkA9w ݇G@T *FxiZGD,j>ZC x4 Zn2@E` 'F𢎿)d?g֣zTBfA? Zx CpT~<h<- |d`/`ucd,2j32xL2fȇx?0s?ZI2C$p)@~ Xh@FЀ%!&l?HB /0c]#0V 0MyQ@;޿^`#b`06wg2410Bl Xk2BH;?4!ǒ wnU92@Q6A:4b X"AC" ?:?j? /j@P3P ^\d ÷q-F #{ 1Piπ!U_u5? H@юDv1A" DB`2}l`?t)6ZvLrq42 y4 <4 8#ZQ ) =?l(A]SPGceaD):\߁%rB,d+=P`aaZ ' Ga31 4_833'Ç/^;l .ԮG4&xSϚV?]S8()pj801nW8@4`Ltbo{zߍ t3M#إ21f9;ȢS|SZ,JwN0|LW2 *m]7Raρχ#wSkC˖0ӧI@El'qa(\t0nΎ&B$(ab"y-_(Ƒ;x_Y'+ ,z9V 4{_x Q5бЃ:U-L$tsN?!_;Z3s Rɓ獡OlwpsSTiŚ? +z;ďm< .Cz  ZNe3_|F>P\u  cAADRnPqM̌6861hN  &֟ XAvВ3x^kna? |J$H#-+B!C/Ϗ ܂7뛺2gj I?m tj]Ā_^Apu/Wq2A{+ P  oV~\ ( 2@ HXOT5ס 2 x70zx փ,aWpq ^ƀD>j\Ȁ恥7?/0j%_? *|Ŭ?h`d$j6@dT*/8lX%ALjoP1 g7"lpڰ e)0y D5m;y] #1q@m  V'9^GH$ F{=PfHB`}xX@3"'؊W 2`4xSV:g)x 5,9>~ lFH%_` J >h HG.ȹ^32Aa)DV7?:V0bO Ș/Ɩ9 RnF2eoF"0IAd5DBJFZXB`DpP?|z"`X#@#HgD +Ll @έ@J|")B!t39$mb鑁J",rS@59h~z Bn}0>˿΍$m2Bǹ~YFSJt ()i "-g6AݡS(fF$9Dc툄8lAٰCraĒ>>f&911)UaQY? ;-vAD>r"E@'Ë' 6@#p-TϺ&xH4ތV(d:7u/>=C=Yadޱ3b>_/d C((B\TM ik`B :Y"m >AρN%42 w/3!fpkݓS >¦j ::Y\   H9?0#E {&2] _OO^C ho#Ihcj?D"@eCza4(A쿰5@H+YXXݻ _?EXF~3pq2*@~G鐪܏\ 0njtd6֕<4F @\@5(n}6?r)jx1/e&pD# ?R"/Y_?f;|׏  Bwh8i`pDrG6ZbDhhcaac þsQ@;ps3xf=k"`GD@x! ;*pq醼YU'hE@U0':e3vueyʜ,'6nINi2psA`|w # Qu$<"$t$,A0 x2vT LSGX̋Äc~eK5P*.O.1<82- @iOPXok!"!򏁬U єA3Ѕz OĂ #L9en'o6|n# ,mƛt#wkXy =mg+<|_9# #wHn,FLP?`4ILDP0# r_L7@ipF#H%5! +|>ú|Gia"G(@A#X"BCW9 ?,e0H\ @$VQy"#!!WLp9X# A3i)dذA#Рl%b<cB4aA!68C޳a_ [4* Hϣd PX2ëd#ٌP"| fte }`߯Hdy$! Cdhh*a`faBD 8R) "X0y[620[ܸ- $- ٳlH91ikІg|*1z)@q8|} hPăM|ֵ eS` c+?=PP8e u) ( Eh]+72gy!vaA^!.>16vi~!73"M!5`s+8<@"<<|f#kH&tVVf?2ܾ} `x&wA08~wEFx4P/Б̠1vv>.+m`,Xx8XX |\hzRl072D=7  ' Ph_#V4`r2&40F4#@~2|Շ b{,ã;?k:Gyl|r,Cr?Id8a 8(H!AO&41cCJݖWHx&)=Lg?µ_7 ΃7v;1BJ3qd^ f€l@&PXp^b6`jG)8PI@b(/R"2,)P,Iq }GDlqCddѳImGWMڛc]cZ*)P?N}=A;e |rahq?L?QL@l O{{u~;uT7%xxj׷ xOpMO)Ur4$Ʉ $:DŤ \r!Ri7!,LPFSRieBVSyv^Y -CgZbC$Vt~M]AYpK k z~mdESޝȉ= ̔ ъλ~ % @լ?ZĀ$*L9 ×{Hg6FHoQ S`dÏo` /vtNlo)}߿𺟉 (8}~,$o*w3,]sl ٠><77qXKױm-F"vV&QI%u-K ]UM3.n>iH9fIRb!fB\ƈŃ%9pb saS3(gx5l$.&69<>AmP},{@~# c}+6#R1 -qX(rgaj;lpP'Giaʠn , Yï?!?jDJ#VR$ <#6zB#T- Лř 109h'0!3{ϯ1|~ob/ÿLV8xx2"' QJ*,VL8oQ!vc٨9q翿/}iDHDABVAKώAY՘AJNܦQ~'aSvxd&] 1 =YB}7YۚT) {꽝ɤd {Af}9/9[Wf`\ Il@'Ox5lݔlCT:OبVwkL4"I0vۣҾP7k*XRX/O2uT?A~AT]@4g)gW؂ Do/4 ?CJSmc B?pw-[ Ozb`7fqG˂6K.1XGjz=;Air 6Y Yʉ v^K@%Хal{j 3KXuhՃ,ay < l  `TaO~7`7T_ zJ?`DgG Z@/E١[V :6 47 n ᠣ@Pa]MpCFQD*ZnьsyH V ^i<΄`Dt5 PHjbk'`*xnV,h/>F̐cfw1"F#~L 6v11||!LP5Jx?6rȑSI|FHr @d6)ЭagdB^51 09l L* ppq`\)xZe0@6>MA`gDXE\*(Fa@3B~D"u@dg.1#t!O<ȉ7A:"!):jOt&d537bb(r>``ada$w!"!~*#q-qD>ȜHr!sBdV8vAH+n&~U;lD_a@R g5g~}r#$iSta'7~gx~. jF7cߜ_7^-z,ߓ 1!3cma^%Xa̕3MJ#CNmװl&zDSg Dv.I?AE ޿d|HF| G>1x`D:'P2@@$ i#"Qoa$ MJb`alHGlpq#i1fF!1&V1`FfO _>a`fcAӉ|&$qTXJ F,9q&x*L 0Pi$ z ={6> .]1Ftn )+V W J33X"pB'q~]/.( =p[] ? ?B^CQT1eʌt9 Ȩ8B/~F*#JC(gr4iv"# Y ["h )cV ̈fgDLX`9 @A k7GͰA@d.!4&+QM;uA+*FKbl @{ YAЄhV)߰?j·F:D@ȥ9ʰ^@wtF:虈hE51xFra',-j?޽}LOX0ѪFF!ǔCU?) ӆRסEiT@fɱ3a)޿ V8  6qLޘ`-zRvbXa]mU3 !OQϟY?\hI* R?UNN!0ؓA^|"H]+Kc3adDdRXgBI m?-m&p!4#+l, \> WNfx?[`w :*d mO;~wV1<$}(:dz*_T^~cPBEߗ7U =>8faddk~oǂMɢ̃ۈ9ӱ9\!mGR~1'; AjBv}B< Lv@#l'3b_cfca8y$CVn9÷ Za:hAs>]Ġ {@z Ry K@AAUX313`ř}3#\d]j322"@KvA[vYu! #GQpB!zT[G z,?/d. q!FQO53 ,A9`CZ k `ed@w~>P' 2m?Z ݁J=[ e`6HZSpՠ{܂iL:ͯAۡI4rA}F ğ/\ X(ap` ;H_~#~.Xc@=V?4>~C?"{p&Hb!` cZQE> P|lXT߿7@@b ?иdD#"y$FT :VjT 0q rK)Fw[) aDb&?,3Ck?~VjTprr2j8-KX<@SAr> Z%rg@0kGVVV/`a/Zq)d'} -  0@ cF\~@~AX*wtM0Ki:zUQ @," Tաϟ % ׯA=R 4|^rx{$DL-# Z }Xsj&h'ZƉ?V@,D3Hl&,& 'ό>`gV &ZzLiS-DL< @ l#Oq ,0c @X%|jit?F "bŇK"@'Rs{`(//x7XX5pKX FѸ` #P@Pa`S10 0/v,,,A`O`7/6?@ (@, 6ȂX9AxQ@@@5L_|9gDK9h߲F 3&`fffS h$FH 7aɀ ~_RC֣p`a@ +&zeM#s*6a ?,ih4N %,Q @%@&H97ZgFJz Ah4_ wm! @ RK`BK3q:湩IENDB`nabi-nabi-1.0.1/themes/Makefile.am000066400000000000000000000035561430012456200166600ustar00rootroot00000000000000simplyreddir= ${NABI_THEMES_DIR}/SimplyRed simplyred_DATA = \ SimplyRed/english.png \ SimplyRed/hangul.png \ SimplyRed/none.png oniondir= ${NABI_THEMES_DIR}/Onion onion_DATA = \ Onion/README \ Onion/english.png \ Onion/hangul.png \ Onion/none.png keyboarddir= ${NABI_THEMES_DIR}/keyboard keyboard_DATA = \ keyboard/README \ keyboard/english.png \ keyboard/hangul.png \ keyboard/none.png kingsejongdir= ${NABI_THEMES_DIR}/KingSejong kingsejong_DATA = \ KingSejong/README \ KingSejong/english.png \ KingSejong/hangul.png \ KingSejong/none.png kingsejong2dir= ${NABI_THEMES_DIR}/KingSejong2 kingsejong2_DATA = \ KingSejong2/README \ KingSejong2/english.png \ KingSejong2/hangul.png \ KingSejong2/none.png tuxdir= ${NABI_THEMES_DIR}/Tux tux_DATA = \ Tux/README \ Tux/english.png \ Tux/hangul.png \ Tux/none.png jinidir= ${NABI_THEMES_DIR}/Jini jini_DATA = \ Jini/README \ Jini/english.png \ Jini/hangul.png \ Jini/none.png \ Jini/english.svg \ Jini/hangul.svg \ Jini/none.svg ubuntu_mono_darkdir = ${NABI_THEMES_DIR}/ubuntu-mono-dark ubuntu_mono_dark_DATA = \ ubuntu-mono-dark/README \ ubuntu-mono-dark/english.png \ ubuntu-mono-dark/hangul.png \ ubuntu-mono-dark/none.png ubuntu_mono_lightdir = ${NABI_THEMES_DIR}/ubuntu-mono-light ubuntu_mono_light_DATA = \ ubuntu-mono-light/README \ ubuntu-mono-light/english.png \ ubuntu-mono-light/hangul.png \ ubuntu-mono-light/none.png malysdir = $(NABI_THEMES_DIR)/malys malys_DATA = \ malys/README \ malys/english.png \ malys/hangul.png \ malys/none.png \ $(NULL) EXTRA_DIST = \ $(simplyred_DATA) \ $(onion_DATA) \ $(keyboard_DATA) \ $(kingsejong_DATA) \ $(kingsejong2_DATA) \ $(tux_DATA) \ $(jini_DATA) \ $(ubuntu_mono_dark_DATA) \ $(ubuntu_mono_light_DATA) \ $(malys_DATA) \ $(NULL) nabi-nabi-1.0.1/themes/Onion/000077500000000000000000000000001430012456200156755ustar00rootroot00000000000000nabi-nabi-1.0.1/themes/Onion/.cvsignore000066400000000000000000000000251430012456200176720ustar00rootroot00000000000000Makefile Makefile.in nabi-nabi-1.0.1/themes/Onion/README000066400000000000000000000000711430012456200165530ustar00rootroot00000000000000 theme by onion from ROK nabi-nabi-1.0.1/themes/Onion/english.png000066400000000000000000000750211430012456200200410ustar00rootroot00000000000000PNG  IHDRL\ pHYs  gAMA|Q cHRMz%u0`:o_FyIDATxb` h 0@,5Axwf  V/XE-xόòL׌t:OLD)%d1m{1$dsA]SCb-aJ?C-=3C3f8NUU}_%`n (>zǤ UY!L&9%hhQPDQ%<YX~E,Ub.RR+>{_ab}>uM1vn]F*Qù,K]} 'vd˶=ZC^:x @"$K1˕Wgџ ( `bjɈ# gkwM)}r֑O|tq"Ҳ,L3jycquS޶ cFU3]Û "bD+T!l#Br8`Ghu㼞pW;Y[tLs3)Lyta=9w @B6Qt ^kKg Bgp=XJS{&ϙZɷy'gu}mSs!Ed8*WhKW,1nLþ,w~~pC>2Q9ޕ}{J_Mئ5Fg1Z1IڜY¼o%cɉOQ-' J8e4c4汊QwbDtvjb_"pA @h2BΥZ[?L=wR$B2uyO&6M7֍|#Ω:]1u-Ör_PRsq LRԨB jH,VэM@[5.^&|l[F쭑;0c,]H@CnVE1%"j)0iv/H.6'2׌rz x R QTq2>Yapa;$fy\WaL؂/|Y[8hgb"#;fLًtbYs08nBiR]%ѹץ3* Ε{i=#䇡 &jWŊF1۶IPNC~SҮ#`%B'L%80 AO"(AE4&ig[q6ccvΓI~[W_1\6-[G )%S =1ǹ9,190u\wЂUU(d9Mh{l#q_MCF,p}rg\2_Vl2>dJmtݡ-lH{2iZs>+2?-q.E5 àULA.l+PB #`4J-+OhA j)T!vf^uufk0FDz/FiU@{`&s#Ug:OQܮ׺ڶDF)(8O2<-$Y;oyP YX?jNi&v1Lm#Z 3w>_p"9F"6 a]?C-V$n]O'zQ q;-) ZxLpbfd1,*բ8T-t c CQ-jbC C TĀ0&Ҿ9P;M ЗyQ@g&)0V|.E *V xQHFx SV# .<~L` ^@ca9 OxNb{N)(aخm۾.7gmLd123gzt/C!7M *$ .HN -Dғ GŐd/,HCB u`YN0` . dA.9 7̀1%{ctҐƒK՝rs1N e^~ 9#a`fȢȰGO Xm:s>pN\J*h>' {_P/m=FAnNXקd !H;lߦfļoX3'1 >WBDS{W\; kTCkI^bW V0BUG`u $ (L# +vfggm9,SjQjtm+sxP}(G; Cu,s/xB#ͯi[ _W?J"I6#ħ7NO|$jS2F9t6`1f>if` IΗI<]9UXFE*4m4zI /e N~ *|SOdA 8hX$Qn (*Q@w׫tATuOs{rNCmHƉԷ/l: p#Nr|!4P.Ҕo7|*+|_}u;X],X%tUl7WŪ|t#GckmM0P N@ŹpZYEJX~h^`1^{Ҋ=Vۉms:p}(0_Cs=ܼƈ2 =# 沂 ao.}lӅZ"EoO.D\| !F,MdĠسѐ2૪X{326RN]u@Q}̺ Uج8aY6tKlq Za^HYÿ܇JpCir"1nj|Hq(6MbY5u@$ ŵ/g)r?/L0^@Hhm R jx[/p l(*MS c*bC`Pm5 %fH=E_W@ӱ8>@\aFXNM\ZlO}h~[> јe*te; -5q EOUy<RSuM+MXlH &g4a(J R@k_E&C(`Ұw; 5ú8ybΫCm8O5r-3 |;ƾ0f?l1B#a|4 #WM1VRRz#'Gcʥe|j)%}Xݨ3v"X$~%yδB*6Y У㓳p$[6rb pxsKͮ фK܄i @& Qԏ$y*T;ĢEOϵU=s> LY|8^NiV {,6hעͺQޒAD~8 㘶eyk1`,/\(@$nN%+mcqh;X4+TJ]aɻLkd<SKh߄2?1./Wt-OxT] G9Cډ @ CA|DR[1](){f?*Ygsga$0 LtJᰀ(mZpͬMG(5;Llb99RO[탊A)]p."L4l( R3 /ݨq\{\sgQ;49ߔSJ}9qpvәޖr'8E\)cjv,`F Au*XF 24Ђq}02x??>/K%, &y)Ib7SػJdI4/ tƞszy;`JBWA6= .U7;']kۮ xY'Qf0 C$CeJe"*0¾i9~G)Lӗ/xkK)>T<f )(:{62DTB06( *,Cmr}`c &]0_Y)e\XWm{ {SJ&}0=L:4tOK/ 4 A8ӤuZ  (p(UP{(juF|3S"Ps&~īS;4gOև HUpw/xp ,|Suo7y >? c\8&"MLS*YS)L[wҥ6ӺYD:W VLuy&׍ިuK-H:KvE3 𦸿6@MqZ:OvL?VϏ3dۻv٨mW828GaPϘWIEE/78qb|рc? @0APB5Ld7`rRDōz:=MXEE=JY9 %o !0JmB(cX7 𴶭ǥN8FiK(E?w"yzo1!4\=,$қCc^>JZ⽪Һ6!wߣiii r0{)T\jX;KJnV-]2B1X3)}a4cձ傇u[k+Q沛0 Q84-%t%)e]!"NMX33>!홓1 a5{P7eY(LMJ*`S;yv<ޅI\m]Y#!.NFF؃1Z$[Ou]c2@b׾ "Ƅ8e'0 Kgb܁a05f<8h+QQA! R/&%XAWvy3;((xA2f X s*[Mea,_p8?X,2}DϦˮ8< d?kj4+X䭐9:kjk1wg 홦yvV*.RPe5HrY)1m|r|UUB3 Б0ɻ(:I>on~!3oFjmf \z j\Ɖ7*BBGq)zwYϿ'L_޷~yvJㆎ# _: ^d~G743?]D#[w:s;Cb>=VdYPmi,:"EIlq WKGoo (1=NKuqR.+A1*D,<:klGE3qw3@..OMl}N=3GkK);>)wB?{6_hba(@ 82ᦋX :T\{ao;ݻtcU% ?oYM(L2ZZ)B4ݪB3c"s+ ˱,I ;ʒ:!F+mH =)p՞zڶ'ctO'˕rwx#HUtADRXf#a>#ʎ eU9 >C0bL&2f:j 4 CјĮRZ l o`gmڎ͹Ē!s|+lVt)ODA&{oE.Xz{bȝ:f#SQ:ګFa2Cvw(ꢍ4:%ˣE߿w}?f:,QkMVpBPE]b,=3N^p,;ʃ&Mj9}wgg!!(Vo/ht L[*KX(FDZ @\SA }(z?'{PHhf۝&,APKzD1 57JA+`0IQAjEv^9$hc9Z񹍱4LuWE|#MӞj2~EwCiE7hvS폨>W#`>4 2cpSbMCHn:LT ˲u]G+%r.[`?Cٜ}\v Qy̫Rw+_e-{X Ji6c~#j<۰.-셝Ɗ-X5ѺvSbHĮ~9 澍p{:チ~~ȸcC/ 8,+T%j~s PMz{~yupyfѓB , AjlSށwfkwiX-XU7Itg3GI5X/* (ǗX)^ȡ,Kc %YBX+j#[y;'Vӂ Du7 ׃Av;x.D) hHițAv߼Y:B"!qN&*`>%A᫘4gH)YH[)1`+l(V2M3# |cTY{@lv?Z ʅܹ.y&(麾m!wΧ#m{_P"F7͵n}?~1T9-U;.O9`KC: hs@so({\o~WϾ뺪Y{m 4P ^i\X<<¼{{g d@Uh|]vL 6Ь}'wateR+}]}rbǸMRdG Ath\|\N\`ƅ j^03zĭ4]8|Bz:+ɂNҘi, % )f4Hk IP;b} ]dCD r3i_?c4vkg,6 HH}X6$isyE9W,`=,-^,K ؊9k|fPUꟿjZh>K"bm޻ zn6d|ҋ!3f޻<\(Kn,qCtQdXOd(S'HIVUGEZA/B!Kgr ܐ7^[m'a&O We)&\ye)(.dō~Hi;(—r ;LZTV| n6s&*P&-0l: FӼ0uݹ6h6b,q|xf biph@Q}X\i RMZ"k說0*\H o3RsNrr32JѴm%;@TW=Ĩ"*moJL<ȉC:-׈$a@PHih)<*MG;>s,g"mk(t9ADB+ܭ;=4{ $DKƸsUl ؐ* 7oΛ7oe}Z',4bB- ضT-1Q*X5 d29c\̀˵ }oQ.2}7:lG1}Ŭ/܌~&'`< Mٶ 4g)L ;\|;%ⅅIz O)%gvņ 16臻U]\6 &[K/s?lڰ%okA%}$ 73 &4jpv#KƱw{0 w/G=8XP>*Fy(8%UhϠ{@l @?V,f =PŃm鐢޲'/w}to:^/^Ngρ kd VMBUm7;h. b9F(q<`$މq_GI?Rͼd[&(ȁLtf `UGeA*E!)G~ïp 0jHԣ7Pevfv!Ak3iȗ=.b˛eޒ]J$[JӃi,K/+)c/V{ hZ\x(v{-Bp>_UJѰŀ##j!2 3ZWuыWU1 1s"iA3yS<$'c0TsS_a(\J8q\1о$am~x 7ɲ=;O:[n[ 2Υ4PК2$Y@|:0iֆ4CMq,XڮL6fF(c !c&XL8tbX^y[׋w|WV_GAi,yNd{~yj iTiPn!˫^ٔ)"ĝ܏ ;"g}o8h׽d %0˲?%;e+i{.P @ `ӡ2( o p(kzۥ_*iu]w,SU-Ǽ^BJ}lPAB(8L^u(3R `r4_[i\ a hBW:_.jc)&ۮL1t2`L` i!CJT!'Sj T -Y 2IZ/I)aC_lk¥r&b:Mr|lٖSlXې{݀˞y fT@rdXTNF;:aE(2  A?ѵ:Vͪ,Pyctx }Nj^TܥEAhio.Y,yYƮ4ZXaȃw]>u9{yՙ-@ڌ4lOh "Fbi.cgp4]4=£T1Ȥ3=!$"Jt8u-S; und?m8Q&‚ {x /@hBg-ZYm&3f˄ݷ6I'8y袙a(B(A#"%) cL".˓E3+\'3' X`)9l@d,FM(+D_{/D:d;ҹ"W!IY28 7 F~ރ+ɾ!ˀdJ@;N&cDPK)]y|'-t')h~z΄1 37~̹ po,MX*|NiGG*iAnhҔtبZ ʾAis;ެ᯻dFϳ} );DC}ڛ,xtХl'U@g0%׀v=E >2TnV_$5&rchh"׷IQ&'@ƥPF}K1XeCLЙyIY= DQeu UE-РH . >Z4s|0ɎY`q>o иbӮK|:6 J;%msϡu/ߗVuLZzN=l6T½~jM'7[k;|8QBX0 WBVqfU\]xT߲ ґM,ϧv9+H86 Fa AnY($ @Jy(NRzaφ-f0 DaǦ%ADAT-PH[%t{DmMgp߀ĎY}7 Gg(7y W][) eP4m?7"~8_"7EH. |!zXAb:`6ӱ&lH|@K%""H'W w0|>}^۽{*8x")#Npd9ӆJl-t'k-*v$K uPe@C]{xO&-MWb,gbgqColx6xP_ a6~";Ds7 PDOVPٙzB&3SP?R *y0 dexkoY 060UIs#qg񀗏bj7\+p@ Ġ8y߿ɰw]7I3]mga3XuDqYУQ&-Q$#Ě"-d 8q-+ AP'1 {YV/w/ ^?!',{!yFyL骩/=, P!c1y݃$&l]zJdz4~88|2'PknIms;SWGUU`XTA?_ȮW4춛w NtJf \䵵sp$ oN]uMAd=c$6!0'8%zZ Jp?f H][рl\1@ j@C"3iam+jAeIBY.cfvwߨ0z: dpk{|DE_rDTKSytpD_%n]/UU\G8ey/CKj?OU<_-& Ѣ8uTk2&3. b 1uolI z>sHĻ֗v(\}!Mg7\^T xKd听j ߌc,H1`x7vcժ4GAX|Ǎ+mTyp9SJu u @ǵ -EE)<E/7BA(Ԙt{v!d2t yQ!Ip9g {G "n4?JR(d=<=g*q [$x:_S@6'2㨛ͿwA8@1Ļf,'xXw|Wk0 rA 1`ؓ>WrsCGcRY4l\N0f[-`Yv'Dl9ݗ0kz4n$ XZ1Lzuf8W#c(__H[["C{Ҷ2_L+ 5mWVj{{E$5Yr`6tdAU~ez󘽫 #*?>;kTlUeHEyֻ;ɿy~u}ILcb2QCW2b(8?0x>Y}XeLHrP><ǤWm*fS6b[β`4 jy;mgo@ova(Zb.~~ɡt\ RIT1zNB> $$s=unT¹B%-ӃC՘9S0GLyn7@0W@ֆV'(P{Z9}ɐir4Lݴq$fgɋ2*Q[/+^a㰷ۼENB^,?59M:.R.iA@D1a$CXJ҉-4y~UdYkR+,xp)e>q; 04I]h/74&@ca|gMHՒYaw—KQ$G ލ?&M@G+k=ȳ^l>Eb .; cp^W+gE$j*rs _S&'n0:]\OL_)^?qUjuJu{3zL&*̶Dc; kTbd[qٵsSava$B,jNxX-7@u $ qJNaH6ǷI*Shޏl\ `ЅT(G{^%|L%jh%;S.?xw`U,;gDM0]bG0]h2^i&I?dzG~ hdKN\Ub;]s~wt2>nqtr6=c~ *ˊ/8 >Z(V2cr "&\ƒ u8[jv$HDuLbIAfMn="P|ˊܚ|C'+ג0 cVʊ.qX Q` Ԉ4mI0-eol.= pƗX!k6ba$ ٲGTDk1ǒ"[.r"cj˰//qNIΒ26RD{[ Րov~vXěYD=MZ:A(ks \+4M{xy{ 'Y^'< j]cP%f*.Q8x}{I693Ac*!TY_ @g^pX@/#W C!DJH "}.~. 1זpahzkah%^Z`88c&HTíTy~*߂_XEVw2 =?,_,I$sP#xZUvv_EvY0?˿K0Ve8O(5Dy*Ux WsT)ˡ:qQ b޳b'@WZ-rA֊Q "-'W0 D& )&~:V| (BR*v\x/5)wݽ_WNv7(tG H3Ϊ{LȽ't^A SćOF%9tH{޼l+ "@# X%@Q)u1ȭB*qUpx}8*FywlᰳLW*?*uz@NGd/{[חs嬲ޝyhH "ӴWZkN[g$J@9a<3@gv A&Ҟ? L qpC7ϻ=f, Ϛ\'"4WȒ:H;v _|Q^m}I`:h <qؚhis[nBV 5w!ةv}Y@} /Ah-J<@:%a:m*%."#*vp.#3Tp4.DBBb;Uݱ~oތX=Ӓ;gRί.\0{s{gl`oFP^V %~ wyM"<.HN$AD)lKy HAz:~*tE{D54h_=rgʮ8fY⴮[V4+ ',MS=W/ozUx#J\baT?bDڋ jX+.ۛ[Oآv`=ӚTd2.67 IӁ'ge}9eAFFP28AiJ)8\Ġa]xcC㊑C#%Ca_h 6 #0DqVƔ$ LNtChU]a$-q<9׏bPIGSՃd6w8get#ݡY0IҹPA|GSFӈgl~Szh"]"uqJ+)+a!#b$V#kA+l쌚sة^xO`bai$&FuyM,vag޼ *\1+bq"MDC4^ai7-|"S=diII\Ĕ lOr(C< <-CI+IAk +A`"囌 k.^1R:Ɂט'&񃝓3x-Ih 4|ψ)ƚ NaogC>]tx _~)pC |,x'Los_? -M:1ct"//:/xO g a [B|C_X)1јЉD;.=ՅĨZqh<7 D֙?0@iM^7ǫucQ< R5~7Fs<`[x4 ,kV6F+p=_ݣP r=P>:3k]B~ʶ fpQ)U|'MDUO,qL' yvˣ8N|1sx+A^=,Iyz`".!o())YXxADC{Ѡc=m. !GG| |;P=0F;s-`ڱ ފuk7{x= SN7ߊK|׿?e'2OkCf8d> r 88X>x &*#&&CUI@kAE*%$('POƥ9w&Q :o+Mf$lX^ZhŦ\i47Ȃ~8N!:Ibwm ]vㄠW>ORRReMMt]u2^&f^Mͱp&BFC\,!#DE7韮is(+oײ0ʿߐh"'IODgw_B‰%vg` "坽ZX)}.;Ղ-yv(zpRBfŇ_Hkk &5x걵@SB#-ϗ?Rz];Yn<ݓۢ4MbYE+UgOFRn BVB!a?CSw@壌1Z$ !0b eLsqs F޽g:z3سgϡLAK\e jAۯ i@Ogcgv^XXA'lZ4R2 Ӻc!+-fH:t  ] R~X#`ii@ǿQLJՋo_y1?pu2BChի(4IJVNX޼W/[XAWwe6  a6AqRV}/_g0 &NC)!]Iĉ4i`>tAi )[J[b{Ty0d2 -+{ PM8gWQ6w| +ZlF4.3h cԧRdMX vWMѣbΗSL TQԨj&F(18> D`?CCNySiN}!J)w^2B 'h86U%Va VhҴjEWՓ#??$EAiLS/^B{3Ɩ}kz>Eꧼܮy!sb)\eS-!O:9D(S'Z jVVҪfw5 $E=d8VXgeh$$JDžFScf}X3r 21I+ngngQ_ A&6!H簠" "EW7k?n{"@Qx;(u[ZZ/l0-mBB@k kfu`'6>' $a=_5YCyx ]ЕX@Ak@'.9C7n<`okSicRV cG( > j @wݳ0 QRRr Z%: 2 ]璛0 $ teK&nj8D8~mDOU|k@H'9V |oF0|{`Ys'o߽$Lp+l+:Gn~2ZY/h eulx h%hq*x 0]pڄޛтr[;-);X cp_?~l22~ h 7d?b}4wVp:ŋ+.)coh|W/A_p5&^Gu; 0NDѺAaB[q C]t.\sK/_@f1[0:UHZݕʞozz~)\&)wt)5`ZYn-JXC4i04$Ftak:T{Ǭ)R^:0;n2{l-2m] srY~^@m~v<Հo ~Wqw!McHz_S8@'rrsnQ5ݻRKU4aBp8A .a/_? S"dȔ*lr&HX$ffg7[όAWfށ ^ =O $%E1?}`o 4[ v{u5= Atw:-m@0 ."ģ_ 59ξ7*-b&N I%${..߲,Aw`&;rEYy~>UO<5pãd4')0":ڎ_{v[9=*BDY47dl U+48)ۛûa :ŭb6x}W5;͖e9+g9Ŋ폦ڙ%X5Nd.Zy^aiL~BN~DVti` $* W/]b_, ! c`׽{/؁A8eW^N|4 vH6v,PNN_yЬ& +0G>{ N@3.n2Ν$d$%u&>s#7!qb2K`%g(E.gHfH`;AMϿ?}W~!P`;u- CA:y\`Ǣ nO𛄮BnFAy@7B> $3L9iV(eo=A1A t:ze*ǕdInC* d:̌Qx8-Vo 9nPvPiUY2^'j @Ϣk Okł8:1~Wfڨ31IP@%ccl:18xe<"So`RRSĹtgҏ?w6d]E̠ak@ 7 O` {{u|i?Nyt=j@gN!l0i҇!r@aWvٕ47BE ef(z0TT^/}ֻO"vY_rS*]0ryE_B\tF.sFmWR&n0%Dq3$8f,|M?سl}1w<?Gs5C7Q̃A )׺Q=h| @-A=OyK:e,D^`/_{yx=;uSmF}G%@YVF hiGqE5s-kDW/q!eWjhnE..QiE%y+ND +`+f>qt"#0Xmhu֕+E>>V_*+W-\AB'(`nzUdƚu>Ss! °( rF,[9HXE#†j+ZYKLCEWey 'EagZBEIFH`W3JxnQ y 1wz_)g͋jY-Kf \f6w$р[cҥ3ٙhPZr_O bN{62 ?3}wzC84{]i2&tlE`Yp0<9)ϻhdפhL55[(Gy DA6}Np74*$*;o 1>(Yu" r7{?61)yOOϟC^\ 5+ALwR -.C!AAA##ׯfg|굖3e9˗~~Ӱ{㠍?> &ୠ߰#Jtt?"|oH|>*褅5 9_2qŵxeKP&fPOGKw3  c߿ec@,::CAΟL^j] 7._3Is&&F m3̖{6''72dݳgO? /AP]̬GddFig_p O}cFB̈A| 6AxtD 3+~GY_@g+w h`4?r1ƿ?v>}sgϐKWn Dcgys2}۷_,,j>H |q_`!ft>%g@FveyxyR@/\oqD|/_ȡ,;pskA(- ĘxŃh+*BKN;۝&vlj N!M,Ox t^H<=\/k.#iZD1Vϗѿ\$ۃSW)PQԳ?&`GE*j]'4FX[eḴ8UK"h4YE/Da[m5D?tx \/gQRVlQ||0h zh C7w_?@u(?j?8u |5h03h%3&` > 4\ 4ԵE]BXCgp UP燁CHӇI.P۞[Hx:ڇr?%hLH_Wkw-; L_'N( Zq4ݦ:t : rdf>w00V( MET(B"%lL6Yfnɰ7?.aMBiLo0(Q%*:G R?jp*8t4kCxc!mޙ\s\KQ}*Wi'9!a=zoXMkIQ'pl^o=)E"n>g0!>PѲIDy'`D7f)V܊i:~ʲ璾4K?O*0d{ @ӵ CAJbn8 oKb`ab3Ӹ!aA+y?;-BE`Xb!*XM0S +ux/L@YӋmJ#6>ݣ0Yi>67&E𫈧- #&^*җ+MZZ|5<{ -žk)y'Kdx\&F:Ϣκ$Pe!wPr$D0x9NUO]a&MBL@ 1Фm9sHw5|,IY]\0ҥD<Q_(~cp"Ks j‡=yǯ(@em@gٱ=]N$cg,6" x,Ԕ F3^]lI[DW,.o NIFC.+pb^'[W>D){V|d v1} "X*|#E_*Pש%g1 @Ե A(-(7xU_b1(Tc•v;;;>ڵgX_cKr5xY "ZBӤu墱pn" 8XO^'9Ɛ<.H=$ {N#7saIQhnC qәtz?d! lԧE*T. X@^c}Kin ɵ cb L1 L$cnpo'(lkx Xiy嫿ә: P4@T]?OjUIS޽V`a<M$8=Vq)yY4j2aS$ە\-˘qE9i-SK2Ɍ9ag(&)sT$lɲ9k6a{r$U:)jI|.%qY4TE4ݰ/}oty> ,~oZ&'fۅ ꛘp}@!/xs[z!^BSIIǪ:a((X{c\8K%4QjR-),+xl]ce?N3P] JrVϣ&h>qm)a&ȇ #yJP]o{ gybeՕԦ} մ(t ԆH4p;On*bSZ-Q1adbgtFRpoRѰ$D?E*Kgp1+S׮0!ߗFE&JB; SS0}`[qn9]o;.hl%^3sЁFp9Ay&66)Lk.4hKH,C cpH_1?BOS^2jhĭ9Ta5č:t SHÈDM0D zFR#鼲^ H?}bgj18Z+3VYM󀁍!kkoMe^'SW @Tb;XOfigхl`?F=8!7::i6v24|,~s%[_u+{B0M;*sxt6agݺ >IM<,sz@,gVZOo3Q jF9=ȑp0+#򶼝@|,MT_W&!D^`Ƌ]u {`60HoHhB4TA[/#Qg0BX&"*R!Cz6V9k =kG)XA+zY@ _,J$'JH8:Ġ0mvS*noNJғQ/eH\L"ʟ49Ir5xFwcG {p&k6ju<] 0 ܲM-(m kv~@MrI;/ q8+I9fJG!'$sa2 y Qkxpn!N"eA{k 6t)zŒ8Lq-lWOVf F ڪIbKt8Ͳ|x:稖']v:ɺLaw8muW^w>*P:F)є[dAnr 1V &-zB3EA,TNoQ#>+Abƈ`L$s^E'x9=kv4u'9 :QS&FctN0r{Y=2u:T%RJTr;ujma[Fl"tmu+aILԬ+kdQh!qWYÜh.@ALm^nGEhM0Ty޾OWQ`$,$ :4& &}C.~ r~}юEF$mMkZ-Ϳ@[x=Pkj/7<<)"ƙ~cL[a}5e do9<:a ;BLЃ$q`{Bpm_ا 7)ʘ&MG-HK'`a+!- X{5WFFYb1zŕ#Gm*J||Z70u90 r"ݖɓ$ٶ˯0c|Rvj0 l<&}3l>m D kF#);<Fcg9?ĥ4e>dua1b.ΰhI D05ZƓz;cPh+qWJU[Du?X^;P؝`„s+"OP\D] 4viuT]2"Lb|?gE OI1qu׊yEcˎMaͪ NNOd3"6`aiwR(7 PY>r<@6ogr3#P@6 Ng/N%6`K`I) tr -r#%b)/"'.\?dQ>B~g74}Tv=xXm+wZ7"H+Sg BcKmoѝy&ճB"μC&avAṱ@lŠpt piDSF,I7 D+_;onziSz.F0ȸoXȑ7y(&PQ0 yD@ץ^c0um90l} 4H7%vhډ}}&$s31ŵ,$Q~Ny8#쾈=*ww̵7xUDѥopűG䐢€aJ( GZbZ^3S^fCfF9LQ nr1۽REJG%L+S0BAlMچ7@1E~oC]=?@h#koppV #^3U.X7D[]$7K3rҦrM~Vi:I1==V4g>eX>MM ! T5j|,}c*|>%1صxyt<t:00& K !_bceR inUSs|u(dGVE\QqO džA҇=tIң2T\E-^Hi+˺\a8Р P(.͊I ƅmQCf7 Ғ<w9.Q,,3t9 a[1BEė"*WH#M$6P[y\Ƶe}%[.V]Am N}wt*¤]7QKT|dwy1#Ah\HcnFНHB/v-}AHAzu R/$[hh?aƱ1󥉺ƒߜu.0УjNY۳gm Ù ]#N&O]xȓW5& h]촀r"!pjٙ5Ioʁk@@$;3bY!E0Jֻ َր&+z? Mc>ըl~s-#,P &ʘGGs@.S$/a Gu|ft;_eDuc'\\SU{ACXQG4t_^$90=TAìʖ, J(t] +Sg AIG.$UT:lwu !&?iP7ɘ젯(Dl2F!|ӷ]4K9_'bp~?$N( HUW?>Dhq19. IDLP!pZHY|'(\g yAg$VE|"}( t9Uu>}Iغ,g!T̍ㄘ\_2ihNI- $:HH/`vR@ƍx W N?؄C׆jbGd>_:e6RYYg@SP 8v~-N H1M0w}J6Mn$+E*Yf8kv8HŏՌxƦQ">NH1Edκ 3JҒ5y1 gɺ p&9_ު=lV+FSg~yU(#f!q`R"$I*<JX]. Zƻ? z0 -At&n?Ҹ,K9-mzuzq}Nx=8տ_W 8fpPFRk=esήf\Xc{ R6ޢ\fE X 鏗E#%S҈&$m2ꞟ=? qmw64/$lR||tiv^䥁]Oc.*GYzTE}A|U0zCǩNjHy(Z) XAM3JULd'n# aH44~x#ն(!xEyf}X6 @bEC }'t2>@fv ٿ!S[#`."ŧa/`rxFsQ&0B$|*[O! 0MjUST֯gԧټsk+?|q"sckEQ0CTЖ8Jz1D*9_τɺ\^,f̩yiP"WʄQE>lEuMw:{Pw<:MpvtNF}/Mr&+e! FQ&3.m( }(OmTuLz|lO&e;hl^;SPviagOg0nrI"ϊ2Q Ht~|~u=H"p+hQ~$D*`_iU7eY/3u-Cyj3{ӕX~vD(!fD7q :6`iM.s1a-d#*A+y8(㈏Fk#e,iz{H2nQ;oSk-buF2Uca) @b,5CQ4P Qtn+#ڕ+WlE&<޻3<>=WIqGa5\BAe!e(ٿcŢR(8+pDX/]=HDwhi婇@ ۙ˲̋Ͷ`Aɂt6W'EhR!9m0/(i򴘧L)I}~jj8j)!Qf.=I'KbNenwH3`l{(RPe1L5fnRhK<_ psWHRuuUZ7}vƺzPDuu? vG=,o|o3;?~ ьAZt'2>4.02ne\U]+c 1GqwD(,{o[@&ÀfozF/Gv@>6)8{WT}"$25^]\5"wB.lpDZ%mu_?h<ዺ+UUfA54j4Ϭ RWpR',fE'% $ٷm$0Jh.a(LF(1dfEcҖ.{ D;;Id,84c2׷<8<_Bv˳K]/\ע(% T! c@wl|3ͻ`5n`Vmzp,'Nu\X)rdye6ckyMG JGa튾^,gađ0Fr'T']Xe}~0F]vtqB#}-wrөw(rMj(M!IR@qPmy`JuI&rνMJKﻝ0J{1BEdOτh1ȲˑIo%&|dsUGXOʼne^ <1"M%zVKdt8~ {Ma!SGm7(2nO(AS e2  m os#%iY+|Mˑ 2ʻ)DvAx+ )hP6c&(2ѼFG6Y߻pk?]@{]= .H6CATGHM]UyH]D%Qr __K|rbdMo6jlӌKmoD} 7IMS1/y\X" dl0n~DJ²ڜ$ci(i(?<5Fғ$%{D]2s*J_1q_[vWZ=do4yWbx"d !`˂tmM\6{nNu4s:"[N-`^X2$U 'z!@CݠEHSEb;T"9?x(OY}5#+7.ڿ)Sw7u ۾nvG~=} ƈ- - Y\&q |#GiԇaMI^bچ>rI!8CVD z>[dW~6ө!|V,݇kq\G?7AN>cu@iGP!N -s FI/׉j&&>1nѧ71Xjb"] x.ܹ93O7Z3LI<ݪ?[ ,7ϳF$IS6Ouz+Yȕd&; 7Zds{XD TyL\t-1*7(eW`t"5` Ypyu}zv~wcb\) ~uyBY lBZSTf=_g&n6qv_FZmZT}WeDiXQ4@-3Xh;v&e@.Eįp+~Ew~n AfDM$Iq)݅&w{/&|qy?L֜&[7(]i,=p8 %ž^ R*oÝnM3G!pcFi1[ 6&) ^~~8f) b) L Lp@mlsQR5v{y@=>=O5]R>L$(R$:t5 CNch$N9!&,CVۦmN4e!daP<+iٙ}QLq\~[wEMkl1q6G??8$X54(Eu i{ kѻnUյ# 3"|AH #ݠ ΖhH'F堟9%6'>/F#Z& F休BPbԒ989Y=a)1<.3mt4rjS$µn^gx A0 F" Fza@ޠVZpeЦ~@ҹ75uTĘL} ,Ke_Wm&)XTg_zvnx/]wQrMmj["{}zl"鈡5+6_~БD98`?2"9Rþj$ _Z4 kafE`@霮U֏:<ڔhPڑJx O+ֈ\庈r}` L P Riu:Sio@;oanY+J|XfO]Uw8$}rmЕk{n^+ q.aP1jczi[ʻDA1юn][?L<{҅VȌ2Ò JrONIɖE,/LUD 9GK fбiz' HcqK]/q.t<ZG%LUκV_4( 3VDCuƤ1~?QSv$,83gۜ8 P@^ZD`~,Zb>!͠ŧKw/VdX,eyL&.1DgGkom@ZyHreհ~¹-::ԼAS+c񻝪1|i0V 5]%7"ePXa:jFd佊휞t XQR*5׸&Ѥo >вWC^}ن~::BCF~29Pz4)C`Zv J0b&hSBqfC].:0I%3 Ii0Os"Or8 :@t L hG~w 5 UUS;Vr*o1(L-ȋHiJVsTtnb_ V"[@Om3݋E ծh_B \6QBF3W)$Aq]Vb91  Ky.F 2&ݜRn+҃ RAKC_&>7z&vwg:K@YT޹& 1M$eBT\a ݮy\&sTz 9_.V?kCxtBh+-V޵SOd?Ml4끺&(Bot@N2۲s1C2XLz=6i"zM2OdӨ"3ɍ҂g3F SvN!fX 5+wL~GmA %S 5v?ӧ~:L QaݴOݳ'\z2MZ]s?~i,>vNNvmYX 4DB\DXHPC]E^Nؿhuu޽lHrT<`q)`ad~:ӫWo^1\QQ4?D&PZL%2F@z+<j*&Au\cMjt1B Y?`?ZtYAz !@ǰrss< h0@k V݌Y(T$"ZDqv .m-mL@\|9gSAt ڇfQ M{[{݌'#U|#,'un֫b8fϟL沏"x Hg:A-3)~M؂*=ZNG mhP1Ɯap q*@mHa LaB˅6wA0mCA<+Ƅz7ތ5{/6^|7dH1T׺YS?( 6+ t ]y:fDĜ>?[n$vUH6llsfjc*#P8E޴[rB:D'Db>T`vJDy"*4{U 3 J^K@@Cy?8y@+X sf`5l+vN7/^fK?ݽ5ׯ^8o'DK 4i)9pdŠ+1yD,@~8xyx>es%Dz܃ I{~Ev@$55bG Vi%*v<],go}лy|Iѵ͘8ǥg= 1Y\'H 2vkzl¦DMIbW+ϋ0Sx_jqt3 ^XgVu(nN`U T!_c+VC0D۪v}4TEң_M\8 mI˦Jٯ]/K`Ϫ2#DEB|L@B2%Nl^ͭۨrsXs2sj"vt6t H !,qr_c>eLJ9 j^,)d2ؒ917 D4# @ "j #]%,$6{7#1AH§T~<9CDOJQi$:*>mkA1R^D/!σ4љ?l#lq6z(5̧Yۗ(XC…ۗ+~DJcHT4)Mm4fӬ~TsŻ&/etgnY-׍8EBX.ɡ%/XD H3H6 ێQv"ZIysࠄ9xTCM`T$@vG4{ XO0ɳ*1MD5WO}(xm7>q%; @/,$jH Nϥg>JAJyS8W{yyq@iE]s١v2k0 vez]hl^ uDz?ja( axШN/*YR"]-#=7A=0)R:܅Ih\S>/ɰJtySLDe4 Gyu˒y6 @Tcթy:V$g lB+7LE +ćp^,k$JpQn[2`7A B eM &ACGy'0F@JI+R`ٝf̼)hpT`1]4Ѵnۯ@'8~(=i*Z G4U~0K)IAirNF%%Fr6I/*こH:6|K-W_,L^ppohot)ؒ{&*pRr$T[r(F] (dѶU~u4{fη)"J;Aա(>@IQ N_`ZXMV|B)K=(׽vṫrOa%Z au;k->:"J|OHagL^C"6zA'v*42z0\FZ^$gyվ%  ߋem$T|2Ѱ^h0TUL7G=t"ӿ%+s͔lڣ{=sBzJ"p H=<\aZ3+.Ѱ#8ג}  A/xT($vgVƿ1V~ 6ApJKrmvffi򶹎qZ$!EM) KnZ!$ lMәͪE!3t\4/˾/uقza0"޻5jWRΗ u,:1 GVxP{PռIMR1c,gPxgG}s_ h&$]GeAVj:1@I{nvwgf65'|Mlm_V1/p d3Hi%чUvپiǽYˍ}<@=04U}:](yM"e,[^z9c1Θ>p7BC#NK.k=/I eLˆx3_uAԣ M<'aQ(?VJR Ae/(a ϐkA.6ăFO_ƣ?hhD%a;E=?at:]c)=h2o7kb5ÞX|Zpq+a Gm|4;f\6I%yl/޵*ktyp)e*uYh b*&/f \YY2DP (y*jKrј)ACɊza:/)9BGBW-,FO1FG\ 0fDD zg%~s3Gp]wϹ z-_(\ģ9+3+9Rt`L l05[1 UgZ˪6mܪ OK/k9`9>h>^ŬayZcA..h#~+OdƑФPcwӣ0ePd(jR.,<殡uI2)G6eAB &FѯibMD+RgEPwZ-dvE-6eˆ2fD CdiZ Ifl޺XT$G,VsQ>/Z)*x_Fk0nK&)@Un{|Y̎1 w^*^vYvC ЍpCi C]B7=u-5T bջFI3OR|8aԻ(S* GuQOȸva D)MQaᣙaDbt$y4Xrmlϗo2wWFhQt]s4r\bh< B{ րq@ȇuܬ;y W2u "qM5w[%L\%@׼*SeJH}0t|^2[7дb Y*@qfT9{ZDzY@Ĥ`eF5XD U-F@V q-K@J)88W >LS]l7#yU6K8m$>ΌB[  n[Pn*>&SPUv0p$ cځXji\o?;u>Q~1(Ngì$P`=]*cocipEnmì?l@$u"QB"C+l:v,Eq69-ײ e'gߡW?SH@ʣ,z{ewf9*/4gbuU)[i~/0N!{8fFC؃kj<6_.&O2+"Fu$Xc$)?n!<@B ~O`R:Yx|aY9ABjy}y2N߱)zig[`8IA;`C jZ I wr \3WmabBG?PPba 4Մe ,W/1o+uZXu-eE$$l ]ŃX]aL?@qy {$[6DظZE]FN Tz$*?B^*|)1,IX$NdazV8'RB^,1` qg`8?>mݢ=?k^]^vn ^eQNWn*ee% ȵ Av_6?'-DcbxphOݝ:[Qz`eCeI|64Pu=aF%pApI6Gx>-"FOS㺠QZ.xF#t`&EF;ἥFIq)7(2givfuQMU_4#)[)D@Aڥu~r-;Q転 ieTҐ+J*Dhz;M7~.&ss9GD) []7w IAA]RrEU5]tЎ(_p"{L0,3 P"Ktrp`"7.lWs8i}Y-*[Nm1 +4 f:S6'6 4pblOA>1.E@`at۷@c)PÏ7/ l[ׯF0P 2YY~|m%U`Pk޺qgAN_[ڠS4oފ y.7Й*ʿ~}` L ,"ܦ?~}%E={!!o?[X*o?|珯99ЂRKSB] ^dΦpp7H1 @[X-C0BlAP?f(@2fA "m0.Z $41}3&]0e45t{*a̽{_"^`|gD`K٬>TA(>TihjYnZi3MJ3*:+nMM=`~!ǎ4ݟ=ciu^4ts>ï(qŕ%Nz/H-}aVܳa]ԻNذie%C-$ ϑ1?kN"'ײ06 (w^6DDk&顺B,Xun.x N!F-Pe\v٘bnz]F!) tzj+I.Jb8ͳ,r1Qj,UCb$)M/,fŰ`[!9=xAu|BVng_Jfh ( 8;yi׭u)E0uVFK6I lVvvtx0 YX@df.z5dιcE}3 ʂ%łoJT#+׮ yS- O,-,!*1N=wV+yrJzx?!3ƾAyT|S]eYNvN7#wsa$N53ء|VPBfQ~pY@D|+q*:d4A˵MQ?Ry@l 2(^kn Cz;É9OhX.T7Aa렛zA0|;k|!Ij]0pqm9@PhLԓI<^F=>)hy?Y/h a;t:pj|xO.`y;Rj܁AzZU(I|:+s9O6N߂oEEsWQ0d/V/uhjלO:/b0^CqKYJ E.%AΫv^N dn=o^%ɐ7M_]MTJՎ)^R<;0ue"nFzRZ[oTAo0"? Y#eқ meoKߠh nq\!Iy8_:sa ,a@Al J$f3[:(~$; ;e+'35%Ho/ PfA%W @ă`W?ٓ 1ZZYLL@7iww|Y?tدʒ%B$L(Ca¢KGbβe 6F˗azg*sݝοQW)v@k{뮧!C/U˵BD}Z=JC<D\`XT? gDV@Ee.b- /Y\2\rl;iK<=`R䆀% &փﴱDV;ZP,s1K(Ⱥv  HKx/bm6GP$,i2/f-vH#%qpD"9" "1bz%$If2 u7۰ċhd-ܮvMǛ6AתrӋ?˺,,Jb. 8?7 D@EAK1Q(H/ܟdN@ǻ.D I3w|<1cJ@ v`/1X&;(S\,ɹ5AJz6H}(.Mۿf}u_}ddWh#p47NZڃ Dzv||,ɨZzdF 8qT~׍b~JG 0ȕ~(y9_Ik $:cA,dbĴibQ9źV҅.Q UO(QApu- Aq_z")C$UCr / $A:3TM$|LwWoWUĀ sQU HEV(hE$RF*}sݔrxdTE#K~{Ce#Ԍk59˓u`R. Ђ+>Ah8<a/IF} f<Ej(D4o?44Yrh `CT!@iՊmłIPq@9z\8vZ5i ΦI$O.?ʥ[ 7w;u՟UPUI*gv* *F%Raʄ;| @յ&DQPdKKöI ?npJM41MK#T!p<9s֔U^tJŃ/DbZȓwPW:WP>Q7\RϟƧݏtr7joI#lIZ{Yt ]uW !a\G/3ࠝʤEi@0)EU5s 0?Q+J02;w&A#Si< ?{蚎ԝòƊqW\v3&(#]Ǔtجp:Z^&Ii+|HM~Val\A2n9V Z)\m'狥.d)*D2v[6ZPŠ{ JL! @x2 m+^fH- E~2ʽng=^+)8ga/AT:>D}<.G|&VZhs,Ȅ>Gh,q}XsF4 $x5IXnK (MfBEH_Hp1*bWfn{7yo8]@M+^}|MQW}6{{9*6XܑfP D?Vg?=|n I Y$`̛{a<Ď3fa=CYu\pK6]O(fkmhV_*{E3ӍJYTNv5D-GQPU(UrbOv#)m4/l {R5z9Igk̀"je3ɄKdkiq$&] T(І%4\ wałR,%!#Ă8f&cp7 w mAzۚUn Q*ϏIƆz|繻y|'~$\]^F&B}5ʰ?D'>m`t| _! -ۢ,i"fٌTOGÙXedtH=.ty0Z/*$Zj} AV}*c wPye+ AA n]wnvz>NЮ1S>&L8NʢcAPVТi,ƩԜo>gvyu&ԨwU}lxΘP:ҧ]U(~& ѫ{p%kWJy5aqq/ҟF;K Nk1asb~Avsз: ɤ Jy_1P7 yu;MA`y6H~ӿ~y~\]"i{B!MJ:AX/ÿnJZPc^)/F2}4.D/.쎬8告; M+%s'c;V6h*[bMxh0?) b jk F(crٓ|lM$ `(ܿ͸d]Ms0h:mL;=8?yf |з[y3/o7vLR _6|m"Iϳ[V1 SAĩEدtNʛw0ā@i KU v[drzO4Ѱ z D5!\Ssyy HCD5յf6Qm&Kip\5//YF#~j|ճ\a҂^{%:xb2 t©LcaҥW ꐝ'R > rbiU8뇯!#cԹS P]#9ZCoh韷<0 %`}'hRM1S9 0e)d鼼Wi ζ A0M$ytֆsI ^Qj6U]ǻ׋g\o4 wݰu|ȉVtT<,A((M]&azFZ? bLp]MH`Ӊȫ6 )b_DynA2}ARPV\TƂ(Uʊ_裮LQJ%?Rf#{ Ăm*֥y>#Yג C"q),Ba7ּx6Kga 55qEH2\~*8^1ùږZ / r SmZާ L?}km"!Y(DKB*~!Ʉd# ?lQ5vEi򞺾k"Ɵoy&l5btAxIJW\C$;%b:mԓ3-"&c@B#hׄ?pu-A^Yw $CAtAP|teƝy;3-POGmۉ+_JbGۼ}7IA#˛DΐA!W.ڮ'Q)eG׬m!04Sx ?,AY|\BrZSU`Qtm e)X!iƪ d0K&֫6Riމ͠wRF jD5m7א\0 Ekaꌌn% SAĜqP@nE@ՈNiA_YYvJd~Ns3f?N~ЊϤQkvz -z tPUl7/;UPӰ, q庿?ʷ]%Xa|Q(&a4a0Q4?M\/"$e),D_#S+Vz^KIO mh _~ [9tB,S ѧKAJ,f.ݻ hRv;0ӣPb;m!/ybS m3KNB\])je- Q-WO 2X\0g!ܞ <"|('BOk=enyZZhTcCi)93 WB,:]{ lvm%Ƭ6fX?: 3"щvE[TQaL!x[Χajtу >C[=x!$%/(|66Ab񡺈eI/ #Q=i^kLkn4K\$7Ȅ0b&hunO^򫟨X7g%)bc[o݊r) P'6G Ìbk"{\h.c6}0̸E=FXdObLvJ@C[b%N䈓̩~#Uײ K(%~ j$Ζ'ζ;3g_PԅJ~u4GYA*|~^fgIH|71dMZWe[bD ,:M* WW)az!C%y[x9xX0^U Rxy՗s?t5H".J{3Uo?sWCOC*4݄&}c9,(hq *8i^䭓%)npL\BO+!J Q$BHjl߾7ٙ :GOnj*s[76/l̆gL Zd25!N-Rgf'˸=dP%7=uP(ţ:)֍۱{i_V%%u:Wխ?0xmYK#[sxg#, ԴBͯvD{0 Хr,X /XЉB %CW^ G޲L][@ DT5?фOT"t1%tȸgm6ƻ|iE"I[8"fsw 'i>mI G鬩뾣VIfij Uef 2{3XsR-c(ڌY%'=}+|6 W]xsM@qܲN*Sw!bx'-IickhрǬ+B4˪ܔkQ+ݎ覢hfONd`ÈE%"<_:(b}|Di(vgL]՚ȺMG&򍕗(8.`/k&I{X6,Kz1w$pd ?]Pz8ي$K9@j!iGYq( o &%@YS#gU?p>ۮ920tO; C{  pw uކyEVh`$ hB+Bʭ%+Og DaL1 HҪ r% Msֺ;?w|3)\Y:| X\qffi}!`N'4D˹@U_,;Iw)::,gF;{w=ϡ8]ܥ'ks0T C'U[Sv;HoE~59um!JľP'>L70IadMbK@AR@/QAj_B.&ԁ~t?c8`B+OWӂ DEWI"ʵKPvw&F`k4޼);̛}OZrC&VB*\{(ފz0 wu߭Ζ=x-I,#7R\ԐG5tV2 ш1ErIHUq.&Au&_& g P }iGKUUW:]'I||nt6߿ W>G `O+'ü6IرW!"X(](. /U^A|zF?kg@`xImeFAW[{D_TjY4g$z l+~M]ODC1U" ɋ 70 4C]A>JC1VРeQU>e);]Mb>NRl4<-VީI&H~[FC*FsejZn֫e sDz,>_'cr[;cB/깿//!i[2v)^xC.'ǓG]AEzȞGlc&jFrkIݙd7N3c|_\c@9eKuc(L?Ax$/.M1<8,,qPHz91C7"Jgٱ6_XKi [AZi-c{un=BғHi DS~R ]Qp \?g.$_eLR|Edѱy o4Hoyޏg.`+{,uや#nvu]f|iΣA}Uޓea Dё'մO5M\FvN!+LC蔚PdB)Bjq.:x턕Sι,;/؛cY46ܦj& \bőRK"x:( ԔUcb19.&7qw, hMaݽ<#piGJP zD?UhH2P2GhpTx5joZ}[Mx) ].lj>weiI+{Ƹ#vǃt&d%\&5R)*M֘l8]y1ʷ:?Cn,鷁jpLqCQBE!M:7|J"hrj550  ӵ DLU"&> B+Ea3˳/;cD]1/k)B%R ]Eqs^A_ifjJEkl$c[. _$!2ThO9R]ϋ&Zz@vt~6f:Okkeu]5:NFrRȹnm{gdh, Y7[bCf]1YtΔ+<>FUTeH'p WE޷y @ӹ @T%qD4AaiBwv3@nkR!`@Oƫ[A­Wvga*4Cr,o Pt 2B]#[Pph=is!:톦A•KV$yf3yuy_twi9d@n^Zl&:6ч9csg%=\o4^ Tfj߬ZzOELJPF+ Dбfة`+ek[A-衂""~H(GAHWݥ3A?{fϜuy1o 0fR>sF@涻ݳ-A yǼQv!a'MW˅L(6O]XK44<(_ⰼ 1EL\*z|oZ ^.pf,A=dWT}#>tROHj  yDiYxlUYfyvڟ|Z#dZZ 0E@jSAB`%Bzi$'Mg a](C|2Ѥ;Ssc);_g66T jK=-DO4pQ+>ǥMrӡ!( &'GZA4H.§(Hd5 dB(Bȵw3&<*Wr0c[rF8Z%*/} Fv@ xvmotlU,⊵XΘrrņ[l:>/j㔼 HaC @ӵ J1mFLݾvwfg Rv$r%1֢ f F1,~-R*WrQ$8Mg1yZBNa<=fǸgN tE n&DGv 63Rbhj#ڶcQ gh sPa|Y޽>r[fim5!,*P6>hȏJ4ꞗ2j$,= $Hmp6Oywrke\$.I$rSlʹu[ECJř?7M}أyJsӡf΀إ@H :Bqq+ekR^㸔<]A0P4!jo䋎;9\ph 8"ov;W7׌Xm%96F$yKedw\7d=KTT (!2Cb@Y5߉\(}~ά9Z ӵ A|*)-R*3hg@nvw?ϸRpݭz~m@N@%ajkV2s!*O8LAJ@$^ F6\s/' tL^n#Pf{ŲMΞ8;n>ׅg*r:{C*Dvn!<>OXw1Ua+&h@Q")9qP5$FȦ*Z-pj=N.ٽz-ڧ$h 0Q4 ߪ)>IENDB`nabi-nabi-1.0.1/themes/Onion/none.png000066400000000000000000000323561430012456200173530ustar00rootroot00000000000000PNG  IHDRL\ pHYs  gAMA|Q cHRMz%u0`:o_F4dIDATxb` h 0@ PAPb瓄:S }qwatXkSJBc4MusN cxιc~Cs]W(trk}aAaYkm| )Q#Po8@[۶ + @PxRzf!IL&;Pu&3s*Z^]}6sJb&E]88.6bk2pڈPtJrzौmA20PtB@#3ȒhBjsQݭ#"xcsJDSU W둑) =C(aW>cH@}( }8t6JD<R80 \CzY!c +9b';"6Xi&kJk u򲁾Ќ Ь?3::/!6^*s۶[ y|ƅ06Is? D]kh:prim?CּesC%Fl smAδ2xy'gv0C 9C_#SB%;@vjSD1bZ!iM@ek-*n.T>J1 &&YAOESep$Lk3vNʜpZ9 <G^GNpjEeem jhV̬(;3#<а. zVAy,#q=AM@{&$_&bIٔs>Pj)艒mH-a ln@;MSB93^BF&?;"Hߗ̜R{Y:J& +6_HEVz3^&8ԮC* C>cR2J = ~՗EN'A~FwWҡNuQzK.멸}H s03 H%Ahg{@cKU 7'#$IѡU}OwL]=ɦc)0P^hx/AO`R\r!9~ Qn¤ԳjT~@I΄ =l}x:bw:}+L oA ڡUucHhchU96ze9cJP[N=h*p(P&Y'8䥻"t*&ZbN`Me#?2\pb( {p%'C"H5O0ꅎq? .ӏMLf:gh j?.Jj(%9@1#-YAT` Raw;AAGm`1Isoo_UּP@iR58BR͝P_ ?N6i3-tW/5@5f 0|hﻸx Ĥ֬| @ǼۅrFJ͙>#X7 :}ZXdtA"fD>I$D r*(\d+=jW`|o(#m"+9eP8G̀/?PwW*ژ^5e>}8޼LG3$Ié}l/ŀ?_ AC9ך{ aC0f/) @7=w}a40 ʦo 9`]"cn6nm ScTM%nXwA(;*W9Be@im9g01yP !㞏 C& s.`O pʿEA+1rZκ^+x%e!u  1t[~\E\ ҏ~)*x&mwJ(q[cmrYkY(#8FQ@b I j .{#UQN0z|#Ӷt7G*}Ʉ'=H3eްwNu6Na7||-|_=SR*-mGḒSW9p^COc["dT~%f/3IasC[ FM?inJԵcAhJPfn`H[jYur#fb;0gWQL\H|sROawb7v[ XJ|F/`LS v]+%;kP *饐ڱ=@-*djuWuD}̀b|$>2<200TS;F(ag!CR(1z~иvSl"UbLC/j|@+ KKΰmR+-+_;JnxC!mʖBE!IN^`ԎQa 6-XT6pVn4|Ϣ4 QG]Y1QڢD?)ugz{ۆSz4E8y+fhWB#9~Ux 8Zh1"⎊b8u>̬*ܘTq A|(& E=FQgT0SТ>!SR)=^}l#'kĢoqa 9ŋDN!gH2}޽ǏEȇ0=\`L=H% I/؂8A:"](2xRAؑ.B鈡 > !6@oA;#ddVF$dM ښȊ?DvK`x@P$S |> 100bǀ#rBS… X(gφ>qYHg@B ZHHKF^UHźJ ȳQCCC`ьl$`( @N%<ѺM$<ȝ5 ȓs'F9ȣ&LiAFl H[ x {AY[h$7@ py X ?dG N:uuH[xE[ !e ds d(my } OeXqFxn?h#`h dm4Wz &<ɐQRU`$c!R>_|?$ C!$!q7&S<.o/ @@,Č#pqH*-HJM2$6AJ̲$ R@@1LmBiq@Q' ܇,LPҩ&@kB"D!'_Xہd}J,mT -!@ۯ  B<=&C`C/VNR)1;!e7 Q޾} YW{sTF' @,Cd>Z%~,ksTg@!STew+ӧOȳpOA#b!;d50@Pם@B!3<: |(ض=H?mY:1@`hZ"{/ !&# 2'Jj= et9x,$@lx-O" p0 +JȰ%XHHVH2 |d?d- lg;ж 8*%2 `"sieBZ> 6=AT\b=bB\!J˔dH ,ૻnR×g# ;ho;ph& w,דw6 3 FX j<BYHE+! !`Z;h 1jFd |%U(H'Y҂ 6 R}0'ၬTAhdP60,zؐ(C>}rdl)(d.ڹ' 6oÜDaB66:4RŐȇ{!/FnC2p\@' { RĂ%逝o;A֏@e pO ,I 00!|A4FȚ8#e5} ȎH2@,fEć~%5!H @レ크S}NHNAHBB,ٜ P@p'#'_ɡx m?_[fڭ9}qtZ08%*xΝsj0`CXTjT*cёYx~>QIUO5kI ++gBѮ?{{8$AC  E!_Wm+tzYQaL!t0XiDP e&{1g*Sut&O^qM]n` @0|޼T"Mb]+kqDH5):TVx59laltua5 Y`J"++w@ poBPPP,My/Ey^Uh3a Q&"3rMv['g$D"DAKm9$6^ =%$ɢ"`4PZY-4`zx`Iv$$;g !`blll8{,$ CZ?"Hdxw" !g@ÍE@"Qa. B@N_7cy^ҧ֥`ui(M2ZU5Ϩp Ųa~@H#ҜDt 'jǑ?P1$X{9.y13d+/:d:d5.<E M{HSRiCβoT[uL0(1¾L']@pJ^LDG>\l7!4u72.j9*KV4]ņ@$/O:|" Y2Z}xA=G׀W1NJ<_=;A BZ+4%|g{U T:œ&k +";Vk L@Η pCzcV)w2-t̲qra)5F< D\0o7(uzz LnA(ڑ%P ZѼ'N+K_nU׼͐1Zh@9'\t 1U_6뼈F{g7U'W"- #ib\Sk*dF娨StU} NA ?2B&>z W|%jksR] S""c fU ?Q1  Ij bw_C]{'4oᯉM\GS@#3 @fx]xF&CNk6 h" L(U9Cj$kf -g `A.hSY`f#gmB>F@🦸iӦ &Ȟ300 :F'Op>$h@F+6 6Ȩ i@B,!Ek÷h[ Xo&2=x')) Z%0A,) Uf_҃ydhOݐ-_!@&\d@2rTr,$ $hE@Q &HBv?C${-ZKqͪBBnྀ!`.S ߫C#Cکl?ދ͡A.: !5-0#>fË>f&\qpy̵ehDɐF ޔFˍ2VB;v8 ݼA (m1[ pJW}LzI)7J2"*̤#Snf.\o m'ޙ֕7`\nA(x0ڢ1* 'ݫ9`0>""zq73cGDwgfUA`Պ{5ڻtt.a_PP󉭙3{C3E4 XW`}23d,i1jpG5Z?z: \Tz[NJ`mZ2 hJwW3 ]h,{| Z`g$ w"O>׾)@͚$`~_H;a "T>^C즅B6h|1/ld _`v`}y>7}ɍBXk3UfCrt9 hq-* DJB`-7Zc̆x{O_@, }1ZV."#q.=RZqaD\:C38umŠ12BJ< kQ;EQ"V{fBs6z,'g@tlA(./6Yc瞙!yTx&B>2g̼(l#=?,EtAf8XPhbdNFGF)Z<lD+iy> H>(Fфb Kb,܃ .[Y$~)r@0?&MI"!`dO]T-]Tɥ!FdFpf|Z$X`\FkG+ȳĸ=: qa2p3VuCbOpa:P?bwZ ùd_|OpѨq}@|?`)ci_YhDW[m%'hhg8.xЌcj% D@rLV=Y 6Z0|s,NsfewY0iCN C $Qwr099&iңR{Mцipv) 7700EGK"uGFCZmw/`:=U >^)NH]#CJHSMջ LOGDS;c\j16uM{ڣ{v(0 Ek O.kf'nf=x[]Edo&ٹ.wfӜx Jw#ҳL@[w[\VA_7xKhAA)f@T/$iM^7ݦS1gC7r!9 $nzO$b:YiG1‡`g[i@Zմ61 2,!Cʐ 03>D|WQ z`tJCb~'P#Ȇ\ Fmeߐ&-Y_LjV9uK!|51y l [Gw@t/ o!9 fH t+P;n(QBlԆ,{g@ZRBÂi7@]SFDEE) XRn@@.͎ȑ "`J8@ۂx2 _@>A i g! e 0^1 BN>}С3b2 rFϿ21s2pvrt9K'#| sCD!c d])?ߥ ~861`\i/׮?~\m``L h526Zl90An; ^x@:h'0/DDW?/Fpq$BLF˗3̦dR Qv!Xp؃ x:4spݻv=}VEUᕓ@| U'Q!7o*jЎB;"Y5ȝ䃊Wzz{޽P,!.?#0]?b/\0F&FV6Îm?| ,=t`뷙?09޼y[aj}@@P ?_ IdBGթ Hg*]/BPvnֽ`8COHXϿ@ ?pp{9PkӧOlJAÇ XCihHR@5dD MkW4"q}R\\?H3Ub=`3b,o֭XSSA66o߾ߺy z?{֠g27GMb'!o8څ5ȅ8d6O ڸfACfT sn.!=`@@uA.Yj@gJ@SMLL?CBCݻw}/LS3SyY/_35(#@82C{ Av4@&ԐMz-'XE9wBV6.r'҇$|`TA=@ |O=>׿(֐}ڴi۶l{-uBCC}&F4d|(.|2b5G>O&_7L̇@}HCHpsYqǏ|3_`лnٲ({=a`kXf3R1۾F&\@lr= Q~rE+&8|D&ۯц@0gӐ5f[y]H oCJx H B6px2:11߿/4!Cd=D@Ï r?D&zZ 24oCҼ$|xtMz!+8!Zs`>\0M? z`ĸX,8}P$hdi; (rV xKpP_@HT~k,|  #BGHi VU2ߟ13A󈪪rRr7~V.h(' #)QB(<]!ڵm-VyR۔TRn@2%4J'e| ! A#o ,4]]ERBHW7`豓W/_Z*H>/dQ;= 0 :yEzy=z]`C3ZJBڗ%y2u,Odvi(iY ‹{9JzhsĖue_LPiڎH39S@}W4]NssZ+_ץ}ۡsWe|>XN$^D>aL6|/rbM"_Stm[d O=@qh6$4!`r8 N9xW'd<Rdd_ ?&̌8`Ξ=6{-}珠%/?o_˪? .>|)0!n@5ѿ% j\ǨBxO_x4Rr-k쐁o1]J`xtkjjDx b9vn ,}(ԳT))U’pk❗%PT+?iaeݷ-EUW1؇+/,&#=[Q30!R1kNJ H A$UB! I2@Weh'`oBm(- Ð')6PGu@0 ED?o޼adQTP461y Ȣ +hKE k Qw@-8QKWtIH4# NA~c +y  @U*p05iu}@_^ !>,\ZH3`QJFWޚHeC> "z-kW0êiٜu0J@BDe5r~H hx\lw䨳󤄠]:^M,R>hZq[yϢݦ'}Q#~Wΐå Qmم/u(d8R`| jm55H$>.5e^< ,P{@@Ç%Wρ KFF<T_-Jab{_?L DNyRK!V61dHg2 _v0 |m:1j> pll&Zȉ{ UPR N@]rх+Nߠ~.| EO = 4 _ M.xUC*2{o,YVm9QN/Ix a.-5յ߽V@MM|fxp6oeA) )PE?~բmN@isҢ/2\n!gi|q~@z) FŬ l`^_`G;IoHGkjLǣmĀsqO hC*>.R3 H g;,|6r%`n÷ FE  0yIENDB`nabi-nabi-1.0.1/themes/SimplyRed/000077500000000000000000000000001430012456200165235ustar00rootroot00000000000000nabi-nabi-1.0.1/themes/SimplyRed/.cvsignore000066400000000000000000000000251430012456200205200ustar00rootroot00000000000000Makefile Makefile.in nabi-nabi-1.0.1/themes/SimplyRed/english.png000066400000000000000000000014231430012456200206620ustar00rootroot00000000000000PNG  IHDR00WbKGD pHYs  d_tIME  6kIDATx홯Ӣ@߹f&6h6&LF MќImIh$Q^/8ˮk93Ì<}e 6R15^t[^vL T%c^sEQ@~4MA4 c6Ƙ9ӄfXE3Awatb^kb xArꏫ$IrÄ^u*,HӔeSmT:p`6q."V+†1u&}㘰łjsO&afȲ ᐰ# C.~ }|<E{&IL& k =o7K@$IQOBcj$ t]'i%>U(s/Zfh4aej1A@[mnWbT>t]#;xkLr8 + (ReU[Y (1+uNK͆0ǡJYĞ1$Bzj1kuTU-ԟ' r4 Ce0 Wy,-ތX*(%Yݳ\.K9?+(BGAJgxGҨya$ DQ,si2k$1HT_h_ Mn彟o~: T }IENDB`nabi-nabi-1.0.1/themes/SimplyRed/hangul.png000066400000000000000000000016471430012456200205170ustar00rootroot00000000000000PNG  IHDR00WbKGD pHYs  #utIME 2I4IDATx홱K@ǿѪXݬdAE(AEA:R*RSQq] )67<^0icr< w~߻%pqil8c1@]~bnW N 71R-qUlS?XYYe?EQ'IhuQH$`*^^^X͑fz__8BX-vwwuI|>q̰-`gg{{{5; Î h=z&g̶T*T*UZ\FX;xg5rww}>==Meq Ō3HIss3c8@:::H4%kkkDQ:c1 "—?'OOOD"x||mS*W,//Ӹd2Y$I^/尾*zzz!"_P0-̌Ht:mBKKKUDZJ!{Zgg.2bվm<ӸU IK~uu^a``PeYgFT籹L&L&cjݍt:VHMJ!㰱C [x<$ ׶tE|l,CQe<@ .c>qBBP|ZoiiA[[V<d^RQ2R(011Q!ƈb6BNOmc:XzWR_~t<t0IENDB`nabi-nabi-1.0.1/themes/SimplyRed/none.png000066400000000000000000000003641430012456200201730ustar00rootroot00000000000000PNG  IHDR00WbKGDC pHYs  d_tIME  p:IDATx1 A0>M_okf!씄6 A[l!dbZe+҅%Obgz @3f89?x: Nm.ͩ0f4h @+(}u$4 &sIENDB`nabi-nabi-1.0.1/themes/Tux/000077500000000000000000000000001430012456200153735ustar00rootroot00000000000000nabi-nabi-1.0.1/themes/Tux/README000066400000000000000000000001011430012456200162430ustar00rootroot00000000000000Tux Theme Aug 30 2004 Joon-Cheol Park, nabi-nabi-1.0.1/themes/Tux/english.png000066400000000000000000000210751430012456200175370ustar00rootroot00000000000000PNG  IHDRtK pHYs  tIME9 IDATxɏd{v?w1O9WV*wM Pa`ÂK$;ĆHBH 6?l6tzUsfwX܈̬ꪬ{cȊT^Ueݸ8;;G>m*fJAGrĒ!@$%<[138FԱY2W<6FV"aCB&8!o*v_)݉R @ DHKk8Fh+[%nltϪ+ kל="(5@"[*Qb)-9Da$\cA z*bu󸖆gxkxF䋈Rzr@BK#RA| >z)DC-$( ll+tϪt*t+0^\0(-qj5`wse~a.l\)HJ D@Kmd9" :'5V1xɱ "D)D\EҡѠz5k 8Yq"$Hz$W\e>I,:3.bt 9~{tj<H5Pެso|C 6jF1J#J!Z&[LdõB{Y:5N_lsG}ZCh?9;l(_{2>B$kie{}/?6fQ=AQ sjۧdrֵ_^#??mC48#wְYON DHruȖdJ# iF.~KNXv7{O>eGCob5/"1D\2E#^,iAAP4-g#\&.:@gm⯾ǜhbz!r9ŵIP4I .C" EAhɪOe!wSb+*7_R)#ҡuNEVDy gl>Xn:X,Fg_SfSfSS{ʽ<*{FП,fk->:`!6u(A紊cK~P+wt](:N$QTOYHy5k"<[uً;Wq Q4?u~FrY:ԶOW(dn^}AiIyIh XU]N; vǂ.: 8.>"^DIв6bxsOiopuAkX tZ V ߷ n!>DD)K 8ۢj~*s@psZu(\\0 Foϗk"pmY5ݛMCCr|^Qlp-mH8 V'k鄁47)vWY 4ePwVw8y.L8 | sVsV## Wgz˅ќwX 4UH vw8!u\33qHyqتˌ[Yg 1Q\0h`=rWUrMM ]g8 6_~Ȑ)B"wpr9Cߋ~439fJgim#~үqߧW>Vt],z+A[z?gjz'_5X0-0,]D"g/?ϳӝ?`̪Rc"=rl?qC|: "Ja $^D;SY%lUqw(`%|7p{X tDPaMVF C!ѕ_D! J1 b\uxx,->q^ooۿ0&R-ERV\ g"Ƨ2%(xgP$ C9 -o孋I C_~u͍6 dE0[|ruMcr8LME׳C ԋ7ɕ{כvN9#["MX*8[OMh. NNg:5"MNߥI,md,̸\z@}dG+]?fjI'RLDѝ Sh5(a4K<ǫ*V7Z㦧a ^#b~ !ҭWpLUw]] &?]Ԍ({ S6M}k`h9vg;8Aw}'=DT}B}oJ94q8Oov\"|T Z7P_j.~vǝ-v@ADeUEoMѯ!5N`?ՓGnav ; ᡱIDƙ@P4Zk| {?O|Dk+qx&[1HE8%}})bhhB B}3㢰|Yn,ҤYEqAIïO8}v^ZY zBVF<[:yoOѭWl5r/Wĸ_hM$%`9|QwdaAeNGq|?뇴Gm$¥=aXaiIo% 4e}w+n@GئW̶ttA bu mr.aŕ6jv9WrM调*rl?%^} WXs>d"{O:z_c2RK (eNpC_nass "ѩ>\g:^VYO+isiAø{nQ}Jks#Ϋ֓g;P@6}2EcYhd4,oqq;OYk.ْAC[Fo qиc3jg=ywwh5l]2{.d6\+,qܫ>^sRެȒI(`*> DB_D(EgI!5 7y7[Y?$R>)\H0%..1YO+3mbNs Ӫ#xf@*hN4M"Y?"R7ZgU|PP&0 |B!q+x Fß?@/DCVzq{"}S6M"tP7%"_"%+0k{0U)_9@8J ^HcpW?X5ܔ bW*IG9 㕸 R-k#@iO1ueqyH MW= W_sksڷm&% *qwaJ_R#!#CwDRH7՟StoJun;aT :q^hJH*;o pa$ױR)xq])ҫVM `oxP=2@]gP1 f$A~+E"qF0(Zd9^]syeT.(' D<[122ueXiבEN\=a Xx9=.KC  ׸ҽ/,c긖6׽>?$h-l,49xp~ַasU(L"0%b0}߰^}"a@aє0=&I>'Fԟ*7QJ~SYQ #awY™ sjm*ۧ~6NY0N$|0H\Za@B8~Mvq.yiRw9 TT|JkMT͡P\=>fFyiҖ&~c9M\!jEwUV bnىt^,ij)Dڔ6l>ڣyN^PI`Z"WQɍE:MMp Jj-o"6-%$JEq<I@KY-gh^hK`cXsID{ZIBъ*x t,?8H/ 3|ۘZ%D@ *XX]i0#ͅNRNUb\ɓ/J1.$tD[NJnA0>#AtwNGz'aN.ӴE.{q+oCVyx_'ұyMP+cv<WY *-}QM ӝF/ڕiccm;oojM ާ~RBdEYq?M9X[Hj&%4iz!B\-jgWq aOLE{39%ׇ@T"ͣ`!syt`ڸMCs!tWHOhP\mtQt'񾝓|0Jw$S44ޘfxS;'4v"Da :v?nҴ?g49o_b "M^SBP<)$ɘ< fC98xfEl(>]M$z™n,s$l,Pĵt+tNk8\ aBs6:洺YZGtϪ8K̓E_/>a qAiX)ؓ{H9yq.b"G0Yh4:#s}BvX2:<\'#4~Hso1Oa42$9Q{rVFH;/S<ݡўUҽ'Ԛ(dՏ J=􂍤zb _s\#CYuBsw8IŽPK;/IiBQp f'OQsRqFxnYRKϯQ;>)od+."cv"z^,b~2Q8> t.~7R߫4$U" e<[6,N/cBH&,-eT-[S{ IENDB`nabi-nabi-1.0.1/themes/Tux/hangul.png000066400000000000000000000050001430012456200173520ustar00rootroot00000000000000PNG  IHDRtK pHYs  tIME*L9 IDATx݋ǿ˓kͦ1$fWV[k.Pw-Ŗ ^EEK[Eo{Uh%JX`HfcUdߢf{Q893w|?>̙s|{l2l]BD4PP" JDCAh(( %D4PP" JDCAh(( %D4PP" JDCAh(( %D4PP" JDCAh(( %]zg|7!uT)RPKRw}Mµ: YV Zib14Yy_̫sHfjR疵#4ej9CjT:nۤ)&˙mĶR$vXlm=Q.4) ہf)=(h ߝ!ۅ~,NPkkkOwu>Ai9?g?^X EҨmzzQGRWD-(.;ZAcO44ZAc@Ug.v(/3ŜDDM$Ii{gZjNXnb6NPb[RP" Ja#E)( %(SJPHEAh(( %D4+:Qy(䇔0A5-Hu꫾n^ @^'!)N|{XhV.C| e!Ք\kkkn$w~!e(hinx[] *;ԉ=0Ƌ1NO<\Xrnˇ?> o?_q%‹s[۟w9-k/9U -mtΫGȢ^kG;۾-~g3EU$TU0eyp9#n@A77eaӪl`1MWwG~_3ձywHG^吏KPu]~ KiWG_uvvhP@v 'd &t9 Z[LBAkP$tWbITT}gez9*6\ !*A +KʩJyHLm^i甗I-yZznz ܺ[a(4-fvV!LѲcڼ7ds*a5?;x7|^L^i+R1ӨJ*%c^l0^(f&iR䐞Mᢲ{%v@]l`qz0n ./+i:eu^ꔑ*@/=oK%܊黟~+(s}4^:^:?N&p~=8s 9*jHJ 'pzr q3]wֹw܉{XT:̫kD\\{{w}x.}2'ϝw=ciKic/)-]ƞ+k]6vͿ΢,lIgt`I2*&+;pexφ:ع>;:K,b`u%_W0?Ʋgi6.>n_0F rf*YT>nGDCASĔ;:A&NP4Z̉>*6!JJAS؁&ݪ7HP 0tYuvEI<(靄ŬPR(C`bIyN}uwBSPHjJJ;P%T_jJRRf*NRPMlIZ6ܚ\g)џ7fhg[iJA+`c ZOIUI5䶑^,;FJl<[`SڐSy՝$Qu l$a}tC|Es9ƱsES4C{eSڎy3K?ī)S$NPúmq| NN8lAU ['A iiOLw$HA]JHAu}۷iY띺TRJuNP% FlѨIϦ>p4! _;_#' erǎ0="hA'hAuaz6 VPg)h9a/.wA ZUNqM'AJ9H4S'kLT%/9J]IENDB`nabi-nabi-1.0.1/themes/Tux/none.png000066400000000000000000000034501430012456200170420ustar00rootroot00000000000000PNG  IHDRtK pHYs  tIMEDtLIDATxM6FT` I";r`E03H;e~J猠+K86U (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 (H 4^uq2b ¬"h#zHbaԈB,+V,dE yŋg)xu fKy xhZT)FXA+j2XMN2A_P#PD?Ao(4A/n UF aFnșʈzb\Wj}<嗙fڷFԞO Rzv=z0z.-(Kګs/+r$]VHtԣ/̴rD{;;.Kޕox%`B -(4 (b=/%(KLXJP9#4 (H 4 M/ʇwRzޤ|A3}LW><q5Za@!U%Eת&)E&O"pvT/!,BƪeUT^{Lڀ u1>Ox-DI)_΢{538_?fݧoOy*{[EگA5ZG̻9}RwUIkg!5Ib> 1פ\) J\OJļ#i A[Hʆ}F!Ci!<!"hW'bbF5AuS5Sw弢&*PP/r^QAs )G1As ( b-mly`v9=zKY#AaJŠS Zy ]_ -A'*GI(Or>bf?*G$A'U$-f  Ig9mG6ǎPon'<Ҭ4ILI &s$4QYKiEm$MA3%wJ%͙3Bpk:%r,?|09Itl%6Z>uwSIM;&)B3DˉU:{˘֣d@i'LZ@H![YJAc1[;j5_RДClch滰>Vz-t@Мy_廠>LtZ]7r#A+I{7QvM4X>+4tk'I]Eu$̲<>DLҚЭKMR00RN w߶^P~gQ XKj%[3m6T9E9?+gmgP]b+E+TϴY7 L)hTr۔Pf#;s_o@tuK9GyjYid3M(:I{Aѱ %zΏkAs!zӻ J\IKAa,=;;A•r2ӫNJ\"님이 만들어 보내주신 것입니다. jimmac홈의 키맵아이콘을 수정하여 만들었다고 합니다. nabi-nabi-1.0.1/themes/keyboard/english.png000066400000000000000000000141071430012456200205550ustar00rootroot00000000000000PNG  IHDR>a pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb?( X@###Gl@,$F8#{4A Y ψh8ZJ ܍$9a ȇLh΄'1&?4 XD>z3CHi4 GG|ppb33/?CWM20(~# @`\VVv( #06.z!kw1|u04@#7rB }⚚@ف Y?f`@ ϟ?` Fj@cGXA˗/XϟBj`(چC0(>|/jZ @ pu8s^DCm>a0ʇ @?F!@j @Xi0\@a ?~ %X~ 1|%`r=(Ip,=f"4HJS̴)u@zP `EoC1#@ @/ @}%IcMM;mM6-ĸ _yY5)8t0#%&5Tn dKH?H-JOw t0#%GvB#W/1azb -yBWIWun1 m-@SRs5夆1؄@Dp X tē@()ԐRùV X*i]"P' K]PB"Q `nR0(hB9'UJzD>5(zXJ r<E#Ԉ'bl9O61u9@8!Ȩ0@ DS+"?~p}σ٠ait5F6hnARRAIIAFF )E99 9U=#4uUV̩^vvvuuupKII9>.9\?) AJ \#W~=L8pҥK -'BE1)=T` wYJ !xM?{ WB[* ɍ#bO8:9\kPɁl.JH +a -HԌ|B|P5p$@ `%$$N< #O'6`r ȓw|jօ k`%s?1DKA'NQd>h-h ѣG]D|9Z_B |* @Jp1j_'%?1* Fc 4P\z T<(V+=/ID@lB %%Mh7 ,W"#WDJp;wD,rr?bb&'ٳg =wAVV G %DcV·y@j׎RA#t b߾}'P:Z~XoPd i~r"m:uMU J ;v&rQDn "?~ ΍-RԮ5Utmh4@-gςaoPPB >pa1rF1IvO H.d>hoܹsH.AfSlĆ(zA"?BaD) s%~]pē: E7j"w YV@t "w F@1RP &&&$Aj5r{~ PxMY8o޼!mXLI ::: vvv$6Cz@@n67@/b@}6:]7}PttfPVVDDDH2a3 " У@JO@"D /PMj|P)Z ZL555@m~P;kIi~Rn@JP Z |Rs?PweeebbHB@SѠohP0%4r?յuy 6?lPO6 34 ! ڧ' @0) ^PB{)xHD*ndP c!vڋA@  X r3tXOUU%0ArT@sנA1LH -&5* @]@Xkd>T 5aAXf'-hH A -RGD0h_EE8HA CP$@l 9 cbHf (>Oy(as= t8 @C6 0)9pEO Ųp|/^$+E2(Gv#w ,, n%v%c[(BAnB \<Z *An@.AlPa}"34 ['p!I6S4`@b(`A>@HAE<(A3 $*@  fAUX"6*HiOe4@|r?>@>(A4,JP)AN (@Al Aj Ѐ(g6|ȇ-pPI*aD"ȩ` *bKR~Rz@1 Dn'FXu@]@R>E>r9@O ;j0S + !  w%=Y @hJht 'wh^@E2 PԹo>{#UL0K Jaaa _& ?j@tOJMl@4 >:^=\n!Xu_ATz+1P?% {m GذdZ"F'h@bb"ԣQ@r0伟 yro ( P2@> @=l o%PP0@ `MMK#o%߶mI7Q3!hД = Ы'je*j Рi vP-aVrJРI??r o%jU P({Mv(huVrP5 u&v@ 7R7} jy+9:r Md'O(q#Dob DdLVrh hK:H%BR+h@u>ǽf` @@cJTq JL`3 wFe&0y /qhthh (aaX 4ґS CBB(jP3@ hVxd@@~C@۽A0 @ /b";A@Q@M`[a3)Dm"2TĂ0hjj۸:zzz.IзV)*tJ<trqDiU8?8?x\PgRґ^=Y @ȓ yr{CR e =:׾DPPR U܇V *%%i r>ҙ?P#d\-ib1r2VraӤ\UOb#R4(7F@Bɺ?خ?K\)B~E` rW # cJN :@2; RdT#'lA- @'-;^ 7N d n 1!RVj% EH XO ðD@4;PT +Dl73D5~6b[ܰ=@Gc۰-F -YP u(%XPtP%}oDס`gA?h.l@@:TO_%[A#MZ@IʨbPs?Gh@Vr1î]|+++-Bt@3P7*P@ºU|\CWr/}+E$) f64q5(63@ G(r={ԘMސr|<ጠHm$&DEhs 3+@j'h'e( ^\;`K$a9D*%tf]> s3z n !&nmAD\;upK |Rf-)ء @t(p0Xzr>mSY"^1@6D7>3H)")]N9O Xτr9>6!Ub{l3OJB u1 $* MJB#Gi@ȧn\ dM )mZSi1>@tRѴGj(͡6^Q{!#MKRirybBAԬF%O_D6hh4VNJ 7@%]^r:%h<ѣ3yFl=B ^asФrRDt( >K J.еnj $ @,J?7 KM6f*Uh#9:5\tmOe%fTDQ Z!;ZlUk)I Kо~>z` "56l0 V@  JXrq7jkgDr peE`p&,"% ԁݼyhH-<;1@("'UV69u AvI&7Z)^alb!R@3|+VG5A_hģ$bSD[٭i&q.`h@ KOM@ E<#ZBu+JJJ빸%(4a?~-a i XA QQQ%z@ Aah8߿{( ~A wBOLH @'6 *ggM`E(٠7B#+3VohF:a pHYs  gAMA|Q cHRMz%u0`:o_F"IDATxb?( X@###Gl@,$F8#{4A Y ψh8ZJ ܍$9a ȇLh΄'1&?4 XD>z3CHi4 GG|ppb33/?CWM20(~# @`\VVv( #06.z!kw1|u04@#7rB }⚚@ف Y?f`@ ϟ?` Fj@cGXA˗/XϟBj`(چC0(>|/jZ @ pu8s^DCm>a0ʇ @?F!@j @Xi0\@a ?~ %X~ 1|%`r=(Ip,=f"4HJS̴)u@zP `EoC1#@ @/ @}%IcMM;mM6-ĸ _yY5)8t0#%&5Tn dKH?H-JOw t0#%GvB#W/1azb -yBWIWun1 m-@SRs5夆1؄@Dp X tē@()ԐRùV X*i]"P' K]PB"Q `nR0(hB9'UJzD>5(zXJ r<E#Ԉ'bl9O61u9@8!Ȩ0@ DS#"ACΠFoPFiYPȐRa hZ*AǏ /_fr xJ@дnnniiimmmp@.rR@ F Lɓ' {ez*|$U㏗AQQ\hhh6EJ54WSil V)q=0Y/:8 䊁o޼1,poaa^mN_qOHPۀ1 RP;A` V kkkeeep{V?.1bĊ  (8!`f'V&A 5Cb@^AlOJI@n\Ѐ(jDH@@ P0)?KJbr2XoG>%^U1  t.LOJb /L h^ҵ#%a0d v0ppp{듛1@,Kȍ|O:M<^\ u藔D@@ѵHIII]]]7oD21, 1pqq9b'~h6@ qrrb ҁiaCM&~MHD@9 MvNM6="Wb>h<tt +))a!JH hMٳ we3%; 5mr @ Zq={&\c Hƍ`z8Vݠ  qNNNYYY@fI2"U@ d8hADž ߿pu̙OP ' @i=s;Q?\j.,9 a\H ht V0 Rs? @b@}6WB f)Pc22P%6 tE( IH)Эa#5Q) Aj@ ɠi#&aЀ Ho:D A"hhPL]PX*jaf&5A~ YF-tH:%LРdA^ >tdА,hHM<fAll &@c@JUNX@4KDP&J@Ӻ׮]NF\EMG.m@[AQ>|`bb@mK`n'TR%@ ͡(W!oF%07^xpSNhi>P&@Ӷm6o ةf7M`AOf)akBVZ0{npcӧIkr °%vp~j%Rz @LZ}aY\uVM6W\t.OE ZZk.\L w {b@1;f߾}@5@ %Ȭ,`Sڸ{E8f%̤$P{ypAk$U(ǃAOZbaxAG~<{ C7`9&i,[]˰c@E&0BE: tsqɁyP Pށ"4Elh%,h"52A>B<0ŀ--- f͂`9 ?H r@ Z~!p((A bbb#` [J` ;@6%8K[-PIebVHa@t 05 AZ~  DPк|К|,hy9hLހ +{ H-6PIK#RqD 1rtFd51~b=rS}`w"h d^$6!3;쩪vG'!b t-э^x8C ʕ\saAɰ]B kSu>rݏN^Xu1bAUUC=ҪW@'@Ѐ 1}b/:Pq: Gt(a3l$V#(@j v7}JꄚAR?@Ѭ$}AT[f@3nYA555x k͓ @TOX5Ji1@ mRvvp#(r50!.$ck4J$Z bY8@ n )+n`/m/5`A V܀N "s (D AD>آCИPJP.RD 9Wc-/vT&@l\PO?5Ѐ 0T.(GcM+E~E>h4AFFF1LBD6U:hU ӵ@mRG @=r;hTJ~ssspJv(9'@,I %Pm 3g7Ku!A;#lbPwTRP#FiuT,@t2Ԉ&-5CЂ cb6k @ Aj^ l")P)|ؚR#ɉ+ (&Y@ukzz:xh&?2؂OPD09S2#(׃r:m4441||OII@j @l XK$b j-^a6܍"DFl|lN̶uZD<Ժ2 (ޤt($q:YObG˩Ԩ SPC)9T]VIIh @ZUi@ Gv"eKbZݺD4jZ-Jl ls(a pHYs  gAMA|Q cHRMz%u0`:o_F IDATxb?( X@###Gl@,$F8#{4A Y ψh8ZJ ܍$9a ȇLh΄'1&?4 XD>z3CHi4 GG|ppb33/?CWM20(~# @`\VVv( #06.z!kw1|u04@#7rB }⚚@ف Y?f`@ ϟ?` Fj@cGXA˗/XϟBj`(چC0(>|/jZ @ pu8s^DCm>a0ʇ @?F!@j @Xi0\@a ?~ %X~ 1|%`r=(Ip,=f"4HJS̴)u@zP `EoC1#@ @/ @}%IcMM;mM6d?fxãG>>p.ˠH5h PZ/_spDJ<$߿\=DnQІq 1E>9 F9OL˩(oP@(A̙33Pd :z(ڵkjjjPx~!&,Pu@0 Wfغu.^ϩ"\.TTT9[E>Ȝ3fwzrT>}ܭ9Ď/|CZ bVn'0@s֭HÕSAEܹs1A 7n0L>P+++q| r<8E &4@rSNT+La[0;`J( .8Ad 8}k:1!@LĖbjD>9 9@E+uйqPSSJ:X@v*E@OI5@@_&b@ O(a-Ǡ#,, nͣWO>7(ˍ lT4{y!ERE(`@c˖-'Pq*a ʑw7s?K,H*%jT \t PJTHz 8D-`[H/h% @&rCTKP,9XOl8Q'@t)ȍ|x180(A&)) n"V"q~PQ JIC^( U#xY`dhR,zǕhIpb@`(-0PuѣnNmMe~| ~; S 6)6ΰcf7~`4kK+v ` oMKJ#-7GE2(0aw XPZ 5I #A&*}@]T*222 `w bJ| x;Fa?NNpKu!i {NٹK] #t'r",b[7dE>w3 ̜ m4KRK Лyc HE H_WI5e04KLfAٵm6XTynhQ~DL:$K/)l@ @&q6,OHB凨4z:K9|uuDQ%s8zC.̫ `\>pH&=c5o%𑝅M?Ch !-0Z_,ޠY b NYZ{tV9g)v?|񳪎69XOW28?Nʐ2?(YWQd#{t~_KZhӶB8C4BD ͮ$}p0( BK~Z' =j.6[V {o^voZjNd9mINE:8,`=''#m6O`(;1# 3E(z>g5th2e^j;ZVtZk/p|t.ʛqjQ望]_'DZ{ڵ֖5tc%5 U ͟@&p @D(8ҖBAAP&ӣAر!w3EĪ# ЉL6{Rܡ 3kg`<`Y:Wfvp#x2'Iv @̽ @ms$+O \|L5wR"f9%TUKM =or9qBگƻgVE;G`^I 1<*Lhޕ|OuK@t[H'Ћm:>///zPQ Bχ@1Aj8" ,yزx00(A;D0;@nE)X>`_R 9{(Wc;]'!$ ՛"y~lP J +a%dիWvAb"AE lE>1U=R@b[;|qKӚ6/ s':UAw)nd䙉J]-FH|#}A bAPt^HvWp &^@s87SA jVz [KţdAs fJ\Kpvv'HߐP@@;Q`fШ_ss3|<᠖5*na-1"TE6~bA Bq-"R޾};v7\jn *"A 竭7@aPQ ꃣ(RaK@#tPҜNθFSSCII Cll,Ɓ)!\l l Na˨`;ȣDru+W‹zMz}j6hZn1  ^ a=,AA9AA-nXTh$p!_P##6r7XOw\ !1 Xh $P"m0#֦[Ƕ>)A4h6ZK.A] [ [ĊkAjB <n >1Ш`Pr`|PCAP 꺢ZRhڌ ;aG>h&ԓA '4HIР8#YTܯZ  7&&@4h 4@"faENaB 9P4ۑo`eiM333x#^ kJJb܎ ={٠1A]>:@PV#r?hz@X JB`57J|Dqy67wE>lA*h!(h(hM"h l%0-.РŚ@b, *2A?0X#P"4 JȣԲPSZ=Ѐ &4ƏV"_[[I+2؂P;r~PZc6@ 4;f}0b^Њ ؜l5r;=5~ dk6*AHA |P}@*a>N h`a{Ka<,׃6vZDV4hP@{5#a;}A}{ P" 6¶u08* M ?P@:=E<u@tnhWb"{hPL[\y:׃F`Wǀzذ.(1r=@u5hД5sh a8wuw*UJ%$M4h@BW٠4 Dq9B* Mճѻv A#{ `y;9'pyRc7@ѽ v.VрJм:(7pRk4vh4 @|3 AVԓr#%GQ(mР)`-pP Q+aAr=4[bf䨑uWJl[} j\D`;V>'PV6V)N  [Æ~a( "zhД kYE("@}{I"btu+އE<3A}}>: %lV7 AJKZ@4/|d9P%X"VsAU#zh8(nmLФhhvW0]JpW 1 *TNF~!baGF hPI)mACALj^1Ő/az@(Y=Р(aD#aàǠiFw0,@)8"eM 1JrwgPT e@uJ2y,#w@g wP u vPr`wRWUPzW@||*  HAzP…AF哠Ro%7뉱 h w o΁%%qs=rI; #PC P @>)%&6@ ql=P"j+<(.--_;!r?YR- 1)i:Ll" &zF2)b;w@(!iRHЪcPBHMM'$P#ѠHQ ugΜoJĶa|P Q 8 . `~;(QzA^Bu?ȍ5 3A W=;@1@,]lAC{))}@LP@ f Aib~P{I} hV`9 v`@@G@'0j4@ RPV?(@c} jbGh}$,.@t &4,L(1`8(鮮.sЈv%RHP굀F0] Ii5@JNP0@ B.[ JP"hkkC (F`k @J@nAvbA@ h/ \AP . e5k@ _jAvf/'@򍠄"6>9=P05@P_=fBm -bA%>FL6 "u jZ#f+t@ T2)MC@c"9ZpF5@kcA X&Ia"`; A% %0P% urZݺD4|A?; @P0ha lՠE9ANSĔ}8'ZFh%%@QTWG @t5Rtch?f@dFhh(x(nFJ@d@ "%J7Σ`&,"% ԁgZO@gbQDGOeOF}D* `HMgCW X" p( B#%! "rfNަM{Giv+KOM@ E<#ZBu+JJJ빸Ak@%(4a?~-a i XA QQQ%z@ Aah8߿{( ~A wBOLH @'4 *ggM`E(٠LB#+3VohF: nabi-nabi-1.0.1/themes/malys/english.png000066400000000000000000000201211430012456200200730ustar00rootroot00000000000000PNG  IHDR``w8sRGBbKGD pHYs  tIME.IDATx]sWzM3#Fɲ)lXq~v6 N*EaKA^(*(x?*WR!% $ĻYk$}{n߾e'jLt9{[odž3zGQTP(*9}O4o Oj1휋9 M3IJ|]=8z=Xzz sF'*U '{R?PoZD(Pt]xa__P%` Q2Y0΅E$Xj#B8K]Yeض'@~6xsV/<7=;(% d\@QU S 93B52|%| "wƇ5 ?ذik39޳TEq,.r}CQgV*` F`~˧\.M܈gE50atthoH@K&d1 Vl®a밖XX@caĶaNel%(GZ/HA`WKWF> &hTMk!.ϵп- mZ]*hh.-Xf32BΝi"E)U=0} R# 3墨Dg'B XlIJZ"0B]UUvts~?qrj͡1?لƙᝇ5^.f 0O$ EgmCatt@kki6a:ߥ7Z<{" OQ`Y =EU4PDu|K}+B 'f Ä+37}.׭JyΪVDDO迮)焀Bg7lV EUF mېDw|B@ RKirJ$Yz%Q(Xﻊ"Ӄ>̦M3ؖXGiM6 $fy4eX iªVa&Fq0RPtz&=Q(@O` ͦ7{l\+U ׇ܎X8~ձ1eDܸA9^(Ee0йoڇ%-Q% @T P>wΡhn6}i<}EdZ*CC3g£m$["q#g`WZGtE(\e i=Ԭm`MyQx0=úGfFFû߼n4XZ[oaS D$@=bu`ePǵ_D# 5rGߪaw/26a쩧\ZruIE_gǂ[dI6;]Gnp47(>*,VFF\\ JjAT ʌ@ 2Zo~=Ewޚ9A$;c ^F>0sm:=K_ΒItq w;4}S߮0XzpdùBoQaAjF\ɓXRMt< ! `}hBƌTOz> ׯU:EBP>{3gPhAKˡĘ݌I ^pΙ_FXDΝhߵ x(%&]]0?bʕ e!(bY^gZ>HJXwHJNVI)W*|3gZS 5–o|m[H`7zLRY$mԦPAuj (TسϢ:6+B1 @GSW܄H{Hvw\ &,:B^lL ݇#;0 y{?)h٬x#""3Qz!ilp+ى4Ţ(43Hkj"(~kTIX oD, PUw8 [~V3`)'cg6M$:;+_6#-͊8 غ@dP(X|WxKIXd-#?4ŘGZ{B`jzy̿&]mYвYlZ."BPU#bž=nX>%\_p>iɺ?w ݅{r} Nŋ~qY*c Ϣ,0r9d6m <ՊLP`\>~DVr;Em2 ߹ ϋ+THytAXt=D%v6YcbAu|9zÎYq m0Y©SҠ%)! ?b )V.]nh f,v0cx1bHvu!pV bi&]GM7.B񏖐mD/pؼSuC}Flε\jhf)<|uܤKI$P>{P &Dl,7uǏ1xׯ]Cet4r :9!Ö2u䶁Ņ$ bq&T詔w+4Qؽz[[+##OO2osgb~އ1(\һ<B$Htw 5 H==2+4֖}q$n𝧂fm,?+'H#2d6VBUeU*TMCWZkl%uE@4ԧats YfXOh۲%_8qB%J3g*1jZE}zڛMr92`]]TiϯeXTa2&@F}p,-:| P~hz>/[2$Ĺ @mۡ\/A$>;C,ˁt"w#RBMb]|f2s,ckFuy*6(5::| +W6(7rVqMKKr_ILaFlrsׄ- & EBBc~ޑ#l=muNpS}0MU5P"\] #(uW?;|e-vﱋ5U!ˁ4r9)^nQKD,vυȮ((А?S cǂ+61ի*ߛЙ]@sn/%´#)r_w[x@b:(sKXݕ-SeΡF}Z1I"[%j`i+ݺX9F".v}岷42@$dB+2TaV*9whL&=ǏΚnHKh IIt5JL[Y aebЛ+v11x-6˱Q:|X]JjI߆!Hv kuj>jT]hʮ []"X}睱!H#m/\8"z&Ӣ7*Yjk;2wJ\hs ⱳi"Ӄ|˿{ty{.*[fZr\E ʊ(TE!bh..8MS~UNBP7­:}r&lg~hqr9)&o(B|."Q~SM& doZzˣܜt S`o,,+d請~:xm?Q G IEӐp(NkSĩu|0XO|#Jc}m Dg FjBPuЫɤ>%v@f]w O+/p.hoG+u:0c9?VNS&N._[{qԟ_J%c.mߎ?aqHJNeGy bݿ wn4|U93HsjVNKymz[o?d3Ե?ٛQv(gw/~qCs>oŭϟwsJH]Hhyժh̕]IKwٶ|jVy/NyKa@ӄt-{[u,_PT!aDQ>wk,RۇFaީ3b6~mR8oa8pm >|fG]GelL mX>>PHioY<9s'0Efl^ Q2fpOu?֭WӧQ 2|y{tU\AڵVˆt+$x X7<+ 8Ϭ{3vAׯ, (aʕ \%)ᭉe63xNt?-LK)MJ"H` TQ+~',>|X؜}., +/*)v,8x`с>ߧu箻ߣG!kRDg{&. 5,ue!d;'6ffPfV3&R|<rqXqiݺiv9)`}јHU̾z,Xw_Mtv:@o7!KgϢ:1ђM57{AW:2O*瓟=׺>JI1:nd6lpI8fߝ#t0{UFG;vd="o2@a \Y ]FJ\i j G#;rw$"0wX7([\_A@|O@סCV5nҡzi\ 8w mtw,EwnpPX9_`?BhQJ_#GӎMT]ŋX8yRzB3aXalwC}rұ V`7s9?ϛW nU::N̲,UUAM\} eOh Lz#oONDg|5[jf,viEdukQ@yYȭi\OaZ,vog_g=9EQ`7HJ 7L,Ԃ^9 +"Hկ"8{2:j"gqV6Ɋ~K [v,?_r;Sn7଒-K5Z->܎0]¼0]_{)v ؃mgږmjkVuЏ~6EY2 6ە4N 儘GDBY.^h4}bunY}viB0}.~W)'c[z9(B b뷿̆  [5 T^ŕ_}';'y# A"X%4e=V{qA]%l{Hp]V$d=I6ni yb1'>OѰ·$r,SA~` v41X=bP ^N妡X?lcTrmn_ Y&(CxiJ'?|>yс{BetosSFUm>>J4v@=l>u3m(mؕ F{3OT&x'8sA&!eO[g%uwrXEaАUî׽$?0egg\\tw0[+UסAooGB)7^܋BUU|,_~53C~ UBsqc<_Ǻ#Gжq#b+rgӄ6CQBT }<9az+a5./26> x* ]D54h@np-[szY'*=T c;RTE}rW`ezOdynD ^d9Zz=HJH!m:&qH#mP DYµk q~/'jR*\]k`N2˲vc~曘ӟud;zkb?4ٷ߳&VGFq4C7+twR@ |$]{j./(Nv#MCTBXQ(@K.4JрUӰ ؍kc(^' \P%-U"I,tzC7X}9ɒ(A|}l/R#q@qAXL&!(X1DBjև d¾V %`JS8MXkx^QǭEkdqce? }-.)Lvt󗾄sCIENDB`nabi-nabi-1.0.1/themes/malys/hangul.png000066400000000000000000000202261430012456200177260ustar00rootroot00000000000000PNG  IHDR``w8sRGBbKGD pHYs  tIME7T IDATx]yWtܧ{23Q8p$A؍@,,cW qؿB%$ _۱k}LQUWիiq'<~|[oR`ᥗw$GI$I,3۟$EO5e$x1pN0%>߲qߣ|^Cܵe{ #G99˔!e*}'I>c~_ z%IR@jфf5Í\H=ߑDR"Z'k}=F}N/Ijw9C#IIUÉN$Yv_<1s>#DxH!i7M}/v> REu?Q(5P`J$ْH\\!Iq$Y, 7R,/7kQEӷ8K!3J@!2FhMM!bPqH%a,aUt\[C%C%,Xn;LYn uI0ajM )p|dFJRqCt-ЀH_uLxscp$ӄeY0 PG5Guu4aUz4 ih2e")j@}2N47~#*b--КDC?V'#erSZFFzЗ~ ЗPY^UBS3ˇa„jLgogFEj&hMMP@U[zij!$,4ZFF`J,-<3V_#c}X),C 'p5Gq("`M[Ѹkݐ WR) M|ב4e, 2b툷!=8ǏcB\$E W)B4KaIF(﷒,#ىkAj*4mv쨫5Uj>X1 ,ÀUP kDBMfК&0uZuW#r,~${zپCPKsMDS_ S̑aiCMCףqn( *@bH'ObITA*Xժ/g/#Ď4 r<%@fdw쀚JٚmYqڲ'⋞#:#$Eyu4)֖g\/IxKtdÙBW(1hjV5ʑ#X9r;225v)9% bCzhSO< %:Wi lhp3$O @duHMHH4^z)(=akf! 8$NEZss Y"maP]]z޴CAl|1+ىM`/ QO@iz -E&c"tsPq$\xZ[Ѹs'wD<4%*bmm~>, !AL,\;at}7vVI!f?q;E7g8dI$,gg/,4;n@0 _@=`'P+B> GӛMNBu{&@_XOcѠg3`z, 3/>;\=N .Sg?q3O=Ą RWkm PH-4P#"CBӋɖc11(MN:p!QTZ#Ö_9gg1_"w3hb--CI` -͊8 B{AK2h!IX?{>$Y-3RI_a7 X",13X>x2M(4?y&dd!(5`CzpЖ| 9~4x"h{Ԓ59xjܗc %&"~FŏߏÇ]sزooG|A@:(qbMM|aU*^H?6駞蘇`jeY)o$B 'scH8U7݄9>'$H=%O}6-J*JկfE.#ab|q;Q׭5+J;n B$/*򣣐U?` %PG;q9Ceysr/J4-AϝÿT$\lؤe\}OhBI5_>,b~\_P%UgbTx{+in,8̌W9YkjB֭.CHdR\s~&/Y"AB\+@I\B@ NF\eT W]OiX~5Ȗ5=qVI[d AE3C?yshv{B l"hz;2fɱ0E𡛦aࡇ|7Y&'q?@eaHBkhf$*!jt"XJAmhp{+%j"Bm;={ݱ㯖Щ-[w ḱfBzo)C=4ܖv[t OQ,Tbmhe~!y',/.dEA+4P@PUsˊ}~7"2|-7"\oJ]l9{ykt"(xfCڗ$hԲltO2j6)yuhm֩Ӿݘ0aq6h5522mX_dⴓfWWWÉv5A|]$b씘&*6bt0eJ YI!0 3+qV2Eqɗ.*SLmό4[$(ɤJ|F #`jqA>\.)NLѠYL;A ;!bNXėP(%YvpI`8@Ҵ`B7EIpT a hf5/df6% .: Nݔ:]@6)VfHņMaC/DP$Ter1Uj-ٝ@]%Eq]ZE]J*T_C+$jfT .x33YT[H}xP-;*^(i(=5ŕJmx>Hv6,^@pIѴgZFFd(>+s|C| ccfƽDNQ8!H)IH-[ǽ3a܈j*U, gNhN FM׻;Zn95AϽ. E+ֆ:~L>8V PavPS)bYCjR fp;L?yLgFd]Idf\Xn >_}~o˱$0-9j&cGdԍ1 TWVљ$SQǭp+x#+F|v!'h8H |ĚNpGӫ|zb!вY/ǨkŶO-d0ϻ햵nq-IvǼWYZu@GoJ.㭭(֏wvl5Kb6;(30 ) mm~z6;NVܜ|8k<n.X[?+ڐ[ku}v8ʉ D#噙`CoP?,8>0\A,(61@f*shHU{utikk0uBN$hoG^uo|#V\WklD F>A4a7٪:r ./#`IY,]ﲛ0~6v:P'Gh{{D f~3O=eQn۲,X yaߏ|Rcew͢ΌC:Ur\!jr+ǎyN<8 ̃]s0/{X,#}{σ#$?uf )^cZNAX_Gm8Ţ Knd7N3NN:/cm y.fSqҧ6ܲ/kڥX_B\f- #~ɓ."*{%٨Ɔw֕閦ƯXhHp7qo3G# 5MN J2p(pYVzpГFw5X2|dS%Ҧ4tDzz$A4;}q12yexR:%hڳ [R[kj¦{ԓOz(UR͆Kn@j*[oEǭ^L}įUC6M|3RpKpJO;DoaPGr&ty۸Bꗢ`}l #GQOd&l3j;x_ ̌mrZݽ XÑ㏇-.*c_L ^{˒eZģ!k"# J`G]!Z[qտK\;[.GbM 9pGС Z@-<`-r3qJ23XUp|(,/-kގZ6a{_ cXӟ0_ vĚES((P]]Eq|ccX?wƀP?)`;fXx庉K,z@&\(´3 nctG]]7-Mm {h_Y+X|mD(AЀm4R[I{gi > f9iJ{&Cp0f2иk@ߕ%(| /t(sP-34W6o41?1H[{,}IX"& |pۦra|]w 5J]=\Dt-:IJ$VlyZ[i(MOc} K|358w;w η<.ݹӖBw0 b$?bI6d)@KK\}]6g}b}l NGD|Y9 G/&]wމnf!$Ѹ{7_|e[ZF9gyф'jz`n6'!@I&r&<EV@ߔB  LTPY]O<3,0QPjCwFfh'N`۳u0ƟvuZ}oz5 scv~XpYa)Ih&Y1(b?==dٹDZrϞ :Ef aV4ލ={F3. ͵j"j>C} `C|_Z0 4NtvBŒd{k`!w0_~?Uc,9C;߉믇ͺdfeAKr(}U'_#`qKhD1OތB>1t}7l6yԄ;~q,8ɓSJ+v:ruHm<53mh`YEXxN‹yg}& j(2v :ov L"1ѐt}HB}X[ʊ=k9YUjCFZZkn*7^fߋ,CeKKX /Q[4MO&E(hڴ"@ n"ر(*Fu8 +l,Q?xsI5;̛}YAhX;;Ǜr&l`ԩEq*(PPUgwO4~!sm;7EebAпV \Xo|1}t ĶwT)k8B)yL \B PZt"{@ux͏/lS% hY1@9FJDX'1Χ2ö=^xoz,wEQȾHG)IrEUOL%;THDMIci'BYdN\)Î Mjs'H".rwCQG+( 67Tl/Xtm ]dF<)48UF[X Z<0 `X2lӄ]T`-/mîT9Lh¬(Z~7>#))!s.эVh--H]}AdjZq/W'B[lۆaGF` 0@, izBF*teD9 S#N747Qu,$+8D!"8`Y =FݰJ%TPDi|K_'cs)B &5Gu0"5`ep;?aڶoGj"iU*0ѿ)Dg7lVEUF ͛D%,_`R&iR&I4K J";WQUyd?֯J,G];5nqئUPmpfS zGj:j^Q`W.-a?~>Gj5ؕ (Ώd_:vFj,U@v.֯ث\Zr5IDeG[`I#38|4ؕP["+0Je֝2C"X˓Ne`m۷hkk'.l0u/^ '@fƦۓdQVYWk>9:;4ʘ "/d>_ˮd##Qu,$y G-r+OMaױp3hjut`ïT*lvYQ2N({== "Eʍ=| Id-g~d4V!eL;3gn\eAK7~nYM,Xaq[X" #HoH>MrƏ ^Z5&Pb0h;Ǐc9ymĻX I'ގ>ZGØ7u̧`j>dg0 Al!;Ǐcg?Hxy$꫺z -{NXh>-/1-J:Jcc3˃F:.˜)bc(oR[`EEQj? -*+| $׬$i4L!DJCt)QN$ՇB쿈!D l/U ϣ4>z*`:a/ut ylͳVʍ ^Ⴗɼd2g4i |"iRB|U,bEP0-[ZOG6߽ n݊D.T0ӟS[&n3QG0T4[p_<Qo4m#iSc RHmP/쨢`1q.\ d68D=GHE9?@R*_{34&R5 Ļ$ =j Z& ىx.WRpz&*33\=u0i'`~t=&:wE7je,]X}c#Q7jK#Q|ȋ.oU .;I4#Aj@\>qt3Z[~?"`JXv4ds?D D%;14>V;׳$K4ѲaD .f&Z1Gd&j4 |te PuݯXgz Z*R!ՅD>, Юՠ:Zt00;u"v鉻D/!{DZw͔0pJ5Vz@ѝQr\b( *U_1.py% V#~5q"UTwA?%*ie`1q%IzXJAoi@O$0|Or{6QL|}$ȉQI41,]D!-MB(ͅQ1Dt)ruOȜeDŽU$eS^XbY_オiHHϭgC~K^Bj*Өf٦%X⋁f)lxwgAOX~+7nV,I6dųN;Xz}TfgewDg?2|Zg@(X'w ³ CbQt}c^$O:цAΤ|e>g}C?ﵖG@ѭ46''&} 0cIT"5V:GłN9NFîTp_wFή}gvlĵo} gєaY|+l' B}͛o:@דOF"/AkmkШK1oq m|s5qLܟ7qh3s˘|ڶo'# ̡ԊzZ*):t־3Ptr(`avmuy7!(\w|.qOYĴEu>6p*s~i|w?}wԶ;k`MI;\:1`"CoEmưMj}³kdҫʇlA~Mٷ+6>[,3 c є&z*XƪTIMU*՗#sUdB\=2*0oXK03g9p2[60[zf.ӃA- {n%Gd| EUQ[YUmIsq'ъ;RXZ9u |a]nkFkk YȚҀ}j"!dJŖK \8j HP>'_ ζ1[>--G;e[hhqڵo8 ghIa(Z:Nf_unW b^4ف8 +;;:-۷1S{|unSo>&wwc.B XkՌϝyHS?iK`jГIĻ-WHSR;Xs|8kX6뵨FA\pmR:谵tDfD]2$Fe*8f6b٬S`jVC] -,8sv+?|`JS8HB ̮#MWvo LM B8rFL"/;x`ގ5=_5ZEZҒtIQK9[)- O=T`̌/Gi"D` X<{Vh/iy,!͵?<ʢWPL|5Z|YUА3IԚ0{̩SXCc>FaBk3pZӐ.,߱{7R f |3|L8y_fy]Z xXam؄gf۶m|zɑɈgޠ_tM|kװxS\gUT]Gg|sceL> rL[d[][&xgv|Ƿ'q/ىwl5;SS"l :UJw=;xЙ͉ӒI\Gme% ص}~८94,jF]g&CZ z&}mU"9f Ȓr M3;ڵ0PŭCPsܲ{r 3eY(`Wz77˄Kٷ:$rC2j$ 7i$rO?u"hR  -! 2Y[ qƔӸEnH{ՠb}H`[馡FmvTЦWT]0^{ ew,mN 6!PtAS&Dev#zCn#,Eێ>yT.i̎o*Iw'jz&IJY?Z21ꫨ!kDx!"Н "-`U]Zđ#(ONbK/Ƽ JoiAێ beLu#)2fϠG7:q{;U1u8RI0pl`҃{`+L>/#NK&}anۆ¥KXx+7n"iwWӲav@vN'^(mz"P+>@$0!ǀ(n kpo} gjh.IO&ݵ jX8wOC5)яGazdbmHxFD)fXB *Ӕ 8=#cex;܋lehF{;z}kő̿. WxoEz\1}ilقGAjFeiCm.1/y"8O$~gj@8ިLL3g|:O?tuuACVR^ϣ,Eg[p4bPuzK 6:::vRzx=Ϩ0},_> +E:f~ۇu;Y~Z 59XW\ g .,`mL(EnAaWq! 38ƍH9M⼀MTzʆ,7dIp6l&{;? bR/#-JGse0V^ s%{`dBim|oVy7:7 #jG h7͘0aE?7_IENDB`nabi-nabi-1.0.1/themes/ubuntu-mono-dark/000077500000000000000000000000001430012456200200225ustar00rootroot00000000000000nabi-nabi-1.0.1/themes/ubuntu-mono-dark/README000066400000000000000000000000751430012456200207040ustar00rootroot00000000000000Lee June Hee http://opensea.egloos.com nabi-nabi-1.0.1/themes/ubuntu-mono-dark/english.png000066400000000000000000000117241430012456200221660ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD:95od pHYs^tIME B2tEXtCommentCreated with GIMPW/IDATxsוǿvByIBH5f`(v;q?U[n֦q6UImĎw׉+qcX"6;<,iFjSLksBP( BP( BP( BP( BP( BP(*o0Mk/;LDtݹkL %IYHɒYr[f GwUXAD2 p̮V…ɼ @0a"zfdtlz1>'}D$ávlWV,ƿWi"̼ - @l.hOHi Já`` z뺇:Աѝx=+H{ 2䗇mDDmkm_;2Xj @-xq󰔈Z-Mmr1%[%%ZCDԴ>JӴ@/`K|K=MD%"C t0mYvix@vδ_{W ^bfl&Uim[n ˯_ UKx4?d8,Ylf_l<?:AtDԝͤ5]5DЮb-D`64@¥ fse{M]ݲgbE,][^R `ae!dDUefbQ冇%cM6Ǔ4:%,gf>5 t-)R3rqVBADNYJ DADeټa}nWUb@^J~^Dw6߻,ffЕͤ %CU Joٴ޲O:nKkP}$yXJHlܳi]?(ͯp5M׭/reǼE{_ԤP0OlݲvTN0دpXd~|2n>nB}$g сgfd)-fN),TdX/ZA.߈LD`>{MJrV`NhSk5U0s[ڥY/ADI%D$`0fHs-֕cM|҉.߷oU,-IJ7(j{+xݶ.Ŋd@ሪJ7' uzϙKof.x9*9*ѫ<;hhF=Ny>qg# M`۶M¾-z2~E":Uf 2v" *<{vK)ە5mnH eJ7 fN33rC[<m1ٶWPo^أ C)%{鹉wmtSp6'R]n сg\ȶ%6ݵv|ݹlJ [*ܱ, Ua"\/7` w̔$RJ75lM  }*J/eBh3[p-%\6P̲AK#D$\|?H䕖UIRfHD{fR+n\7LD4My;@ ݫ-OӴrZ`_iDdJLD)%D_ߪa~L|RJy$.f>Z뾾ޮD0hfRK`fZmDߋ>{N_m3if~YHD㱖 %u"J#\zzo1 сՖo!iKPND\6m(\?j9L=wҮsȵ,p2mKܽq퀳6Pp}&~^RJ46!mNKn? `wcl:FDo:@hjjZ4)%2s'@oG[#&3jV%+ fFow>f_KRFUH׵i!Ӯn@]}mш[ z@ a4z r~ۜHnT#I_ar 3ct21 r,TX &"ߒ*} 뼉Sn]̼Ƕ7nbi/3u3moJ'"8Ҽ{m )URɄ[#}r5Wr&3. Qb顤綾7!Љ=M82:f)#.2?5m>5er-+lnT$me,7\u8$y%\Pp'K֘8T]3zӦ^:^onnlѣ'jQ1;DdN槬'x$ @S>_I!f_|~"" ilUk(R43׽2zdnkk&3K"f3:%`E!HКͤv5}[0LZ.(%4xqf^yl=C}^Deٸcp{>Q DyR,w~/fY W_9h`fAD&[D4t]7x_z2#bfD6߻qK/nxv˦uTNd|xuy3g "ѝƉHJ%m?喦nnfp=@.o[PmYjjs6>/:Vy1NkOӟ~k(+^)%zWz-˒DT޶XOD|~ʣ-#"1K'9zf͛3O._8s>!¸W@20 MLYB{eGl_ݻIt'3f"@y^ l Y eHśۘK/G%:3k̼wt.9_702:̼Wyg?i*_mŎUHVfRUD̬&{^7p3?)ΚyH!|iሓH+zkζnfRUb[[pMLW~s'q,<^$e"D5m 8x I33:V$k3wΉ-#c%,yDDO!'˗h :J"jajX4ڴq]\F2DcN:=7kDtqI8y􁃇?03cƵbvBD|g0]Cؿlgf?~8~yә"ttS E#c": K)4nR}04] D|>N$pN|xք"XiW>?;iB8mc3i4cg+۷Ƌř=lZ[ ; =z~|h6zw8M<|xLJlƆ&(IDT,GvlkT~}R .MD{*,QWUy[qS8#3 2=](۶ܝ[asRGBbKGD:95od pHYs  tIME #z%tEXtCommentCreated with GIMPW IDATx{T՝ǿs=/q  U6vk40Ű#!JB"1A1F*GbBUh  sDѠ y2=3}w։3-aƞߧkjn{;9{`aaaaaaaaaaaa$ķH&A @:d͔`/\>\J遈 !O4O)-k }H哎fs=ot "*-"D4 h$"\{eԁJ)9s\vl'qͿ|W CLO&d,]N!Xǿ IϓA)C@4illo>D20@ϟ 0!Bk i@y[l뺞*l.~\Og|pt+<jN͔)BU P`>̉̌e#Akߜ;̔ԡ4@ww:_]n O0]k<`kAB@q)A"X S͔}}9zx  =n@ hv͡|>އ&KCC7ߟz뭸oٜ`WM*zVZ)t(BUh-MMG&5l PBtƨxRJ4J2\׳Tڿl q][zR Pip'*m'yRIȧ zs!-"g}RJ-譴0pP?~`ݯm\ULo^)3^u=E֑\$xԝ][ <ᑥX;.Y8ۓR<*%<S\uu, 0lLY^29(4H(~d} s[bwN e!;wj`L๑;D|46L2@j˶ J+{Y~b0jSZmgx@C>o/pݳ=hĨ5qL?vziǛH ͔a>VS<"6Ë$cȸ3@2'G*e J%8=y>`L  +f"\.֑FㄯiդƆ ogRZAl>^p_I¿aXS[ Cn3eI6gZ{9_+ DDӓNoiF2 \0X,RΗ&L VjYg~rBJ*UP((LY}pd"~t Fq"~/I)ݙ4(OJ]lRz[Gao(fKJ3e P:H/YRdža BooF#yb|yo[b؎`0(NM&c, 0h$u+.BUUر׷?D"̔?RyR/οRnw3 C 0Akg:[k]t'"ھc#`<3GDF3H)GPyRZyp(ɱ]F#?LϓKsM? /;_[C90c3)RJo4^pޜBn?g;n ͟{Y1x3> \L|!m2[60.Hnb_ήsbA[g|D=`śW+D7 51yRWqy=nEkR\o-YRVAÇ淅&.<ϝ5sF}# W C[-_U\3@28iZk۶'~cP6zw~i+p8`^gޥZRk_p#--[#p63e,q Op==[œ?hj`jϓ]g۱X42SL (X,gM <])Z)ͷX]]X25/YfA=s'.]]yMwco <s]O}=kmwUu 0fh6s Z ݲ?MJ3+]ʫ&uA/LY/Tc /"{޶cߺO>:+z~w`io̔H>|2o }%K]λYok֘06DDl1Sbyơ|Lğ!$A~Ȍg&x15*,z& a0l J/8}!^I`Jе^PB/ ) (fF8((eƘ#Wh0LYwaaaaaaaaaaaa9߽+݉IENDB`nabi-nabi-1.0.1/themes/ubuntu-mono-dark/none.png000066400000000000000000000211071430012456200214700ustar00rootroot00000000000000PNG  IHDR>asRGBbKGDC pHYs^tIME 2T3MtEXtCommentCreated with GIMPW IDATx}gp\וw A@7H`I1(ѣ`[d,ra ߸ic@--%fݲ,Su0LtݚWQ EG}^ѱlo? 0F[*EH f+ >j"*gf-ϛTt W, UQIdnTj||"̌XdghJU"KD1hK[%셳nL"e횕T/((//+-.}~YTEQTY0T:Odww7z$EQdf/f]4nڨesyksƪM U>%?@D44 Ccl.Jet:9<4:zg}BP0藅a4LDǙyo-~uVX̆aV"#jgoqŪ*P /$ ?ieJ*Igǎ<#OUd-mBƆb_L{ضM%%E,2n)8:l1 fsL6wH|l?9+yQ"6G[Ss|4X^"tݰ鴱~q+|pvln=[ d"hK[GU:E"5~fHDDo}͢p=CR{Rܲ,?"UU<@h^Eye>u5ˋ[oB@QdADA`X|t`$\}#mfj"ٚ- z]XZҒJYX0;&l$!{;;{'vFjzc5scf) |ym%eYL TWy[\M>?<U$ |"awsX"f^_EDۙ "dF Pӎ\O%Yj?IScXxH%4`&"f`oQDTT/xT߹Cy[ɿ#GN$~DD*3onjlȹ[6vx56|/&W8;˲8Hwڛv\= ػSn ie IȖ&鏚sV=STUP%$IrEyk5+--?xdV 2f^Y9g?bIDնR!yD bxE#H'J:X KK-M Wt<⌙X,2:_~=PPջ<'f$RԉĤvu*+\l)(|K]ɴnN7Fj2;X8`fދ'cxI] kVQ p7MѧM ˘+DTd? _wnkw}~*3FsLwq;BDދE!@8KTUNg'?DVXZڟK3sy$\3u\^GZyҲX@Z$""#sM d ~ j" "mKK_-WmB(ua\aYu^LX,E"5̼DQjm7T]\X[V3CӴPYQVi6Hf9S$@y$\5puQR\~e[$"*fX,>WADO&S(lpuͶOe,>SdR]7\!GF3LV >"j3J|f. ;_:~@$RhiId5WYaO$bdս "jW (+-QCH !DW+D@DԸfe "iH1M}>{>t[qqD׍YX3~> oF[N>zcl8\P $Ӵr[\0ULτ4,%I/.8qsHY0pg&/w|ņ5fؠڿLi|j24eY񊵕]ݱxF* @6 Dp[e >|P/>h(s&^e>γ NO;yH%;5$`fT/X-ۮnI` mx,\.[\*Rq6mo,Ԕ2s&x`|+7H$φ$ "*./YT6<27QUՑpID|҂D6˙:t]lǵ٬޾g(iJ_]װqf39̲,}|BYE[v*Ƽ KzcѱaVԁmlT5M7Hp-3Qe+*u]?-K2ֿ['<"owݕ dYVNfaozMv %v~ Dي3V\q%Ӵ,"44:>?0 ^\>ou fsys4-;ƦƍTUΆw`>>mhsup `匁e1kq6\q[nھܶK,E,too|L)ΑV|t,#ryo^qͶƫEQfs-)fJ3˯la ;֮YY᜵jtM7sABP>7ou [sJO\~Ifvm'"m{?u\l,sǎ * ++DDWlXSwali]ɽ_cʊ1QXxѧJ&Sc0ٔ=蘘Ԏ48m0\_h=_AQ15\/>D緭nٽcbg`|<1lZ|FNgé)@s53q놆9 I͍Wkz|DXiŕճHme.EbQhD+UYR\T._}*ETE=0 H9A'*\>)wS?(ncdg٤i vR$B:vdbl.CsPٞ\|gVwCiSxp<"/IT˵E3+I1kZg^|桇<`YhKsB+ !i/7pI0MKޝGlb_Ӵg_y{FHv!.Q|:#I+dY==}iߟ[\[yNB`4M#%'BT `9l.Ng*N!$I$I Aߍ3w/[Qd$I-m=r1x2>"j(* 7=v & Q5Mr\"H~g%ŗll_@h*ΔB`B!$!lB VcYѾG{YVf'/ոic% >ԮXbIRA2٬e*eP؉䝷ݴx[W/YdZMKȵ#b"4Ϲ@yYl;NmT:cDU~OQ(8(4loHIqHW~mRj:Xذ6 4M-cڎʂyMLg mRQQVsx󙾾N˲U+*).EHgX^o=Q\ϴ y ;*YeIx\:llU9eMw:1֭]Unۼ|U>70b084LOo_W?ǯUU[4°'&c/~$hJ3Fm.v-7F"5 d,&}_ʟW-R1ioi}o(R>7}t:[~U%L&5# f~hKGzsI`bL$Rs ;H?߹k7> psڥhK{_yyO]g2]!ͫ,f[ӪXHI.4>M7]( (~Օ6*fY$˒( `ЩFJnי8T޺EM ݖ8Y>ffUU/[ ͚-+,˖eq(lJ4rf~6{'De5M K 2Ln2TfcmL$Iv3ŋ}{65ͩN2\JL&ss!q0:6>+o}\8e˕WWzmU#K]N}Aף OY#'И(Bu lQܼ}Y\ָic%IƆR^"b0y嗅gS:WP/xݲU$Ij͖=rfV\^4q$ ^f U4ͫ(/ _3ʲ$$IP(s䱴0LDD%I" xL&Mp``';\R\tjPE&-i ,m4i%@su,]o|eyvj߳d"),$IT:eͲ "J&SBP̜$ `MfN^xh6ϴp/O|p0&`Eixht-˜Տǟxn["y.Y4G[(:Q6ӻcg:o(%;N$En̤8rc4-c6W.=㪪8cvMIb=8Z^̆Ixt=fQ@6Kaنr]h g2 Ѷ3i eYYYɑYM $s@o;Ϭ~LJ͟/;>양b, YνQ"I{ۅx&'d*¡ٌ-!@-A:Nv'IL&fjή I:e-m($W畟xúg#adt,;4 (3%Yhxx4}l&AtvN39=JK$bgYeYcO -mD`AtsXkvxJu{M"0 BȣNg2ə L!OL ,{< |$˥ش6"B|`6)3k$G;GD|^7郗o훩f# * ryqN =zvmS~&>[-fF5قF?+> N"LӴyﶾatܡĔ]`hzJFIDw\.?UN/iM8UVF?sx"O v;ozZ`C),=Dd]"?5*;OoGv (m=I&@=TU<:3]abDDTw3]g`3LPhͷZN&SuOd8l;`LFFeadttDd8%ԣDdt?1:0P3?F[ڎ} `w0Bp.e94/T&xw[y*"g٦j̜qonG>~l6O [S;pLŬBXl18AZ۲,'v/hffl)1y=O?U:I iיR cfxTwс|^8gMgԃ={v0,UN[oODb|n\.aHfcc8G"5:Y`0Wvv4}8BSLd25G|vQUUdhK.#PKD!Bq Vff0޾j~'}v`f!dƦ)pN" @H$ AKJEUpDטbRqq)йT:3G ~"IjˏQ ȟ9G{P8)TdY{_yiIqQ )8H&#>+CUUUfѳzmˆ!0ݷ΢P0[R\\ u4 O$IBȒ_o|^.tQ{su_ {9Mi[6V_if*x%̟W>Le1c_|g}$I4v۴nP@u$"l|e榆e֮PZ\\lZ>ΤOvv{u|ۓ@ 4G[g69WqoQ-0X, LPUU U+*k׬/. iZIDATiGu$E&"0Q"z9zAj556*PF>Y%!eݺV\VSxaddtl9~'1<2s$ ;%h޹0svi/(efsxef,f˲QeEQP2MWqOG[z/"1e"caY^W*+-dYc||"/IgܠiWS'-m+='w656+8."8"d{^NS<(In5BM$8]gm3\|sJ; 2"e:{ö<m!̼֠PrS*G[.ݢ.\p… .\p… .\p… .\p… .\p… .\p…94fIENDB`nabi-nabi-1.0.1/themes/ubuntu-mono-light/000077500000000000000000000000001430012456200202105ustar00rootroot00000000000000nabi-nabi-1.0.1/themes/ubuntu-mono-light/README000066400000000000000000000000751430012456200210720ustar00rootroot00000000000000Lee June Hee http://opensea.egloos.com nabi-nabi-1.0.1/themes/ubuntu-mono-light/english.png000066400000000000000000000117161430012456200223550ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs^tIME ,tEXtCommentCreated with GIMPW)IDATxmpSיsdIl̛xH6y$M6iӝm;m_C?tfvi44 ! $ `ly'/% `ٲlIg?:C[tMx ߌAtν@h4Fh4Fh4Fh4Fh4Fh4ͽ L')"I|GDHrXDZ5whܣM$@)ETȔDġpQ]-{jNfdԗɌTLeDsTWE6I%"$ߎ6d`.:RJ~pfd")`W^m;$kEd-{@ɐRp\/ݔ 6wxeY~kRfO{ IDH۶L CF$RY`&FݯX `s5 7 }}GL0 ,W<[)V2duov X>@Wn +mhJkHڦi;OŒp-V*tD.lLg{f|3ˍ}wG+>[f9"(·B;HP(V鈯h}*SZP @zzDܟ_t] PQ `0I =]sҗ=|o+W9]!-bAPTZ;q?l;G0 . jQ:_0%D6SNkVJyy$`R gvo$Ar[,>kHiȧ,ˍGtI=yOD(%$)Ba/򙦈M%b>-C: v}4ˇ~FnNM8[@瓃-G*^ˬ I_\((4+~u7i`E•VUNEdp7Z:/gܱpGfDVDJJ =}5oȿ M=} R077h<(ghDɿ^H>T>{ǟɌ6La-@[(ɟ( fv;$Mj}`A]7;"S9aWw{7V-/03pqKU~/w}ݲw^ J 6&M Zw|Ξ}Wdc5^5;^*Tl67g~#jܝ?Rrt}hUz4I$;I&IZ`'m_麐|q0***,[JZ~ӛi8m8S$麴_kJ&3i:Q-[qw>ߺ,Rw>5YN9 L>l7cZfWBOTˎ|z,t/ 0{z+ _Z_"#gҗ{XGTJ߭ 9r"W+u'OW>^$";uB1'J񟴴VwZ>A#bHGP,Qj-w\("ȍO ܿ\$y0N<a?q<7a׳쥳s~CD ð;Ό>D-r's'ɭeC22]q4zg2m$W&K ɵ"á?etH~3 U ?~;Ù%" 7"24/{}qVai N7pq0|\e˲X }o(Õ˿Sd aF^SH_-oN? e'mYVC.-(S"b߿Xn1lA,5DJڵw Zw)n;rlm>[Ѷm_{ "bp:K)trS͘thWRgԫ^TJbK2#^cWǙїMl 2#cKTv @ gcO5`]"b?yc…gn^MڵLcm0TMR(b~? W:$禓hmSR _eХ@__r Uُ[֭[Ȍ `hS`IơK֬̉Hؽf-T"a({CB3 .M,[x|t4kqԇ;5=lŹsku}C"bٳ7m1L%bsP TTXyD7t}>3n@EL u=vEd8_P)4p_?wrd fDɍ"b?;6[nW`po=uhY \}M}l$o;|>_ \nvǟ}g2BR, vU$\Îy=m[Nw,~Q G' *Wu3Up `S:7XX`iΉSC鍮!|;pO7EsBҟ̿O%^O:WaCrJ Yp8d"rD>|P4cX6m\7`ӎ}:=koh +-igHDI:##Y > qܴ]DL"26.$#;:rsu摑Q] h >)?ڿb#dODѱĢfg. Z$"rL?닆axl|d(Un=9;5хǖ.YJ;kfR*\ =}+IҲl<'eO236eH&J?/`˟EHoe_@};:REd|woʕZكBG6o~m*` ""2!"\ry5=i+WW}EOZ'j&NτOrm{X?Uwe݋-̹+oY}%0B/̭^G$>wp8te$?1uG?"kΝStrmQ]sj Z4Nr~4_|Y/(p b `&N$V'kl *mwpl'2նHeJssm;ʝ 㨈жm>呁ȗSX ql']+ ǝ 4q~aٱ"z&z455s.n}8tڦ~"†'.x}*DRH6d P{K&eSVP)iӺsFiPD( 3Oo=0D>쭷[Z5Ŧl`{^}9yCD 1{9B|AOOM:v 2DHfTC%2U/k-Er8Z?[[?Z۔K'"06 /|ӿr@`b4;\aL0t2s`WK9<+g;sqdڦ *li:SmSdxdox? 'nl7w1rD@ɍ| M^#Hh4Fh4Fh4Fh4Fh4Fh4fJ,ʾQ+IENDB`nabi-nabi-1.0.1/themes/ubuntu-mono-light/hangul.png000066400000000000000000000067141430012456200222040ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD:95od pHYs  tIME $"EtEXtCommentCreated with GIMPW 'IDATxtTǿ}LHH^B:(z@u9(֖XEز]mW,*mer*A /v٭,VE !L&;}2!$$99L}            [pjSI l.@'N78 |h`f(]/7+Z 0`fٛ22|˲RRgg<J'3ぇ>ր|2 cm9]g/{ꫮҩ$KD(Si²,(eXZ\.?"~2f_dfT:L+5!Lee O 0FL +\۷oʥ"`7(5| ≯\W4ϞN~|*~7@:`|CCuL+3G߇qw0 wTB9`z:Līkjjr)I@1igem_*09"bh DPql˲,@i4@LY% U񡔜@-wöX4  o"rhX.mَ>\c 3WhTWP)8zKrߕJ2UW` %H4U^)qH 0pl3ԠU 0İm;ebʄwΙ( $d.=N:>g —*N) "ꚧqa-aC.X,Zƍ8bQD"N*bDsh۶8oYV`Yf`*Hz u`$R9;srxơЌmbe1MӘqz|| Z;@3cYgve1@t*(I(M:PB}.9ifULS&O< ?|๾;Tr235,ymK^Zs8V\w;~.g`N%#lW_us|2A 0HXk)_j2]8|n<&%"d?U62MiN5؍!Ƞ3@:$#"~ye(3ĶmF``p`$3;v=aEh²qHF2Jf-8mZ֚Νpk#)[>Z0Ʋw|~XCٿ D L1MPC}]O=fVebrge2uʹ;3mYC5T9@:1"*n^N< .*DD)7hSJczq\?70.2 ߻wJ* 2r6~:F&=0w邰;af|zV4Q=}#odCiG7:%Tn<NZ>ӈ(WOfGRwܶpg["Ot5/_nk#6􁇵 @Z гkDM|Ok񙙦N`k")<[)RzEffYf =|ճ^Zu?bc ifd^aラ0 l٧5'brbB&AH0])#طopl[h4Һ价Q پNdop=3#֡liieҰ `e%\H)~;K`TZFEL[^%qÇK򳗇ҩd]|˝1u`aoLcgqm?o=ZӸ|U9W7YX pL3af%_ؽ{ߔ0+;R,sqȆ3~3cIopݜWֽLBAQO`~آo/7pIgf.l$x}A\^1?Ai (i 4r{#'`rXsNYG|QJ:luHJXU|E? \(h0ۻD߽tA>tqgOUݻ1Mfʡ8{ J.gK"'x|SݰZ"z|4Uqc,6"s ٛ$~Mj)D^lLAzdƴoN7xQ$`Sɑf~ZƯ쬎Άn}>dV=w~ &)"D 5@?>x|A}EW{apO:'|JKKQy E 5@(L9u_oyI՜lp蘉T[[7ntbXDBM|4\`3J)7~s 0 w5}XSkk|xeV'(=ލ'ft*9&" 6|bgdP/[=to\]ZG8Dƍ'^9+3`e;_1z[.{cL/UȏD"¾\.oQr7'RV"7f_ YQ3356~kk\.J#|xnjZkZW&7a[ouaxW|ҧW5/kV3$xPXGD\.os׭9{K\:=)fᵻW5/7nd[[xO<#3zxO(i񳟈7 ][6g=ăffv 7xSdXn< LᅫYkviԫkV<^&ֹ!8&xv,Xv?P_n~p2\ `O$EnFUUMp֭~tE$Z Bij7y_.4;N%f[_7{dV33e-%7" 4@hөVk(&ma( f&x!JuC"L1 @C  e=VENaӢ%5iN^_i"]). vNaD bNrXэ'ޑ%            ViX4!IENDB`nabi-nabi-1.0.1/themes/ubuntu-mono-light/none.png000066400000000000000000000206771430012456200216710ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs^tIME {tEXtCommentCreated with GIMPW IDATx}yt\ՙoMV%KU%xA`0c L'3}2szMn&aIȄ61 6$,yQbwS K%ystlr~ p… .\p… .\p… .\p… .\p… .\p… ..T;]MD3 7#@wY?3%I~ `"6 fV(|DT"1s u21  7Xy'@WG@!0@M-`0x0ID) 4eƃX*b< @-*"9s;'̂6ZQ0ܐwoVz1JDʝ IJLD$luFưl"hJhˉh3PMD\XB(eQVLRJ, $tȠ0H96 i]%MB3I[GD"f2Zա$2-2-SERJ "SDtmR σ:"D4֘el!,MӤ*k:5Ji鴡xYVZ N`eR4Nga 3kRD.3o=[ "|m2^*(۶7Un_s`2d C3-K%̀FaaAdSkG*STZI0L}2P⋘f2,[Xܼ2z鮲d"7MK7 C7LK45FJ‘ƋZhao*V P41!@WGND+\)+|zg=Q܏[f #HeeyK-<`~)%b UJ)l a=H 7`̙B#zsl?_' DeYGÜK~/Y^V5{f]=w߲:Og2"fBơ1!@w]j R엋*Ӵ!,grnt H}#աS >v}wD'4IfBD[$ ڂʂ@lm;V߾>o L@?N"ITZh?w6RJ EgL}D^weFϙj!rElv"Ob޾#G%+W,ͯ߻'kdJ]Mo"-lf.!U\\h+z[x$1t[#B?EiO( 2-Kik?>c{Zt*&f 7&@"0KD%D98)%T*8=7Ͻ\w;֭i-Rh`agX"iXh31ŵǫ;ؘIg|ei"Y3 2LS(¶t!BXDTJ$ysguDOקpv*LL3Gy+o93:+=H;\73xMH ,v̚ 3 ^}ke,/"Y&duup2-sL@ `>?{OrVY3ƯfEQLz`{\:۷dCΏEt"jNʼ &h-cODY3;^sLB >LogH1LwRZe%%OwKk6STŗ߸Ϊזښ`<+G`ouG_HD@Paf!,f 3G6Mk:ؘVuGg14;͍x<>KoܴyU*c\ _D239|DՕ+lã:h|u`lݾ<-#Abk&'?t:#o)TXDTkdtG+BYDd"Z]M&CJ'yik3/#`7܄nzִ%I2)B(3D2ޱnMkyc4.$5Oz觏œ)U4'wM7Ky,׶lFNaOeru_PgW_QPeDYexg?GgFUUyΩdF;q!@0BPWw@eY[_Śm***4Y@DuG lu @? 欙u}Zڂ9ZPoʥvd2boԄ2^UU,4?q f2fӼ`f,[d5+4pLȹ~q(ND,M_si! "bEQpxt?f%%i ym$'H$H0ޠQsמHt8<%aY*UUU-LУ+c "g)%L }ws EJĘXJߺY4-+Z`DS_{[fI`Wۯ=$ꆳu̬̕33 vͺs {cȱ(7O>ѴN{}-oLM$yG0NgD0ADdpmui!w$陏?auA{YWGӕ:ytR 1C4˯ׅ5eig( ̟p%1u=5A98pg?jy_ߠT"@C3E̜0B>K߶L?jE1JKS[O!u]K1$$ؾyWޜml( (XU2`13^մ@WHɣ5^z s}or0> vD#yco V.A$0~2cV{"g=2C5,%y=k-Gץ*›lXL&B )%y=!Wr`'N;vE :gΘv>8 ! x;Itԓ<2vJifɆY^˧?(bVp7o.,,0l2q⒢Y%O8TUN|!23jjt˗,j/Ɇ;zwK֩} /b)b4HcD 鬬d"t)sxoˇ+^L]פTiǣD V4Ueo.4u OO3ΆUAWGS̈́qeIIVrHDĉD_=8$*FcN?d"s,cutFyDks0( OZҚPHa‚q3M [.zc N TV_^yX\%ϛ;g3R2U=Jq Qf6Piiq%}^ofCOTDg޴,qTQKk}7 ~w۔mb2L;VZ9 %@0ܐB&MWWJKH)'w,-)J{$("ϟ\NgIʘȦ `!1q34]g4#8`Y]2f3~_yŤQNA:ug>nM.٘*F_|ڴڶ+^:;=~GbeB2c$=f-n\;84YْmyvlmXc kTu]u]jʏˮpC6?6<+{>6Ͼ7Ldﰾ̝bHcr52vz^x[WU-dюJEU8h99i-onr̓3qn(xf<<ٛ6wӵRJ5_\y'@ 0M7^w(KN IeDšՏoa5v)숥N]h+HM{O|F)[XԆ3kFs"WItXt2'='<=\KLLmMM#{ '2C,j%Ąj޸ΛyO hkl *8o4MS؉Òi3TTuMP$XfIl긫|jzoލyyO)l.&;HIe} >/sAP1fm̨>||aiSÃ} @dJՇ4M˫ꤦ+N7RJ'unQ6#mLyr`G39h-Psw4 Awx>J? 7 i i2[D֎t42W}?/-())9SUYAD|tᆏ R|6fFuH9橍3e[`nlGwjɜ+8ujm1$ϙ]6vKvٗ[S"T_u!O3ӽNjLުNn`EQyӚU-]*xʊ3zrSvR-fƆrR2n]qe%i\Q˲DYYI;o^ pL /:|"4U)Uǥ\̸r%qۚǹ( 7<=2C?@$R;rGEM 3dO}yPUxR2O_}凋 3Oap3s+ff(4-5.]"{k{ "TzAefU*Ғ`fE[?'ODRM+ʘپ+W\]ID?!L0s]C\vG7.$M  ̇- !g1jE|Bu/lO˰7wJ@zGHA{SLtF\pngeEyǣ'4M=ǟewg/RUEV[؅Xl}_ǘ^w^O:-/+IK-Pv;< u]7w4>Tc瞆s,~QaA]wܴ[ohMR^A(Ҹ}HWGS=UP07ǞY?PuUˬ*~% Ͽhv׼f**3c}d&'|uM~ᶒ ֗XwcHLef7 rl!f@ x_/|wBǗ913-a_!TZ1 axd`w`fLFkľ|]y͝uk[b̺}ꥳ=.%c햵׵|uͨ~P!e+`[xBi]KD| B `{C*y=cD$S鴲NUUU ÄakYGH9DQaa _ۜ6"G?ZR꺮o㾦{[qJKzL3;/`i:d \tsYYqG$h7JD/ G6bg)|US@ JpwOoM<e!S#G[|k;bYê4?1!@F4yˇ5o9iECŊ]K?^_7iiu߽v rÍD5" UU၁!@38y7WgX/pSg [<^tB0p^juG @5!"ЈԼj֚c:W\nzd,ldo7dY҉D^ Lt[|Kʹ'{ Ba)%ySR${IDATJؗI fLKHct Q3_8BVS?0fiiIڲ,[w`9x idI;\`3_dYvŞHv9Ƕj%;F(7Nc {'*>d͓9 d/4ٹØHd/w&W)P `E=^ :BҎfDNbvvt4p(u… .\p… .\p… .\p… .\p… .\p… .\ }iQDpIENDB`