30.22.2 Прочие выделения

Выделения в таких оконных системах, как 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 вызывается для первых трёх выделений, переданные данные преобразуются в «сообщение» оконного сервера с помощью списка функций кодировщиков выделения, которое отправляется оконному серверу.

Переменная: haiku-normal-selection-encoders

Список функций кодировщиков выделения. При вызове gui-set-selection каждая функция из этого списка последовательно вызывается с аргументами selection и value. Если такая функция возвращает не nil, её возвращаемое значение должно быть списком вида (key type value). В этом списке key должно быть именем передаваемых данных, обычно именем MIME-типа, например ‘"text/plain"’, а type — это символ или число, обозначающее тип данных; оно также определяет интерпретацию value; далее приведён список допустимых типов данных и того, как каждый из них влияет на интерпретацию value.

string

Однобайтовая строка. Строка завершается нулевым символом после помещения в сообщение.

ref

Имя файла. Файл находится, и идентификатор inode, идентифицирующий файл, помещается в сообщение.

short

16-битное целое значение.

long

32-битное целое значение.

llong

64-битное целое значение.

byte
char

Беззнаковый байт от 0 до 255.

size_t

Число от 0 до 1 минус два в степени размера слова компьютера, на котором работает Emacs.

ssize_t

Число, помещающееся в тип C ssize_t.

point

Пара из двух чисел с плавающей запятой, задающая координаты на экране.

float
double

Число с плавающей запятой одинарной или двойной точности в неуказанном формате.

(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, они не подвергаются кодированию или декодированию какой-либо системой кодировки.