diff -ruN Canna37p1.orig/lib/canna/romaji.c Canna37p1/lib/canna/romaji.c
--- Canna37p1.orig/lib/canna/romaji.c 2004-03-17 17:56:42.651277000 +0900
+++ Canna37p1/lib/canna/romaji.c 2004-03-17 17:57:23.207908504 +0900
@@ -21,7 +21,7 @@
*/
#if !defined(lint) && !defined(__CODECENTER__)
-static char rcs_id[] = "@(#) 102.1 $Id: romaji.c,v 1.10 2003/09/17 08:50:53 aida_s Exp $";
+static char rcs_id[] = "@(#) 102.1 $Id: romaji.c,v 1.11 2004/03/15 04:33:23 aida_s Exp $";
#endif /* lint */
#include "canna.h"
@@ -2626,6 +2626,7 @@
yc->englishtype = CANNA_ENG_KANA;
yc->cStartp = yc->cRStartp = 0;
yc->jishu_kEndp = 0;
+ yc->n_susp_chars = 0;
}
static int
@@ -2782,8 +2783,13 @@
}
yc->last_rule = 0;
howManyDelete = howFarToGoBackward(yc);
- if (howManyDelete > 0 && (yc->generalFlags & CANNA_YOMI_BREAK_ROMAN)) {
- yc->generalFlags &= ~CANNA_YOMI_BREAK_ROMAN;
+ if (howManyDelete > 0 && (yc->generalFlags & CANNA_YOMI_BREAK_ROMAN)
+ && (yc->kAttr[yc->kCurs] & SENTOU)) {
+ /*
+ * ローマ字1文字に対応する仮名を消した時はローマ字、仮名とも
+ * SENTOUフラグが1個減る。
+ * そうでないときはSENTOUフラグの個数は変わらない
+ */
yc->rStartp = yc->rCurs - 1;
while ( yc->rStartp > 0 && !(yc->rAttr[yc->rStartp] & SENTOU) ) {
yc->rStartp--;
@@ -2792,16 +2798,23 @@
yc->kRStartp = yc->kCurs - 1;
while ( yc->kRStartp > 0 && !(yc->kAttr[yc->kRStartp] & SENTOU) )
yc->kRStartp--;
+ /* これ必ず真では? */
prevflag = (yc->kAttr[yc->kRStartp] & SENTOU);
kanaReplace(yc->kRStartp - yc->kCurs,
yc->romaji_buffer + yc->rStartp,
yc->rCurs - yc->rStartp,
0);
+ /* ローマ字1文字に対応する仮名を消したときは最初からSENTOUである */
yc->kAttr[yc->kRStartp] |= prevflag;
yc->n_susp_chars = 0; /* とりあえずクリアしておく */
makePhonoOnBuffer(d, yc, (unsigned char)0, 0, 0);
+ /* 以前は常にフラグを下げていたが、未変換ローマ字が残っているときは
+ * フラグを下げないことにする */
+ if (yc->kRStartp == yc->kCurs)
+ yc->generalFlags &= ~CANNA_YOMI_BREAK_ROMAN;
}
else {
+ yc->generalFlags &= ~CANNA_YOMI_BREAK_ROMAN;
if ( yc->kAttr[yc->kCurs - howManyDelete] & HENKANSUMI ) {
if (yc->kAttr[yc->kCurs - howManyDelete] & SENTOU) {
/* ローマ字かな変換の先頭だったら */
@@ -2821,6 +2834,12 @@
yc->rEndp -= n;
}
else {
+ /* 仮名のカーソル位置は先頭になるのでローマ字のカーソルも動かす*/
+ while ( yc->rCurs > 0 && !(yc->rAttr[--yc->rCurs] & SENTOU) )
+ ;
+ if (yc->rCurs < yc->rStartp) {
+ yc->rStartp = yc->rCurs;
+ }
yc->kAttr[yc->kCurs] |= SENTOU;
}
}
@@ -2829,6 +2848,12 @@
romajiReplace(-howManyDelete, (wchar_t *)NULL, 0, 0);
}
kanaReplace(-howManyDelete, (wchar_t *)NULL, 0, 0);
+ if ((yc->rAttr[yc->rCurs] & SENTOU) && yc->kRStartp == yc->kCurs) {
+ /* 未変換のローマ字を消してしまったので、次に入力したローマ字は
+ * SENTOUになる方が自然だろう
+ */
+ yc->rStartp = yc->rCurs;
+ }
}
debug_yomi(yc);
return(0);
@@ -2944,6 +2969,7 @@
currentModeInfo(d);
}
makeYomiReturnStruct(d);
+ debug_yomi(yc);
return 0;
}