X680x0 Ko-Window WSRV.X Version 2.24+14 追加関数の説明 Ko-Window v2.24 に対する +14 での各ライブラリへの追加および拡張関数一覧で す。(注意:一部暫定仕様が含まれています。) 1. wlib.a 1.1 描画バッファ設定関数 void DrawSetDot( buf, x, y, code ) ---------------------------------------------------------------------------- DrawBuf *buf; 描画バッファ int x, y; 座標 int code; 描画色 点を打ちます。描画色 code には ColorBlack(0):黒, ColorGray(1):灰色, ColorGraphic(2):透明(GRAPHIC), ColorWhite(3):白 が使えさらに OptionXor を 加えることができます。 ---------------------------------------------------------------------------- void DrawSetCircle( buf, x, y, rx, ry, code, option ) ---------------------------------------------------------------------------- DrawBuf *buf; 描画バッファ int x, y; 円の中心座標 int rx, ry; 横方向、縦方向の半径 int code; 描画色 int option; 描画オプション 円を描きます。描画オプション option には OptionLine (線), OptionFill (塗り 潰す), OptionShadow (影付き) の3つが指定できます。 描画色 code は OptionLine, OptionFill の場合にはカラーコード 0〜3 (OptionXor の指定可能) であり、 OptionShadow の場合は ShadowUp,ShadowDown のどちらかになります。(少々強引だが浮き沈みの円のつもり) ---------------------------------------------------------------------------- void DrawSetGraphicDot( buf, x, y, code ) ---------------------------------------------------------------------------- DrawBuf *buf; 描画バッファ int x, y; 座標 int code; 描画色(パレットコード) グラフィック画面に点を打ちます。 ---------------------------------------------------------------------------- void DrawSetGraphicCircle( buf, x, y, rx, ry, code, option ) ---------------------------------------------------------------------------- DrawBuf *buf; 描画バッファ int x, y; 座標 int rx, ry; 横方向、縦方向の半径 int code; 描画色(パレットコード) int option; 描画オプション グラフィック画面に円を描きます。option は OptionLine のみ指定可能です。 ---------------------------------------------------------------------------- void DrawSetSymbol( buf, x, y, str, attr, font ) ---------------------------------------------------------------------------- DrawBuf *buf; 描画バッファ int x, y; 座標 char *str; 表示文字列 int attr; 描画色、描画アトリビュート指定 int font; 描画フォントサイズ 文字列を指定します。従来の DrawSetSymbol と全く同じです。一部表示アトリ ビュートや使用できるフォントサイズが拡張されています。 attr はカラーコードで、以下の4種類あります。またそれぞれのコードに以下の属 性を OR することができます。 ColorBlack 黒(0) ColorGray 灰色(1) ColorGraphic グラフィック画面(2) ColorWhite 白(3) AttrHighLight ハイライト AttrReverse 反転 AttrMesh 網かけ AttrWhiteRev 白反転 AttrUnderLine アンダーライン(削除する可能性があります) AttrMesh2 網かけその2(名称変更または削除する可能性があります) デフォルトの表示属性は、wlib.h 内で AttrDefault として定義されています。こ れは ColorGray の反転 ( ColorGray|AttrReverse ) です。 font はフォントサイズを 8, 10, 12, 16, 24 の中から選びます。ただし 8dot の フォントを使う場合は、あらかじめ外部でフォントを組み込んでおく必要があります。 ---------------------------------------------------------------------------- 1.2 スクリーンモード関数 int WindowSetScreenMode( mode ) ---------------------------------------------------------------------------- int mode; スクリーンモード番号 現在の表示スクリーンモードを変更します。0〜7 を mode に指定することで表示 モードが切り替ります。標準状態で以下の8種類が定義されています。 (注意 display によっては使えないスクリーンモードがあります) 256x256, 384x512, 512x512, 768x512, 704x424, 1024x424, 1024x848, 800x526 (こぺるさんの SCRN を使うとより多くの画面モードに設定できるようになります) 戻り値は以前のスクリーンモード番号です。mode に -1 を与えた場合はグラフィッ クモードの再設定のみ行ないます。 なお、この関数は、利用者が任意の画面モードを選択できるようなアプリケーショ ンを作成する目的で存在します。よって特定の画面モードだけを使用するためにア プリケーションに組み込むことはできるだけ避けて下さい。 ---------------------------------------------------------------------------- int WindowGetScreenMode() ---------------------------------------------------------------------------- 現在の表示スクリーンモード(0〜7)を返します。 ---------------------------------------------------------------------------- int WindowGetScreenSize( hp, vp ) ---------------------------------------------------------------------------- int *hp; int *vp; 現在のスクリーンモードで、DISPLAY 上に見えている画面サイズを得ます。例えば デフォルトのスクリーンモード 3 の場合は、768 と 512 が hp, vp に返ります。 戻り値は現在のスクリーンモードです。 ---------------------------------------------------------------------------- unsigned short *WindowGetScreenTable( mode ) (マクロ) ---------------------------------------------------------------------------- int mode; スクリーンモード番号 サーバー内部の CRTC テーブルを読み出します。そのテーブル内容を再定義するこ とで、新たなスクリーンモードを作成し、使用することができます。 ---------------------------------------------------------------------------- 1.3 ウィンドウアトリビュートの獲得 int WindowGetAttr( wp ) ---------------------------------------------------------------------------- WindowID wp; 情報を得たいウィンドウのID ウィンドウのアトリビュート値を得ます。アトリビュートを設定する関数 WindowSetAttr() はあるもののその値を読み出せないため、IconifyOperation()等 で不都合が起こっていたのを改善するために追加しました。一見元からある関数の ように見えますが、WSRV.X v2.24+11.4 以降でしか使えないということに注意して 下さい。 ---------------------------------------------------------------------------- 1.4 変換ウィンドウ登録 void *WindowSetHenDsp( exec ) ---------------------------------------------------------------------------- void *exec; HENDSP のエントリ 変換ウィンドウの登録を行います。exec は HENDSP のエントリアドレスであり、 内部でベクタ設定を行います。戻り値は以前設定してあったエントリアドレスです。 この関数を使うには FEP CALL や DOS HENDSP に関する知識が必要になります。実 際の使用例は hendsp.win/henkan.win のソースリストを参照して下さい。 ---------------------------------------------------------------------------- 1.5 グラフィック画面表示オフセット関係 int WindowSetGraphicOffset( x, y, level ) ---------------------------------------------------------------------------- int x; 設定するオフセット座標X int y; 設定するオフセット座標Y int level; 設定固定レベル 256/65536色モードの場合、表示できるエリアは 512x512 dot に限られます。その 範囲をどの位置に取るかを設定します。x, y は設定する範囲の左上位置です。level は座標変更を行うプログラムの設定レベルです。level が、前に座標設定した場合 に使われたレベルより低い場合は、座標変更をすることができません。一般のアプ リケーションが呼び出す場合は、レベルは OffsetDefaultLevel でなければなりま せん。グラフィック座標管理を行うマネージャーは、OffsetManagerLevel を使いま す。OffsetManagerLevel で座標が (0,0) に固定されている場合は、一般アプリケー ションからの座標変更要求はすべて無視されますので、この時従来のウィンドウサー バーとまったく同じ動作をするようになり、互換性を保持できます。マネージャー による設定固定を解除する場合は、level を 0 にして呼び出して下さい。この時 x, y は無視します。座標変更を行った場合は TRUE を、変更する必要がなかった場合 は FALSE を返します。 ---------------------------------------------------------------------------- void WindowGetGraphicOffset( x, y ) ---------------------------------------------------------------------------- int *x; 現在のグラフィックオフセット座標X int *y; 現在のグラフィックオフセット座標Y 現在設定されているグラフィック範囲の開始座標を得ます。 ---------------------------------------------------------------------------- 1.6 マネージャー用システムエントリの設定 void *WindowSetManagerExec( type, page, arg ) ---------------------------------------------------------------------------- int type; パラメータ変更のためのエントリタイプ int page; パラメータ設定のページ番号 void *arg; 設定を行うパラメータ この関数はサーバー機能の一部を乗っ取り、ウィンドウマネージャーの働きを拡張 するために設定されたものです。与えるルーチン内容はサーバー自体の処理内容に 大幅に依存し、この関数を使うためにはそれなりの知識を必要とします。この関数 で追加した処理エントリは、サーバーが終了するまでメモリ上に存在していなけれ ばなりません。そのためアプリケーションはプロセスが外部からの Signal によっ て解除されないように作る必要があります。arg が NULL の時は何もしません。戻 り値は以前のエントリ内容の値です。 ---------------------------------------------------------------------------- 1.7 隠し関数 wlib.h に書かれているものの func.doc に説明のないサーバーコール関数です。 int WindowPaletInit() ---------------------------------------------------------------------------- 現在のモードでグラフィックパレットをシステム初期値に初期化します。この関数 は WindowSetGraphicMode() らと同時に追加されましたが恐らくマニュアルへの記 述漏れだと思われます。ヘッダの定義では int の戻り値を持ちますが実際は戻り 値はありません。 ---------------------------------------------------------------------------- int WindowLoadExec( exec, cmdline, env, put ) ---------------------------------------------------------------------------- char *exec; 実行するコマンドのプログラム名 char *cmdline; コマンド行 char *env; 環境ポインタ void (*put)(); 出力関数 exec で渡された外部コマンドを実行します。ウィンドウプログラム *.win を実行 する場合は必ず拡張子 .win まで付けた状態で呼び出して下さい。プログラムは内 部でパス検索をします。環境ポインタが NULL の場合は親の環境がそのまま引き継 がれます。ウィンドウプログラム *.win を実行する時は、put は必ず NULLでなけ ればなりません。外部コマンド .x や .r を実行する場合は、出力関数の定義が必 要です。プログラムの実行において、画面出力が必要になった場合はこの出力関数 が1文字毎に呼び出されます。この出力関数は毎回定義するのたいへんであるため、 通常次の2つの方法が良く用いられます。 コンソールに出力する : put に corlib.h の ConsoleChar を与える 表示出力を無視する : 何もしないダミー関数を定義してそれを与える ただし、Command.win にある run コマンドのように、一時的に Ko-Window を終了 した状態で起動する場合はこの put の定義は不要です。NULL を与えて下さい。そ の run コマンドを実現するには、WindowLoadExec() を WindowScreenQuit() と WindowScreenInit() で囲みます。戻り値はプロセス終了コードです。 - - - - - 使用例 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - WindowLoadExec( "kf.win", "-d", NULL, NULL ); [コンソールに出力する例] #include WindowLoadExec( "ls.x", "*.c", NULL, ConsoleChar ); [ダミー関数を与える例] static dummyexec(){} WindowLoadExec( "ls.x", "*.s", NULL, dummyexec ); [runコマンドの例] WindowScreenQuit(); WindowLoadExec( "COMMAND.X", "", NULL, NULL ); WindowScreenInit(); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ---------------------------------------------------------------------------- ProcessInfo *WindowGetProcessInfo( pid ) ---------------------------------------------------------------------------- int pid; プロセス番号 Ko-Window のプロセス番号から、それぞれのプロセスの管理テーブルへのポインタ を得ます。存在しないプロセステーブルの番号を与えた場合は NULL を返します。 その番号の Ko-Window プロセスが起動されているかどうかは ProcessInfo のメン バ PSP が NULL であるかどうかを調べることでわかります。 ---------------------------------------------------------------------------- int WindowSetParameter( id, args, arg ) ---------------------------------------------------------------------------- int id; ファンクションID int args; 引数の数 void *arg; 引数並びへのポインタ ライブラリ内部で使用されている特殊な関数です。直接ファンクションIDを使用し たサーバーコールを行います。ただしすべてのサーバーコールがライブラリ化され ている以上、この関数をユーザーが使用する必要性は全くありません。 ---------------------------------------------------------------------------- 2. parts.a 2.1 拡張キー入力関数 Input 関数を修正し、2バイト半角対応や行編集機能の拡張を施してあります。 int InputKey( buf, input, keycode, shift ) ---------------------------------------------------------------------------- DrawBuf *buf; 描画バッファ InputClass *input; Input構造体 int keycode; キーコード int shift; シフトキーの状態 キー入力処理をし、input 構造体ないの状態を更新します。その際の描画手続きを 描画バッファに格納し、消費した描画バッファ数を返します。keycode, shift は EventInfo のメンバ KeyCode, ShiftStat を設定します。行入力の際に行編集が可 能です。 Normal Mode (ED.X) Emacs Mode 機能 --------------------------------------------------------------- [CTRL]+[a]|[↑] [CTRL]+[p] 単語左移動 [CTRL]+[b]|[CLR] [CTRL]+[g] 行頭/行末移動 [CTRL]+[d]|[→] [CTRL]+[f] 右移動 [CTRL]+[f]|[↓] [CTRL]+[n] 単語右移動 [CTRL]+[g]|[DEL] [CTRL]+[d] 文字削除 [CTRL]+[h]|[BS] [CTRL]+[h] 後退削除 [CTRL]+[k] [CTRL]+[k] カーソル以後削除 [CTRL]+[o]|[INS] [CTRL]+[o] 挿入切り替え [CTRL]+[p] [CTRL]+[e] 行末へ [CTRL]+[q] [CTRL]+[a] 行頭へ [CTRL]+[s]|[←] [CTRL]+[b] 左移動 [CTRL]+[u]|[HOME] [CTRL]+[u] 行クリア [CTRL]+[v] [CTRL]+[q] コントロール文字入力 [CTRL]+[_][e] [CTRL]+[_][X] モード変更 Emacs モードに切り替えるには、[CTRL]+[_] を押したあと小文字の 'e' を押し て下さい。[CTRL]+[_] を押した後 'e' 以外の文字を打てば Normal モードに戻り ます。カーソルキーによる操作は両モード共通です。 環境変数「KOWINKEY」によってデフォルトのモードを設定しておくことができます。 KOWINKEY の内容 意味 --------------------------------------------------------------- 未定義 Normal Mode (ED.X バインド) ed Normal Mode (ED.X バインド) emacs Emacs Mode ied 強制 Insert Normal Mode (ED.X) iemacs 強制 Insert Emacs Mode <例> set KOWINKEY=iemacs 強制 Insert 設定にしておくと、[INS]キーの LED 状態に関係なく常に挿入状態 になります。 ---------------------------------------------------------------------------- int InputGetMode() (MACRO) ---------------------------------------------------------------------------- キー入力モードの状態を調べます。返り値が TRUE なら Emacs Mode で、そ れ以外なら Normal Mode です。 ---------------------------------------------------------------------------- 2.2 2バイト半角対応用関数 ライブラリの2バイト半角文字に対応に伴い、それに使用した以下のサービスルー チンを公開します。 int KanjiIsDbcs( code ) ---------------------------------------------------------------------------- int code; 文字コード 与えた文字が2バイト文字の1バイト目に相当するなら TRUE そうでなければ FALSE を返します。(XC の iskanji() と違って、2バイト半角も含まれます) ---------------------------------------------------------------------------- int KanjiStrlen( str ) ---------------------------------------------------------------------------- char *str; 文字列 2バイト半角対応の strlen() です。見掛け上の文字数を求めます。 ---------------------------------------------------------------------------- int KanjiTestPosition( str, cur ) ---------------------------------------------------------------------------- char *str; 文字列 int cur; 調べる位置 文字列 str の cur バイト目が、全角文字の2バイト目かどうか調べます。もし 2バイト目なら TRUE、文字の切れ目として正常なら FALSE を返します。(curは 1から数えることに注意) ---------------------------------------------------------------------------- int KanjiTestCode( str, cur ) ---------------------------------------------------------------------------- char *str; 文字列 int cur; 調べる位置 文字列 str の cur バイト目を調べます。もし漢字の1byte目なら 1, 漢字の2byte 目なら 2, それ以外なら 0 を返します。 ---------------------------------------------------------------------------- int KanjiGetPosition( str, cur ) ---------------------------------------------------------------------------- char *str; 文字列 int cur; 調べる位置 文字列 str の cur バイト目までが、見掛け上何文字に見えるかを返します。 ( KanjiGetPosition( str, -1 ) とすると、KanjiStrlen( str ) と同じ働きをし ます) ---------------------------------------------------------------------------- 3. winop.a 3.1 アイコンマネージャ用サービスルーチン アイコン化ルーチン IconifyOperation(), IconMouseOperatoin() を拡張し、ウィ ンドウマネージャが外部から介入できるようになりました。  アイコンマネージャーは共有領域に "IconManExec" という名前で IconMan という 構造体を確保しておかなければなりません。もし、"IconManExec" が定義されてい なければこれらの関数は従来とまったく同じ動作をします。 typedef struct _Iconstruct { WindowID (*iconifyexec)( WindowID, int, int, int (*)(), int*, int* ); int (*iconmouseexec)( WindowID, EventInfo*, int* ); int x, y; } IconMan; IconManExec で定義した領域には、上記のように動作関数へのポインタを2つ設定 しておかなければなりません。 以下はアイコンマネージャー側のルーチン例です。 - - - sample program - - - - - - - - - - - - - - - - - - - - - - - - - - - - - /* このルーチンは、アプリケーションで IconifyOperation() を呼び出した時 に呼ばれます。wp, h, v, exec は、IconifyOperation() への引数そのまま です。 完全にこのルーチンを乗っ取る場合は、アイコン化を全部自前で処理し アイコンウィンドウの WindowID を return して下さい。 *px, *py は、アイコンを開くべく位置が入ってきます。この値を書き換 えて return FALSE すると、その位置にアイコンが開きます。 なにもせずただ return FALSE すると、従来のアイコンとまったく同じに なります。 */ IconifyExec( wp, h, v, exec, px, py ) WindowID wp; int h, v; int (*exec)(); int *px, *py; { return FALSE; } /* このルーチンは、IconMouseOperation() を呼び出した時に呼ばれます。 wp, info は、IconMouseOperation() の引数そのままです。 完全に乗っ取る時は、自前で処理して return TRUE して下さい。 *f に TRUE を代入してから return FALSE すると、戻すウィンドウ位置を、 現在のアイコン位置に修正しません。 *f を操作しないでそのまま return FALSE すれば、現在のアイコン位置に、 元のウィンドウを移動して戻します。 */ IconMouseExec( wp, info, f ) WindowID wp; EventInfo *info; int *f; { *f= TRUE; return FALSE; } IconManagerInit() { IconMan *ip; if( !WindowGetCommon( "IconManExec", 0 ) ){ if( ip= WindowGetCommon( "IconManExec", sizeof(IconMan) ) ){ ip->iconifyexec= IconifyExec; ip->iconmouseexec= IconMouseExec; } }else{ /* 他のアイコンマネージャがすでに存在する */ } } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --- 1995 2/11 1995 11/25 +14 での変更部分を追加 小笠原博之 oga@dgw.yz.yamagata-u.ac.jp DenDenNET: DEN0006 COR. :vi:se ts=8 sw=8: