XtDestroyWidget(3) ウィジェットを生成・破棄する

Other Alias

XtCreateWidget, XtVaCreateWidget, XtCreateManagedWidget, XtVaCreateManagedWidget

書式

Widget XtCreateWidget(name, widget_class, parent, args, num_args)

      String name;

      WidgetClass widget_class;

      Widget parent;

      ArgList args;

      Cardinal num_args;

Widget XtVaCreateWidget(name, widget_class, parent, ...)

      String name;

      WidgetClass widget_class;

      Widget parent;

Widget XtCreateManagedWidget(name, widget_class, parent, args, num_args)

      String name;

      WidgetClass widget_class;

      Widget parent;

      ArgList args;

      Cardinal num_args;

Widget XtVaCreateManagedWidget(name, widget_class, parent, ...)

      String name;

      WidgetClass widget_class;

      Widget parent;

void XtDestroyWidget(w)

      Widget w;

引き数

args
リソースのデフォルト値を上書きする引き数リストを指定する。
name
生成するウィジェットのリソース名を指定する。 これはリソースの取得に使われるので、同じ親を持つ他のどのウィジェットと も同じであってはならない。
num_args
引き数リスト内の引き数の数を指定する。
parent
親ウィジェットを指定する。
w
ウィジェットを指定する。
widget_class
生成されるウィジェットに対するウィジェットクラスへのポインタを指定する。
...
デフォルトのリソース値を上書きする可変長引き数リストを指定する。

説明

関数 XtCreateWidget は、ウィジェット生成操作の大部分を行う。
  • このクラスとその全てのスーパークラスに対して、class_initialize 手続き が呼ばれたかどうかチェックする。呼ばれていなければ、スーパークラスから サブクラスの順に必要な呼び出しを行う。
  • ウィジェットのインスタンスに対するメモリを割り当てる。
  • 親クラスが constraintWidgetClass のサブクラスならば、親ウィジェットの constraint 情報のためのメモリを 割り当て、この領域のアドレスを constraints フィールドに格納する。
  • コアの非リソースデータのフィールドを初期化する(例えば、parent や visible 等)。
  • このクラスや全てのスーパークラスに対して指定されたリソースのリストを使っ て、リソースのフィールド(例えば、background_piexel 等)を初期化する。
  • 親ウィジェットのクラスが constraintWidgetClass のサブクラスならば、constraint 情報のレコード用のリソースのフィールド を初期化する。これには、親のクラスと constraintWidgetClass までの全てのスーパークラスに対して指定された constraint 情報のリソース が用いられる。
  • ウィジェットに対する初期化手続きが、 Core の初期化手続きから、ウィジェットの初期化手続きへ向かう順で呼ばれる。
  • 親ウィジェットのクラスが compositeWidgetClass のサブクラスならば、このウィジェットは親ウィジェット insert_child 手続 きを呼ぶことによって、親ウィジェットの子のリストに加えられる。 詳しくは 3.5 章を参照すること。
  • 親ウィジェットのクラスが constraintWidgetClass のサブクラスならば、 constraintWidgetClass から始まって親の constraint 情報の初期化手続きに向かう順で constraint 情報の初期化手続きが呼ばれる。

マクロ XtNumber を使って、引き数リスト中の引き数の数を求めることができる点に注意すること。 詳しくは、11.1 章を参照すること。

関数 XtCreateManagedWidget は、 XtCreateWidgetXtManageChild を呼ぶ簡易関数である。

関数 XtDestroyWidget は、ウィジェットを破棄する唯一の方法を提供する。これには、自分自身を破 棄するウィジェットも含まれる。 この関数は、破棄されるウィジェットのアプリケーションコールバックルーチ ンから呼ぶことも含めて、いつ呼んでもよい。 この関数は、破棄されるウィジェットに対するぶら下がり参照を避けるため、 2つのフェーズで破棄の処理を行なうことが必要である。

フェーズ1では、 XtDestroyWidget が以下の処理を行う。

  • このウィジェットの being_destroyed フィールドが True ならば、処理は即座に戻る。
  • ウィジェットツリーを再帰的に下り、このウィジェットと全ての子ウィジェッ トのbeing_destroy フィールドに True をセットする。
  • 安全に破棄できるようになった時に破棄するウィジェットのリスト(破棄リス ト)に、このウィジェットを加える。

破棄リストのエントリーは、破棄リスト上で w2 が w1 の後にあらわれた場合、 w2 は w1 の下位ウィジェットではないという不変性を満たす。 (下位ウィジェットは、通常とポップアップの子ウィジェットの両方を指す。)

フェーズ2は、現在のイベントの結果として生じる、実行すべき全ての手続き が呼ばれたときに行われる(これは、イベントマネージャとトランスレーショ ンマネージャに登録された全ての手続きを含む)。つまり、これは XtDispatchEvent の現在の呼び出しが戻ってくるときに行われ、 XtDispatchEvent が呼ばれていないときには即座に行われる。

フェーズ2では、 XtDestroyWidget は破棄リストの各エントリーに対して次の処理を行う。

  • ウィジェット(と、その全ての下位ウィジェット)に登録された破棄コールバッ ク手続きを呼ぶ。呼び出しの順序は降順である(親のコールバックの前に、子 のコールバックを呼ぶ)。
  • このウィジェットの親が compositeWidgetClass のサブクラスであり、かつ親が破棄されていない場合は、このウィジェットに 対して XtUnmanageChild が呼ばれ、親の delete_child 手続きが呼ばれる(3.4 章を参照のこと)。
  • このウィジェットの親が constraintWidgetClass の場合、最終的に constraintWidgetClass に対して constraint 情報の破棄手続きが呼ばれるまで、 親、そしてそのスーパークラスに対して constraint の破棄手続きが呼ばれる。
  • ウィジェット(と、その全ての下位ウィジェット)に対して、降順で destroy メソッドが呼ばれる。 このようなウィジェットに対しては、最初はそのウィジェットに宣言された破 棄手続き、次にそのスーパークラスの破棄手続きというように手続きが呼ばれ てゆく。これは、Core クラスのレコードに宣言された破棄手続きが最終的に 呼ばれるまで行われる。 ウィジェットがリアライズされていれば(つまり、X のウィンドウを持ってい れば)、 XDestroyWindow が呼ばれる。 X サーバは、全ての下位ウィンドウを再帰的に破棄する。
  • 再帰的にツリーを降り、全てのポップアップウィジェット、constraint 情報 のレコード、コールバックのリスト、(ウィジェットが compositeWidgetClass のサブクラスならば)子ウィジェットを解放する。