大島さん,それから OLPC に興味のある皆さん,
叩き台として,SqueakImmX11Plugin4e を svn export http://squeakvm.org/svn/squeak/branches/olpc で,取ってきたブランチに適用したものを作成しました. http://opinion.nucba.ac.jp/~tsutomu/squeak/OLPCSqueakImmX11-test0.tar.gz に置きましたので試して下さい. 廣島 勉 |
現在僕の所では日本語は入力可能ですが,
インプットメソッドを介さない英語の入力で subscript out of bounds: 0 のエラーになります. 廣島 勉 |
> 現在僕の所では日本語は入力可能ですが, > インプットメソッドを介さない英語の入力で > subscript out of bounds: 0 > のエラーになります. 場当たり的に修正したものを test1 としました. http://opinion.nucba.ac.jp/~tsutomu/squeak/OLPCSqueakImmX11-test1.tar.gz です. 廣島 勉 |
度々,失礼します.
3773 で,梅澤さんがご指摘のエラーは OLPC のパッチでも問題となりますので, 同様に変更して test2 にしました. http://opinion.nucba.ac.jp/~tsutomu/squeak/OLPCSqueakImmX11-test2.tar.gz -- 廣島 勉 |
廣島さん、みなさん
11月に送っていただいたパッチですが、これを基にし、さらにスペイン語な どで"dead key"やMulti keyを使った入力にも対応したものをOLPC用VMのブラ ンチに入れてもらいました。メインのunix VMにも数日中にはいると思われま す。ありがとうございました。 興味のある方は、http://squeakvm.org/svn/squeak/branches/olpc/をコン パイルして試してみてください。 実を言うと、OLPCでないFedoraではスペイン語配列にしたときにnにチルダ がついた文字を入力したときに、余計なバイトも付いてきてしまいます。この 場合、Terminalだとdead keyを押してからベースの文字を入れるという入力が できなかったりするので、コードのほうの問題なのか設定の問題なのかがいま いちわかりませんでした。詳しい方(廣島さんやほかの方)がいたらぜひ検討し てみてください。よろしくお願いします。 -- Yoshiki At Mon, 05 Nov 2007 13:47:14 +0900, Tsutomu Hiroshima wrote: > > 度々,失礼します. > 3773 で,梅澤さんがご指摘のエラーは OLPC のパッチでも問題となりますので, > 同様に変更して test2 にしました. > > http://opinion.nucba.ac.jp/~tsutomu/squeak/OLPCSqueakImmX11-test2.tar.gz > > -- > 廣島 勉 |
大島さん,ご苦労様です.
> 実を言うと、OLPCでないFedoraではスペイン語配列にしたときにnにチルダ > がついた文字を入力したときに、余計なバイトも付いてきてしまいます。この > 場合、Terminalだとdead keyを押してからベースの文字を入れるという入力が > できなかったりするので、コードのほうの問題なのか設定の問題なのかがいま > いちわかりませんでした。詳しい方(廣島さんやほかの方)がいたらぜひ検討し > てみてください。よろしくお願いします。 手元には jp106 キーボードしかありませんが, 以下の手順で �D+P「tilde付きn」が入力出来ました. もしかしたら,外しているかもしれません. Fedora では,m17n-db-latin パッケージをインストールして, latn-post か latn-pre の入力メソッドでヨーロッパ言語の文字を入力できます. 設定ファイル /usr/share/m17n/latn-post.mim /usr/share/m17n/latn-pre.mim によれば,件の �D+P「tilde付きn」は~ と n のコンビネーションを使うようですが, この ~ は US配列で 1 の左隣にあるキーの ~ でないとダメなようです. システム->管理->キーボード->英語(アメリカ合衆国) を選択後,再ログイン. GNOME の設定と合わないとダイアログが出るので,Xの設定を選択する. 希望の ~ は shift + 半角/全角に対応するので, SCIM の入力モードを latn-pre にして, shift + 半角/全角の後,n を押す. Transcript で試したところ,続けて入力した文字も化けないので, 問題なさそうに思います. OLPC-VM の revision は 1830, SqueakPlugin-dev-527.image を使いました. ==== 廣島 勉 |
> これは、VMにはすでに0xF1の文字が一文字だけ来ているのでしょうか(後で
> 試して見ます)。trunkにも基本的に同じパッチが入ったのですが、アクセント > つき文字の入力は動いていたのに動かなくなったという報告もあって実は大分 > 混乱しているところです。 olpc/platforms/unix/vm/sqUnixEvent.c で,recordKeyboardEvent の debug print を有効にして試しました. static void recordKeyboardEvent(int keyCode, int pressCode, int modifiers, int ucs4) { sqKeyboardEvent *evt= allocateKeyboardEvent(); evt->charCode= keyCode; evt->pressCode= pressCode; evt->modifiers= modifiers; evt->utf32Code= ucs4; evt->reserved1= evt->windowIndex= 0; signalInputEvent(); #if 1 // DEBUG_EVENTS printf("EVENT: key"); switch (pressCode) { case EventKeyDown: printf(" down "); break; case EventKeyChar: printf(" char "); break; case EventKeyUp: printf(" up "); break; default: printf(" ***UNKNOWN***"); break; } printModifiers(modifiers); printKey(keyCode); printf(" ucs4 %d\n", ucs4); #endif } �D+P「tilde付きn」の入力結果は次のようになります. EVENT: key down ` ' (195 = 0xc3) ucs4 0 EVENT: key char ` ' (195 = 0xc3) ucs4 0 EVENT: key down ` ' (177 = 0xb1) ucs4 0 EVENT: key char ` ' (177 = 0xb1) ucs4 0 UTF-16(ucs4 も同じ?) の 0xf1 ではなく, UTF-8 の 0xc3 0xb1 の2バイトです. locale の文字コードが utf-8 の場合, 入力文字列の取得に Xutf8LookupString を使うようにしています. ==== 廣島 勉 |
latin 文字は Emacs の入力メソッドでしか入力したことが無かったので,
大島さんが最初に触れられていた方法がよく判らず, scim(latin-pre) を介した方法で �D+P「tilde付きn」を試しました. > Terminalだとdead keyを押してからベースの文字を入れるという入力が > できなかったりするので、コードのほうの問題なのか設定の問題なのかがいま > いちわかりませんでした。詳しい方(廣島さんやほかの方)がいたらぜひ検討し > てみてください。 ここで述べられている入力方法が次の手順と同じなのか判然としませんが, GNOME のメニューから システム->設定->ハードウェア->キーボード を開いて, レイアウトのオプション->Compose Key Position->Right Alt is Compose にチェックを入れる. ターミナルで 右Alt ~ n を順に押せば �D+P が入力出来ます. /* 右Alt と ~ は同時でなくてもOK. キートップどおりの ~ を使う */ VM が受け取った結果は以下と変わりませんでした. > �D+P「tilde付きn」の入力結果は次のようになります. > > EVENT: key down ` ' (195 = 0xc3) ucs4 0 > EVENT: key char ` ' (195 = 0xc3) ucs4 0 > EVENT: key down ` ' (177 = 0xb1) ucs4 0 > EVENT: key char ` ' (177 = 0xb1) ucs4 0 ==== 廣島 勉 |
大島です。
setxkbmap -layout es をすると、'や`が"dead-key"となって、次に何かを押したときに入力されるよ うになります。そのとき、古いVMでLC_CTYPE環境変数がja_JP.UTF8のようになっ ていてx2sqKeyがx2sqKeyInputになっているときには、'などを押してもVMには 文字が報告されず、次に文字を押したときにアクセントつきの文字としてVMに 報告されるということでした。 新しいVMのオプションで、LC_CTYPEに従って入力するモードをつける必要が あるのではないかと思ってきています。 -- Yoshiki |
大島です。
> 新しいVMのオプションで、LC_CTYPEに従って入力するモードをつける必要が > あるのではないかと思ってきています。 これをテストするパッチを作りました。内部的に関数が増えてしまってちょっ とかっこ悪いのですが、日本語などを入力するときにはコマンドラインオプショ ンを指定するようになっています。 squeakvm.orgのtrunkのほうの1843以降に入ったと思いますので、UNIXユー ザーの皆さんよろしければテストしてみてください。 -- Yoshiki |
廣島です.大島さん,
こんにちは. > 大島です。 > >> 新しいVMのオプションで、LC_CTYPEに従って入力するモードをつける必要が >> あるのではないかと思ってきています。 > > これをテストするパッチを作りました。内部的に関数が増えてしまってちょっ > とかっこ悪いのですが、日本語などを入力するときにはコマンドラインオプショ > ンを指定するようになっています。 > > squeakvm.orgのtrunkのほうの1843以降に入ったと思いますので、UNIXユー > ザーの皆さんよろしければテストしてみてください。 trunk のコード(rev 1853)を見ました. 互換性のため仕方がないことでしょうが, x2sqKeyInput が以前のバージョンとなり, デフォルトでこれが使われるというのは残念です. 堅牢な入力処理が開発されるまでの過渡的な処置であることを願います. 以降,本来 UNIX-VM 開発の ML に英語で投げるべき内容です.ご容赦下さい. Tcl/Tk の日本語化をされた SRA の ひらの さんは,かつてある掲示板で, 「SingleByte 環境の開発者では何十年たっても国際化入力はできない」 のような意の発言をなさってました. かく言う私もかつて Perl/Tk(UNIX) の日本語化パッチをネットに流したことがあり ます. 現在では UTF-8 化されて,日本語表示には問題はなくなりましたが, 今もパッチを当てないと日本語入力は出来ません. さて,x2sqKeyInput の主要部を引用します. デバッグコードは取り除いてあるので行番号が飛んでいます. 1763 int count= XmbLookupString(ic, (XKeyPressedEvent *)xevt, string, sizeof(string), symbolic, &status); 1764 switch (status) 1765 { 1766 case XLookupNone: /* still composing */ 1770 return -1; 1771 1772 case XLookupChars: 1776 case XLookupBoth: 1780 lastKey= (count ? recode(string[0]) : -1); 1784 return lastKey; 1785 1786 case XLookupKeySym: 1790 { 1791 int charCode= translateCode(*symbolic); 1795 if (charCode < 0) 1796 return -1; /* unknown key */ 1797 if ((charCode == 127) && mapDelBs) 1798 charCode= 8; 1799 return lastKey= charCode; 1800 } 1801 1802 default: 1803 fprintf(stderr, "this cannot happen\n"); 1804 return lastKey= -1; 1805 } 1806 return lastKey= -1; 1807 } XmbLookupString はバッファ string に入力バイト列を埋めて返りますが, 1780 行目でその最初のバイトを残して後は捨てています. SingleByte の環境が前提の処理であり XmbLookupString を使う意味はありません. x2sqKeyPlain と比較します. これは国際化入力モジュールの初期化が出来ない場合か, オプション -nointl を指定したときに使われる関数です. 1957 static int x2sqKeyPlain(XKeyEvent *xevt, KeySym *symbolic) 1958 { 1959 unsigned char buf[32]; 1960 int nConv= XLookupString(xevt, (char *)buf, sizeof(buf), symbolic, 0); 1961 int charCode= buf[0]; 1966 if (nConv == 0 && (charCode= translateCode(*symbolic)) < 0) 1967 return -1; /* unknown key */ 1968 if ((charCode == 127) && mapDelBs) 1969 charCode= 8; 1970 if (charCode > 256) /* ALT+?? */ 1971 { 1972 modifierState= charCode >> 8; 1973 charCode &= 0xff; 1974 } 1975 return recode(charCode); 1976 } x2sqKeyInput が前段で入力モジュールの初期化を試みる点と, 入力文字列の問い合わせに使用する X 関数( 1763, 1960 行目 )が違っています. この XmbLookupString / XLookupString の動作は SingleByte 環境ではほぼ同じで す. こちらも XLookupString が埋めた入力バイト列 buf のうち, 最初のバイトだけを 1961 行目で取り出し,他は捨てています. SingleByte 環境であれば x2sqKeyInput と x2sqKeyPlain の結果は変わりません. MultiByte 環境では x2sqKeyPlain では国際化入力モジュールが開かないし, x2sqKeyInput では MultyByte 文字の最初のバイトしか送られないため, m17n の image ではパニックになります. 大島さんの発言にあった, > OLPCでないFedoraではスペイン語配列にしたときにnにチルダ > がついた文字を入力したときに、余計なバイトも付いてきてしまいます。 > これは、VMにはすでに0xF1の文字が一文字だけ来ているのでしょうか は,きっと SingleByte 環境 + SingleByte を期待する image を前提とした話です ね. スペイン語でも文字コードが utf8 な環境 LC_CTYPE=es_ES.utf8 では, XmbLookupString は �D+P を 2バイト として扱うので, x2sqKeyInput の実装では問題となるはずです. /* Fedora はどのロケールでもデフォルトは utf8 でしょうか? */ 要するに,x2sqKeyInput は, SingleByte 環境では x2sqKeyPlain と動作が変わらず, MultiByte 環境では害になるので, これを使う意味は無いはずなのです. 長文になりましたので,続き(?)は回を改めて投稿します. ======= 廣島 勉 |
廣島さん
> trunk のコード(rev 1853)を見ました. > 互換性のため仕方がないことでしょうが, > x2sqKeyInput が以前のバージョンとなり, > デフォルトでこれが使われるというのは残念です. > 堅牢な入力処理が開発されるまでの過渡的な処置であることを願います. 今回はちょっとした時間制約もあってこのようになってしまいました。 > 以降,本来 UNIX-VM 開発の ML に英語で投げるべき内容です.ご容赦下さい. > > Tcl/Tk の日本語化をされた SRA の ひらの さんは,かつてある掲示板で, > 「SingleByte 環境の開発者では何十年たっても国際化入力はできない」 > のような意の発言をなさってました. > かく言う私もかつて Perl/Tk(UNIX) の日本語化パッチをネットに流したことがあり > ます. > 現在では UTF-8 化されて,日本語表示には問題はなくなりましたが, > 今もパッチを当てないと日本語入力は出来ません. これは私も同意します。Squeakの多言語化も自分でやるしかなかったです。 > 要するに,x2sqKeyInput は, > SingleByte 環境では x2sqKeyPlain と動作が変わらず, > MultiByte 環境では害になるので, > これを使う意味は無いはずなのです. dead-keyがあるとXmbLookupStringがcomposeした結果を返すのですが、そこ でかなりてこずっています。setxkbmap -layout esとして言語を切り替えて動 かすと少なくともちゃんと動作しないという問題があったので、いまのところ こういう状況になりました。 ありがとうございます。 ところで、今のsqUnixX11.cの2484行目は if (evt->xfocus.mode == NotifyNormal) となっていますが、Gnome上でAlt-Tabを使ってSqueakからフォーカスを切り替 えた後もう一度Alt-Tabして戻ってきたときに文字入力が有効になりません。 if (evt->xfocus.mode == NotifyNormal || evt->xfocus.mode == NotifyUngrab) のように変えるのがよいのかなとも思うのですが、window manager依存のとこ ろもありそうで「正しい」かどうかはっきりしないでいます。どうでしょう? -- Yoshiki |
Free forum by Nabble | Edit this page |