Другие выделения
Выделения в таких оконных системах, как 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-битное целочисленное значение.
bytechar-
Беззнаковый байт от 0 до 255.
size_t-
Число от 0 до единицы минус два в степени, равной размеру машинного слова компьютера, на котором запущен Emacs.
ssize_t-
Число, помещающееся в тип C
ssize_t. point-
Конс из двух чисел с плавающей точкой, задающих координату на экране.
floatdouble-
Число с плавающей точкой одинарной или двойной точности в формате, который не указан.
(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