[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 2767] Re: seldon1, adelaid1.



  こんばんは、川合です。


Koyanagi Masaaki さんは 2001/12/21 18:01:16 の「[OSASK 2766] Re:
 seldon1, adelaid1.」で書きました:

>seldon1 を試しました。

  早速のご報告、ありがとうございます。

>>   これらのバージョンは、えせファイルシステムのライト機能が搭載さ
>> れている・・・と思いきや、その部分はまだ出来ていません。もうしば
>> らくおまちください。あとちょっとです。
>あと少しということなので楽しみにしてます。

  作業量はたかが知れているのですが、ちょっとOSASKとは関係ない個人的
な予定が込んでいましてベータリリースには時間がかかるかもしれません。

  でも、ここまでお待たせしているのですから、僕としては何とかした
いところです。

>使いやすくなりましたが、
>EUC のファイルも BEDITC00 で開かれてしまいました(笑)。

  ああ、それはいわないでください(笑)。分かっていた事です。・・
・とりあえずver.2.0には.EUCというファイルはバンドルしない事にし
ます(笑)。

>Ver. 2.0の一般公開の時には、この関連付けは外部設定ファイルにできたら
>いいと思います。

  それはよい案ですが、時間的にいってver.2.0には間に合いません。v
er.2.1で許してください。

  なお、.EUCに対してTVIEWC05をEUCモードで起動させるという設定も
多分可能です。

>なるほど。キーによるファイルオープンとドラッグ & ドロップ
>によるファイルオープンも 1つにまとめられそうですね。
>でも、ドラッグ & ドロップの場合は、モジュールの初期化が
>オープンするファイルが決定した後で必要な気がします。
>
>for(;;) {
>	switch(sig) {
>	case KEY_SIGNAL:
>	<新規スロットの作成>
>	<モジュールの初期化>
>	<ファイルダイアログ表示>// シグナル FILE_OPENED が完了シグナル
>	break;
>
>	case FILE_OPENED:
>	<新規スロットの作成> // D & D の場合に必要?
>	<モジュールの初期化> // D & D の場合に必要?
>	break;
>	}
>}

  ???

  すみません、実はこのご提案がよく分かりませんでした。何か面白そ
うな事を書かれているようなんですが・・・。スロットを毎回用意して
いるのですか???

  一応、現在の仕組みを紹介しておきます。

  .BMPファイルが選択された場合、pokonはBMPV03.BINを起動します。
そして起動したタスクの番号を覚えておいて、このタスクがファイルセ
レクタを要求してきたら、無条件に選択されたファイルが指定されたか
のように振る舞うようにセットします。ただ、それだけの事です。

  BEDITC00に対する操作もこれと同じ事です。

  TVIEWC05はちょっと凝っていまして、起動した直後に、42というシグ
ナルも送ってやります。そしてやはりファイルセレクタの要求を待って
要求に対して指定された.TXTを渡してやります。

  TVIEWC05が凝っているのは、シグナルを送ってやらないといつまでた
ってもファイルセレクタが出てこないからです。それだけの事です。

  アプリケーションにしてみれば、どの場合も、いたって普通にユーザ
ーが操作したものと信じています。まさかシェルがこれらをごっそりと
乗っ取ったなんて思っていません。そして、こういう乗っ取りが可能で
あるようにかねてからAPIを設計していたわけです。強いて言えば、こ
れもエミュレーションでしょう。シェルがユーザーの代わりにキー入力
をしてファイルを選択しているようなものです。

  仮にTVIEC05に対してあるファイルをDrag&Dropした時に、シグナル42
を送って出てきたファイルセレクタにそのファイルを渡すようにしてや
れば、アプリ側の変更無しにDrag&Dropも実現します。アプリはこれら
の行為がユーザーのキー操作によるものかそれともシェルのエミュレー
ションによるものなのかを区別できません(もし区別したければ、Drag
&Drop専用のシグナル番号を別に用意しておいて、シェルにはこのシグ
ナル番号を発するようにさせておくことはできますが)。

  このような「乗っ取り方式」だからこそ、BMPV03という古いアプリケ
ーションでも無変更で対応できたのです。

---

>seldon1 でやってみました。開始直後スクロールしないように
>マウスカーソルを動かしているだけで、EC=13Bが出ました。
>もっとも早く出たケースでは、起動直後に、右下にマウスカーソルを
>動かして画面中央くらいに来たところで出ました。

  これはひどいですね。ではちょっと実験してもらえないでしょうか?

void near GAPI_mouse()
{
    int *cmd == FS:EBX;
    GAPI_WORK *work == ES:0x0000;

    cmd[4] = 0xffffffff; // コマンド終了
    EAX = cmd[8];
    TEST(AH, 0x02);
    if (!= 0) {
        // カーソルを消す
        CLI();
        if (work->mouseflag != 0) {
            PUSH(EAX);
            GAPI_removemouse(); // remove mouse (mouseflag = 0)
            POP(EAX);
        }
        TEST(AH, 0x01);
        if (== 0)
            work->mx1 = 0x80000000; // 非表示モード
        STI();
    }
    TEST(AH, 0x01);
    if (!= 0) {
        // カーソルを描く
        ECX = cmd[12];
        EDX = cmd[16];
        CLI();
        work->mx = ECX;
        work->my = EDX;
        if (work->lockcount == 0) {
            GAPI_clippingmouse(); // mx0, my0, mx1, my1を設定
            GAPI_putmouse(); // put mouse (mouseflag = 1)
        } else {
            work->mouselock = 0x80000000;
        }
        STI();
        (offset) cmd += 20;
        asmout("JMP next_command");
    }
    (offset) cmd += 12;
    asmout("JMP next_command");
}

  関数GAPI_mouse()を上記のものに入れ替えたら、多少は改善するでし
ょうか?EC=13Bが発生するまでの平均時間が体感できるほど伸びれば、
ここに問題があるのはまず間違いないでしょう。

  この変更は、どのバージョンのvgadrv0に対しても有効ですが、seldo
n0sに対して行うのが一番分かりやすいでしょう。

  そして改善が見られるなら、この変更を採用する事にします。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/