MS-Windows、Nextstep、Haiku、Androidといったウィンドウシステムにおける選択は、Xにおけるものとは整合していません。これらのウィンドウシステムはそれぞれ、前節で説明した「選択コンバータ」機構を用いることなく、独自の選択機構を実装しています。一般的にサポートされているのはPRIMARY、CLIPBOARD、SECONDARYの選択のみですが、ドラッグ&ドロップデータを記録するXdndSelectionの選択は、NextstepおよびHaikuでも利用可能です。
GTKはXのセレクションシステムのエミュレーションを目指していますが、そのエミュレーションは完全に信頼できるわけではなく、全体的な品質は使用されるGDKバックエンドに依存します。そのため、PGTKでビルドしたEmacsは、XでビルドしたEmacsと同じセレクションインターフェースを提供しますが、多くのセレクションターゲットは有用ではありません。
クリップボードは存在しますが、MS-Windowsオペレーティングシステムにはプライマリ選択やセカンダリ選択という概念はありません。このシステムにおいて、Emacsはプライマリ選択とセカンダリ選択があるかのように動作し、要求に応じてクリップボードへの保存および取得を行います。
一次および二次選択のシミュレーションは、該当する選択を指定するシンボルの x-selections
プロパティ(すなわち gui-get-selection の type 引数)内に gui-set-selection
に渡された値を保存することで行われます。その後の gui-get-selection
への各呼び出しでは、順次その値が返されますが、この値はさらなる検証(型チェックなど)の対象とはなりません。このような状況下では、通常 data-type 引数は無視されます。(ただし、TARGETS
に関する補足については後述します。)
クリップボードの選択に関しては(type が CLIPBOARD である場合はいつでも)、gui-set-selection は指定された値が文字列であることを検証し、selection-coding-system
で設定された符号化方式によって符号化された後、システムクリップボードに保存します。gui-get-selection の呼び出し元は、data-type を STRING または TARGETS のいずれかに設定する必要があります。
gui-get-selectionの呼び出しにおいてdata-typeにTARGETSが設定されている場合、Xと同様に、選択データが存在するときにはシンボルのベクトルが返されます。前提となるデータ変換ルーチンが存在しないため、STRING以外の形式でクリップボードデータを要求することは不可能です。クリップボードに保存された文字列がselection-coding-systemによってエンコードされるのと同様に、クリップボードから読み出される文字列も同じ符号化方式によってデコードされます。選択テキストをクリップボードに保存する際に問題が生じた場合、この変数およびその関連変数であるnext-selection-coding-systemについては、特に注意深く確認する必要があります。
All three selections standard in X exist in Nextstep as well, but Emacs is
only capable of saving strings to such selections. Restrictions imposed
upon calls to gui-set-selection there are much the
same as those on MS-Windows, though text is uniformly encoded as utf-8-unix without regard to the value of selection-coding-system. gui-get-selection is more charitable, and accepts
requests for the following selection targets:
XdndSelection の選択項目は Nextstep においても、gui-set-selection
に供給された値を記録するリポジトリという形で存在します。その唯一の目的は、基本的なドラッグ&ドロップ機能 x-begin-drag(ドラッグ&ドロップ
を参照)のためにこうした値を保存することであり、それ以外のもので読み取られた際の値については一切保証されません。
俳句体系に関する選集には、Xで慣習となっている3つの選集すべてと、ドラッグ&ドロップデータを記録するXdndSelectionが含まれる。
前述の3つの選択に対してgui-set-selectionが呼び出されると、渡されたデータは選択エンコーダ関数群によってウィンドウサーバーの「メッセージ」に変換され、ウィンドウサーバーへと送信される。
選択エンコーダ関数の一覧。gui-set-selection
が呼び出されると、この一覧にある各関数が、selection および value 引数とともに順次呼び出される。このような関数が nil 以外の値を返す場合、その戻り値は (key type value) 形式のリストでなければならない。このリストにおいて、key は転送されるデータの名称(通常は MIME タイプ、例えば ‘"text/plain"’)である必要があり、type はデータの種類を指定する記号または数値である。これにより value の解釈も決定される。以下に、有効なデータ型の一覧と、それぞれが value の解釈にどのように影響するかを示す。
string1バイト文字列。メッセージに格納された後、ヌル終端されます。
refファイル名。ファイルは所在しており、そのファイルを識別するinodeがメッセージに格納されます。
short16ビット整数値。
long32ビット整数値。
llong64ビット整数値。
bytechar0から255までの符号なしバイト。
size_t0から1の間の数値から、Emacsが動作しているコンピュータのワードサイズの2乗を引いた値。
ssize_tC型 ssize_t に収まる数値。
point画面上の座標を指定する2つの浮動小数点数の定数。
floatdouble形式未指定の単精度または倍精度浮動小数点数。
(haiku-numeric-enum MIME)特定のMIMEタイプのデータを含む1バイト文字列。
gui-get-selection への呼び出しでは、通常、選択メッセージ内の data-type という名前のデータが返されます。ただし、data-type が以下の X 選択ターゲットのいずれかに該当する場合は、別の名称に置き換えられます。
STRINGこれは X における Latin-1 テキストを表します: “text/plain;charset=iso-8859-1”
UTF8_STRINGこれはUTF-8テキストです:“text/plain”
data-type が STRING
のようなテキスト型、あるいはパターン ‘`text/*’ に一致する
MIME 型である場合、文字列データは返される前に、それに適した符号化方式でデコードされます。
さらに、2つのデータ型 TIMESTAMP と TARGETS
には特別な扱いがなされており、前者で返される値はシステム起動以降に選択が変更された回数(タイムスタンプではない)であり、後者は他と同様に、利用可能な選択データ型のベクトルとなっています。
MS-Windowsと同様に、Androidでもクリップボードは提供されていますが、プライマリ選択やセカンダリ選択は用意されていません。gui-set-selectionは、入力された値を変数に保存することでプライマリ選択とセカンダリ選択をシミュレートしており、後続のgui-get-selectionの呼び出しでその結果が返されます。
クリップボードから、gui-get-selection は STRING 型の UTF-8 文字列データ、TARGETS
データ型、あるいは任意の MIME タイプの画像およびアプリケーションデータを返することができます。gui-set-selection は MS-Windows
と同様に文字列データのみを設定しますが、このデータは selection-coding-system
の値の影響を受けません。対照的に、プライマリおよびセカンダリの選択範囲との間で保存・読み込みができるのは文字列データのみですが、このデータは Emacs
以外のプログラムには伝達されないため、いかなる符号化方式による符号化や復号の対象にもなりません。