Xは、選択データや固定数の選択に対して固定のデータ型を定義することを避けている。選択はXの「アトム」によって識別され、これはXサーバーが文字列名に対して発行する一意の29ビット識別子である。この複雑さはEmacsによって隠蔽されており、Lispがアトムと同じ名前のシンボルを提供している場合、Emacsは追加の操作なしにこれらの識別子を要求する。
プログラムがXでセレクションを「設定」すると、実際にはそのプログラム自身がそのセレクションの「所有者」となります。するとXサーバーはセレクション要求をプログラムに送信し、プログラムは要求元のクライアントに対してセレクションデータで応答する必要があります。
同様に、プログラムはXサーバーから選択データを「取得」することはありません。その代わりに、選択リクエストは、最後にその選択の所有権を主張したウィンドウを持つクライアントに送信され、クライアントは要求されたデータを返すことが想定されています。
各選択リクエストには、3つのパラメータが含まれます:
gui-get-selectionのtype引数によって決定される。
セレクションの所有者は、リクエスト元に対し、一連のバイト、16ビットワード、または32ビットワードと、それらのワードの型を識別する別のアトムを転送することで応答します。セレクションをリクエストした後、Emacsはデータ形式とデータ型に対する独自の解釈を適用し、セレクションの所有者から転送されたデータをLisp表現に変換して返します。gui-get-selection
Emacsは、任意のバイト列からなる選択データを、それらのバイトを保持するユニバイト文字列に変換します。単一の16ビットまたは32ビットワードからなる場合は符号なし数値として、複数のそのようなワードからなる場合は符号なし数値のベクトルとして表現されます。この一般的なパターンの例外として、Emacsは以下の変換対象からのデータに対して特別な処理を適用します:
INTEGERこの型の16ビットまたは32ビットワードは、符号なし整数ではなく符号付き整数として扱われます。選択データに複数のワードがある場合はベクトルが返され、そうでない場合は整数単体が返されます。
ATOMこの型の32ビットワードはX原子として扱われ、特定する名称のLispシンボルとして(単独で、あるいはベクトルとして)返されます。無効な原子はnilに置き換えられます。
COMPOUND_TEXTUTF8_STRINGSTRINGこれらのデータ型のリクエストから派生したユニバイト文字列には、選択データの型に設定された単一の foreign-selection テキストプロパティが配置されます。
各セレクションオーナーは、少なくとも2つのセレクションターゲットを返さなければなりません。一つは、オーナーがサポートするセレクションターゲットを記述するアトムの数を返すTARGETSであり、もう一つはXクライアントが内部用途に使用するMULTIPLEです。セレクションオーナーは任意の数の他のターゲットをサポートでき、その一部はX
ConsortiumのInter-Client
Communication Conventions Manualによって標準化されている場合があります。一方で、UTF8_STRINGのようにXFree86
Projectによって標準化される予定であったものの、その標準化が完了しなかったものもあります。
特定の選択ターゲットに対するリクエストは、慣例として特定の型のデータを返す場合もあれば、選択オーナーにとって最も都合の良い複数の型のいずれかのデータを返す場合もある。後者のタイプの選択ターゲットは、ポリモーフィックターゲットと呼ばれる。リクエストへの応答として、選択ターゲットがデータを一切返さないこともあり、その場合、選択オーナーは副作用として何らかのアクションを実行する。このように応答されるターゲットは、副作用ターゲットと呼ばれる。
以下に、CLIPBOARD、PRIMARY、またはSECONDARYの選択項目からリクエストした際に、概ね標準に準拠した挙動を示す選択対象をいくつか挙げます。
ADOBE_PORTABLE_DOCUMENT_FORMATこのターゲットは、Adobe Systemsの「Portable Document Format」形式のデータを文字列として返します。
APPLE_PICTこのターゲットは、Macintoshコンピュータで使用される「PICT」画像形式のデータを文字列として返します。
BACKGROUNDBITMAPCOLORMAPFOREGROUNDこれら4つのターゲットを合わせることで、Xサーバーに格納されたビットマップ画像を利用するために必要な整数データ、すなわちビットマップの背景色のピクセル値、ビットマップのX識別子、背景と前景色が割り当てられているカラーマップ、およびビットマップの前景色のピクセル値が返されます。
CHARACTER_POSITIONこのターゲットは、それを格納するテキストフィールド内における選択データの開始位置と終了位置をバイト単位で表す、SPAN型の符号なし32ビット整数2つを返します。
COMPOUND_TEXTこのターゲットは、X Consortiumのマルチバイトテキストエンコーディングシステムにおいて、COMPOUND_TEXT型の文字列を返します。
DELETEこのターゲットは何も返しませんが、副作用として、選択内容を含むすべてのテキストフィールドからその内容を削除します。
DRAWABLEPIXMAPこのターゲットは、Xサーバーの描画可能オブジェクトまたはピクマップに対応する、符号なし32ビット整数のリストを返します。
ENCAPSULATED_POSTSCRIPT_ADOBE_EPSこのターゲットは、カプセル化されたPostScriptコードを含む文字列を返します。
FILE_NAMEこのターゲットは、1つ以上のファイル名をNULL文字で区切った文字列を返します。
HOST_NAMEこのターゲットは、選択オーナーが動作しているマシンの完全修飾ドメイン名を含む文字列を返します。
USERこのターゲットは、選択オーナーが動作しているマシンのユーザー名を含む文字列を返します。
LENGTHこのターゲットは、選択データの長さを含む符号なし32ビットまたは16ビット整数を返します。
LINE_NUMBERこのターゲットは、それを格納するテキストフィールド内の選択データの開始位置および終了位置に対応する行番号を示す、SPAN型の符号なし32ビット整数を2つ返します。
MODULEこのターゲットは、選択データを含む任意の関数名を返します。主にテキストエディタから利用されます。
STRINGこのターゲットは、選択データをISO Latin-1形式でエンコードし、Unix形式の改行文字を含むSTRING型の文字列として返します。
C_STRINGこのターゲットは、選択データを「C文字列」として返します。これは、所有者が使用しているエンコーディングによる生の選択データ(NULLバイトで終端されているか否かを問わず)、あるいは終端されているか否かを問わないASCII文字列である、と解釈されてきました。
UTF8_STRINGこれにより、選択データがUTF-8でエンコードされ、EOL形式が未指定のUTF8_STRING型の文字列として返されます。
TIMESTAMPこのターゲットは、セレクションの所有者が所有権を取得した時点のXサーバー時刻を、CARDINAL型の16ビットまたは32ビットワードとして返します。
TEXTこのポリモーフィックなターゲットは、選択オーナーにとって都合の良いデータ型に応じて、COMPOUND_TEXT、STRING、C_STRING、またはUTF8_STRINGのいずれかの文字列として選択データを返します。
関数 gui-get-selection を用いてターゲット STRING、COMPOUND_TEXT、または UTF8_STRING のリクエストが行われ、かつ selection-coding-system も next-selection-coding-system
も設定されていない場合、生成された文字列は、それぞれのターゲットに対応する適切な符号化方式(iso-8859-1、compound-text-with-extensions、utf-8)でデコードされます。
上述のターゲット(および各種プログラムが独自の目的で利用している数多くのターゲット)に加え、いくつかの普及しているプログラムやツールキットは、適切なX標準策定機関に諮ることなく、独自の選択データ型を定義しています。これらのターゲットは一般に
text/html や image/jpeg
といったMIMEタイプにちなんで命名されており、以下のような形式のデータを返すことが確認されています。
file://
適切な形式のファイルを識別するURI(あるいは、想定される改行またはNUL終端のURIリスト)。
これらの選択ターゲットは当初Netscapeで採用されていましたが、現在ではあらゆる種類のプログラム、特に最新バージョンのGTK+やQtツールキットをベースとしたもので提供されています。
Emacsは選択範囲のオーナーとなることもできます。gui-set-selectionが呼び出されると、提供された選択範囲のデータが内部的に記録され、Emacsは設定対象の選択範囲の所有権を取得します。
「選択コンバータ」関数への選択対象の一覧。選択リクエストを受信すると、Emacsは要求された選択対象に対応する選択コンバータを参照します。
選択コンバータは、要求される選択を識別するアトムに対応するシンボル、要求される選択対象、およびgui-set-selectionで設定された値という3つの引数で呼び出されます。返すべき値は、データ型と数値を指定するシンボル、シンボル、数値またはシンボルのベクトル、あるいはそれらのコンス自体のcdrのいずれかとなります。
選択コンバータの値が特殊記号 NULL の場合、リクエスト元に返されるデータ型は NULL に設定され、応答としてデータは送信されません。
このような値が文字列である場合、それはユニバイト文字列でなければなりません。データ型が明示的に指定されていない場合、データはタイプ STRING として要求元に転送されます。
シンボルである場合は、その「アトム」が取得され、リクエスト元に32ビット値として転送されます――データ型が指定されていない場合、その型はATOMとなります。
-32769から32768までの数値である場合、リクエスト元に16ビット値として転送されます。データ型が指定されていない場合、その型はINTEGERとなります。
それ以外の数値の場合は、32ビット値として扱われます。返される数値が符号なしであっても、要求元はINTEGER型のワードを符号付きとして扱います。符号なし値を返すには、代わりにCARDINAL型を指定してください。
記号や数値のベクトルである場合、その要求元への応答は、複数のアトムまたは数値のリストとなります。明示的に設定されていない場合に返されるデータ型は、リストの最初の要素の型となります。
デフォルトでは、Emacsは以下の選択対象に対して選択コンバータが設定されています。
TEXTこの選択コンバータは、選択データを以下のように返します:
C_STRING 型の文字列(テキスト表現を参照)。
STRING型の文字列。
COMPOUND_TEXT 型の文字列を、:mime-charset プロパティが x-ctext
である符号化方式が selection-coding-system または next-selection-coding-system に設定されている場合はその方式を使用します。
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が認識する各セレクション対象に対応するアトムのリストを返します。
MULTIPLEこの選択コンバータはC言語で実装されており、複数の選択対象を同時に指定する選択リクエストを効率的に転送するために用いられます。
LENGTHこの選択コンバータは、選択データの長さをバイト単位で返します。
DELETEこの選択コンバータは、ドラッグ&ドロップ操作時の内部処理に使用されます。
FILE_NAMEこの選択コンバータは、選択データを含むバッファのファイル名を返します。
CHARACTER_POSITIONこの選択コンバータは、選択データを含むバッファ内における、選択範囲の両端の文字位置を返します。
LINE_NUMBERCOLUMN_NUMBERこの選択範囲コンバータは、選択範囲データを含むバッファ内における、選択範囲の両端の行番号と列番号を返します。
OWNER_OSこの選択コンバータは、Emacsが動作しているオペレーティングシステムの名前を返します。
HOST_NAMEこのセレクタコンバータは、Emacsが動作しているマシンの完全修飾ドメイン名を返します。
USERこの選択コンバータは、Emacsが動作しているユーザーアカウントのユーザー名を返します。
CLASSNAMEこれらの選択コンバータは、Emacsで使用されるリソースクラスと名称を返します。
INTEGERこの選択コンバータは、整数値をそのまま返します。
SAVE_TARGETS_EMACS_INTERNALこれらの選択変換器は、内部用途に使用されます。
INTEGERを除き、すべての選択コンバータは、gui-set-selectionに提供されるデータが以下のいずれかであることを想定しています。
(beg end buf) 形式のリスト。ここで
beg と end は、バッファ buf 内の選択データの範囲を記述する2つのマーカーまたはオーバーレイである。