diff --git a/scim-wnn/configure.ac b/scim-wnn/configure.ac index 77adab6..35dc7e8 100644 --- a/scim-wnn/configure.ac +++ b/scim-wnn/configure.ac @@ -68,6 +68,7 @@ AC_SUBST(SCIM_BUILD_SETUP) AC_CHECK_LIB(crypt, crypt) +AC_CHECK_LIB(wnn7, jl_yosoku_init,, [AC_MSG_RESULT(libwnn7 not found.)]) AC_CHECK_LIB(wnn6, jl_optimize_fi,, [AC_MSG_RESULT(libwnn6 not found.)]) if echo $LIBS | grep -v "wnn6" > /dev/null; then diff --git a/scim-wnn/src/scim_wnn_imengine.cpp b/scim-wnn/src/scim_wnn_imengine.cpp index cbf390e..cdd3949 100644 --- a/scim-wnn/src/scim_wnn_imengine.cpp +++ b/scim-wnn/src/scim_wnn_imengine.cpp @@ -61,6 +61,7 @@ #define SCIM_CONFIG_WNN_SERVER "/IMEngine/Wnn/Server" #define SCIM_CONFIG_WNN_RC "/IMEngine/Wnn/Rc" +#define SCIM_CONFIG_WNN_KEY "/IMEngine/Wnn/Key" static Pointer _scim_wnn_factory; static ConfigPointer _scim_config; @@ -161,6 +162,30 @@ } + +// �������٥�ȥ����å� + +void WnnKeyEventList::append(const KeyEvent &k) { + push_back(k); +} + +void WnnKeyEventList::append(int code,int mask) { + KeyEvent k; + k.code = code; + k.mask = mask; + append(k); +} + +bool WnnKeyEventList::comp(const KeyEvent &k) { + for (unsigned int i = 0;i < size();i ++) { + if ((at(i).code == k.code) && (at(i).mask == k.mask)) { + return(true); + } + } + return(false); +} + + // �� �� ý �� // ��ʪ�� @@ -170,9 +195,52 @@ { m_conversion = false; String host,rc; - host = _scim_config->read(SCIM_CONFIG_WNN_SERVER,String("localhost")); - host = _scim_config->read(SCIM_CONFIG_WNN_RC,String("/usr/lib/wnn7/ja_JP/wnnenvrc")); + host = _scim_config->read(String(SCIM_CONFIG_WNN_SERVER),String("localhost")); + rc = _scim_config->read(String(SCIM_CONFIG_WNN_RC),String("/usr/lib/wnn7/ja_JP/wnnenvrc")); wnn.wnnConnect(String("test"),host,rc,10); + + // �ǥե���ȥ������ꡣ + // ����ե����뤫���ɤ�褦�ˤ��Ƥ��ˤ礴�ˤ硣 + scim_string_to_key_list(k_conversion_start, + _scim_config->read(String(SCIM_CONFIG_WNN_KEY) + String("ConversionStart"), + String("space"))); + scim_string_to_key_list(k_cancel, + _scim_config->read(String(SCIM_CONFIG_WNN_KEY) + String("Cancel"), + String("Escape,Control+g"))); + scim_string_to_key_list(k_delete, + _scim_config->read(String(SCIM_CONFIG_WNN_KEY) + String("Delete"), + String("Delete"))); + scim_string_to_key_list(k_backspace, + _scim_config->read(String(SCIM_CONFIG_WNN_KEY) + String("BackSpace"), + String("BackSpace"))); + scim_string_to_key_list(k_commit, + _scim_config->read(String(SCIM_CONFIG_WNN_KEY) + String("Commit"), + String("Return"))); + scim_string_to_key_list(k_conversion_next, + _scim_config->read(String(SCIM_CONFIG_WNN_KEY) + String("ConversionNext"), + String("space,Down"))); + scim_string_to_key_list(k_conversion_prev, + _scim_config->read(String(SCIM_CONFIG_WNN_KEY) + String("ConversionPrev"), + String("Up"))); + scim_string_to_key_list(k_conversion_expand, + _scim_config->read(String(SCIM_CONFIG_WNN_KEY) + String("ConversionExpand"), + String("Shift+Right,Control+o"))); + scim_string_to_key_list(k_conversion_shrink, + _scim_config->read(String(SCIM_CONFIG_WNN_KEY) + String("ConversionShrink"), + String("Shift+Left,Control+i"))); + scim_string_to_key_list(k_conversion_forward, + _scim_config->read(String(SCIM_CONFIG_WNN_KEY) + String("ConversionForward"), + String("Right"))); + scim_string_to_key_list(k_conversion_backward, + _scim_config->read(String(SCIM_CONFIG_WNN_KEY) + String("ConversionBackward"), + String("Left"))); + scim_string_to_key_list(k_forward, + _scim_config->read(String(SCIM_CONFIG_WNN_KEY) + String("Forward"), + String("Right"))); + scim_string_to_key_list(k_backward, + _scim_config->read(String(SCIM_CONFIG_WNN_KEY) + String("Backward"), + String("Left"))); + } WnnInstance::~ WnnInstance() @@ -192,9 +260,7 @@ */ bool WnnInstance::process_preedit_key_event(const KeyEvent &key) { - // ���������ɤ�ľ����äƥ�������͡��ɡ��������ޤ����Ȥꤢ�������Τޤޤǡ� - - if (key.code == SCIM_KEY_space) { + if (k_conversion_start.comp(key)) { if (!m_rk.getTextLength()) { return(false); } @@ -205,7 +271,7 @@ update_preedit_caret(wnn.getText().length()); return(true); } - if (key.code == SCIM_KEY_Return) { + if (k_commit.comp(key)) { if (!m_rk.getTextLength()) { return(false); } @@ -214,15 +280,15 @@ hide_preedit_string(); return(true); } - if ((key.code == SCIM_KEY_Left) || (key.code == SCIM_KEY_Right)) { + if (k_forward.comp(key) || k_backward.comp(key)) { if (!m_rk.getTextLength()) { return(false); } - key.code == SCIM_KEY_Left ? m_rk.setPos(m_rk.getPos() - 1) : m_rk.setPos(m_rk.getPos() + 1); + k_backward.comp(key) ? m_rk.setPos(m_rk.getPos() - 1) : m_rk.setPos(m_rk.getPos() + 1); update_preedit_caret(m_rk.getPos()); return(true); } - if (key.code == SCIM_KEY_BackSpace) { + if (k_backspace.comp(key)) { if (!m_rk.getTextLength()) { return(false); } @@ -231,6 +297,15 @@ update_preedit_caret(m_rk.getPos()); return(true); } + if (k_delete.comp(key)) { + if (!m_rk.getTextLength()) { + return(false); + } + m_rk.del(); + update_preedit_string(m_rk.getText()); + update_preedit_caret(m_rk.getPos()); + return(true); + } if (isprint(key.code)) { show_preedit_string(); SCIM_DEBUG_IMENGINE(1) << key.get_key_string() << "\n"; @@ -246,7 +321,7 @@ */ bool WnnInstance::process_conversion_key_event(const KeyEvent &key) { - if (key.code == SCIM_KEY_Return) { + if (k_commit.comp(key)) { commit_string(wnn.getText()); wnn.updateFrequency(); m_rk.reset(); @@ -254,16 +329,16 @@ m_conversion = false; hide_preedit_string(); return(true); - } - if ((key.code == SCIM_KEY_Escape) || (key.code == SCIM_KEY_BackSpace)) { + } else + if (k_cancel.comp(key) || k_backspace.comp(key)) { wnn.reset(); m_conversion = false; update_preedit_string(m_rk.getText()); update_preedit_caret(m_rk.getPos()); return(true); - } - if ((key.code == SCIM_KEY_space) || (key.code == SCIM_KEY_Down) || (key.code == SCIM_KEY_Up)) { - key.code == SCIM_KEY_Up ? m_convList.pos --: m_convList.pos ++; + } else + if (k_conversion_next.comp(key) || k_conversion_prev.comp(key)) { + k_conversion_prev.comp(key) ? m_convList.pos --: m_convList.pos ++; if (m_convList.pos >= m_convList.count) m_convList.pos = 0; else if (m_convList.pos < 0) m_convList.pos = m_convList.count - 1; @@ -271,20 +346,23 @@ update_preedit_string(wnn.getText(),wnn.getAttributeList()); update_preedit_caret(wnn.getText().length()); return(true); - } - if ((key.code == SCIM_KEY_Left) || (key.code == SCIM_KEY_Right)) { - if (key.mask == SCIM_KEY_ShiftMask) { - bool r; - key.code == SCIM_KEY_Left ? r = wnn.resizeRegion(-1) : r = wnn.resizeRegion(1); - if (!r) return(true); - } else { - key.code == SCIM_KEY_Left ? wnn.setPos(wnn.getPos() - 1) : wnn.setPos(wnn.getPos() + 1); - } + } else + if (k_conversion_expand.comp(key) || k_conversion_shrink.comp(key)) { + bool r; + k_conversion_shrink.comp(key) ? r = wnn.resizeRegion(-1) : r = wnn.resizeRegion(1); + if (!r) return(true); m_convList = wnn.getConversionList(); update_preedit_string(wnn.getText(),wnn.getAttributeList()); update_preedit_caret(wnn.getText().length()); return(true); - } + } else + if (k_conversion_forward.comp(key) || k_conversion_backward.comp(key)) { + k_conversion_backward.comp(key) ? wnn.setPos(wnn.getPos() - 1) : wnn.setPos(wnn.getPos() + 1); + m_convList = wnn.getConversionList(); + update_preedit_string(wnn.getText(),wnn.getAttributeList()); + update_preedit_caret(wnn.getText().length()); + return(true); + } else if (isprint(key.code)) { commit_string(wnn.getText()); wnn.updateFrequency(); diff --git a/scim-wnn/src/scim_wnn_imengine.h b/scim-wnn/src/scim_wnn_imengine.h index fdf8ffc..44ac21b 100644 --- a/scim-wnn/src/scim_wnn_imengine.h +++ b/scim-wnn/src/scim_wnn_imengine.h @@ -51,6 +51,15 @@ }; +class WnnKeyEventList : public KeyEventList +{ + // �ꥹ�Ȥ˥������٥�Ȥ��ɲä��ơ�comp(KeyEvent)��Ƚ�̡� +public: + void append(const KeyEvent &k); + void append(int code,int mask); + bool comp(const KeyEvent &k); +}; + class WnnInstance : public IMEngineInstanceBase { @@ -78,6 +87,24 @@ bool process_preedit_key_event(const KeyEvent &key); bool process_conversion_key_event(const KeyEvent &key); void startConversion(WideString s); + +private: + WnnKeyEventList + k_conversion_start, // �Ѵ����� + k_cancel, // ����󥻥륭�� + k_delete, // ��� + k_backspace, // �Хå����ڡ��� + k_commit, // ���� + k_conversion_next, // ������ + k_conversion_prev, // ������ + k_conversion_expand, // ���� + k_conversion_shrink, // �̾� + k_conversion_forward, // ��ʸ�� + k_conversion_backward, // ��ʸ�� + k_forward, // ���������ư/�� + k_backward, // ���������ư/��� + k_dummy; + }; diff --git a/scim-wnn/src/wnnconversion.cpp b/scim-wnn/src/wnnconversion.cpp index ccec266..2a83fcb 100644 --- a/scim-wnn/src/wnnconversion.cpp +++ b/scim-wnn/src/wnnconversion.cpp @@ -88,6 +88,7 @@ bool WnnConversion::wnnConnect(String name,String host,String rc,int timeout) { wnn = jl_open_lang((char *)name.data(),(char *)host.data(),"jp_JP",(char *)rc.data(),wnn_error,wnn_message,timeout); + //wnn = jl_open_lang("test","localhost","jp_JP","/usr/lib/wnn7/ja_JP/wnnenvrc",wnn_error,wnn_message,10); if (!wnn) return(false); return(true); }