From: handa Date: Fri, 28 Oct 2005 11:48:40 +0000 (+0000) Subject: (load_branch): Ignore an undefined map name. X-Git-Tag: REL-1-3-0~109 X-Git-Url: http://git.chise.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=90b279d787e1e1e46820da021927d9eea35538e5;p=m17n%2Fm17n-lib.git (load_branch): Ignore an undefined map name. (load_im_info): Set im_info->title from `name' only if it's not Mnil. (shift_state): Always update ic->status. (adjust_candidates): Renamed from adjust_candidate_command. Argument changed. Caller changed. (get_candidate_list, regularize_action): New functions. (take_action_list): Use them. On handling Munhandle, don't set ic_info->used to 0. (handle_key): If KEY is not handled by MAP, and MAP has branch_actions, perform them. --- diff --git a/src/input.c b/src/input.c index 2ffa0a3..541b5bc 100644 --- a/src/input.c +++ b/src/input.c @@ -812,11 +812,8 @@ load_branch (MPlist *plist, MPlist *maps, MIMMap *map, if (branch_actions) M17N_OBJECT_REF (branch_actions); } - else + else if ((plist = (MPlist *) mplist_get (maps, map_name))) { - plist = (MPlist *) mplist_get (maps, map_name); - if (! plist || ! MPLIST_PLIST_P (plist)) - MERROR (MERROR_IM, -1); MPLIST_DO (plist, plist) { MPlist *keylist, *map_actions; @@ -1196,10 +1193,9 @@ load_im_info (MSymbol language, MSymbol name, MPlist *plist) if (! states) goto err; - if (! title) + if (! title && name) im_info->title - = title = mtext_from_data (MSYMBOL_NAME (im_info->im->name), - MSYMBOL_NAMELEN (im_info->im->name), + = title = mtext_from_data (MSYMBOL_NAME (name), MSYMBOL_NAMELEN (name), MTEXT_FORMAT_US_ASCII); return im_info; @@ -1255,7 +1251,7 @@ shift_state (MInputContext *ic, MSymbol state_name) if (state->title) ic->status = state->title; - else if (! ic->status) + else ic->status = im_info->title; ic->status_changed = 1; if (ic_info->map == ic_info->state->map @@ -1475,19 +1471,18 @@ get_select_charset (MInputContextInfo * ic_info) } static MPlist * -adjust_candidate_command (MInputContextInfo *ic_info, MPlist *args, - MCharset *charset) +adjust_candidates (MPlist *plist, MCharset *charset) { - MPlist *plist, *pl; + MPlist *pl; - /* args ::= ((MTEXT ...) ...) | ((PLIST ...) ...) */ - plist = mplist_copy (MPLIST_PLIST (args)); + /* plist ::= MTEXT ... | PLIST ... */ + plist = mplist_copy (plist); if (MPLIST_MTEXT_P (plist)) { pl = plist; while (! MPLIST_TAIL_P (pl)) { - /* pl ::= (MTEXT ...) */ + /* pl ::= MTEXT ... */ MText *mt = MPLIST_MTEXT (pl); int mt_copied = 0; int i, c; @@ -1521,15 +1516,16 @@ adjust_candidate_command (MInputContextInfo *ic_info, MPlist *args, pl = plist; while (! MPLIST_TAIL_P (pl)) { - /* pl ::= ((MTEXT ...) ...) */ + /* pl ::= (MTEXT ...) ... */ MPlist *p = MPLIST_PLIST (pl); - /* p ::= (MTEXT ...) */ - int pl_copied = 0; + int p_copied = 0; + /* p ::= MTEXT ... */ + MPlist *p0 = p; int n = 0; - while (MPLIST_TAIL_P (p)) + while (! MPLIST_TAIL_P (p0)) { - MText *mt = MPLIST_MTEXT (p); + MText *mt = MPLIST_MTEXT (p0); int i, c; for (i = mtext_nchars (mt) - 1; i >= 0; i--) @@ -1538,26 +1534,32 @@ adjust_candidate_command (MInputContextInfo *ic_info, MPlist *args, if (ENCODE_CHAR (charset, c) == MCHAR_INVALID_CODE) break; } - if (i >= 0) + if (i < 0) { - if (! pl_copied) + p0 = MPLIST_NEXT (p0); + n++; + } + else + { + if (! p_copied) { - p = mplist_copy (MPLIST_PLIST (pl)); - mplist_set (pl, Mplist, pl); + p = mplist_copy (p); + mplist_set (pl, Mplist, p); M17N_OBJECT_UNREF (p); - pl_copied = 1; + p_copied = 1; + p0 = p; while (n-- > 0) - p = MPLIST_NEXT (p); + p0 = MPLIST_NEXT (p0); } - mplist_pop (p); + mplist_pop (p0); M17N_OBJECT_UNREF (mt); } } - if (MPLIST_TAIL_P (p)) + if (! MPLIST_TAIL_P (p)) pl = MPLIST_NEXT (pl); else { - p = mplist_pop (pl); + mplist_pop (pl); M17N_OBJECT_UNREF (p); } } @@ -1567,65 +1569,168 @@ adjust_candidate_command (MInputContextInfo *ic_info, MPlist *args, M17N_OBJECT_UNREF (plist); return NULL; } - args = mplist (); - mplist_add (args, Mplist, plist); - M17N_OBJECT_UNREF (plist); - return args; + return plist; } -static int -take_action_list (MInputContext *ic, MPlist *action_list) +static MPlist * +get_candidate_list (MInputContextInfo *ic_info, MPlist *args) { - MInputContextInfo *ic_info = (MInputContextInfo *) ic->info; - MPlist *candidate_list = ic->candidate_list; - int candidate_index = ic->candidate_index; - int candidate_show = ic->candidate_show; - MTextProperty *prop; + MCharset *charset = get_select_charset (ic_info); + MPlist *plist; + int column; + int i, len; - MPLIST_DO (action_list, action_list) + plist = resolve_variable (ic_info, Mcandidates_group_size); + column = MPLIST_INTEGER (plist); + + plist = MPLIST_PLIST (args); + if (charset + && (! (plist = adjust_candidates (plist, charset)))) + return NULL; + + if (column > 0) { - MPlist *action; - MSymbol name; - MPlist *args; + if (MPLIST_MTEXT_P (plist)) + { + MText *mt = MPLIST_MTEXT (plist); + MPlist *next = MPLIST_NEXT (plist); - if (MPLIST_PLIST_P (action_list) - && MPLIST_SYMBOL_P (MPLIST_PLIST (action_list))) + if (MPLIST_TAIL_P (next)) + M17N_OBJECT_REF (mt); + else + { + mt = mtext_dup (mt); + while (! MPLIST_TAIL_P (next)) + { + mt = mtext_cat (mt, MPLIST_MTEXT (next)); + next = MPLIST_NEXT (next); + } + } + M17N_OBJECT_UNREF (plist); + plist = mplist (); + len = mtext_nchars (mt); + if (len <= column) + mplist_add (plist, Mtext, mt); + else + { + for (i = 0; i < len; i += column) + { + int to = (i + column < len ? i + column : len); + MText *sub = mtext_copy (mtext (), 0, mt, i, to); + + mplist_add (plist, Mtext, sub); + M17N_OBJECT_UNREF (sub); + } + } + M17N_OBJECT_UNREF (mt); + } + else /* MPLIST_PLIST_P (plist) */ { - action = MPLIST_PLIST (action_list); - name = MPLIST_SYMBOL (action); - args = MPLIST_NEXT (action); - if (name == Minsert - && MPLIST_PLIST_P (args)) + MPlist *pl = MPLIST_PLIST (plist), *p; + MPlist *next = MPLIST_NEXT (plist); + int j; + + if (MPLIST_TAIL_P (next)) + M17N_OBJECT_REF (pl); + else { - name = M_candidates; - mplist_set (action, Msymbol, name); + 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; + + for (i = 0; i < len; i += column) + { + p = mplist (); + mplist_add (plist, Mplist, p); + M17N_OBJECT_UNREF (p); + for (j = 0; j < column && i + j < len; j++) + { + p = mplist_add (p, Mtext, MPLIST_VAL (p0)); + p0 = MPLIST_NEXT (p0); + } + } + } + M17N_OBJECT_UNREF (pl); } - else if (MPLIST_MTEXT_P (action_list) - || MPLIST_INTEGER_P (action_list)) + } + + if (plist == MPLIST_PLIST (args)) + M17N_OBJECT_REF (plist); + return plist; +} + + +static MPlist * +regularize_action (MPlist *action_list) +{ + MPlist *action = NULL; + MSymbol name; + MPlist *args; + + if (MPLIST_PLIST_P (action_list)) + { + action = MPLIST_PLIST (action_list); + if (MPLIST_SYMBOL_P (action)) { - action = mplist (); - mplist_push (action, MPLIST_KEY (action_list), - MPLIST_VAL (action_list)); - mplist_push (action, Msymbol, Minsert); - mplist_set (action_list, Mplist, action); - M17N_OBJECT_UNREF (action); - name = Minsert; + name = MPLIST_SYMBOL (action); args = MPLIST_NEXT (action); + if (name == Minsert + && MPLIST_PLIST_P (args)) + mplist_set (action, Msymbol, M_candidates); } - else + else if (MPLIST_MTEXT_P (action) || MPLIST_PLIST_P (action)) { - /* (MPLIST_PLIST_P (action_list) - && (MPLIST_MTEXT_P (MPLIST_PLIST (action_list)) - || MPLIST_PLIST_P (MPLIST_PLIST (action_list)))) */ action = mplist (); mplist_push (action, Mplist, MPLIST_VAL (action_list)); mplist_push (action, Msymbol, M_candidates); mplist_set (action_list, Mplist, action); M17N_OBJECT_UNREF (action); - name = M_candidates; - args = MPLIST_NEXT (action); } + } + else if (MPLIST_MTEXT_P (action_list) || MPLIST_INTEGER_P (action_list)) + { + action = mplist (); + mplist_push (action, MPLIST_KEY (action_list), MPLIST_VAL (action_list)); + mplist_push (action, Msymbol, Minsert); + mplist_set (action_list, Mplist, action); + M17N_OBJECT_UNREF (action); + } + return action; +} + +static int +take_action_list (MInputContext *ic, MPlist *action_list) +{ + MInputContextInfo *ic_info = (MInputContextInfo *) ic->info; + MPlist *candidate_list = ic->candidate_list; + int candidate_index = ic->candidate_index; + int candidate_show = ic->candidate_show; + MTextProperty *prop; + + MPLIST_DO (action_list, action_list) + { + MPlist *action = regularize_action (action_list); + MSymbol name; + MPlist *args; + + if (! action) + continue; + name = MPLIST_SYMBOL (action); + args = MPLIST_NEXT (action); MDEBUG_PRINT1 (" %s", MSYMBOL_NAME (name)); if (name == Minsert) @@ -1643,96 +1748,11 @@ take_action_list (MInputContext *ic, MPlist *action_list) } else if (name == M_candidates) { - MCharset *charset = get_select_charset (ic_info); - MPlist *plist = resolve_variable (ic_info, Mcandidates_group_size); - int column = MPLIST_INTEGER (plist); - MText *mt; - int i, len; - - if (charset) - { - if (! (args = adjust_candidate_command (ic_info, args, charset))) - continue; - } - else - /* Avoid freeing ARGS later. */ - M17N_OBJECT_REF (args); + MPlist *plist = get_candidate_list (ic_info, args); + int len; - plist = MPLIST_PLIST (args); - if (column > 0) - { - MPlist *next = MPLIST_NEXT (plist); - - if (MPLIST_MTEXT_P (plist)) - { - MText *mt = MPLIST_MTEXT (plist); - - if (MPLIST_TAIL_P (next)) - M17N_OBJECT_REF (mt); - else - { - mt = mtext_dup (mt); - while (! MPLIST_TAIL_P (next)) - { - mt = mtext_cat (mt, MPLIST_MTEXT (next)); - next = MPLIST_NEXT (next); - } - } - len = mtext_nchars (mt); - if (len > column) - { - plist = mplist (); - for (i = 0; i < len; i += column) - { - int to = (i + column < len ? i + column : len); - MText *sub = mtext_copy (mtext (), 0, mt, i, to); - - mplist_add (plist, Mtext, sub); - M17N_OBJECT_UNREF (sub); - } - } - M17N_OBJECT_UNREF (mt); - } - else /* MPLIST_PLIST_P (plist) */ - { - MPlist *pl = MPLIST_PLIST (plist), *p; - int j; - - if (MPLIST_TAIL_P (next)) - M17N_OBJECT_REF (pl); - else - { - pl = mplist_copy (pl); - while (! MPLIST_TAIL_P (next)) - { - pl = mplist__conc (pl, MPLIST_PLIST (next)); - next = MPLIST_NEXT (next); - } - } - len = mplist_length (pl); - if (len > column) - { - MPlist *p0 = pl; - - plist = mplist (); - for (i = 0; i < len; i += column) - { - p = mplist (); - mplist_add (plist, Mplist, p); - M17N_OBJECT_UNREF (p); - for (j = 0; j < column && i + j < len; j++) - { - p = mplist_add (p, Mtext, MPLIST_VAL (p0)); - p0 = MPLIST_NEXT (p0); - } - } - } - M17N_OBJECT_UNREF (pl); - } - } - - if (plist == MPLIST_PLIST (args)) - M17N_OBJECT_REF (plist); + if (! plist) + continue; if (MPLIST_MTEXT_P (plist)) { preedit_insert (ic, ic->cursor_pos, NULL, @@ -1741,7 +1761,8 @@ take_action_list (MInputContext *ic, MPlist *action_list) } else { - mt = MPLIST_MTEXT (MPLIST_PLIST (plist)); + MText * mt = MPLIST_MTEXT (MPLIST_PLIST (plist)); + preedit_insert (ic, ic->cursor_pos, mt, 0); len = mtext_nchars (mt); } @@ -1752,7 +1773,6 @@ take_action_list (MInputContext *ic, MPlist *action_list) ic->cursor_pos - len, ic->cursor_pos, Mcandidate_index, (void *) 0); M17N_OBJECT_UNREF (plist); - M17N_OBJECT_UNREF (args); } else if (name == Mselect) { @@ -2057,7 +2077,6 @@ take_action_list (MInputContext *ic, MPlist *action_list) else if (name == Munhandle) { preedit_commit (ic); - ic_info->used = 0; return -1; } else @@ -2204,14 +2223,12 @@ handle_key (MInputContext *ic) if (ic_info->map != ic_info->state->map) { shift_state (ic, ic_info->state->name); -#if 0 /* If MAP has branch_actions, perform them. */ if (ic_info->map->branch_actions) { MDEBUG_PRINT (" brank-actions:"); take_action_list (ic, ic_info->map->branch_actions); } -#endif } } else