[Squeak-ja: 3486] Re: UNIX版 VMでの多言語入力
Tsutomu Hiroshima
tsutomu @ nucba.ac.jp
2007年 4月 30日 (月) 08:24:29 JST
廣島です.
別のメアドから大島さんにはお送りしましたが,
あらためて投稿させていただきます.
>> ギリシャ語(ISO Latin-7)の入力には XIM を使うのでしょうか?
>> もしかして Latin-1 のような Compose を使うのでしょうか?
>
> ギリシャ語を入力するには、Control-Shiftを押すとキーボードの
> モードが切り替わるという話のようでした。切り替
> えると、xevで見たときワンストロークで("A"のキーを押すと)、
>
> KeyPress event, serial 29, synthetic NO, window 0x1e00001,
> root 0x64, subw 0x0, time 3200328687, (155,64), root:(194,585),
> state 0x2010, keycode 38 (keysym 0x7e1, Greek_alpha), same_screen YES,
> XLookupString gives 0 bytes:
> XmbLookupString gives 0 bytes:
> XFilterEvent returns: False
>
> というコードがSqueak VMに届くようです。
>
xev の結果から推察すると
Greek_alpha は通常のキャラクタでなく,
KeySym 扱いのようですね.
そうだとすると translateCode を通されます.
man XmbLookupString 抜粋:status_return の値
XLookupKeySym A KeySym has been returned instead of a
string and is returned in keysym_return.
The content of the buffer_return argument
is not modified, and the function returns
zero.
sqUnixX11.c:static int x2sqKeyInput(XKeyEvent *xevt)の該当箇所
case XLookupKeySym:
# if defined(DEBUG_CONV)
fprintf(stderr, "x2sqKey XLookupKeySym\n");
# endif
{
int charCode= translateCode(symbolic);
# if defined(DEBUG_CONV)
printf("SYM %d -> %d\n", symbolic, charCode);
# endif
if (charCode < 0)
return -1; /* unknown key */
if ((charCode == 127) && mapDelBs)
charCode= 8;
return lastKey= charCode;
}
sqUnixX11.c:static int x2sqKeyPlain(XKeyEvent *xevt)の該当箇所
if (nConv == 0 && (charCode= translateCode(symbolic)) < 0)
return -1; /* unknown key */
translateCode では少数のコントロールキー以外は,
未知のキーとして -1 を返すことになってます.
KeySym の定義を /usr/include/X11/keysymdef.h で調べると,
0xf??? はコントロールキー,
0x100?? はアクセントキー,
0x0??? は文字のキーのようです.
これをふまえて,
translateCode をしかるべく変更する必要があります.
ただこのファイルをみる限り,
KeySym と UNICODE との対応は単純ではなさそうです.
(perl や awk で 対応表を抽出する?)
=================
廣島 勉
Tsutomu Hiroshima
Squeak-ja メーリングリストの案内