2 Scim-Unikey Input Method
4 Copyright (C) 2008-2009 Ubuntu-VN <http://www.ubuntu-vn.org>
5 Author: Le Quoc Tuan <mr.lequoctuan@gmail.com>
6 Home: http://scim-unikey.googlecode.com
7 License: GNU LESSER GENERAL PUBLIC LICENSE v2.1
10 #define Uses_SCIM_IMENGINE
11 #define Uses_SCIM_ICONV
12 #define Uses_SCIM_CONFIG_BASE
13 #define Uses_SCIM_CONFIG_PATH
20 #define _(String) dgettext(PACKAGE_NAME,String)
23 #include "scim_unikey_const.h"
24 #include "scim_unikey_utils.h"
25 #include "scim_unikey_imengine.h"
31 #define scim_module_init unikey_LTX_scim_module_init
32 #define scim_module_exit unikey_LTX_scim_module_exit
33 #define scim_imengine_module_init unikey_LTX_scim_imengine_module_init
34 #define scim_imengine_module_create_factory unikey_LTX_scim_imengine_module_create_factory
36 static unsigned char WordBreakSyms[] =
38 ',', ';', ':', '.', '\"', '\'', '!', '?', ' ',
39 '<', '>', '=', '+', '-', '*', '/', '\\',
40 '_', '~', '`', '@', '#', '$', '%', '^', '&', '(', ')', '{', '}', '[', ']',
44 static unsigned char WordAutoCommit[] =
46 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
47 'b', 'c', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n',
48 'p', 'q', 'r', 's', 't', 'v', 'x', 'z',
49 'B', 'C', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N',
50 'P', 'Q', 'R', 'S', 'T', 'V', 'X', 'Z'
53 const String Unikey_IMNames[] = {"Telex", "Vni", "STelex", "STelex2"};
54 const UkInputMethod Unikey_IM[] = {UkTelex, UkVni, UkSimpleTelex, UkSimpleTelex2};
55 const unsigned int NUM_INPUTMETHOD = sizeof(Unikey_IM)/sizeof(Unikey_IM[0]);
57 const String Unikey_OCNames[] = {"Unicode",
65 const unsigned int Unikey_OC[] = {CONV_CHARSET_XUTF8,
69 CONV_CHARSET_UNI_CSTRING,
71 CONV_CHARSET_UNIREF_HEX};
72 const unsigned int NUM_OUTPUTCHARSET = sizeof(Unikey_OC)/sizeof(Unikey_OC[0]);
74 ConfigPointer __config;
80 void scim_module_init(void)
85 void scim_module_exit(void)
90 unsigned int scim_imengine_module_init(ConfigPointer &config)
99 IMEngineFactoryPointer scim_imengine_module_create_factory(unsigned int index)
101 return new UnikeyFactory();
105 UnikeyFactory::UnikeyFactory()
107 set_languages("vi_VN");
109 UnikeyFactory::~UnikeyFactory()
112 WideString UnikeyFactory::get_name() const
114 return utf8_mbstowcs("Unikey");
116 String UnikeyFactory::get_uuid() const
118 return String(String("16ef5139-de02-494f-8d98-ddfcd60bbae1"));
120 WideString UnikeyFactory::get_authors() const
122 return utf8_mbstowcs("Le Quoc Tuan <mr.lequoctuan@gmail.com>");
124 WideString UnikeyFactory::get_credits() const
126 return utf8_mbstowcs(String("Scim-Unikey Input Method\n"
127 "Version: " SCIM_UNIKEY_VERSION "\n"
128 "Copyright © 2008-2009 Ubuntu-VN\n"
129 "http://www.ubuntu-vn.org\n\n"
130 "Thanks to Pham Kim Long for ukengine")
133 WideString UnikeyFactory::get_help() const
135 return utf8_mbstowcs(_("This IME work best when environment variable are\n"
136 "- GTK_IM_MODULE=scim-bridge\n"
137 "- QT_IM_MODULE=xim\n"
138 " If you use preedit, you don't not need that\n\n"
140 "Some time, in some application, you \"must\"\n"
141 "enable Preedit to type best\n\n"
143 "In some application, scim can't enable,\n"
144 "this is not a bug of scim-unikey.\n"
145 "You can try this in terminal: app_name | scim\n\n"
147 "This IME come into being not intend to\n"
148 "replace scim-m17n, just a choose, I recommend\n"
149 "use this combine with scim-m17n\n\n"
151 "For other support goto:\n"
152 " http://forum.ubuntu-vn.org/viewforum.php?f=85"));
154 String UnikeyFactory::get_icon_file() const
156 return String(SCIM_ICONDIR SCIM_UNIKEY_ICON_FILENAME);
159 IMEngineInstancePointer UnikeyFactory::create_instance(const String & encoding, int id)
161 return new UnikeyInstance(this, encoding, id);
164 UnikeyInstance::UnikeyInstance(UnikeyFactory *factory, const String &encoding, int id)
165 :IMEngineInstanceBase(factory, encoding, id),
168 static bool t, o; //temp variable
170 m_preeditstring.clear();
172 CreateDefaultUnikeyOptions(&m_ukopt);
175 if can't read config, set it to default value*/
177 t = __config->read(SCIM_IMENGINE_UNIKEY_INPUTMETHOD, &m_im);
180 t = __config->read(SCIM_IMENGINE_UNIKEY_OUTPUTCHARSET, &m_oc);
183 t = __config->read(SCIM_IMENGINE_UNIKEY_PREEDIT, &m_preedit);
184 if (!t) m_preedit = SCIM_IMENGINE_UNIKEY_PREEDIT_DEF;
186 // read preedit switch key
187 m_preeditskey.clear();
190 t = __config->read(SCIM_IMENGINE_UNIKEY_PREEDIT_SWITCH_KEY, &s);
191 if (!t) s=SCIM_IMENGINE_UNIKEY_PREEDIT_SWITCH_KEY_DEF;
198 m_preeditskey.push_back(KeyEvent(s.substr(i, j-i)));
203 m_preeditskey.push_back(KeyEvent(s.substr(i)));
204 } // end read preedit switch key
206 t = __config->read(SCIM_IMENGINE_UNIKEY_PROCESSWATWORDBEGIN, &o);
207 m_process_w_AtBeginWord = t?o:SCIM_IMENGINE_UNIKEY_PROCESSWATWORDBEGIN_DEF;
210 t = __config->read(SCIM_IMENGINE_UNIKEY_FREEMARKING, &o);
211 m_ukopt.freeMarking = t?o:SCIM_IMENGINE_UNIKEY_FREEMARKING_DEF;
213 t = __config->read(SCIM_IMENGINE_UNIKEY_MODERNSTYLE, &o);
214 m_ukopt.modernStyle = t?o:SCIM_IMENGINE_UNIKEY_MODERNSTYLE_DEF;
216 t = __config->read(SCIM_IMENGINE_UNIKEY_MACROENABLED, &o);
217 m_ukopt.macroEnabled = t?o:SCIM_IMENGINE_UNIKEY_MACROENABLED_DEF;
219 t = __config->read(SCIM_IMENGINE_UNIKEY_SPELLCHECKENABLED, &o);
220 m_ukopt.spellCheckEnabled = t?o:SCIM_IMENGINE_UNIKEY_SPELLCHECKENABLED_DEF;
222 t = __config->read(SCIM_IMENGINE_UNIKEY_AUTONONVNRESTORE, &o);
223 m_ukopt.autoNonVnRestore = t?o:SCIM_IMENGINE_UNIKEY_AUTONONVNRESTORE_DEF;
225 UnikeySetOptions(&m_ukopt);
227 if (m_ukopt.macroEnabled)
229 UnikeyLoadMacroTable(getMacroFile());
235 UnikeyInstance::~UnikeyInstance()
239 void UnikeyInstance::focus_in()
241 register_properties(CreatePropertyList());
243 UnikeySetInputMethod(Unikey_IM[m_im]);
244 UnikeySetOutputCharset(Unikey_OC[m_oc]);
245 UnikeySetOptions(&m_ukopt);
248 void UnikeyInstance::focus_out()
253 void UnikeyInstance::reset()
257 m_lastkey_with_shift = false;
261 if (m_preeditstring.length())
263 commit_string(m_preeditstring);
264 hide_preedit_string();
265 m_preeditstring.clear();
267 m_auto_commit = false;
271 void UnikeyInstance::Unikey_send_backspace(int nBackspace)
273 static WideString ws;
276 // if surrounding text was provided, use it instead of send backspace
277 if (get_surrounding_text(ws, n, nBackspace, 0))
279 // for type in Auto Complete in OpenOffice
280 // Hope this not rise bugs in others application
281 // not use SCIM_KEY_NullKey, because GTK application crash when GTK_IM_MODULE=scim
283 forward_key_event(SCIM_KEY_VoidSymbol);
285 delete_surrounding_text(-ws.length(), ws.length());
289 for (int i=0; i < nBackspace; i++)
290 forward_key_event(SCIM_KEY_BackSpace);
294 void UnikeyInstance::Unikey_update_preedit_string(const WideString s, const bool visible)
296 AttributeList attlist;
299 // underline preedit string
300 att = Attribute(0, s.length(), SCIM_ATTR_DECORATE, SCIM_ATTR_DECORATE_UNDERLINE);
301 attlist.push_back(att);
303 if (m_ukopt.spellCheckEnabled==1 && UnikeyLastWordIsNonVn())
305 // red preedit string
306 att = Attribute(0, s.length(), SCIM_ATTR_FOREGROUND, 0xff0000);
307 attlist.push_back(att);
310 update_preedit_string(s, attlist);
311 update_preedit_caret(s.length());
315 show_preedit_string();
319 hide_preedit_string();
323 bool UnikeyInstance::process_key_event(const KeyEvent& key)
327 for (int i = 0; i<m_preeditskey.size(); i++)
329 if (key==m_preeditskey.at(i))
332 m_preedit=!m_preedit;
333 register_properties(CreatePropertyList());
338 tmp = m_preedit?Unikey_process_key_event_preedit(key)
339 :Unikey_process_key_event_direct(key);
341 if ((key.code >= SCIM_KEY_space && key.code <= SCIM_KEY_asciitilde)
342 || (key.code >= SCIM_KEY_KP_Multiply && key.code <= SCIM_KEY_KP_9))
344 m_lastkey_with_shift = key.is_shift_down();
348 m_lastkey_with_shift = false;
354 /** This method not use preedit string */
355 bool UnikeyInstance::Unikey_process_key_event_direct(const KeyEvent& key)
357 if (key.is_key_release())
362 if (key.is_control_down() || key.mask & SCIM_KEY_AltMask)
368 if (key.code >= SCIM_KEY_Shift_L && key.code <= SCIM_KEY_Hyper_R)
373 if (key.code == SCIM_KEY_BackSpace)
375 UnikeyBackspacePress(); // xu ly phim backspace
376 if (UnikeyBackspaces==0) // neu ukengine bao khong can xoa ky tu nao,
377 return false; // thi tra lai backspace cho chuong trinh khach
380 Unikey_send_backspace(UnikeyBackspaces);
382 // append key that need change tone pos after press backspace
385 if (Unikey_OC[m_oc] == CONV_CHARSET_XUTF8)
386 commit_string(utf8_mbstowcs((const char*)UnikeyBuf, UnikeyBufChars)); // send the solved string to client
389 static unsigned char buf[1024];
390 int bufSize=sizeof(buf)/sizeof(buf[0]);
392 latinToUtf(buf, UnikeyBuf, UnikeyBufChars, &bufSize);
393 commit_string(utf8_mbstowcs((const char*)buf, sizeof(buf)/sizeof(buf[0]) - bufSize));
401 if ( (key.code >= SCIM_KEY_space && key.code <= SCIM_KEY_asciitilde)
402 || (key.code >= SCIM_KEY_KP_Multiply && key.code <= SCIM_KEY_KP_9)
405 UnikeySetCapsState(key.mask & SCIM_KEY_ShiftMask,
406 key.mask & SCIM_KEY_CapsLockMask);
408 // shift + space to restore keystroke
409 if (m_lastkey_with_shift == false
410 && key.mask & SCIM_KEY_ShiftMask
411 && key.code == SCIM_KEY_space
412 && !UnikeyAtWordBeginning())
414 UnikeyRestoreKeyStrokes();
415 if (UnikeyBackspaces == 0)
417 UnikeyPutChar(key.code);
421 else if ((key.code >= SCIM_KEY_KP_0 &&
422 key.code <= SCIM_KEY_KP_9))
424 UnikeyPutChar(key.code);
427 else if ((Unikey_IM[m_im] == UkTelex || Unikey_IM[m_im] == UkSimpleTelex2)
428 && m_process_w_AtBeginWord == false
429 && UnikeyAtWordBeginning()
430 && (key.code == SCIM_KEY_w || key.code == SCIM_KEY_W))
432 UnikeyPutChar(key.code);
437 UnikeyFilter(key.code);
440 if (UnikeyBackspaces)
442 Unikey_send_backspace(UnikeyBackspaces);
447 if (Unikey_OC[m_oc] == CONV_CHARSET_XUTF8)
449 commit_string(utf8_mbstowcs((const char*)UnikeyBuf, UnikeyBufChars)); // send the solved string to client
453 static unsigned char buf[1024];
454 int bufSize=sizeof(buf)/sizeof(buf[0]);
456 latinToUtf(buf, UnikeyBuf, UnikeyBufChars, &bufSize);
457 commit_string(utf8_mbstowcs((const char*)buf, sizeof(buf)/sizeof(buf[0]) - bufSize));
462 forward_key_event(key);
474 /** This method use preedit string */
475 bool UnikeyInstance::Unikey_process_key_event_preedit(const KeyEvent& key)
479 if (key.code == SCIM_KEY_Tab
480 || key.mask & SCIM_KEY_ControlMask
481 || key.mask & SCIM_KEY_AltMask)
483 if (m_preeditstring.length())
485 commit_string(m_preeditstring);
486 hide_preedit_string();
487 m_preeditstring.clear();
493 if (key.is_key_release())
496 if (key.code == SCIM_KEY_Tab
497 || key.code == SCIM_KEY_Return
498 || key.code == SCIM_KEY_Delete
499 || key.code == SCIM_KEY_KP_Enter
500 || (key.code >= SCIM_KEY_Home && key.code <= SCIM_KEY_Insert)
501 || (key.code >= SCIM_KEY_KP_Home && key.code <= SCIM_KEY_KP_Delete))
503 if (m_preeditstring.length())
505 commit_string(m_preeditstring);
506 hide_preedit_string();
507 m_preeditstring.clear();
514 else if (key.code >= SCIM_KEY_Shift_L && key.code <= SCIM_KEY_Hyper_R)
517 else if (key.code == SCIM_KEY_BackSpace)
519 UnikeyBackspacePress(); // process Backspace
521 if (UnikeyBackspaces==0 || m_preeditstring.empty()) // if Unikey tell no Backspace
524 return false; // Return Backspace to client
530 len = m_preeditstring.length();
531 if (len <= UnikeyBackspaces)
533 m_preeditstring.clear();
534 hide_preedit_string();
535 m_auto_commit = true;
539 m_preeditstring.erase(len - UnikeyBackspaces, UnikeyBackspaces);
540 Unikey_update_preedit_string(m_preeditstring, true);
543 // append key that need change tone pos after press backspace
546 if (Unikey_OC[m_oc] == CONV_CHARSET_XUTF8)
547 m_preeditstring.append(utf8_mbstowcs((const char*)UnikeyBuf, UnikeyBufChars));
550 static unsigned char buf[1024];
551 int bufSize=sizeof(buf)/sizeof(buf[0]);
553 latinToUtf(buf, UnikeyBuf, UnikeyBufChars, &bufSize);
554 m_preeditstring.append(utf8_mbstowcs((const char*)buf, sizeof(buf)/sizeof(buf[0])-bufSize));
557 m_auto_commit = false;
558 Unikey_update_preedit_string(m_preeditstring, true);
565 else if ( (key.code >= SCIM_KEY_space && key.code <= SCIM_KEY_asciitilde)
566 || (key.code >= SCIM_KEY_KP_Multiply && key.code <= SCIM_KEY_KP_9)
569 UnikeySetCapsState(key.mask & SCIM_KEY_ShiftMask, key.mask & SCIM_KEY_CapsLockMask);
571 // auto commit char: commit char that never change later in preedit string
572 // if macro enabled, then not auto commit. Because macro may change any word
573 if (m_ukopt.macroEnabled==0 && (UnikeyAtWordBeginning() || m_auto_commit))
575 for (i = 0; i < sizeof(WordAutoCommit); i++)
576 if (key.code == WordAutoCommit[i])
578 UnikeyPutChar(key.code);
579 m_auto_commit = true;
580 forward_key_event(key); // forward keyevent instead of return false
583 } // end auto commit char
585 if ((Unikey_IM[m_im] == UkTelex || Unikey_IM[m_im] == UkSimpleTelex2)
586 && m_process_w_AtBeginWord == false
587 && UnikeyAtWordBeginning()
588 && (key.code == SCIM_KEY_w || key.code == SCIM_KEY_W))
590 UnikeyPutChar(key.code);
591 if (m_ukopt.macroEnabled==0)
593 forward_key_event(key);
597 m_preeditstring.push_back(key.code);
598 Unikey_update_preedit_string(m_preeditstring, true);
601 m_auto_commit = true;
606 m_auto_commit = false;
608 if (m_lastkey_with_shift == false
609 && key.mask & SCIM_KEY_ShiftMask
610 && key.code == SCIM_KEY_space
611 && !UnikeyAtWordBeginning())
613 UnikeyRestoreKeyStrokes();
616 else if (key.code >= SCIM_KEY_KP_Multiply && key.code <= SCIM_KEY_KP_9)
618 UnikeyPutChar(key.code);
623 UnikeyFilter(key.code);
626 if (UnikeyBackspaces > 0)
630 len = m_preeditstring.length();
632 if (len <= UnikeyBackspaces)
633 m_preeditstring.clear();
635 m_preeditstring.erase(len - UnikeyBackspaces, UnikeyBackspaces);
638 if (UnikeyBufChars > 0)
640 if (Unikey_OC[m_oc] == CONV_CHARSET_XUTF8)
641 m_preeditstring.append(utf8_mbstowcs((const char*)UnikeyBuf, UnikeyBufChars));
644 static unsigned char buf[1024];
645 int bufSize=sizeof(buf)/sizeof(buf[0]);
647 latinToUtf(buf, UnikeyBuf, UnikeyBufChars, &bufSize);
648 m_preeditstring.append(utf8_mbstowcs((const char*)buf, sizeof(buf)/sizeof(buf[0])-bufSize));
653 m_preeditstring.push_back(key.get_unicode_code());
656 if (m_preeditstring.length())
658 if (key.code >= SCIM_KEY_KP_Multiply && key.code <= SCIM_KEY_KP_9)
660 commit_string(m_preeditstring);
661 hide_preedit_string();
662 m_preeditstring.clear();
668 for (i=0; i < sizeof(WordBreakSyms); i++)
669 if (WordBreakSyms[i] == m_preeditstring[m_preeditstring.length()-1] && key.code == WordBreakSyms[i])
671 commit_string(m_preeditstring);
672 hide_preedit_string();
673 m_preeditstring.clear();
680 Unikey_update_preedit_string(m_preeditstring, true);
684 // else (key non process)
689 PropertyList UnikeyInstance::CreatePropertyList()
694 Property prop("", "", "", "");
697 prop.set_key("/Unikey/InputMethod");
698 prop.set_label(Unikey_IMNames[m_im]);
700 prop.set_tip(_("Choose input method"));
701 props.push_back(prop);
703 for (i=0; i<NUM_INPUTMETHOD; i++)
705 prop.set_key(String("/Unikey/InputMethod/") + Unikey_IMNames[i] + String(m_im==i?"-Checked":""));
706 prop.set_label(Unikey_IMNames[i]);
707 prop.set_icon(m_im==i?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
709 props.push_back(prop);
714 prop.set_key("/Unikey/OutputCharset");
715 prop.set_label(Unikey_OCNames[m_oc]);
717 prop.set_tip(_("Choose output charset"));
718 props.push_back(prop);
720 for (i=0; i<NUM_OUTPUTCHARSET; i++)
722 prop.set_key(String("/Unikey/OutputCharset/") + Unikey_OCNames[i] + String(m_oc==i?"-Checked":""));
723 prop.set_label(Unikey_OCNames[i]);
724 prop.set_icon(m_oc==i?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
726 props.push_back(prop);
731 prop.set_key("/Unikey/Options");
732 prop.set_label(_("Options"));
733 prop.set_icon(SCIM_ICONDIR SCIM_UNIKEY_ICON_CONFIGURE);
734 prop.set_tip(_("Configure Unikey here"));
735 props.push_back(prop);
738 prop.set_key(m_ukopt.spellCheckEnabled?
739 "/Unikey/Options/SpellCheck/Disable":"/Unikey/Options/SpellCheck/Enable");
740 prop.set_label(_("Enable spell check"));
741 prop.set_icon(m_ukopt.spellCheckEnabled?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
742 prop.set_tip(_("If enable, you can decrease mistake when typing"));
743 props.push_back(prop);
745 // auto restore keystroke
746 prop.set_key(m_ukopt.autoNonVnRestore?
747 "/Unikey/Options/AutoRestoreKeys/Disable":"/Unikey/Options/AutoRestoreKeys/Enable");
748 prop.set_label(_("Auto restore keys with invalid words"));
749 prop.set_icon(m_ukopt.autoNonVnRestore?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
750 prop.set_tip(_("When typing a word not in Vietnamese,\n"
751 "it will auto restore keystroke into original"));
752 props.push_back(prop);
755 prop.set_key(m_ukopt.modernStyle?
756 "/Unikey/Options/ModernStyle/Disable":"/Unikey/Options/ModernStyle/Enable");
757 prop.set_label(_("Use oà, uý (instead of òa, úy)"));
758 prop.set_icon(m_ukopt.modernStyle?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
760 props.push_back(prop);
763 prop.set_key(m_ukopt.freeMarking?
764 "/Unikey/Options/FreeMarking/Disable":"/Unikey/Options/FreeMarking/Enable");
765 prop.set_label(_("Allow type with more freedom"));
766 prop.set_icon(m_ukopt.freeMarking?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
768 props.push_back(prop);
771 prop.set_key(m_ukopt.macroEnabled?
772 "/Unikey/Options/EnabledMacro/Disable":"/Unikey/Options/EnabledMacro/Enable");
773 prop.set_label(_("Enable Macro"));
774 prop.set_icon(m_ukopt.macroEnabled?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
776 props.push_back(prop);
779 prop.set_key(m_preedit?"/Unikey/Options/Preedit/Disable":"/Unikey/Options/Preedit/Enable");
780 prop.set_label(_("Enable PreEdit"));
781 prop.set_icon(m_preedit?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
782 prop.set_tip(_("This option is best for most application\n"
783 "But you may don't like it because it have an underline when typing"));
784 props.push_back(prop);
786 // process w at begin
787 prop.set_key(m_process_w_AtBeginWord?
788 "/Unikey/Options/ProcessWAtBegin/Disable":"/Unikey/Options/ProcessWAtBegin/Enable");
789 prop.set_label(_("Process W at word begin"));
790 prop.set_icon(m_process_w_AtBeginWord?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
791 prop.set_tip(_("If enable, type W at begin\n"
792 "of word will change to Ư."));
793 props.push_back(prop);
798 void UnikeyInstance::trigger_property(const String &property)
804 if (!property.compare(0, strlen("/Unikey/InputMethod/"), "/Unikey/InputMethod/"))
806 for (i=0; i<NUM_INPUTMETHOD; i++)
807 if (!property.compare(strlen("/Unikey/InputMethod/"),
808 property.length() - strlen("/Unikey/InputMethod/"),
812 __config->write(SCIM_IMENGINE_UNIKEY_INPUTMETHOD, m_im);
819 else if (!property.compare(0, strlen("/Unikey/OutputCharset/"), "/Unikey/OutputCharset/"))
821 for (i=0; i<NUM_OUTPUTCHARSET; i++)
822 if (!property.compare(strlen("/Unikey/OutputCharset/"),
823 property.length() - strlen("/Unikey/OutputCharset/"),
827 __config->write(SCIM_IMENGINE_UNIKEY_OUTPUTCHARSET, m_oc);
834 else if (property == "/Unikey/Options/SpellCheck/Enable")
836 m_ukopt.spellCheckEnabled = true;
837 __config->write(SCIM_IMENGINE_UNIKEY_SPELLCHECKENABLED, true);
840 else if (property == "/Unikey/Options/SpellCheck/Disable")
842 m_ukopt.spellCheckEnabled = false;
843 __config->write(SCIM_IMENGINE_UNIKEY_SPELLCHECKENABLED, false);
847 // auto restore keystroke
848 else if (property == "/Unikey/Options/AutoRestoreKeys/Enable")
850 m_ukopt.autoNonVnRestore = true;
851 __config->write(SCIM_IMENGINE_UNIKEY_AUTONONVNRESTORE, true);
854 else if (property == "/Unikey/Options/AutoRestoreKeys/Disable")
856 m_ukopt.autoNonVnRestore = false;
857 __config->write(SCIM_IMENGINE_UNIKEY_AUTONONVNRESTORE, false);
862 else if (property == "/Unikey/Options/ModernStyle/Enable")
864 m_ukopt.modernStyle = true;
865 __config->write(SCIM_IMENGINE_UNIKEY_MODERNSTYLE, true);
868 else if (property == "/Unikey/Options/ModernStyle/Disable")
870 m_ukopt.modernStyle = false;
871 __config->write(SCIM_IMENGINE_UNIKEY_MODERNSTYLE, false);
876 else if (property == "/Unikey/Options/FreeMarking/Enable")
878 m_ukopt.freeMarking = true;
879 __config->write(SCIM_IMENGINE_UNIKEY_FREEMARKING, true);
882 else if (property == "/Unikey/Options/FreeMarking/Disable")
884 m_ukopt.freeMarking = false;
885 __config->write(SCIM_IMENGINE_UNIKEY_FREEMARKING, false);
889 else if (property == "/Unikey/Options/EnabledMacro/Enable")
891 m_ukopt.macroEnabled = true;
892 UnikeyLoadMacroTable(getMacroFile());
893 __config->write(SCIM_IMENGINE_UNIKEY_MACROENABLED, true);
896 else if (property == "/Unikey/Options/EnabledMacro/Disable")
898 m_ukopt.macroEnabled = false;
899 __config->write(SCIM_IMENGINE_UNIKEY_MACROENABLED, false);
904 else if (property == "/Unikey/Options/Preedit/Enable")
907 __config->write(SCIM_IMENGINE_UNIKEY_PREEDIT, true);
910 else if (property == "/Unikey/Options/Preedit/Disable")
913 __config->write(SCIM_IMENGINE_UNIKEY_PREEDIT, false);
917 // process w at begin
918 else if (property == "/Unikey/Options/ProcessWAtBegin/Enable")
920 m_process_w_AtBeginWord = true;
921 __config->write(SCIM_IMENGINE_UNIKEY_PROCESSWATWORDBEGIN, true);
924 else if (property == "/Unikey/Options/ProcessWAtBegin/Disable")
926 m_process_w_AtBeginWord = false;
927 __config->write(SCIM_IMENGINE_UNIKEY_PROCESSWATWORDBEGIN, false);