Выделения в таких оконных системах, как MS-Windows, Nextstep, Haiku
и Android, не соответствуют выделениям в X. Каждая из этих оконных
систем использует собственный механизм выделения, не применяя
механизм «преобразователей выделения», описанный в предыдущем разделе.
Обычно поддерживаются только выделения PRIMARY, CLIPBOARD
и SECONDARY, при этом в Nextstep и Haiku также доступно
выделение XdndSelection, которое хранит данные перетаскивания.
GTK пытается эмулировать систему выделений X, но её эмуляция не всегда надёжна, а общее качество зависит от используемого бэкенда GDK. Поэтому Emacs, собранный с PGTK, предоставляет тот же интерфейс выделений, что и Emacs, собранный с X, однако многие цели выделения будут бесполезны.
Хотя буфер обмена существует, в операционной системе MS-Windows нет понятия первичного или вторичного выделения. В этой системе Emacs имитирует наличие первичного и вторичного выделений, сохраняя в буфер обмена и извлекая из него данные по запросу.
Имитация первичного и вторичного выделений выполняется путём
сохранения значений, переданных в gui-set-selection, в свойстве
x-selections символа, обозначающего соответствующее выделение,
а именно аргумента type для gui-get-selection.
Каждый последующий вызов gui-get-selection возвращает это
значение без дополнительной проверки (например, проверки типа и т. п.).
В таких обстоятельствах аргумент data-type обычно игнорируется.
(Но см. ниже уточнение относительно TARGETS.)
Что касается выделения буфера обмена (когда type равен
CLIPBOARD), gui-set-selection проверяет, что переданное
значение является строкой, и сохраняет его в системном буфере обмена
после кодирования системой кодировки, заданной в
selection-coding-system. Вызывающие gui-get-selection
обязаны устанавливать data-type в STRING или
TARGETS.
Когда в вызове gui-get-selection data-type установлен в
TARGETS, при наличии данных выделения возвращается вектор
символов, как и в X. Запросить данные буфера обмена в каком-либо
формате, кроме STRING, невозможно, поскольку необходимые
подпрограммы преобразования данных отсутствуют. Как строки,
сохраняемые в буфер обмена, кодируются с помощью
selection-coding-system, так и читаемые из буфера обмена
декодируются той же системой кодировки; этой переменной и её
родственнице next-selection-coding-system стоит уделить особое
внимание при возникновении проблем с сохранением текста выделения в
буфер обмена.
Все три стандартных в X выделения существуют и в Nextstep, но Emacs
способен сохранять в такие выделения только строки. Ограничения,
налагаемые на вызовы gui-set-selection там, во многом схожи с
ограничениями в MS-Windows, хотя текст единообразно кодируется как
utf-8-unix независимо от значения
selection-coding-system. gui-get-selection более
благосклонен и принимает запросы для следующих целей выделения:
Выделение XdndSelection также присутствует в Nextstep
в виде хранилища, которое записывает значения, переданные в
gui-set-selection. Его единственная цель — сохранять такие
значения для фундаментальной функции перетаскивания
x-begin-drag (см. Перетаскивание); никаких гарантий
относительно его значения при чтении чем-либо иным не даётся.
Выделения в системах Haiku включают все три выделения, принятые в X,
и XdndSelection, которое хранит данные перетаскивания.
Когда gui-set-selection вызывается для первых трёх выделений,
переданные данные преобразуются в «сообщение» оконного сервера
с помощью списка функций кодировщиков выделения, которое
отправляется оконному серверу.
Список функций кодировщиков выделения. При вызове
gui-set-selection каждая функция из этого списка последовательно
вызывается с аргументами selection и value. Если такая
функция возвращает не nil, её возвращаемое значение должно быть
списком вида (key type value). В этом
списке key должно быть именем передаваемых данных, обычно
именем MIME-типа, например ‘"text/plain"’, а type —
это символ или число, обозначающее тип данных; оно также определяет
интерпретацию value; далее приведён список допустимых типов
данных и того, как каждый из них влияет на интерпретацию value.
stringОднобайтовая строка. Строка завершается нулевым символом после помещения в сообщение.
refИмя файла. Файл находится, и идентификатор inode, идентифицирующий файл, помещается в сообщение.
short16-битное целое значение.
long32-битное целое значение.
llong64-битное целое значение.
bytecharБеззнаковый байт от 0 до 255.
size_tЧисло от 0 до 1 минус два в степени размера слова компьютера, на котором работает Emacs.
ssize_tЧисло, помещающееся в тип C ssize_t.
pointПара из двух чисел с плавающей запятой, задающая координаты на экране.
floatdoubleЧисло с плавающей запятой одинарной или двойной точности в неуказанном формате.
(haiku-numeric-enum MIME)Однобайтовая строка, содержащая данные определённого MIME-типа.
Вызов gui-get-selection обычно возвращает данные,
названные data-type, внутри сообщения выделения, хотя
data-type заменяется альтернативным именем, если оно является
одной из следующих целей выделения X:
STRINGПредставляет текст Latin-1 в X: “text/plain;charset=iso-8859-1”
UTF8_STRINGПредставляет текст UTF-8: “text/plain”
Если data-type является текстовым типом, таким как
STRING, или MIME-типом, соответствующим шаблону ‘`text/*’,
строковые данные перед возвратом декодируются с помощью
соответствующей системы кодировки.
Кроме того, два типа данных TIMESTAMP и TARGETS
получают особую обработку; значение, возвращаемое для первого, — это
количество изменений выделения с момента запуска системы (не
временная метка), а для второго — вектор доступных типов данных
выделения, как и в других местах.
Во многом подобно MS-Windows, Android предоставляет буфер обмена, но
не имеет первичного или вторичного выделения; gui-set-selection
имитирует первичное и вторичное выделения, сохраняя переданное
значение в переменной, чтобы последующие вызовы
gui-get-selection возвращали его.
Из буфера обмена gui-get-selection способен возвращать
строковые данные UTF-8 типа STRING, тип данных
TARGETS, а также данные изображений и приложений любого
MIME-типа. gui-set-selection устанавливает только строковые
данные, как и в MS-Windows, хотя на эти данные не влияет значение
selection-coding-system. Напротив, в первичное и вторичное
выделения можно сохранять и извлекать только строковые данные; но
поскольку эти данные не передаются программам, кроме Emacs, они не
подвергаются кодированию или декодированию какой-либо системой
кодировки.