Выделение , вырезание буферов и перетаскивание - это механизмы, используемые в системе 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
Выбора используется , когда пользователь выбирает некоторые данные и явно просит его быть «скопированы» в буфер обмена, например, путем вызова «Copy» в меню «Edit» приложения. Связанный запрос «Вставить» приводит к использованию данных CLIPBOARD
выбора.
На уровне протокола ядра, то PRIMARY
и CLIPBOARD
выборы не отличаются. Но xclipboard
клиент заставляет их вести себя иначе. В частности, когда другой клиент заявляет о праве собственности на CLIPBOARD
выбор, эта программа запрашивает и отображает его в окне. Любые дальнейшие запросы на этот выбор обрабатываются xclipboard
. Таким образом, содержимое выделения сохраняется у клиента, скопировавшего его.
Вырезанные буферы - еще один механизм для передачи данных, в частности выделенного текста. Они являются свойством окон этого корневого окна , названное CUT_BUFFER1
и т.д. В отличии от выборов, срезанные буфера не связан с непосредственным взаимодействием между клиентами. Скорее, когда текст выделен в окне, владелец окна копирует этот текст в свойство вызываемого корневого окна CUT_BUFFER1
. Когда пользователь вставляет текст в другое окно, владелец окна читает это свойство корневого окна.
В xcutsel
передают данные программ между выборами и срезанными буферами, и xcb
программой допускают различные виды доступа к разрезанным буферам.
Вырезанные буферы считаются устаревшими. [2]
Перетаскивание в системе X Window регулируется соглашением Xdnd. [3] Когда пользователь перетаскивает выделенный текст в окно и отпускает кнопку мыши, обмен данными выполняется так же, как и при первичном выборе. Перетаскивание усложняется тем, что происходит во время перетаскивания. А именно, когда пользователь перетаскивает выделение в разные части рабочего стола или окна, пользователь ожидает, что сможет определить, можно ли отбросить текст или нет. В частности, цель должна отображать визуальную обратную связь о том, примет ли она перетаскивание, и курсор должен измениться, чтобы указать действие, которое будет предпринято; например, скопировать или переместить.
В протоколе Xdnd окно, в котором выделяется текст и начинается перетаскивание, называется источником ; окно, над которым находится курсор, называется целевым. Связь между источником и целью осуществляется источником, потому что источник «захватывает» курсор. Следовательно, обмен между источником и целью необходим, чтобы цель даже знала, что происходит перетаскивание. Поскольку источник определяет форму курсора, он должен получить ответ от цели, чтобы обновить курсор. Кроме того, поскольку цели может потребоваться нарисовать бомбовый прицел, чтобы указать, где произойдет падение, и поскольку принятие падения может зависеть от точного местоположения курсора, этот обмен должен происходить неоднократно по мере его перемещения. Фактически, даже если курсор не перемещается, необходимо обмениваться сообщениями, чтобы позволить цели прокручиваться, когда курсор находится рядом с краем области просмотра. Иначе,пользователь сможет упасть только на видимую часть цели.
Программа может заявить, что окно может быть целью перетаскивания, создав свойство с именем, XdndAware
которое содержит самую высокую версию протокола, поддерживаемого программой. Таким образом, приложения, поддерживающие более новые версии, могут вернуться к более старым версиям для правильного взаимодействия. Кроме того, все приложения, написанные без поддержки Xdnd, будут игнорироваться.
Когда курсор входит в целевое окно, источник проверяет наличие XdndAware
свойства в этом окне. Если это свойство присутствует, начинается обмен:
XdndEnter
Пока курсор находится внутри целевого окна:
XdndPosition
события, чтобы сообщить цели, где в данный момент находится курсорXdndStatus
событиями, чтобы сообщить источнику, можно ли удалить данные в текущей позицииXdndLeave
или XdndDrop
когда курсор покинул окно или кнопка была отпущена соответственноЕсли пользователь падает, цель, как обычно, запрашивает выбор у источника. Когда передача выбора завершена, цель отправляет XdndFinish
событие, чтобы сообщить источнику, что передача была успешной.
Таким образом, протокол управляется источником, который информирует цель о том, что происходит с курсором. В ответ цель сообщает источнику, будет ли перетаскивание принято или нет. Цель также должна быть проинформирована, когда пользователь отпускает кнопку мыши, поскольку это событие запускает регулярный запрос выбора, который является протоколом, управляемым целью.
Выше приведено описание соглашения Xdnd для перетаскивания. В Motif, OffiX и Amulet используются разные соглашения для перетаскивания.
Сохранить протокол Direct , сокращенные X (для X Window D Прям аи S пр протокола), представляет собой программный протокол , который поддерживает сохранение файлов путем перетаскивания их в файловый менеджер окна . XDS построен на основе протокола XDND . [4] [5]
Следующие программы специально работают с механизмами передачи данных: