2008/01/27

Factor 日本語入力の調査 -- 挫折

Linux 環境の Factor の UI で日本語入力ができないものか調査しました。
結果、何故かしらできません。
とりあえずの、調査報告です。

まず、Factor のソースを眺めてみると XOpenIM 等はやってあるようです。
さらに調べると setlocale, XSupportsLocale, XSetLocaleModifiers を呼び出していないことが分かりました。

次のようなコードを xlib.factor に追加し、同じく xlib.factor にある initialize-x の最初で追加した init-locale を呼びだすようにしてみました。

: LC_ALL      0 ; inline
: LC_COLLATE 1 ; inline
: LC_CTYPE 2 ; inline
: LC_MONETARY 3 ; inline
: LC_NUMERIC 4 ; inline
: LC_TIME 5 ; inline
FUNCTION: char* setlocale ( int category, char* name ) ;
FUNCTION: Bool XSupportsLocale ( ) ;
FUNCTION: char* XSetLocaleModifiers ( char* modifier_list ) ;
: init-locale ( -- )
USE: prettyprint
LC_CTYPE "" setlocale [ "setlocale() failed" throw ] unless* .
XSupportsLocale [ "XSupportsLocale() failed" throw ] unless* .
"" XSetLocaleModifiers [ "XSetLocaleModifiers() failed" throw ] unless* . ;


しかし、XOpenIM で NULL が返ってくるようになりました。

次に C と Factor でそれぞれ最低限のコードでどうなるか調べてみました。
次のようなコードですが、C の方は XOpenIM が成功しますが、Factor の方はだめです。何故?
Factor のコード(実行は factor -script min.factor)
USING: kernel alien alien.c-types alien.syntax
prettyprint compiler sequences ;

LIBRARY: xlib

: LC_CTYPE 2 ; inline
FUNCTION: char* setlocale ( int category, char* name ) ;
FUNCTION: Bool XSupportsLocale ( ) ;
FUNCTION: char* XSetLocaleModifiers ( char* modifier_list ) ;
FUNCTION: Display* XOpenDisplay ( void* display_name ) ;
FUNCTION: XIM XOpenIM ( Display* dpy, void* rdb, char* res_name, char* res_class ) ;
{ setlocale XSupportsLocale XSetLocaleModifiers XOpenDisplay XOpenIM }
[ compile ] each

LC_CTYPE "" setlocale [ "setlocale() failed" throw ] unless* .
XSupportsLocale [ "XSupportsLocale() failed" throw ] unless* .
"" XSetLocaleModifiers [ "XSetLocaleModifiers() failed" throw ] unless* .
f XOpenDisplay [ "XOpenDisplay() failed" throw ] unless* dup .
f f f XOpenIM .

C のコード
#include <X11/Xlib.h>
#include <X11/Xlocale.h>
#include <stdio.h>

int main( int argc, char** argv )
{
Display* dpy;
XIM im;
char* p;
p = setlocale( LC_CTYPE, "" );
if ( p == NULL ) {
printf( "setlocale() failed\n" );
return -1;
}
printf("setlocale: %s\n", p);

if ( ! XSupportsLocale() ) {
printf( "XSupportsLocale() failed\n" );
return -1;
}

p = XSetLocaleModifiers( "" );
if ( p == NULL ) {
printf( "XSetLocaleModifiers() failed\n" );
return -1;
}
printf("XSetLocaleModifiers: %s\n", p);


dpy = XOpenDisplay( NULL );
if (dpy == NULL) {
printf("XOpenDisplay() failed\n");
}
printf("XOpenDisplay: %p\n", dpy);

if ( ( im = XOpenIM( dpy, NULL, NULL, NULL ) ) == NULL ) {
printf( "XOpenIM failed\n" );
return -1;
}
printf("XOpenIM: %p\n", im);


return 0;
}


インプットメソッドに uim を使っていましたが、試しに SCIM をインストールして試してみました。
すると、Factor でも XOpenIM が成功するではありませんか。
しかし、喜んだのもつかのま、SCIM が「英語/ヨーロッパ言語」になったまま「SKK」に切り替えられません。
それなら、と SCIM の設定で SKK のみ有効にしてみたら、また XOpenIM が NULL を返すようになってしまいました。

ここで力つきました。何が悪いんでしょう?
もし分かる方がいらっしゃるなら教えてください。お願いします。

1 件のコメント:

匿名 さんのコメント...

インプットメソッドのメーリングリストなどで訊いてみた方がいいと思いますけど。