Выбор X Window


Из Википедии, бесплатной энциклопедии
  (Перенаправлено с XDND )
Перейти к навигации Перейти к поиску

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

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

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

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

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

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

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

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

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

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

Выборы

Система X Window поддерживает произвольное количество вариантов выбора; каждый выбор обозначается строкой (точнее, строкой atom). Наиболее часто используемый выбор - это PRIMARYвыбор.

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

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

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

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

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

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

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

Расширение XFixes позволяет клиентам отслеживать изменения выбора. [1]

Буфер обмена

Наиболее часто используемый выбор - это PRIMARYвыбор, который используется, когда пользователь выбирает некоторые данные. CLIPBOARDВыбора используется , когда пользователь выбирает некоторые данные и явно просит его быть «скопированы» в буфер обмена, например, путем вызова «Copy» в меню «Edit» приложения. Связанный запрос «Вставить» приводит к использованию данных CLIPBOARDвыбора.

На уровне протокола ядра, то PRIMARYи CLIPBOARDвыборы не отличаются. Но xclipboardклиент заставляет их вести себя иначе. В частности, когда другой клиент заявляет о праве собственности на CLIPBOARDвыбор, эта программа запрашивает и отображает его в окне. Любые дальнейшие запросы на этот выбор обрабатываются xclipboard. Таким образом, содержимое выделения сохраняется у клиента, скопировавшего его.

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

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

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

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

XDND

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

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

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

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

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

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

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

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

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

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

XDS

Сохранить протокол Direct , сокращенные X (для X Window D Прям аи S пр протокола), представляет собой программный протокол , который поддерживает сохранение файлов путем перетаскивания их в файловый менеджер окна . XDS построен на основе протокола XDND . [4] [5]

Программ

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

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

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

  • Протоколы и архитектура системы X Window
  • Основной протокол X Window System
  • ICCCM

использованная литература

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

внешние ссылки

  • ICCCM: одноранговая коммуникация посредством выбора
  • ICCCM: одноранговая связь с помощью вырезанных буферов
  • Xdnd спецификация
  • Статья Кита Паккарда
  • Выборки в целом и в Emacs
Источник « https://en.wikipedia.org/w/index.php?title=X_Window_selection&oldid=1036199780#XDND »