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\n"
139 "Some time, in some application, you \"must\"\n"
140 "enable Preedit to input properly\n\n"
142 "In some application, scim can't enable,\n"
143 "this is not a bug of scim-unikey.\n"
144 "You can try this in terminal: app_name | scim\n\n"
146 "This IME come into being not intend to\n"
147 "replace scim-m17n, just a choose, I recommend\n"
148 "use this combine with scim-m17n\n\n"
150 "For other support goto:\n"
151 " http://forum.ubuntu-vn.org/viewforum.php?f=85"));
153 String UnikeyFactory::get_icon_file() const
155 return String(SCIM_ICONDIR SCIM_UNIKEY_ICON_MAIN);
158 IMEngineInstancePointer UnikeyFactory::create_instance(const String & encoding, int id)
160 return new UnikeyInstance(this, encoding, id);
163 UnikeyInstance::UnikeyInstance(UnikeyFactory *factory, const String &encoding, int id)
164 :IMEngineInstanceBase(factory, encoding, id),
167 static bool t, o; //temp variable
169 m_preeditstring.clear();
171 CreateDefaultUnikeyOptions(&m_ukopt);
174 if can't read config, set it to default value*/
176 t = __config->read(SCIM_IMENGINE_UNIKEY_INPUTMETHOD, &m_im);
179 t = __config->read(SCIM_IMENGINE_UNIKEY_OUTPUTCHARSET, &m_oc);
182 t = __config->read(SCIM_IMENGINE_UNIKEY_PREEDIT, &m_preedit);
183 if (!t) m_preedit = SCIM_IMENGINE_UNIKEY_PREEDIT_DEF;
185 // read preedit switch key
186 m_preeditskey.clear();
189 t = __config->read(SCIM_IMENGINE_UNIKEY_PREEDIT_SWITCH_KEY, &s);
190 if (!t) s=SCIM_IMENGINE_UNIKEY_PREEDIT_SWITCH_KEY_DEF;
197 m_preeditskey.push_back(KeyEvent(s.substr(i, j-i)));
202 m_preeditskey.push_back(KeyEvent(s.substr(i)));
203 } // end read preedit switch key
205 t = __config->read(SCIM_IMENGINE_UNIKEY_PROCESSWATWORDBEGIN, &o);
206 m_process_w_AtBeginWord = t?o:SCIM_IMENGINE_UNIKEY_PROCESSWATWORDBEGIN_DEF;
209 t = __config->read(SCIM_IMENGINE_UNIKEY_FREEMARKING, &o);
210 m_ukopt.freeMarking = t?o:SCIM_IMENGINE_UNIKEY_FREEMARKING_DEF;
212 t = __config->read(SCIM_IMENGINE_UNIKEY_MODERNSTYLE, &o);
213 m_ukopt.modernStyle = t?o:SCIM_IMENGINE_UNIKEY_MODERNSTYLE_DEF;
215 t = __config->read(SCIM_IMENGINE_UNIKEY_MACROENABLED, &o);
216 m_ukopt.macroEnabled = t?o:SCIM_IMENGINE_UNIKEY_MACROENABLED_DEF;
218 t = __config->read(SCIM_IMENGINE_UNIKEY_SPELLCHECKENABLED, &o);
219 m_ukopt.spellCheckEnabled = t?o:SCIM_IMENGINE_UNIKEY_SPELLCHECKENABLED_DEF;
221 t = __config->read(SCIM_IMENGINE_UNIKEY_AUTONONVNRESTORE, &o);
222 m_ukopt.autoNonVnRestore = t?o:SCIM_IMENGINE_UNIKEY_AUTONONVNRESTORE_DEF;
224 UnikeySetOptions(&m_ukopt);
226 if (m_ukopt.macroEnabled)
228 UnikeyLoadMacroTable(getMacroFile());
234 UnikeyInstance::~UnikeyInstance()
238 void UnikeyInstance::focus_in()
240 register_properties(CreatePropertyList());
242 UnikeySetInputMethod(Unikey_IM[m_im]);
243 UnikeySetOutputCharset(Unikey_OC[m_oc]);
244 UnikeySetOptions(&m_ukopt);
247 void UnikeyInstance::focus_out()
252 void UnikeyInstance::reset()
256 m_lastkey_with_shift = false;
260 if (m_preeditstring.length())
262 commit_string(m_preeditstring);
263 hide_preedit_string();
264 m_preeditstring.clear();
266 m_auto_commit = false;
270 void UnikeyInstance::Unikey_send_backspace(int nBackspace)
272 static WideString ws;
275 // if surrounding text was provided, use it instead of send backspace
276 if (get_surrounding_text(ws, n, nBackspace, 0))
278 // for type in Auto Complete in OpenOffice
279 // Hope this not rise bugs in others application
280 // not use SCIM_KEY_NullKey, because GTK application crash when GTK_IM_MODULE=scim
282 forward_key_event(SCIM_KEY_VoidSymbol);
284 delete_surrounding_text(-ws.length(), ws.length());
288 for (int i=0; i < nBackspace; i++)
289 forward_key_event(SCIM_KEY_BackSpace);
293 void UnikeyInstance::Unikey_update_preedit_string(const WideString s, const bool visible)
295 AttributeList attlist;
298 // underline preedit string
299 att = Attribute(0, s.length(), SCIM_ATTR_DECORATE, SCIM_ATTR_DECORATE_UNDERLINE);
300 attlist.push_back(att);
302 if (m_ukopt.spellCheckEnabled==1 && UnikeyLastWordIsNonVn())
304 // red preedit string
305 att = Attribute(0, s.length(), SCIM_ATTR_FOREGROUND, 0xff0000);
306 attlist.push_back(att);
309 update_preedit_string(s, attlist);
310 update_preedit_caret(s.length());
314 show_preedit_string();
318 hide_preedit_string();
322 void UnikeyInstance::Unikey_commit_key_event(const KeyEvent& key)
327 s.push_back(key.code);
331 bool UnikeyInstance::process_key_event(const KeyEvent& key)
335 for (int i = 0; i<m_preeditskey.size(); i++)
337 if (key==m_preeditskey.at(i))
340 m_preedit=!m_preedit;
341 register_properties(CreatePropertyList());
346 tmp = m_preedit?Unikey_process_key_event_preedit(key)
347 :Unikey_process_key_event_direct(key);
349 if ((key.code >= SCIM_KEY_space && key.code <= SCIM_KEY_asciitilde)
350 || (key.code >= SCIM_KEY_KP_Multiply && key.code <= SCIM_KEY_KP_9))
352 m_lastkey_with_shift = key.is_shift_down();
356 m_lastkey_with_shift = false;
362 /** This method not use preedit string */
363 bool UnikeyInstance::Unikey_process_key_event_direct(const KeyEvent& key)
365 if (key.is_key_release())
370 if (key.is_control_down() || key.mask & SCIM_KEY_AltMask)
376 if (key.code >= SCIM_KEY_Shift_L && key.code <= SCIM_KEY_Hyper_R)
381 if (key.code == SCIM_KEY_BackSpace)
383 UnikeyBackspacePress(); // xu ly phim backspace
384 if (UnikeyBackspaces==0) // neu ukengine bao khong can xoa ky tu nao,
385 return false; // thi tra lai backspace cho chuong trinh khach
388 Unikey_send_backspace(UnikeyBackspaces);
390 // append key that need change tone pos after press backspace
393 if (Unikey_OC[m_oc] == CONV_CHARSET_XUTF8)
394 commit_string(utf8_mbstowcs((const char*)UnikeyBuf, UnikeyBufChars)); // send the solved string to client
397 static unsigned char buf[1024];
398 int bufSize=sizeof(buf)/sizeof(buf[0]);
400 latinToUtf(buf, UnikeyBuf, UnikeyBufChars, &bufSize);
401 commit_string(utf8_mbstowcs((const char*)buf, sizeof(buf)/sizeof(buf[0]) - bufSize));
409 if (key.code >= SCIM_KEY_space && key.code <= SCIM_KEY_asciitilde)
411 UnikeySetCapsState(key.mask & SCIM_KEY_ShiftMask,
412 key.mask & SCIM_KEY_CapsLockMask);
414 // shift + space to restore keystroke
415 if (m_lastkey_with_shift == false
416 && key.mask & SCIM_KEY_ShiftMask
417 && key.code == SCIM_KEY_space
418 && !UnikeyAtWordBeginning())
420 UnikeyRestoreKeyStrokes();
421 if (UnikeyBackspaces == 0)
423 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 Unikey_commit_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)
567 UnikeySetCapsState(key.mask & SCIM_KEY_ShiftMask, key.mask & SCIM_KEY_CapsLockMask);
569 // auto commit char: commit char that never change later in preedit string
570 // if macro enabled, then not auto commit. Because macro may change any word
571 if (m_ukopt.macroEnabled==0 && (UnikeyAtWordBeginning() || m_auto_commit))
573 for (i = 0; i < sizeof(WordAutoCommit); i++)
574 if (key.code == WordAutoCommit[i])
576 UnikeyPutChar(key.code);
577 m_auto_commit = true;
578 forward_key_event(key); // forward keyevent instead of return false
581 } // end auto commit char
583 if ((Unikey_IM[m_im] == UkTelex || Unikey_IM[m_im] == UkSimpleTelex2)
584 && m_process_w_AtBeginWord == false
585 && UnikeyAtWordBeginning()
586 && (key.code == SCIM_KEY_w || key.code == SCIM_KEY_W))
588 UnikeyPutChar(key.code);
589 if (m_ukopt.macroEnabled==0)
591 forward_key_event(key);
595 m_preeditstring.push_back(key.code);
596 Unikey_update_preedit_string(m_preeditstring, true);
599 m_auto_commit = true;
604 m_auto_commit = false;
606 if (m_lastkey_with_shift == false
607 && key.mask & SCIM_KEY_ShiftMask
608 && key.code == SCIM_KEY_space
609 && !UnikeyAtWordBeginning())
611 UnikeyRestoreKeyStrokes();
616 UnikeyFilter(key.code);
619 if (UnikeyBackspaces > 0)
623 len = m_preeditstring.length();
625 if (len <= UnikeyBackspaces)
626 m_preeditstring.clear();
628 m_preeditstring.erase(len - UnikeyBackspaces, UnikeyBackspaces);
631 if (UnikeyBufChars > 0)
633 if (Unikey_OC[m_oc] == CONV_CHARSET_XUTF8)
634 m_preeditstring.append(utf8_mbstowcs((const char*)UnikeyBuf, UnikeyBufChars));
637 static unsigned char buf[1024];
638 int bufSize=sizeof(buf)/sizeof(buf[0]);
640 latinToUtf(buf, UnikeyBuf, UnikeyBufChars, &bufSize);
641 m_preeditstring.append(utf8_mbstowcs((const char*)buf, sizeof(buf)/sizeof(buf[0])-bufSize));
646 m_preeditstring.push_back(key.get_unicode_code());
649 if (m_preeditstring.length())
651 for (i=0; i < sizeof(WordBreakSyms); i++)
653 if (WordBreakSyms[i] == m_preeditstring[m_preeditstring.length()-1] && key.code == WordBreakSyms[i])
655 commit_string(m_preeditstring);
656 hide_preedit_string();
657 m_preeditstring.clear();
664 Unikey_update_preedit_string(m_preeditstring, true);
668 // else (key non process)
673 PropertyList UnikeyInstance::CreatePropertyList()
678 Property prop("", "", "", "");
681 prop.set_key("/Unikey/InputMethod");
682 prop.set_label(Unikey_IMNames[m_im]);
684 prop.set_tip(_("Choose input method"));
685 props.push_back(prop);
687 for (i=0; i<NUM_INPUTMETHOD; i++)
689 prop.set_key(String("/Unikey/InputMethod/") + Unikey_IMNames[i] + String(m_im==i?"-Checked":""));
690 prop.set_label(Unikey_IMNames[i]);
691 prop.set_icon(m_im==i?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
693 props.push_back(prop);
698 prop.set_key("/Unikey/OutputCharset");
699 prop.set_label(Unikey_OCNames[m_oc]);
701 prop.set_tip(_("Choose output charset"));
702 props.push_back(prop);
704 for (i=0; i<NUM_OUTPUTCHARSET; i++)
706 prop.set_key(String("/Unikey/OutputCharset/") + Unikey_OCNames[i] + String(m_oc==i?"-Checked":""));
707 prop.set_label(Unikey_OCNames[i]);
708 prop.set_icon(m_oc==i?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
710 props.push_back(prop);
715 prop.set_key("/Unikey/Options");
716 prop.set_label(_("Options"));
717 prop.set_icon(SCIM_ICONDIR SCIM_UNIKEY_ICON_CONFIGURE);
718 prop.set_tip(_("Configure Unikey here"));
719 props.push_back(prop);
722 prop.set_key(m_ukopt.spellCheckEnabled?
723 "/Unikey/Options/SpellCheck/Disable":"/Unikey/Options/SpellCheck/Enable");
724 prop.set_label(_("Enable spell check"));
725 prop.set_icon(m_ukopt.spellCheckEnabled?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
726 prop.set_tip(_("If enable, you can decrease mistake when typing"));
727 props.push_back(prop);
729 // auto restore keystroke
730 prop.set_key(m_ukopt.autoNonVnRestore?
731 "/Unikey/Options/AutoRestoreKeys/Disable":"/Unikey/Options/AutoRestoreKeys/Enable");
732 prop.set_label(_("Auto restore keys with invalid words"));
733 prop.set_icon(m_ukopt.autoNonVnRestore?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
734 prop.set_tip(_("When typing a word not in Vietnamese,\n"
735 "it will auto restore keystroke into original"));
736 props.push_back(prop);
739 prop.set_key(m_ukopt.modernStyle?
740 "/Unikey/Options/ModernStyle/Disable":"/Unikey/Options/ModernStyle/Enable");
741 prop.set_label(_("Use oà, uý (instead of òa, úy)"));
742 prop.set_icon(m_ukopt.modernStyle?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
744 props.push_back(prop);
747 prop.set_key(m_ukopt.freeMarking?
748 "/Unikey/Options/FreeMarking/Disable":"/Unikey/Options/FreeMarking/Enable");
749 prop.set_label(_("Allow type with more freedom"));
750 prop.set_icon(m_ukopt.freeMarking?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
752 props.push_back(prop);
755 prop.set_key(m_ukopt.macroEnabled?
756 "/Unikey/Options/EnabledMacro/Disable":"/Unikey/Options/EnabledMacro/Enable");
757 prop.set_label(_("Enable Macro"));
758 prop.set_icon(m_ukopt.macroEnabled?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
760 props.push_back(prop);
763 prop.set_key(m_preedit?"/Unikey/Options/Preedit/Disable":"/Unikey/Options/Preedit/Enable");
764 prop.set_label(_("Enable PreEdit"));
765 prop.set_icon(m_preedit?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
766 prop.set_tip(_("This option is best for most application\n"
767 "But you may don't like it because it have an underline when typing"));
768 props.push_back(prop);
770 // process w at begin
771 prop.set_key(m_process_w_AtBeginWord?
772 "/Unikey/Options/ProcessWAtBegin/Disable":"/Unikey/Options/ProcessWAtBegin/Enable");
773 prop.set_label(_("Process W at word begin"));
774 prop.set_icon(m_process_w_AtBeginWord?SCIM_ICONDIR SCIM_UNIKEY_ICON_CHECK:"");
775 prop.set_tip(_("If enable, type W at begin\n"
776 "of word will change to Ư."));
777 props.push_back(prop);
780 prop.set_key("/Unikey/Options/RunSetup");
781 prop.set_label(_("Launch Unikey-setup"));
782 prop.set_icon(SCIM_ICONDIR SCIM_UNIKEY_ICON_MAIN);
784 props.push_back(prop);
789 void UnikeyInstance::trigger_property(const String &property)
795 if (!property.compare(0, strlen("/Unikey/InputMethod/"), "/Unikey/InputMethod/"))
797 for (i=0; i<NUM_INPUTMETHOD; i++)
798 if (!property.compare(strlen("/Unikey/InputMethod/"),
799 property.length() - strlen("/Unikey/InputMethod/"),
803 __config->write(SCIM_IMENGINE_UNIKEY_INPUTMETHOD, m_im);
810 else if (!property.compare(0, strlen("/Unikey/OutputCharset/"), "/Unikey/OutputCharset/"))
812 for (i=0; i<NUM_OUTPUTCHARSET; i++)
813 if (!property.compare(strlen("/Unikey/OutputCharset/"),
814 property.length() - strlen("/Unikey/OutputCharset/"),
818 __config->write(SCIM_IMENGINE_UNIKEY_OUTPUTCHARSET, m_oc);
825 else if (property == "/Unikey/Options/SpellCheck/Enable")
827 m_ukopt.spellCheckEnabled = true;
828 __config->write(SCIM_IMENGINE_UNIKEY_SPELLCHECKENABLED, true);
831 else if (property == "/Unikey/Options/SpellCheck/Disable")
833 m_ukopt.spellCheckEnabled = false;
834 __config->write(SCIM_IMENGINE_UNIKEY_SPELLCHECKENABLED, false);
838 // auto restore keystroke
839 else if (property == "/Unikey/Options/AutoRestoreKeys/Enable")
841 m_ukopt.autoNonVnRestore = true;
842 __config->write(SCIM_IMENGINE_UNIKEY_AUTONONVNRESTORE, true);
845 else if (property == "/Unikey/Options/AutoRestoreKeys/Disable")
847 m_ukopt.autoNonVnRestore = false;
848 __config->write(SCIM_IMENGINE_UNIKEY_AUTONONVNRESTORE, false);
853 else if (property == "/Unikey/Options/ModernStyle/Enable")
855 m_ukopt.modernStyle = true;
856 __config->write(SCIM_IMENGINE_UNIKEY_MODERNSTYLE, true);
859 else if (property == "/Unikey/Options/ModernStyle/Disable")
861 m_ukopt.modernStyle = false;
862 __config->write(SCIM_IMENGINE_UNIKEY_MODERNSTYLE, false);
867 else if (property == "/Unikey/Options/FreeMarking/Enable")
869 m_ukopt.freeMarking = true;
870 __config->write(SCIM_IMENGINE_UNIKEY_FREEMARKING, true);
873 else if (property == "/Unikey/Options/FreeMarking/Disable")
875 m_ukopt.freeMarking = false;
876 __config->write(SCIM_IMENGINE_UNIKEY_FREEMARKING, false);
880 else if (property == "/Unikey/Options/EnabledMacro/Enable")
882 m_ukopt.macroEnabled = true;
883 UnikeyLoadMacroTable(getMacroFile());
884 __config->write(SCIM_IMENGINE_UNIKEY_MACROENABLED, true);
887 else if (property == "/Unikey/Options/EnabledMacro/Disable")
889 m_ukopt.macroEnabled = false;
890 __config->write(SCIM_IMENGINE_UNIKEY_MACROENABLED, false);
895 else if (property == "/Unikey/Options/Preedit/Enable")
898 __config->write(SCIM_IMENGINE_UNIKEY_PREEDIT, true);
901 else if (property == "/Unikey/Options/Preedit/Disable")
904 __config->write(SCIM_IMENGINE_UNIKEY_PREEDIT, false);
908 // process w at begin
909 else if (property == "/Unikey/Options/ProcessWAtBegin/Enable")
911 m_process_w_AtBeginWord = true;
912 __config->write(SCIM_IMENGINE_UNIKEY_PROCESSWATWORDBEGIN, true);
915 else if (property == "/Unikey/Options/ProcessWAtBegin/Disable")
917 m_process_w_AtBeginWord = false;
918 __config->write(SCIM_IMENGINE_UNIKEY_PROCESSWATWORDBEGIN, false);
923 else if (property == "/Unikey/Options/RunSetup")
925 system(LIBEXECDIR "/scim-setup-unikey &");