新しい子フレームを作成するか、通常のフレームを子フレームに変換するには、そのフレームの parent-frame パラメータ(フレーム相互作用パラメータ
を参照)を、既に存在するフレームのパラメータと同じ値に設定します。すると、そのパラメータが変更またはリセットされない限り、指定されたフレームがそのフレームの親フレームとなります。技術的には、GUI
においては、これにより子フレームのウィンドウシステム上のウィンドウが、親フレームのウィンドウシステム上のウィンドウの子ウィンドウとなります。テキストターミナルにおいては、通常、フレームが親フレームと同じターミナル上に表示され、その一部が隠れることになります。
parent-frame
パラメータはいつでも変更可能です。別のフレームに設定すると、子フレームが再親付けされます。別の子フレームに設定すると、そのフレームはネストされた子フレームとなります。nil
に設定すると、フレームのステータスがトップレベルフレーム――ウィンドウシステムのウィンドウがディスプレイのルートウィンドウの子であるフレーム――に戻ります。25
テキスト端末では、トップレベルフレームはルートフレームと呼ばれます(後述)。
子フレームは任意にネストできるため、あるフレームが子フレームであると同時に親フレームであることもあり得ます。また、子フレームと親フレームの相対的な役割はいつでも入れ替わる可能性があります(ただし、通常は子フレームのサイズを親フレームよりも十分に小さく保つのが望ましいでしょう)。フレームを自身の祖先にしようとする試みに対しては、エラーが通知されます。
親フレームが削除されようとする際(フレームの削除を参照)、その子フレームは親フレームよりも先に再帰的に削除されます。このルールには1つの例外があります。子フレームが別のフレームの代理ミニバッファフレーム(ミニバッファとフレームを参照)として機能している場合、親フレームが削除されるまでその子フレームは保持されます。このとき、子フレームをミニバッファフレームとして使用しているフレームが他に存在しない場合、Emacsは子フレームの削除も試みます。何らかの理由でこの削除に失敗した場合、子フレームはトップレベルフレームになります。テキスト端末ではこのような変換が不可能なため、削除対象の代理ミニバッファフレームが、同様に削除されないフレームによって使用されている場合、フレームの削除時にエラーが発生することがあります。
以下の3つの関数は、親フレームと子フレームが互いにどのような関係にあるかを理解するのに役立ちます。
この関数は frame の親フレームを返します。frame
に親フレームがない場合は nil を返します。
This functions returns non-nil if ancestor is an ancestor of descendant. ancestor is an
ancestor of descendant when it is either descendant’s parent frame or it is an ancestor of
descendant’s parent frame. Both, ancestor and descendant must
specify live frames.
この関数は、指定された frame のルートフレームを返します。frame はライブフレームである必要があり、デフォルトでは選択されたフレームが指定されます。frame のルートフレームは、frame から始まる親フレームの連鎖を辿り、親を持たないフレームに到達するまで辿って得られるフレームです。frame に親がない場合、そのルートフレームは frame 自身となります。
テキスト端末では、ルートフレームは常に端末の左上端に配置され、常に端末の全サイズを占める。
Haikuでは、ウィンドウシステムの制約により、親フレームがアクティブなときのみ子フレームが表示されます。同様の制約により、子フレームは必ず最上位の親フレーム、すなわち親フレームを持たない階層の最頂点フレームよりも上に表示されることが保証されています。