Spec-Zone.ru › Elisp

Другие выделения

Выделения в таких оконных системах, как 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.

В Nextstep также доступны все три стандартных выделения X, но Emacs может сохранять в них только строки. Ограничения на вызовы gui-set-selection здесь во многом такие же, как в MS-Windows, хотя текст всегда кодируется как utf-8-unix независимо от значения selection-coding-system. Функция gui-get-selection менее строга и принимает запросы для следующих целей выделения:

  • text/plain
  • image/png
  • text/html
  • application/pdf
  • application/rtf
  • application/rtfd
  • STRING
  • text/plain
  • image/tiff

В Nextstep также присутствует выделение XdndSelection в виде хранилища, в котором записываются значения, переданные в 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 до единицы минус два в степени, равной размеру машинного слова компьютера, на котором запущен Emacs.

ssize_t

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

point

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

float
double

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

(haiku-numeric-enum MIME)

Однобайтовая строка, содержащая данные определённого типа MIME.

Вызов gui-get-selection обычно возвращает данные, указанные в сообщении выделения аргументом data-type, однако для одной из следующих целей выделения X аргумент data-type заменяется альтернативным именем:

STRING

В X это соответствует тексту в кодировке Latin-1: “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, они не кодируются и не декодируются с помощью какой-либо кодировки.

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/Other-Selections.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API