ウインドウシステム プログラマーズマニュアル version 2.23 Copyright T.Kobayashi 1991.5.3  ウインドウシステムでは複数のアプリケーションプログラムが一つのディスプレイ を使って同時に実行されるため、すべてのアプリケーションがスムーズに動くために は、あらかじめ決めておかなければならない約束事がいくつか存在します。以下にそ れらを示します。  当然、このマニュアルができる以前に流通していたアプリケーションはこの約束を 守っていません。ユーザはそれを考えて使用してください。また、アプリケーション 作者は、これに対応したバージョンを配付してもらえると幸いです。(以下の項目の 2.ユーザイベントと4.グラフィックが最も問題となると思います。)  今後も、流通しているアプリケーションの実情や、ウインドウサーバ自体のバージ ョンアップによりこのマニュアルの項目が増える可能性は十分にあります。ただ、そ の時には現在との互換性は考慮し、その時点での流通アプリケーションの書き換えは しなくても良いようにするつもりです。 1.クリップボード  クリップボードの処理は共有領域で行います。名前は "Clip Board" です。ク リップボードに文字列を設定する場合プログラム中での記述は次のようになりま す。 WindowResetCommon( "Clip Board" ); p = WindowGetCommon( "Clip Board", len ); if ( p != NULL ) strcpy( p, clipstr ); ここで、len はクリップボードに入れる文字列の長さ+1を指定します。p は確 保した共有領域へのポインタで、ここに文字列をコピーします。もし共有領域が 確保できなかった時は p に NULL が入ります。チェックしてエラーを出してく ださい。  クリップボードにある文字列を参照する場合は次のようにします。 p = WindowGetCommon( "Clip Board", 0 ); これでクリップボードの文字列へのポインタが p に入ります。クリップボード が設定されていない時は NULL が入ります。  クリップボードをクリアしたい時は次のようにします。 WindowResetCommon( "Clip Board" ); 2.ユーザイベント  従来は FINDER からのファイル名の受け渡しのみに使用していたユーザイベン トですが、今後他の用途にも使用できるように、受け渡しの仕様を決定します。  EventInfo 構造体のメンバ int ComData ; void *ComBuffer ; がユーザイベントに使用されます。 ComData は受け渡すデータの種類を、ComBuffer は実際のデータを設定します。 データの種類と ComData は現在のところ次のものがあります。 ComData データの種類 ComBuffer 0 ペースト 共有領域 "Clip Board" へのポインタ 1 単一文字列 文字列へのポインタ 2 複数文字列 文字列へのポインタ配列の先頭番地 ポインタ配列の最後は NULL を入れます。 3 パターンデータ 構造体 Sheet へのポインタ  今後、これとは異なったデータ構造を受け渡す必要が生じた時は ComData に 次々と数字を割り当る予定です。 3.起動時オプション  各アプリケーションプログラムはウインドウの位置、大きさを決める起動時オ プションを解釈しなければなりません。 -x ウインドウのX座標を指定します。 -y ウインドウのY座標を指定します。 -h ウインドウのX方向の大きさを指定します。 -v ウインドウのY方向の大きさを指定します。  これらのオプションの解釈のために WINOP.A の中に AnalyzeArgs 関数が定義 されています。( WINOP.DOC 参照 ) 4.グラフィック  グラフィックを使用するウインドウはアトリビュート WindowAttrGraphic16, WindowAttrGraphic256, WindowAttrGraphic65536 を指定しなければなりません。 これがないとウインドウを移動するとグラフィックが正しく表示されません。  また、起動時とウインドウがアクティブになった時に SetGraphicMode 関数で グラフィックモードを自分のモードに変更します。さらに、 EventGraphic イベ ントを受けて他のグラフィックモードに変更された時にそれに応じた処理をしま す。(違うモードの時はグラフィックを見えなくするのが自然でしょう)サンプ ルプログラム( GRAPH.WIN )のソースを参照してください。 5.設定ファイル WSRV.RC  各アプリケーションプログラムの初期設定は、従来は POPUP.RC のようにアプ リケーションごとに設定ファイルを用意していましたが、今後はすべて WSRV.RC の中で記述するようにします。 WSRV.RC の書式 !Wsrv .... .... ウインドウサーバ自体の設定の記述 .... !Commnad .... .... COMMAND.WIN の設定の記述 .... !PopUp .... .... POPUP.WIN の設定の記述 .... このように!の後にプログラム名を書くことによってどのプログラムの初期設定 かを区別します。  WSRV.RC は WSRV.X の起動時に読み込まれ、!の後に記述されている名前の共 有領域にそれ以降の記述が設定されます。(上の場合は共有領域 Wsrv, Command, PopUp に設定されます。)アプリケーションプログラムはこれらの共有領域から 初期設定の記述を得ます。この処理のために共有領域に設定された文字列から1 行や1ワードの文字列を切り出す関数が用意されています。CommonGetLine, CommonGetWord 関数です。詳細は WINOP.DOC や COMMAND.WIN POPUP.WIN のソー スを参照してください。 6.ファンクションキーの扱い  従来、ファンクションキーについては Human68k の設定のままのコードをイベ ント構造体に設定しましたが、アプリケーション間での扱いの違いなどの問題が あるため、今後はファンクションキーが押された時はウインドウサーバ内で特殊 コードに変換してイベント構造体に設定するようにします。特殊コードはイベン ト構造体の KeyCode のビット8から15を使用します。 ファンクションキーに対応する特殊コードは F1 - F10 : 0x8001 - 0x800A F11 - F20 : 0x800B - 0x8014 SHIFT + ファンクションキー F21 - F32 : 0x8015 - 0x8020 カーソルキーその他 のようになっています。とりあえずビット15だけ使用しましたが、将来他のビ ットを別の特殊記号に割り当てるかも知れません。  これにともなって WSRV.RC での KeyFile(キー定義ファイルの指定)は無視 されるようになりました。  PARTS.A の InputClass 関係のライブラリは、この特殊コードに対応していま す。 7.フリーメモリ  アプリケーションプログラム実行時に動的に確保できるフリーメモリには次の 3種類があります。  ・共有領域  ・アプリケーションのローカルなヒープ領域  ・ウインドウサーバのヒープ領域  共有領域は共有領域名でアクセスできるメモリ領域で、WindowGetCommon 関数 で確保、WindowResetCommon 関数で開放します。通常、アプリケーション間の通 信に使用しますが、単一のアプリケーションで使用するフリーメモリとしても利 用できます。共有領域はそれを確保したアプリケーションが終了してもその領域 は残ります。  ローカルなヒープ領域は通常の malloc 関数で確保、 free 関数で開放できる 領域で、確保したアプリケーションが終了すると開放されます。またプログラム の作成時にヒープ領域の大きさを大域変数 WindowHeapSize で指定しなければな りません。  ウインドウサーバのヒープ領域は WindowMemoryAlloc , WindowMemoryFree 関 数で確保、開放できる領域で、扱いはローカルなヒープ領域と同じですが、ウイ ンドウサーバ自体のヒープ領域から確保します。よって、プログラム作成時に、 ヒープ領域の大きさが確定できなくても使用できますが、ウインドウサーバ自体 のヒープ領域に限りがありますのであまり大きな領域は確保しないでください。 ウインドウサーバのヒープ領域はデフォルトで64Kバイトで通常のCのプログ ラムと同様に /heap: オプションで起動時に指定することができます。本来、こ の領域はアプリケーションが終了した時点でそのアプリケーションが確保してい た領域は自動的に開放されるべきですが、現在のバージョンではそのまま残って しまいます(単なる手抜きです)。よって確保したアプリケーションの責任で領 域を開放してください。また、アプリケーション終了してもメモリ領域に残って いることを利用したプログラムは書かないでください。(そのような場合は共有 領域を使用してください。)