Выбор X Window - X Window selection

Выборы, вырезать буферы, и перетаскивание механизмы, используемые в X Window System позволить Пользователь передавать данные с одного окно другому. Выборы и вырезать буфер обычно используются, когда пользователь выбирает текст или некоторые другие данные в одном окне и вставляет в другое. Drag-and-drop используется, когда пользователь выбирает что-то в окне, затем щелкает по выбранному элементу и перетаскивает его в другое окно.

Поскольку два окна могут обрабатываться двумя разными приложениями, эти механизмы требуют, чтобы два разных клиента были подключены к одному и тому же X-серверу для обмена данными. В Основной протокол X Window System включает некоторые запросы и события, относящиеся к обмену выбором, но передача в основном выполняется с использованием отправки событий и свойств окна, которые не относятся к передаче выбора.

Могут передаваться различные типы данных: обычно это текст, но также может быть изображение, число, список объектов и т. Д. Далее рассматривается только текст.

Активный и пассивный выбор

Способы передачи данных можно разделить на активные и пассивные, в зависимости от того, должен ли клиент, обрабатывающий выбранные данные, активно участвовать в передаче запрашивающему его клиенту:

Пассивный
когда некоторые данные выбраны, клиент, обрабатывающий окно, в котором сделан этот выбор, передает их куда-то, и ему больше не нужно об этом заботиться;
Активный
передача данных клиенту требует, чтобы клиент «удерживал» выбор, чтобы активно участвовать в обмене.

Выделение и перетаскивание являются активными механизмами: после того, как в окне выделен некоторый текст, клиент, обрабатывающий окно, должен активно поддерживать протокол для передачи данных в приложение, запрашивающее его. Напротив, буферы вырезания - это пассивный механизм: после выбора некоторого текста он передается в буфер вырезания и остается там, даже если приложение, обрабатывающее окно, завершает свою работу и окно уничтожается. Буфер обмена X - это пассивный механизм, который воспринимается клиентом, удерживающим выделение, но требует xclipboard клиент активно поддерживает любую последующую передачу данных.

Преимущество активных механизмов состоит в том, что данные можно преобразовать в другой формат перед передачей. В частности, клиент, получающий данные, может запросить преобразование данных выбора в подходящую форму. Если отправляющий клиент отказывается сделать это, получатель может запросить другой формат. Например, рендеринг фрагмента текста HTML код может быть передан как текст запрашивающей стороне, которая может обрабатывать только текст, но также может быть передана как HTML-код, если запрашивающая сторона может обработать его. Такое согласование формата не может быть выполнено с помощью пассивных механизмов, в которых клиент, удерживающий выбор (и передающий ему семантику), передает выбор и не участвует в дальнейшей передаче клиенту, запрашивающему его.

Еще одно преимущество активных механизмов состоит в том, что большие фрагменты данных могут передаваться в виде последовательности передач, а не одной. Вместо этого пассивные механизмы требуют, чтобы все данные были куда-то переданы от владельца выбора, а затем снова переданы клиенту, запрашивающему их.

Преимущество пассивных механизмов заключается в том, что передача может выполняться даже после завершения работы клиента, хранящего данные. Это невозможно в активных механизмах, которые требуют, чтобы клиент, хранящий данные, активно участвовал в передаче.

Выборы

Система X Window поддерживает произвольное количество вариантов выбора; каждый выбор идентифицируется строкой (точнее, атом). Наиболее часто используемый выбор - это НАЧАЛЬНЫЙ выбор.

Следующие запросы относятся к передаче выбора, хотя передача также включает другие запросы:

  1. запрос, чтобы узнать, в каком окне находится выбор
  2. запрос на установку окна, которому принадлежит выбор
  3. запрос на преобразование выборки

Владельцем выделения обычно является окно, в котором расположен выделенный текст, если таковой имеется. Когда пользователь выбирает текст в окне, клиент, обрабатывающий окно, должен сообщить серверу, что окно является владельцем выбора.

Когда пользователь пытается вставить выделенный фрагмент в другое окно, обработчик этого окна запускает протокол для получения выделенного текста от другого клиента. Этот протокол включает в себя второй и третий запросы из приведенного выше списка и не определяется протоколом X, а является соглашением в Руководство по соглашению о межклиентской коммуникации (ICCCM).

В частности, целевой клиент начинает с того, что спрашивает сервер, какое окно владеет выбором. Затем два клиента передают выбор через сервер. Этот обмен включает свойство окна и произвольный фрагмент данных, прикрепленный к окну. Если содержание выделенного фрагмента считается достаточно маленьким, чтобы его можно было передать сразу, выполняются следующие шаги:

  1. получатель выбора запрашивает преобразование выделения, указывая свойство окна (это может быть окно, в которое должен быть вставлен текст)
  2. в ответ сервер отправляет текущему владельцу выборки SelectionRequest мероприятие;
  3. владелец помещает выделенный текст в свойство окна, указанное отправителем запроса, отправив ChangeProperty; запрос к серверу
  4. владелец отправляет запрос на сервер для отправки запрашивающей стороне SelectionNotify чтобы уведомить, что выбор был перенесен
  5. запрашивающая сторона теперь может прочитать выбор в свойстве окна, отправив один или несколько GetProperty запросы к серверу;
  6. заявитель уничтожает имущество; если владелец попросил сообщить об этом, ему отправляется PropertyNotify мероприятие.

Если контент большой, его следует передавать кусками. В этом случае оба клиента проявляют интерес к PropertyNotify события: таким образом, владелец выборки знает, когда выборка была прочитана, а запрашивающая сторона знает, когда в свойство был помещен другой фрагмент.

Буфер обмена

Наиболее часто используемый выбор - это НАЧАЛЬНЫЙ selection и используется, когда пользователь выбирает некоторые данные. В ДОСКА ОБЪЕКТОВ selection используется, когда пользователь выбирает некоторые данные и явно запрашивает их «скопировать» в буфер обмена, например, вызывая «Копировать» в меню «Правка» приложения. Связанный запрос «Вставить» приводит к данным ДОСКА ОБЪЕКТОВ выделение используется.

На уровне основного протокола НАЧАЛЬНЫЙ и ДОСКА ОБЪЕКТОВ выбор не отличается. Но xclipboard клиент заставляет их вести себя иначе. В частности, когда другой клиент заявляет о праве собственности на ДОСКА ОБЪЕКТОВ выбор, эта программа запрашивает и отображает его в окне. Любые дальнейшие запросы на этот выбор обрабатываются xclipboard. Таким образом, содержимое выделения сохраняется у клиента, скопировавшего его.

Вырезать буферы

Вырезать буферы - еще один механизм для передачи данных, в частности выделенного текста. Они есть свойства окна из корневое окно, названный CUT_BUFFER1и т.д. В отличие от выбора, буферы вырезания не предполагают прямого взаимодействия между клиентами. Скорее, когда текст выделен в окне, владелец окна копирует этот текст в свойство корневого окна, называемого CUT_BUFFER1. Когда пользователь вставляет текст в другое окно, владелец окна читает это свойство корневого окна.

В xcutsel программа передает данные между выборками и буферами вырезок, а xcb Программа предоставляет различные виды доступа к буферам резки.

Буферы вырезания считаются устаревшими.[1]

XDND

Перетаскивание в системе X Window регулируется соглашением Xdnd.[2] Когда пользователь перетаскивает выделенный текст в окно и отпускает кнопку мыши, обмен данными выполняется так же, как и при первичном выборе. Перетаскивание усложняется тем, что происходит во время перетаскивания. А именно, когда пользователь перетаскивает выделение в разные части рабочего стола или окна, пользователь ожидает, что сможет определить, можно ли отбросить текст или нет. В частности, цель должна отображать визуальную обратную связь о том, примет ли она перетаскивание, и курсор должен измениться, чтобы указать действие, которое будет выполнено; например, скопировать или переместить.

В протоколе Xdnd окно, в котором выделяется текст и начинается перетаскивание, называется источник; окно, над которым находится курсор, называется цель. Связь между источником и целью осуществляется источником, потому что источник «захватывает» курсор. Таким образом, обмен между источником и целью необходим, чтобы цель даже знала, что происходит перетаскивание. Поскольку источник определяет форму курсора, он должен получить ответ от цели, чтобы обновить курсор. Кроме того, поскольку цели может потребоваться нарисовать бомбовый прицел, чтобы указать, где произойдет падение, и поскольку принятие падения может зависеть от точного местоположения курсора, этот обмен должен происходить многократно по мере его перемещения. Фактически, даже если курсор не перемещается, необходимо обмениваться сообщениями, чтобы позволить цели прокручиваться, когда курсор находится рядом с краем области просмотра. В противном случае пользователь сможет упасть только на видимую часть цели.

Программа может заявить, что окно может быть целью перетаскивания, создав свойство с именем XdndAware который содержит самую высокую версию протокола, поддерживаемую программой. Таким образом, приложения, которые поддерживают более новые версии, могут вернуться к более старым версиям для правильной работы. Кроме того, все приложения, написанные без поддержки Xdnd, будут игнорироваться.

Когда курсор входит в целевое окно, источник проверяет наличие XdndAware свойство в этом окне. Если это свойство присутствует, начинается обмен:

  • источник сообщает цели, что курсор вошел в цель при перетаскивании некоторых данных, отправив событие XdndEnter
  • цель может узнать, какие данные перетаскиваются (текст, изображение и т. д.), просмотрев это событие и, возможно, путем дальнейшего взаимодействия с источником

Пока курсор находится внутри целевого окна:

  • источник отправляет XdndPosition события, чтобы сообщить цели, где в данный момент находится курсор
  • цель отвечает XdndStatus события, чтобы сообщить источнику, можно ли удалить данные в текущей позиции
  • источник отправляет сообщение XdndLeave или же XdndDrop когда курсор покинул окно или кнопка была отпущена соответственно

Если пользователь падает, цель, как обычно, запрашивает выбор у источника. Когда передача выбора завершена, цель отправляет XdndFinish событие, чтобы сообщить источнику, что передача прошла успешно.

Таким образом, протокол управляется источником, который информирует цель о том, что происходит с курсором. В ответ цель сообщает источнику, будет ли перетаскивание принято или нет. Цель также должна быть проинформирована, когда пользователь отпускает кнопку мыши, так как это событие запускает регулярный запрос выбора, который является протоколом, управляемым целью.

Выше приведено описание соглашения Xdnd для перетаскивания. В Motif, OffiX и Amulet используются разные соглашения для перетаскивания.

XDS

В Протокол прямого сохранения, сокращенно XDS (за Икс Окно Dпрямой Save Protocol), является программный протокол который поддерживает экономию файлы к перетаскивание их к Файловый менеджер окна. XDS построен на основе XDND протокол.[3][4]

Программы

Следующие программы специально работают с механизмами передачи данных:

  • xcutsel передает данные из выборок в вырезанные буферы или наоборот
  • xclipboard щупальца (Гном ), парцеллит (LXDE ), и Клиппер (KDE ) находятся менеджеры буфера обмена, может быть, и wmcliphist
  • xcb показывает содержимое вырезанных буферов и позволяет пользователю манипулировать ими
  • xselection, xclip, xsel и xcopy - это программы командной строки, которые копируют данные в X-выбор или из него. В xcopy есть опция подробности, которая помогает отладить проблемы с выбором X. parcellite также имеет возможность читать и записывать в определенные X выборки из командной строки.
  • synergy - это кроссплатформенный инструмент, который позволяет использовать буфер обмена на нескольких компьютерах под управлением нескольких операционных систем.
  • xfce4-clipman-plugin - это «плагин истории буфера обмена для панели Xfce4», а также менеджер буфера обмена
  • xtranslate ищет слова в Xselection в многоязычном словаре
  • autocutsel синхронизирует буфер вырезания и буфер выбора

Смотрите также

Рекомендации

  1. ^ Завински, Дж. У. (2002). X выборки, буферы вырезания и кольца уничтожения. Получено 13 июля 2010 г. из http://www.jwz.org/doc/x-cut-and-paste.html
  2. ^ Протокол перетаскивания для системы X Window, от http://johnlindal.wix.com/xdnd
  3. ^ Линдал, Джон. «Сохранение файлов с помощью перетаскивания: протокол прямого сохранения для системы X Window». Архивировано из оригинал 5 марта 2016 г.
  4. ^ «Сохранение файлов с помощью перетаскивания: протокол прямого сохранения для системы X Window». freedesktop.org. Архивировано из оригинал 22 марта 2015 г.

внешняя ссылка