Existe uma maneira de criar um / dev / clipboard como no Cygwin?

2

Esta resposta diz que o Cygwin apresenta um dispositivo /dev/clipboard , que está em sincronia com a área de transferência padrão do Windows.

Existe alguma maneira de ter esse mesmo recurso no Linux para a área de transferência primária? Talvez alguém tenha escrito um driver FUSE ou algo assim?

Mais especificamente, estou procurando um dispositivo semelhante a um arquivo no Linux, que permite o seguinte:

$ 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"
    
por Boldewyn 16.01.2015 / 09:11

1 resposta

4

Ter um daemon do FUSE falar X11 certamente seria possível. Mas existem alguns outros problemas:

Nitpick: "Primary clipboard" contradicts itself. X11 has two commonly used 'selections'; the one called "PRIMARY" is used when you select and middle-click, and the one called "CLIPBOARD" is used when you press CtrlC or CtrlV.

O /dev/clipboard do Cygwin é implementado no tempo de execução do cygwin1, portanto, seu código é executado no mesmo contexto que o próprio programa de acesso . Se dois usuários tentarem lê-lo, ambos verão o próprio conteúdo da área de transferência, porque estão acessando eles diretamente.

As montagens do sistema de arquivos do Linux, enquanto isso, são globais - todas as solicitações de leitura passam por um único processo do servidor FUSE (para essa montagem FUSE); ou seja, ele não sabe com certeza qual área de transferência do servidor X deve ler.

(Lembre-se de que pode haver vários usuários conectados e vários servidores X sendo executados ao mesmo tempo.)

Existem três soluções possíveis para o problema de vários usuários:

  • Tenha uma única montagem FUSE em todo o sistema em /dev/clipboard . Toda vez que o daemon do FUSE receber um pedido aberto, ele precisa obter o PID do programa solicitante, acessar /proc/<pid>/environ , extrair DISPLAY = & XAUTHORITY = a partir dele, use essas informações para se conectar ao servidor X correto e leia a área de transferência.

  • Em vez de / dev, insira o arquivo especial no diretório pessoal do usuário, por exemplo, %código%. Cada usuário executa uma cópia separada do daemon. O Gvfs do GNOME usa este método para ~/clipboard (anterior /run/user/*/gvfs ). Ele limita cada usuário a uma sessão gráfica, mas tudo bem - há muitas outras coisas que só funcionam uma vez por usuário também.

  • Configure um novo namespace de montagem ao efetuar login, por exemplo, usando ~/.gvfs , para que cada sessão tenha uma visão separada do que está montado onde (herdando do namespace raiz, mas podendo montar, por exemplo, / dev / clipboard sem que seja visível do lado de fora). O daemon do FUSE, em seguida, é iniciado pelo gerenciador de sessão X, da mesma forma que no método anterior, mas não limitado a uma sessão por usuário.

por 16.01.2015 / 09:42