В Wayland нет глобального clipboard-сервиса, как в X11. Буфер обмена реализует compositor, то есть сам Sway. То есть, когда я нажимаю Ctrl+C, приложение само передаёт данные compositor'у. А когда я нажимаю Ctrl+V, compositor отдаёт данные другому приложению.
!!! В Wayland есть важное ограничение: буфер обмена живёт, пока живо приложение-источник. Если я запустил, например, FeatherPad, выделил текст и скопировал его в буфер обмена, то я смогу его вставить в другое приложение только если FeathPad запущен. Если я закрою FeatherPad, то Ctrl+V в другом приложении ничего не вставит.
Вроде бы как можно обойти это ограничение. Есть такие инструменты как cliphist, clipman. По идее, они должны сохранять историю. Но я пока с ними не разобрался. У меня они ничего не сохраняют после закрытия источника.
Зачем тогда нужен пакет wl-clipboard, если GUI-приложения и так могут напрямую отправлять данных в буфер обмена Sway?
wl-clipboard добавляет две команды:
То есть, wl-clipboard ≠ буфер обмена.
Буфер обмена (clipboard) у меня и так есть. Его даёт Sway.
wl-clipboard – это мост между CLI и Wayland clipboard.
Копируем сообщение с помощью wl-copy:
echo "Зелёные помидоры падают с дерева прямо в рот дяде Паше" | wl-copy
А затем это сообщение можно вставить в любое приложение с помощью Ctrl+V.
Или вывести прямо в терминал:
wl-paste
# убрать перевод строки в конце:
wl-paste -n
Можно следить за изменением буфера обмена:
wl-paste --watch echo "clipboard changed"
Каждый раз, когда в буфер обмена попадёт что-то новое, будет выводиться надпись: "clipboard changed".
wl-paste --list-types
# text/plain
# text/plain;charset=utf-8
# TEXT
# STRING
# UTF8_STRING
Всё, что мы получили в выводе – это форматы (MIME-типы), в которых доступно одно и то же содержимое. Когда приложение кладёт текст в буфер обмена, оно не кладёт "просто текст". Оно говорит compositor'у: я могу отдать это содержимое вот в таких форматах. А получающее приложение выбирает любой формат, который понимает.
Когда мы просто пишем команду wl-paste без явного указания MIME-типа, то wl-paste сам подбирает лучший подходящий текстовый тип. Обычно это text/plain;charset=utf-8.
Но можно и самому явно указать тип:
wl-paste --type text/plain
# или:
wl-paste --type UTF8_STRING
GUI-приложения не используют wl-copy. Они напрямую отправляют скопированные данные композитору, а тот отдаёт их другому приложению. wl-clipboard – это мост между CLI и Wayland'овским буфером обмена.
Многие приложения, такие например, как NormCap, используют под капотом wl-clipboard, поэтому без него они не будут ничего копировать в буфер обмена.