2

В этом ответе говорится, что Cygwin использует устройство /dev/clipboard , которое синхронизируется со стандартным буфером обмена Windows.

Есть ли способ использовать эту же функцию в Linux для основного буфера обмена? Возможно, кто-то написал драйвер FUSE или такой?

В частности, я ищу файловое устройство в Linux, которое позволяет следующее:

$ echo Foo > /dev/clipboard
# clipboard content: "Foo", usable via Ctrl-V
# set clipboard via Ctrl-C to "Bar"
$ cat /dev/clipboard > test.txt
# test.txt content: "Bar"

1 ответ1

4

Разговор демона FUSE X11, безусловно, был бы возможен. Но есть и другие проблемы:

Nitpick: "Первичный буфер обмена" противоречит сам себе. X11 имеет два обычно используемых "выбора"; тот, который называется "PRIMARY", используется, когда вы выбираете и нажимаете среднюю кнопку, а тот, который называется "CLIPBOARD", используется, когда вы нажимаете Ctrl C или Ctrl V.

Cygwin /dev/clipboard реализован во время выполнения cygwin1, поэтому его код работает в том же контексте, что и сама программа, осуществляющая доступ. Если два пользователя пытаются прочитать его, они оба видят свое собственное содержимое буфера обмена, потому что они получают к нему доступ напрямую.

Тем временем монтирование файловой системы Linux является глобальным - все запросы на чтение проходят через один серверный процесс FUSE (для этого монтирования FUSE); это означает, что он не знает наверняка, какой буфер обмена X-сервера он должен прочитать.

(Помните, что в систему могут войти несколько пользователей и одновременно запустить несколько X-серверов.)

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

  • Имейте единственное общесистемное крепление FUSE в /dev/clipboard . Каждый раз, когда демон FUSE получает открытый запрос, ему нужно получить PID запрашивающей программы, access /proc/<pid>/environ , извлечь из него DISPLAY = & XAUTHORITY =, использовать эту информацию для подключения к нужному X-серверу и прочитайте буфер обмена

  • Вместо /dev поместите специальный файл в домашнюю директорию пользователя, например, ~/clipboard . Каждый пользователь запускает отдельную копию демона. Gvfs из GNOME использует этот метод для /run/user/*/gvfs (ранее ~/.gvfs). Он ограничивает каждого пользователя одним графическим сеансом, но это нормально - есть много других вещей, которые работают только один раз для каждого пользователя.

  • Настройте новое пространство имен монтирования при входе в систему, например, используя pam_namespace , чтобы у каждого сеанса было отдельное представление о том, что смонтировано где (наследование от корневого пространства имен, но возможность монтировать, например, /dev /clipboard, не видя из вне). Затем демон FUSE запускается диспетчером сеансов X так же, как и в предыдущем методе, но не ограничивается одним сеансом на пользователя.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .