66
/* Utility function */
64
m17nlib_utf8_find_next_char(const char *p);
68
m17nlib_utf8_find_next_char(const char *p)
71
for (++p; (*p & 0xc0) == 0x80; ++p)
70
for (i = 0; i < max_input_contexts; i++) {
71
if (!ic_array[i].mic) {
82
for (i = 0; i < nr_input_contexts; i++) {
75
ic_array = realloc(ic_array, sizeof(struct ic_) * (max_input_contexts+1));
76
ic_array[max_input_contexts].mic = NULL;
78
return max_input_contexts - 1;
87
ic_array = realloc(ic_array, sizeof(struct ic_) * (nr_input_contexts + 1));
88
ic_array[nr_input_contexts].mic = NULL;
91
return nr_input_contexts - 1;
82
pushback_input_method(MInputMethod *im,
83
char *lib_lang, char *name)
95
pushback_input_method(MInputMethod *im, char *lib_lang, char *name)
85
char *lang = uim_get_language_code_from_language_name(lib_lang);
87
im_array = realloc(im_array,
88
sizeof(struct im_) * (nr_input_methods + 1));
91
im_array[nr_input_methods].lang = strdup(lang);
93
im_array[nr_input_methods].lang = NULL;
99
if (!strcmp(lib_lang, "t"))
104
im_array = realloc(im_array, sizeof(struct im_) * (nr_input_methods + 1));
105
im_array[nr_input_methods].im = im;
95
106
im_array[nr_input_methods].name = strdup(name);
96
im_array[nr_input_methods].im = im;
107
im_array[nr_input_methods].lang = strdup(lang);
97
109
nr_input_methods++;
101
114
preedit_start_cb(MInputContext *ic, MSymbol command)
165
178
mplist_add(minput_default_driver.callback_list, Minput_candidates_draw, (void *)candidates_draw_cb);
166
179
mplist_add(minput_default_driver.callback_list, Minput_candidates_done, (void *)candidates_done_cb);*/
172
186
MPlist *imlist, *elm;
173
MSymbol utf8 = msymbol("utf8");
175
189
nr_input_methods = 0;
190
nr_input_contexts = 0;
177
max_input_contexts = 0;
180
194
imlist = mdatabase_list(msymbol("input-method"), Mnil, Mnil, Mnil);
182
197
/* maybe user forgot to install m17n-db */
183
198
return uim_scm_f();
185
201
for (elm = imlist; mplist_key(elm) != Mnil; elm = mplist_next(elm)) {
186
202
MDatabase *mdb = mplist_value(elm);
187
MSymbol *tag = mdatabase_tag(mdb);
203
MSymbol *tag = mdatabase_tag(mdb); /* tag[1]: lang, tag[2]: name */
188
205
if (tag[1] != Mnil) {
189
206
MInputMethod *im = minput_open_im(tag[1], tag[2], NULL);
191
MSymbol lang = msymbol_get(im->language, Mlanguage);
192
pushback_input_method(im, msymbol_name(lang),
209
pushback_input_method(im, msymbol_name(im->language),
193
210
msymbol_name(im->name));
198
/* register_callbacks();*/
214
register_callbacks();
199
216
m17n_object_unref(imlist);
200
converter = mconv_buffer_converter(utf8, NULL, 0);
217
converter = mconv_buffer_converter(msymbol("utf8"), NULL, 0);
202
220
return uim_scm_f();
205
224
return uim_scm_t();
212
231
sizeof(buffer_for_converter));
213
232
mconv_encode(converter, mtext);
214
233
buffer_for_converter[converter->nbytes] = 0;
215
235
return strdup(buffer_for_converter);
219
239
compose_modep(uim_lisp id_)
221
int id = uim_scm_c_int(id_);
222
/* range check of id might need. */
223
MInputContext *ic = ic_array[id].mic;
227
if (ic->candidate_from == ic->candidate_to ||
228
ic->candidate_from > ic->candidate_to) {
244
id = uim_scm_c_int(id_);
245
ic = ic_array[id].mic;
250
if (ic->candidate_from == ic->candidate_to
251
|| ic->candidate_from > ic->candidate_to)
231
254
return uim_scm_t();
236
258
preedit_changedp(uim_lisp id_)
238
int id = uim_scm_c_int(id_);
239
/* range check of id might need. */
240
MInputContext *ic = ic_array[id].mic;
263
id = uim_scm_c_int(id_);
264
ic = ic_array[id].mic;
242
267
return uim_scm_f();
244
if (ic->preedit_changed == 1) {
269
if (ic->preedit_changed == 1)
245
270
return uim_scm_t();
247
272
return uim_scm_f();
252
276
get_left_of_cursor(uim_lisp id_)
254
int id = uim_scm_c_int(id_);
260
MInputContext *ic = ic_array[id].mic;
262
return uim_scm_make_str("");
264
if (ic->cursor_pos == 0) {
265
return uim_scm_make_str("");
283
id = uim_scm_c_int(id_);
284
ic = ic_array[id].mic;
287
return uim_scm_make_str("");
289
if (ic->cursor_pos == 0)
290
return uim_scm_make_str("");
267
292
buf = convert_mtext2str(ic->preedit);
270
for (i=0; i<ic->cursor_pos ;i++) {
295
for (i = 0; i < ic->cursor_pos ;i++)
271
296
p = m17nlib_utf8_find_next_char(p);
275
buflen = strlen((char *)buf);
276
buf_ = uim_scm_make_str((char *)buf);
299
buflen = strlen(buf);
300
buf_ = uim_scm_make_str(buf);
281
307
get_right_of_cursor(uim_lisp id_)
283
int id = uim_scm_c_int(id_);
289
MInputContext *ic = ic_array[id].mic;
314
id = uim_scm_c_int(id_);
315
ic = ic_array[id].mic;
291
318
return uim_scm_make_str("");
294
320
buf = convert_mtext2str(ic->preedit);
297
for (i=0; i<ic->cursor_pos ;i++) {
323
for (i = 0; i < ic->cursor_pos ;i++)
298
324
p = m17nlib_utf8_find_next_char(p);
300
buflen = strlen((char *)p);
301
buf_ = uim_scm_make_str((char *)p);
327
buf_ = uim_scm_make_str(p);
306
334
get_left_of_candidate(uim_lisp id_)
308
int id = uim_scm_c_int(id_);
314
MInputContext *ic = ic_array[id].mic;
316
return uim_scm_make_str("");
318
if (ic->candidate_from == 0) {
319
return uim_scm_make_str("");
341
id = uim_scm_c_int(id_);
342
ic = ic_array[id].mic;
345
return uim_scm_make_str("");
347
if (ic->candidate_from == 0)
348
return uim_scm_make_str("");
321
350
buf = convert_mtext2str(ic->preedit);
324
for (i=0; i<ic->candidate_from ;i++) {
353
for (i = 0; i < ic->candidate_from ;i++)
325
354
p = m17nlib_utf8_find_next_char(p);
328
buflen = strlen((char *)buf);
329
buf_ = uim_scm_make_str((char *)buf);
357
buflen = strlen(buf);
358
buf_ = uim_scm_make_str(buf);
335
365
get_selected_candidate(uim_lisp id_)
337
int id = uim_scm_c_int(id_);
344
MInputContext *ic = ic_array[id].mic;
369
char *buf, *p, *start;
372
id = uim_scm_c_int(id_);
373
ic = ic_array[id].mic;
346
376
return uim_scm_make_str("");
348
378
buf = convert_mtext2str(ic->preedit);
352
382
return uim_scm_make_str("");
355
for (i=0; i<ic->candidate_from ;i++) {
384
for (i = 0; i < ic->candidate_from ;i++)
356
385
p = m17nlib_utf8_find_next_char(p);
360
for (i=0; i<ic->candidate_to - ic->candidate_from ;i++) {
388
for (i = 0; i < ic->candidate_to - ic->candidate_from ;i++)
361
389
p = m17nlib_utf8_find_next_char(p);
365
392
buflen = strlen(start);
366
393
buf_ = uim_scm_make_str(start);
372
400
get_right_of_candidate(uim_lisp id_)
374
int id = uim_scm_c_int(id_);
380
MInputContext *ic = ic_array[id].mic;
407
id = uim_scm_c_int(id_);
408
ic = ic_array[id].mic;
382
411
return uim_scm_make_str("");
384
413
buf = convert_mtext2str(ic->preedit);
387
for (i=0; i<ic->candidate_to ;i++) {
416
for (i = 0; i < ic->candidate_to ;i++)
388
417
p = m17nlib_utf8_find_next_char(p);
390
419
buflen = strlen(p);
391
420
buf_ = uim_scm_make_str(p);
403
433
get_input_method_name(uim_lisp nth_)
405
435
int nth = uim_scm_c_int(nth_);
406
437
if (nth < nr_input_methods) {
407
438
char *name = alloca(strlen(im_array[nth].name) + 20);
409
if (im_array[nth].lang != NULL)
440
if (!strcmp(im_array[nth].lang, ""))
441
sprintf(name, "m17n-%s", im_array[nth].name);
410
443
sprintf(name, "m17n-%s-%s", im_array[nth].lang, im_array[nth].name);
412
sprintf(name, "m17n-%s", im_array[nth].name);
414
445
return uim_scm_make_str(name);
416
448
return uim_scm_f();
420
452
get_input_method_lang(uim_lisp nth_)
422
454
int nth = uim_scm_c_int(nth_);
456
if (nth < nr_input_methods)
457
return uim_scm_make_str(im_array[nth].lang);
463
get_input_method_short_desc(uim_lisp nth_)
466
char *str = NULL, *p;
469
nth = uim_scm_c_int(nth_);
423
471
if (nth < nr_input_methods) {
424
char *lang = im_array[nth].lang;
426
return uim_scm_make_str(lang);
475
im = im_array[nth].im;
476
desc = minput_get_description(im->language, im->name);
480
str = convert_mtext2str(desc);
481
p = strchr(str, '.');
487
* Workaround for the descriptions which lack period.
488
* Also we avoid the description with non English words.
489
* See https://bugs.freedesktop.org/show_bug.cgi?id=6972
491
for (i = 0; i < len; i++) {
492
if (str[i] == '\n') {
497
else if (!isascii((int)str[i])) {
499
else if ((int)str[i] & ~0x7f) {
506
m17n_object_unref(desc);
510
ret = uim_scm_make_str(str);
428
return uim_scm_make_str("unknown");
513
ret = uim_scm_make_str(N_("An input method provided by the m17n library"));
434
521
static MInputMethod *
435
find_im_by_name(char *name)
522
find_im_by_name(const char *name)
438
if (strncmp(name, "m17n-", 5) != 0) {
527
if (strncmp(name, "m17n-", 5) != 0)
442
532
for (i = 0; i < nr_input_methods; i++) {
444
if (im_array[i].lang == NULL) {
535
if (!strcmp(im_array[i].lang, ""))
445
536
snprintf(buf, 100, "%s", im_array[i].name);
447
538
snprintf(buf, 100, "%s-%s", im_array[i].lang, im_array[i].name);
449
if (!strcmp(name, buf)) {
540
if (!strcmp(im_name, buf))
450
541
return im_array[i].im;
457
548
alloc_id(uim_lisp name_)
459
int id = unused_ic_id();
460
char *name = uim_scm_c_str(name_);
461
MInputMethod *im = find_im_by_name(name);
555
name = uim_scm_refer_c_str(name_);
557
im = find_im_by_name(name);
463
560
ic_array[id].mic = minput_create_ic(im, NULL);
465
562
ic_array[id].old_candidates = NULL;
466
563
ic_array[id].new_candidates = NULL;
468
565
return uim_scm_make_int(id);
472
569
free_id(uim_lisp id_)
474
571
int id = uim_scm_c_int(id_);
475
if (id < max_input_contexts) {
573
if (id < nr_input_contexts) {
476
574
struct ic_ *ic = &ic_array[id];
478
577
minput_destroy_ic(ic->mic);
482
582
return uim_scm_f();
486
586
push_symbol_key(uim_lisp id_, uim_lisp key_)
488
int id = uim_scm_c_int(id_);
490
MInputContext *ic = ic_array[id].mic;
592
id = uim_scm_c_int(id_);
593
ic = ic_array[id].mic;
491
594
key = msymbol(uim_scm_c_str(key_));
496
if(minput_filter(ic, key, NULL)== 1) {
599
if (minput_filter(ic, key, NULL) == 1)
499
602
return uim_scm_f();
614
723
new_cands = malloc (cands_num * sizeof(char *) + 2);
616
725
if (mplist_key(group) == Mtext) {
618
for (i=0; mplist_key(group) != Mnil; group = mplist_next(group)) {
726
for (i = 0; mplist_key(group) != Mnil; group = mplist_next(group)) {
620
for (j=0; j < mtext_len(mplist_value(group)); j++, i++) {
622
mtext_cat_char(produced, mtext_ref_char(mplist_value(group), j));
623
new_cands[i] = convert_mtext2str(produced);
624
m17n_object_unref(produced);
728
for (j = 0; j < mtext_len(mplist_value(group)); j++, i++) {
730
mtext_cat_char(produced, mtext_ref_char(mplist_value(group), j));
731
new_cands[i] = convert_mtext2str(produced);
732
m17n_object_unref(produced);
628
for (i=0; mplist_key(group) != Mnil; group = mplist_next(group)) {
736
for (i = 0; mplist_key(group) != Mnil; group = mplist_next(group)) {
630
for (elm = mplist_value(group); mplist_key(elm) != Mnil; elm = mplist_next(elm),i++) {
738
for (elm = mplist_value(group); mplist_key(elm) != Mnil;
739
elm = mplist_next(elm),i++) {
631
740
produced = mplist_value(elm);
632
741
new_cands[i] = convert_mtext2str(produced);
681
782
get_nr_candidates(uim_lisp id_)
683
784
int id = uim_scm_c_int(id_);
684
786
return uim_scm_make_int(calc_cands_num(id));
688
790
get_nth_candidate(uim_lisp id_, uim_lisp nth_)
690
int id = uim_scm_c_int(id_);
691
int nth = uim_scm_c_int(nth_);
692
int nr = ic_array[id].nr_candidates;
794
id = uim_scm_c_int(id_);
795
nth = uim_scm_c_int(nth_);
796
nr = ic_array[id].nr_candidates;
695
799
return uim_scm_make_str(ic_array[id].new_candidates[nth]);
697
801
return uim_scm_make_str("");
702
805
get_candidate_index(uim_lisp id_)
704
int id = uim_scm_c_int(id_);
705
MInputContext *ic = ic_array[id].mic;
810
id = uim_scm_c_int(id_);
811
ic = ic_array[id].mic;
706
813
return uim_scm_make_int(ic->candidate_index);
709
/* Utility function */
711
m17nlib_utf8_find_next_char(const char *p)
714
for (++p; (*p & 0xc0) == 0x80; ++p)
721
817
uim_plugin_instance_init(void)
723
819
uim_scm_init_subr_0("m17nlib-lib-init", init_m17nlib);
724
uim_scm_init_subr_0("m17nlib-lib-nr-input-methods", get_nr_input_methods);
725
uim_scm_init_subr_1("m17nlib-lib-nth-input-method-lang", get_input_method_lang);
726
uim_scm_init_subr_1("m17nlib-lib-nth-input-method-name", get_input_method_name);
820
uim_scm_init_subr_0("m17nlib-lib-nr-input-methods",
821
get_nr_input_methods);
822
uim_scm_init_subr_1("m17nlib-lib-nth-input-method-lang",
823
get_input_method_lang);
824
uim_scm_init_subr_1("m17nlib-lib-nth-input-method-name",
825
get_input_method_name);
826
uim_scm_init_subr_1("m17nlib-lib-nth-input-method-short-desc",
827
get_input_method_short_desc);
727
828
uim_scm_init_subr_1("m17nlib-lib-alloc-context", alloc_id);
728
829
uim_scm_init_subr_1("m17nlib-lib-free-context", free_id);
729
830
uim_scm_init_subr_2("m17nlib-lib-push-symbol-key", push_symbol_key);
730
831
uim_scm_init_subr_1("m17nlib-lib-compose-mode?", compose_modep);
731
832
uim_scm_init_subr_1("m17nlib-lib-preedit-changed?", preedit_changedp);
732
uim_scm_init_subr_1("m17nlib-lib-get-left-of-cursor", get_left_of_cursor);
733
uim_scm_init_subr_1("m17nlib-lib-get-right-of-cursor", get_right_of_cursor);
734
uim_scm_init_subr_1("m17nlib-lib-get-left-of-candidate", get_left_of_candidate);
735
uim_scm_init_subr_1("m17nlib-lib-get-selected-candidate", get_selected_candidate);
736
uim_scm_init_subr_1("m17nlib-lib-get-right-of-candidate", get_right_of_candidate);
833
uim_scm_init_subr_1("m17nlib-lib-get-left-of-cursor", get_left_of_cursor);
834
uim_scm_init_subr_1("m17nlib-lib-get-right-of-cursor", get_right_of_cursor);
835
uim_scm_init_subr_1("m17nlib-lib-get-left-of-candidate",
836
get_left_of_candidate);
837
uim_scm_init_subr_1("m17nlib-lib-get-selected-candidate",
838
get_selected_candidate);
839
uim_scm_init_subr_1("m17nlib-lib-get-right-of-candidate",
840
get_right_of_candidate);
737
841
uim_scm_init_subr_1("m17nlib-lib-get-result", get_result);
738
842
uim_scm_init_subr_1("m17nlib-lib-commit", commit);
739
843
uim_scm_init_subr_1("m17nlib-lib-candidate-show?", candidate_showp);