Ko-Window プログラミング ウィンドウ動作の仕組み編 ウィンドウプログラムがどうやって動いているのかを、少しだけ説明します。もっ と具体的に知りたい方は、ぜひソースリストを眺めてみて下さい。ほとんどがC言語 で書かれており、かつソースレベルで公開されているウィンドウシステムですから活 用しましょう。 ●イベントの優先順位 兄弟関係にあるウィンドウは原則として平等で、イベントも必要なら順番に行き渡 るようになっています。しかしユーザーの操作に対するレスポンスを考慮し、例外処 置としてイベントループの打ち切りを行うことがあります。 分かりやすくいえば、重なりの上になっているウィンドウほどイベントの到達優先 度が高くなっているわけです。これはウィンドウのフォーカスとは何の関係もありま せんが、一般にウィンドウは最後に操作したウィンドウが上になるよう画面上に重な る傾向にあります。よって、頻繁に操作したウィンドウほど優先的にイベントが回る ので、極めて単純な処理ながら効果的な一種の学習機能が働いているといえます。 例えば、アクセサリとして開いている時計等は、ほとんど操作されないため自然に 優先度が下がります。そのため、1秒に一度だけという更新のために、現在頻繁に操 作しているウィンドウのイベントを邪魔することはありません。 ●ユーザーモード Ko-Window のアプリケーションはすべてユーザーモードでのみ動きます。特にウィ ンドウサーバーへのシステムコール (wlib.a の関数) は、スーパーバイザ状態から は実行できません。どうしてもスーパーバイザにならなければならないという場合も、 必ずユーザーモードに戻してからウィンドウ関数を実行して下さい。 ちなみにこのサーバーのシステムコールには、trap #0 が使われています。最も、 普段は wlib.a を介してのみ使用するためユーザーが意識する必要はありません。 ●ハードウエア資源 原則として Ko-Window は、IOCS レベルでのハードウエア資源しか使用しません。 つまり表示はテキストの 0,1 の2プレーンしか使わず、またマウスの管理も全部 IOCS に依存しています。 だからマウスプレーンを使用する常駐プログラム等を動かしたまま Ko-Window を 起動しても、そのまま問題なく使えてしまうことがあります。 ●画面表示エリアの制限 Ko-Window は最初に一般公開された v2.00 の時から、表示画面 768×512dot なが ら広い画面をスクロールさせて自由に使える機能がついていました。しかし、その範 囲は最大で 1024×1024 ではなく、1024×992dot という制限がついています。 これはなぜかというと、元々 Ko-Window は文字列表示のために画面最下部の 32dot 分をワークエリアとして使用していたからです。というのも、初期のころは文字列表 示に IOCS FNTADR + TEXTPUT という組み合わせを使っていたからです。 これはまもなく高速なルーチンに入れ替わりましたが、フォント展開のワークエリ アとして TEXT V-RAM を使うことは受け継がれました。 しかし、フォント展開に CRTC 機能を使ってるわけでもないのに、V-RAM を使うの はアクセスにウエイトが入って無駄であること、そしてまたせっかくの画面を 1024× 1024 dot で広く使いたいという要望から、WSRV.X v2.24+11.2 以降修正が加わりまし た。現在はこのような制限はなくなり、広い状態で高速に使えるようになっているは ずです。 もう1つ、X680x0 の IOCS ROM のマウス処理ルーチンでは、不思議なことにマウス カーソルの移動範囲に制限が設けられています。どんなにエリアを大きく取ったとし ても 1024×1008 dot の間でしかカーソルが動きません。IOCS レベルでマウス処理を 行っている Ko-Window でもこの制限を受けてしまいます。 そこで、本当に 1024×1024 dot の広い画面を使いたい場合は、Hmouse.x という 高速かつ移動範囲制限のないマウスドライバを組み込んでおく必要があります。 この Hmouse.x は、hfont.r とともに今の Ko-Window での必須のドライバになっ ています。 ●画面の表示モード Ko-Window が直接ハードウエア(CRTC)を操作している部分の1つに、この画面の表 示モード設定があります。ウィンドウで特殊な画面モードを使用する必要があるから です。 例えば、768×512dot の状態で、65536色の色を出すことができます。今ではよく 使われるテクニックであって珍しくもありませんが、Ko-Window ではこれを、画面モー ドと色モードを完全に独立して管理しているというところに特徴があります。 画面モード 色モード 256x256 16色 512x512 256色 768x512 65536色 1024x424 1024x848 等IOCSにもある基本のモード その他ユーザー定義可能 この両者を完全に分け、それぞれすべての組み合わせを行うことが可能です。また 画面モードなら画面モードだけ、いろモードなら色モードだけを独立して設定、変更 ができます。 ●スタートアップ処理 Ko-Window のプログラムはすべて、実行時はサーバーのプロセスとして、サーバー の STACK を用いて動作します。 Ko-Window のプログラムは、起動するとまず wlib 内部の初期化ルーチンへ飛びま す。これはアプリケーションのプロセスとして実行されます。ここではプロセスの不 要部分を切り落としたのち常駐終了します。 (1) wlib のスタートアップ処理 1. 各 clib のスタートアップ処理が行われる。 2. ヒープが必要ならば、領域を別のメモリブロックとして OS から確保する。 3. サーバーへプロセスの起動を告げる。 4. そのプロセスの HEAP, STACK を切り落として常駐終了する。 4の処理時に環境変数のコピー領域も切り落とします。Ko のプログラム内部から getenv が使用できないのはそのためです。 (2) サーバーからの呼び出し サーバーは、登録されたプロセスの _WindowMain を呼び出します。ここではじめて ユーザーのプログラムでの処理が行われることになります。 ------ 1994 09/01 初期版 1995 11/16 修正 小笠原博之 oga@dgw.yz.yamagata-u.ac.jp DenDenNET: DEN0006 COR.