96
uim_flush_cb(uim_context uc)
98
struct cb *cb = uc->cb_q.first_cb;
106
s = uc->conv_if->convert(uc->conv, tmp->str);
108
uc->commit_cb(uc->ptr, s);
113
case CAND_ACTIVATE_CB:
115
if (uc->candidate_selector_activate_cb) {
116
uc->candidate_selector_activate_cb(uc->ptr, tmp->n1, tmp->n2);
122
if (uc->candidate_selector_select_cb) {
123
uc->candidate_selector_select_cb(uc->ptr, tmp->n1);
127
case CAND_SHIFT_PAGE_CB:
129
if (uc->candidate_selector_shift_page_cb) {
130
uc->candidate_selector_shift_page_cb(uc->ptr, tmp->n1);
134
case CAND_DEACTIVATE_CB:
136
if (uc->candidate_selector_deactivate_cb) {
137
uc->candidate_selector_deactivate_cb(uc->ptr);
141
case PREEDIT_CLEAR_CB:
143
uim_release_preedit_segments(uc);
146
case PREEDIT_PUSHBACK_CB:
149
s = uc->conv_if->convert(uc->conv, tmp->str);
150
pushback_preedit_segment(uc, tmp->n1, s);
153
case PREEDIT_UPDATE_CB:
155
uim_update_preedit_segments(uc);
160
if (uc->mode_update_cb) {
161
uc->mode_update_cb(uc->ptr, tmp->n1);
165
case MODE_LIST_UPDATE_CB:
167
if (uc->mode_list_update_cb) {
168
uc->mode_list_update_cb(uc->ptr);
172
case PROP_LABEL_UPDATE_CB:
174
if (uc->prop_label_update_cb) {
175
uc->prop_label_update_cb(uc->ptr, uc->proplabelstr);
179
case PROP_LIST_UPDATE_CB:
181
if (uc->prop_list_update_cb) {
182
uc->prop_list_update_cb(uc->ptr, uc->propstr);
186
case REQUEST_SURROUNDING_CB:
188
if (uc->request_surrounding_text_cb) {
189
uc->request_surrounding_text_cb(uc->ptr);
193
case DELETE_SURROUNDING_CB:
195
if (uc->delete_surrounding_text_cb) {
196
uc->delete_surrounding_text_cb(uc->ptr, tmp->n1, tmp->n2);
207
uc->cb_q.first_cb = NULL;
208
uc->cb_q.tail_cb = NULL;
211
102
/* release preedit segment in a context */
213
104
uim_release_preedit_segments(uim_context uc)
216
111
if (!uc->psegs) {
217
112
uc->nr_psegs = 0;
362
340
uim_eval_string(uim_context uc, char *buf)
365
repl_c_string(buf, 0, 1);
367
/* Flush callback requests queued during scheme evaluation
368
* (To avoid C -> scheme -> C call, actual call is delayed to here)
370
if (!uc->cb_q.flushing) {
371
uc->cb_q.flushing ++;
373
uc->cb_q.flushing --;
343
uim_scm_eval_c_string(buf);
377
346
/* this is not a uim API, so did not name as uim_retrieve_context() */
378
347
static uim_context
379
retrieve_uim_context(LISP id)
348
retrieve_uim_context(uim_lisp id)
382
if CONSP(id) { /* passed as Scheme-side input context */
352
if (uim_scm_consp(id)) { /* passed as Scheme-side input context */
353
id = uim_scm_car(id);
385
uc = uim_find_context(get_c_int(id));
355
uc = uim_find_context(uim_scm_c_int(id));
390
im_clear_preedit(LISP id)
360
im_clear_preedit(uim_lisp id)
392
362
uim_context uc = retrieve_uim_context(id);
393
uim_schedule_cb(uc, PREEDIT_CLEAR_CB, NULL, 0, 0);
363
uim_release_preedit_segments(uc);
398
im_pushback_preedit(LISP id_, LISP attr_, LISP str_)
368
im_pushback_preedit(uim_lisp id_, uim_lisp attr_, uim_lisp str_)
400
370
uim_context uc = retrieve_uim_context(id_);
402
int attr = get_c_int(attr_);
371
const char *str = NULL;
372
int attr = uim_scm_c_int(attr_);
404
str = uim_get_c_string(str_);
406
uim_schedule_cb(uc, PREEDIT_PUSHBACK_CB, str, attr, 0);
374
str = uim_scm_refer_c_str(str_);
378
s = uc->conv_if->convert(uc->conv, str);
379
pushback_preedit_segment(uc, attr, s);
411
im_update_preedit(LISP id)
385
im_update_preedit(uim_lisp id)
413
387
uim_context uc = retrieve_uim_context(id);
414
uim_schedule_cb(uc, PREEDIT_UPDATE_CB, NULL, 0, 0);
388
uim_update_preedit_segments(uc);
420
im_commit(LISP id, LISP str_)
394
im_commit(uim_lisp id, uim_lisp str_)
422
396
uim_context uc = retrieve_uim_context(id);
425
str = uim_get_c_string(str_);
426
uim_schedule_cb(uc, COMMIT_CB, str, 0, 0);
397
const char *str = NULL;
398
if (uim_scm_stringp(str_)) {
399
str = uim_scm_refer_c_str(str_);
402
s = uc->conv_if->convert(uc->conv, str);
404
uc->commit_cb(uc->ptr, s);
432
im_commit_raw(LISP id)
413
im_commit_raw(uim_lisp id)
434
415
uim_context uc = retrieve_uim_context(id);
435
416
uc->commit_raw_flag = 1;
440
im_get_raw_key_str(LISP key_, LISP key_state_)
421
im_get_raw_key_str(uim_lisp key_, uim_lisp key_state_)
443
int key_state = get_c_int(key_state_);
424
int key_state = uim_scm_c_int(key_state_);
447
key = get_c_int(key_);
427
if (uim_scm_integerp(key_)) {
428
key = uim_scm_c_int(key_);
451
432
if ((key_state != 0 && key_state != UMod_Shift) ||
506
486
uc->modes = NULL;
508
488
uc->nr_modes = 0;
513
im_pushback_mode_list(LISP id, LISP str)
493
im_pushback_mode_list(uim_lisp id, uim_lisp str)
516
496
uim_context uc = retrieve_uim_context(id);
521
501
uc->modes = realloc(uc->modes,
522
502
sizeof(char *)*(uc->nr_modes+1));
523
s = uim_get_c_string(str);
503
s = uim_scm_refer_c_str(str);
524
504
uc->modes[uc->nr_modes] = uc->conv_if->convert(uc->conv, s);
531
im_update_mode_list(LISP id)
533
uim_context uc = retrieve_uim_context(id);
538
uim_schedule_cb(uc, MODE_LIST_UPDATE_CB, NULL, 0, 0);
543
im_update_prop_list(LISP id, LISP prop_)
545
uim_context uc = retrieve_uim_context(id);
546
char *prop = uim_get_c_string(prop_);
549
uim_schedule_cb(uc, PROP_LIST_UPDATE_CB, NULL, 0, 0);
510
im_update_mode_list(uim_lisp id)
512
uim_context uc = retrieve_uim_context(id);
517
if (uc->mode_list_update_cb) {
518
uc->mode_list_update_cb(uc->ptr);
524
im_update_prop_list(uim_lisp id, uim_lisp prop_)
526
uim_context uc = retrieve_uim_context(id);
527
const char *prop = uim_scm_refer_c_str(prop_);
551
if(uc && uc->propstr)
532
if (uc && uc->propstr)
552
533
free(uc->propstr);
554
535
uc->propstr = uc->conv_if->convert(uc->conv, prop);
563
im_update_prop_label(LISP id, LISP prop_)
565
uim_context uc = retrieve_uim_context(id);
566
char *prop = uim_get_c_string(prop_);
569
uim_schedule_cb(uc, PROP_LABEL_UPDATE_CB, NULL, 0, 0);
574
if(uc && uc->proplabelstr)
575
free(uc->proplabelstr);
577
uc->proplabelstr = uc->conv_if->convert(uc->conv, prop);
585
im_update_mode(LISP id, LISP mode_)
587
int mode = get_c_int(mode_);
588
uim_context uc = retrieve_uim_context(id);
537
if (uc->prop_list_update_cb)
538
uc->prop_list_update_cb(uc->ptr, uc->propstr);
544
im_update_mode(uim_lisp id, uim_lisp mode_)
546
int mode = uim_scm_c_int(mode_);
547
uim_context uc = retrieve_uim_context(id);
594
uim_schedule_cb(uc, MODE_UPDATE_CB, NULL, mode, 0);
553
if (uc->mode_update_cb) {
554
uc->mode_update_cb(uc->ptr, mode);
599
get_im_lang(char *name)
560
get_im_lang(const char *name)
602
563
for (i = 0; i < uim_nr_im; i++) {
612
im_register_im(LISP name, LISP lang, LISP enc, LISP s_desc)
573
im_register_im(uim_lisp name, uim_lisp lang, uim_lisp enc, uim_lisp s_desc)
614
char *im_name = get_c_string(name);
615
char *lang_name = get_c_string(lang);
616
char *encoding_name = get_c_string(enc);
617
char *short_desc = get_c_string(s_desc);
575
const char *im_name = uim_scm_refer_c_str(name);
618
576
if (get_im_lang(im_name)) {
619
577
/* avoid duplicate register */
622
580
uim_im_array = realloc(uim_im_array,
623
581
sizeof(struct uim_im) *
624
582
(uim_nr_im + 1));
625
uim_im_array[uim_nr_im].lang = strdup(lang_name);
626
uim_im_array[uim_nr_im].name = strdup(im_name);
627
uim_im_array[uim_nr_im].encoding = strdup(encoding_name);
628
uim_im_array[uim_nr_im].short_desc = strdup(short_desc);
583
uim_im_array[uim_nr_im].lang = uim_scm_c_str(lang);
584
uim_im_array[uim_nr_im].name = uim_scm_c_str(name);
585
uim_im_array[uim_nr_im].encoding = uim_scm_c_str(enc);
586
uim_im_array[uim_nr_im].short_desc = uim_scm_c_str(s_desc);
634
im_activate_candidate_selector(LISP id_, LISP nr_, LISP display_limit_)
636
uim_context uc = retrieve_uim_context(id_);
637
int display_limit = get_c_int(display_limit_);
638
int nr = get_c_int(nr_);
639
uim_schedule_cb(uc, CAND_ACTIVATE_CB, NULL, nr, display_limit);
644
im_select_candidate(LISP id_, LISP idx_)
646
uim_context uc = retrieve_uim_context(id_);
647
int idx = get_c_int(idx_);
648
uim_schedule_cb(uc, CAND_SELECT_CB, NULL, idx, 0);
592
im_activate_candidate_selector(uim_lisp id_, uim_lisp nr_, uim_lisp display_limit_)
594
uim_context uc = retrieve_uim_context(id_);
595
int display_limit = uim_scm_c_int(display_limit_);
596
int nr = uim_scm_c_int(nr_);
597
if (uc->candidate_selector_activate_cb) {
598
uc->candidate_selector_activate_cb(uc->ptr, nr, display_limit);
604
im_select_candidate(uim_lisp id_, uim_lisp idx_)
606
uim_context uc = retrieve_uim_context(id_);
607
int idx = uim_scm_c_int(idx_);
608
if (uc->candidate_selector_select_cb) {
609
uc->candidate_selector_select_cb(uc->ptr, idx);
653
615
/* My naming sense seems bad... */
655
im_shift_page_candidate(LISP id_, LISP dir_)
617
im_shift_page_candidate(uim_lisp id_, uim_lisp dir_)
657
619
uim_context uc = retrieve_uim_context(id_);
622
if UIM_SCM_FALSEP(dir_)
665
uim_schedule_cb(uc, CAND_SHIFT_PAGE_CB, NULL, dir, 0);
627
if (uc->candidate_selector_shift_page_cb) {
628
uc->candidate_selector_shift_page_cb(uc->ptr, dir);
670
im_deactivate_candidate_selector(LISP id_)
634
im_deactivate_candidate_selector(uim_lisp id_)
672
636
uim_context uc = retrieve_uim_context(id_);
673
uim_schedule_cb(uc, CAND_DEACTIVATE_CB, NULL, 0, 0);
637
if (uc->candidate_selector_deactivate_cb) {
638
uc->candidate_selector_deactivate_cb(uc->ptr);
678
im_return_str(LISP str_)
644
im_return_str(uim_lisp str_)
680
646
if (uim_return_str) {
681
647
free(uim_return_str);
682
648
uim_return_str = NULL;
685
uim_return_str = uim_get_c_string(str_);
650
if (uim_scm_stringp(str_)) {
651
uim_return_str = uim_scm_c_str(str_);
691
im_return_str_list(LISP str_list_)
657
im_return_str_list(uim_lisp str_list_)
693
659
/*XXX: This fixed length array is negligence */
696
if (uim_return_str_list) {
697
for (i = 0; i < (int)UIM_RETURN_STR_LIST_SIZE; i++){
698
if (uim_return_str_list[i]) {
699
free(uim_return_str_list[i]);
700
uim_return_str_list[i] = NULL;
662
for (i = 0; i < (int)UIM_RETURN_STR_LIST_SIZE; i++) {
663
if (uim_return_str_list[i]) {
664
free(uim_return_str_list[i]);
665
uim_return_str_list[i] = NULL;
709
while (NNULLP(str_list_) && i < (int)UIM_RETURN_STR_LIST_SIZE) {
710
LISP str_ = CAR(str_list_);
712
uim_return_str_list[i] = uim_get_c_string(str_);
673
while (!uim_scm_nullp(str_list_) && i < (int)UIM_RETURN_STR_LIST_SIZE) {
674
uim_lisp str_ = uim_scm_car(str_list_);
675
if (uim_scm_stringp(str_)) {
676
uim_return_str_list[i] = uim_scm_c_str(str_);
716
str_list_ = CDR(str_list_);
680
str_list_ = uim_scm_cdr(str_list_);
718
682
uim_return_str_list[i] = NULL;
723
im_request_surrounding(LISP id_)
687
im_request_surrounding(uim_lisp id_)
725
689
uim_context uc = retrieve_uim_context(id_);
726
690
if (!uc->request_surrounding_text_cb) {
729
uim_schedule_cb(uc, REQUEST_SURROUNDING_CB, NULL, 0, 0);
693
if (uc->request_surrounding_text_cb) {
694
uc->request_surrounding_text_cb(uc->ptr);
734
im_delete_surrounding(LISP id_, LISP offset_, LISP len_)
700
im_delete_surrounding(uim_lisp id_, uim_lisp offset_, uim_lisp len_)
736
702
uim_context uc = retrieve_uim_context(id_);
737
int offset = get_c_int(offset_);
738
int len = get_c_int(len_);
703
int offset = uim_scm_c_int(offset_);
704
int len = uim_scm_c_int(len_);
739
705
if (!uc->delete_surrounding_text_cb) {
742
uim_schedule_cb(uc, DELETE_SURROUNDING_CB, NULL, offset, len);
708
if (uc->delete_surrounding_text_cb) {
709
uc->delete_surrounding_text_cb(uc->ptr, offset, len);
715
switch_im(uim_lisp id_, uim_lisp name_)
720
uc = retrieve_uim_context(id_);
721
name= uim_scm_refer_c_str(name_);
723
uim_switch_im(uc, name);
724
if (uc->configuration_changed_cb)
725
uc->configuration_changed_cb(uc->ptr);
731
switch_app_global_im(uim_lisp id_, uim_lisp name_)
736
uc = retrieve_uim_context(id_);
737
name = uim_scm_refer_c_str(name_);
739
if (uc->switch_app_global_im_cb)
740
uc->switch_app_global_im_cb(uc->ptr, name);
746
switch_system_global_im(uim_lisp id_, uim_lisp name_)
751
uc = retrieve_uim_context(id_);
752
name = uim_scm_refer_c_str(name_);
754
if (uc->switch_system_global_im_cb)
755
uc->switch_system_global_im_cb(uc->ptr, name);
747
761
uim_init_im_subrs(void)
749
true_sym = siod_true_value();
751
false_sym = siod_false_value();
753
/* false_sym has to be NIL until bug #617 and #642 are fixed
760
init_subr_1("im-return-str", im_return_str);
761
init_subr_1("im-return-str-list", im_return_str_list);
763
init_subr_2("im-commit", im_commit);
764
init_subr_1("im-commit-raw", im_commit_raw);
765
init_subr_2("im-get-raw-key-str", im_get_raw_key_str);
766
init_subr_2("im-set-encoding", im_set_encoding);
768
init_subr_4("im-register-im", im_register_im);
770
init_subr_1("im-clear-preedit", im_clear_preedit);
771
init_subr_3("im-pushback-preedit", im_pushback_preedit);
772
init_subr_1("im-update-preedit", im_update_preedit);
774
init_subr_1("im-clear-mode-list", im_clear_mode_list);
775
init_subr_2("im-pushback-mode-list", im_pushback_mode_list);
776
init_subr_1("im-update-mode-list", im_update_mode_list);
778
init_subr_2("im-update-prop-label", im_update_prop_label);
779
init_subr_2("im-update-prop-list", im_update_prop_list);
781
init_subr_2("im-update-mode", im_update_mode);
783
init_subr_3("im-activate-candidate-selector", im_activate_candidate_selector);
784
init_subr_2("im-select-candidate", im_select_candidate);
785
init_subr_2("im-shift-page-candidate", im_shift_page_candidate);
786
init_subr_1("im-deactivate-candidate-selector", im_deactivate_candidate_selector);
788
init_subr_1("im-request-surrounding", im_request_surrounding);
789
init_subr_3("im-delete-surrounding", im_delete_surrounding);
764
uim_scm_init_subr_1("im-return-str", im_return_str);
765
uim_scm_init_subr_1("im-return-str-list", im_return_str_list);
767
uim_scm_init_subr_2("im-commit", im_commit);
768
uim_scm_init_subr_1("im-commit-raw", im_commit_raw);
769
uim_scm_init_subr_2("im-get-raw-key-str", im_get_raw_key_str);
770
uim_scm_init_subr_2("im-set-encoding", im_set_encoding);
772
uim_scm_init_subr_4("im-register-im", im_register_im);
774
uim_scm_init_subr_1("im-clear-preedit", im_clear_preedit);
775
uim_scm_init_subr_3("im-pushback-preedit", im_pushback_preedit);
776
uim_scm_init_subr_1("im-update-preedit", im_update_preedit);
778
uim_scm_init_subr_1("im-clear-mode-list", im_clear_mode_list);
779
uim_scm_init_subr_2("im-pushback-mode-list", im_pushback_mode_list);
780
uim_scm_init_subr_1("im-update-mode-list", im_update_mode_list);
782
uim_scm_init_subr_2("im-update-prop-list", im_update_prop_list);
784
uim_scm_init_subr_2("im-update-mode", im_update_mode);
786
uim_scm_init_subr_3("im-activate-candidate-selector", im_activate_candidate_selector);
787
uim_scm_init_subr_2("im-select-candidate", im_select_candidate);
788
uim_scm_init_subr_2("im-shift-page-candidate", im_shift_page_candidate);
789
uim_scm_init_subr_1("im-deactivate-candidate-selector", im_deactivate_candidate_selector);
791
uim_scm_init_subr_1("im-request-surrounding", im_request_surrounding);
792
uim_scm_init_subr_3("im-delete-surrounding", im_delete_surrounding);
794
uim_scm_init_subr_2("im-switch-im", switch_im);
795
uim_scm_init_subr_2("im-switch-app-global-im", switch_app_global_im);
796
uim_scm_init_subr_2("im-switch-system-global-im", switch_system_global_im);