X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Finput.c;h=be065bdf7128b28d897d33983fdb348841b52919;hb=cecc80dea0a192be7f5d7661c6298eecd7f2a5c6;hp=bfc668d39b1e4ca1c472a85b4f0afde5df40dec2;hpb=ba74691152ed1ebca0b0e16403d4977babba7519;p=m17n%2Fm17n-lib.git diff --git a/src/input.c b/src/input.c index bfc668d..be065bd 100644 --- a/src/input.c +++ b/src/input.c @@ -17,7 +17,7 @@ You should have received a copy of the GNU Lesser General Public License along with the m17n library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 02111-1307, USA. */ /***en @@ -153,7 +153,7 @@ #include #endif -#include "m17n-gui.h" +#include "m17n.h" #include "m17n-misc.h" #include "internal.h" #include "mtext.h" @@ -163,7 +163,7 @@ #include "database.h" #include "charset.h" -static int mdebug_mask = MDEBUG_INPUT; +static int mdebug_flag = MDEBUG_INPUT; static int fully_initialized; @@ -174,7 +174,7 @@ static MSymbol Mtitle, Mmacro, Mmodule, Mstate, Minclude; /** Symbols for actions. */ static MSymbol Minsert, Mdelete, Mmark, Mmove, Mpushback, Mundo, Mcall, Mshift; -static MSymbol Mselect, Mshow, Mhide, Mcommit, Munhandle; +static MSymbol Mselect, Mshow, Mhide, Mcommit, Munhandle, Mpop; static MSymbol Mset, Madd, Msub, Mmul, Mdiv, Mequal, Mless, Mgreater; static MSymbol Mless_equal, Mgreater_equal; static MSymbol Mcond; @@ -402,6 +402,7 @@ fully_initialize () Mmove = msymbol ("move"); Mmark = msymbol ("mark"); Mpushback = msymbol ("pushback"); + Mpop = msymbol ("pop"); Mundo = msymbol ("undo"); Mcall = msymbol ("call"); Mshift = msymbol ("shift"); @@ -469,21 +470,22 @@ fully_initialize () static int -marker_code (MSymbol sym) +marker_code (MSymbol sym, int surrounding) { char *name; if (sym == Mnil) return -1; name = MSYMBOL_NAME (sym); - return ((name[0] == '@' - && ((name[1] >= '0' && name[1] <= '9') - || name[1] == '<' || name[1] == '>' - || name[1] == '=' || name[1] == '+' || name[1] == '-' - || name[1] == '[' || name[1] == ']' - || name[1] == '@') - && name[2] == '\0') - ? name[1] : -1); + return (name[0] != '@' ? -1 + : (((name[1] >= '0' && name[1] <= '9') + || name[1] == '<' || name[1] == '>' || name[1] == '=' + || name[1] == '[' || name[1] == ']' + || name[1] == '@') + && name[2] == '\0') ? name[1] + : (name[1] != '+' && name[1] != '-') ? -1 + : (name[2] == '\0' || surrounding) ? name[1] + : -1); } @@ -512,7 +514,7 @@ get_surrounding_text (MInputContext *ic, int len) MText *mt = NULL; mplist_push (ic->plist, Minteger, (void *) len); - if (minput__callback (ic, Minput_get_surrounding_text) >= 0 + if (minput_callback (ic, Minput_get_surrounding_text) >= 0 && MPLIST_MTEXT_P (ic->plist)) mt = MPLIST_MTEXT (ic->plist); mplist_pop (ic->plist); @@ -525,7 +527,7 @@ delete_surrounding_text (MInputContext *ic, int pos) MInputContextInfo *ic_info = (MInputContextInfo *) ic->info; mplist_push (ic->plist, Minteger, (void *) pos); - minput__callback (ic, Minput_delete_surrounding_text); + minput_callback (ic, Minput_delete_surrounding_text); mplist_pop (ic->plist); if (pos < 0) { @@ -546,7 +548,7 @@ get_preceding_char (MInputContext *ic, int pos) MText *mt; int len; - if (ic_info->preceding_text) + if (pos && ic_info->preceding_text) { len = mtext_nchars (ic_info->preceding_text); if (pos <= len) @@ -563,6 +565,8 @@ get_preceding_char (MInputContext *ic, int pos) M17N_OBJECT_UNREF (ic_info->preceding_text); ic_info->preceding_text = mt; } + else + M17N_OBJECT_UNREF (mt); } else ic_info->preceding_text = mt; @@ -595,6 +599,8 @@ get_following_char (MInputContext *ic, int pos) M17N_OBJECT_UNREF (ic_info->following_text); ic_info->following_text = mt; } + else + M17N_OBJECT_UNREF (mt); } else ic_info->following_text = mt; @@ -611,7 +617,8 @@ surrounding_pos (MSymbol sym) if (sym == Mnil) return 0; name = MSYMBOL_NAME (sym); - if ((name[1] == '-' || name[1] == '+') + if (name[0] == '@' + && (name[1] == '-' || name[1] == '+') && name[2] >= '1' && name[2] <= '9') return (name[1] == '-' ? - atoi (name + 2) : atoi (name + 2)); return 0; @@ -621,7 +628,7 @@ static int integer_value (MInputContext *ic, MPlist *arg, MPlist **value, int surrounding) { MInputContextInfo *ic_info = (MInputContextInfo *) ic->info; - int code; + int code, pos; MText *preedit = ic->preedit; int len = mtext_nchars (preedit); @@ -629,12 +636,8 @@ integer_value (MInputContext *ic, MPlist *arg, MPlist **value, int surrounding) *value = NULL; if (MPLIST_INTEGER_P (arg)) return MPLIST_INTEGER (arg); - if (surrounding - && (surrounding = surrounding_pos (MPLIST_SYMBOL (arg))) != 0) - return (surrounding < 0 - ? get_preceding_char (ic, - surrounding) - : get_following_char (ic, surrounding)); - code = marker_code (MPLIST_SYMBOL (arg)); + + code = marker_code (MPLIST_SYMBOL (arg), surrounding); if (code < 0) { MPlist *val = resolve_variable (ic_info, MPLIST_SYMBOL (arg)); @@ -645,19 +648,42 @@ integer_value (MInputContext *ic, MPlist *arg, MPlist **value, int surrounding) } if (code == '@') return ic_info->key_head; - if (code >= '0' && code <= '9') - code -= '0'; + if ((code == '-' || code == '+')) + { + char *name = MSYMBOL_NAME (MPLIST_SYMBOL (arg)); + + if (name[2]) + { + pos = atoi (name + 1); + if (pos == 0) + return get_preceding_char (ic, 0); + pos = ic->cursor_pos + pos; + if (pos < 0) + { + if (ic->produced && mtext_len (ic->produced) + pos >= 0) + return mtext_ref_char (ic->produced, + mtext_len (ic->produced) + pos); + return get_preceding_char (ic, - pos); + } + if (pos >= len) + return get_following_char (ic, pos - len + 1); + } + else + pos = ic->cursor_pos + (code == '+' ? 1 : -1); + } + else if (code >= '0' && code <= '9') + pos = code - '0'; else if (code == '=') - code = ic->cursor_pos; - else if (code == '-' || code == '[') - code = ic->cursor_pos - 1; - else if (code == '+' || code == ']') - code = ic->cursor_pos + 1; + pos = ic->cursor_pos; + else if (code == '[') + pos = ic->cursor_pos - 1; + else if (code == ']') + pos = ic->cursor_pos + 1; else if (code == '<') - code = 0; + pos = 0; else if (code == '>') - code = len; - return (code >= 0 && code < len ? mtext_ref_char (preedit, code) : -1); + pos = len - 1; + return (pos >= 0 && pos < len ? mtext_ref_char (preedit, pos) : -1); } static int @@ -798,7 +824,7 @@ parse_action_list (MPlist *plist, MPlist *macros) } else if (MPLIST_PLIST_P (pl)) { - MPLIST_DO (pl, pl) + MPLIST_DO (pl, MPLIST_PLIST (pl)) { if (MPLIST_PLIST_P (pl)) { @@ -839,8 +865,7 @@ parse_action_list (MPlist *plist, MPlist *macros) if (! MPLIST_TAIL_P (pl)) { if (! MPLIST_SYMBOL_P (pl) - && (! MPLIST_INTEGER_P (pl) - || MPLIST_INTEGER (pl) == 0)) + && ! MPLIST_INTEGER_P (pl)) MERROR (MERROR_IM, -1); } } @@ -891,7 +916,8 @@ parse_action_list (MPlist *plist, MPlist *macros) MERROR (MERROR_IM, -1); } else if (action_name == Mshow || action_name == Mhide - || action_name == Mcommit || action_name == Munhandle) + || action_name == Mcommit || action_name == Munhandle + || action_name == Mpop) ; else if (action_name == Mcond) { @@ -1044,34 +1070,48 @@ load_branch (MInputMethodInfo *im_info, MPlist *plist, MIMMap *map) if (branch_actions) M17N_OBJECT_REF (branch_actions); } - else if (im_info->maps - && (plist = (MPlist *) mplist_get (im_info->maps, map_name))) + else if (im_info->maps) { - MPLIST_DO (plist, plist) + plist = (MPlist *) mplist_get (im_info->maps, map_name); + if (! plist && im_info->configured_vars) { - MPlist *keylist, *map_actions; + MPlist *p = mplist__assq (im_info->configured_vars, map_name); - if (! MPLIST_PLIST_P (plist)) - MERROR (MERROR_IM, -1); - keylist = MPLIST_PLIST (plist); - map_actions = MPLIST_NEXT (keylist); - if (MPLIST_SYMBOL_P (keylist)) + if (p && MPLIST_PLIST_P (p)) { - MSymbol command = MPLIST_SYMBOL (keylist); - MPlist *pl; + p = MPLIST_NEXT (MPLIST_NEXT (MPLIST_NEXT (MPLIST_PLIST (p)))); + if (MPLIST_SYMBOL_P (p)) + plist = mplist_get (im_info->maps, MPLIST_SYMBOL (p)); + } + } + if (plist) + { + MPLIST_DO (plist, plist) + { + MPlist *keylist, *map_actions; - if (MFAILP (command != Mat_reload)) - continue; - pl = resolve_command (im_info->configured_cmds, command); - if (MFAILP (pl)) - continue; - MPLIST_DO (pl, pl) - load_translation (map, pl, map_actions, branch_actions, + if (! MPLIST_PLIST_P (plist)) + MERROR (MERROR_IM, -1); + keylist = MPLIST_PLIST (plist); + map_actions = MPLIST_NEXT (keylist); + if (MPLIST_SYMBOL_P (keylist)) + { + MSymbol command = MPLIST_SYMBOL (keylist); + MPlist *pl; + + if (MFAILP (command != Mat_reload)) + continue; + pl = resolve_command (im_info->configured_cmds, command); + if (MFAILP (pl)) + continue; + MPLIST_DO (pl, pl) + load_translation (map, pl, map_actions, branch_actions, + im_info->macros); + } + else + load_translation (map, keylist, map_actions, branch_actions, im_info->macros); } - else - load_translation (map, keylist, map_actions, branch_actions, - im_info->macros); } } @@ -1422,14 +1462,12 @@ update_custom_info (void) if (! MPLIST_SYMBOL_P (p)) continue; name = MPLIST_SYMBOL (p); - if (language == Mnil || name == Mnil) - continue; p = MPLIST_NEXT (p); if (MPLIST_TAIL_P (p)) extra = Mnil; else if (MPLIST_SYMBOL_P (p)) extra = MPLIST_SYMBOL (p); - else + if (language == Mnil || (name == Mnil && extra == Mnil)) continue; im_info = new_im_info (NULL, language, name, extra, im_custom_list); load_im_info (im_data, im_info); @@ -1455,6 +1493,8 @@ update_global_info (void) { MDatabase *mdb = mdatabase_find (Minput_method, Mt, Mnil, Mglobal); + if (! mdb) + return -1; global_info = new_im_info (mdb, Mt, Mnil, Mglobal, im_info_list); } if (! global_info->mdb @@ -1555,6 +1595,19 @@ reload_im_info (MInputMethodInfo *im_info) fini_im_info (im_info); load_im_info (plist, im_info); M17N_OBJECT_UNREF (plist); + if (! im_info->cmds) + im_info->cmds = mplist (); + if (! im_info->vars) + im_info->vars = mplist (); + if (! im_info->title) + { + MSymbol name = im_info->name; + + im_info->title = (name == Mnil ? mtext () + : mtext_from_data (MSYMBOL_NAME (name), + MSYMBOL_NAMELEN (name), + MTEXT_FORMAT_US_ASCII)); + } return 1; } @@ -1603,7 +1656,7 @@ check_description (MPlist *plist) { M17N_OBJECT_UNREF (mt); mt = mtext__from_data (translated, strlen (translated), - MTEXT_FORMAT_UTF_8, 0); + MTEXT_FORMAT_UTF_8, 1); } } #endif @@ -1705,54 +1758,53 @@ config_command (MPlist *plist, MPlist *global_cmds, MPlist *custom_cmds, MPlist *config_cmds) { MPlist *global = NULL, *custom = NULL, *config = NULL; - MSymbol name; + MSymbol name = MPLIST_SYMBOL (plist); MSymbol status; - MPlist *description = NULL, *keyseq; + MPlist *description, *keyseq; + + if (global_cmds && (global = mplist__assq (global_cmds, name))) + global = MPLIST_NEXT (MPLIST_PLIST (global)); - name = MPLIST_SYMBOL (plist); plist = MPLIST_NEXT (plist); if (MPLIST_MTEXT_P (plist) || MPLIST_PLIST_P (plist)) - description = plist; - else if (global_cmds && ((global = mplist__assq (global_cmds, name)))) - description = global = MPLIST_NEXT (MPLIST_PLIST (global)); - if (MPLIST_TAIL_P (plist)) { - if (! global - && global_cmds && ((global = mplist__assq (global_cmds, name)))) - global = MPLIST_NEXT (MPLIST_PLIST (global)); - if (global) - { - keyseq = MPLIST_NEXT (global); - status = Minherited; - } - else - { - keyseq = plist; - status = Mnil; - } + description = plist; + plist = MPLIST_NEXT (plist); + } + else + { + description = global; + if (! MPLIST_TAIL_P (plist)) + plist = MPLIST_NEXT (plist); + } + if (MPLIST_TAIL_P (plist) && global) + { + keyseq = MPLIST_NEXT (global); + status = Minherited; } else { - keyseq = MPLIST_NEXT (plist); + keyseq = plist; status = Mnil; } if (config_cmds && (config = mplist__assq (config_cmds, name))) { + status = Mconfigured; config = MPLIST_NEXT (MPLIST_PLIST (config)); if (! MPLIST_TAIL_P (config)) - { - keyseq = MPLIST_NEXT (config); - status = Mconfigured; - } + keyseq = config; } else if (custom_cmds && (custom = mplist__assq (custom_cmds, name))) { - custom = MPLIST_NEXT (MPLIST_PLIST (custom)); - if (! MPLIST_TAIL_P (custom)) + MPlist *this_keyseq = MPLIST_NEXT (MPLIST_NEXT (MPLIST_PLIST (custom))); + + if (MPLIST_TAIL_P (this_keyseq)) + mplist__pop_unref (custom); + else { - keyseq = MPLIST_NEXT (custom); status = Mcustomized; + keyseq = this_keyseq; } } @@ -1872,7 +1924,7 @@ check_variable_value (MPlist *val, MPlist *global) } } - return (MPLIST_TAIL_P (valids)); + return (! MPLIST_TAIL_P (valids)); } /* Load variable defitions from PLIST into IM_INFO->vars. @@ -2030,21 +2082,24 @@ config_variable (MPlist *plist, MPlist *global_vars, MPlist *custom_vars, if (config_vars && (config = mplist__assq (config_vars, name))) { + status = Mconfigured; config = MPLIST_NEXT (MPLIST_PLIST (config)); if (! MPLIST_TAIL_P (config)) { - value = MPLIST_NEXT (config); + value = config; if (MFAILP (check_variable_value (value, global ? global : plist))) value = NULL; - status = Mconfigured; } } else if (custom_vars && (custom = mplist__assq (custom_vars, name))) { - custom = MPLIST_NEXT (MPLIST_PLIST (custom)); - if (! MPLIST_TAIL_P (custom)) + MPlist *this_value = MPLIST_NEXT (MPLIST_NEXT (MPLIST_PLIST (custom))); + + if (MPLIST_TAIL_P (this_value)) + mplist__pop_unref (custom); + else { - value = MPLIST_NEXT (custom); + value = this_value; if (MFAILP (check_variable_value (value, global ? global : plist))) value = NULL; status = Mcustomized; @@ -2271,7 +2326,7 @@ load_im_info (MPlist *plist, MInputMethodInfo *im_info) static int take_action_list (MInputContext *ic, MPlist *action_list); -static void preedit_commit (MInputContext *ic); +static void preedit_commit (MInputContext *ic, int need_prefix); static void shift_state (MInputContext *ic, MSymbol state_name) @@ -2299,7 +2354,15 @@ shift_state (MInputContext *ic, MSymbol state_name) state = (MIMState *) MPLIST_VAL (im_info->states); } - MDEBUG_PRINT1 ("\n [IM] (shift %s)", MSYMBOL_NAME (state->name)); + if (MDEBUG_FLAG ()) + { + if (orig_state) + MDEBUG_PRINT2 ("\n [IM] [%s] (shift %s)\n", + MSYMBOL_NAME (orig_state->name), + MSYMBOL_NAME (state->name)); + else + MDEBUG_PRINT1 (" (shift %s)\n", MSYMBOL_NAME (state->name)); + } /* Enter the new state. */ ic_info->state = state; @@ -2308,7 +2371,7 @@ shift_state (MInputContext *ic, MSymbol state_name) if (state == (MIMState *) MPLIST_VAL (im_info->states) && orig_state) /* We have shifted to the initial state. */ - preedit_commit (ic); + preedit_commit (ic, 0); mtext_cpy (ic_info->preedit_saved, ic->preedit); ic_info->state_pos = ic->cursor_pos; if (state != orig_state) @@ -2331,7 +2394,8 @@ shift_state (MInputContext *ic, MSymbol state_name) if (ic_info->map == ic_info->state->map && ic_info->map->map_actions) { - MDEBUG_PRINT (" init-actions:"); + MDEBUG_PRINT1 (" [IM] [%s] init-actions:", + MSYMBOL_NAME (state->name)); take_action_list (ic, ic_info->map->map_actions); } } @@ -2372,22 +2436,59 @@ find_candidates_group (MPlist *plist, int index, return NULL; } +/* Adjust markers for the change of preedit text. + If FROM == TO, the change is insertion of INS chars. + If FROM < TO and INS == 0, the change is deletion of the range. + If FROM < TO and INS > 0, the change is replacement. */ + static void -preedit_insert (MInputContext *ic, int pos, MText *mt, int c) +adjust_markers (MInputContext *ic, int from, int to, int ins) { MInputContextInfo *ic_info = ((MInputContext *) ic)->info; MPlist *markers; + + if (from == to) + { + MPLIST_DO (markers, ic_info->markers) + if (MPLIST_INTEGER (markers) > from) + MPLIST_VAL (markers) = (void *) (MPLIST_INTEGER (markers) + ins); + if (ic->cursor_pos >= from) + ic->cursor_pos += ins; + } + else + { + MPLIST_DO (markers, ic_info->markers) + { + if (MPLIST_INTEGER (markers) >= to) + MPLIST_VAL (markers) + = (void *) (MPLIST_INTEGER (markers) + ins - (to - from)); + else if (MPLIST_INTEGER (markers) > from) + MPLIST_VAL (markers) = (void *) from; + } + if (ic->cursor_pos >= to) + ic->cursor_pos += ins - (to - from); + else if (ic->cursor_pos > from) + ic->cursor_pos = from; + } +} + + +static void +preedit_insert (MInputContext *ic, int pos, MText *mt, int c) +{ int nchars = mt ? mtext_nchars (mt) : 1; if (mt) - mtext_ins (ic->preedit, pos, mt); + { + mtext_ins (ic->preedit, pos, mt); + MDEBUG_PRINT1 ("(\"%s\")", MTEXT_DATA (mt)); + } else - mtext_ins_char (ic->preedit, pos, c, 1); - MPLIST_DO (markers, ic_info->markers) - if (MPLIST_INTEGER (markers) > pos) - MPLIST_VAL (markers) = (void *) (MPLIST_INTEGER (markers) + nchars); - if (ic->cursor_pos >= pos) - ic->cursor_pos += nchars; + { + mtext_ins_char (ic->preedit, pos, c, 1); + MDEBUG_PRINT1 ("('%c')", c); + } + adjust_markers (ic, pos, pos, nchars); ic->preedit_changed = 1; } @@ -2395,27 +2496,34 @@ preedit_insert (MInputContext *ic, int pos, MText *mt, int c) static void preedit_delete (MInputContext *ic, int from, int to) { - MInputContextInfo *ic_info = ((MInputContext *) ic)->info; - MPlist *markers; + mtext_del (ic->preedit, from, to); + adjust_markers (ic, from, to, 0); + ic->preedit_changed = 1; +} + +static void +preedit_replace (MInputContext *ic, int from, int to, MText *mt, int c) +{ + int ins; mtext_del (ic->preedit, from, to); - MPLIST_DO (markers, ic_info->markers) - { - if (MPLIST_INTEGER (markers) > to) - MPLIST_VAL (markers) - = (void *) (MPLIST_INTEGER (markers) - (to - from)); - else if (MPLIST_INTEGER (markers) > from); - MPLIST_VAL (markers) = (void *) from; - } - if (ic->cursor_pos >= to) - ic->cursor_pos -= to - from; - else if (ic->cursor_pos > from) - ic->cursor_pos = from; + if (mt) + { + mtext_ins (ic->preedit, from, mt); + ins = mtext_nchars (mt); + } + else + { + mtext_ins_char (ic->preedit, from, c, 1); + ins = 1; + } + adjust_markers (ic, from, to, ins); ic->preedit_changed = 1; } + static void -preedit_commit (MInputContext *ic) +preedit_commit (MInputContext *ic, int need_prefix) { MInputContextInfo *ic_info = (MInputContextInfo *) ic->info; int preedit_len = mtext_nchars (ic->preedit); @@ -2429,17 +2537,33 @@ preedit_commit (MInputContext *ic) mtext_put_prop_values (ic->preedit, 0, mtext_nchars (ic->preedit), Mcandidate_index, NULL, 0); mtext_cat (ic->produced, ic->preedit); + if (MDEBUG_FLAG ()) + { + int i; + + if (need_prefix) + MDEBUG_PRINT1 ("\n [IM] [%s]", + MSYMBOL_NAME (ic_info->state->name)); + MDEBUG_PRINT (" (commit"); + for (i = 0; i < mtext_nchars (ic->preedit); i++) + MDEBUG_PRINT1 (" U+%04X", mtext_ref_char (ic->preedit, i)); + MDEBUG_PRINT (")"); + } + mtext_reset (ic->preedit); mtext_reset (ic_info->preedit_saved); MPLIST_DO (p, ic_info->markers) MPLIST_VAL (p) = 0; ic->cursor_pos = ic_info->state_pos = 0; ic->preedit_changed = 1; + ic_info->commit_key_head = ic_info->key_head; } if (ic->candidate_list) { M17N_OBJECT_UNREF (ic->candidate_list); ic->candidate_list = NULL; + ic->candidate_index = 0; + ic->candidate_from = ic->candidate_to = 0; ic->candidates_changed = MINPUT_CANDIDATES_LIST_CHANGED; if (ic->candidate_show) { @@ -2452,7 +2576,7 @@ preedit_commit (MInputContext *ic) static int new_index (MInputContext *ic, int current, int limit, MSymbol sym, MText *mt) { - int code = marker_code (sym); + int code = marker_code (sym, 0); if (mt && (code == '[' || code == ']')) { @@ -2496,11 +2620,11 @@ update_candidate (MInputContext *ic, MTextProperty *prop, int idx) int ingroup_index = idx - start; MText *mt; - preedit_delete (ic, from, to); + candidate_list = mplist_copy (candidate_list); if (MPLIST_MTEXT_P (group)) { mt = MPLIST_MTEXT (group); - preedit_insert (ic, from, NULL, mtext_ref_char (mt, ingroup_index)); + preedit_replace (ic, from, to, NULL, mtext_ref_char (mt, ingroup_index)); to = from + 1; } else @@ -2511,10 +2635,11 @@ update_candidate (MInputContext *ic, MTextProperty *prop, int idx) for (i = 0, plist = MPLIST_PLIST (group); i < ingroup_index; i++, plist = MPLIST_NEXT (plist)); mt = MPLIST_MTEXT (plist); - preedit_insert (ic, from, mt, 0); + preedit_replace (ic, from, to, mt, 0); to = from + mtext_nchars (mt); } mtext_put_prop (ic->preedit, from, to, Mcandidate_list, candidate_list); + M17N_OBJECT_UNREF (candidate_list); mtext_put_prop (ic->preedit, from, to, Mcandidate_index, (void *) idx); ic->cursor_pos = to; } @@ -2668,7 +2793,8 @@ get_candidate_list (MInputContextInfo *ic_info, MPlist *args) next = MPLIST_NEXT (next); } } - M17N_OBJECT_UNREF (plist); + if (charset) + M17N_OBJECT_UNREF (plist); plist = mplist (); len = mtext_nchars (mt); if (len <= column) @@ -2686,47 +2812,42 @@ get_candidate_list (MInputContextInfo *ic_info, MPlist *args) } M17N_OBJECT_UNREF (mt); } - else /* MPLIST_PLIST_P (plist) */ + else if (! MPLIST_TAIL_P (plist)) { - MPlist *pl = MPLIST_PLIST (plist), *p; - MPlist *next = MPLIST_NEXT (plist); - int j; + MPlist *tail = plist; + MPlist *new = mplist (); + MPlist *this = mplist (); + int count = 0; - if (MPLIST_TAIL_P (next)) - M17N_OBJECT_REF (pl); - else + MPLIST_DO (tail, tail) { - pl = mplist_copy (pl); - while (! MPLIST_TAIL_P (next)) - { - p = mplist_copy (MPLIST_PLIST (next)); - pl = mplist__conc (pl, p); - M17N_OBJECT_UNREF (p); - next = MPLIST_NEXT (next); - } - } - M17N_OBJECT_UNREF (plist); - plist = mplist (); - len = mplist_length (pl); - if (len <= column) - mplist_add (plist, Mplist, pl); - else - { - MPlist *p0 = pl; + MPlist *p = MPLIST_PLIST (tail); - for (i = 0; i < len; i += column) + MPLIST_DO (p, p) { - p = mplist (); - mplist_add (plist, Mplist, p); - M17N_OBJECT_UNREF (p); - for (j = 0; j < column && i + j < len; j++) + MText *mt = MPLIST_MTEXT (p); + + if (count == column) { - p = mplist_add (p, Mtext, MPLIST_VAL (p0)); - p0 = MPLIST_NEXT (p0); + mplist_add (new, Mplist, this); + M17N_OBJECT_UNREF (this); + this = mplist (); + count = 0; } + mplist_add (this, Mtext, mt); + count++; } } - M17N_OBJECT_UNREF (pl); + mplist_add (new, Mplist, this); + M17N_OBJECT_UNREF (this); + mplist_set (plist, Mnil, NULL); + MPLIST_DO (tail, new) + { + MPlist *elt = MPLIST_PLIST (tail); + + mplist_add (plist, Mplist, elt); + } + M17N_OBJECT_UNREF (new); } } @@ -2787,7 +2908,7 @@ regularize_action (MPlist *action_list, MInputContextInfo *ic_info) } /* Perform list of actions in ACTION_LIST for the current input - context IC. If all actions are performed without error, return 0. + context IC. If unhandle action was not performed, return 0. Otherwise, return -1. */ static int @@ -2829,7 +2950,7 @@ take_action_list (MInputContext *ic, MPlist *action_list) MPlist *plist = get_candidate_list (ic_info, args); int len; - if (! plist) + if (! plist || (MPLIST_PLIST_P (plist) && MPLIST_TAIL_P (plist))) continue; if (MPLIST_MTEXT_P (plist)) { @@ -2837,6 +2958,8 @@ take_action_list (MInputContext *ic, MPlist *action_list) mtext_ref_char (MPLIST_MTEXT (plist), 0)); len = 1; } + else if (MPLIST_TAIL_P (MPLIST_PLIST (plist))) + continue; else { MText * mt = MPLIST_MTEXT (MPLIST_PLIST (plist)); @@ -2844,9 +2967,11 @@ take_action_list (MInputContext *ic, MPlist *action_list) preedit_insert (ic, ic->cursor_pos, mt, 0); len = mtext_nchars (mt); } + plist = mplist_copy (plist); mtext_put_prop (ic->preedit, ic->cursor_pos - len, ic->cursor_pos, Mcandidate_list, plist); + M17N_OBJECT_UNREF (plist); mtext_put_prop (ic->preedit, ic->cursor_pos - len, ic->cursor_pos, Mcandidate_index, (void *) 0); @@ -2857,31 +2982,41 @@ take_action_list (MInputContext *ic, MPlist *action_list) int code, idx, gindex; int pos = ic->cursor_pos; MPlist *group; + int idx_decided = 0; if (pos == 0 || ! (prop = mtext_get_property (ic->preedit, pos - 1, Mcandidate_list))) continue; + idx = (int) mtext_get_prop (ic->preedit, pos - 1, Mcandidate_index); + group = find_candidates_group (mtext_property_value (prop), idx, + &start, &end, &gindex); if (MPLIST_SYMBOL_P (args)) { - code = marker_code (MPLIST_SYMBOL (args)); + code = marker_code (MPLIST_SYMBOL (args), 0); if (code < 0) - continue; + { + args = resolve_variable (ic_info, MPLIST_SYMBOL (args)); + if (! MPLIST_INTEGER_P (args)) + continue; + idx = start + MPLIST_INTEGER (args); + if (idx < start || idx >= end) + continue; + idx_decided = 1; + } } else code = -1; - idx = (int) mtext_get_prop (ic->preedit, pos - 1, Mcandidate_index); - group = find_candidates_group (mtext_property_value (prop), idx, - &start, &end, &gindex); if (code != '[' && code != ']') { - idx = (start - + (code >= 0 - ? new_index (NULL, ic->candidate_index - start, - end - start - 1, MPLIST_SYMBOL (args), - NULL) - : MPLIST_INTEGER (args))); + if (! idx_decided) + idx = (start + + (code >= 0 + ? new_index (NULL, ic->candidate_index - start, + end - start - 1, MPLIST_SYMBOL (args), + NULL) + : MPLIST_INTEGER (args))); if (idx < 0) { find_candidates_group (mtext_property_value (prop), -1, @@ -2923,6 +3058,7 @@ take_action_list (MInputContext *ic, MPlist *action_list) idx += ingroup_index; } update_candidate (ic, prop, idx); + MDEBUG_PRINT1 ("(%d)", idx); } else if (name == Mshow) ic->candidate_show = 1; @@ -2937,7 +3073,17 @@ take_action_list (MInputContext *ic, MPlist *action_list) if (MPLIST_SYMBOL_P (args) && (pos = surrounding_pos (MPLIST_SYMBOL (args))) != 0) { - delete_surrounding_text (ic, pos); + to = ic->cursor_pos + pos; + if (to < 0) + { + delete_surrounding_text (ic, to); + to = 0; + } + else if (to > len) + { + delete_surrounding_text (ic, to - len); + to = len; + } } else { @@ -2949,12 +3095,12 @@ take_action_list (MInputContext *ic, MPlist *action_list) to = 0; else if (to > len) to = len; - MDEBUG_PRINT1 ("(%d)", to - ic->cursor_pos); - if (to < ic->cursor_pos) - preedit_delete (ic, to, ic->cursor_pos); - else if (to > ic->cursor_pos) - preedit_delete (ic, ic->cursor_pos, to); } + MDEBUG_PRINT1 ("(%d)", to - ic->cursor_pos); + if (to < ic->cursor_pos) + preedit_delete (ic, to, ic->cursor_pos); + else if (to > ic->cursor_pos) + preedit_delete (ic, ic->cursor_pos, to); } else if (name == Mmove) { @@ -2974,25 +3120,42 @@ take_action_list (MInputContext *ic, MPlist *action_list) ic->cursor_pos = pos; ic->preedit_changed = 1; } + MDEBUG_PRINT1 ("(%d)", ic->cursor_pos); } else if (name == Mmark) { - int code = marker_code (MPLIST_SYMBOL (args)); + int code = marker_code (MPLIST_SYMBOL (args), 0); if (code < 0) - mplist_put (ic_info->markers, MPLIST_SYMBOL (args), - (void *) ic->cursor_pos); + { + mplist_put (ic_info->markers, MPLIST_SYMBOL (args), + (void *) ic->cursor_pos); + MDEBUG_PRINT1 ("(%d)", ic->cursor_pos); + } } else if (name == Mpushback) { - if (MPLIST_INTEGER_P (args)) + if (MPLIST_INTEGER_P (args) || MPLIST_SYMBOL_P (args)) { - int num = MPLIST_INTEGER (args); + int num; + + if (MPLIST_SYMBOL_P (args)) + { + args = resolve_variable (ic_info, MPLIST_SYMBOL (args)); + if (MPLIST_INTEGER_P (args)) + num = MPLIST_INTEGER (args); + else + num = 0; + } + else + num = MPLIST_INTEGER (args); if (num > 0) ic_info->key_head -= num; + else if (num == 0) + ic_info->key_head = 0; else - ic_info->key_head = num; + ic_info->key_head = - num; if (ic_info->key_head > ic_info->used) ic_info->key_head = ic_info->used; } @@ -3031,6 +3194,11 @@ take_action_list (MInputContext *ic, MPlist *action_list) } } } + else if (name == Mpop) + { + if (ic_info->key_head < ic_info->used) + MLIST_DELETE1 (ic_info, keys, ic_info->key_head, 1); + } else if (name == Mcall) { MInputMethodInfo *im_info = (MInputMethodInfo *) ic->im->info; @@ -3049,8 +3217,8 @@ take_action_list (MInputContext *ic, MPlist *action_list) = (MIMExternalModule *) mplist_get (im_info->externals, module); if (external) - func = (MIMExternalFunc) mplist_get (external->func_list, - func_name); + func = ((MIMExternalFunc) + mplist_get_func (external->func_list, func_name)); } if (! func) continue; @@ -3062,7 +3230,7 @@ take_action_list (MInputContext *ic, MPlist *action_list) if (MPLIST_KEY (args) == Msymbol && MPLIST_KEY (args) != Mnil - && (code = marker_code (MPLIST_SYMBOL (args))) >= 0) + && (code = marker_code (MPLIST_SYMBOL (args), 0)) >= 0) { code = new_index (ic, ic->cursor_pos, mtext_nchars (ic->preedit), @@ -3096,7 +3264,8 @@ take_action_list (MInputContext *ic, MPlist *action_list) M17N_OBJECT_UNREF (ic_info->vars); ic_info->vars = mplist_copy (ic_info->vars_saved); ic->cursor_pos = ic_info->state_pos = 0; - ic_info->state_key_head = ic_info->key_head = 0; + ic_info->state_key_head = ic_info->key_head + = ic_info->commit_key_head = 0; shift_state (ic, Mnil); if (intarg < 0) @@ -3197,11 +3366,11 @@ take_action_list (MInputContext *ic, MPlist *action_list) } else if (name == Mcommit) { - preedit_commit (ic); + preedit_commit (ic, 0); } else if (name == Munhandle) { - preedit_commit (ic); + preedit_commit (ic, 0); return -1; } else @@ -3261,8 +3430,8 @@ handle_key (MInputContext *ic) MSymbol alias = Mnil; int i; - MDEBUG_PRINT2 (" [IM] handle `%s' in state %s", - msymbol_name (key), MSYMBOL_NAME (ic_info->state->name)); + MDEBUG_PRINT2 (" [IM] [%s] handle `%s'", + MSYMBOL_NAME (ic_info->state->name), msymbol_name (key)); if (map->submaps) { @@ -3329,47 +3498,43 @@ handle_key (MInputContext *ic) { /* MAP can not handle KEY. */ - /* If MAP is the root map of the initial state, it means that - the current input method can not handle KEY. */ - if (map == ((MIMState *) MPLIST_VAL (im_info->states))->map) + /* Perform branch actions if any. */ + if (map->branch_actions) { - MDEBUG_PRINT (" unhandled\n"); - return -1; + MDEBUG_PRINT (" branch-actions:"); + if (take_action_list (ic, map->branch_actions) < 0) + { + MDEBUG_PRINT ("\n"); + return -1; + } } - if (map != ic_info->state->map) + if (map == ic_info->map) { - /* If MAP is not the root map... */ - /* If MAP has branch actions, perform them. */ - if (map->branch_actions) + /* The above branch actions didn't change the state. */ + + /* If MAP is the root map of the initial state, and there + still exist an unhandled key, it means that the current + input method can not handle it. */ + if (map == ((MIMState *) MPLIST_VAL (im_info->states))->map + && ic_info->key_head < ic_info->used) { - MDEBUG_PRINT (" branch-actions:"); - if (take_action_list (ic, map->branch_actions) < 0) - { - MDEBUG_PRINT ("\n"); - return -1; - } + MDEBUG_PRINT (" unhandled\n"); + return -1; } - /* If MAP is still not the root map, shift to the current - state. */ - if (ic_info->map != ic_info->state->map) - shift_state (ic, ic_info->state->name); - } - else - { - /* MAP is the root map, perform branch actions (if any) or - shift to the initial state. */ - if (map->branch_actions) + + if (map != ic_info->state->map) { - MDEBUG_PRINT (" branch-actions:"); - if (take_action_list (ic, map->branch_actions) < 0) - { - MDEBUG_PRINT ("\n"); - return -1; - } + /* MAP is not the root map. Shift to the root map of the + current state. */ + shift_state (ic, ic_info->state->name); + } + else if (! map->branch_actions) + { + /* MAP is the root map without any default branch + actions. Shift to the initial state. */ + shift_state (ic, Mnil); } - else - shift_state (ic, Mnil); } } MDEBUG_PRINT ("\n"); @@ -3418,7 +3583,7 @@ init_ic_info (MInputContext *ic) { MIMExternalModule *external = MPLIST_VAL (plist); MIMExternalFunc func - = (MIMExternalFunc) mplist_get (external->func_list, Minit); + = (MIMExternalFunc) mplist_get_func (external->func_list, Minit); if (func) (func) (func_args); @@ -3447,7 +3612,7 @@ fini_ic_info (MInputContext *ic) { MIMExternalModule *external = MPLIST_VAL (plist); MIMExternalFunc func - = (MIMExternalFunc) mplist_get (external->func_list, Mfini); + = (MIMExternalFunc) mplist_get_func (external->func_list, Mfini); if (func) (func) (func_args); @@ -3505,8 +3670,20 @@ re_init_ic (MInputContext *ic, int reload) fini_ic_info (ic); if (reload) reload_im_info (im_info); + if (! im_info->states) + { + struct MIMState *state; + + M17N_OBJECT (state, free_state, MERROR_IM); + state->name = msymbol ("init"); + state->title = mtext__from_data ("ERROR!", 6, MTEXT_FORMAT_US_ASCII, 0); + MSTRUCT_CALLOC (state->map, MERROR_IM); + im_info->states = mplist (); + mplist_add (im_info->states, state->name, state); + } init_ic_info (ic); shift_state (ic, Mnil); + ic->status_changed = status_changed; ic->preedit_changed = preedit_changed; ic->cursor_pos_changed = cursor_pos_changed; @@ -3525,7 +3702,7 @@ open_im (MInputMethod *im) { MInputMethodInfo *im_info = get_im_info (im->language, im->name, Mnil, Mnil); - if (! im_info) + if (! im_info || ! im_info->states) MERROR (MERROR_IM, -1); im->info = im_info; @@ -3643,7 +3820,9 @@ filter (MInputContext *ic, MSymbol key, void *arg) sizeof (int) * (ic_info->used - 1)); ic_info->used--; if (ic_info->state_key_head > 0) - ic_info->state_key_head--; + ic_info->state_key_head--; + if (ic_info->commit_key_head > 0) + ic_info->commit_key_head--; } /* This forces returning 1. */ ic_info->key_unhandled = 1; @@ -3662,37 +3841,36 @@ filter (MInputContext *ic, MSymbol key, void *arg) /* If the current map is the root of the initial state, we should produce any preedit text in ic->produced. */ if (ic_info->map == ((MIMState *) MPLIST_VAL (im_info->states))->map) - preedit_commit (ic); + preedit_commit (ic, 1); if (mtext_nchars (ic->produced) > 0) { - MSymbol lang = msymbol_get (ic->im->language, Mlanguage); - - if (mdebug__flag & mdebug_mask) + if (MDEBUG_FLAG ()) { - MDEBUG_PRINT (" (produced"); + MDEBUG_PRINT1 ("\n [IM] [%s] (produced", + MSYMBOL_NAME (ic_info->state->name)); for (i = 0; i < mtext_nchars (ic->produced); i++) MDEBUG_PRINT1 (" U+%04X", mtext_ref_char (ic->produced, i)); MDEBUG_PRINT (")"); } - if (lang != Mnil) - mtext_put_prop (ic->produced, 0, mtext_nchars (ic->produced), - Mlanguage, ic->im->language); - if (ic_info->state_key_head > 0) - { - memmove (ic_info->keys, ic_info->keys + ic_info->state_key_head, - sizeof (int) * (ic_info->used - ic_info->state_key_head)); - ic_info->used -= ic_info->state_key_head; - ic_info->key_head -= ic_info->state_key_head; - ic_info->state_key_head = 0; - } + mtext_put_prop (ic->produced, 0, mtext_nchars (ic->produced), + Mlanguage, ic->im->language); + } + if (ic_info->commit_key_head > 0) + { + memmove (ic_info->keys, ic_info->keys + ic_info->commit_key_head, + sizeof (int) * (ic_info->used - ic_info->commit_key_head)); + ic_info->used -= ic_info->commit_key_head; + ic_info->key_head -= ic_info->commit_key_head; + ic_info->state_key_head -= ic_info->commit_key_head; + ic_info->commit_key_head = 0; } - if (ic_info->key_unhandled) { ic_info->used = 0; - ic_info->key_head = ic_info->state_key_head = 0; + ic_info->key_head = ic_info->state_key_head + = ic_info->commit_key_head = 0; } return (! ic_info->key_unhandled && mtext_nchars (ic->produced) == 0); @@ -3818,8 +3996,8 @@ minput__init () minput_default_driver.filter = filter; minput_default_driver.lookup = lookup; minput_default_driver.callback_list = mplist (); - mplist_put (minput_default_driver.callback_list, Minput_reset, - (void *) reset_ic); + mplist_put_func (minput_default_driver.callback_list, Minput_reset, + M17N_FUNC (reset_ic)); minput_driver = &minput_default_driver; fully_initialized = 0; @@ -3844,21 +4022,6 @@ minput__fini () } -int -minput__callback (MInputContext *ic, MSymbol command) -{ - MInputCallbackFunc func; - - if (! ic->im->driver.callback_list) - return -1; - func = (MInputCallbackFunc) mplist_get (ic->im->driver.callback_list, - command); - if (! func) - return -1; - (func) (ic, command); - return 0; -} - MSymbol minput__char_to_key (int c) { @@ -3895,6 +4058,8 @@ minput__char_to_key (int c) it specifies the number of characters following the current cursor position. If the value is negative, the absolute value specifies the number of characters preceding the current cursor position. + If the value is zero, it means that the caller just wants to know + if the surrounding text is currently supported or not. If the surrounding text is currently supported, the callback function must set the key of this element to #Mtext and the value @@ -3928,7 +4093,8 @@ minput__char_to_key (int c) ¤Æ#Minteger ¤ò¤È¤ê¡¢¤½¤ÎÃͤϥµ¥é¥¦¥ó¥Ç¥£¥ó¥°¥Æ¥­¥¹¥È¤Î¤¦¤Á¤É¤ÎÉôʬ ¤ò¼è¤Ã¤ÆÍè¤ë¤«¤ò»ØÄꤹ¤ë¡£Ãͤ¬Àµ¤Ç¤¢¤ì¤Ð¡¢¸½ºß¤Î¥«¡¼¥½¥ë°ÌÃ֤˳¤¯ ÃͤθĿôʬ¤Îʸ»ú¤ò¼è¤ë¡£Éé¤Ç¤¢¤ì¤Ð¡¢¥«¡¼¥½¥ë°ÌÃÖ¤ËÀè¹Ô¤¹¤ëÃͤÎÀäÂÐ - ÃÍʬ¤Îʸ»ú¤ò¼è¤ë¡£ + ÃÍʬ¤Îʸ»ú¤ò¼è¤ë¡£¸½ºß¥µ¥é¥¦¥ó¥É¥Æ¥­¥¹¥È¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦ + ¤«¤òÃΤꤿ¤¤¤À¤±¤Ç¤¢¤ì¤Ð¡¢¤³¤ÎÃͤϥ¼¥í¤Ç¤âÎɤ¤¡£ ¥µ¥é¥¦¥ó¥Ç¥£¥ó¥°¥Æ¥­¥¹¥È¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ì¤Ð¡¢¥³¡¼¥ë¥Ð¥Ã¥¯´Ø¿ô¤Ï ¤³¤ÎÍ×ÁǤΥ­¡¼¤ò #Mtext ¤Ë¡¢Ãͤò¼è¤ê¹þ¤ó¤ÀM-text ¤ËÀßÄꤷ¤Ê¤¯¤Æ¤Ï¤Ê @@ -3937,8 +4103,7 @@ minput__char_to_key (int c) ¥·¥ç¥ó¦¤ÇɬÍפǸúΨŪ¤À¤È»×¤¨¤ÐŤ¯¤Æ¤âÎɤ¤¡£ ¥µ¥é¥¦¥ó¥Ç¥£¥ó¥°¥Æ¥­¥¹¥È¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢¥³¡¼¥ë¥Ð¥Ã¥¯´Ø - ¿ô¤Ï #MInputContext::plist ¤ÎÂè°ìÍ×ÁǤòÊѲ½¤µ¤»¤ë¤³¤È¤Ê¤¯ÊÖ¤µ¤Ê¤¯¤Æ - ¤Ï¤Ê¤é¤Ê¤¤¡£ + ¿ô¤Ï #MInputContext::plist ¤ÎÂè°ìÍ×ÁǤòÊѹ¹¤·¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ Minput_delete_surrounding_text: ¤³¤Î¥³¥Þ¥ó¥É¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¥³¡¼¥ë ¥Ð¥Ã¥¯´Ø¿ô¤¬¸Æ¤Ð¤ì¤¿ºÝ¤Ë¤Ï¡¢#MInputContext::plist ¤ÎÂè°ìÍ×ÁǤϡ¢¥­¡¼ @@ -4240,9 +4405,9 @@ minput_create_ic (MInputMethod *im, void *arg) if (im->driver.callback_list) { - minput__callback (ic, Minput_preedit_start); - minput__callback (ic, Minput_status_start); - minput__callback (ic, Minput_status_draw); + minput_callback (ic, Minput_preedit_start); + minput_callback (ic, Minput_status_start); + minput_callback (ic, Minput_status_draw); } MDEBUG_PRINT (" ok\n"); @@ -4276,9 +4441,9 @@ minput_destroy_ic (MInputContext *ic) msymbol_name (ic->im->name), msymbol_name (ic->im->language)); if (ic->im->driver.callback_list) { - minput__callback (ic, Minput_preedit_done); - minput__callback (ic, Minput_status_done); - minput__callback (ic, Minput_candidates_done); + minput_callback (ic, Minput_preedit_done); + minput_callback (ic, Minput_status_done); + minput_callback (ic, Minput_candidates_done); } (*ic->im->driver.destroy_ic) (ic); M17N_OBJECT_UNREF (ic->preedit); @@ -4344,16 +4509,20 @@ minput_filter (MInputContext *ic, MSymbol key, void *arg) if (! ic || ! ic->active) return 0; + if (ic->im->driver.callback_list + && mtext_nchars (ic->preedit) > 0) + minput_callback (ic, Minput_preedit_draw); + ret = (*ic->im->driver.filter) (ic, key, arg); if (ic->im->driver.callback_list) { if (ic->preedit_changed) - minput__callback (ic, Minput_preedit_draw); + minput_callback (ic, Minput_preedit_draw); if (ic->status_changed) - minput__callback (ic, Minput_status_draw); + minput_callback (ic, Minput_status_draw); if (ic->candidates_changed) - minput__callback (ic, Minput_candidates_draw); + minput_callback (ic, Minput_candidates_draw); } return ret; @@ -4456,7 +4625,7 @@ minput_set_spot (MInputContext *ic, int x, int y, ic->spot.mt = mt; ic->spot.pos = pos; if (ic->im->driver.callback_list) - minput__callback (ic, Minput_set_spot); + minput_callback (ic, Minput_set_spot); } /*=*/ @@ -4476,7 +4645,7 @@ void minput_toggle (MInputContext *ic) { if (ic->im->driver.callback_list) - minput__callback (ic, Minput_toggle); + minput_callback (ic, Minput_toggle); ic->active = ! ic->active; } @@ -4506,7 +4675,7 @@ void minput_reset_ic (MInputContext *ic) { if (ic->im->driver.callback_list) - minput__callback (ic, Minput_reset); + minput_callback (ic, Minput_reset); } /*=*/ @@ -4536,7 +4705,7 @@ minput_reset_ic (MInputContext *ic) plist ¤ÎÂè°ìÍ×ÁǤϡ¢#Mtext ¤ò¥­¡¼¤Ë»ý¤Á¡¢ÃͤÏÆþÎϥ᥽¥Ã¥É¤ò¼±Ê̤¹¤ë ¥¿¥¤¥È¥ë¤òɽ¤¹ M-text ¤Ç¤¢¤ë¡£ÂèÆóÍ×ÁǤ¬¤¢¤ì¤Ð¡¢¥­¡¼¤Ï #Mtext ¤Ç¤¢ - ¤ê¡¢Ãͤϼ±ÊÌÍÑ¥¢¥¤¥³¥ó²èÁü¤ÎÀäÂÐ¥Õ¥¡¥¤¥ë¥Í¡¼¥à¤òɽ¤¹ M-text ¤Ç¤¢¤ë¡£ + ¤ê¡¢Ãͤϼ±ÊÌÍÑ¥¢¥¤¥³¥ó²èÁü¥Õ¥¡¥¤¥ë¤ÎÀäÂХѥ¹¤òɽ¤¹ M-text ¤Ç¤¢¤ë¡£ @return »ØÄê¤ÎÆþÎϥ᥽¥Ã¥É¤¬Â¸ºß¤·¡¢¥¿¥¤¥È¥ë¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ì¤Ð @@ -4653,7 +4822,7 @@ minput_get_description (MSymbol language, MSymbol name) If $COMMAND is #Mnil, information about all commands is returned. - The return value is a @e well-formed plist (#m17nPlist) of this + The return value is a @e well-formed plist (@ref m17nPlist) of this format: @verbatim ((NAME DESCRIPTION STATUS [KEYSEQ ...]) ...) @@ -4665,7 +4834,7 @@ minput_get_description (MSymbol language, MSymbol name) @c STATUS is a symbol representing how the key assignment is decided. The value is #Mnil (the default key assignment), #Mcustomized (the - key assignment is customized by per-user configuration file), or + key assignment is customized by per-user customization file), or #Mconfigured (the key assignment is set by the call of minput_config_command ()). For a local command only, it may also be #Minherited (the key assignment is inherited from the @@ -4707,7 +4876,7 @@ minput_get_description (MSymbol language, MSymbol name) $COMMAND ¤¬ #Mnil ¤Î¾ì¹ç¤Ï¡¢¤¹¤Ù¤Æ¤Î¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¾ðÊó¤òÊÖ¤¹¡£ - Ìá¤êÃͤϰʲ¼¤Î·Á¼°¤Î @e well-formed plist (#m17nPlist) ¤Ç¤¢¤ë¡£ + Ìá¤êÃͤϰʲ¼¤Î·Á¼°¤Î @e well-formed plist (@ref m17nPlist) ¤Ç¤¢¤ë¡£ @verbatim ((NAME DESCRIPTION STATUS [KEYSEQ ...]) ...) @@ -4717,12 +4886,13 @@ minput_get_description (MSymbol language, MSymbol name) @c DESCRIPTION ¤Ï¥³¥Þ¥ó¥É¤òÀâÌÀ¤¹¤ë M-text ¤Ç¤¢¤ë¤«¡¢ÀâÌÀ¤¬Ìµ¤¤¾ì¹ç¤Ë ¤Ï #Mnil ¤Ç¤¢¤ë¡£ - @c STATUS ¤Ï¥­¡¼³ä¤êÅö¤Æ¤¬¤É¤Î¤è¤¦¤ËÄê¤á¤é¤ì¤ë¤«¤ò¤¢¤é¤ï¤¹¥·¥ó¥Ü¥ë¤Ç¤¢ - ¤ê¡¢¤½¤ÎÃÍ¤Ï #Mnil ¡Ê¥Ç¥Õ¥©¥ë¥È¤Î³ä¤êÅö¤Æ¡Ë, #Mcustomized ¡Ê¥æ¡¼¥¶ - Ëè¤ÎÀßÄê¥Õ¥¡¥¤¥ë¤Ë¤è¤Ã¤Æ¥«¥¹¥¿¥Þ¥¤¥º¤µ¤ì¤¿³ä¤êÅö¤Æ¡Ë, #Mconfigured - ¡Êminput_config_command ()¤ò¸Æ¤Ö¤³¤È¤Ë¤è¤Ã¤ÆÀßÄꤵ¤ì¤ë³ä¤êÅö¤Æ¡Ë¤Î - ¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£¥í¡¼¥«¥ë¥³¥Þ¥ó¥É¤Î¾ì¹ç¤Ë¤Ï¡¢#Minherited ¡ÊÂбþ¤¹¤ë - ¥°¥í¡¼¥Ð¥ë¥³¥Þ¥ó¥É¤«¤é¤Î·Ñ¾µ¤Ë¤è¤ë³ä¤êÅö¤Æ¡Ë¤Ç¤â¤è¤¤¡£ + @c STATUS ¤Ï¥­¡¼³ä¤êÅö¤Æ¤¬¤É¤Î¤è¤¦¤ËÄê¤á¤é¤ì¤ë¤«¤ò¤¢¤é¤ï¤¹¥·¥ó¥Ü¥ë + ¤Ç¤¢¤ê¡¢¤½¤ÎÃÍ¤Ï #Mnil ¡Ê¥Ç¥Õ¥©¥ë¥È¤Î³ä¤êÅö¤Æ¡Ë, #Mcustomized ¡Ê¥æ¡¼ + ¥¶Ëè¤Î¥«¥¹¥¿¥Þ¥¤¥º¥Õ¥¡¥¤¥ë¤Ë¤è¤Ã¤Æ¥«¥¹¥¿¥Þ¥¤¥º¤µ¤ì¤¿³ä¤êÅö¤Æ¡Ë, + #Mconfigured ¡Êminput_config_command ()¤ò¸Æ¤Ö¤³¤È¤Ë¤è¤Ã¤ÆÀßÄꤵ¤ì¤ë + ³ä¤êÅö¤Æ¡Ë¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£¥í¡¼¥«¥ë¥³¥Þ¥ó¥É¤Î¾ì¹ç¤Ë¤Ï¡¢ + #Minherited ¡ÊÂбþ¤¹¤ë¥°¥í¡¼¥Ð¥ë¥³¥Þ¥ó¥É¤«¤é¤Î·Ñ¾µ¤Ë¤è¤ë³ä¤êÅö¤Æ¡Ë + ¤Ç¤â¤è¤¤¡£ @c KEYSEQ ¤Ï£±¤Ä°Ê¾å¤Î¥·¥ó¥Ü¥ë¤«¤é¤Ê¤ë plist ¤Ç¤¢¤ê¡¢³Æ¥·¥ó¥Ü¥ë¤Ï¥³¥Þ ¥ó¥É¤Ë³ä¤êÅö¤Æ¤é¤ì¤Æ¤¤¤ë¥­¡¼¥·¡¼¥¯¥¨¥ó¥¹¤òɽ¤¹¡£KEYSEQ ¤¬Ìµ¤¤¾ì¹ç¤Ï¡¢ @@ -4752,8 +4922,8 @@ get_im_command_description (MSymbol language, MSymbol name, MSymbol command) if (! cmds) return NULL; - plist = mplist_value (cmds); /* (NAME DESCRIPTION KEY-SEQ ...) */ - plist = mplist_next (plist); /* (DESCRIPTION KEY-SEQ ...) */ + plist = mplist_value (cmds); /* (NAME DESCRIPTION STATUS KEY-SEQ ...) */ + plist = mplist_next (plist); /* (DESCRIPTION STATUS KEY-SEQ ...) */ return (mplist_key (plist) == Mtext ? (MText *) mplist_value (plist) : NULL); @@ -4789,12 +4959,16 @@ minput_get_command (MSymbol language, MSymbol name, MSymbol command) If $KEYSEQLIST is a non-empty plist, it must be a list of key sequences, and each key sequence must be a plist of symbols. - If $KEYSEQLIST is an empty plist, the command becomes unusable. + If $KEYSEQLIST is an empty plist, any configuration and + customization of the command are cancelled, and default key + sequences become effective. - If $KEYSEQLIST is NULL, the configuration of the command for the - input method is canceled, and the default key sequences become - effective. In such case, if $COMMAND is #Mnil, configurations for - all commands of the input method are canceled. + If $KEYSEQLIST is NULL, the configuration of the command is + canceled, and the original key sequences (what saved in per-user + customization file, or the default one) become effective. + + In the latter two cases, $COMMAND can be #Mnil to make all the + commands of the input method the target of the operation. If $NAME is #Mnil, this function configures the key assignment of a global command, not that of a specific input method. @@ -4802,11 +4976,10 @@ minput_get_command (MSymbol language, MSymbol name, MSymbol command) The configuration takes effect for input methods opened or re-opened later in the current session. In order to make the configuration take effect for the future session, it must be saved - in a per-user configuration file by the function + in a per-user customization file by the function minput_save_config (). @return - If the operation was successful, this function returns 0, otherwise returns -1. The operation fails in these cases: