MS-Windows、Nextstep、Haiku、Androidのようなウィンドウシステムの選択はXの選択とは異なります。これらのウィンドウシステムは前ノードで説明した“選択コンバーター”メカニズムを採用せずに、それぞれが独自の選択メカニズムを場当たり的な使用しています。一般的にサポートされている選択はPRIMARY
、CLIPBOARD
、SECONDARY
ですがドラッグアンドドロップのデータを記録するXdndSelection
選択はNextstepとHaikuでも利用できます。
GTKはxの選択システムをエミュレートする道わ模索していますがそのエミュレーションは完全に信頼の置けるものではなく、GDKバックエンドが使用される問題それぞれの全体的な品質に依存します。したがってPGTKとともにビルドしたEmacsでは、XとともにビルドしたEmacsと同じインターフェイスが提供されますが、選択ターゲットの多くは役に立たないでしょう。
たとえクリップボードはあっても、MS-Windowsというオペレーティングシステムにはプライマリーやセカンダリーという選択の概念がありません。このシステムでは要求に応じてクリップボードへの保存や取得を行う際に、Emacsがプライマリー選択とセカンダリー選択の存在をシミュレートしています。
プライマリー選択とセカンダリー選択のシミュレーションは、gui-set-selection
に与えられた選択との関連を指定するシンボルのx-selections
プロパティ(すなわちgui-get-selection
のtype引数)の値を保存するすることによって行われます。その後の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
は特に吟味する価値があるでしょう。
Xにおける標準であるこれら3つの選択はNextstepにも存在しますが、Emacsに唯一可能なのはこれらの選択への文字列の保存だけです。selection-coding-system
の値に関わらずテキストはutf-8-unix
として一律にエンコードされるとはいえ、gui-set-selection
の呼び出しにはMS-Windowsの場合と同様の制限が課せられます。gui-get-selection
はより寛大なので、以下の選択ターゲットにたいしてリクエストを受け付けます:
NextstepではXdndSelection
選択も、gui-set-selection
に提供された値を記録するレポジトリという形式で存在します。これの唯一の目的は、基本的なドラッグアンドドロップ関数であるx-begin-drag
にたいする値を保存することにあります(ドラッグアンドドロップを参照)。他の何らかのによって読み取った値については何の保証もありません。
Haikuシステムにおける選択はXにおいて慣例的な3つの選択すべて、およびドラッグアンドドロップデータを記録するXdndSelection
から構成されています。
前者の3つの選択にたいしてgui-set-selection
が呼び出されると、提供されたデータは選択エンコーダー(selection
encoder)という関数のリストによりウィンドウサーバーの“メッセージ”へと変換されて、ウィンドウサーバーに送信されます。
選択エンコーダー関数のリスト。gui-set-selection
が呼び出されると、そのselectionとvalueの引数により、このリスト内の関数がそれぞれ順に呼び出される。これらの関数が非nil
をリターンする場合には、リターン値は(key type value)
という形式のリストでなければならない。このリストにおいてkeyは転送されるデータの名前(一般的にはたとえば‘"text/plain"’のようにそのデータのMIMEタイプ)、typeはデータのタイプを指定するシンボルか数値(これらによりvalueの解釈も管理される)。以下のリストに有効なデータタイプ、およびそれらによってvalueがどのように解釈されることになるかを示す。
string
ユニバイト文字列。この文字列はメッセージ内に配置された後にNULL終端される。
ref
ファイル名。ファイルを特定してそのファイルを識別するinodeをメッセージ内に配置する。
short
16ビット整数値。
long
32ビット整数値。
llong
64ビット整数値。
byte
char
0から255の符号なしバイト。
size_t
0から1までの数値から、Emacs実行中のコンピューターのワードサイズの2乗を減じた値。
ssize_t
Cのssize_t
型に適合する数値。
point
スクリーン上の座標を指定する2つの浮動小数点数のコンス。
float
double
フォーマット未指定の単精度または倍精度の浮動小数点数。
(haiku-numeric-enum MIME)
特定のMIMEタイプのデータを含んだユニバイト文字列。
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タイプの場合には、文字列データはリターンされる前に適切なコーディングシステムによってデコードされます。
さらにTIMESTAMPとTARGETS
の2つのデータタイプは特別に取り扱われます。前者にたいしてリターンされる値はシステムの起動以降に選択が変更された回数(タイムスタンプではない)、後者については他の場合と同じように任意の選択データタイプのベクターです。
MS-Windowsと同じようにAndroidはクリップボードを提供しますがプライマリー選択とセカンダリー選択はありません。gui-set-selection
はgui-get-selection
呼び出し後にリターンされる値を変数に保存することでプライマリー選択とセカンダリー選択をシミュレートします。
gui-get-selection
にはクリップボードからタイプSTRING
のUTF-8文字列データ、TAREGTS
データタイプ、イメージデータや任意のMIMEタイプのアプリケーションデータをリターンする能力があります。gui-set-selection
はたとえデータがselection-coding-system
の値に影響を受けなくても、MS-Windowsの場合と同じように文字列データだけをセットできます。これとは対照的にプライマリー選択およびセカンダリー選択との間で保存と読み取りができるのは文字列データだけです。ただしこのデータがEmacs以外のプログラムとやり取りされることはないので、何らかのコーディングシステムによるエンコーディングやデコーディングの対象ではありません。