mGNCS API Reference  v1.2.0
A new control set and a new framework for MiniGUI apps
mime.h
Go to the documentation of this file.
1 
42 #ifndef _MGUI_IME_H
43 #define _MGUI_IME_H
44 
45 #ifdef _MGNCSENGINE_IME
46 
47 #ifdef __cplusplus
48 extern "C" {
49 #endif
50 
51 #define IME_STOP_MSG 1
52 #define IME_CONTINUE_MSG 0
53 
54 typedef int (*NCSCB_LEN_FIRST_CHAR)(const unsigned char*, int len);
55 
56 typedef int (*NCSCB_RETRIEVE_CHAR)(const char*);
57 typedef struct _CHARSET_CONVERTER
58 {
59  //get a char who has a special code
60  NCSCB_RETRIEVE_CHAR retrieve_char;
61  void * conv_info;
62  void * reserved;
63 }CHARSET_CONVERTER;
64 
65 MGNCS_EXPORT BOOL ncsIMInitCharsetConv(CHARSET_CONVERTER* conv, const char* from_charset, const char* to_charset, NCSCB_RETRIEVE_CHAR retrieve_char);
66 MGNCS_EXPORT void ncsIMFreeCharsetConv(CHARSET_CONVERTER* conv);
67 MGNCS_EXPORT unsigned int ncsIMCharsetConv(CHARSET_CONVERTER* conv, const char ** pwords);
68 MGNCS_EXPORT char* ncsIMConvertWord(CHARSET_CONVERTER* conv, const char* word, char* out, int len);
69 
70 MGNCS_EXPORT NCSCB_LEN_FIRST_CHAR ncsIMGetFirstCharCallback(const char* encoding);
71 
72 typedef struct _mIMEngineClass mIMEngineClass;
73 typedef struct _mIMEngine mIMEngine;
74 typedef struct _mIMIteratorClass mIMIteratorClass;
75 typedef struct _mIMIterator mIMIterator;
76 
77 #define NCS_IM_SCANCODE_ISDIGIT(s) ((s) >= SCANCODE_1 && (s) <= SCANCODE_0)
78 #define NCS_IM_SCANCODE_ISALPHA(s) \
79  ( ((s) >= SCANCODE_Q && (s) <= SCANCODE_P) \
80  || ((s) >= SCANCODE_A && (s) <= SCANCODE_L) \
81  || ((s) >= SCANCODE_Z && (s) <= SCANCODE_M) \
82  )
83 
84 enum mIMIteratorProp{
85  NCSP_IMEIT_CHARTYPE
86 };
87 
88 #define mIMIteratorClassHeader(clss, super) \
89  mObjectClassHeader(clss, super) \
90  PUBLIC void (*empty)(clss*); \
91  PUBLIC int (*count)(clss*); \
92  PUBLIC int (*next)(clss*); \
93  PUBLIC int (*prev)(clss*); \
94  PUBLIC int (*locate)(clss*,int off, int type); \
95  PUBLIC int (*curIndex)(clss*); \
96  PUBLIC DWORD (*setProperty)(clss*, int id, DWORD valude); \
97  PUBLIC DWORD (*getProperty)(clss*, int id); \
98  PUBLIC const char*(*word)(clss*);
99 
100 #define mIMIteratorHeader(clss) \
101  mObjectHeader(clss) \
102  CHARSET_CONVERTER *charset_converter;
103 
104 
105 struct _mIMIteratorClass {
106  mIMIteratorClassHeader(mIMIterator, mObject)
107 };
108 
109 struct _mIMIterator {
110  mIMIteratorHeader(mIMIterator)
111 };
112 
113 MGNCS_EXPORT extern mIMIteratorClass g_stmIMIteratorCls;
114 
115 #define MAX_IME_NAME_LEN 16
116 #define mIMEngineClassHeader(clss, super) \
117  mObjectClassHeader(clss, super) \
118  const char* (*imeName)(clss*); \
119  mIMEngine * (*create)(const char* pdict, DWORD add_data); \
120  const char* (*getEncoding)(clss*); \
121  PROTECTED NCSCB_RETRIEVE_CHAR (*getRetrieveChar)(clss*);\
122  mIMIterator* (*newIterator)(clss*); \
123  mIMIterator* (*newAssocIterator)(clss*); \
124  /* find words */ \
125  BOOL (*findWords)(clss*, mIMIterator* it, const char* input, int start); \
126  BOOL (*findAssociate)(clss*, mIMIterator* it, const char* input);
127 
128 #define mIMEngineHeader(clss) \
129  mObjectHeader(clss)
130 
131 struct _mIMEngineClass{
132  mIMEngineClassHeader(mIMEngine, mObject)
133 };
134 
135 struct _mIMEngine {
136  mIMEngineHeader(mIMEngine)
137 };
138 
139 MGNCS_EXPORT extern mIMEngineClass g_stmIMEngineCls;
140 
141 typedef struct _mIMEClass mIMEClass;
142 typedef struct _mIME mIME;
143 
144 typedef struct _mIMManagerClass mIMManagerClass;
145 typedef struct _mIMManager mIMManager;
146 
147 
148 #define NCS_MAX_INPUT 128
149 #define NCS_IME_UPDATE_KEY 0x01
150 #define NCS_IME_UPDATE_WORDS 0x02
151 #define NCS_IME_UPDATE_FEEDBACK 0x04
152 #define NCS_IME_UPDATE_CURSOR 0x08
153 #define NCS_IME_UPDATE_ALL 0xFFFF
154 
155 #define NCS_IMM_BEGIN (MSG_USER + 100)
156 #define NCS_IMM_UPDATE (NCS_IMM_BEGIN + 1)
157 // int update_code = wParam
158 #define NCS_IMM_GETSELWORD (NCS_IMM_BEGIN + 2)
159 // BOOL braw = wParam
160 #define NCS_IMM_ISSELWORDCTRLACTIVE (NCS_IMM_BEGIN + 3)
161 #define NCS_IMM_SETSELWORDACTIVE (NCS_IMM_BEGIN + 4)
162 
163 #define mIMEClassHeader(clss, super) \
164  mObjectClassHeader(clss, super) \
165  \
166  PROTECTED BOOL (*showIME)(clss*); \
167  PROTECTED void (*hideIME)(clss*); \
168  PROTECTED void (*update)(clss*, DWORD flfags); \
169  PROTECTED const char* (*getSelWord)(clss*, BOOL braw); \
170  PROTECTED DWORD (*getIMStatus)(clss*, int); \
171  PROTECTED BOOL (*setIMStatus)(clss*,int, DWORD); \
172  PROTECTED BOOL (*onCaretPos)(clss*, int,int); \
173  PROTECTED BOOL (*findWords)(clss*, const char* input, int start, int len); \
174  PROTECTED BOOL (*findAssociate)(clss*, const char* words); \
175  PROTECTED BOOL (*emptyKey)(clss*); \
176  PROTECTED BOOL (*setEncoding)(clss*, const char*); \
177  PROTECTED BOOL (*addChar)(clss*, int ch); \
178  PROTECTED BOOL (*delChar)(clss*,BOOL bback); \
179  PROTECTED BOOL (*setInsert)(clss*, int pos, int type); \
180  PROTECTED BOOL (*clearInput)(clss*); \
181  PROTECTED int (*onChar)(clss*, int ch,DWORD keyflags); \
182  PROTECTED int (*onKeyDown)(clss*,int scancode, DWORD keyflags); \
183  PUBLIC void (*setIMEngine)(clss*, mIMEngine*); \
184  PUBLIC void (*empty)(clss*, BOOL bUpdate);
185 
186 
187 #define mIMEHeader(clss) \
188  mObjectHeader(clss) \
189  mIME* next; \
190  char input[NCS_MAX_INPUT]; \
191  int len; \
192  int start:16; \
193  int insert:16; \
194  mIMManager *ime_manager; \
195  mIMEngine *ime_engine; \
196  mIMIterator *key_it; \
197  mIMIterator *assoc_it; \
198  CHARSET_CONVERTER charset_conv; \
199  HWND hwnd_view; \
200  WNDPROC old_view_proc;
201 
202 struct _mIMEClass {
203  mIMEClassHeader(mIME, mObject)
204 };
205 
206 struct _mIME {
207  mIMEHeader(mIME)
208 };
209 
210 MGNCS_EXPORT extern mIMEClass g_stmIMECls;
211 
212 #define mIME_sendWords(ime) (_c(ime->ime_manager)->sendWords(ime->ime_manager))
213 #define mIME_sendKeys(ime) (_c(ime->ime_manager)->sendKeys(ime->ime_manager))
214 
215 #define mIME_FromView(hwnd) ((mIME*)GetWindowAdditionalData(hwnd))
216 MGNCS_EXPORT void mIME_attach(mIME *ime, HWND hwnd);
217 
218 MGNCS_EXPORT void mIME_passMessage(mIME* ime, UINT message, WPARAM wParam, LPARAM lParam);
219 #define mIMView_passMessage(hwnd, message, wParam, lParam) \
220  mIME_passMessage(mIME_FromView(hwnd), (message), (wParam), (lParam))
221 
222 #define mIMManagerClassHeader(clss, super) \
223  mObjectClassHeader(clss, super) \
224  PROTECTED int (*procIMMsg)(clss*,UINT,WPARAM,LPARAM,LRESULT*); \
225  PROTECTED BOOL (*nextIME)(clss*); \
226  PROTECTED BOOL (*setIME)(clss*, const char*); \
227  PUBLIC BOOL (*addIME)(clss*, mIME *ime); \
228  PROTECTED BOOL (*sendWords)(clss*); \
229  PROTECTED BOOL (*sendKeys)(clss*); \
230  PUBLIC void (*setEncoding)(clss*, const char*);
231 
232 #define mIMManagerHeader(clss) \
233  mObjectHeader(clss) \
234  NCSCB_LEN_FIRST_CHAR len_first_char; \
235  HWND hwnd; \
236  HWND hwnd_target; \
237  mIME * header; \
238  mIME * cur_ime; \
239  DWORD flags; \
240  int ime_x:16; \
241  int ime_y:16;
242 
243 #define NCSF_IMM_DISABLE 0x01
244 #define NCSF_IMM_ACTIVED 0x02
245 #define NCSF_IMM_NULLIME 0x04
246 #define NCSF_IMM_SETTING_IME 0x80000000
247 
248 enum NCSIMMEvent {
249  NCSN_IMM_IMEOPEN = 5678,
250  NCSN_IMM_IMECHANGED,
251  NCSN_IMM_IMECLOSE,
252 };
253 
254 struct _mIMManagerClass {
255  mIMManagerClassHeader(mIMManager, mObject)
256 };
257 struct _mIMManager {
258  mIMManagerHeader(mIMManager)
259 };
260 
261 MGNCS_EXPORT extern mIMManagerClass g_stmIMManagerCls;
262 
263 #endif //_MGNCSENGINE_IME
264 
268 #ifdef _MGNCSENGINE_DIGIT
269 
270 #define NCS_DIGIT_MAX_FINDS 32
271 
272 #define mDigitIteratorClassHeader(clss, super) \
273  mIMIteratorClassHeader(clss, super) \
274  PUBLIC mIMIterator* (*subIterator)(clss*);
276 #define mDigitIteratorHeader(clss) \
277  mIMIteratorHeader(clss) \
278  int count; \
279  int cur; \
280  mIMIterator * sub_it; \
281  const char** words; \
282  int finds[NCS_DIGIT_MAX_FINDS][2]; /*begin and end */
283 
284 DECLARE_CLASS(mDigitIterator, mIMIterator)
285 
286 #define mDigitIMEClassHeader(clss, super) \
287  mIMEClassHeader(clss, super)
288 
289 #define mDigitIMEHeader(clss) \
290  mIMEHeader(clss) \
291  CHARSET_CONVERTER sub_conv;
292 
293 DECLARE_CLASS(mDigitIME, mIME)
294 
295 // digital engine
296 #define mDigitEngineClassHeader(clss, super) \
297  mIMEngineClassHeader(clss, super) \
298  PROTECTED BOOL (*findRange)(clss*, \
299  const char* input, \
300  int start, int len, \
301  int *pbegin, int *pend);
302 
303 #define mDigitEngineHeader(clss) \
304  mIMEngineHeader(clss) \
305  mIMEngine* sub_engine;
306 
307 DECLARE_CLASS(mDigitEngine, mIMEngine)
308 
309 #endif //_MGNCSENGINE_DIGIT
310 
311 #ifdef _MGNCSENGINE_DIGITPTI
312 //digitpti
314 #define mDigitPtiEngineClassHeader(clss, super) \
315  mDigitEngineClassHeader(clss, super)
316 
317 #define mDigitPtiEngineHeader(clss) \
318  mDigitEngineHeader(clss) \
319  int case_type;
320 
321 DECLARE_CLASS(mDigitPtiEngine, mDigitEngine)
322 
323 #define mDigitPtiIteratorClassHeader(clss, super) \
324  mDigitIteratorClassHeader(clss, super)
325 
326 #define mDigitPtiIteratorHeader(clss) \
327  mDigitIteratorHeader(clss) \
328  char* letters; //only for signle letters, for example "a\0b\0\c\0"
329 
330 DECLARE_CLASS(mDigitPtiIterator, mDigitIterator)
331 
332 #endif //_MGNCSENGINE_DIGITPTI
333 
335 //digit pinyin
336 
337 #ifdef _MGNCSENGINE_DIGITPY
338 
339 #define mDigitPyEngineClassHeader(clss, super) \
340  mDigitEngineClassHeader(clss, super)
341 
342 #define mDigitPyEngineHeader(clss) \
343  mDigitEngineHeader(clss) \
344  int py_count; \
345  unsigned int * keys; \
346  const char** pinyins;
347 
348 DECLARE_CLASS(mDigitPyEngine, mDigitEngine)
349 
350 #define mDigitPyIteratorClassHeader(clss, super) \
351  mDigitIteratorClassHeader(clss, super)
352 
353 
354 #define mDigitPyIteratorHeader(clss) \
355  mDigitIteratorHeader(clss) \
356  mIMEngine* py_engine;
357 
358 DECLARE_CLASS(mDigitPyIterator, mDigitIterator)
359 
360 #endif //_MGNCSENGINE_DIGITPY
361 
363 // pti engine
364 #ifdef _MGNCSENGINE_PTI
365 
366 #define mPtiIteratorClassHeader(clss, super) \
367  mIMIteratorClassHeader(clss, super)
368 
369 #define mPtiIteratorHeader(clss) \
370  mIMIteratorHeader(clss) \
371  int cur; \
372  const char** words; \
373  int count; \
374  int begin; \
375  char upper_buffer[128]; \
376  int char_type; \
377  const char* lead_letter;
378 
379 DECLARE_CLASS(mPtiIterator, mIMIterator)
380 
381 #define mPtiEngineClassHeader(clss, super) \
382  mIMEngineClassHeader(clss, super)
383 
384 #define MGPTI_2ND_HASH_TABLE_SIZE 100
385 
386 enum {
387  MGPTI_LOWER = 100,
388  MGPTI_UPPER
389 };
390 
391 typedef struct _MGPTI_2ND_HASH_BUCKET {
392  int nr_words;
393  int* word_indices;
394 } MGPTI_2ND_HASH_BUCKET;
395 
396 typedef struct _MGPTI_1ST_HASH_BUCKET {
397  int indices [26];
398  MGPTI_2ND_HASH_BUCKET* buckets;
399 } MGPTI_1ST_HASH_BUCKET;
400 
401 
402 #define mPtiEngineHeader(clss) \
403  mIMEngineHeader(clss) \
404  char **sorted_words; \
405  int max_index; \
406  MGPTI_1ST_HASH_BUCKET *buckets[26];
407 
408 
409 DECLARE_CLASS(mPtiEngine, mIMEngine)
410 
411 MGNCS_EXPORT BOOL mPtiEngine_findWordRange(mPtiEngine* self, int* pbegin, int* pend, const char* input, int start, int len);
412 
413 #endif //_MGNCSENGINE_PTI
414 
416 // pinyin engine
417 #ifdef _MGNCSENGINE_PINYIN
418 
419 #define PINYIN_MAGIC_NUMBER "CCEGB"
420 #define PINYIN_ENAME_LENGTH 24
421 #define PINYIN_CNAME_LENGTH 16
422 #define PINYIN_WORD_LENGTH 16
423 #define PINYIN_SELECT_KEY_LENGTH 16
424 #define PINYIN_KEY_LENGTH 16
425 #define PINYIN_SEL_LENGTH 58
426 
427 
428 typedef struct {
429  unsigned long key1;
430  unsigned long key2;
431  unsigned short word_offset_idx; //pharse_offset table index
432  unsigned short frequency;
433 }NCS_PINYIN_ITEM;
434 
435 typedef struct {
436  unsigned int off_begin; //begin offset
437  unsigned int off_end; //end offset
438 }NCS_PINYIN_PHOFFSET;
439 
440 typedef struct {
441  char magic_number[sizeof(PINYIN_MAGIC_NUMBER)];
442  char ename[PINYIN_ENAME_LENGTH]; //ascii name
443  char cname[PINYIN_CNAME_LENGTH]; //promt
444  char selkey[PINYIN_SELECT_KEY_LENGTH]; //select keys
445 
446  char last_full;
447  int totalKey;
448  int maxPress;
449  int maxDupSel;
450  int totalChar;
451 
452  unsigned char keyMap[128];
453  unsigned char keyName[64];
454  unsigned short keyIndex[64];
455 
456  int wordNum;
457  char* wordFile;
458  char* assocFile;
459  NCS_PINYIN_ITEM * item;
460 }NCS_PINYIN_IME_TABLE;
461 
462 
463 #define mPinyinEngineClassHeader(clss, super) \
464  mIMEngineClassHeader(clss, super)
465 
466 #define mPinyinEngineHeader(clss) \
467  mIMEngineHeader(clss) \
468  NCS_PINYIN_IME_TABLE * ime_table;
469 
470 DECLARE_CLASS(mPinyinEngine, mIMEngine)
471 
472 #define PINYIN_MAX_WORD 64
473 #define PINYIN_MAX_WORDLEN 64
474 #define PINYIN_INPUT_MAX 32
475 typedef struct {
476  union {
477  char chars[4];
478  const char* word;
479  }word;
480  int len;
481 }NCS_PINYIN_WORD_INFO;
482 
483 
484 #define mPinyinIteratorClassHeader(clss, super) \
485  mIMIteratorClassHeader(clss, super)
486 
487 #define mPinyinIteratorHeader(clss) \
488  mIMIteratorHeader(clss) \
489  int count; \
490  int cur; \
491  unsigned int charIndex[PINYIN_INPUT_MAX]; \
492  unsigned int startKey; \
493  unsigned int endKey; \
494  unsigned long matched_key1; \
495  unsigned long matched_key2; \
496  NCS_PINYIN_WORD_INFO words[PINYIN_MAX_WORD]; \
497  char word[PINYIN_MAX_WORDLEN]; \
498  BOOL isAssociate;
499 
500 DECLARE_CLASS(mPinyinIterator, mIMIterator)
501 
502 #if MGUI_BYTEORDER == MGUI_BIG_ENDIAN
503 #define ARCH_SWAP16(v16) ArchSwap16(v16)
504 #define ARCH_SWAP32(v32) ArchSwap32(v32)
505 #else
506 #define ARCH_SWAP16(v16) (v16)
507 #define ARCH_SWAP32(v32) (v32)
508 #endif
509 
510 #ifdef __cplusplus
511 }
512 #endif
513 
514 #endif //_MGNCSENGINE_PINYIN
515 #endif
516 
517 
the Object struct