‹ de volta para casa21-10-2022

Ler como o copiar e colar funciona a partir da especificação Wayland não é trivial, a menos que você entenda muito como a computação de desktop funciona e o Wayland interno. Levei um bom tempo para descobrir tudo, mas quando você chega lá, parece bastante óbvio.

Aqui está minha tentativa de explicar como funciona para meros mortais.

Terminologia

Deixe-me esclarecer que o que costumamos chamar de “prancheta” na verdade é chamado de “seleção”. Usarei o termo “prancheta” aqui de qualquer maneira para manter isso amigável, mas lembre-se de que não é o termo técnico real.

Copiando

Quando você seleciona algum texto e pressiona ctrl+c, normalmente diz que o programa “copia” os dados para a área de transferência. Na realidade, nenhuma cópia acontece neste momento. O que o programa realmente faz é anunciar “Eu tenho a área de transferência agora e tenho dados do tipo text/plain. Neste ponto, o aplicativo anterior que possuía a área de transferência (se houver) é informado de que não possui mais a área de transferência. A partir deste ponto, sempre que outro aplicativo ganhar foco, será informado que alguém possui a área de transferência e está oferecendo dados do tipo text/plain. Isso acontece quando um aplicativo ganha foco porque apenas um aplicativo em primeiro plano pode acessar a área de transferência.

No entanto, não copiamos apenas texto, podemos copiar qualquer coisa. Vamos copiar uma imagem png no Firefox (ex: clique com o botão direito, copie imagem). Neste ponto, o Firefox anuncia
“Eu tenho a prancheta; tenho dados do tipo image/png, text/x-moz-url

ou text/plain. Isso significa que os dados podem ser colados como uma imagem png (por exemplo: bytes de imagem bruta) ou como um URL (o URL para a imagem que copiamos) ou como texto (novamente, o URL. Este é o substituto para programas que não suportam nenhum dos dois acima).

Isso tudo simplificou um pouquinho; o processo de cópia não é um passo, mas alguns (mas a introdução acima deve ajudar a fazer sentido). Em todos os detalhes:

  • O aplicativo cria um wl_data_source objeto, indicando que ele vai oferecer dados para outros aplicativos.
  • O aplicativo adiciona os tipos mime que ele pode manipular à fonte de dados (com wl_data_source::offer)
  • O aplicativo finalmente chama wl_data_device::set_selectionindicar
    “Estou me apropriando da área de transferência, e o acima criado
    wl_data_source é o que estou oferecendo”
    .

Colando

Copiar não foi difícil, agora vamos ver como funciona o outro lado.

Conforme mencionado acima, os aplicativos são informados quando outro aplicativo possui a área de transferência.

Então vamos imaginar que você copiou uma imagem no Firefox e agora muda para um terminal. O compositor informará o terminal “Alguém é dono da área de transferência e está oferecendo dados de tipos image/png, text/x-moz-url ou text/plain. Se você tentar colar, o terminal ignorará os tipos que não sabe manipular e solicitará os dados do tipo text/plain. Neste ponto, o proprietário da área de transferência (Firefox) é informado de que alguém deseja colar seus dados e recebe um descritor de arquivo em que deve escrever os dados. O terminal recebe outro descritor de arquivo onde pode ler os dados. Qualquer coisa escrita no primeiro é lida no segundo, então os dados são transferidos diretamente entre os aplicativos sem intermediários. É basicamente um tubo; os dados entram por um lado, saem pelo outro.

Algumas notas sobre este projeto

Antes de tudo, é preciso entender que, sob o capô, nada é “copiado para a área de transferência”. Quando clicamos em copiar, nada é copiado. A semântica “copiar” é apenas um conceito de interface do usuário. O que realmente acontece é que “o aplicativo anuncia que é dono da área de transferência; que o usuário copiou algo”.

Uma grande vantagem desse design é que nenhum dado é copiado desnecessariamente. Por exemplo, um editor de imagens oferecerá dados como image/png, image/bmp,
image/jpeg, etc. Se os dados tivessem que ser enviados assim que a ação de “copiar” acontecesse, então a imagem teria que ser codificada em todos esses formatos imediatamente – mas provavelmente apenas um deles seria usado. Pode-se copiar um vídeo de 600 MB, apenas para colar em algum lugar onde um URL será colado.

Essa abordagem oferece a maior flexibilidade, mas também reduz ao mínimo o trabalho desnecessário e o uso de memória.

Existem algumas outras vantagens técnicas para este design que estão fora do escopo aqui (como o compositor não precisar alocar grandes quantidades de memória para dados da área de transferência).

Um problema com este design

Um grande problema com esse design é que se eu copiar uma imagem (por exemplo: do GIMP) e depois fechar esse aplicativo, a seleção da área de transferência será perdida. Não consigo mais colá-lo; se foi para sempre.

Este é um problema bem conhecido no desktop Linux. Há algumas maneiras de contornar isso:

  • Quando algo é copiado e todas as janelas de um programa são fechadas, o programa pode ficar em segundo plano, sem janelas, até perder a área de transferência. Isso pode ser muito difícil de implementar para alguns aplicativos devido à forma como eles são projetados e precisa ser implementado por todos. Ele funciona para ferramentas que se concentram em copiar dados (é por isso que eu faço com
    atirador).
  • Um gerenciador de área de transferência. O gerenciador da área de transferência utilizou uma API privilegiada para sempre ser notificado quando qualquer aplicativo se apropriar da área de transferência; quando isso acontece, eles podem copiar todos os dados e apropriar-se da área de transferência. A maioria das implementações estão quebradas e lidam apenas com texto. Muitos despejam os dados no disco, o que os torna um pouco arriscados se você copiar dados confidenciais em sua área de transferência. Eu escrevi um gerenciador de área de transferência que funciona (clipmon), mas tem um grande problema: se você copiar uma imagem que é oferecida em vários formatos diferentes, ela terá que copiar todos esses formatos. Isso adiciona muito trabalho desnecessário (e uso de memória) para muitos cenários.

— § —

Direitos autorais © 2012-2022 Hugo Osvaldo Barreira
O conteúdo deste site está licenciado sob
CC-BY-SA, a menos que seja afirmado o contrário. O código é
ISC.


Source link

Previous article1) Aqueles que trabalham para instituições poderosas, do governo à grande tecnologia, e sabem que são atrapalhados e disfuncionais por dentro 2) Aqueles que não trabalham e projetam todo tipo de competência conspiratória sobre eles Nunca atribua à malícia o que é melhor explicado por incompetência “|lixo
Next articleO Dono do Lugar de Djonga está entre os mais ouvidos do mundo

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.