Выбор окна X
Выделение , вырезание буферов и перетаскивание — это механизмы, используемые в системе X Window, позволяющие пользователю переносить данные из одного окна в другое. Выделение и буфер обрезки обычно используются, когда пользователь выбирает текст или некоторые другие данные в окне и вставляет их в другое. Перетаскивание используется, когда пользователь выбирает что-то в окне, затем щелкает выделение и перетаскивает его в другое окно.
Поскольку два окна могут обрабатываться двумя разными приложениями, эти механизмы требуют двух разных клиентов, подключенных к одному и тому же X-серверу, для обмена данными. включает Базовый протокол X Window System в себя некоторые запросы и события, специфичные для обмена выборками, но передача в основном осуществляется с использованием отправки событий и свойств окна, которые не являются специфичными для передачи выбора.
Могут передаваться разные типы данных: обычно это текст, но также может быть изображение, число, список объектов и т. д. Далее рассматривается только текст.
Активный и пассивный выбор
[ редактировать ]Способы передачи данных можно разделить на активные и пассивные, в зависимости от того, должен ли клиент, обрабатывающий выбранные данные, активно участвовать в передаче запрашивающему их клиенту:
- Пассивный
- Когда какие-то данные выбраны, клиент, обрабатывающий окно, в котором осуществляется этот выбор, переносит их куда-то, и ему больше не нужно об этом заботиться;
- Активный
- Передача данных клиенту требует, чтобы клиент «держал» выбор для активного участия в обмене.
Выбор и перетаскивание являются активными механизмами: после того, как в окне выделен некоторый текст, клиент, обрабатывающий окно, должен активно поддерживать протокол для передачи данных запрашивающему его приложению. Напротив, вырезанные буферы представляют собой пассивный механизм: после выделения некоторого текста он передается в вырезанный буфер и остается там, даже если приложение, обрабатывающее окно, завершается и окно уничтожается. Буфер обмена X — это пассивный механизм, как он воспринимается клиентом, удерживающим выделение, но требует xclipboard
клиент для активной поддержки любой последующей передачи данных.
Преимущество активных механизмов заключается в том, что данные перед передачей можно преобразовать в другой формат. В частности, клиент, получающий данные, может запросить преобразование данных выбора в подходящую форму. Если клиент-отправитель отказывается это сделать, получатель может запросить другой формат. Например, часть HTML- кода рендеринга текста может быть передана как текст запрашивающей стороне, которая может обрабатывать только текст, но также может быть передана как HTML-код, если запрашивающая сторона может его обработать. Такое согласование формата не может быть выполнено с помощью пассивных механизмов, в которых клиент, удерживающий выборку (и дающий ей семантику), передает выборку и не участвует в дальнейшей передаче клиенту, запрашивающему ее.
Еще одним преимуществом активных механизмов является то, что большие объемы данных можно передавать последовательно, а не по одному. Пассивные механизмы вместо этого требуют, чтобы все данные были переданы куда-то от владельца выбора, а затем снова переданы клиенту, запрашивающему их.
Преимущество пассивных механизмов заключается в том, что передачу можно выполнить даже после завершения работы клиента, хранящего данные. Это невозможно в активных механизмах, которые требуют от клиента, хранящего данные, активного участия в передаче.
Выбор
[ редактировать ]Система X Window поддерживает произвольное количество вариантов выбора; каждый выбор идентифицируется строкой (точнее, atom
). Наиболее часто используемым выбором является PRIMARY
выбор.
Следующие запросы относятся только к передаче выбора, хотя передача также включает в себя и другие запросы:
- запросить информацию о том, какому окну принадлежит выделенный фрагмент
- запрос на установку окна, которому принадлежит выделение
- запрос на преобразование выделения
Владельцем выделения обычно является окно, в котором находится выделенный текст, если таковой имеется. Когда пользователь выделяет некоторый текст в окне, клиент, обрабатывающий окно, должен сообщить серверу, что окно является владельцем выделения.
Когда пользователь пытается вставить выделенный фрагмент в другое окно, обработчик этого окна инициирует протокол для получения выделенного текста от другого клиента. Этот протокол включает в себя второй и третий запросы из приведенного выше списка и не указан в протоколе X, а является соглашением в Руководстве по соглашению между клиентами (ICCCM).
В частности, целевой клиент начинает с запроса сервера, какому окну принадлежит выбор. Затем два клиента передают выбор через сервер. Этот обмен включает в себя свойство окна и произвольный фрагмент данных, прикрепленный к окну. Если содержимое выделенного фрагмента считается достаточно небольшим, чтобы его можно было передать сразу, необходимо выполнить следующие шаги:
- получатель выделения запрашивает преобразование выделения, указывая свойство окна (это может быть окно, в которое необходимо вставить текст)
- в ответ сервер отправляет текущему владельцу выборки
SelectionRequest
событие; - владелец помещает выделенный текст в свойство окна, указанное запрашивающим, отправив
ChangeProperty
; запрос на сервер - владелец отправляет запрос на сервер, чтобы отправить запрашивающей стороне
SelectionNotify
чтобы уведомить о том, что выбор был перенесен - запрашивающий теперь может прочитать выбор в свойстве окна, отправив один или несколько
GetProperty
запросы к серверу; - запрашивающий уничтожает имущество; если владелец запросил его проинформировать об этом, ему отправляется
PropertyNotify
событие.
Если контент большой, его следует передавать частями. В этом случае оба клиента выражают заинтересованность в PropertyNotify
события: таким образом, владелец выделения знает, когда выделение было прочитано, а запрашивающая сторона знает, когда в свойство был помещен другой фрагмент.
Расширение XFixes позволяет клиентам прослушивать изменения выбора. [1]
Буфер обмена
[ редактировать ]Наиболее часто используемым выбором является PRIMARY
выбор и используется, когда пользователь выбирает некоторые данные. CLIPBOARD
выбор используется, когда пользователь выбирает некоторые данные и явно запрашивает их «копирование» в буфер обмена, например, вызывая «Копировать» в меню «Редактировать» приложения. Связанный запрос «Вставить» приводит к получению данных CLIPBOARD
используемый выбор.
На уровне основного протокола PRIMARY
и CLIPBOARD
выбор не отличается. Но xclipboard
клиент заставляет их вести себя по-другому. В частности, когда другой клиент заявляет о своем праве на CLIPBOARD
выбора, эта программа запрашивает и отображает его в окне. Любые дальнейшие запросы на этот выбор обрабатываются xclipboard
. Таким образом, содержимое выделенного фрагмента сохраняется даже после того, как клиент его скопировал.
Вырезать буферы
[ редактировать ]Вырезанные буферы — это еще один механизм передачи данных, в частности выделенного текста. Это свойства корневого окна , называемые CUT_BUFFER1
и т. д. В отличие от выборок, обрезанные буферы не предполагают прямого взаимодействия между клиентами. Вместо этого, когда в окне выделяется текст, владелец окна копирует этот текст в свойство корневого окна, называемое CUT_BUFFER1
. Когда пользователь вставляет текст в другое окно, владелец окна считывает это свойство корневого окна.
The xcutsel
программа передает данные между выборками и буферами вырезок, а xcb
Программа допускает различные виды доступа к вырезанным буферам.
Вырезанные буферы считаются устаревшими. [2]
XDND
[ редактировать ]Перетаскивание в системе X Window регулируется соглашением Xdnd. [3] Когда пользователь перетаскивает выделенный текст в окно и отпускает кнопку мыши, обмен данными происходит так же, как и при первичном выборе. Перетаскивание усложняется тем, что происходит во время перетаскивания. А именно, когда пользователь перетаскивает выделенный фрагмент в разные части рабочего стола или окна, он ожидает, что сможет определить, можно ли удалить текст или нет. В частности, цель должна отображать визуальную информацию о том, примет ли она сброс или нет, а курсор должен измениться, чтобы указать действие, которое будет предпринято; например, скопировать или переместить.
В протоколе Xdnd окно, в котором выделяется текст и начинается перетаскивание, называется источником ; окно, над которым находится курсор, называется целью . Связь между источником и целью осуществляется источником, поскольку источник «захватывает» курсор. Поэтому обмен между источником и целью необходим для того, чтобы цель даже знала, что происходит перетаскивание. Поскольку источник определяет форму курсора, источник должен получить ответ от цели, чтобы обновить курсор. Кроме того, поскольку цели может потребоваться нарисовать бомбовый прицел, чтобы указать, где произойдет сброс, и поскольку принятие сброса может зависеть от точного местоположения курсора, этот обмен должен происходить неоднократно по мере перемещения курсора. Фактически, даже если курсор не перемещается, необходимо обмениваться сообщениями, чтобы позволить цели прокручиваться, когда курсор находится рядом с краем области просмотра. В противном случае пользователь сможет падать только на видимую часть цели.
Программа может указать, что окно может быть целью перетаскивания, создав свойство с именем XdndAware
который содержит самую высокую версию протокола, поддерживаемую программой. Таким образом, приложения, поддерживающие более новые версии, могут вернуться к более старым версиям для корректного взаимодействия. Кроме того, будут игнорироваться все приложения, написанные без поддержки Xdnd.
Когда курсор попадает в целевое окно, источник проверяет наличие XdndAware
недвижимость в этом окне. Если это свойство присутствует, начинается обмен:
- источник сообщает цели, что курсор вошел в цель при перетаскивании некоторых данных, отправляя событие
XdndEnter
- цель может узнать, какой тип данных перетаскивается (текст, изображение и т. д.), просматривая это событие и, возможно, путем дальнейшего взаимодействия с источником
Пока курсор находится внутри целевого окна:
- источник отправляет
XdndPosition
события, чтобы сообщить цели, где в данный момент находится курсор - цель отвечает
XdndStatus
события, чтобы сообщить источнику, можно ли переместить данные в текущую позицию - источник отправляет сообщение
XdndLeave
илиXdndDrop
когда курсор покинул окно или была отпущена кнопка соответственно
Если пользователь отключается, цель запрашивает выбор из источника, как обычно. Когда передача выбора завершена, цель отправляет XdndFinish
событие, чтобы сообщить источнику, что передача прошла успешно.
Таким образом, протокол управляется источником, который информирует цель о том, что происходит с курсором. В ответ цель сообщает источнику, будет ли принят сброс или нет. Цель также должна быть проинформирована, когда пользователь отпускает кнопку мыши, поскольку это событие запускает регулярный запрос выбора, который представляет собой протокол, управляемый целью.
Выше приведено описание соглашения Xdnd для перетаскивания. В Motif, OffiX и Amulet используются разные соглашения о перетаскивании.
XDS
[ редактировать ]Протокол прямого сохранения , сокращенно XDS (от X Window Direct Save файлов Protocol), представляет собой программный протокол , который поддерживает сохранение путем перетаскивания их в файлового менеджера окна . XDS построен на основе протокола XDND . [4] [5]
Программы
[ редактировать ]Следующие программы специально работают с механизмами передачи данных:
- xcutsel передает данные из выделенных фрагментов в буферы вырезания или наоборот
- xclipboard, glipper ( Gnome ), парцеллит ( LXDE ) и klipper ( KDE ) — менеджеры буфера обмена , возможно, также wmcliphist
- xcb показывает содержимое вырезанных буферов и позволяет пользователю манипулировать ими.
- xselection , xclip , xsel и xcopy — это программы командной строки, которые копируют данные в выделение X или из него. В xcopy есть опция детализации, которая помогает отлаживать проблемы с выбором X. Parcellite также имеет возможность читать и записывать определенные элементы X из командной строки.
- Synergy — это кроссплатформенный инструмент, позволяющий использовать буфер обмена на нескольких компьютерах под управлением нескольких операционных систем.
- xfce4-clipman-plugin — это «плагин истории буфера обмена для панели Xfce4», а также менеджер буфера обмена.
- xtranslate ищет слова в Xselection в многоязычном словаре
- autocutsel синхронизирует буфер обрезки и буфер выбора
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «c - X11 Ожидание и получение текста из буфера обмена» . Переполнение стека . Проверено 27 июля 2021 г.
- ^ Завински, JW (2002). Выбор X, вырезание буферов и кольца уничтожения. Получено 13 июля 2010 г. с http://www.jwz.org/doc/x-cut-and-paste.html .
- ^ Протокол перетаскивания для системы X Window, с http://johnlindal.wix.com/xdnd
- ^ Линдал, Джон. «Сохранение файлов с помощью перетаскивания: протокол прямого сохранения для системы X Window» . Архивировано из оригинала 5 марта 2016 года.
- ^ «Сохранение файлов с помощью перетаскивания: протокол прямого сохранения для системы X Window» . сайт freedesktop.org . Архивировано из оригинала 22 марта 2015 года.