X11 - みる会図書館


検索対象: 月刊 C MAGAZINE 1990年6月号
184件見つかりました。

1. 月刊 C MAGAZINE 1990年6月号

ウシステム 入門 00 ウイン、 この関数は , Widget を生成する XtCreat Widget の生成 eWidget 関数と , その生成した Widget を 親 Widget の認識させる XtManageChild 関 はじめは , 簡単な文字列表示のプログラ 数をまとめたものて、ある。この例て、は Label ムからはじめる。伝統の C プログラムの X Widget を生成している。そして , 生成さ TooIkit バージョンは , List1 のようになるだ れた Widget は , op 〃の子にされてい る。なお LabeI は , 文字列を表示する簡単 実際のプログラムは , たった 4 行しかな な Widget て、ある。 い。以下に , 各行を解説しよう。 ・ XtRealizeWidget 関数 ()1 行 ) は , 指定した ・ X TooIkit 環境の初期化 Widget を親にもつ全 Widget に相当するウ XtAppInitialize 関数 ()5 行 ) は ,X T001kit インドウを実際に作成する。つまりこの 環境の初期化を行っている。具体的には , 関数により , 画面にウインドウが表示さ X サーバとの接続とか , 基礎の Shell wid れるわけて、ある。 get の生成 , オプションの解析などがされ ・ XtAppMainLoop 関数 ()4 行 ) は , この例の る。ここて、生成した Widget は , このプロ 場合 , ただの繰り返しにすぎない。本当 グラムて、生成される全 Widget の親 Widget は , マウスの移動 , ボタンのクリックな どを待ち , 適切な処理を行うのだが , ・ XtCreateManagedWidget 関数 ()8 行 ) は , の例て、は , 表面に表れない。そして , Widget のインスタンスを生成し , これを れを実行すれば , Fig. 8 のようなウインド 25 行て、生成した親 Widget に管理させる。 ウが表示される。 Fig. 8 図 cmsl 凹 : C nagazine Fig. 9 図 cms2 凹 C nagazine quit cmsl.c List 1 コーレバックプロシージャ さて , 先ほどのプログラムてはただの繰 り返しだった 34 行は , 本当はイベント待ち の繰り返して、ある。つまり , プログラムは , 何かのイベントが発生すると , それに対応 する処理をしようとするだろう。このイベ ントに対応する処理を行うことを , コール バックと呼ぶ。それを使った例を List2 に示 す。この例は , List1 にわずかな変更を加え ただけて、あるが , 、、 quit" と表示されたボタ ンをクリックすると , プログラムが終了す るようになっている (Fig. 9 ) 。 main 関数て、は , 新たに 45 行および 50 行が 追加されている。 45 行が Command widget の生成て , 50 行がコールノヾックプロシーシ ャの登録てある。ここて生成した Command widget は , ListI て、使った Label widget から 派生した Widget て、あり , 文字列の表示 ( 大き さ , 位置なども含んだ ) にすることに加え , マウスポタンのクリックに対するコールノヾ 特集最新ウインドウシステム入門 71 * * 単に " C magaz i ne " と表示するだけのプログラム (cms 1. c) 2 : 3 : 4 : / * Xt lntrinsic 関係の定義 * / 5 : #include く X11/Intrinsic. h> 6 : #include く X11/StringDefs. h> / * 文字列関係の定義 * / 7 : / * LabeI widget の定義 * / 8 : #include く X11/Xaw/LabeI. h> 9 : 11 : / * 伝統の C プログラムの X T001 k i t バージョンの実装例 * / 13 : int 14 : main(argc, argv) / * ただの ma i n 関数 * / 15 : int argc; 16 : char* argv[]; / * w i dget を保持するための W i dget 型変数とアプリケーションコンテクストを * / / * 保持するための XtAppContext 型変数を宣言する 20 : Widget top; 21 : XtAppContext app ; 22 : 23 : / * 基礎になるウインドウに相当する widget を生成する * / 24 : NU しし 0 , &argc, argv) : t0P ー XtAppInitiaIize(&app, 25 : OOPS 26 : / * 文字列を表示するし abel widget を生成し , widget "top" に管理させる * / (void)XtCreateManagedWidget(" C magazine の : 28 : IabeIWidgetClass, top, NUL し , 29 : / * こまでの widget "top" の設定を実現し , 実際にウインドウを生成する * / 30 : XtRea ⅱ zeWi dget (top) : 32 : 33 : / * イベント処理のための無限ループを実行する * / 34 : XtAppMainLoop(app) :

2. 月刊 C MAGAZINE 1990年6月号

ウが表れる ( Fig. 13 ) 。そして , 時計のウィ ンドウの下部の、、 OK(exit)" をクリックす れば , プログラムは終了する。さらに , 時 計のウインドウが表れると同時に , ウイン ドウの *quit" および "clock" ボタンの表 示が薄くなり , イベントに反応しなくなっ ていることにも注意してほしい プログラムの大部分が , List2 の流用て、あ る。変更は , 新たに Command widget を生 成し ( 108 , 109 行 ) , clock 関数 ( 32 ~ 75 行 ) を そのコールバックプロシージャとして登録 した ( 115 行 ) ことて、ある。 関数 clock は , quit 関数よりは複雑な処理 をしている。まず , 44 , 45 行て , $quit" お よび clock 〃ボタンを無効状態 (lnsensitive) にしている。その指定は , XtSetSensitive 関 数の第 2 引数て行い , TRUE が有効 (Sensi tive) , FLASE が無効 (lnsensitive) て、ある。 また現在の状態は x Sentit ⅳ e 関数て、得られ List 3 8 0 1 ・ワ 3 っ 0 -4 戸 0 々ー 8 0 1 画っ 0 ・ 4 ・ - 識・ - -0 0 戸 0 - -0 ド 0 0 - -0 - -0 戸 0 戸 0 C•D ^ 0 C•O / * コマンドボタンに相当する Command ⅵ dget を生成し * / / * widget "frame" に管理させる commandWidgetCIass, frame, NU しし , の : command = XtCreateManagedW idget ( " qui t / * 関数 quit を widget "command" のコールバックプロシージャとして登録する * / / * コマンドボタン "command" ( qu it と表示しているウインドウのこと ) をマウス * / / * でクリックすれば , このプログラムは終了する XtAddCallback(command, XtNcallback, quit, NU しい : ーまでの w idget "top" の設定を実現し , 実際にウインドウを生成する * / / * こ XtRea IizeWi dget (tOP) : / * イベント処理のための無限ループを実行する * / XtAppMainLoop (app) : cms4. C LiSt 4 2 : 3 : 4 : 5 : #include く stdio. h> 6 : / * Xt lntrinsic 関係の定義 * / #include く X11/Intrinsic. h> 7 : / * 文字列関係の定義 * / 8 : #include く X11/StringDefs. h> / * ShelI widget の定義 * / #include く X11/SheII. h> 9 : 10 : / * BOX widget の定義 * / 11 : #include く X11/Xaw/Box. h> / * CIOCk widget の定義 * / #include く X11/Xaw/Clock. h> 12 : / * Command widget の定義 * / 13 : #include く X11/Xaw/Command. h> / * し abel widget の定義 * / #include く X11/Xaw/ し abel. h> 14 : 15 : 16 : を使った簡単なプログラムの実装例 * / 17 : / * popup 19 : / * widget の Sensitive の変更のため , これらは大域変数として宣言する * / 20 : static Widget commandl, command2; 21 : 22 : VO i d 23 : quit(widget, clientdata, calldata) / * コールバックプロシージャ quit 関数 / * この関数は , Command widget "commandl" の * / 24 : Widget widget; / * コールバックにより I ntr i n s i cs が呼び出す * / 25 : XtPointer clientdata, ca 日 data : / * 引数を無視し , 単にプログラムを終了する * / XtDestroyAppIicat ionContext (XtW idgetTOApp licat ionContext (widget) ) : 28 : exit( の : 29 : 32 : VO i d 33 : clock(widget, clientdata, calldata)/* コールバックプロシージャ clock 関数 / * この関数は , Command widget "command2" の * / 34 : W i dget w idget; / * コールバックにより lntrinsics が呼び出す * / 35 : XtPointer clientdata, calldata; 36 : { Arg args[5] ; 38 : Widget popup, frame, command; 39 : POS i t i on X, y : 40 : Dimension width, height; / * 元のウインドウの command widget の SensitivitY を * / 42 : / * lnsensitive( 無効状態 ) にする 43 : XtSetSensitive(command1, FALSE) : 44 : XtSetSensitive(command2. FALSE) : 46 : / * ポップアップウインドウの座標を基のウインドウの座標および大きさから得る * / XtSetArg (args [ 0 ] , XtNwi dth, &w idth) : XtSetÅrg(args[1], XtNheight, &height) : 49 : XtGetVaIues (widget, args, 2 ) : ・ ' clock " ボタンをクリックすると時計を表示するプログラム (cms4. c) Fig. 12 図 cms4 凹 nagazine quit clock Fig. 13 図 cms4 凹 C nagazine 甲し 国 clock OK( exi し ) 74 CMAGAZINE 1990 6

3. 月刊 C MAGAZINE 1990年6月号

シャープ X グトプ 0 「 m on from (ompiler ma 「 5 C C i 給「 PRO-68K Ver. 1 .01 これを行うことにより , TEST. プルプログラムを , List3 に掲載し A ポックスを描くには , C というファイルを実行するとき , ますのて、参考にしてください。な つねに 256K バイトのヒープサイズ 、、 TXBOX" を , ポックスフィル お , ポックスを消去するときは , を確保するようになります。 は , "TXFILL" を使います。サン "line style" を 0 にします。 ②実行時にヒープサイズを指定 プログラム中でメモリサイズを指定するサンプルプログラム 0 List1 のように•malloc" で大 コンパイルした実行ファイルを 1 : #include ” stdio. h ” きな領域のメモリを確保しようと 実行するときスイッチをつけてヒ 2 : #include "stdlib. h ” 3 : ープサイズを拡大することがてき しましたが , できませんでした。 4 : #define 引 ZE 200 * 1024 5 : どうしたらいいですか ? ます。 6 : main() [ 例 ] A>TEST /HEAP : 256k 8 : Char *ptr, *lmt; 9 : この指定をした実行時にだけ , ヒープサイズは初期値て 64K ptr = malloc( SIZE ) : printf( ”第 a Ⅱ oc ( ) = X6xHYn ” 256K バイトのヒープサイズを確保 ヾイトて、す。したがってヾ ma Ⅱ oc 〃 lmt = sbrk( SIZE ) : 12 : printf( "sbrk() 13 : て、確保て、きるメモリサイズもヒー します。 ptr = ma Ⅱ oc ( 引 ZE ) : 14 : printf( ”田 a 日 oc ( ) = X6xHYn ” . 3 プログラム中でメモリサイズ プサイズ内となり , 64K バイト以上 16 : } を指定する のエリアを確保しようとすると , C のメインプログラムの中て変数 NULL が返されメモリを確保する の宣言の後に "sbrk" 命令て、メモ ことがて、きません。 このヒープサイズを設定しなお リサイズを指定する 1 : #include "iocslib. h ” 2 : 例として List2 にサンプルプログ すことにより , 64K バイト以上のメ 3 : #define NUM 5 * 2 4 : #define N-WORD 16 モリサイズを確保することが可能 ラムを掲載します。 5 : #define OFFSET 20 6 : #define B し UE 0 て、す。メモリサイズを確保するに このプログラム実行中に , ヒー 7 : #define YB しし OW 1 8 : #define SO い D 0xffff は次の 3 つの方法があります。 プサイズを拡大します。このサン 9 : #define DOTTED 0xaaaa 10 : #define DOTTEDB 0X5555 ①コンイレ時に、 " スイッチ プルプログラムては , 64K バイト十 11 : #define DOTTED2 0xcccc 12 : #define ERASE 0 をつける 200K バイトのヒープサイズを確保 13 : 14 : int page[ NUM ] スイッチソ h 〃をつけることに しています。 16 : int xy[ NUM ] より実行時のヒープサイズを指定 17 : int xlyl[ NUM ] - 18 : int style[ NUM ] - することがて、きます。指定てきる 20 : ヒープサイズは , 最小値は 8K バイ 21 : main() ト , 最大値はメモリのサイズによ 23 : int i; 24 : struct TBOXPTR って変わります。 25 : struct TXPI しし PTR 26 : [ 例 ] A > CC/h256k TEST. C for ( i = 0 : i く NUH; i + + ) { 27 : tbOX. vram-page : page [ i ] : 28 : tbox. x = xy[ i ] * N-WORD; 29 : tbox. y = xy [ i ] * N WORD : 30 : tbox. xl = xlyl[ i ] * N-WORD: tbox. yl = xlyl[ i ] * N-WORD; 32 : tbox.l ine-style = style[ i ] : 33 : TXBOX ( &tbox ) : 34 : 35 : for ( i : 0 : i く NIJM; i + + ) { 36 : tfill. vram_page = page[ i ] : / * テキストのページ * / tfill. x = ( xy[ i ] + OPPSET ) * N_WORD;/* 始点 X 座標 * / 38 : tf i 日 . y = xy [ i ] * N_WORD : / * 始点 Y 座標 * / 39 : tfill. xl = xlyl[ i ] * N_WORD; / * 最終点までの X の長さ * / 40 : tfill. yl = xlyl[ i ] * N-WORD; / * 最終点までの Y の長さ * / 41 : tfill. fill_patn = style[ i ] : 42 : / * フィルバターン * / TXPI しし ( &tf i Ⅱ ) : 43 : 44 : 45 : } Q&A List 2 ptr ) : lmt ) : = X6xHYn ” ptr ) : TXBOX と TX 日 LL を使ったサンプルプログラム List 3 0 0 ーしーリ ーレーし ↑ー甲ー , 0 ↑・ ーしーレっ 0 , っ 0 ↑ーじ ↑ー↑ー 0 0 , 0 ↑ー ーしーし 8 《 8 0 0 , 00 0 ーーしーレ ・ 8 い 0 《 0 し《 0 ・《 0 1 よ 00 《 0 . し′ 0 0 【し 0 c 言語でテキスト画面にポック スを描きたいのですが , どうした らいいですか tbox : tf i Ⅱ : 0 ささ 長長 / ジのの * ののイ の標標ででタ ト座座ままス ス X 点点ン キ点点終終イ テ始始最最ラ List 1 m 訓 oc でメモリを確保できないサンプルプログラム 1 : #include ” stdio. ド 2 : #include ” stdlib. h ” 3 : 4 : #define SIZE 200 * 1024 6 : ma i n ( ) 8 : Char 9 : ptr = nalloc( SIZE ) : printf( ” malloc() *Ptr: ptr ニ X6xHYn" CMAGAZINE 19 6 154

4. 月刊 C MAGAZINE 1990年6月号

ウシステム 入門 00 ウイン、 List 2 0 リソース frame = XtCreateManagedW idget ( " frame boxWidgetCIass, top, NU ししの ; / * 文字列を表示するし abel widget を生成し , widget "frame" に管理させる * / (void) XtCreateManagedW i dget ( " C magazine の : IabeIWidgetCIass, frame, NU しし , / * コマンドボタンに相当する Command ⅵ dget を生成し * / / * widget ” frame" に管理させる = XtCreateManagedWidget(" quit " command commandWidgetCIass, frame, NU しし , の : / * 関数 quit を widget "command" のコールバックプロシージャとして登録する * / / * コマンドボタン "command" ( qu i t と表示しているウインドウのこと ) をマウス / * でクリックすれば , このプログラムは終了する XtAddCallback(command, XtNcallback, quit, NU しい : / * こまでの w idget "top" の設定を実現し , 実際にウインドウを生成する * / XtRea I izeW i dget (top) : / * イベント処理のための無限ループを実行する * / XtAppMainLoop (app) : 8 0 1 ・ 4 っ 0 っ 0 -4 ・ - -0 ″ー 8 0 ) 0 11 っ 0 -4 ・ー 各 Widget は , それぞれ , 内部データをも っている。たとえば , Label widget て、あれ ば , 位置 , 大きさ , ラベル文字列 , フォン トなどの 29 個の属性があり , これらは , リ ソースと呼ばれる。何も指定されなければ , 既定の値が使われるが , xrdbm クライアン トなどを使って指定することもて、きる。た とえば , List2 の、℃ magazine" という文字 列を、、 SOFTBANK" に変更したければ , ホームディレクトリの . XdefauIt に cmsl. * . C magazeine.Iabel:SOFTBANK というように指定すればいい ( * は省略を意 味する ) 。 プログラム中て、指定することも可能て、あ る。 List2 を修正し , リソースの指定を行っ たプログラムを List3 に示す。配列 resou 「 ce に指定を行い , XtAPP itia ⅱ ze 関数て、リソー スの既定値を変更している。その結果 , フ オントはアドビタイムスイタリックの 24 ポ イントになり , 表示文字列も変わった (Fig. 11)。 Fig. 1 1 cms3. C List 3 2 : 3 : 4 : 5 : #include く X11/Intrinsic. h> / * Xt tr i ns i c 関係の定義 * / 6 : #include く X11/StringDefs. h> / * 文字列関係の定義 * / 7 : 8 : #include く X11/Xaw/Box. h> / * Box widget の定義 * / 9 : #include く X11/Xaw/Command. h> / * Command widget の定義 * / 10 : #include く X11/Xaw/ し abel.h> / * し abel widget の定義 * / 12 : 13 : / * コールバックプロシージャを使った簡単なプログラムの実装例 * / 14 : 15 : VO i d 16 : quit(widget, clientdata, calldata) / * コールバックプロシーシャ quit 関数 17 : Widget w idget; / * この関数は , Command widget "command" の 18 : XtPointer clientdata, calldata; / * コールバックにより lntr i ns i cs が呼び出す * / 19 : { / * 引数を無視し , 単に ex i t 関数で終了する * / 20 : XtDestr0YAppIicationContext(XtWidgetTOAppIicationContext(widget)) : exit(0); 22 : 23 : } 24 : 25 : int 26 : main(argc, argv) 27 : int argc; 28 : char* argv ロ : 29 : { / * widget を保持するための Widget 型変数を宣言する * / 30 : Widget top, frame, form, command,• 32 : XtAppContext app; 33 static String resource[] 34 35 ” *font: -adobe-times-bold- i ー * ー 24 ー * ” ” * C magazine .label: Kukuchi kerokerokeroppi 36 ” * quit . la わ e に円 ease Click here to quit" 38 NUL し , 39 : 40 : / * 基礎になるウインドウに相当する widget を生成する * / 42 : tOP = XtAppInitialize(&app, "oops", NU しし 0 , &argc, argv, resource, NULL, の : 43 : 44 : frame XtCreateManagedWidget ( " frame , boxWidgetClass, top, NU しし , の : 45 : / * 文字列を表示する Label widget を生成し , widget "frame" に管理させる * / 46 : (void)XtCreateManagedWidget(" C magazine IabeIWidgetCIass, frame, NU しし , の : " qu it " ボタンをクリックすると終了するプログラム (cms3. c) ー cms3 PIease CIick ん e ね 94 耘 / * ただの ma i n 関数 * / ボップアップウインドウ 最後に , ポップアップウインドウを使っ た例を List4 に示す。このプログラムを実行 すれば , まず Fig. 12 が表示される。 $quit" をクリックすればプログラムは終了し , ヾ cloc にをクリックすれば時計のウインド 特集最新ウインドウシステム入門 73 0

5. 月刊 C MAGAZINE 1990年6月号

五ロ - 三ロ 用 応 します。これにより純粋に関数だけのファ イルとなります。 put_strf は , 変数の中身を画面の任意の場 所に表示するものてす。処理の内容は put str 関数 (List5) とほとんど変りません。 KEYIN. C keyin. c からもテストプログラムを削除し て , キーポード入力関数だけにします。 リンク操作 QuickC などては , . mak ファイルに登録し てリンクするだけて , 実行ファイルが作成 されます。 リンクする場合は , main のある dbmg. obj を先頭にして , keysub. obj, crtsub. 0bj を いっしょにリンクします。 まとめ 今回て、簡易データベースのプログラムは 終「てす。このプログラムてファイルアク セスの基本 , キーポード入力 , 画面表示と ひと通りの関数を作成してきました。これ らの知識を応用すれば , かなりのプログラ ムが書けるはずてす。いろいろなプログラ ムを書いてみてください。 昨年 ( ' 89 年 ) の 12 月号からおよそ半年間に 渡って連載してきましたが , 応用 C 言語 ( 簡 易データベース作成編 ) はひとまず今回て終 了いたします。おかげさまて皆様からたい へんな好評をいただきました。本連載がプ ログラミングライフに少してもお役に立つ ことがてきれば幸甚てす。 データベースを題材に取り上げてきまし たが , データベースにはまだまだ多くの機 能 / 側面があります。また , 機会をみて , 新 たな展開て皆様にお目にかかりたいと思い ます。半年間 , 拙い文章にお付き合いいた だき , ありがとうございました。 dbmg. c の dsp-mng 関数 dsp-mng (voi d) 6 int i,ypos' str[2] : 7 Char 8 c 1 s ( ) : 9 title(); 10 coIor(0RG, GREEN) ; put-strf(0,2," ファイル名 = %. 12s"'mng. fname) : put-strf(), 3 , " レコード数 = %d"' mng. reccnt) : 13 put-strf(0,4," レコード長 = %d"' mng. recln) : 14 put-strf(0,5," フィールド数 = %d"•mng. fldcnt) : 15 %d", mng. delmark) : put ー strf ( 0 , 6 , " 削除マークオフセット = color .ORG/ SKY) : 17 put-str(30,2,"No. フィールド名 " , 16 ) ; put-str(54,2," フィールド長 " , 12 ) : color(0RG, WHITE) : 20 for(i=0,ypos=3; i く mng. fldcnt; i 十十 , YPOS 十十 ) 22 color .ORG/ SKY) : 23 put-strf(30, YPOS, "%d:", i + l) ; 24 color(0RG,WHITE) : 25 put-strf(33,ypos, %. 20S " , &mng. fldnam[i] [0]) ; 26 C010r .ORG/ YEL し OW) put-strf(54, YPOS, %d"' mng. flntbl [i]) : 28 color(0RG, WHITE) : 29 30 get-lchar (str) : 31 32 return : 33 } List 4 crtsub の put-strf 関数 List 5 2 : / * put-strf put-strf(int x, int y,char *buf' int value) 4 : vo i d csr-pos it (), Y) : 6 : printf(buf, value) : 7 : 8 : return : 114 CMAGAZINE 19N 6

6. 月刊 C MAGAZINE 1990年6月号

ック機能をもっている。 50 行の XtAddCaIIback 関数て、 , Command widget のコールノヾックプロシージャとして 登録された quit 関数の定義は 15 ~ 23 行にあ る。この quit 関数は , たんに Widget を破棄 し , プログラムを終了させるだけて、ある。 なお , コールバックプロシージャは , 以下 の形て、定義される。 VOid CaIIbackProc(Widget w, XtPointer Client data, XtPointer call data) ; 第 1 引数は , コールバックがあった Widget, 第 2 引数は ,XtAddCallBack 関数の 第 4 引数て、指定されたデータ ( この例は未使 用 NULL), 第 3 引数は Widget から渡される データ ( Widget の内部に規定されている ) て、 ある。 こて、もう少し Widget のインスタンスの 親子関係を解説しよう。 Widget は 2 種類に大 別て、きる。ひとつは , こまて、に述べた Com mand や Label などの primitive widget て、あ り , これらは部品そのものて、ある。しかし , これらは , ほかの Widget の親になることが て、きない もうひとつは , 親になることが て、きる composite widget て、ある。これらに は , Box, Paned などがあり , ひとつ以上の 子をもっことがて、きる ( その数は Widget によ 23 : } Fig. 10 基礎の Shell widget の役目 X ve Shell Window Manager Box C omman d Label cms2. C List 2 7 : 4 : 3 : 2 : " quit " ボタンをクリックすると終了するプログラム (cms2. c) って異なる ) 。 72 CMAGAZINE 1990 6 表示がみられる ) 。 わりに ,Paned widget を使うとまた異なる この場合 , Box widget を生成している ( 代 には , その箱となる Widget が必要て、あり , 交換も行う ) 。複数の Widget を表示するため は , X サーバやウインドウマネジャとの情報 関係は , Fig. 10 のようになる (Shell widget つまり , このプログラムの Widget の親子 が , List2 ては top の子てある frame の子て、あ て Widget は , List1 て、は top の子て、あった 追加されている。 magazine" と表示し の修正て、は , 38 行に新たな Widget の生成が 上の説明ては省いたが , List1 から List2 へ / * Xt lntrinsic 関係の定義 * / 5 : #include く X11/Intrinsic. h> / * 文字列関係の定義 * / 6 : #include く X11/StringDefs. h> / * Box widget の定義 * / 8 : #include く X11/Xaw/Box. h> 9 : #include く X11/Xaw/Command. h> / * Command widget の定義 * / / * し abel widget の定義 * / 10 : #include く X11/Xaw/Label.h> 13 : / * コールバックプロシージャを使った簡単なプログラムの実装例 * / VO i d 16 : quit(widget, clientdata, calldata) / * コールバックプロシージャ quit 関数 * / / * この関数は , Command widget "command" の * / Widget widget; / * コールバックにより lntrinsics が呼び出す * / XtPointer clientdata, calldata: / * 引数を無視し , 単にプログラムを終了する * / XtDestroyAppIicat ionContext (XtWidgetTOAppl icationContext (widget) ) : 14 : 15 : 17 : 18 : 20 : 22 : 24 : 25 : 27 : 30 : 32 : 33 : 34 : 35 : 36 : 28 : char* argv ロ : int argc; 26 : main(argc, argv) int exit( の : / * ただの ma i n 関数 * / / * w idget を保持するための W i dget 型変数とアプリケーションコンテクストを * / / * 保持するための XtAppContext 型変数を宣言する Widget tOP, frame, form, command : XtAppContext app : top = XtAppInitiaIize(&app, ・ ' OOPS " , NULL, 0 , &argc, argv) : / * 基礎になるウインドウに相当する w idget を生成する * /

7. 月刊 C MAGAZINE 1990年6月号

ウシステム 入門 00 ウイン、 ット ) 。この規格によって , ばらばらだった 英語以外の通信の実装もいちおう統一され るだろう (contributed の kterm も , この CTEXT を実装している ) 。 論理的なフォント名 X11R3 から導入された論理的なフォント 名 ( フォント名をそのファイル名から別の論 理的な名前にした ) が導入された。その論理 的なフォント名のつけ方のガイドラインが , XLFD(X LogicaI Font Description 過去の Xaw に互換性のあるインタフェイス conventions) によって規定された。その規 非四角形のウインドウ が利用可能になる。 格によるフォントセレクタ xfontsel ( Fig. 6 参 照 ) がある。 X コンソーシアムの X11R4 から , SHAPE (non-rectangular ユーサ提供の 標準規格 window SHAPE extension) 拡張規格が ソフトウェア 追加された。この規格により , 非四角形の X コンソーシアムは , X11R3 から X11R4 の ウインドウが表示てきるようになった。 いくっかの標準規格を正 リリースの間に の実装例には , oclock(Fig. 5 参照 ) , xeyes X の配布には , ューザやグループにより提 式に定めた。したがって , X11R4 のリリー などがある。 Athena Widget の Comm and 供された多数のソフトウェアが含められて スには , それらの標準規格の実装例が含め widget の拡張されたため , xman などは丸い いる。これらの中には , 実際にユーザが必 ボタンを使っている。なお , この拡張規格 られた。 要としている興味深いものが多い。以下に 以下に , それらの標準規格および実装例 を実装していないサーバ ( たとえば , X11R3 おもなものを簡単に紹介する。 のサンプルサーバ ) などは , これらをたんに を解説する。 四角形のウインドウて、表示する。 •OPEN LOOK(X View など ) クライアント間通信 Sun から OPEN LOOK のためのツールキ xdm のためのプロトコル ット X View%•よびウインドウマネーシャ クライアント間の情報交換の通信手段の olwm(Fig. 2-b 参照 ) が提供されている。 X11R3 のリリースから , X への統一的な口 最低限の形式は , ICCCM (lnter ー Client れによって OPEN LOOK 仕様のアプリケー グイン環境を実現するために , クライアン Communication Conventions Manual) に ションの作成を試せるだろう。 ト xdm(X Display Manager) が提供され よって規定された。この規格には , カット ・ノグマ た。最近 , X 端末が増加しているため , 使わ ノヾッファ , セッションマ不一シャ , リソー あの日本のシグマプロジェクトのツール れる機会は増えている 0XDMCP (X Display スなどのクライアントどうしの情報交換の キットおよびウインドウマネージャも提供 己述がされているが , 特定のユーザインタ M anager Control Protocol) は , xdm のた されている。 めのプロトコルの規格を規定したものてあ フェイスを規定したりはしない ■日本語入力 ( wnn V4 など ) X11R4 の XIib および Xt は , この規格を利 日本語入力のための Wnn V4 および XJ が 用するためのサービスを提供しており , さ 提供された。 Wnn は京都大学 , オムロン , 多国語のテキスト らに多数のクライアントは , この規格を実 アステックが開発したネットワーク対応の 装している。 漢字入力プログラムてあり , XJ は漢字入力 英語以外の言語を扱うための形式は , のための関数ライプラリてある。 CTEXT (Compound TEXT encoding) に よって規定された ( ISO の標準規格のサプセ ツールキットには , InterViews, Andrew 特集最新ウインドウシステム入門 69 Fig. 6 X fontsel - ぉ dobe -21 ・し ica - 響 - 響 - 響→ -17- 20- - - - - ー響 8C0 ど pG 〃′ノ K NO 戸 Q ST レな 0 ′ 234567 4 「“え・ nuch 1 三ロ ■ツールキット

8. 月刊 C MAGAZINE 1990年6月号

ウイン、 ウシステム 入門 00 からなるネットワークの分散資源を効果的 に利用することが可能な環境を構築するた めのプロジェクト , アテナ (Athena) のひと つの産物て、ある。 その研究および開発は , 1984 年に始まっ た。以来 , 幾度かの再設計を経て ( 現在の Ver. 11 まて、に , 計 3 度の再設計がなされ た ) , 1986 年に Ver. 10 が一般公開された。そ の Ver. 10 の公開により , X は多数のユーザ に評価され , 後の X の仕様に大きな影響を与 える指摘を多数得ることになった。指摘さ れた問題点には , ハードウェア依存 ( マウス やキーポードが特定の機種に依存 ) , OS 依存 (System V 上の動作が難しい ) , カラーの扱 いが不十分 ( ヒ。クセルの深さに制限 ) , X プロ トコルの効率の悪さ ( 通信量が多い ) , 高度 なプログラミングインタフェイス ( つまりプ ログラミングが難しい ) などがあった。 1987 年に , 指摘された問題点に対応した 新しい Ver. 11 が公開された。この Ver. 11 は , 標準のウインドウシステムとなること を意識した設計がなされ , その優れた設計 および公開性から , いくつかの計算機メー カー (Sony, HP など ) は , それを自社のウィ ンドウシステムに採用している ( 以下 X とい えば Ver. 11 を意味する ) 。 X のシステム アーキテクチャ X は , 異種の計算機からなる計算機ネット ワーク上の動作 , さまざまなユーザインタ Fig. 1 X Window System でのクライアントとサーバ CIient C CIient E Super Computer Client D Network(Ethernet) Server CIient A WorkStation フェイスの提供 , プログラミングのインタ フェイスレベルの階層などの特徴をもつ。 それらの特徴を簡単に解説しよう。 クライアントサーバモテル X の設計は , その本来の開発目的からも想 像されるように , ネットワークが意識され , その結果 , クライアントサーバモデルが採 用された。このモデルは , 各アプリケーシ ョンの実行部分のクライアントと複数のク ライアントから要求されたウインドウを表 示するサーバから構成される。具体的な例 をあげれば , 画像処理プログラムの計算処 理などはクライアントにまかされ , キーポ ードからのタイプやイメージの描画などは , X terminal Client B CIient F Mini Computer 特集最新ウインドウシステム入門 63

9. 月刊 C MAGAZINE 1990年6月号

五ロ ニ : ロ はじめて学ぶ 0 プロクラー ニンク インタになっています。実引数は , 順に somed ay. int 型変数 a の値 , b の値 , int 型変数 tashi のア そして以下のように入力する。 ドレス , hiki のアドレスとなります ( & はア grp language < test ドレス取得演算子て、したね ) 。関数 ca て、 このとき , 次のような出力が得られればよ は , x, Y という値の和を第 3 引数が指すアド ポインタとデータの授受その 1 レスに , 差を第 4 引数が指すアドレスに , そ れぞれ代入しています。呼び出し側に戻っ てみると ,tashi や hiki のアドレスには計算結 果が入っていることになります。したがっ て和と差のふたつの値を得ることがてきま この関数 ca の第 1 , 2 引数のような関数間 のデータの受け渡し方法を「値による受け渡 し (call by value) 」 , 第 3, 4 引数のようなポ インタを使った受け渡しを「参照による受け 渡し (call bY reference) 」と呼びます。参照 による受け渡しはこのような複数のデータ を受け取るときに便利て、すが , 関数間の独 立性は低下します。 参照による受け渡しの一種てすが , 引数 として配列を用いる場合があります (List2 の。関数間て、配列を受け渡すときには , void sort(int x ロ ) のように , 引数が配列てあることを明示し ます。配列のサイズはすて、に決まっている のて、 , とくに記述する必要はありません ( 配 列のサイズを記述してもかまいません ) 。あ るいは 9 ー 2 て、お話したようにポインタにして アクセスしてもかまいません。そのときには , VOid sort(int *x) という宣言にします。呼び出す側ては , sort(a) : と引数に配列名を書くだけてよいわけてす。 この配列名が , 配列の先頭アドレスを指す 定数てあることはすてに説明しました。 今月のクイズ 「標準入力から入力し , 第一引数で与え た文字列がある行を , 標準出力するプログ ラム grp を書きなさい ( これは , UNIX の grep のサプレットもどきである ) 」 たとえば , test という名のファイルの中身 が , 以下のようだったとする。 This is the C Magazine. lt seems to be difficult for me. But I will master the C language l'm studying the C language. But I will master the C language someday. List 1 9 い st19 ポインタとデータの授受その 1 2 : 4 : #include く stdio. h> 5 : 6 : VOid calc(int x, int y, int *wa, int *sa) 8 : 9 : 10 : } 12 : void main(void) 13 : { int a, b, tashi, h i k i : = 100 : a b = 300 : calc(a, &tashi, &hiki); printf("%d + Xd = %dYn%d ー 20 : 21 : } h i k i ) : a, b, tashi, ポインタとデータの授受その 2 LiSt 20 2 : い st20 ポインタとデータの授受その 2 4 : #include く stdio. h> 5 : #define NUMBER 10 6 : 7 : VOid swap(int *x. int *y) 9 : int work; work; 16 : void sort(int x ロ ) for (i = 0 : i く NUMBER-I; i 十十 ) for(j i 十 1 : j く NUMBER; j + + ) 22 : 24 : } 26 : void nain(void) int a [NUMBER] : 28 : 29 : int i; 30 : for (i = 0 : i く NUMBER; i + + ) 32 : 33 : 34 : for (i = 0 : i く NUMBER,• i + + ) printf("Xd ” , a[i]); printf("%n") : sort (a) : for (i = 0 : i く NUMBER,• i + + ) 39 : printf("Xd ” , a[i]); printf("%n つ : 40 : 42 : } work はじめて学ぶ C プログラミング 137

10. 月刊 C MAGAZINE 1990年6月号

DL= 0X00. : を設定して , 拡張ファンクションコールし ます。リターンとして , AX レジスタに文字 数が入ってきます。 6 ) キーポードバッフアの状態チェック kbd buff 送信したいデータをキーポードから入力 するときにも , 受信と同じことがいえます。 キー入力関数を発行する前に入力があった かどうかのチェックを行うために , キーポ ードバッフアの状態をチェックするための 関数を用意します。これにもファンクショ ンコールを使用します。 AH レジスタにファンクション番号 OBH を 設定し , コールします。 AL レジスタの値が 0 て、戻ってきたら , バッフアは空の状態て 以上の関数の組み合わせを利用して RS- 232C を制御します。 画面制御は , 前回まてに紹介したものと 同様にエスケープシーケンスを利用します (List3, 4 ) 。ただし今回は , 送信側の画面と 受信側の画面をカーソルが行ったり来たり するため , locate 関数がループの中て、何度も 呼ばれているのてすが , ATOK6 との相性が がよくないらしく ATOK6 を呼び出すとエス ケープシーケンスが分断されてしまい , 誤 動作します。 ATOK7 ては問題ないのて、す が , ATOK6 ューザのために拡張ファンクシ ョンコールを利用したカーソル位置指定関 数 locate を定義します。また , ふたつの画面 てそれぞれスクロールさせるために , 部分 スクロール関数を定義します。なお , 工ス ケープシーケンスを利用した部分の説明は 省略します。 1 ) カーソル位置指定 拡張ファンクション仕様 拡張ファンクションコールのファンクシ ョン 10H には , 画面制御関係のサプファンク ションが用意されています。カーソル位置 指定のサプファンクション番号は 03H てす。 レジスタ CL , AL にそれぞれ , CL=0x10 : AL=0x03 : ワンポイントプログラミング講座 117 銘字 っ 0 & ・文 0 0 初 0 0 0 0 Ø 0 0 . 0 十》ハじ O ・ 0 0 O ハじ 3 0 の引 カ o フ・ ( O 0 能出 一 0 tn 一川・ ノ一 0 8 ポ 0 十》本し 文 * 0 1 よワっ 0 4 ・ 0 C.D ー 8 9 0 1 よワ朝っ 0 -4 ・′ 0 ー 8 0 1 ワ 3 っ 0 4 ・′ 0 00 ー 8 0 14 ワっ 0 4 ド 0 7 ー 8 9 0 ・ー 4 ワ】っ 0 -4 - -0 れ 0 7 ー 8 9 0 1 ーワ 0 っ 0 -4 -0 6 7 8 9 0 1 00 っ 0 -4 1 ー、 1 11 , ー 1 よ 1 よ 1 よ 1 よ、 1 1 ーっ 0 っ 0 っ 0 っ 0 っ 0 ワ 0 0 乙っ 0 っ朝っ朝っ 0 っ 0 CO っ 0 っ 0 っ 0 っ 0 っ 0 っ 0 -4 -4 -4 : 4 -4 4 -4 4 -4 4 ′ 0 ド 0 - -0 ド 0 ′ 0 -0 ′ 0 5 - ト 0 6 6 6 6 CD List 2 = 0X05 ) ? READY 画面制御 = 0 ) ? EMPTY : BUSY ) : List 3 十》 + し 0 O 一 0 0 0 0 0 十レ十レ十》 + し + し 、 1 っ 0 っ 0 -4 0 List 4 crt. C 1 : #include く stdio. h> 2 : #include く dos. h> 3 : #include く田 e 田 ory. h> 6 : / * 1 行クリア * /