前へ | 次へ | 目次 | 索引 |
この節では,漢字端末エミュレータのプログラミングに関する情報を説明します。
4.4.1 変更および拡張
この項では,漢字端末エミュレータに対して行われた変更と拡張について説明します。
4.4.1.1 ReGIS 入力カーソル
漢字端末エミュレータは,十字,ラバーバンド線,菱形,ラバーバンド矩形という入力カーソルをサポートしています。これらのカーソルを選択するには,S(C(In ))コマンドを使用します。 表 4-4 に n の値を示しています。
カーソルの形 | 変数 n |
---|---|
十字線 | 省略 |
十字線 (省略時の設定) | 0 |
菱形 | 1 |
十字線 | 2 |
ラバーバンド線 | 3 |
ラバーバンド矩形 | 4 |
n が 1 に等しい場合の菱形以外のものについては, SYS$LIBRARY:DECW$CURSOR.H ファイル内に定義されている数値の 1 つとして論理名 DECW$DECTERM_REGIS_CURSOR を定義してください。 |
漢字端末エミュレータでは,次のページ移動用エスケープ・シーケンスを実行することができます。
NP <CSI> Pn U Next Page (次ページへ) PP <CSI> Pn V Previous Page (前ページへ) PPA <CSI> Pn P Page Position Absolute (ページ位置絶対) PPB <CSI> Pn R Page Position Backward (ページ位置逆方向) PPR <CSI> Pn Q Page Position Relative (ページ位置相対) |
"Pn" は移動するページ数ですが, PPA の場合は実際のページ番号であることに注意してください。
漢字端末エミュレータではカーソル・カップリングをサポートしていません。カーソルは常に現在のページ(表示ページ)に拘束されます。 |
漢字端末エミュレータでは, DECCRA (Copy Rectangular Area --- 方形領域複写) シーケンスに対するサポートには制限があります。一度に複写できるのはページ全体だけで,複写下のページも複写先のべーじも現在のページでなければなりません (たとえば,画面外のページを別のページに複写することはできません)。
4.4.1.4 DECLFKC シーケンス
漢字端末エミュレータには F5 (Break)キーを再定義するためのユーザ・インタフェース機能がありません。したがって,変更するキーを選択するために"0" (all keys)が使用されると, DECLFKC (Local Function Key Control --- ローカル・ファンクション・キー制御) シーケンスが F5 キーを再定義します。
4.4.2 修正事項
以前のバージョンではエラーになり,回避策を必要とした漢字端末エミュレータ・アプリケーションに固有の問題の解決について,次に説明します。
4.4.2.1 CREATE/TERM/WAIT SHOW PROCESS はもうSYS$INPUTを混乱させない
V1.2--6
コマンド・プロシージャからCREATE/TERMINAL/WAIT SHOW PROCESSコマンドを発行しても,もうSYS$INPUTの定義を混乱させることはありません。
4.5 DECTPU for DECwindows Motif
この節では,DECTPU for DECwindows Motif のプログラミング情報について説明します。
4.5.1 問題点と制限事項
DECTPU for DECwindows Motifに関する既知の問題点と制限事項について,次に説明します。
4.5.1.1 小さなディスプレイ・モニタとDECTPU
V1.0
小さなディスプレイ・モニタ上でDECTPU for DECwindows Motif を実行している場合,メイン・ウィンドウが完全には表示されないことがあります。
この状態を解決するには,次の手順に従います。
Tpu.Tpu$MainWindow.X: 0 Tpu.Tpu$MainWindow.Y: 0 Tpu.Tpu$MainWindow.Rows: 21 Tpu*condensedFont: on Tpu*fontSetSelection: 1 |
$ DEFINE TPU$DEFAULTS SYS$LOGIN:EVE_SMALL_WINDOW.DAT $ EDIT/TPU/INTER=DECWINDOWS LOGIN.COM |
この節では,DEC によるMotif ツールキットの拡張に関する情報を説明します。
4.6.1 変更および拡張
Motif に対する DECwindows の拡張に対して行われた変更と拡張について,次に説明します。
4.6.1.1 SVN ウィジェットによる拡張選択のサポート
SVN (Structured Visual Navigation) ウィジェットでは,現在,ユーザは Shift+下向き矢印のキー・シーケンスを使用して,選択の範囲を拡張することができます。この変更は,サンプル・プログラムのSVNMSAMPLE.Cに対しても適用されます。
4.6.1.2 DXmCSText 入力方式のサポート
X11 R5 の入力方式サポートが DXmCSText ウィジェットに追加されました。ベンダ・シェルの XmNinputMethod リソース・ファイルを使用して,入力方式を指定します。しかしながら,旧バージョンとの互換性を維持するために,既存の入力方式のリソース DXmNinputMethod および DXmNinputMethodType も残されています。
4.6.2 問題点と制限事項
Motif に対する DECwindows の拡張に関する既存の問題点と制限事項について,次に説明します。
4.6.2.1 DXmFormSpaceButtonsEquallyの制限
ウィジェットやガジェットがXmLabelまたはXmLabelGadgetのいずれかのサブクラスを持っている場合は, DXmFormSpaceButtonsEqually (便宜ルーチン)がすべて平等にそのサイズとスペースを決定します。しかし,ウィジェットやカジェットが XmLabelまたはXmLabelGadgetのサブクラスではない場合は,結果は不確定です。
4.6.2.2 水平方向のライブ・スクロールをサポートしていないSVNウィジェット
水平方向のライブ・スクロールは, SVN ウィジェットではまだサポートされていません。
4.6.3 修正事項
以前のバージョンではエラーになり,回避策を必要とした Motif に対する DECwindows の拡張に固有の問題の解決について,次に説明します。
4.6.3.1 DXmSvnAddEntriesの後のDXmSvnDeleteEntriesの呼び出し
DXmSvnAddEntriesルーチンを呼び出したのち, DXmSvnDeleteEntriesルーチンを呼び出しても,もう関連するアプリケーションがクラッシュすることはありません。
4.7 ディスプレイ・サーバの拡張
この節ではディスプレイ・サーバの拡張に関する情報を説明します。
4.7.1 変更および拡張
ディスプレイ・サーバの拡張に対して行われた変更と拡張について,次に説明します。
4.7.1.1 共有メモリ拡張サポート (Alpha のみ)
V1.2
OpenVMS Alpha システムでは,共有メモリ拡張サポートで,メモリ上の XImageを共有することが可能になります。 XImage インタフェースのこのバージョンでは,実際のイメージデータは共有メモリ・セグメントに保管されます。この結果,イメージは Xlib のプロセス間通信チャネルを移動する必要がなくなります。大きなイメージでは,この拡張の使用により動作性能を格段に向上させることが可能です。
pixmap に対する共有メモリのサポートも提供されています。共有メモリ上の pixmap は,共有メモリ・セグメント内の X サーバ指定のフォーマットによる 2次元のピクセル配列で,イメージ・データはここに保管されます。共有メモリ上の pixmap の使用によって,これらの pixmap の内容を Xlib のルーチンを使用することなく変更することができます。
Xlib のルーチンは,クライアント側の拡張ライブラリに含まれています。このライブラリとのリンクについての詳細は,
第 4.7.1.4 項 を参照してください。
4.7.1.1.1 共有メモリの拡張の使用法
共有メモリ拡張を使用するコードには,次のヘッダ・ファイルが含まれていなければなりません。
# include "DECW$INCLUDE:Xlib.h" # include "DECW$INCLUDE:shm.h" # include "DECW$INCLUDE:XShm.h" |
共有メモリ拡張を使用するコードはすべて,まず最初にそのサーバが拡張を提供しているか確認します。ネットワーク間で実行する場合など,ときには正常に拡張できないこともあります。
共有メモリ拡張が使用可能かどうかを確認するには,次のルーチンのいずれかを呼び出します。
Status XShmQueryExtension (display) Display *display |
Status XShmQueryVersion (display, major, minor, pixmaps) Display *display; int *major, *minor; Bool *pixmaps |
次の一覧表はそれぞれの引数およびその説明です。
引数 | 説明 |
---|---|
display | 現在のディスプレイ。
共有メモリ拡張が使用できる場合,各関数からの戻り値は True です。それ以外の場合は,そのプログラムは通常の Xlib の呼び出しを使用して実行します。 |
major | 拡張実施の主なバージョン番号。XShmQueryVersion によって返されます。 |
minor | 拡張実施の低位のバージョン番号。 XShmQueryVersion によって返されます。 |
pixmap | 共有メモリ上のpixmap の場合は,True です。 |
共有メモリ上の XImage の作成法とその使用法の手順を次に説明します。
以降では,この操作について順を追って説明します。
ステップ 1 --- 共有メモリ上での XImage 構造体の作成
共有メモリ上に XImageを作成するには,次のフォーマットを持つ XShmCreateImage ルーチンを使用します。
XImage *XShmCreateImage (display, visual, depth, format, data, shminfo, width, height) Display *display; Visual *visual; unsigned int depth, width, height; int format; char *data; XShmSegmentInfo *shminfo; |
引数の多くは XCreateImage の場合と同じです (XCreateImage に関する説明は『X Window System』を参照してください)。これらの数値はサーバによって設定され,ユーザ側のコードはこれに従う必要があります。すでに割り当てられた共有メモリ・セグメントがある場合 (ステップ 2 を参照) を除いて, data ポインタには NULL を引き渡します。
引数 shminfo は XShmSegmentInfo タイプの構造に対するポインタです。この構造体は,共有メモリ XImage 使用中はアロケートされている必要があります。この構造体は XShmCreateImage を呼び出す前に初期設定をする必要はありません。
正常に終了した場合は,XImage 構造体が返されて,次のステップに進むことができます。
XImage はどの程度のメモリを割り当てるべきか指示する情報を返します。したがって,共有メモリ・セグメントの作成は,XImage を作成した後で行います。
このセグメントの作成方法は,次の例で示します。
shminfo.shmid = shmget (IPC_PRIVATE, image->bytes_per_line * image->height, IPC_CREAT|0777); |
この例は,共有メモリ上の XImage 構造体が作成されていることを前提としています。戻り値が 0 の場合は共有メモリの割り当てが失敗したことを表します。 XImage の作成に使用した width ではなく, bytes_per_line フィールドを使用してください (これらの値は異なる場合もあります)。
システムが返す共有メモリID は, shminfo 構造体に保管されることに注意してください。サーバが共有メモリ・セグメントに接続するには,この ID を必要とします。
次の例に示すようにして,共有メモリ・セグメントをプロセスに接続します。
shminfo.shmaddr = image->data = shmat (shminfo.shmid, 0, 0); |
shmatが返したアドレスは, XImage 構造体と shminfo 構造体の両方に保管されます。
共有メモリ・セグメントに対するサーバの接続形態を決め, shminfo.readOnly フィールドを次のように設定して, shminfo 構造体に対する引数の設定が完了します。
shminfo.readOnly = False; |
構造体を True に設定すると,サーバはこのセグメントを読むことができず, XShmGetImageの呼び出しは失敗します。
DECwindows Motif では,共有メモリ・セグメントのルーチンを提供しています。グローバル・セクションを使用したこれらのルーチンは, UNIX システムの共有メモリのルーチンをエミュレートします。 |
Step 4 --- サーバへの共有メモリ・セグメントについての通知
次の例に示すように,作成した共有メモリ・セグメントに接続することをサーバに通知します。
Status XShmAttach (display, shminfo); |
正常に終了した場合は 0以外の状態値が返されて,作成した XImage が使用可能となります。
共有メモリ上の XImage を X drawable に書き込むには, XShmPutImage ルーチンを使用します。 XShmPutImage ルーチンは次のフォーマットを使用します。
XShmPutImage (display, d, gc, image, src_x, src_y, dest_x, dest_y, width, height, send_event) Display *display; Drawable d; GC gc; XImage *image; int src_x, src_y, dest_x, dest_y; unsigned int width, height; Bool send_event; |
このインタフェースは, send_event というパラメータが追加されていること以外は, XPutImage ルーチン ( 『X Window System』を参照)と同じです。 send_eventパラメータが True として渡されると,サーバはイメージ書き込みが完了した時点で,完了イベントを生成します。これによってプログラムは,共有メモリ・セグメントの操作を再開しても安全となるタイミングを知ることができます。
この完了イベントのタイプは,次のように定義される XShmCompletionEvent です。
typedef struct { inttype; /* of event */ unsigned long serial; /* # of last request processed */ Bool send_event; /* true if came from a SendEvent request */ Display *display; /* Display the event was read from */ Drawable drawable; /* drawable of request */ int major_code; /* ShmReqCode */ int minor_code; /* X_ShmPutImage */ ShmSeg shmseg; /* the ShmSeg used in the request */ unsigned long offset; /* the offset into ShmSeg used */ } XShmCompletionEvent; |
実行時にイベント・タイプの値を調べるには,次の例で示す XShmGetEventBase ルーチンを使用します。
int CompletionType = XShmGetEventBase (display) + ShmCompletion; |
完了イベントの到着前に共有メモリ・セグメントを変更すると,結果が一定しない場合があります。 |
イメージ・データを共有メモリ上の XImage に読み込むには, XShmGetImage ルーチンを使用します。このルーチンには次のフォーマットが使用されています。
Status XShmGetImage (display, d, image, x, y, plane_mask) Display *display; Drawable d; XImage *image; int x, y; unsigned long plane_mask; |
引数の一覧とその説明を次の表にまとめます。
引数 | 説明 |
---|---|
display | interest の表示。 |
d | drawable のソース。 |
image | XImage のリンク先。 |
x | drawable のソース内の X-offset。 |
y | drawable のソース内の Y-offset。 |
plane_mask | 読み込まれるプレーン。 |
共有メモリ上のXImage を破壊するには,最初に共有メモリを切り離すことをサーバに指示した後で,共有メモリ・セグメントそのものを破壊します。次の例が,共有メモリ上の XImage を破壊する方法です。
XShmDetach (display, shminfo); XDestroyImage (image); shmdt (shminfo.shmaddr); shmctl (shminfo.shmid, IPC_RMID, 0); |
前へ | 次へ | 目次 | 索引 |