Выборки X
X не задаёт фиксированные типы данных для данных выборки или фиксированное число выборок. Выборки идентифицируются «атомами» X — уникальными 29-битными идентификаторами, которые сервер X назначает строковым именам. Эта сложность скрыта от Emacs: когда Lisp предоставляет символ, имя которого совпадает с именем атома, Emacs запрашивает соответствующие идентификаторы без дополнительного вмешательства.
Когда программа «устанавливает» выборку в X, она фактически становится её «владельцем»: сервер X будет передавать программе запросы выборки, а программа обязана ответить запрашивающему клиенту данными выборки.
Аналогично, программа не «получает» данные выборки от сервера X. Вместо этого её запросы выборки отправляются клиенту, окно которого последним заявило права на эту выборку; предполагается, что он ответит запрошенными данными.
Каждый запрос выборки включает три параметра:
- Окно, запросившее выборку и идентифицирующее запрашивающую программу, также называемую запрашивающей стороной.
- Атом, идентифицирующий целевой формат, в который владелец должен преобразовать выборку. Проще всего считать целевой формат преобразования типом данных, который нужен запрашивающей стороне: в запросах выборки, выполняемых Emacs, целевой формат определяется аргументом type функции
gui-get-selection. - 32-битная метка времени, представляющая время на сервере X, когда запрашивающая сторона в последний раз получила ввод; этот параметр не имеет отношения к коду Lisp, поскольку он предназначен только для содействия синхронизации между сервером X, владельцем и запрашивающей стороной.
Владелец выборки отвечает, передавая запрашивающей стороне последовательность байтов, 16-битных слов или 32-битных слов, а также другой атом, указывающий тип этих слов. После запроса выборки Emacs применяет собственную интерпретацию формата и типа данных, чтобы преобразовать данные, переданные владельцем выборки, в представление Lisp, которое возвращает gui-get-selection.
Данные выборки, состоящие из последовательности байтов любого размера, Emacs преобразует в однобайтную строку, содержащую эти байты; данные, состоящие из одного 16-битного или 32-битного слова, — в беззнаковое число; а данные, состоящие из нескольких таких слов, — в вектор беззнаковых чисел. Исключения из этого общего правила связаны с особой обработкой данных для следующих целевых форматов преобразования:
INTEGER-
16-битные или 32-битные слова этого типа рассматриваются как знаковые, а не беззнаковые целые числа. Если данные выборки содержат несколько слов, возвращается вектор; в противном случае возвращается само целое число.
ATOM-
32-битные слова этого типа рассматриваются как атомы X и возвращаются (по отдельности или в виде векторов) как символы Lisp, соответствующие обозначаемым ими именам. Недопустимые атомы заменяются на
nil. COMPOUND_TEXTUTF8_STRINGSTRINGВ однобайтные строки, полученные в результате запроса этих типов данных, будет помещено единственное текстовое свойство
foreign-selection, значение которого задаётся типом данных выборки.
Каждый владелец выборки должен возвращать как минимум два целевых формата: TARGETS, который возвращает набор атомов, описывающих поддерживаемые владельцем целевые форматы выборки, и MULTIPLE, используемый клиентами X для внутренних целей. Владелец выборки может поддерживать любое количество других целевых форматов: некоторые из них могут быть стандартизированы в руководстве по соглашениям межклиентского взаимодействия консорциума X, другие же, например UTF8_STRING, предполагалось стандартизировать в проекте XFree86, однако стандартизация так и не была завершена.
По соглашению запросы определённого целевого формата выборки могут возвращать данные конкретного типа или данные одного из нескольких типов — того, который удобнее владельцу выборки; такие целевые форматы выборки называют полиморфными целевыми форматами. В ответ на запрос целевой формат выборки также может вообще не возвращать данные, после чего владелец выборки выполняет какое-либо действие в качестве побочного эффекта. Такие целевые форматы, на запросы которых отправляется подобный ответ, называют целевыми форматами с побочным эффектом.
Ниже перечислены целевые форматы выборки, поведение которых, как правило, соответствует стандарту при запросе выборок CLIPBOARD, PRIMARY или SECONDARY.
ADOBE_PORTABLE_DOCUMENT_FORMAT-
Этот целевой формат возвращает данные в виде строки в формате Adobe Systems «Portable Document Format».
APPLE_PICT-
Этот целевой формат возвращает данные в виде строки в графическом формате «PICT», используемом на компьютерах Macintosh.
BACKGROUNDBITMAPCOLORMAPFOREGROUND-
В совокупности эти четыре целевых формата возвращают целочисленные данные, необходимые для использования растрового изображения, хранящегося на сервере X: значение пикселя фонового цвета растрового изображения, идентификатор X растрового изображения, цветовую карту, в которой выделены фоновый цвет и цвет переднего плана, и значение пикселя цвета переднего плана растрового изображения.
CHARACTER_POSITION-
Этот целевой формат возвращает два беззнаковых 32-битных целых числа типа
SPAN, описывающих начальную и конечную позиции данных выборки в содержащем их текстовом поле, в байтах. COMPOUND_TEXT-
Этот целевой формат возвращает строку типа
COMPOUND_TEXTв многобайтовой системе кодирования текста консорциума X. DELETE-
Этот целевой формат ничего не возвращает, но в качестве побочного эффекта удаляет содержимое выборки из любого текстового поля, в котором оно находится.
DRAWABLEPIXMAP-
Этот целевой формат возвращает список беззнаковых 32-битных целых чисел, каждое из которых соответствует рисуемому объекту или пиксмапе сервера X.
ENCAPSULATED_POSTSCRIPT_ADOBE_EPS-
Этот целевой формат возвращает строку, содержащую инкапсулированный код PostScript.
FILE_NAME-
Этот целевой формат возвращает строку, содержащую одно или несколько имён файлов, разделённых нулевыми символами.
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; известно, что они возвращают данные следующих видов:
- Имена файлов изображений или текстовых файлов без завершающего символа, с завершающим символом новой строки или с завершающим нулевым символом.
- Данные изображения или текста в соответствующем формате.
-
URI
file://(или, возможно, списки URI, завершающиеся символом новой строки или нулевым символом), идентифицирующие файлы соответствующего формата.
Эти целевые форматы выборки впервые использовались в Netscape, но теперь их предлагают самые разные программы, особенно основанные на новых версиях наборов инструментов GTK+ или Qt.
Emacs также может выступать владельцем выборки. При вызове gui-set-selection предоставленные данные выборки сохраняются внутри Emacs, и Emacs получает права на устанавливаемую выборку.
- Переменная: selection-converter-alist
-
Список ассоциаций целевых форматов выборки с функциями «преобразования выборки». Получив запрос выборки, Emacs ищет функцию преобразования выборки, соответствующую запрошенному целевому формату.
Функции преобразования выборки вызываются с тремя аргументами: символом, соответствующим атому, идентифицирующему запрошенную выборку; запрошенным целевым форматом выборки; и значением, заданным с помощью
gui-set-selection. Они должны возвращать либо пары cons, состоящие из символов, обозначающих тип данных, и чисел, символов или векторов чисел либо символов, либо сами cdr таких пар.Если функция преобразования выборки возвращает специальный символ
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/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.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/X-Selections.html