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_TEXT
UTF8_STRING
STRING
選択データのタイプにセットされた単一のforeign-selection
テキストプロパティは、それらのデータタイプへのリクエストを継承するユニバイト文字列に配置される。
選択の所有者はそれぞれ少なくとも2つの選択ターゲットをリターンしなければなりません。1つ目はその所有者がサポートする選択データを記述するアトムの個数であるTARGETS
、2つ目は内部的な目的のためにXクライアントが使用するMULTIPLE
です。選択の所有者は任意の個数の他のターゲットをサポートでき、それらの一部はXコンソーシアム(Inter-Client Communication Conventions
Manual)によって標準化されているかもしれないし、他のUTF8_STRING
のようなターゲットについてはXFree86プロジェクトによって標準化されるはずでした(しかしその標準化が完了することはなかった)。
慣例により特定の選択ターゲットへのリクエストは特定のタイプ、あるいはいくつかのタイプのいずれか(選択の所有者にとって一番都合がいいタイプ)がリターンされるかもしれません。後者の選択ターゲットのタイプについてはポリモーフィックターゲット(polymorphic target: 多様ターゲット)と呼ばれています。あるリクエストへの応答において0,選択ターゲットがデータを何もリターンしないこともあり得ます。その後に副作用として選択の所有者は何らかのアクションを実行します。したがってこのように応答されるターゲットは副作用ターゲット(side-effect targets)と呼ばれます。
以下はCLIPBOARD
、PRIMARY
、SECONDARY
のターゲットからのリクエスト時には標準とおおむね一貫性のある挙動を示す選択ターゲットの一部です。
ADOBE_PORTABLE_DOCUMENT_FORMAT
このターゲットはAdobe Systemの“PDF(Portable Document Format)”のフォーマットのデータを文字列としてリターンする。
APPLE_PICT
このターゲットはMacintoshコンピューターで用いられている“PICT”イメージフォーマットのデータを文字列としてリターンする。
BACKGROUND
BITMAP
COLORMAP
FOREGROUND
これらビットマップのバックグラウンドカラーのピクセル値、ビットマップのX識別子、バックグラウンドとフォアグラウンドが割り当てられたカラーマップ、ビットマップのフォアグラウンドカラーのピクセル値という4つのターゲットは、組み合わせられてXサーバーに格納されたビットマップイメージを使用するために必要な整数をリターンする。
CHARACTER_POSITION
このターゲットは選択データを含むテキストフィールドで選択データの開始と終了の位置(単位はバイト)を記述するタイプSPAN
の2つの32ビット符号なし整数をリターンする。
COMPOUND_TEXT
このターゲットはXコンソーシアムのマルチバイトエンコーディングシステムのタイプCOMPOUND_TEXT
の文字列をリターンする。
DELETE
このターゲットは何もリターンしないが、副作用として選択を含んだテキストフィールドから選択のコンテンツを削除する。
DRAWABLE
PIXMAP
このターゲットはそれぞれが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/plain
text/plain;charset=utf-8
text/uri-list
text/x-xdnd-username
XmTRANSFER_SUCCESS
XmTRANSFER_FAILURE
FILE
_DT_NETFILE
これらはドラッグアンドドロップ操作中に内部の用途にたいして使用される選択コンバーターであり、XdndSelection
以外の選択にたいしては利用できない。
TARGETS
この選択コンバーターは、Emacsが理解できる選択ターゲットごとに1つずつアトムのリストをリターンする。
MULTIPLE
この選択コンバーターはCコードで実装されており、同時に複数の選択ターゲットを指定する選択リクエストの転送を効果的に実装するために用いられる。
LENGTH
この選択コンバーターは選択データの長さをバイト単位でリターンする。
DELETE
この選択コンバーターはドラッグアンドドロップ操作中に内部的な用途のために使用される。
FILE_NAME
この選択コンバーターは選択データを含むバッファーのファイル名をリターンする。
CHARACTER_POSITION
この選択コンバーターは選択データを含むバッファー内の選択の終了それぞれの文字位置をリターンする。
LINE_NUMBER
COLUMN_NUMBER
この選択コンバーターは選択データを含むバッファー内の選択の終了それぞれの行番号、または列番号をリターンする。
OWNER_OS
この選択コンバーターはEmacsを実行中のオペレーティングシステムの名前をリターンする。
HOST_NAME
この選択コンバーターはEmacsを実行中のマシンのFQDN(完全修飾ドメイン名)をリターンする。
USER
この選択コンバーターは実行中のEmacsのユーザーアカウントのユーザー名をリターンする。
CLASS
NAME
この選択コンバーターはEmacsが使用しているリソースのクラスまたは名前をリターンする。
INTEGER
この選択コンバーター文字通り整数値をリターンする。
SAVE_TARGETS
_EMACS_INTERNAL
これらの選択コンバーターは内部的な用途のために用いられる。
INTEGER
を除いたすべての選択コンバーターは次のいずれかのデータがgui-set-selection
に提供されることを期待します:
(beg end buf)
という形式のフォーム。ここでbegとendはバッファーbufにおいて選択データの境界を記述するマーカーかオーバーレイ。