Xは選択データにたいする固定化されたデータタイプの定義と選択の個数の固定化を控えてきました。選択は文字列名にたいしてXサーバーが発行する29ビットの一意な識別子である、Xの“アトム(atom)”によって識別されます。この複雑さはEmacsにより隠蔽されています。アトムの名前と同じ名前のシンボルをLispが提供すると、Emacsはそれ以上の介入を行わずにそれらの識別子を要求するのです。
Xであるプログラムが選択を“セット”したとき、Xは実際にはそのプログラムを選択の“オーナー(owner: 所有者)”にします。それからXサーバーがプログラムに選択リクエストを送信します。プログラムは選択データを要求したクライアントに応答する義務があります。
同様にプログラムがXサーバーから選択データを“ゲット”するのではなく、プログラムの選択リクエストはその選択にたいして最後に所有権を表明したウィンドウとともに、データへのリクエストにたいして応答が期待されるクライアントに送信されるのです。
選択にたいするリクエストにはそれぞれ3つのパラメーターが組み込まれています:
gui-get-selectionのtype引数によってターゲットが判断される。
選択の所有者は一連のバイト、32ビットワード、およびそれらのワードタイプを識別する別のアトムをリクエスターに転送することによって応答を行います。選択のリクエスト後に、選択の所有者が転送したデータをLisp表現(gui-get-selectionがリターン)に変換するために、Emacsがデータフォーマットとデータタイプに独自の解釈を適用します。
Emacsは一連の任意のバイトから構成される選択データを、それらのバイトを保持するユニバイト文字列に変換します。このユニバイト文字列は符号なし数値として単一の16ビットまたは32ビットのワードから構成され、さらに符号なし数値のベクターとして複数のそのようなワードから構成されます。この一般的なパターンの例外として、以下の変換ターゲットからのデータにたいして、Emacsは特別な扱いをほどこします:
INTEGERこのタイプの16ビットまたは32ビットのワードは、符号なし整数ではなく符号つき整数として扱われる。選択データに複数のワードがあればベクター、それ以外はその整数自体をリターンする。
ATOMこのタイプの32ビットのワードはXアトムとして扱われて、その名前がアトムを識別するようなLispシンボル(単独またはベクター)としてリターンされる。無効なアトムはnilに置き換えられる。
COMPOUND_TEXTUTF8_STRINGSTRING選択データのタイプにセットされた単一のforeign-selectionテキストプロパティは、それらのデータタイプへのリクエストを継承するユニバイト文字列に配置される。
Each selection owner must return at least two selection targets:
TARGETS, which returns a number of atoms describing the selection
targets that the owner supports, and MULTIPLE, used for internal
purposes by X clients. A selection owner may support any number of other
targets, some of which may be standardized by the X Consortium’s
Inter-Client Communication Conventions Manual, while others, such as
UTF8_STRING, were meant to be standardized by the XFree86 Project,
but their standardization was never completed.
慣例により特定の選択ターゲットへのリクエストは特定のタイプ、あるいはいくつかのタイプのいずれか(選択の所有者にとって一番都合がいいタイプ)がリターンされるかもしれません。後者の選択ターゲットのタイプについてはポリモーフィックターゲット(polymorphic target: 多様ターゲット)と呼ばれています。あるリクエストへの応答において0,選択ターゲットがデータを何もリターンしないこともあり得ます。その後に副作用として選択の所有者は何らかのアクションを実行します。したがってこのように応答されるターゲットは副作用ターゲット(side-effect targets)と呼ばれます。
以下はCLIPBOARD、PRIMARY、SECONDARYのターゲットからのリクエスト時には標準とおおむね一貫性のある挙動を示す選択ターゲットの一部です。
ADOBE_PORTABLE_DOCUMENT_FORMATこのターゲットはAdobe Systemの“PDF(Portable Document Format)”のフォーマットのデータを文字列としてリターンする。
APPLE_PICTこのターゲットはMacintoshコンピューターで用いられている“PICT”イメージフォーマットのデータを文字列としてリターンする。
BACKGROUNDBITMAPCOLORMAPFOREGROUNDこれらビットマップのバックグラウンドカラーのピクセル値、ビットマップのX識別子、バックグラウンドとフォアグラウンドが割り当てられたカラーマップ、ビットマップのフォアグラウンドカラーのピクセル値という4つのターゲットは、組み合わせられてXサーバーに格納されたビットマップイメージを使用するために必要な整数をリターンする。
CHARACTER_POSITIONこのターゲットは選択データを含むテキストフィールドで選択データの開始と終了の位置(単位はバイト)を記述するタイプSPANの2つの32ビット符号なし整数をリターンする。
COMPOUND_TEXTこのターゲットはXコンソーシアムのマルチバイトエンコーディングシステムのタイプCOMPOUND_TEXTの文字列をリターンする。
DELETEこのターゲットは何もリターンしないが、副作用として選択を含んだテキストフィールドから選択のコンテンツを削除する。
DRAWABLEPIXMAPこのターゲットはそれぞれがXサーバーのdrawableかpixmapに相当する符号なし32ビット整数のリストをリターンする。
ENCAPSULATED_POSTSCRIPT_ADOBE_EPSこのターゲットはEPS(Encapsulated Postscript)のコードを含む文字列をリターンする。
FILE_NAMEこのターゲットはNULL文字で区切られた1つ以上のファイル名を含む文字列をリターンする。
HOST_NAMEこのターゲットは選択の所有者が実行されているマシンのFQDN(Fully-Qualified Domain Name: 完全修飾ドメイン名)を含む文字列をリターンする。
USERこのターゲットは選択の所有者が実行されているマシンのユーザー名を含む文字列をリターンする。
LENGTH。このターゲットは選択データの長さを含む32ビットまたは16ビットの符号なし整数をリターンする。
LINE_NUMBERこのターゲットは選択データを含むテキストフィールド内における選択データの開始と終了の位置に相当する行番号を記述するタイプSPANの2つの32ビット符号なし整数をリターンする。
MODULEこのターゲットは選択データを含むすべての関数の名前をリターンする。主にテキストエディターによってリクエストされる。
STRINGこのターゲットは選択データをISO Latin-1フォーマット、Unix改行のタイプSTRINGの文字列としてリターンする。
C_STRINGこのターゲットは選択データを“C文字列”としてリターンする。これは何であれ所有者が用いているエンコーディングによるNULL終端された、あるいはまったく終端されていない、または終端されているいないに関わらずASCII文字列のいずれかであるようなraw選択データを意味すると解釈される。
UTF8_STRINGこれは選択データをUTF-8,でエンコードされたEOLフォーマット未指定のタイプUTF8_STRINGの文字列としてリターンする。
TIMESTAMPこのターゲットは選択にたいして所有者が所有権を得た際のXサーバータイムスタンプを16ビットまたは32ビットのタイプCARDINALのワードとしてリターンする。
TEXTこのポリモーフィックターゲットは選択データをCOMPOUND_TEXT、STRING、C_STRING、UTF8_STRINGのいずれかから何であれ選択の所有者にとって都合がいいデータタイプの文字列としてとしてリターンする。
selection-coding-systemおよびnext-selection-coding-systemがどちらもセットされておらず関数gui-get-selectionを用いてターゲットSTRING、COMPOUND_TEXT、UTF8_STRINGへのリクエストを作成すると結果となる文字列はそれぞれiso-8859-1、compound-text-with-extensions、utf-8という正しいコーディングシステムによってデコードされます。
上述のターゲット(およびさまざまなプログラムが独自の用途に用いる多くのターゲット)に加えて、いくつかの著名なプログラムやツールキットが適切なX標準化団体との対話なしで独自に選択データタイプを定義しています。これらのターゲットは一般的にtext/htmlやimage/jpegのようなMIMEタイプに習って命名されており、以下のデータ形式をリターンすることが目撃されてきました:
file://のURI(またはおそらく改行かNULLで終端されたURIリスト)。
これらの選択ターゲットを最初に使用したのはNetscapeでしたが、現在ではあらゆる種類のプログラムが提供しており、それらは特にGTK+またはQtツールキットの最近のバージョンにもとづいています。
Emacsには選択の所有者としての役割りを果たす能力もあります。gui-set-selectionが呼び出されると提供される選択データは内部的に記録されて、Emacsはセットされる選択の所有権を取得します。
選択ターゲットから“選択コンバーター(selection converter)”となる関数へのalist。選択リクエストを受信すると、Emacsはリクエストされた選択ターゲットに関連する選択コンバーターを検索する。
選択コンバーターはリクエストされた選択を識別するアトムに相当するシンボル、リクエストされた選択ターゲット、gui-set-selectionでセットする値という3つの引数で呼び出される。選択コンバーターはデータタイプと個数を示すシンボルのコンス、シンボル、数値かシンボルのベクター、またはそのようなコンスのcdrのいずれかをリターンしなければならない。
選択コンバーターの値が特別なシンボルNULLの場合にはリクエスターにリターンされるデータタイプはNULLにセットされて、応答には何のデータも送信されない。
値が文字列の場合には、ユニバイト文字列でなければならない。データタイプを明示的に指定しなければ、リクエスターにはタイプSTRINGでデータは転送される。
値がシンボルならその値の“アトム”が取得されて、リクエスターには32ビット値(データタイプが指定されていなければタイプはATOM)として転送される。
-32769から32768の間の数値の場合には、リクエスターには16ビット値(データタイプが指定されていなければタイプはINTEGER)として転送される。
上記以外の数値なら32ビット値とみなされる。たとえ符号なしの数値がリターンされても、リクエスターがタイプINTEGERのワードを符号つきとして扱うだろう。符号なしの値をリターンするには、そこでタイプCARDINALを指定すること。
値がシンボルか数値のベクターの場合には、リクエスターへの応答は複数のアトムか数値からなるリストになる。リターンされるデータタイプが明示的に指定されていなければ、リストの最初の要素のデータタイプ。
デフォルトでは、Emacsは以下の選択ターゲットにたいしてセコンバーターを構成します:
TEXTこの選択コンバーターは以下のように選択データをリターンする:
C_STRINGの文字列。
STRINGの文字列。
selection-coding-systemかnext-selection-coding-systemが:mime-charsetプロパティにx-ctextをもつコーディングシステムにセットされていれば、タイプCOMPOUND_TEXTの文字列。
UTF8_STRINGの文字列。
COMPOUND_TEXTこの選択コンバーターは選択データをタイプCOMPOUND_TEXTの文字列としてリターンする。
STRINGこの選択コンバーターは選択データをISO-Latin-1フォーマットでエンコードされたタイプSTRINGの文字列としてリターンする。
UTF8_STRINGこの選択コンバーターは選択データをUTF-8フォーマットでリターンする。
text/plaintext/plain;charset=utf-8text/uri-listtext/x-xdnd-usernameXmTRANSFER_SUCCESSXmTRANSFER_FAILUREFILE_DT_NETFILEこれらはドラッグアンドドロップ操作中に内部の用途にたいして使用される選択コンバーターであり、XdndSelection以外の選択にたいしては利用できない。
TARGETSこの選択コンバーターは、Emacsが理解できる選択ターゲットごとに1つずつアトムのリストをリターンする。
MULTIPLEこの選択コンバーターはCコードで実装されており、同時に複数の選択ターゲットを指定する選択リクエストの転送を効果的に実装するために用いられる。
LENGTHこの選択コンバーターは選択データの長さをバイト単位でリターンする。
DELETEこの選択コンバーターはドラッグアンドドロップ操作中に内部的な用途のために使用される。
FILE_NAMEこの選択コンバーターは選択データを含むバッファーのファイル名をリターンする。
CHARACTER_POSITIONこの選択コンバーターは選択データを含むバッファー内の選択の終了それぞれの文字位置をリターンする。
LINE_NUMBERCOLUMN_NUMBERこの選択コンバーターは選択データを含むバッファー内の選択の終了それぞれの行番号、または列番号をリターンする。
OWNER_OSこの選択コンバーターはEmacsを実行中のオペレーティングシステムの名前をリターンする。
HOST_NAMEこの選択コンバーターはEmacsを実行中のマシンのFQDN(完全修飾ドメイン名)をリターンする。
USERこの選択コンバーターは実行中のEmacsのユーザーアカウントのユーザー名をリターンする。
CLASSNAMEこの選択コンバーターはEmacsが使用しているリソースのクラスまたは名前をリターンする。
INTEGERこの選択コンバーター文字通り整数値をリターンする。
SAVE_TARGETS_EMACS_INTERNALこれらの選択コンバーターは内部的な用途のために用いられる。
INTEGERを除いたすべての選択コンバーターは次のいずれかのデータがgui-set-selectionに提供されることを期待します:
(beg end buf)という形式のフォーム。ここでbegとendはバッファーbufにおいて選択データの境界を記述するマーカーかオーバーレイ。