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.