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