可視フレームは、端末のディスプレイ上の矩形領域を占めます。この領域には、それぞれ異なる目的を持つ複数の入れ子状の矩形が含まれる場合があります。以下の図は、グラフィカル端末におけるフレームのレイアウトを示したものです:
<------------ Outer Frame Width ----------->
____________________________________________
^(0) ________ External/Outer Border _______ |
| | |_____________ Title Bar ______________| |
| | (1)_____________ Menu Bar ______________| | ^
| | (2)_____________ Tool Bar ______________| | ^
| | (3)_____________ Tab Bar _______________| | ^
| | | _________ Internal Border ________ | | ^
| | | | ^ | | | |
| | | | | | | | |
Outer | | | Inner | | | Native
Frame | | | Frame | | | Frame
Height | | | Height | | | Height
| | | | | | | | |
| | | |<--+--- Inner Frame Width ------->| | | |
| | | | | | | | |
| | | |___v______________________________| | | |
| | |___________ Internal Border __________| | |
| | (4)__________ Bottom Tool Bar __________| | v
v |___________ External/Outer Border __________|
<-------- Native Frame Width -------->
実際には、図面に示されているすべての領域が存在するとは限りませんし、存在し得ない場合もあります。これらの領域の意味については、以下に説明します。
外枠とは、図面に示されているすべての領域を含む矩形のことです。その矩形の辺は、枠の外辺と呼ばれます。枠の外幅と外高さを合わせて、その矩形の外サイズを規定します。
フレームの外形サイズを把握しておくことは、フレームをディスプレイの作業領域に収める際(複数ターミナルを参照)や、画面上で2つのフレームを隣接して配置する際に有用です。通常、フレームの外形サイズは、フレームが少なくとも1回マッピング(可視化、フレームの可視性を参照)された後でなければ取得できません。初期フレームやまだ作成されていないフレームの場合、外形サイズは推定することしかできないか、あるいはウィンドウシステムやウィンドウマネージャのデフォルト値から算出する必要があります。一つの回避策として、マッピング済みフレームの外形サイズとネイティブ(後述)サイズの差分を求め、それを新しいフレームの外形サイズの算出に利用する方法があります。
外枠の左上隅の位置(上の図では「(0)」で示されている)が、枠の外側位置です。グラフィカルな枠の外側位置は、枠のサイズ変更やレイアウト変更が行われても通常表示上で不変であるため、枠の「位置」とも呼ばれます。
外側の位置は、left および top
フレームパラメータによって指定され、またこれらを介して設定できます(位置パラメータを参照)。通常のトップレベルフレームの場合、これらのパラメータは通常、ディスプレイの原点に対する絶対位置(後述)を表します。子フレーム(子フレームを参照)の場合、これらのパラメータは親フレームのネイティブ位置(後述)に対する相対位置を表します。テキスト端末上のルートフレーム(子フレームを参照)では、これらのパラメータの値は意味を持たず、常に
0 となります。
外側の枠線は、ウィンドウマネージャが提供する装飾の一部です。通常、マウスによるフレームのサイズ変更に使用されるため、「fullboth」や最大化されたフレームでは表示されません(サイズパラメータを参照)。その幅はウィンドウマネージャによって決定され、Emacsの関数で変更することはできません。
テキスト端末フレームには外部境界が存在しません。グラフィカルフレームの場合、override-redirect または undecorated フレームパラメータを設定することで、表示を抑制できます(ウィンドウ管理パラメータを参照)。
外側ボーダーは独立したボーダーであり、その幅はborder-widthフレームパラメータで指定できます(レイアウトパラメータを参照)。実際には、フレームの外側ボーダーか外側ボーダーのいずれか一方が表示され、両方が同時に表示されることはありません。通常、外側ボーダーは、ツールチップフレーム(ツールチップを参照)、子フレーム(子フレームを参照)、およびundecoratedまたはoverride-redirectフレーム(ウィンドウ管理パラメータを参照)のように、ウィンドウマネージャによって(完全に)制御されていない特殊なフレームにおいてのみ表示されます。
原則として、テキストターミナルのフレームやGTK+ルーチンによって生成されるフレームでは、外枠は表示されません。テキストターミナル上の子フレームでは、そのフレームのundecoratedパラメータをnilに設定することで、外枠を擬似的に表現できます(レイアウトパラメータを参照)。MS-Windowsでは、幅1ピクセルの外部枠を用いて外枠を擬似的に表現します。X上の非ツールキットビルドでは、フレームパラメータborder-colorを設定することで、外枠の色を変更できます(レイアウトパラメータを参照)。
タイトルバー(別名 キャプションバー)もウィンドウマネージャの装飾の一部であり、通常はフレームのタイトル(フレームタイトルを参照)のほか、フレームの最小化、最大化、削除用のボタンが表示されます。また、マウスでフレームをドラッグする際にも使用できます。タイトルバーは通常、フルスクリーン(サイズパラメータを参照)、ツールチップ(ツールチップを参照)、および子フレーム(子フレームを参照)では表示されず、ターミナルフレームには存在しません。タイトルバーの表示は、override-redirectまたはundecoratedフレームパラメータを設定することで抑制できます(ウィンドウ管理パラメータを参照)。
メニューバー(メニューバーを参照)は、内部的なもの(Emacs自身が描画するもの)か、外部的なもの(ツールキットが描画するもの)のいずれかになります。ほとんどのビルド(GTK+、Lucid、Motif、MS-Windows)では、外部メニューバーが採用されています。NSでも外部メニューバーが使用されますが、これは外側のフレームの一部ではありません。ツールキットを使用しないビルドでは、内部メニューバーを提供できます。テキストターミナルフレームでは、メニューバーはフレームのルートウィンドウの一部となります(ウィンドウとフレームを参照)。原則として、メニューバーが子フレームに表示されることはありません(子フレームを参照)。menu-bar-linesパラメータ(レイアウトパラメータを参照)を0に設定することで、メニューバーの表示を抑制できます。
メニューバーの幅がフレームに収まりきらなくなった際に、折り返しが行われるか、あるいは切り捨てられるかは、ツールキットによって異なります。通常、メニューバーを折り返しできるのは Motif および MS-Windows ビルドのみです。メニューバーを(再)折り返しる際、フレームの外側の高さは維持されるよう試みられるため、代わりにフレームの本来の高さ(後述)が変更されます。
メニューバーと同様に、ツールバー(ツールバーを参照)には、内部的なもの(Emacs自身が描画するもの)と外部的なもの(ツールキットが描画するもの)があります。GTK+およびNSビルドでは、ツールバーはツールキットによって描画されます。その他のビルドでは内部ツールバーが使用されます。GTK+では、ツールバーをフレームの左右いずれか、内部ボーダーのすぐ外側に配置できます(後述)。通常、子フレーム(子フレームを参照)にツールバーは表示されません。tool-bar-linesパラメータ(レイアウトパラメータを参照)を0に設定することで、ツールバーの表示を抑制できます。
変数 auto-resize-tool-bars が nil 以外の場合、Emacs
は内部ツールバーの幅がフレームに対して大きくなりすぎた際に、それを折り返します。Emacs
が内部ツールバーを折り返し(または解除)する場合、デフォルトではフレームの外側の高さは変更されないため、代わりにフレームの本来の高さ(後述)が変化します。一方、GTK+
でビルドされた Emacs はツールバーを決して折り返しませんが、長すぎるツールバーを収めるために、フレームの外側の幅を自動的に広げることがあります。
タブバー(The GNU Emacs ManualのTab
Barsを参照)は、常にEmacs自身によって描画されます。内部ツールバー付きでビルドされたEmacsではツールバーの上に、外部ツールバー付きでビルドされたEmacsではツールバーの下にタブバーが表示されます。tab-bar-linesパラメータ(Layout
Parametersを参照)を0に設定することで、タブバーの表示を抑制できます。
ネイティブフレームとは、外側フレームの内部に完全に含まれる矩形のことです。これには、外部または外側のボーダー、タイトルバー、およびあらゆる外部メニューやツールバーが占める領域は含まれません。ネイティブフレームの端は、フレームのネイティブエッジと呼ばれます。フレームのネイティブ幅とネイティブ高さを合わせて、そのフレームのネイティブサイズを表します。
フレームのネイティブサイズとは、Emacs内部でフレームを作成またはリサイズする際に、Emacsがウィンドウシステムやウィンドウマネージャに渡すサイズのことです。また、タイトルバーの対応するボタンをクリックしてフレームを最大化した場合や、マウスで外部境界をドラッグした場合など、ウィンドウシステムやウィンドウマネージャがフレームのウィンドウシステムウィンドウをリサイズするたびに、Emacsが受け取るサイズでもあります。
ネイティブフレームの左上隅の位置が、フレームのネイティブ位置を規定します。上の図の(1)–(3)は、各種ビルドにおけるその位置を示しています:
したがって、フレームの本来の高さには、ツールバーの高さは含まれても、メニューバーの高さは含まれない場合がある(Lucid、Motif、MS-Windows)、あるいはメニューバーとツールバーの両方の高さが含まれる場合もある(ツールキット非搭載およびテキスト端末フレーム)。
本来の位置が(2)となるはずが、ツールバーが(4)に示すようにフレームの下部に配置されている場合、フレームの本来の位置はタブバーの位置となります。
フレームのネイティブ位置は、マウスの現在位置を設定または取得する関数(マウス位置を参照)や、window-edges、window-at、coordinates-in-window-pといったウィンドウの位置を扱う関数(座標とウィンドウを参照)の基準位置となります。また、このフレーム内で子フレームを特定し配置するための(0,
0)原点も指定します(子フレームを参照)。
また、フレームのoverride-redirectまたはundecoratedパラメータを変更してウィンドウマネージャの装飾を削除または追加する場合、通常、フレームの本来の位置は表示上で変更されない点にも注意してください(ウィンドウ管理パラメータを参照)。
内部ボーダーとは、Emacsが内部フレームの周囲に描画するボーダーのことです(後述)。その外観の仕様は、当該フレームが子フレームであるかどうかによって異なります(子フレームを参照)。
通常のフレームの場合、その幅は internal-border-width フレームパラメータ(レイアウトパラメータ を参照)で指定され、色は
internal-border フェイスの背景で指定されます。
子フレームの幅はchild-frame-border-widthフレームパラメータで指定され(ただしフォールバックとしてinternal-border-widthパラメータが使用されます)、色はchild-frame-borderフェイスの背景で指定されます。
内部フレームとは、フレームのウィンドウ用に確保された矩形のことです。これは内部ボーダーで囲まれていますが、このボーダー自体は内部フレームの一部ではありません。その端はフレームの内部エッジと呼ばれます。内部幅と内部高さによって、この矩形の内部サイズが規定されます。内部フレームは、フレームの表示領域と呼ばれることもあります。
原則として、内部フレームはフレームのルートウィンドウ(ウィンドウとフレームを参照)と、フレームのミニバッファウィンドウ(ミニバッファウィンドウを参照)に細分化されます。この原則には2つの顕著な例外があります。ミニバッファのないフレームはルートウィンドウのみを持ち、ミニバッファウィンドウは持ちません。ミニバッファのみのフレームはミニバッファウィンドウのみを持ち、それが当該フレームのルートウィンドウとしても機能します。このようなフレーム構成を作成する方法については、初期フレームパラメータを参照してください。
フレームのテキストエリアは、ネイティブフレーム内に埋め込むことができる、ある意味で仮想的な領域です。その位置は規定されていません。幅は、ネイティブの幅から、内部ボーダーの幅、1本の垂直スクロールバー、および(このフレームで指定されている場合は)左右各1本のフリンジの幅を差し引くことで得られます。詳細はレイアウトパラメータを参照してください。高さは、ネイティブの高さから、内部ボーダーの幅、および(このフレームで指定されている場合は)フレームの内部メニューとツールバー、タブバー、ならびに1本の水平スクロールバーの高さを差し引くことで得られます。
フレームの絶対位置は、フレームの表示領域の原点 (0, 0) を基準とした水平方向および垂直方向のピクセルオフセットの組 (X, Y) で表されます。同様に、フレームの絶対端点は、その原点からのピクセルオフセットで表されます。
なお、マルチモニター環境では、ディスプレイの原点が端末の利用可能な表示領域全体の左上隅と必ずしも一致するとは限りません。そのため、このような環境では、フレームが完全に表示されている場合であっても、そのフレームの絶対位置が負の値になることがあります。
慣例により、垂直方向のオフセットは「下方向」に増加します。つまり、フレームの高さは、下端のオフセットから上端のオフセットを引くことで求められます。水平方向のオフセットは、予想通り「右方向」に増加するため、フレームの幅は、右端のオフセットから左端のオフセットを引くことで算出されます。
グラフィカル端末のフレームにおいて、以下の関数は前述の領域のサイズを返します。
この関数は frame の幾何学的属性を返します。戻り値は、以下に挙げる属性の連想リストです。座標、高さ、幅の値はすべてピクセル単位の整数です。なお、frame がまだマッピングされていない場合(フレームの可視性 を参照)、戻り値の一部は実際の値の近似値――フレームがマッピングされた後に視認可能となる値――のみを表す可能性があることに注意してください。
outer-positionframeの表示領域の原点(0, 0)を基準とした、外側のframeの絶対的な位置を表す定数。
outer-sizeframeの外形の幅と高さの制約。
external-border-sizeウィンドウマネージャから提供される、frameの外枠の水平方向および垂直方向の幅の定数。ウィンドウマネージャがこれらの値を提供しない場合、Emacsは外側および内側フレームの座標からそれらを推定しようとします。
outer-border-widthframeの外枠の幅。この値はGTK+以外のXビルドにおいてのみ意味を持ちます。
title-bar-sizeウィンドウマネージャまたはオペレーティングシステムから提供される frame のタイトルバーの幅と高さのコンス。両方がゼロの場合、フレームにタイトルバーはありません。幅のみがゼロの場合、Emacs は幅情報を取得できませんでした。
menu-bar-externalnil 以外の場合、これはメニューバーが外部(frame のネイティブフレームの一部ではない)であることを意味します。
menu-bar-sizeframeのメニューバーの幅と高さの制約。
tool-bar-externalnil 以外の場合、これはツールバーが外部(frame
のネイティブフレームの一部ではない)であることを意味します。
tool-bar-positionこれは、frame のツールバーが left、top、right、bottom
のいずれかであり、かつそうなり得ることを示しています。
値 left と right は GTK+
ツールキットを使用したビルドでのみサポートされており、bottom は NS
以外のすべてのビルドで、top はどこでもサポートされています。
tool-bar-sizeframeのツールバーの幅と高さの制約。
internal-border-widthframe の内部ボーダーの幅。
以下の関数を使用して、外側、ネイティブ、および内側フレームのエッジを取得できます。
この関数は、frame の外側、ネイティブ、または内側フレームの絶対エッジを返します。frame はライブフレームである必要があり、デフォルトでは選択されたフレームが使用されます。返されるリストは
(left top right bottom) の形式となり、すべての値は frame
のディスプレイの原点を基準としたピクセル単位の値となります。ターミナルフレームの場合、left および
top に返される値は常に 0 となります。
オプション引数 type は、返すエッジの種類を指定します。outer-edges は frame の外周エッジを、native-edges(または nil)はそのネイティブエッジを、inner-edges
はその内周エッジをそれぞれ返すことを意味します。
慣例により、left および top で返される値におけるディスプレイのピクセルは、frame の内部(一部)にあるものとみなされます。したがって、left と top がともに 0 の場合、ディスプレイの原点にあるピクセルは frame の一部となります。一方、bottom と right のピクセルは、frame の直外側に位置するものとみなされます。つまり、例えば、左側のフレームの右外縁が右側のフレームの左外縁と一致するように2つのフレームを横並びに配置した場合、その外縁にあるピクセルは右側のフレームの一部を示すことになります。