4 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Li zhang <li2012.zhang@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
22 #define Uses_SCIM_UTILITY
23 #define Uses_SCIM_IMENGINE
24 #define Uses_SCIM_LOOKUP_TABLE
25 #define Uses_SCIM_CONFIG_BASE
26 #define Uses_SCIM_CONFIG_PATH
33 #include "kdb_resource.h"
34 #include "isf_default_imengine.h"
45 #define _(String) dgettext(GETTEXT_PACKAGE,String)
46 #define N_(String) (String)
48 #define _(String) (String)
49 #define N_(String) (String)
50 #define bindtextdomain(Package,Directory)
51 #define textdomain(domain)
52 #define bind_textdomain_codeset(domain,codeset)
55 #define DEFAULT_UUID "d75857a5-4148-4745-89e2-1da7ddaf7999"
56 #define DEFAULT_NAME "Multilingual Keyboard"
60 #ifndef ISF_DEFAULT_ICON_FILE
61 #define ISF_DEFAULT_ICON_FILE (ISF_ICONDIR "/isf-default.png")
64 static ConfigPointer _scim_config(0);
65 static int m_keypad_layout;
68 void scim_module_init(void) {
69 bindtextdomain(GETTEXT_PACKAGE, ISF_DEFAULT_LOCALEDIR);
70 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
73 void scim_module_exit(void) {
77 uint32 scim_imengine_module_init(const ConfigPointer & config) {
78 _scim_config = config;
82 IMEngineFactoryPointer scim_imengine_module_create_factory(uint32
84 DefaultFactory *factory = 0;
87 factory = new DefaultFactory(_scim_config);
98 DefaultFactory::DefaultFactory(const ConfigPointer & config)
100 m_uuid = DEFAULT_UUID;
101 m_name = _(DEFAULT_NAME);
104 ("nl_NL,nl_BE,en_US,en_GB,en_AU,en_CA,en_NZ,en_IE,en_ZA,en_JM,"
105 "en_BZ,en_TT,en_ZW,en_PH,fr_FR,fr_BE,fr_CA,fr_CH,fr_LU,fr_MC,"
106 "de_DE,de_CH,de_AT,de_LU,de_LI,it_IT,it_CH,pt_BR,pt_PT,es_ES,"
107 "es_MX,es_GT,es_CR,es_PA,es_DO,es_VE,es_CO,es_PE,es_AR,"
108 "es_EC,es_CL,es_UY,es_PY,es_BO,es_SV,es_HN,es_NI,es_PR,eu_ES,"
109 "ca_ES,da_DK,af_AF,is_IS,fi_FI,ms_MY,ms_BN,no_NO,sv_SE,sv_FI,"
110 "cs_CZ,hu_HU,pl_PL,ro_RO,sr_RS,sk_SK,sl_SI,et_EE,lv_LV,lt_LT,el_GR,"
111 "bg_BG,kk_KZ,mk_MK,ru_RU,sr_RS,uk_UA,tr_TR,uz_UZ,th_TH,he_IL,"
112 "ar_SA,ar_IQ,ar_EG,ar_LY,ar_DZ,ar_MA,ar_TN,ar_OM,ar_YE,ar_SY,ar_JO,"
113 "ar_LB,ar_KW,ar_AE,ar_BH,ar_QA,ur_PK,vi_VN,hi_IN,te_IN,mr_IN,ta_IN,"
114 "bn_IN,gu_IN,ml_IN,pa_IN,ka_GE,az_IR,gl_ES,ha_BJ,ga_IE,si_LK,cy_UK,"
115 "xh_ZA,yo_NG,zu_ZA");
117 m_reload_signal_connection =
119 signal_connect_reload(slot(this, &DefaultFactory::reload_config));
120 reload_config(m_config);
123 DefaultFactory::~DefaultFactory() {
124 m_reload_signal_connection.disconnect();
127 void DefaultFactory::load_resource() {
130 WideString DefaultFactory::get_name() const {
131 return utf8_mbstowcs(m_name);
134 WideString DefaultFactory::get_authors() const {
135 return utf8_mbstowcs(String
136 (_("Copyright (C) Samsung Electronics Co., Ltd.")));
139 WideString DefaultFactory::get_credits() const {
143 WideString DefaultFactory::get_help() const {
145 help = String(_("\n\n"
146 " Press Space or Return to commit\n"
147 " the inputed string and exit this mode."));
149 return utf8_mbstowcs(help);
152 String DefaultFactory::get_uuid() const {
156 String DefaultFactory::get_icon_file() const {
157 return String(ISF_DEFAULT_ICON_FILE);
160 void DefaultFactory::reload_config(const ConfigPointer & config) {
161 if (config.null()) return;
162 int hw_detected = config->read(String (ISF_CONFIG_HARDWARE_KEYBOARD_DETECT) , hw_detected);
163 if (hw_detected == 1)
164 m_keypad_layout = I_HQD;
167 IMEngineInstancePointer
168 DefaultFactory::create_instance(const String & encoding, int id) {
169 return new DefaultInstance(this, encoding, id);
172 /* Initialize member variables */
173 unsigned int DefaultInstance::m_prevkeyval = 0;
174 int DefaultInstance::m_counter = 0;
176 DefaultInstance::DefaultInstance(DefaultFactory * factory,
177 const String & encoding, int id)
178 :IMEngineInstanceBase(factory, encoding, id) {
179 char label[2] = {0, 0};
180 std::vector < WideString > labels;
182 m_shift_pressed = Shift_None;
184 m_lang = IM_LANGUAGE_ENGLISH;
186 m_keypad_layout = I_HQD;
188 for (int i = 1; i < 10; ++i) {
190 labels.push_back(utf8_mbstowcs(label));
193 m_lookup_table.set_candidate_labels(labels);
194 m_lookup_table_def_page_size = (int)labels.size();
195 m_lookup_table.set_page_size(m_lookup_table_def_page_size);
198 DefaultInstance::~DefaultInstance() {
201 bool DefaultInstance::process_key_event(const KeyEvent & key) {
204 if (key.is_key_press()) {
205 ret = _process_keypress(key);
206 } else if (key.is_key_release()) {
207 /* ignore key release. */
208 ret = _process_keyrelease(key);
217 void DefaultInstance::move_preedit_caret(unsigned int pos) {
220 void DefaultInstance::select_candidate(unsigned int index) {
223 void DefaultInstance::update_lookup_table_page_size(unsigned int page_size) {
224 SCIM_DEBUG_IMENGINE(2) << "update_lookup_table_page_size.\n";
225 m_lookup_table.set_page_size(page_size);
228 void DefaultInstance::lookup_table_page_up() {
231 void DefaultInstance::lookup_table_page_down() {
234 void DefaultInstance::reset() {
238 void DefaultInstance::flush() {
241 void DefaultInstance::focus_in() {
245 void DefaultInstance::focus_out() {
249 void DefaultInstance::trigger_property(const String & property) {
252 bool DefaultInstance::_process_keyrelease(const KeyEvent & key) {
256 bool DefaultInstance::_process_keypress(const KeyEvent & key_raw) {
257 KeyEvent key = key_raw;
258 unsigned int keyvalue = key.code;
260 if (key.is_control_down() || key.is_alt_down())
263 if (key.code == SCIM_KEY_NullKey || key.code == SCIM_KEY_Cancel) {
264 m_prevkeyval = keyvalue;
268 if (m_lang >= IM_LANGUAGE_CNT) {
272 if (I_HQD == m_keypad_layout) {
273 m_prevkeyval = keyvalue;
274 return keypad_process_qwerty(key);
279 m_prevkeyval = keyvalue;
283 bool DefaultInstance::keypad_process_qwerty(KeyEvent & key) {
284 unsigned char buf[UTF8_SIZE + 1] = {0,};
286 /* in case of Alphabet chars */
287 if (key.code >= 0xfd00)
288 return false;//ISF handle function keys
289 else if (key.code >= 0x4E00 && key.code <= 0x9FBF)
290 return true;//Don't deal with Chinese characters
292 utf8_wctomb(buf, key.code, UTF8_SIZE);
294 if (!key.code) return false;
296 commit_string(utf8_mbstowcs((char *)buf));
300 bool DefaultInstance::special_key_filter(KeyEvent & key) {
304 void DefaultInstance::process_helper_event(const String & helper_uuid,
305 const Transaction & trans) {
309 if (!(const_cast < Transaction & >(trans)).get_command(cmd)) return;
310 if (!(const_cast < Transaction & >(trans)).get_data(value)) return;
312 if (DEFAULT_CMD_LANGUAGE == cmd) {
314 if (m_lang >= IM_LANGUAGE_CNT) {
315 m_lang = IM_LANGUAGE_ENGLISH;
317 } else if (DEFAULT_CMD_COMPLETION == cmd) {
319 } else if (DEFAULT_CMD_SHIFTMODE == cmd) {
320 m_shift_pressed = (Mode_Shift)value;
321 } else if (DEFAULT_CMD_KEYPAD == cmd) {
322 m_keypad_layout = value;
326 void DefaultInstance::reset_option () {