30.22.1 Выделения X

X воздерживается от определения фиксированных типов данных для данных выделения или фиксированного числа выделений. Выделения идентифицируются X-“атомами”, которые представляют собой уникальные 29-битные идентификаторы, выдаваемые X-сервером для строковых имён. Эта сложность скрыта Emacs: когда Lisp предоставляет символ, имя которого совпадает с именем атома, Emacs запросит эти идентификаторы без дополнительного вмешательства.

Когда программа “устанавливает” выделение в X, она фактически делает себя “владельцем” выделения — X-сервер затем будет направлять запросы на выделение этой программе, которая обязана ответить запрашивающему клиенту данными выделения.

Аналогично, программа не “получает” данные выделения от X-сервера. Вместо этого её запросы на выделение отправляются клиенту, окно которого последним заявляло о праве собственности на выделение, и ожидается, что он ответит запрошенными данными.

Каждый запрос выделения включает три параметра:

Владелец выделения отвечает, передавая запросчику последовательность байт, 16-битных слов или 32-битных слов, а также другой атом, идентифицирующий тип этих слов. После запроса выделения Emacs затем применяет собственную интерпретацию формата данных и типа данных для преобразования данных, переданных владельцем выделения, в представление Lisp, которое возвращает gui-get-selection.

Emacs преобразует данные выделения, состоящие из любой последовательности байт, в однобайтовую строку, содержащую эти байты; данные, состоящие из одного 16-битного или 32-битного слова, — в беззнаковое число; а данные, состоящие из нескольких таких слов, — в вектор беззнаковых чисел. Исключениями из этого общего правила являются случаи, когда Emacs применяет особую обработку для данных от следующих целей преобразования:

INTEGER

16-битные или 32-битные слова этого типа рассматриваются как знаковые, а не беззнаковые целые числа. Если в данных выделения несколько слов, возвращается вектор; в противном случае возвращается само целое число.

ATOM

32-битные слова этого типа рассматриваются как X-атомы и возвращаются (по отдельности или в виде векторов) как символы Lisp по идентифицируемым ими именам. Недействительные атомы заменяются на nil.

COMPOUND_TEXT
UTF8_STRING
STRING

В однобайтовые строки, полученные в результате запроса этих типов данных, будет помещено свойство текста foreign-selection, установленное в тип данных выделения.

Каждый владелец выделения должен возвращать как минимум две цели выделения: TARGETS, которая возвращает количество атомов, описывающих цели выделения, поддерживаемые владельцем, и MULTIPLE, используемую для внутренних целей X-клиентами. Владелец выделения может поддерживать любое количество других целей, некоторые из которых могут быть стандартизированы Руководством по соглашениям межклиентского взаимодействия консорциума X, в то время как другие, такие как UTF8_STRING, предполагалось стандартизировать проектом XFree86, но их стандартизация так и не была завершена.

Запросы на определённую цель выделения по соглашению могут возвращать данные в определённом типе, а могут возвращать данные в одном из нескольких типов, в зависимости от того, что удобнее для владельца выделения; последний тип цели выделения называется полиморфной целью. В ответ на запрос цель выделения также может не возвращать никаких данных, после чего владелец выделения выполняет некоторое действие как побочный эффект. Цели, на которые отвечают таким образом, называются целями с побочным эффектом.

Вот некоторые цели выделения, поведение которых в целом соответствует стандарту при запросе из выделений CLIPBOARD, PRIMARY или SECONDARY.

ADOBE_PORTABLE_DOCUMENT_FORMAT

Эта цель возвращает данные в формате “Portable Document Format” компании Adobe Systems в виде строки.

APPLE_PICT

Эта цель возвращает данные в формате изображений “PICT”, используемом на компьютерах Macintosh, в виде строки.

BACKGROUND
BITMAP
COLORMAP
FOREGROUND

Вместе эти четыре цели возвращают целочисленные данные, необходимые для использования растрового изображения, хранящегося на X-сервере: значение пикселя цвета фона растрового изображения, X-идентификатор растрового изображения, цветовую карту, в которой выделены фон и передний план, и значение пикселя цвета переднего плана растрового изображения.

CHARACTER_POSITION

Эта цель возвращает два беззнаковых 32-битных целых числа типа SPAN, описывающих начальную и конечную позиции данных выделения в текстовом поле, содержащем их, в байтах.

COMPOUND_TEXT

Эта цель возвращает строку типа COMPOUND_TEXT в многобайтовой системе кодирования текста консорциума X.

DELETE

Эта цель ничего не возвращает, но в качестве побочного эффекта удаляет содержимое выделения из любого текстового поля, содержащего его.

DRAWABLE
PIXMAP

Эта цель возвращает список беззнаковых 32-битных целых чисел, каждое из которых соответствует X-серверному объекту для рисования или пиксельной карте.

ENCAPSULATED_POSTSCRIPT
_ADOBE_EPS

Эта цель возвращает строку, содержащую инкапсулированный код Postscript.

FILE_NAME

Эта цель возвращает строку, содержащую одно или несколько имён файлов, разделённых символами NULL.

HOST_NAME

Эта цель возвращает строку, содержащую полное доменное имя машины, на которой работает владелец выделения.

USER

Эта цель возвращает строку, содержащую имя пользователя машины, на которой работает владелец выделения.

LENGTH

Эта цель возвращает беззнаковое 32-битное или 16-битное целое число, содержащее длину данных выделения.

LINE_NUMBER

Эта цель возвращает два беззнаковых 32-битных целых числа типа SPAN, описывающих номера строк, соответствующих начальной и конечной позициям данных выделения в текстовом поле, содержащем их.

MODULE

Эта цель возвращает имя любой функции, содержащей данные выделения. Её запрашивают в основном текстовые редакторы.

STRING

Эта цель возвращает данные выделения в виде строки типа STRING, закодированной в формате ISO Latin-1, с символами новой строки Unix.

C_STRING

Эта цель возвращает данные выделения в виде “C-строки”. Это интерпретировалось как необработанные данные выделения в любой кодировке, используемой владельцем, либо завершённые нулевым байтом, либо нет, либо ASCII-строка, которая может быть завершена, а может и нет.

UTF8_STRING

Эта цель возвращает данные выделения в виде строки типа UTF8_STRING, закодированной в UTF-8, с неопределённым форматом окончания строк.

TIMESTAMP

Эта цель возвращает время X-сервера, когда владелец выделения вступил во владение выделением, в виде 16-битного или 32-битного слова типа CARDINAL.

TEXT

Эта полиморфная цель возвращает данные выделения в виде строки — либо COMPOUND_TEXT, STRING, C_STRING, либо UTF8_STRING, в зависимости от того, какой тип данных удобен для владельца выделения.

Когда запрос на цели STRING, COMPOUND_TEXT или UTF8_STRING выполняется с использованием функции gui-get-selection, и ни selection-coding-system, ни next-selection-coding-system не установлены, результирующие строки декодируются соответствующими кодировками для этих целей: iso-8859-1, compound-text-with-extensions и utf-8 соответственно.

В дополнение к указанным выше целям (и многим другим целям, используемым различными программами для своих собственных нужд), несколько популярных программ и наборов инструментов определили свои собственные типы данных выделения, не обращаясь к соответствующим органам по стандартизации X. Эти цели обычно называются по аналогии с такими MIME-типами, как text/html или image/jpeg; известно, что они возвращают следующие формы данных:

Эти цели выделения впервые были использованы Netscape, но теперь предлагаются всеми видами программ, особенно основанными на последних версиях наборов инструментов GTK+ или Qt.

Emacs также способен выступать в роли владельца выделения. Когда вызывается gui-set-selection, предоставленные данные выделения записываются внутренне, и Emacs получает право собственности на устанавливаемое выделение.

Переменная: selection-converter-alist

Список соответствий целей выделения функциям “преобразователя выделения”. Когда получен запрос выделения, Emacs ищет преобразователь выделения, относящийся к запрошенной цели выделения.

Преобразователи выделения вызываются с тремя аргументами: символ, соответствующий атому, идентифицирующему запрашиваемое выделение; запрашиваемая цель выделения; и значение, установленное с помощью gui-set-selection. Возвращаемые ими значения должны быть либо cons-ячейками из символов, обозначающих тип данных, и чисел, символов, векторов чисел или символов, либо cdr таких cons-ячеек сами по себе.

Если значение преобразователя выделения является специальным символом NULL, тип данных, возвращаемый запросчику, устанавливается в NULL, и данные в ответ не отправляются.

Если такое значение является строкой, это должна быть однобайтовая строка; если тип данных явно не указан, данные передаются запросчику с типом STRING.

Если это символ, извлекается его “атом”, и он передаётся запросчику как 32-битное значение — если тип данных не указан, его типом является ATOM.

Если это число от -32769 до 32768, оно передаётся запросчику как 16-битное значение — если тип данных не указан, его типом является INTEGER.

Если это любое другое число, оно считается 32-битным значением. Даже если возвращаемое число беззнаковое, запросчик будет обрабатывать слова типа INTEGER как знаковые. Чтобы вернуть беззнаковое значение, укажите вместо этого тип CARDINAL.

Если это вектор символов или чисел, ответ запросчику будет списком из нескольких атомов или чисел. Тип данных, возвращаемый, если он явно не задан, соответствует типу первого элемента списка.

По умолчанию Emacs настроен с преобразователями выделения для следующих целей выделения:

TEXT

Этот преобразователь выделения возвращает данные выделения в виде:

  • Строки типа C_STRING, если содержимое выделения не содержит многобайтовых символов или содержит “сырые 8-битные байты” (см. Текстовые представления).
  • Строки типа STRING, если содержимое выделения может быть представлено как текст ISO-Latin-1.
  • Строки типа COMPOUND_TEXT, если содержимое выделения может быть закодировано в составной текстовой кодировке консорциума X, а selection-coding-system или next-selection-coding-system установлены в кодировку, свойство :mime-charset которой равно x-ctext.
  • Строки типа UTF8_STRING в противном случае.
COMPOUND_TEXT

Этот преобразователь выделения возвращает данные выделения в виде строки типа COMPOUND_TEXT.

STRING

Этот преобразователь выделения возвращает данные выделения в виде строки типа STRING, закодированной в формате ISO-Latin-1.

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.

MULTIPLE

Этот преобразователь выделения реализован в коде C и используется для эффективной передачи запросов выделения, которые одновременно указывают несколько целей выделения.

LENGTH

Этот преобразователь выделения возвращает длину данных выделения в байтах.

DELETE

Этот преобразователь выделения используется для внутренних целей во время операций перетаскивания.

FILE_NAME

Этот преобразователь выделения возвращает имя файла буфера, содержащего данные выделения.

CHARACTER_POSITION

Этот преобразователь выделения возвращает символьные позиции каждого конца выделения в буфере, содержащем данные выделения.

LINE_NUMBER
COLUMN_NUMBER

Этот преобразователь выделения возвращает номера строк и столбцов каждого конца выделения в буфере, содержащем данные выделения.

OWNER_OS

Этот преобразователь выделения возвращает имя операционной системы, на которой работает Emacs.

HOST_NAME

Этот преобразователь выделения возвращает полное доменное имя машины, на которой работает Emacs.

USER

Этот преобразователь выделения возвращает имя пользователя учётной записи, под которой работает Emacs.

CLASS
NAME

Эти преобразователи выделения возвращают класс ресурсов и имя, используемые Emacs.

INTEGER

Этот преобразователь выделения возвращает целочисленное значение без изменений.

SAVE_TARGETS
_EMACS_INTERNAL

Эти преобразователи выделения используются для внутренних целей.

За исключением INTEGER, все преобразователи выделения ожидают, что данные, предоставленные gui-set-selection, будут одним из следующих: