Next: Frame Font, Up: Frame Geometry [Contents][Index]
可視なフレームは端末のディスプレイの矩形(rectangular)の領域を占有します。この領域にはそれぞれが異なる用途をサービスする、いくつかのネストされた矩形を含むことができます。以下のスケッチはグラフィカル端末上でのレイアウトを描いたものです:
<------------ Outer Frame Width -----------> ____________________________________________ ^(0) ________ External/Outer Border _______ | | | |_____________ Title Bar ______________| | | | (1)_____________ Menu Bar ______________| | ^ | | (2)_____________ Tool Bar ______________| | ^ | | (3) _________ Internal Border ________ | | ^ | | | | ^ | | | | | | | | | | | | | Outer | | | Inner | | | Native Frame | | | Frame | | | Frame Height | | | Height | | | Height | | | | | | | | | | | | |<--+--- Inner Frame Width ------->| | | | | | | | | | | | | | | | |___v______________________________| | | | | | |___________ Internal Border __________| | v v |___________ External/Outer Border __________| <-------- Native Frame Width -------->
実際のところ上図で示した領域すべてが存在するわけではありません。これらの領域については以下で説明します。
アウターフレーム(outer frame)とは上図で示すすべての領域を網羅する矩形。この矩形の端はそのフレームのアウターエッジ(outer edges)と呼ばれる。フレームのアウター幅(outer width)とアウター高さ(outer height)は併せて矩形のアウターサイズ(outer size)を指定する。
フレームのアウターサイズを把握することはフレームのディスプレイの作業領域にフレームをフィットさせたり、スクリーンで2つのフレームを隣接して配置するのに有用である(Multiple Terminalsを参照)。アウターサイズは通常はフレームが少なくとも1回マップ(可視にすること。Visibility of Framesを参照)された後でなければ利用できない。初期フレームやまだ作成されていないフレームにたいするアウターサイズは予想するかウィンドウシステムやウィンドウマネージャーのデフォルトから計算しなければならない。回避策としてはマップ済みフレームのアウターサイズとネイティブサイズを取得して、新たなフレームのアウターサイズの計算に使用すればよい。
(上図‘(0)’で示される)アウターフレームの左上隅の位置はフレームのアウター位置(outer position)と呼ばれる。グラフィカルなフレームのアウター位置は、ディスプレイではフレームのリサイズやレイアウト変更では未変更のままなので、そのフレームの“位置”としても参照される。
アウター位置はフレームパラメーターleft
とtop
を通じて指定とセットができる(Position Parametersを参照)。これらのパラメーターは通常のトップレベルのフレームにたいして、通常はフレームのディスプレイの原点からみた絶対位置(以下参照)を表す。子フレーム(Child Framesを参照)にたいしては親フレームのネイティブ位置(以下参照)から相対的な位置を表す。これらのパラメーターの値はテキスト端末のフレームでは意味がなく常に0である。
エクスターナルボーダー(external border)はウィンドウマネージャーにより提供される装飾の一部。典型的にはマウスによるフレームのリサイズで典型的に使用される。そのため“全画面化(fullboth)”や最大化されたフレームでは表示されない(Size Parametersを参照)。エクスターナルボーダーの幅はウィンドウマネージャーにより決定されて、Emacsの関数では変更できない。
テキスト端末のフレームではエクスターナルボーダーは存在しない。グラフィカルなフレームではフレームパラメーターoverride-redirect
とundecorated
をセットすることにより表示を抑制できる(Management Parametersを参照)。
アウターボーダー(outer border)はフレームパラメーターborder-width
(Layout Parametersを参照)で指定可能な分割線。実際にはエクスターナルボーダーとアウターボーダーのいずれかが表示されるが、両方が同時に表示されることはない。アウターボーダーはツールチップフレーム(Tooltipsを参照)、子フレーム(Child Framesを参照)、およびundecorated
やoverride-redirect
をセットされたフレーム(Management Parametersを参照)のようにウィンドウマネージャーにより(完全に)制御される特別なフレームでは通常は表示されない。
アウターボーダーはテキスト端末のフレームとGTK+ルーチンが生成したフレームでは表示されない。MS-Windowsではアウターボーダーはピクセル幅が1のエクスターナルボーダーの助けを借りてエミュレートされる。X上でのツールキットによらないビルドではフレームパラメーターborder-color
をセットすることによりアウターボーダーのカラーを変更できる(Layout Parametersを参照)。
タイトルバー(title bar)、いわゆるキャプションバー(caption
bar)もウィンドウマネージャーの装飾の一部であり通常はフレームのタイトル(Frame Titlesを参照)、同様に最小化や最大化、削除のボタンを表示する。これはマウスによるフレームのドラッグにも使用できる。タイトルバーは通常は全画面化(fullboth)されたフレーム(Size Parametersを参照)、ツールチップフレーム(Tooltipsを参照)、子フレーム(see Child Framesを参照)では表示されず、端末フレームでは存在しない。タイトルバーの表示はフレームパラメーターoverride-redirect
やundecorated
をセットすることにより抑制できる(Management Parametersを参照)。
メニューバー(Menu Barを参照)にはインターナル(Emacs自身が描画)とエクスターナル(ツールキトが描画)がある。ほとんどのビルド(GTK+、Lucid、Motif、MS-Windows)ではエクスターナルメニューバーを依拠とする。NSもエクスターナルメニューバーを使用するが、これはアウターフレームの一部ではない。非ツールキットのビルドはインターナルメニューバーを提供できる。テキスト端末フレームではメニューバーはフレームのルートウィンドウの一部である(Windows and Framesを参照)。ルールとして子フレームでメニューバーが表示されることはない(Child Framesを参照)。パラメーターmenu-bar-lines
(Layout Parametersを参照)をセットすることによりメニューバーの表示は抑制できる。
メニューバーの幅がフレームにフィットするには大きくなりすぎた際に折り返されるか(wrapped)、それとも切り詰められるか(truncated)はツールキットに依存する。通常はMotifとMS-Windowsのビルドだけがニューバーを折り返すことができる。これらはメニューバーの折り返し、またはそれを解除する際にフレームのアウター高さの保持を試みるの、でかわりにフレームのネイティブ高さ(以下参照)が変更される。
メニューバーと同じように、ツールバーにはインターナルツールバー(Emacsが描画)とエクスターナルツールバー(ツールキットが描画)がある。GTK+とNSのビルドにはそれらのツールキットが描画するツールバーがある。その他のビルドはインターナルツールバーを使用する。GTK+ではフレームのインタナルボーダー(以下参照)のすぐ外側のいずれかのサイドにツールバーを配置できる。子フレームは通常はツールバーを表示しない(Child Framesを参照)。パラメーターtool-bar-lines
(Layout Parametersを参照)に0をセットすることでツールバーの表示を抑制できる。
変数auto-resize-tool-bars
が非nil
なら、フレームに収まらないほど幅が大きくなるとEmacsはツールバーを折り返す。Emacsがインターナルツールバーの折り返しや折り返しの解除を行う場合には、デフォルトではフレームのアウター高さを未変更に保つので、かわりにフレームのネイティブ高さ(以下参照)が変更される。一方GTK+とともにビルドされたEmacsではツールバーの折り返しは決して行われないが、長くなりすぎたツールバーが収まるようにフレームのアウター幅が自動的に増加される。
ネイティブフレーム(native frame)は全体的にアウターフレーム内に配置される。ネイティブフレームにはエクスターナルボーダーとアウターボーダー、タイトルバーとエクスターナルメニューバーとツールバーが占有する領域は含まれない。ネイティブフレームのエッジ(edge: 端)はフレームのネイティブエッジ(native edges)と呼ばれる。フレームのネイティブサイズ(native size)ハ、フレームのネイティブ幅(native width)とネイティブ高さ(native height)で指定される。
フレームのネイティブサイズはEmacs内のフレームの作成やリサイズをEmacsが行う際にウィンドウシステムやウィンドウマネージャーに渡すサイズである。これはたとえばタイトルバーの対応するボタンのクリックによりフレームを最大化した後やマウスでエクスターナルボーダーをドラッグした際等、フレームの(ウィンドウシステムの)ウィンドウをリサイズする際にウィンドウシステムやウィンドウマネージャーに渡すサイズでもある。
ネイティブフレームの左上隅の位置はフレームのネイティブ位置(native position)を指定する。上図の(1)から(3)は種々のビルドにたいするネイティブ位置を示す。
したがってLucid、Motif、MS-Windowsではネイティブ高さにツールバーの高さは含まれるがメニューバーの高さは含まれず、非ツールキットおよび端末のフレームではメニューバーとツールバーの高さは含まれない。
フレームのネイティブ位置はマウスのカレント位置(Mouse Positionを参照)のセットやリターンを行う関数やwindow-edges
、window-at
、coordinates-in-window-p
のようにウィンドウ位置(Coordinates and Windowsを参照)を扱う関数にたいして参照位置となる。これはフレームの子フレームの配置や位置にたいする原点(0, 0)も指定する。
フレームパラメーターoverride-redirect
やundecorated
(Management Parametersを参照)を変更してウィンドウマネージャーの装飾の削除や追加を行う際にも、フレームのネイティブ位置は未変更のままであることにも注意。
インターナルボーダーはインナーフレーム(以下参照)の周辺にEmacsが描画するボーダーである。インターナルボーダーの幅はフレームパラメーターinternal-border-width
により指定される(Layout Parametersを参照)。インターナルボーダーのカラーはinternal-border
フェイスのバックグラウンドで指定される。
インナーフレーム(inner frame)はフレームのウィンドウにたいして予約された矩形のこと。インナーフレームはインターナルボーダー(これはインナーフレームの一部ではない)に囲われている。インナーフレームのエッジはフレームのインナーエッジ(inner edges)と呼ばれる。この矩形のインナーサイズ(inner size)はインアー幅(inner width)とインナー高さ(inner height)により指定される。このインナーフレームはフレームのディスプレイエリア(display area)として参照されることもある。
ルールとしてインナーフレームはフレームのルートウィンドウ(Windows and Framesを参照)とミニバッファーウィンドウ(Minibuffer Windowsを参照)に細分される。この2つには注目すべき2つの例外がある。それはミニバッファーウィンドウをもたないルートウィンドウのみのミニバッファーlessフレーム(minibuffer-less frame)と、ミニバッファーウィンドウだけをもち、それがフレームのルートウィンドウの役目も果たすミニバッファーonlyウィンドウ(minibuffer-only frame)である。そのようなフレーム構成を作成する方法はInitial Parametersを参照のこと。
フレームのテキストエリア(text area)はネイティブフレームに埋め込み可能な一種の架空領域である。テキストエリアの位置は指定されない。テキストエリアの幅はネイティブ幅からインターナルボーダーの幅、そのフレームに指定されていれば(Layout Parametersを参照)1つの垂直スクロールバーの幅、左右のフリンジ各1の幅を取り除くことにより取得できる。テキストエリアの高さはネイティブ高さからインターナルボーダーの幅、そのフレームに指定されていればフレームのインターナルメニューバーとインターナルツールバーの高さ、1つの水平スロールバーの高さを取り除くことにより取得できる。
フレームの絶対位置(absolute position)は(X, Y)というペア、またはフレームのディスプレイの原点(0, 0)から相対的な水平および垂直のピクセル単位のオフセットにより与えられる。これに対応してフレームの絶対エッジ(absolute edges)はこの原点からのピクセル単位のオフセットにより与えられる。
マルチモニターではディスプレイの原点が端末の利用可能な表示エリア全体の左上隅と一致する必要はない。したがってそのような環境では、たとえそのフレームが完全に可視であってもフレームの絶対位置は負の値になり得る。
慣例により垂直方向のオフセットは“下方向”にたいして増加する。これはフレームの下エッジから上エッジのオフセットを減ずることによりフレームの高さが得られることを意味する。期待されるように水平方向のオフセットは“右方向”にたいして増加するので、フレームの右エッジから左エッジのオフセットを減ずることによりフレームの幅を計算できる。
以下の関数はグラフィカル端末上のフレームにたいして上述したエリアのサイズをリターンします:
この関数はframeの幾何学的な属性をリターンする。リタ^ン値は以下のような属性のリストの連想リスト。すべての座標、高さや幅の値はピクセル単位の整数。まだframeがマップされていなければ(Visibility of Framesを参照)、いくつかのリターン値は実際の値の近似値しか表していないかもしれない(それらの値はフレームのマップ後に確認可能になる)。
outer-position
frameのアウターフレームの絶対位置を表すコンスであり、frameのディスプレイの原点(0, 0)から相対的な位置。
outer-size
frameのアウター幅とアウター高さを表すコンス。
external-border-size
ウィンドウマネージャーにより与えられる、frameエクスターナルボーダーの水平幅と垂直幅を表すコンス。ウィンドウマネージャーによりこれらの値が提供されなければ、Emacsはアウターフレームとインナーフレームの座標からそれらの推測を試みる。
outer-border-width
frameのアウターボーダーの幅。この値は非GTK+のXビルドでのみ意味がある。
title-bar-size
ウィンドウマネージャーまたはオペレーティングシステムが与える、frameのタイトルバーの幅と高さを表すコンス。いずれも0なら、そのフレームにタイトルバーはない。幅だけが0なら、Emacsが幅の情報を取得できなかったことを意味する。
menu-bar-external
非nil
なら、それはメニューバーがエクスターナルである(frameのネイティブフレームの一部ではない)ことを意味する。
menu-bar-size
frameのメニューバーの幅と高さを表すコンス。
tool-bar-external
非nil
なら、それはツールバーがエクスターナルである(frameのネイティブフレームの一部ではない)ことを意味する。
tool-bar-position
これはツールバーがframeのどの端に配置されているかを示しleft
、top
、right
、bottom
のいずれか。現在のところtop
以外の値をサポートするツールキットはGTK+のみ。
tool-bar-size
frameのツールバーの幅と高さを表すコンス。
internal-border-width
frameのインターナルボーダーの幅。
以下の関数はフレームにたいするアウター、ネイティブ、インナーのエッジの取得に使用できます。
この関数は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つの横並びのフレームがあり、左フレームの右アウトーエッジが右フレームの左エッジと等しければ、そのエッジ上のピセルは右フレームの一部として表されることを意味する。
Next: Frame Font, Up: Frame Geometry [Contents][Index]