これは 0.6 版、最終更新日 12 December 1999 の sawfish の The sawfish Programming Manual バージョン 0.19 の翻訳版(最終更新日 19 August 2000) です。

Copyright 1999、2000 John Harper (原著)、 Copyright 1999、2000 Satoru SATO (翻訳版)

Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.

Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

この文書は 拡張可能な X11 ウィンドウマネージャ sawfish の Lisp によるプログラミングインターフェースについて記述されたものです。

これは 0.6 版、最終更新日 12 December 1999 の sawfish 0.19 の翻訳版(最終更新日 19 August 2000) です。

Copying
*******

Sawfish is copyright (C) 1999 John Harper and is released under the terms of the GNU General Public License. See the included file COPYING for the full text of the license (or see Copying (The GNU Emacs Manual)).

     This is free software -- you are welcome to redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version.

     Sawfish is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

Introduction
************

sawfish は X11 の Lisp による拡張が可能なウィンドウマネージャです。これはできるかぎりすべてのウィンドウを制御する領域(装飾、操作)でのカスタマイズが可能かつ、それでもなお既存のウィンドウマネージャと同等の速さかあるいはそれらよりも速くなることを目指しています。

この拡張性にもかかわらず、その[設計]方針は大抵のウィンドウマネージャと比較しても最小限です。まだデスクトップの背景[の設定機能]やアプリケーションドック、あるいは他の機能は実装されていないので、分離された他のアプリケーションから得なければなりません。

[訳注: つまり sawmill を単体で起動しても X のデフォルトの格子の画面にしかならず何も動いていないように見えます。従って、例えば背景を設定するなら GNOME と一緒に使って GNOME の方でデスクトップの背景の設定をしたり、xli や display (Imagemagick に含まれる) などで背景を設定したりする必要があります。これは背景など何もいらない :-) という方には逆にうれしいかもしれないですが :-)]

すべての高等なウィンドウ制御の機能は将来の拡張性、あるいは再定義のために Lisp で実装されています。そしてまた Emacs のように[ウィンドウマネージャが]受け取った大抵のイベントはキー割り当てやフックを通じて Lisp [実行]環境に届けられます。これらのイベントには[マウス]ポインタの振舞いや多くの X11 内部のイベントが含まれています。

Sawfish は librep という Lisp 環境 (see Overview (The Librep Manual))を使いますが、これは Emacs Lisp (see Overview (The Emacs-Lisp Manual)) に似た、けれども多くの拡張(例えば、動的なスコープの代わりに文法的なスコープ)がなされた言語を実装した実行時ライブラリです。このマニュアルはこの言語の最低限の基本的な知識を身に付けるためのものです。

     [file news.texi not included]

Colors
******

sawfish は表示される色に関する基本的な型を提供します。各カラーオブジェクトは単色の値の名前がつけられ、Lisp 関数を通じて渡されます。

 -- Function: colorp arg
     ARG がカラータイプに属するとき t を返します。

 -- Function: get-color name
     文字列 NAME で指定された色を表わすカラーオブジェクトを返します。これは標準的な X11 の色の指定法に従い、rgb.txt データベースにある名前の色でも、色の赤、緑、青の要素[訳注: RGB 指定のこと]による指定でも、16 進 数での 8 か 16 ビット、すなわち #RRGGBB や #RRRRGGGGBBBB の指定でもいいです。

     名前 NAME を持つ色が未知であるとエラーのシグナルを返します。

 -- Function: get-color-rgb red green blue
     指定された RGB 要素(各要素のレンジは 0 から 65535 まで)の色を表すカラーオブジェクトを返します。

カラーオブジェクトを与えるとその色を定義する実際の RGB 値と X11 でその色を参照するのに使う名前が両方ともわかります。

 -- Function: color-rgb color
     カラーオブジェクトにより表わされる色の実際の色の整数値のリスト (RED GREEN BLUE) を返します。この値の範囲は 0 から 65535 までです。

 -- Function: color-name color
     カラーオブジェクト COLOR によって表わされる色を特定するのに使われる X11 での名前を定義する文字列を返します。

テキスト部分の前景色を定義するのにカラーオブジェクトが使われる際には default-foreground カラーは実際の色指定がなされていない場合に使われるデフォルト値を与えます。

 -- Variable: default-foreground
     他の色が全く指定されていないときにテキストの色として使われます。

Fonts
*****

カラータイプの場合と同様にフォントタイプは X11 のフォントを Lisp コードで操作できるようにします。

 -- Function: fontp arg
     ARG がフォントオブジェクトなら t を返します。

 -- Function: get-font name
     文字列により特定される X11 フォントが表わすフォントオブジェクトを返します。

     NAME という名前のフォントがないときエラーシグナルを返します。

いくつかの関数はフォントオブジェクトに関連づけられた属性をみつけることができます。

 -- Function: font-name font
     オブジェクト FONT (文字列)により表わされる X11 のフォントの名前を返します。

 -- Function: font-height font
     オブジェクト FONT (文字列)により表わされるフォントでグリフに割当られた高さを返します。

 -- Function: text-width string &optional font
     フォントオブジェクト FONT (あるいは FONT が指定されていないときには default-font の値)を使いテキスト STRING を表示するのに必要な水平方向のピクセル数値を返します。

 -- Variable: default-font
     他のフォントが指定されていないときに使われるフォントオブジェクトです。

フォントはそれらに関連づけられた Lisp プロパティを持てます(シンボルに関連づけられたプロパティリストに似ています)。しかし、今のところ実際にはそれらはウィンドウマネージャに使われていません。

 -- Function: font-put font property value
     フォントオブジェクト FONT のシンボル PROPERTY により指名されたプロパティを lisp オブジェクト VALUE に関連づけます。

 -- Function: font-get font property
     フォント FONT のシンボル PROPERTY により指名されたプロパティの値を返します。もしそのようなプロパティが存在しなければ nil を返します。

Images
******

イメージタイプはウィンドウマネージャが任意の 24-bit 画像を操作できるようにします。画像はファイルから読み込むことも動的に生成されることもあります。

 -- Function: imagep arg
     ARG がイメージタイプに属すなら t を返します。

 -- Function: make-image FILE-NAME
     FILE-NAME (文字列)という名前のファイルの中身で定義される画像を含むイメージオブジェクトを生成し、返す。image-load-path ディレクトリは FILE-NAME という名前のファイルを含むディレクトリを探そうと試みる際に使われる検索パスを与える。

     おそらくすべての一般的なイメージフォーマットが読み込めるだろう。しかし、 PNG、JPEG、そして XPM はいつもサポートされている。

     FILE-NAME というファイルがみつからないかそのファイルから画像が構成できないときエラーシグナルを返します。

 -- Variable: image-load-path
     ディレクトリ名のリストで、画像を読み込むときの検索パスを定義します。

 -- Function: make-sized-image width height &optional color
     大きさ WIDTH、HEIGHT の新しいイメージ[オブジェクト]を生成し、返します。もし COLOR が定義されていればそれで画像の中のすべてのピクセルの色が指定されます。もし未定義ならばすべてのピクセルは黒になります。

 -- Function: copy-image image
     イメージオブジェクト IMAGE の正確なコピーである新しく確保されたイメージオブジェクトを返します。

 -- Function: image-dimensions image
     IMAGE によって表わされるイメージオブジェクトの大きさを定義するコンスセル (WIDTH . HEIGHT) を返します。

 -- Function: flip-image-horizontally image
     垂直軸について IMAGE の内容をひっくり返します。

 -- Function: flip-image-vertically image
     水平軸について IMAGE の内容をひっくり返します。

 -- Function: flip-image-diagonally image
     画像の上-左角から下-右角方向の軸について IMAGE の内容をひっくり返します。

他の多くの型と同様にイメージオブジェクトについても任意の状態を関連づけることができます。

 -- Function: image-put image property value
     IMAGE の PROPERTY (シンボル)というプロパティを VALUE に設定します。

 -- Function: image-get image property
     IMAGE の PROPERTY (シンボル)というプロパティを返し、もしそのようなプロパティが存在しなければ nil を返します。

あらかじめ定義された唯一のプロパティはシンボル tiled で、画像がウィンドウの修飾の中で表示される際に使われます。nil でない値を設定すると画像は装飾の大きさに調整される(デフォルト)のではなく、装飾上に敷き詰められます。

画像が装飾の境界を越えて調整されるとき、実際に調整されるピクセルは画像の境界で定義されます。境界は現状のままで残されるピクセルの外側の長方形と調整される内側の長方形を決定します。

 -- Function: image-border image
     イメージオブジェクト IMAGE の境界の整数値のリスト (LEFT RIGHT TOP BOTTOM) を返します。

     画像の各端に関連づけられた数値は調整 されない端に隣接するピクセル数を定義します。

 -- Function: set-image-border image left right top bottom
     IMAGE の境界を設定します。

また画像の形状が特定されることもあり、これはどのピクセルが透明なものとして扱われるかを決定しています。各画像は透明なピクセルの印として一つの色を定義できます。

 -- Function: image-shape-color image
     IMAGE の中の透明なピクセルの印の色か、もしそのような色が指定されていなければ nil を返します。

 -- Function: set-image-shape-color image color
     IMAGE の中の透明なピクセルの印の COLOR を指定します。

各画像に対して カラーモディファイアを定義することも可能です。これらは表示される際の各ピクセル値に加えられる変換を定義します。4 つの異なるモディファイアが各画像に対して存在し、あるものは各色の成分に対するものであるものは画像全体に対するものです。

 -- Function: image-modifier image type
     IMAGE のシンボル TYPE により定義されたモディファイア、整数値のリスト (GAMMA BRIGHTNESS CONTRAST) を返します。各整数は画像を表示する際に関連づけられた特性に適用される重みを表す 0 から 255 までの値を持ちます。

     4 つの type は red, green, blue そして nil (すべての色)です。

 -- Function: set-image-modifier image type gamma brightness contrast
     TYPE で定義された IMAGE のカラーモディファイアを設定します。

他にも画像を操作するいくつかの関数があります:

 -- Function: bevel-image image border upwards &optional bevel-percent
     IMAGE の最端のピクセルに ``bevelled(傾斜)''効果を与えて変換します。 BORDER はベベル(傾斜)の幅を定義する整数値です。もし UPWARDS が nil でなければベベル(傾斜)は大きく、そうでなければ小さくなります。

     もし BEVEL-PERCENT が定義されていればベベル描画時の高さか深さが定義されます。未定義ならば default-bevel-percent の値がパラメータ値となります。

 -- Variable: default-bevel-percent
     デフォルトのベベル描画の高さ(%)です。

 -- Function: clear-image image &optional color
     IMAGE の中のすべてのピクセルを COLOR (COLOR が未定義ならば黒)にします。

 -- Function: tile-image dest-image source-image
     SOURCE-IMAGE を DEST-IMAGE に左上角から外側に向かって敷き詰めます。

Cursors
*******

カーソルはマウスポインタの画像の形とホットスポットを定義します。これらのオブジェクトを操作するためにある lisp のタイプが提供されています。

 -- Function: cursorp arg
     ARG がカーソルタイプに属するとき t を返します。

 -- Function: get-cursor data
     DATA で定義されるカーソルを表わすカーソル[オベジェクト]を返します。もし DATA がシンボルならばその cursor-shape プロパティによって置き換えられます。

     可能な DATA の値は標準 X11 カーソルフォントのグリフを表わす整数かあるいは四つの成分をもつベクトルです。

     もしベクトルのフォーマットが [IMAGE MASK FG BG] であるなら IMAGE と MASK は標準 X11 bitmap のファイルで、FG と BG は色(か色名)です。すべてのbitmap ファイルは image-load-path 変数を使って検索されます。

 -- Function: recolor-cursor cursor fg bg
     カーソルのカーソルオブジェクト CURSOR の色を FG とBG (カラーオブジェクトか色名)に変えます。

 -- Variable: default-cursor
     他のカーソルが指定されていない場合の root ウィンドウとウィンドウのパーツ内で表示されるカーソルオブジェクトです。

X11 カーソルフォントのグリフを指標する整数値は記憶されないので、以下のシンボルの cursor-shape プロパティは自動的に設定されます:

X_cursor, arrow, based_arrow_down, based_arrow_up, boat, bogosity, bottom_left_corner, bottom_right_corner, bottom_side, bottom_tee, box_spiral, center_ptr, circle, clock, coffee_mug, cross, cross_reverse, crosshair, diamond_cross, dot, dotbox, double_arrow, draft_large, draft_small, draped_box, exchange, fleur, gobbler, gumby, hand1, hand2, heart, icon, iron_cross, left_ptr, left_side, left_tee, leftbutton, ll_angle, lr_angle, man, middlebutton, mouse, pencil, pirate, plus, question_arrow, right_ptr, right_side, right_tee, rightbutton, rtl_logo, sailboat, sb_down_arrow, sb_h_double_arrow, sb_left_arrow, sb_right_arrow, sb_up_arrow, sb_v_double_arrow, shuttle, sizing, spider, spraycan, star, target, tcross, top_left_arrow, top_left_corner, top_right_corner, top_side, top_tee, trek, ul_angle, umbrella, ur_angle, watch, xterm.

これらの名前に関連したグリフは Xlib リファレンスマニュアルの Volume 2 の Appedix I で見ることができます。

Windows
*******

sawfish で最も重要なデータタイプの一つがウィンドウタイプです。すべての制御下のクライアントウィンドウはそれらに関連づけられた一つのウィンドウオブジェクトを持ちます。

 -- Function: windowp arg
     ARG がウィンドウタイプに属し、それに関連づけられたクライアントウィンドウをもつときに t を返します。

 -- Function: managed-windows
     すべての制御下のウィンドウオブジェクトのリストをウィンドウマネージャに adopt された[訳: 生成された?]順番で(最初のものから最後のものまで)返します。

 -- Function: get-window-by-id xid
     ID XID のウィンドウオブジェクトか nil を返します。

 -- Function: get-window-by-name name
     名前 NAME のウィンドウオブジェクトか nil を返します。

Window Property Lists
=====================

多くのウィンドウマネージャの拡張[機能]は個々のウィンドウに Lisp データを関連づけられることを必要とします。例えばアイコン化のモジュールハンドリングはアイコン化されているかどうかを示す、個々のウィンドウに対する論理値を持つ必要があります。

この問題を解決するために、sawfish は個々のウィンドウにプロパティリストを与えます。これらは各シンボルについて保存されたプロパティリスト (see Property Lists (The Librep Manual) それらは特定のウィンドウに対して Lispシンボルを関連づけることが可能です)と正確に相似しています。

これらのプロパティはウィンドウマネージャ内部でのプロパティなので X が個々のウィンドウについて保持しているプロパティとは異なることに注意する必要があります(see X Properties)。

 -- Function: window-put window property value
     ウィンドウオブジェクト WINDOW に関連した PROPERTY (シンボル) という Lisp プロパティに VALUEを設定します。

 -- Function: window-get window property
     ウィンドウオブジェクト WINDOW に関連した PROPERTY のウィンドウプロパティか、(もしそのようなプロパティが存在しなければ) nil を返します。

標準的なウィンドウプロパティのリストについては Standard Properties を参照して下さい。

Window Attributes
=================

 -- Function: window-name window
     WINDOW に関連づけられた名前を返します。

 -- Function: window-full-name window
     WINDOW に関連づけられた完全な名前を返します。これは普通の名前と同じことも違うこともあります。

 -- Function: window-icon-name window
     WINDOW に関連づけられたアイコン名を返します。

 -- Function: window-mapped-p window
     オブジェクト WINDOW に関連づけられたクライアントウィンドウが配置されていれば t を返します(これは必ずしもそれが可視であること[ 訳注: 例えばアイコン化されている場合]を意味しないことに注意)。

 -- Function: window-transient-p window
     WINDOW が一時ウィンドウ[ダイアログウィンドウなど]でなければ nil を返します。一時ウィンドウであれば親ウィンドウの xid を整数で返します。

 -- Function: window-shaped-p window
     WINDOW が形を持つ(おそらく長方形でない) [訳注: 通常の長方形ではない複雑な形をもつ、例えば gqmpeg でスキンを変えた場合など]ならばt を返します。

 -- Function: window-id window
     ウィンドウに関連づけられたクライアントウィンドウの xid 整数値を返します。

 -- Function: window-group-id window
     WINDOW が属するグループの頭目の xid を定義する整数値か、もし WINDOW がグループに属しなければ nil を返します。

 -- Function: window-wants-input-p window
     オブジェクト WINDOW に関連づけられたクライアントウィンドウが適切なときに(WM_HINTS プロパティの input フィールドを通じて)入力フォーカスを割り当てるように要求したとき、t を返します。

 -- Function: window-dimensions window
     オブジェクト WINDOW に関連づけられたクライアントウィンドウの大きさを定義するコンスセル (WIDTH . HEIGHT) を返します。

 -- Function: window-position window
     WINDOW の root ウィンドウに対する位置を定義するコンスセル (X . Y) を返します。

 -- Function: window-size-hints window
     WINDOW に関連づけられたクライアントウィンドウが指定した size-hints (サイズヒント)構造体を定義するリストを返します。そのリストの中で可能なキーワードは min-height、max-height、min-width、 max-width、height-inc、width-inc、min-aspect、 max-aspect、base-height、base-width、 user-position、program-position、user-size、 program-size、window-gravity。

 -- Function: window-visibility window
     WINDOW のそのときの可視性を定義するシンボルを返します。返されるシンボルとして可能なものは fully-obscured、 partially-obscured、unobscured。

Input Focus
===========

入力フォーカスはキーボードが生成したイベントをどのクライアントウィンドウが受け取るかを正確に定義します。

 -- Function: input-focus
     現在フォーカスされているウィンドウの Window オブジェクトか、あるいはどのウィンドウもフォーカスされていなければ nil を返します。

 -- Function: set-input-focus window
     WINDOW に関連づけられたクライアントウィンドウにフォーカスします。

 -- Variable: focus-mode
     そのときのマウスを使って入力フォーカスを割り当てる方法を定義します。可能な値は enter-exit、enter-only そして click です。

 -- Variable: focus-proxy-click
     click-to-focus モードのとき、もしこの変数が nil でないならばフォーカスに割り当てられたクリックは単にクライアントウィンドウに透過します。

     このオプションは(window-put 関数を使って)ウィンドウの focus-click-through プロパティを設定することでウィンドウ毎に設定できます。

sawfish はまた、最近どのウィンドウがフォーカスされたかという順番も保存しています。

 -- Function: window-order &optional workspace allow-iconified all-viewports
     もっとも最近フォーカスされた順番でウィンドウのリストを返します。

     もし WORKSPACE が整数で与えられたらその[番号の]ワークスペースに含まれるウィンドウだけを、そうでなければすべてのワークスペースで検索されます。

     もし ALLOW-ICONIFIED が nil でなければアイコン化されたウィンドウも含めます。もし all-viewports が nil でなければワークスペースのすべての viewport で検索されます。

 -- Function: window-order-push window
     フォーカススタックの一番上に Window オブジェクト WINDOW を押し上げます。

 -- Function: window-order-pop window
     フォーカススタックから Window オブジェクト WINDOW を取り除きます。

 -- Function: window-order-focus-most-recent
     現在のワークスペース、ビューポートでもっとも最近フォーカスされたウィンドウにフォーカスします。

X Properties
============

X window system はプロパティをウィンドウに関連づけます(これらは sawfish がウィンドウオブジェクトと関連づけているプロパティとはまったく別です: see Window Property Lists)。たいていのクライアントとのやりとりはこれらのプロパティの操作を通じてなされます。

以下で定義されるすべての X のプロパティを操作する関数はそれらの WINDOW パラメータ群を Window オブジェクト(関連づけられたクライアントウィンドウを示します)としてもウィンドウの xid 数値としても、あるいはルートウィンドウを示すシンボル root としても受け入れます。

sawfish は X アトム(X プロパティの名前とデータ型の両方)をシンボルとして表します。アトムの名前とそれらを表現するシンボルの名前は正確に一致します。例えば、X アトム STRING は lisp シンボル STRING で表されます。

 -- Function: list-x-properties window
     WINDOW に設定された X プロパティを定義する Lisp シンボルのリストを返します。

 -- Function: delete-x-property window property
     WINDOW に関連づけられた、PROPERTY (シンボル)という X プロパティを消去します。

 -- Function: get-x-property window property
     WINDOW の X プロパティ PROPERTY を表わす(TYPE FORMAT DATA) のリストを返します。もしそのようなプロパティがなければ nil を返します。

     TYPE はプロパティの型を決定するアトムです。FORMAT は 8、16、あるいは 32 という整数値でデータの項目の中の各ビット数値を定義します。 DATA は配列で、8 bit フォーマットのプロパティに対する文字列か整数のベクトルです。

 -- Function: set-x-property window property data type format
     WINDOW の X プロパティ PROPERTY に文字列か整数のベクトルの DATA を設定します。

     TYPE はプロパティの型を定義するアトムを表わすシンボルで、 FORMAT はデータの値のビット数値を定義する 8、16、あるいは 32 です。

     もし TYPE が ATOM で FORMAT が 32 ならば DATA の中のどのシンボルもそれらの数値 X アトムに変換されます。

標準的な X プロパティのフォーマットでは文字列の配列で保存されることを許さないので、これらはしばしば 0 で区切られて連結された文字列に符号化されます。これらは普通 テキストプロパティ と呼ばれます。sawfish はこれらを操作する二つの関数を持ちます。

 -- Function: get-x-text-property window property
     get-x-property に似ていますが nil か文字列のベクトルを返します。

 -- Function: set-x-text-property window property data
     WINDOW の X テキストプロパティ PROPERTY を文字列 DATA の配列に設定します。

property-notify-hook を使って制御下のウィンドウに関連づけられた任意のプロパティの変化を検出することもできます。See Standard Hooks.

Window Stacking
===============

ディスプレイスタックの順番は一番前のものから一番背後のものまでウィンドウの見える順番を定義します。

 -- Function: stacking-order
     現在の一番前から一番背後まですべてのウィンドウスタックの順番を定義する Window オブジェクトのリストを返します。

 -- Function: restack-windows list
     ウィンドウオブジェクトのリスト LIST で指定されたすべてのクライアントウィンドウをそれらがリストの中で現われる順番で再スタックします。指定されていないウィンドウのスタックの順番には影響を与えます。

 -- Function: x-raise-window window
     オブジェクト WINDOW に関連づけられたクライアントウィンドウを画面の最前面に出します。

sawfish はスタックの順番がその順番の特定の深さ[訳注: 原著ではdepth です。どうも"深さ"という訳には少し抵抗あるのですが適当な訳語がわかりませんのでとりあえず直訳します]に指定されたウィンドウをともなうレイヤー列として操作されることを許します。任意に与えられた深さ D のウィンドウは深さが D よりも小さいすべてのウィンドウより上に DEPTH より大きい深さのすべてのウィンドウより下になります。それ[深さ D のそのウィンドウ] は深さ D の任意の他のウィンドウの上か下になります。

各ウィンドウの depth プロパティはこの深さを記録しておくのに使われます。深さ 0 は ``normal''で、負の深さではより下にスタックされ、そして正の深さではこの normal レベルより上にスタックされます。

 -- Function: stacking-order-by-depth depth
     stacking-order に似ていますが深さ DEPTH のウィンドウだけ返します。

 -- Function: set-window-depth window depth
     WINDOW のスタックの深さを DEPTH に設定し、それからこの変化を反映させるためにウィンドウ群をスタックしなおします。

 -- Function: window-on-top-p window
     WINDOW のスタックの深さが一番上であるときに t を返します。

 -- Function: stack-window-below below above
     ウィンドウ BELOW のスタックの順番を変える、すなわちウィンドウ ABOVE のすぐ下にします。

 -- Function: stack-window-above above below
     ウィンドウ ABOVE のスタックの順番を変える、すなわちウィンドウ BELOW のすぐ上にします。

 -- Macro: save-stacking-order &rest forms
     暗黙の progn の中の FORMS を評価し、元のウィンドウのスタックの順番に戻し、progn の値を返します。

次の関数についてはすべて対話的に呼ばれたときに現在のイベントを受け取るウィンドウか、あるいはそのときフォーカスされたウィンドウに対して作用します。

 -- Command: lower-window window
     WINDOW をそのスタックの深さの一番下に下げます。

 -- Command: raise-window window
     WINDOW をそのスタックの深さの一番上に上げます。

 -- Command: raise-lower-window window
     もし WINDOW がスタックレベルの一番高いところにあるならこのレベルの一番下に下げ、そうでなければそのレベルの一番上に上げます。

 -- Command: lower-window-depth window
     WINDOW のスタックの深さを下げます。

 -- Command: raise-window-depth window
     WINDOW のスタックの深さを上げます。

Moving and Resizing Windows
===========================

前述 (see Window Attributes) のとおり window-dimensions および window-position 関数はウィンドウの現状態を返します。

 -- Function: move-window-to window x y
     WINDOW の左上角を[支点にウィンドウを] (X, Y) に移動させます。

 -- Function: resize-window-to window width height
     オブジェクト WINDOW に関連づけられたクライアントウィンドウの大きさを (WIDTH, HEIGHT) に設定します。

 -- Function: move-resize-window-to window x y width height
     前の二つの関数の組み合わせです。

 -- Function: resize-window-with-hints window cols rows &optional hints
     オブジェクト WINDOW に関連づけれられたウィンドウが縦 COLS、横 ROWS になるようにリサイズします。HINTS パラメータは使用するサイズヒント連想リストか、(ウィンドウのヒントを得るのに window-size-hints 関数が使われていれば) nil です。

けれども普通はウィンドウの調整はユーザに委ねられています。以下の関数は対話的に呼ぶことができます。これらの関数の(一つの)引数は現在のイベントを受け取るウィンドウか、現在フォーカスされているウィンドウです。

 -- Command: move-window-interactively window
     WINDOW をマウスで対話的に移動します。マウスボタンを解放するとウィンドウはその位置に配置されます。

 -- Command: resize-window-interactively window
     WINDOW をマウスで対話的にリサイズします。マウスボタンを解放するとウィンドウはその位置に配置されます。

     この関数はリサイズし始めるのに今の位置からウィンドウの端か角を選択して移動させることに注意する必要があります。ウィンドウは 3x3 の格子に分割されます。(格子の)矩形内にリサイズする方向を与えるマウスポインタが含まれています。もしポインタが矩形の中心にあるなら底辺と右端が動かされます。

 -- Command: move-selected-window
     ユーザがマウスでウィンドウを選択するのを待ち、それから対話的にウィンドウを移動します。

 -- Command: resize-selected-window
     ユーザがマウスでウィンドウを選択するのを待ち、それから対話的にウィンドウをリサイズします。

対話的に移動そしてリサイズするときの挙動は以下の変数を通じてカスタマイズすることができます:

 -- Variable: move-outline-mode
     ウィンドウを対話的に移動するときの視覚的な方法を定義するシンボルです。今のところオプションとして含まれているのはワイアフレームの box と完全再描画の opaque です。

 -- Variable: resize-outline-mode
     ウィンドウを対話的にリサイズするときの視覚的な方法を定義するシンボルです。今のところオプションとして含まれているのはワイアフレームの box と完全再描画の opaque です。

 -- Variable: move-show-position
     もし nil でなければ(移動中の)今の位置が画面中央に表示されます。

 -- Variable: resize-show-position
     もし nil でなければ(リサイズ中の)今の大きさが画面中央に表示されます。

 -- Variable: move-snap-edges
     もし nil でなければウィンドウの位置は他のウィンドウの端に極めて接近して ``くっつき''ます。

 -- Variable: move-snap-epsilon
     二つの端をくっつける距離(ピクセル数)です。

Showing and Hiding Windows
==========================

sawfish はディスプレイからクライアントウィンドウを隠すための二つの低レベル関数を提供します。これらは仮想ワークスペースを実装するためにも (see Workspaces)、アイコン化のためにも(see Iconifying Windows)使われています。

 -- Function: hide-window window
     オブジェクト WINDOW が表示されないようにします。

 -- Function: show-window window
     WINDOW (配置されていて画面の中にある)が見えるようにしておきます。

 -- Function: window-visible-p window
     オブジェクト WINDOW が hide-window 関数によって隠されていなければ t を返します。

Destroying Windows
==================

画面から X11 のクライアントウィンドウを消す方法はいくつかあります。これらの違いはそれらがウィンドウとそれが属すアプリケーションに対して見せる ``礼儀正しさ'' の度合です。

 -- Command: delete-window window
     WINDOW を消去します、すなわち、WM_DELETE_WINDOW クライアントメッセージを可能ならば送り、さもなくば単に関連づけられた X11 クライアントを kill します。WINDOW はウィンドウオブジェクトかウィンドウ数値 ID です。

 -- Command: delete-window-safely window
     もしアプリケーションが持つ WINDOW がサポートしていれば、 WM_DELETE_WINDOW を WINDOW に送ります。さもなくば単にビープ音を鳴らします。

 -- Command: destroy-window window
     WINDOW を、それを持つアプリケーションに何ら警告なしに強制終了します。WINDOW はウィンドウオブジェクトかウィンドウ数値 ID です。

 -- Function: x-kill-client window
     WINDOW (ウィンドウオブジェクトかウィンドウ数値 ID)によって特定されるウィンドウを生成した X11 クライアントを強制終了します。

制御下にあるウィンドウが強制終了されると、destroy-notify-hook が続けて実行されます(see Standard Hooks)。

Shading Windows
===============

多くのウィンドウマネージャはウィンドウが shaded [シェード]、つまりウィンドウのタイトルバーだけが見える状態にすることができます。

 -- Command: shade-window window
     WINDOW のタイトルバーだけが見えるようにします。

 -- Command: unshade-window window
     もしウィンドウがシェードされていれば元の状態に戻します。

 -- Command: toggle-window-shaded
     ウィンドウのシェード状態を切り替えます。

ウィンドウの shaded プロパティはウィンドウがシェードされているとき t に設定されます。もし既にこのプロパティが設定されたウィンドウがあるなら、そのウィンドウはシェードされた状態で現れます。

Iconifying Windows
==================

X はウィンドウについてしばしば小さなアイコンで表示される状態のアイコン化状態を定義します。sawfish はこれらのアイコンを表示しませんが代りにすべてのウィンドウを表示するメニューの中で普通と異なる表示でアイコン化ウィンドウを示します。

 -- Command: iconify-window window
     オブジェクト WINDOW に関連づけられたウィンドウをアイコン化します。

 -- Command: uniconify-window window
     オブジェクト WINDOW に関連づけられたウィンドウのアイコン化状態を返します。

ウィンドウのアイコン化状態は iconified プロパティを通じてテストされ、t のときにウィンドウがアイコン化されているとわかります。

Maximizing Windows
==================

ウィンドウの大きさは一時的に maximized [最大化] することができます。

 -- Command: maximize-window window &optional direction
     WINDOW の両方向の大きさが最大化されます。

     もし DIRECTION を定義するなら vertical か horizontal が可能です。

 -- Command: maximize-window-vertically window
     WINDOW の垂直方向の大きさを最大化します。

 -- Command: maximize-window-horizontally window
     WINDOW の水平方向の大きさを最大化します。

 -- Command: unmaximize-window window &optional direction
     WINDOW を元の最大化されていない状態に戻します。

     もし DIRECTION を定義するなら vertical か horizontal が可能です。

 -- Command: maximize-window-toggle window
     WINDOW の最大化と非最大化状態を切り替えます。

     もし DIRECTION を定義するなら vertical か horizontal が可能です。

 -- Command: maximize-window-vertically-toggle window
     WINDOW の垂直方向に最大化されている状態と元の状態を切り替えます。

 -- Command: maximize-window-horizontally-toggle window
     WINDOW の水平方向に最大化されている状態と元の状態を切り替えます。

 -- Function: window-maximized-p window
     WINDOW が最大化されている状態であれば t を返します。

 -- Function: window-maximized-vertically-p window
     WINDOW が垂直方向に最大化されている状態であれば t を返します。

 -- Function: window-maximized-horizontally-p window
     WINDOW が水平方向に最大化されている状態であれば t を返します。

Customization
*************

sawfish は二つのレベルのカスタマイズの方法を提供します:

 1. カスタマイズ: ウィンドウマネージャの既存の特性の振舞いを変更するように変数を設定する、そして、

 2. 拡張性: 新しい Lisp モジュールの生成によってウィンドウマネージャにまったく新しい特性を加える能力です。

これらの内、一つ目の方が二つ目のものより必要とする特別な知識は少ないことは明らかです。しかし、それでもなおユーザは Lisp 形式で設定する変数を含むスタートアップファイルを編集する必要があります。sawfish はこのようにマニュアルで編集する必要をなくすために、GUI をとおしてすべてのカスタマイズがなされ、ウィンドウマネージャが起動するときに毎回自動的に再読み込みされることを可能にする特別な仕組みを持っています。

 -- Command: customize &optional group
     ユーザカスタマイズ GUI を実行します。GROUP は設定するカスタマイズクラスを定義するか、(GROUP が指定されていなければ)すべてのクラスを指定します。

sawfish-ui プログラムは GUI をマニュアルで実行するのに使われます。また、もし GNOME が使われていれば 特定のクラスをカスタマイズするのに GNOME コントロールセンタを使うこともできます。

しかし、これらのカスタマイズクラスを提供するためには Lisp プログラマに特別な必要条件を要求します。変数を宣言するのに defvar 特別形式を単純に使う代わりに defcustom マクロを使う必要があります。これによってその変数には GUI のための必要なデータ型などを含む特別な情報を加えます。

カスタマイズオプションはグループにまとめられます。各グループは名前と関連するオプションの組を含んでいます。今のところグループがサブグループを含むことはできません。

 -- Macro: defgroup group real-name &rest keys
     シンボル GROUP によって定義される名前のカスタマイズグループを宣言します。文字列 REAL-NAME はユーザに見せるグループのタイトルです。

     KEYS はリストで、グループのプロパティを定義します。リストのメンバは組となる項目にグループ化され、最初の項目はプロパティの名前を、二番目の項目はその値を定義します。今のところプロパティはグループの UI ウィジェットを生成する関数を定義する :widget だけです。

     またこのマクロは 新しいグループをカスタマイズするために実行する GUI を可能にする customize:GROUP という名前の対話的な関数を生成します。

 -- Macro: defcustom variable value documentation &rest keys
     はじめの３つは defvar 特別形式に似ていて、もしその変数が関連づけられていなければ、文字列 DOCUMENTATION のドキュメントとともにして VALUE に値を設定する、シンボル VARIABLE に保持される特別な変数を宣言します。

     すべての他のパラメータは defgroup としてキー値の組となります。可能な組は次のとおりです:

     :group GROUP
          変数が属するカスタマイズグループを指定します。

     :type TYPE
          要求される変数のタイプを指定します。現在可能なのは boolean、 number、string、file-name、program-name、 font、color、frame-style、keymap そして (set SYMBOLS...) です。

          boolean タイプは nil か t といずれかの値であることを保証し、set タイプはユーザにリスト中のシンボルの内一つを選択させることを可能にします。

     :require FEATURE
          もしユーザのカスタマイズによって変数が nil でない値に設定されていればその特性 FEATURE が読み込まれなければならないことを示します。これはカスタマイズオプションがスタート時、あるいはそれらを定義するモジュールの前に読み込まれるために不可欠です。

     :allow-nil BOOL
          実際のタイプのメンバのかわりに変数が nil とできるかどうかを指定します。これは string、set、font そして color タイプについてのみサポートされています。

     :set FUNCTION
          デフォルトの custom-set-variable の代わりに FUNCTION を呼ぶことで設定されるべき変数を指定します。関数は３つの引数を受け入れるべきです: (VARIABLE VALUE &optional REQUIRE).

          この関数の通常の動作は値を正しいタイプに変換し、 custom-set-variable を呼ぶことです。この変換は多くの UI ウィジェットがより複雑なタイプを表現する文字列(すなわち、実際のオブジェクトの代わりの色名)を受け入れるので不可欠です。

     :get FUNCTION
          変数の現在の値を読みとる関数を提供します。変数に関連づけられた UI ウィジェットに受け入れられる値を返さなければなりません。変数を含むシンボルの引数とともに呼ばれます。

     :before-set FUNCTION
     :after-set FUNCTION
          変数の値を設定した前後両方ですぐに呼ばれる関数です。変数自身を引数として呼ばれます。

     :range (MIN . MAX)
          数値変数の許される範囲です。もし MIN が nil ならばデフォルトの可能な最小値は 0 で、もし MAX が nil ならばデフォルトでは最大値は不定です。

それらタイプ自身が defcustom 呼出しでの値を上書きされるデフォルトの :set、:get そして :widget 値を定義することが不可欠であることに注意しなければなりません。けれども普通は不可欠とはなりません。

次の例について考えてみましょう:

     (defgroup move "Move/Resize")

     (defcustom move-outline-mode 'opaque
       "The method of drawing windows being moved interactively."
       :type (set opaque box)
       :group move)

     (defcustom move-snap-epsilon 8
       "Proximity in pixels before snapping to a window edge."
       :group move
       :type number
       :range (0 . 64))

これはグループとカスタマイズオプションを定義しています。

Window Frames
*************

もしかしたらウィンドウマネージャのもっとも重要な機能は、クライアントウィンドウを装飾する能力(典型的には境界に対して)とウィンドウが境界へのユーザ入力を通じて制御されることを可能にすることかもしれません。

Sawfish はウィンドウの装飾、境界の Look & Feel を指定し、まったく自由に制御できる方法を提供します。また、どのウィンドウがどの境界(の装飾) になるという制限はなく、もし必要なら各ウィンドウに対してまったく異なる境界 (の装飾)を動的に生成することができます!

Frame Basics
============

クライアントウィンドウの フレーム はウィンドウマネージャによって加えられるすべての装飾として定義されます。普通はこれらの装飾はウィンドウのすぐ外側の端に接っしていますが、このモデルを使う必要性はありません。

Sawfish では各ウィンドウフレームはクライアントウィンドウの端から相対的な位置に指定された概念的な矩形オブジェクトである、フレームパーツのリストで構成されます。フレームパーツを定義するのに形を持つ[すなわち、矩形でない]画像が使われるときはそれらは単にいくつかのピクセルが画面から失われているような矩形のものとして取り扱われます。

各フレームパーツは自身に関連づけられた属性のリストを持ち、これらはパーツの背景(すなわち、色か画像)を定義する項目と、パーツの前景(すなわち、おそらく色やフォントなどを伴う何らかのテキスト)を定義する項目を含みます。可視でない属性、例えば Lisp 実行コマンド(see Keymaps)を持つパーツ内で起るイベントへのキーマップ、もまた定義されます。

そういうわけでウィンドウフレームはフレームパーツ定義のリスト (see Frame Part Definition)として Lisp で定義されます。これらのフレームパーツは(それらが定義された順番で、そう同じ場所ならば後の方のフレームパーツは前のパーツより上に)クライアントウィンドウに加えられ、完全なウィンドウフレームを作りだします。

Frame Part Classes
==================

sawfish の目標の中の一つが可能な限り多くの柔軟性を提供することですが、これはときどきすべてのことについて有害となる可能性があります。例えばすべてのテーマが概念的に似たウィンドウフレームパーツについて一貫したキーマップとカーソル画像を使うことでよりユーザに優しくなります。すなわち、すべての閉ボタンが同じマウスボタンバインディングを持ち、ポインタがそれらの上に来たときに同じマウスカーソルを表示する方がいいでしょう。

これを達成するために sawfish はそれぞれいくつかのデフォルトの属性を持つフレームパーツの クラス 群を定義しています。ウィンドウフレームを定義する際に各パーツの定義はそれがメンバとなるクラスを指定し、そしてデフォルトの属性(これらの属性に対する特定の値は暗黙に指定されます)を継承します。

 -- Variable: frame-part-classes
     この変数は関連リストで、フレームパーツクラスをそのクラスのデフォルトの関連リストに関連づけます。

あらかじめ定義されたクラスは次のとおりで、それらの意味は自身が説明しています:

title, menu-button, close-button, iconify-button, maximize-button, top-border, left-border, right-border, bottom-border, top-left-corner, top-right-corner, bottom-left-corner, bottom-right-corner.

frame-part-classes frame-part-classes に追加することで別のクラスを生成できます。けれどもおそらく一つ以上のテーマがその同じクラスを必要とし、そしてユーザは使われているキーマップをカスタマイズしたいと思うかもしれません。def-frame-class マクロはこのような状況に対応し、新しいクラスを追加するのに使われます。

 -- Macro: def-frame-class class alist-form &rest binding-forms ...
     シンボル CLASS という名前の新しいフレームパーツクラスを生成します。

     ALIST-FORM はクラスに対する属性を定義する関連リストを与えるために評価されます。キーについて既存の値が存在しないときだけ、各キー値の組が設定されます。

     もし BINDING-FORMS が与えられるとそれらはクラスについて既存のキーマップがないときだけ評価されます。キーマップが生成され CLASS-name という名前の変数に保持されます。そしてこの変数は BINDING-FORMS 内で使われます。

そして仮想の shade-button クラスを定義するには次が使えます:

     (def-frame-class shade-button '((cursor . left_ptr))
       (bind-keys shade-button-keymap
         "Button1-Off" 'toggle-window-shaded))

いくつかのケースではあらかじめ定義されたフレームパーツプロパティを上書きできる変数になるかもしれません。例えば、ウィンドウタイトルバー上のテキストがいつも青くなるような、設定などです。

 -- Variable: override-frame-part-classes
     frame-part-classes に似ていますがプロパティがその変数とフレームスタイル自身の両方で定義される値よりも優先されます。

次の関数はこれら二つの変数のカスタマイズを単純にするのに使えます:

 -- Function: set-frame-part-value class key value &optional override
     VALUE をクラス CLASS のすべてのフレームパーツについてプロパティ KEY に関連づけます。

     もし OVERRIDE が nil でなければ設定は override-frame-part-classes 変数にインストールされ、そうでなければframe-part-classes 変数に保持されます。

次の例はすべてのタイトルバーの色を上書きしています:

     (set-frame-part-value 'title 'background
                           '("black" "white" "green" "blue") t)

(実際にここで何が設定されるかの詳細については次の節を参照して下さい)

Frame Part Definitions
======================

各フレームパーツは、各セルの左の項目が属性を定義し、右の要素がその属性に与える値を定義するコンスセルのリストであるような、関連リスト(か、または連想リスト)として定義されます。そう例えば連想リスト((foo . 1) (bar . 2)) は foo に値を 1 を bar に値 2 をというように二つの属性を定義します。See Association Lists (The Librep Manual).

属性は次のように定義できます:

(class . CLASS)
     パーツのフレームパーツクラスを指定します。

(background . DATA)
(background . (NORMAL FOCUSED HIGHLIGHTED CLICKED))
     パーツの背景を指定します。色か画像か、もしくは色の名前の文字列です。もし括弧内の右の項目が一つならばパーツの状態すべてのために使われ、リストならば四つの要素は特定の状態のための背景を定義します。

     もし画像が使われていると、tiled プロパティが設定されていなければ画像はフレームパーツの大きさまでサイズ調整され、設定されていればフレームパーツに渡ってタイル状にしきつめられます。

(foreground . DATA)
(foreground . (NORMAL FOCUSED HIGHLIGHTED CLICKED))
     すべての状態かあるいは個々の状態についてフレームパーツに対する画像か前景色を指定します。

     フレームパーツの前景色を定義するのに使われるときには background 属性とは違って画像はサイズ調整されません。

(font . FONT)
(font . (NORMAL FOCUSED HIGHLIGHTED CLICKED))
     パーツのフォントを指定します。

(text . VALUE)
     フレームパーツの前景に描く文字列を指定します( foreground プロパティが画像でないとき)。文字列か、パーツが更新される度に呼ばれ描画する文字列を返す関数です。

(x-justify . VALUE)
     パーツの前景の内容(すなわち、テキストか前景画像)の水平位置を定義します。シンボル left、right、center あるいは数字の内のいずれかが可能です。もし数字で、正なら左端からのピクセル数値を、負なら右端からのピクセル数値を示します。

(y-justify . VALUE)
     x-justify に似ていますが代りに可能なシンボルは top、 bottom あるいは center です。

(renderer . FUNCTION)
     この属性は background 属性の代りに使うことができます。パーツの描画が必要なときに FUNCTION が背景を描画する画像とパーツの現在の状態、シンボル focused、highlighted、clicked あるいは nil (通常状態について)、とともに呼ばれます。

(render-scale . VALUE)
     この属性は renderer プロパティとともに使われる画像の大きさを整数 VALUE の率で小さくします。

(left-edge . VALUE)
     クライアントウィンドウの左端に対するパーツの左端の位置を定義します。

(right-edge . VALUE)
     クライアントウィンドウの右端に対するパーツの右端の位置を定義します。

(top-edge . VALUE)
     クライアントウィンドウの上端に対するパーツの上端の位置を定義します。

(bottom-edge . VALUE)
     クライアントウィンドウの下端に対するパーツの下端の位置を定義します。

(width . VALUE)
     フレームパーツの幅を定義します。

(height . VALUE)
     フレームパーツの高さを定義します。

(keymap . VALUE)
     このフレームパーツで起るイベントを評価する際に使うキーマップを定義します。

(cursor . CURSOR)
     このパーツ内にマウスがある際に表示するカーソルを定義します。カーソルオブジェクトか、必要なカーソルオブジェクトを生成するためのget-cursor への引数が可能です。

(removable . VALUE)
     指定され VALUE が nil でないとき、このフレームパーツはすべてのフレームの外見に外を与えることなしに取り除くことができます。これはときどきクライアントウィンドウの要請で取り除かれるボタンクラスに対してついてだけ重要となります。

(below-client . VALUE)
     指定され VALUE が nil でないとき、このフレームパーツはクライアントウィンドウの下に表示されます。フレームパーツについてデフォルトの動作ではクライアントウィンドウの上に表示されます。

background、foreground、render-scale、font、 left-edge、right-edge、top-edge、bottom-edge、 width そして height 属性の値には関数を指定することもできます。フレームが生成される際には各場合に応じた関数が呼ばれ(ウィンドウオブジェクトの引数とともに)、返された値は属性の実際の値として使われます。

パーツの位置を指定するのに使われる座標系はウィンドウの端に相対して定義されます。正の値はウィンドウの端から中央まで数えたもので、負の値はウィンドウの中央から端の外側へ数えたものです。

クライアントウィンドウのすぐ上の 20 ピクセルの位置に単色の黒のタイトルバーがあるような、次の例を考えてみましょう:

     `((background . "black")
       (foreground . "white")
       (text . ,window-name)
       (x-justify . 30)
       (y-justify . center)
       (left-edge . 0)
       (right-edge . 0)
       (top-edge . -20)
       (height . 20)
       (class . title))

バッククゥオートオペレータはたいていは単に定数である定義について使われ、カンマオペレータは window-name(ウィンドウの名前を与える関数)変数の値を定義に与えます; see Backquoting (The Librep Manual)).

この関数は前景に描画される文字列を動的に指定するのに使われます。ウィンドウマネージャはウィンドウのいかなる X プロパティの変化についてもウィンドウのすべてのフレームパーツの前景を自動的に再描画します。

そして特定のフレームパーツクラスは、フレーム付のウィンドウを与えると定義 (継承されか、オーバライドされた定義を含みます)の完全なリストから個々の属性の値を取り出すことが可能です。

 -- Function: frame-part-get window class attr
     WINDOW の現在のフレーム内のクラス CLASS のフレームパーツに対する属性 ATTR の値を返します。

     もしそのような属性が存在しなければ nil を返します。もしクラス CLASS のフレームパーツが二つ以上あれば、最初にみつかったパーツから値が取り出されます。

Frame Functions
===============

 -- Function: set-window-frame window frame-def
     フレームパーツ定義 FRAME-DEF のリストにより定義されたオブジェクト WINDOW に、関連づけられたクライアントウィンドウのフレームを設定します。もしそのウィンドウが配置されていれば古いフレームは破棄され新しいフレームが構築されます。

 -- Function: window-frame window
     WINDOW に関連づけられたフレームを定義するフレームパーツ定義のリストを返します。

 -- Function: window-framed-p window
     ウィンドウマネージャにより生成されたフレームが WINDOW にアタッチしたとき t を返す。

 -- Function: rebuild-frame window
     前に定義されたフレーム定義から WINDOW に関連づけられたウィンドウフレームを再生成します。すべてのフレームパーツは再初期化、再調整されます。

 -- Function: window-frame-dimensions window
     WINDOW に関連づけられたフレームの大きさを定義するコンスセル (WIDTH . HEIGHT) を返します。これらは常にクライアントウィンドウの大きさに等しいかより大きいでしょう。

     もし WINDOW がフレームなしならこの関数は window-dimensions と同じように値を返します。

 -- Function: window-frame-offset window
     WINDOW に関連づけられたクライアントウィンドウの原点からそのフレームまでのオフセットを定義するコンスセル (X . Y) を返します。

Frame Types
===========

異なるウィンドウのタイプの違いを可視的に表すためにいくつかのあらかじめ定義されたウィンドウフレームのタイプが存在します。これらのタイプは今のところ次のものを含んでいます:

default
     通常フレームタイプです。境界とタイトルバーの両方のすべての装飾を持ちます。

transient
     一時的なウィンドウのためのフレームです。これは普通タイトルバー以外のすべての四つの境界を持ちます。

shaped
     シェープウィンドウ[形のある、四角形でないウィンドウ]は境界が矩形でなくまわりを囲む意味がないので普通はタイトルバーだけです。

shaped-transient
     shaped と transient タイプの組み合わせで、普通は単にとても小さなテキストなしのタイトルバーがあるだけです。

unframed
     クライアントウィンドウ自身だけでフレームはまったくありません。あらかじめ定義された nil-frame 変数はフレームなしを含んでいて、それがこのフレームタイプのために使われます。

仮想的にウィンドウに与えられたフレームのタイプはそのウィンドウの type プロパティに保持されます。それは通常は window-type 関数を通じてのみアクセスされるべきです:

 -- Function: window-type window
     WINDOW に関連づけられた現在のフレームタイプを名付けるシンボルを返します。

Frame Styles
============

フレームスタイルは一つの外観を持つ、異なるタイプのフレーム群をカプセル化するのに使われます。各フレームスタイルは名前を特定のウィンドウとフレームタイプの組に対するフレーム定義を生成する関数に関連づけます。

 -- Function: add-frame-style name function
     NAME (シンボル)という名前の新しいフレームスタイルを定義します。このスタイルのフレームが特定のウィンドウについて必要とされると、 FUNCTION がウィンドウ自身と生成するフレームタイプを定義するシンボル、の二つの引数とともに呼ばれます(see Frame Types)。

     もしデフォルトのフレームスタイルが存在しなければ、その新しいスタイルがデフォルトとなります。

 -- Variable: default-frame-style
     他のスタイルが明示的に指定されていないときにウィンドウに対して使われるフレームスタイルを名付けるシンボルです。

 -- Function: check-frame-availability name
     NAME というフレームスタイルが存在すれば t を返します。必要ならそのようなフレームをシステムから読み込んでみて下さい。

 -- Function: set-window-frame-style window style &optional type from-user
     WINDOW のフレームをシンボル STYLE という名前のスタイルに設定します。もし TYPE が指定されていればその名前のフレームタイプを使い、そうでなければこのウィンドウについてはデフォルトタイプが使われます。

     もし FROM-USER が nil でなければユーザがそのウィンドウに対するフレームスタイルを明示的に指定しています(すなわち、新しいウィンドウについてデフォルトの選択とはなりません)。

 -- Function: set-frame-for-window window &optional force type
     もし WINDOW が関連づけられたフレームスタイルを持たないならば、このウィンドウに対してデフォルト値、default-frame-style の値を選択します。

     もし FORCE が nil でなければウィンドウが既に選択されたデフォルトスタイルを持っているときでも常に再選択します。

     もし TYPE が nil でなければウィンドウに与えるフレームタイプを定義し、さもなくば現在のデフォルトがウィンドウに対して使われます。

 -- Function: reframe-all-windows
     強制的にすべてのウィンドウフレームスタイルを再選択します。ユーザ指定のスタイルのウィンドウだけがそのデフォルトに変化しません。

 -- Function: rebuild-frames-with-style style
     フレームスタイル STYLE (シンボル)によって定義されるフレームを現在持つすべてのウィンドウで rebuild-frame を呼びます。

 -- Function: reframe-windows-with-style style
     スタイル STYLE によって定義されるすべてのウィンドウフレームを完全に再生成します。

いくつかのウィンドウプロパティがフレームスタイルの選択時に使われます:

 -- Window Property: frame-style
     ウィンドウのユーザ指定のフレームスタイルか nil です。

 -- Window Property: current-frame-style
     ウィンドウの現在のフレームスタイルです。

 -- Window Property: ignored
     もし設定されていればフレームが与えられていないウィンドウです。

Themes
======

テーマとフレームスタイルは今のところほとんど同じものですが、ちょっとだけ違うのはテーマは必要なときにシステムから読み込む仕組を提供していることです。後のバージョンではテーマが他のユーザーインターフェースでの設定法を含むこともあるでしょうが、今のところその見込みはないでしょう。

フレームスタイルが必要なとき、もしまだ利用可能でない(すなわち、そのスタイルについて add-frame-style 関数が呼ばれていない)ならば、ウィンドウマネージャがシステムから同名のテーマを読み込もうとします。

各テーマはディレクトリに保存され、このディレクトリはテーマ自身と同名でなければいけません。このディレクトリ内には theme.jl か theme.jlc という名前の Lisp スクリプトファイルがなければいけません。このスクリプトは評価可能で、同名のテーマのフレームスタイルを (add-frame-style の呼出しにより)提供するべきです。

そのテーマスクリプトが評価されている間に image-load-path 変数にはそのテーマディレクトリが最初の項目として含むように設定されます。これでディレクトリ内に保存されているどの画像ファイルも make-image 関数を使って確実に読み込まれるようになります。

rep はモジュールシステムを持たないのでテーマ内で定義されるどの変数もそれらのユニーク性を確実にするためにテーマの名前の接頭辞をつけなければなりません。例えばテーマ foo においては変数 bar は実際には foo:bar と呼ばれます。

けれどもたいていはグローバルな変数か関数の宣言を避けるために rep の構文スコープを使うことができます。ただ唯一、defcustom によってカスタマイズオプションを定義するときだけは普通は例外となります。これらはグローバルに見えなければなりせん。

テーマは一般にはとてもむとんちゃくにとらえられているので sawfish はすべてのテーマのコードをとても制限された環境内で評価します。アイデアはテーマがウィンドウマネージャの外観だけに影響を及ぼすようにすることです。このことにも関わらず、なおも悪意のあるテーマによってウィンドウマネージャがロックされ、クラッシュする可能性があります。最初の場合については SIGINT シグナルを送ることでロックしないようにします。たぶんテーマはユーザ環境に影響を与えることはできませんが、保証はありません ...

 -- Variable: theme-load-path
     ディレクトリ名のリストで、テーマディレクトリの場所を検索するパスを提供します。デフォルトではユーザのテーマディレクトリとシステムのディレクトリを含んでいます。

 -- Variable: user-theme-directory
     ユーザのテーマディレクトリの名前でデフォルトでは ~/.sawmill/themes です。

 -- Variable: system-theme-directory
     システムのテーマディレクトリ名です。

Removing Frame Parts
====================

ウィンドウのフレームのいくつかのパーツを無効にすることができると便利です。例えば、ウィンドウはウィンドウマネージャに最大化ボタンを望まないというヒントを出すとき。sawfish はすべての特定のクラスのパーツがウィンドウベースでウィンドウについて有効または無効にするようにできます。けれどもすべてのフレームスタイルがこの機能をサポートするわけではありません(それはフレームパーツの removable プロパティに依存します Frame Part Definition)。

 -- Function: remove-frame-class window class
     WINDOW の CLASS のメンバである、可能なすべてのフレームパーツを無効にします。

 -- Function: add-frame-class window class
     WINDOW の CLASS のメンバであるすべてのフレームパーツを有効にします。

Workspaces
**********

ここでは何をいえばいいんだろう?

Popup Menus
***********

ポップアップメニューはユーザが Lisp コードを実行することで可能な主な二つの方法の内の一つです(他の方法とはキーマップを通じる方法です、 see Keymaps)。popup-menu 関数はメニューの項目の定義と各項目について呼ばれる関連づけられた Lisp 関数と共に実行されます。こうしてメニューを表示するサブプロセスが起動し、後に選択されたメニュー項目が受け取られ、評価されます。

各メニュー項目はリストで指定され、最初の要素は文字列でそのメニュー項目に対するラベルを与え、二つ目の要素はその項目がユーザに選択されたときに呼ばれるべき関数です。もしこの関数が対話的な仕様となっていれば call-command 関数を使って実行され、そうでなければ funcall (関数)が使われます。それで例えば、1階層のメニューは次のように定義されます:

     (("Item 1" function-1)
      ("Item 2" function-2)
      ()
      ("Item 3" function-3))

null 項目で表示されるメニューにセパレータをつくることができます。

もし項目の括弧内の第一の要素がシンボルならば、項目の残りは変数の値で定義されるものとなります。もしこの値が関数ならば定義は関数を呼んだ結果となります。

以下の定義について考えてみます:

     (("Workspaces" . workspace-menu)
      ("Windows" . window-menu)
      ("Programs" . apps-menu)
      ("Customize" . custom-menu)
      ("About..." (customize 'about))
      ()
      ("Restart" restart)
      ("Quit" quit))

これは Sawfish のルートメニューの定義です。四つのサブメニューが参照変数 (実際、この変数の内の３つは関数を含んでいます) (workspace-menu、 window-menu、apps-menu そしてcustom-menu によって動的に生成されていることを見ることができます。

apps-menu 変数はアプリケーションメニューを再定義することができます。デフォルト定義は次のようになっています:

     (("xterm" (system "xterm &"))
      ("Emacs" (system "emacs &"))
      ("Netscape" (system "netscape &"))
      ("The GIMP" (system "gimp &"))
      ("XFIG" (system "xfig &"))
      ("GV" (system "gv &"))
      ("xcalc" (system "xcalc &")))

system 関数は単に一つの引数を /bin/sh を使って実行するだけです。

 -- Function: popup-menu spec
     項目定義 SPEC のリストによって定義されるメニューを表示します。

 -- Function: popup-window-menu
     すべてのウィンドウ操作のメニューリストを表示します。

 -- Function: popup-root-menu
     メインメニューを表示します。

 -- Function: popup-apps-menu
     アプリケーションメニューを表示します。

 -- Variable: root-menu
     ルートメニューの定義を含んでいます。

 -- Variable: apps-menu
     ルートメニューのアプリケーションサブメニューの定義を含む変数です。

いくつかのシステム上ではメニューのサブプロセスの起動に著しくオーバヘッドがあるかもしれないですが、メニュー要求の間にもそれを実行させ続けておくことは可能です。

 -- Variable: menu-program-stays-running
     この変数は最後にメニューが完全化されてから後もメニューサブプロセスを実行させつづけておくかどうか、そしてそうするならどれくらい長くそうするかを定義します。もし nil ならばプログラムはすぐに終了し、 t ならば永久に走りつづけ、整数値ならばプログラムが走りつづける時間(他のメニューが表示されないかぎり)を示します。

Events
******

イベントはウィンドウマネージャがルートウィンドウに対して受け取った、ウィンドウフレームが生成した、あるいはクライアントウィンドウ自身からグラブされた、X からの入力イベントを参照します。マウスまたはキーボードが引き起こした各イベントは Lisp 表現を持ちます。

各入力イベントは二つの整数を含むコンスセルで表され、これらの整数は実際の入力イベントを符号化しています。符号化はあいまいなので、意味のあるイベントへのアクセスは提供される関数を通じてなされる方法しかありません。

 -- Function: eventp object
     この関数は引数が入力イベントであるとき t を返します。

各イベントは文字列の名前を持ちます。この文字列は 0 個以上のハイフンで区切られたモディファイア記述とキー自身の名前を含んでいます。標準 X モディファイア名は同名のキーマップに対応した３つの特別なモディファイア Meta、Alt そして Hyper として提供されています。

次の表リストは可能なモディファイアです:

C
     コントロールモディファイア

M
     メタモディファイア

A
     オルトモディファイア

S
     シフトモディファイア

H
     ハイパーモディファイア

ModK
     標準 X モディファイアで、K は 1 から 5 までです。

ButtonK
     現在押下されている K 番目のマウスボタンです。

M と A モディファイアは X サーバの xmodmap 設定に応じて動的にわりあてられる仮想モディファイアであることに注意して下さい。 A 仮想モディファイアは Alt_L か Alt_R キーシムのどちらかの X モディファイアにわりあてられます。M 仮想モディファイアは Meta_L か Meta_R キーシンボルのどちらかのX モディファイアにわりあてられます。これらの二つの仮想モディファイアがわりあてられていないならば他の仮想モディファイアにわりあてられます。

二つの特別なモディファイアがあります。Any 接頭辞は任意の組のモディファイアに一致し、Release モディファイアはデフォルトのキー押下の代りのキーリリースイベントに一致します。

一般的なキーは X キーシンボルと同名ですが、いくつかの特別に定義されたキーがあります:

SPC, TAB, RET, ESC, BS, DEL, Up, Down, Left, Right.

また、マウスイベントを記述するためのいくつかの擬似キーがあります:

Click1, Click2, Click3, Off, Move.

そう、例えば Meta キーを押下しながら左マウスボタンをクリックすると M-Button1-Click1 と記述され、Shift を押下しながら RET を押すと S-RET と記述されます。

また、イベントの名前と実際のイベント自身との間の変換が可能な関数も存在しています。

 -- Function: lookup-event event-name
     EVENT-NAME という名前の新しい入力イベントを生成し、返します。

          (lookup-event "C-x")
              => (120 . 65540)

          (lookup-event "C-M-Button1-Click1")
              => (1 . 131340)

 -- Function: event-name event
     この関数は入力イベント EVENT の名前の文字列を返します。

          (event-name (lookup-event "C-x"))
              => "C-x"

キーシンボルは以下の変数を通じて認識される二つの仮想モディファイアを生成します:

 -- Variable: meta-keysyms
     仮想モディファイア M を生成する X キーシンボルの名前を定義するリストです。

 -- Variable: alt-keysyms
     仮想モディファイア A を生成する X キーシンボルの名前を定義するリストです。

 -- Variable: hyper-keysyms
     仮想モディファイア H を生成する X キーシンボルの名前を定義するリストです。

Commands
********

コマンド は対話的に、すなわち入力イベントに結びつけられた結果として呼ばれる、Lisp 関数です。

コマンドは関数 (defun を使う)と同じ方法で定義されますがコマンドの本体の形式は必ず interactive 宣言 を含まなければなりません。こうすると関数は対話的に呼ぶことができ、call-command 関数にどのようにコマンドに与えられた引数の値を計算すればいいか教えることができます。

interactive 宣言は特別形式 interactive を呼出すように見えますが、実際のところこの特別形式は常に nil を返し、副次的な効果はありません。唯一のこの特別形式の効果は call-command 関数にその関数が対話的に呼ばれることを示すだけです。宣言形式の二番目の要素 (interactive シンボルの後)はコマンドに与えられる引数の値がどのように計算されるかを定義します。

interactive 宣言の構造は次のようになっています:

     (interactive [CALLING-SPEC])

コマンドが定義されるときに interactive 宣言を含むようにするには次のようにします:

     (defun some-command (arg1)
       "Optional documentation string."
       (interactive ...)
       ...

CALLING-SPEC 形式はコマンドが対話的に呼ばれるときに与えられる引数の値を定義し、それは次の内の一つです:

  * nil か定義されません(すなわち (interactive))。コマンドには引数は与えられず、このタイプの inetractive 宣言は単に関数が対話的に呼ばれるということを示すだけです。

  * 文字列; 0 あるいはより多くの行にわたり(各行は改行文字で区切られる)、各行は引数の値をどのように計算するかを定義します。それぞれの行の一つまたは二つの文字が引数を計算する方法を正確に定義する修辞句であり、行の残りは使用するいくつかの修辞句であるオプションの引数です。

     今のところ利用できる修辞句は、

     e
          実行されるべきコマンドを発生させるイベントです。

     E
          コマンドを発生させるイベントで、文字列に処理されます。

     p
          引数の数の修辞句で、もし引数がなければ 1 となります。

     P
          引数の修辞句そのものです。

     t
          シンボル t です。

     %f
          現在入力フォーカスを持つウィンドウか、(もしどのウィンドウもフォーカスされていなければ) nil です。

     %w
          current-event-window 関数を呼んだときの結果です。

     %W
          current-event-window 関数を呼んだ結果で現在フォーカスされているウィンドウか、nil か root です。

     空白行は nil の値の引数を生成します。

  * その他; その形式は評価されコマンドに適用する引数の list を返すと期待されます。

コマンドが実行されるさいに call-command 関数が使われます。これは (interactive 宣言を使って)コマンドに適用する引数値のリストをつくり、それからコマンドを呼出します。

 -- Function: commandp OBJECT
     もしその引数が対話的に呼ばれるなら t を返します。もし OBJECT が関数(すなわちシンボルか lambda 表現)なら interactive 宣言を含むコマンドです。

     コマンドである唯一の他のオブジェクトは関数呼出し形式です。これらのタイプのコマンドの使用はおすすめできませんが、ときどき役立ちます。

 -- Function: call-command command &optional prefix-arg
     この関数はコマンド COMMAND を対話的に呼びます。コマンドが何で構成されているかについては前述の commandp の記述を参照して下さい。

     もし PREFIX-ARGUMENT が nil でなければこのコマンドに対する current-prefix-arg 変数の値を定義し、通常その変数の値はグローバルな prefix-arg からとられます。

Keymaps
*******

キーマップはコマンドとイベントを関連づけるのに使われます。イベントが発生すると関連づけられたコマンドがみつけられ評価されます。キーマップは単に第一の要素がシンボル keymap であるリストです。

 -- Function: keymapp arg
     ARG がキーマップとして使えわれていれば t を返します。

 -- Function: make-keymap
     新しく生成された空のキーマップを返す。

 -- Function: bind-keys keymap &rest bindings
     0 かそれ以上のキーバインディングをキーマップ KEYMAP に入れて KEYMAP を返します。

     各バインディングは BINDINGS のリストの中の二つの要素で定義され、最初[の要素]は入力イベントの名前[もしくはそのイベント自身]を定義し二番目 [の要素]はそのイベントに関連づけられるコマンドを定義します。

     二つのキーをキーマップ KEYMAP でバインドする、例えば、イベント C-f をコマンド foo にイベント C-b をコマンド BAR にバインドするには次のようなフォームを使います。

          (bind-keys KEYMAP
           "C-f" 'foo
           "C-b" 'bar)

 -- Function: unbind-keys KEYMAP &rest KEYS
     イベント KEYS(これらはイベントの名前かオブジェクト自身の名前) のバインドをキーマップ KEYMAP から消去します

 -- Function: search-keymap event keymap
     キーマップ KEYMAP 内のイベント EVENT に対するバインディングを検索します。もしバインディングがみつかればコンスセル (COMMAND . EVENT) を返します。

いくつかのあらかじめ定義されたキーマップが常に利用できます:

global-keymap
     どこでもアクティブなバインディングを含むキーマップ

window-keymap
     クライアントウィンドウがフォーカスされているときにアクティブなバインディングを含むキーマップ

root-window-keymap
     ポインタが root ウィンドウにあるときにアクティブなバインディングを含むキーマップ

title-keymap
border-keymap
     ウィンドウフレームの境界にあるときにアクティブなキーマップ

close-button-keymap
iconify-button-keymap
maximize-button-keymap
menu-button-keymap
     ウィンドウフレームの標準的なボタンにあるときにアクティブなキーマップ

Event Loop
**********

イベントループは Sawfish が認識する任意のウィンドウからのすべての X イベントを読みとります。これらの多くのイベントは Standard Hooks で記述されたフックを実行します。キーボードとポインタのイベントはそれらに同等な Lisp (コード)に翻訳( see Events )され、バインディングに対するすべてのアクティブなキーマップを検索するのに使われます。もしバインディングがみつかれば、関連づけられたコマンドが call-command 関数を通じて実行されます。

アクティブなキーマップは次のように定義されます:

  * 変数 override-keymap が nil でなければこのキーマップだけが検索対象になります。

  * そうでなければ３つのキーマップが検索されます:

      1. 現在 ``クリックされている'' フレームパーツの keymap プロパティ

      2. 現在フォーカスされているウィンドウの keymap プロパティ

      3. 変数 global-keymap の内容

ButtonRelease イベントについては、リリースイベントが起きた際にもしポインタが実際にフレームパーツ内にあれば、そのフレームパーツのキーマップだけが検索されることに注意しなければなりません。

もしどのアクティブなキーマップにもバインディングがみつからなければ、 unbound-key-hook フックが呼ばれます。これは or タイプのフックの一つで、最初の関数は nil でない値を返し、フック呼出しを終了します。

 -- Function: lookup-event-binding event
     イベントオブジェクト OBJECT のための通常のバインディングの検索を実行します。みつかったコマンドか、バインディングが存在しなければ nil を返します。

デフォルトではキーリリースイベントもモディファイアキー(例えば Control_L)は両方とも無視されます。しかし、この動作は変更できます:

 -- Variable: eval-modifier-events
     もし nil でなければモディファイアキーに結びつけられたキーイベントが評価されます。

 -- Variable: eval-key-release-events
     nil でなければキーリリースイベントが評価されます。

コマンドが評価されている間に生じるイベントの情報がみつけられます:

 -- Function: current-event
     実行される現在のコマンドを生じるイベントを返します。

 -- Function: current-event-string
     現在のイベントが普通挿入する文字列を返します。

 -- Function: current-event-window
     現在のイベントを受け取るウィンドウか、シンボル root か、 nil (もしそのようなウィンドウがなければ)を返します。

 -- Function: last-event
     前に起ったイベントを返します。

 -- Function: proxy-current-event window &optional mask propagate
     現在の X イベントを WINDOW (ウィンドウオブジェクトか、数値 ID か、シンボル root )に送ります。もし ButtonPress イベントならばまずポインタグラブが解放されます。

     MASK は整数値で XSendEvent 関数に渡すための X イベントマスクを定義します。もし定義されていなければマスクは中継されるイベントタイプを選択するのに通常使われるマスクが選択されます。

 -- Function: allow-events mode
     これは XAllowEvents のためのラッパーです。MODE パラメータは以下のシンボルの内のどれかです: async-pointer, async-keyboard, sync-pointer, sync-keyboard, replay-pointer, replay-keyboard, async-both, sync-both.

     受け取るようにグラブされるべきイベント(すなわち、global-keymap と window-keymap の中のすべてのバインディング)は同期的にグラブされます。これはそのコマンドが返るまでか、allow-events が呼ばれるまではそれ以上イベントが受け取られないということを意味します。

     これは通常重要ではありませんが、もしコマンドがさらにイベントを受け取ることを期待しているならば allow-events を呼ばなければいけないということです。例としては対話的な移動やリサイズ関数を参照して下さい。

 -- Function: forget-button-press
     次のボタン押下イベントが単なるクリックとして扱われ、前のボタン押下イベントの後ではそれが無視されるようにします。

 -- Function: accept-x-input &optional mask
     受け取った任意の X イベントを処理します。もし MASK が nil でないならこの数値に一致するイベントのみを処理します(詳細については X のヘッダーファイルを参照して下さい)。

 -- Function: x-events-queued
     処理されるのを待っている X イベントの数を返します。

Miscellaneous Functions
***********************

Pointer Functions
=================

 -- Function: query-pointer &optional from-server
     root ウィンドウの原点に対するマウスポインタの位置を表す、コンスセル (X . Y) を返します。

     もし FROM-SERVER が nil でなければ位置は直接サーバから読まれ、そうでなければ(可能なかぎり)今のイベントから取得されます。

 -- Function: query-pointer-window
     マウスポインタの下の最前面のウィンドウか、あるいはカーソルが root ウィンドウにあれば nil を返します。

 -- Function: query-last-pointer
     root ウィンドウに対する 2 番目に最近のマウスポインタを表す、コンスセル (X . Y) を返します。

 -- Function: warp-cursor x y
     root ウィンドウの原点に対する相対位置 (X, Y) にマウスポインタを移動させます。

 -- Function: warp-cursor-to-window window &optional x y
     オブジェクト WINDOW に関連づけられたクライアントウィンドウに対する相対位置 (X, Y) にマウスポイタを移動させます。

     X と Y が nil ならばそれらはウィンドウフレームの左上部の角として解釈されます。

Grab Functions
==============

 -- Function: grab-server
     他のいかなるクライアントからも X サーバにアクセスできないようにします。

 -- Function: ungrab-server
     grab-server の呼出した後で他のクライアントに X サーバにアクセスすることを許します。

     grab-server と ungrab-server の呼出しは 組 でなされることに注意して下さい。

 -- Macro: with-server-grabbed &rest forms
     サーバをグラブしてフォームを評価し、後で解放します。

 -- Function: server-grabbed-p
     X サーバがグラブされていれば t を返します。

 -- Function: grab-pointer &optional window cursor
     マウスポインタをグラブし、すべてのポインタイベントをウィンドウオブジェクト WINDOW に向けます。もしカーソルオブジェクト CURSOR が定義されていればポインタがグラブされている間にこれを表示します。

     もし WINDOW が nil、あるいは可視状態でなければ[ex. アイコン化状態]、root ウィンドウについてなされます。

     グラブが成功すれば y を返します。

 -- Function: ungrab-pointer
     マウスポインタのグラブを解放します。

 -- Function: grab-keyboard &optional window
     キーボードをグラブし、すべてのキーボードイベントをウィンドウオブジェクト WINDOW に向けます。もし WINDOW が NIL、あるいは可視状態でなければ root ウィンドウについてなされます。

     成功すれば non-nil を返します。

 -- Function: ungrab-keyboard
     キーボードのグラブを解放します。

Display Functions
=================

 -- Function: screen-width
     root ウィンドウの幅を返します。

 -- Function: screen-height
     root ウィンドウの高さを返します。

 -- Function: draw-window-outline mode x y width height
     大きさ (WIDTH, HEIGHT) のウィンドウの概形を root ウィンドウからの相対位置 (X, Y) に描画します。

     MODE は描画する概形の種類を定義するシンボルで、今のところ唯一 3x3 の格子の box だけです。

     その格子を消すには erase-window-outline を使います。また root ウィンドウに直接これらの関数が描画して概形が消去されるまでサーバはグラブされるべきです。

 -- Function: erase-window-outline mode x y width height
     root ウィンドウからの相対位置 (X, Y) に大きさ(WIDTH, HEIGHT) で描画した以前のウィンドウの概形を消します。

     MODE は描画する概形の種類を定義するシンボルで、今のところ唯一3x3 の格子の box だけです。

 -- Function: display-message &optional text attributes
     画面のウィンドウ内に文字列 TEXT を表示します。もし TEXT が nil ならば以前に表示された任意の文字列を消します。文字列を表示するウィンドウの数値 id か、(メッセージが表示されていなければ) nil を返します。

     ATTRIBUTES は文字列がどのように表示するかを指定する連想リストで、リストの各要素は属性 ATTR (シンボル)をその値に結びつけるコンスセル (ATTR . VALUE) です。

     可能な属性は今のところ次のとおりです:

     font
          使うフォント

     foreground
          テキストを描画する色(かその名前)

     background
          背景を描画する色(かその名前)

     x-justify
          複数行にわたる文字列をおさめる方法。シンボル left、right、そして center の内のどれか一つです。

     spacing
          テキスト行の間の縦の余分なスペースのピクセル数です。

     position
          ウィンドウのどこにメッセージを表示するかを定義するコンスセルです。セルは (X . Y). X と Y は整数か nil (ウィンドウ中央)です。もし負の値なら左下角から相対して数えます。

Gradient Functions
==================

gradient 特性は画像に色勾配を描画することを可能にします。(この特性を読み込むには (require 'gradient) を読み込んで下さい)。

 -- Function: draw-vertical-gradient image from to
     IMAGE の中に縦に色勾配を描画します。画像の上の方の色は FROM で下の方の色は TO で、その間をスムースに勾配していきます。

 -- Function: draw-horizontal-gradient image from to
     IMAGE の中に左から右まで水平に色勾配を描画します。

 -- Function: draw-diagonal-gradient image from to
     IMAGE の中に左上角から右下角まで水平に色勾配を描画します。

Other Functions
===============

 -- Function: sync-server
     すべての中途の X の要求を破棄し、それらの終了まで待ちません。

 -- Function: send-client-message window type data format
     WINDOW (ウィンドウオブジェクトでシンボル root か数値 ID )に X ClientMessage イベントを送ります。

     イベントはタイプ TYPE (シンボル)で整数値 DATA (すなわち、ベクトルか文字列)の配列を含んでいて、FORMAT サイズの量 (8, 16, 32) に変換されます。

 -- Function: create-window parent x y width height
     PARENT (ウィンドウオブジェクトで整数値のウィンドウ ID かシンボル root) の子供である配置されていないウィンドウを生成します。

     新しいウィンドウのウィンドウ ID を返します。

 -- Function: x-atom symbol
     SYMBOL と同じ名前の X アトムを識別する整数値を返します。

 -- Function: x-atom-name integer
     整数値 INTEGER によって識別される X アトムと同じ名前のシンボルを返します。

Standard Hooks
**************

sawfish は前に定義された関数の拡張を可能にする多くのフックを提供します。また、多くの X のイベントはフックのしくみによって Lisp 環境に伝えられます。フックのしくみについての詳細は Normal Hooks (The Librep Manual) を参照して下さい。

sawfish では標準 call-back 関数を使うのはもちろん、 call-window-hook 関数をも提供しています。これはウィンドウを参照するフックを実行するために使われます。もしフックがウィンドウプロパティリストの中で定義されてりうローカルな値を持つならば、実際の変数によって定義されたデフォルト値ではなくこの値が使われます。

 -- Function: call-window-hook hook window &optional args hook-type
     WINDOW についてさらなる引数 ARGS とともに HOOK を呼びます。HOOK-TYPE の記述については call-hook を参照して下さい。フック内の各関数は引数 (WINDOW . ARGS) とともに呼ばれます。

次の表は sawfish によって呼ばれるすべての標準フックとそれらの呼び出し時にともなう引数について説明しています:

pre-command-hook
     各コマンドが評価される前に呼ばれます。

post-command-hook
     各コマンドが評価された後に呼ばれます。

unbound-key-hook
     バインドされていないキーかポインタイベントが受け取られるときに呼ばれます。 binding for.

before-add-window-hook
add-window-hook
     ウィンドウマネージャがウィンドウをつくるときに呼ばれます。最初に before-add-window-hook は呼ばれると単にそのウィンドウのプロパティを設定するだけです。

destroy-notify-hook
     ウィンドウが消されるときに呼ばれます。これは通常のイベントループに対して非同期に呼べることに注意して下さい。一般的にはウィンドウマネージャはウィンドウが消されたとわかると可能なかぎりすぐ後にこのフックを呼出そうとします。

map-notify-hook
unmap-notify-hook
reparent-notify-hook
enter-notify-hook
leave-notify-hook
focus-in-hook
focus-out-hook
shape-notify-hook
     同名の X イベントに似ていてウィンドウ引数とともに呼ばれます。

configure-request-hook
     X ConfigureRequest イベントを受け取るときに二つの引数 (WINDOW ALIST) とともに呼ばれます。ALIST にはアイテム (stack . above)、(stack . below)、(position . COORDINATES)、(dimensions . DIMENSIONS) が可能です。

enter-frame-part-hook
leave-frame-part-hook
     ポインタがフレームパーツ内に入るか出るかするときに二つの引数、ウィンドウとフレームパーツクラス (see Frame Part Classes) とともに呼ばれます。

window-moved-hook
window-resized-hook
     ウィンドウが移動かリサイズされるときにウィンドウ引数とともに呼ばれます。

visibility-notify-hook
     二つの引数、ウィンドウとfully-obscured、partially-obscured、 unobscured の中の一つのシンボルとともに呼ばれます。

property-notify-hook
     引数 (WINDOW ATOM-NAME TYPE) (ここで TYPE は new-value か deleted) とともに呼ばれます。

client-message-hook
     or タイプのフックです。引数 (WINDOW TYPE DATA-ARRAY) とともに呼ばれます。

enter-workspace-hook
leave-workspace-hook
workspace-state-change-hook
     引数ワークスペースとともに呼ばれます。

add-to-workspace-hook
remove-from-workspace-hook
     引数ウィンドウとともに呼ばれます。

viewport-resized-hook
     各仮想ワークスペースの行列数が変わったときに呼ばれます。

viewport-moved-hook
     仮想ワークスペースに対するビューポートの原点が変わったときに呼ばれます。

place-window-hook
     An or type hook. Called the first a window is mapped.

window-state-change-hook
iconify-window-hook
uniconify-window-hook
shade-window-hook
unshade-window-hook
window-maximized-hook
window-unmaximized-hook
window-depth-change-hook
     引数ウィンドウとともに呼ばれます。

after-initialization-hook
     ウィンドウの最初の組が配置された後で呼ばれます。

before-exit-hook
     終了前にすぐに呼ばれます。

sm-window-save-functions
sm-restore-window-hook
sm-after-restore-hook
     セッション管理のフックです。Session Management.

before-move-hook
before-resize-hook
     対話的な移動かリサイズが始まる前に引数ウィンドウとともに呼ばれます。

while-moving-hook
while-resizing-hook
     フックに対する引数として渡された、ウィンドウの対話的な移動かリサイズのさいに呼ばれます。

after-move-hook
after-resize-hook
     対話的な移動かリサイズの完了後に呼ばれます。ウィンドウと、ウィンドウがどのように移動あるいはリサイズされたかを定義するシンボルのリストの二つの引数とともに呼ばれます。

gtkrc-changed-hook
     現在の gtk スタイルパラメータを読み込むための gtkrc モジュールを使っているときに、このフックはスタイルの変更時に呼ばれます。

enter-flipper-hook
leave-flipper-hook
     ビューポート edge-flipping が有効なときに、これらのフックはポインタが画面端のピクセル幅の境界を出入りするさいに呼ばれます。これらは端を定義するシンボル left、right、top、bottom の内の一つを引数として呼ばれます。

Standard Window Properties
**************************

このマニュアルの最初の方の節で述べたようにそれぞれのウィンドウはプロパティリストを持ち、プロパティリストは任意の lisp データをシンボリックなキー (see Window Property Lists) に関連づけることができます。以下の表は現在使われているキーのサブセットです。

ignored
     もし設定されていればそのウィンドウは多くの操作で無視されます。

avoid
     もし設定されていればそのウィンドウは最大化や first-fit あるいは best-fit で(他のウィンドウが)配置されるときに覆われてしまうことはありません。

workspaces
     ウィンドウがメンバであるワークスペースを定義する整数値のリストかウィンドウがスティッキーなら nil を返します。See Workspaces.

sticky
     ウィンドウがすべてのワークスペースで現れるかどうかを示します。

sticky-viewport
     設定されていればそのウィンドウはそのワークスペースのすべてのビューポートに現れます。

keymap
     ウィンドウローカルのオプションのキーマップです。See Keymaps.

focus-click-through
     設定されていて click-to-focus モードが有効であればフォーカスするのにクリックするとそのクライアントウィンドウまで透過します。

ignore-window-input-hint
     設定されていればウィンドウの入力ヒントの値は無視される、すなわちウィンドウは適切なときにフォーカスされます。

never-focus
     設定されていればウィンドウは決してフォーカスされません。

focus-when-mapped
     ウィンドウが画面に配置されたときにフォーカスします。

ignore-program-position
     設定されていればウィンドウのプログラムによって指定されたプロパティは無視されます。

place-mode
     設定されていれば、このウィンドウについてはその配置モードが使われます。

placement-weight
     設定されていれば fitted ウィンドウ配置を行うときにこのウィンドウについてのピクセル数での重みです。

type
     ウィンドウのフレームタイプか nil です。See Frame Types.

frame-style
     明示的にユーザが選択したフレームスタイルか、設定されていません。 See Frame Styles.

current-frame-style
     そのとき使われているウィンドウのフレームスタイルです。 See Frame Styles.

removed-classes
     ウィンドウの装飾から取り除かれたフレームパーツクラスのリストです。 See Removing Frame Parts.

shaded
     ウィンドウがシェードされているかどうかを示します。 See Shading Windows.

hide-client
     フレーム内でクライアントウィンドウが可視状態であるかどうか。ウィンドウのシェードを実装するのに使われています。

depth
     整数値ならウィンドウがメンバであるレイヤ。レイヤ 0 は ``normal'' ウィンドウの深さで、負の深さはこれよりも背面、正の深さはより前面を示します。 See Window Stacking.

placed
     ウィンドウが配置されたかどうか。place-window-hook はこれが設定されていなときだけ呼ばれます。

iconified
     ウィンドウがアイコン化されているかどうか。See Iconifying Windows.

gravity
     設定されていればウィンドウのサイズヒントのウィンドウ gravity フィールドを上書きします。以下のシンボルの内のどれか一つです: north-west, north, north-east, west, center, east, south-west, south, south-east.

Session Management
******************

Samfish は X のセッション管理プロトコルを完全に統合してサポートします。また、このサポートはすべての Lisp モジュールが個々のウィンドウ状態を保存、再読み込みできるように拡張できます。

こうする方法は二つあります。もしモジュールが単に個々のウィンドウのプロパティリストのプロパティの値を保存、復元(すなわちそれらの値は window-put を通じて設定される)したいだけならば、次の関数が使えます:

 -- Function: sm-add-saved-properties &rest properties
     セッション毎にすべてのシンボル PROPERTIES が保存、再読み込みするようにします。

もし Lisp モジュールでこの方法を使うとセッションの再読み込み時に再読み込みされたプロパティに働く add-window-hook を関数に加えることができます。

ウィンドウの plist [プロパティリスト]に直接保存できない、より複雑なウィンドウプロパティについては二つのフックが使えます:

 -- Variable: sm-window-save-functions
     関数のリストで、各関数が個々のウィンドウの状態の保存時に呼ばれます。各関数は引数(ウィンドウ)と共に呼ばれ、状態ファイルに保存される連想リスト要素を返します(そういうわけで、文法が適切で読み込める値だけを含めることができます)。

 -- Variable: sm-restore-window-hook
     ウィンドウの状態の復元時に呼ばれる関数のリスト。各関数は引数 (WINDOW ALIST) と共に呼ばれ、ALIST はウィンドウについて保存される状態を定義する.

     各関数は保存されるプロパティを探し、その値に依存した何らかの働きをするべきです。

また次のフックも呼ばれます。

 -- Variable: sm-after-restore-hook
     保存されたセッションを読み込むときに呼ばれるフック

     [file faq-ja.texi not included]