Sempre me perguntei o que acontece nos bastidores (no sistema operacional) quando copio uma imagem (selecionando-a e usando Ctrl+ C) para um arquivo do Word (colando-a com Ctrl+ V), por exemplo.
Uma coisa em comum em todos os sistemas é que os atalhos de teclado não CtrlCsão de nível de sistema - eles são tratados por cada programa individualmente, assim como os itens de menu "Copiar" ou "Colar" são específicos para cada programa. Portanto, não é o próprio sistema operacional que "copia" algo, mas sim o aplicativo (Word) que usa alguma função específica do sistema operacional para colocar dados na área de transferência global.
janelas
No Windows, a API da área de transferência e o buffer de armazenamento são fornecidos pelo sistema operacional no nível do kernel. (A área de transferência pertence ao objeto do kernel "estação de janela".)
Quando você "copia" algo, o programa armazena os dados "copiados" usando a função Win32 API SetClipboardData(), que também corresponde à NtUserSetClipboardData()API nativa.
Normalmente, os dados copiados são imediatamente armazenados no buffer da área de transferência gerenciada pelo sistema operacional e não dependem mais do programa de origem. O programa pode fornecer vários formatos diferentes – por exemplo, o texto copiado do Word pode vir simultaneamente em HTML, RTF e formatos de texto simples, além do próprio formato do Word.
No entanto, o programa pode armazenar dados 'nulos' e adiar a conversão até que uma colagem seja solicitada usando WM_RENDERFORMAT, por exemplo, se os dados copiados forem grandes. Neste caso, os dados são perdidos quando o programa é fechado. Você pode ter visto o Word ou o Photoshop perguntarem sobre isso ao sair do programa.
(Observe que quando você "corta" ou "copia" um arquivo inteiro por meio do Explorer, isso não coloca todo o conteúdo do arquivo na área de transferência, mas apenas uma referência de arquivo que o próprio Explorer entenderá quando for colado.)
Quando você pede ao programa para "colar", o programa escolhe o formato desejado e o recupera usando GetClipboardData(). Alguns programas, por exemplo, WordPad ou Paint, têm um recurso "Colar como" que permite escolher o formato preferido (por exemplo, se você copiou de um navegador da Web, mas deseja colar sem formatar).
No Linux e em outros sistemas semelhantes, a área de transferência é fornecida pelo ambiente gráfico que você está usando (ou seja, um servidor X11 ou um compositor Wayland) – não há área de transferência compartilhada para programas executados fora desse ambiente.
X11
O X11 lida com a área de transferência de maneira um pouco diferente - o servidor X não fornece armazenamento algum, apenas facilita a comunicação entre o programa de origem da cópia (que anuncia que tem algo "copiado") e o programa de destino da colagem.
Tanto o anúncio inicial de "copiar" quanto a transferência posterior de "colar" são feitos por meio de mensagens X11 de acordo com o protocolo ICCCM. (Cada exibição X, portanto, tem uma área de transferência separada
Ao pressionar CtrlC, o programa de origem manterá o controle dos dados "copiados" em sua própria memória e reivindicará a propriedade da "seleção" do X11 chamada 'CLIPBOARD', que é feita usando XSetSelectionOwner().
Essa propriedade é rastreada centralmente pelo servidor X (por exemplo, Xorg). Sempre que você "copia" algo novo, o aplicativo anterior que possuía a seleção 'CLIPBOARD' é informado sobre a perda de sua propriedade para que possa descartar os dados agora desnecessários.
Como a transferência da área de transferência é sempre adiada, os dados copiados geralmente são perdidos assim que você fecha o programa "fonte" (a menos que você esteja executando um "gerenciador de área de transferência" que armazena proativamente tudo o que é copiado). Portanto, se você copiar algo do Firefox e fechar o Firefox, não poderá mais colá-lo.
Ao colar, o programa procurará o proprietário atual da seleção 'CLIPBOARD' usando XGetSelectionOwner(). Semelhante ao Windows, é possível que a área de transferência do X11 contenha dados em vários tipos alternativos, de modo que o programa de destino solicite à fonte o tipo preferido usando XConvertSelection().
(Normalmente, um tipo especial chamado 'TARGETS' está disponível, que faz com que o programa de origem retorne uma lista ASCII de tipos de dados atualmente disponíveis.)
Observação: quando você "copia" o texto selecionando-o e cola-o usando o botão do meio, o mecanismo é o mesmo, mas a seleção 'PRIMÁRIA' é usada. É daí que vem o termo 'seleção X11'.
Wayland
Na verdade, não entendo como funciona em Wayland, tudo o que tenho são os documentos do protocolo:
Editores de texto tradicionais (Vim, emacs, nano) geralmente têm suas próprias pranchetas internas (também conhecidas como registradores/killrings).
Aplicativos baseados em terminal podem acessar as áreas de transferência do X11 ou Wayland se executados dentro de um emulador de terminal gráfico, por exemplo, o "+registro do Vim irá colar da área de transferência do X11 (enquanto outros registros do Vim são internos ao programa).
macOS (Mac OS X)
No macOS, algo chamado "servidor de área de transferência" parece ser usado (o que eu acho que significa que os programas se comunicam com ele por meio de APIs do Mach). Fora isso, ele se comporta como a área de transferência do Windows e armazena os dados atualmente copiados.
Estou mais intrigado com imagens, como elas podem ser copiadas tão facilmente
Não há nada de especial nas imagens - elas ainda são apenas blocos de dados binários que podem ser representados como bytes, portanto, se puderem ser salvos em um arquivo (por exemplo, no formato PNG ou JPEG), também poderão ser armazenados na área de transferência usando o mesmo formato.
Os aplicativos do Windows normalmente armazenam imagens copiadas nos formatos BMP/DIB (o mesmo que em um arquivo .bmp), enquanto no Linux é comum que os aplicativos ofereçam PNG (ou seja, destino "imagem/png").
Uma coisa em comum em todos os sistemas é que os atalhos de teclado não CtrlCsão de nível de sistema - eles são tratados por cada programa individualmente, assim como os itens de menu "Copiar" ou "Colar" são específicos para cada programa. Portanto, não é o próprio sistema operacional que "copia" algo, mas sim o aplicativo (Word) que usa alguma função específica do sistema operacional para colocar dados na área de transferência global.
janelas
No Windows, a API da área de transferência e o buffer de armazenamento são fornecidos pelo sistema operacional no nível do kernel. (A área de transferência pertence ao objeto do kernel "estação de janela".)
Quando você "copia" algo, o programa armazena os dados "copiados" usando a função Win32 API
SetClipboardData()
, que também corresponde àNtUserSetClipboardData()
API nativa.Normalmente, os dados copiados são imediatamente armazenados no buffer da área de transferência gerenciada pelo sistema operacional e não dependem mais do programa de origem. O programa pode fornecer vários formatos diferentes – por exemplo, o texto copiado do Word pode vir simultaneamente em HTML, RTF e formatos de texto simples, além do próprio formato do Word.
No entanto, o programa pode armazenar dados 'nulos' e adiar a conversão até que uma colagem seja solicitada usando
WM_RENDERFORMAT
, por exemplo, se os dados copiados forem grandes. Neste caso, os dados são perdidos quando o programa é fechado. Você pode ter visto o Word ou o Photoshop perguntarem sobre isso ao sair do programa.(Observe que quando você "corta" ou "copia" um arquivo inteiro por meio do Explorer, isso não coloca todo o conteúdo do arquivo na área de transferência, mas apenas uma referência de arquivo que o próprio Explorer entenderá quando for colado.)
Quando você pede ao programa para "colar", o programa escolhe o formato desejado e o recupera usando
GetClipboardData()
. Alguns programas, por exemplo, WordPad ou Paint, têm um recurso "Colar como" que permite escolher o formato preferido (por exemplo, se você copiou de um navegador da Web, mas deseja colar sem formatar).Veja também a postagem do blog "NT Debugging: How the clipboard works" .
Linux, BSD, Solaris, OpenVMS
No Linux e em outros sistemas semelhantes, a área de transferência é fornecida pelo ambiente gráfico que você está usando (ou seja, um servidor X11 ou um compositor Wayland) – não há área de transferência compartilhada para programas executados fora desse ambiente.
X11
O X11 lida com a área de transferência de maneira um pouco diferente - o servidor X não fornece armazenamento algum, apenas facilita a comunicação entre o programa de origem da cópia (que anuncia que tem algo "copiado") e o programa de destino da colagem.
Tanto o anúncio inicial de "copiar" quanto a transferência posterior de "colar" são feitos por meio de mensagens X11 de acordo com o protocolo ICCCM. (Cada exibição X, portanto, tem uma área de transferência separada
Ao pressionar CtrlC, o programa de origem manterá o controle dos dados "copiados" em sua própria memória e reivindicará a propriedade da "seleção" do X11 chamada 'CLIPBOARD', que é feita usando
XSetSelectionOwner()
.Essa propriedade é rastreada centralmente pelo servidor X (por exemplo, Xorg). Sempre que você "copia" algo novo, o aplicativo anterior que possuía a seleção 'CLIPBOARD' é informado sobre a perda de sua propriedade para que possa descartar os dados agora desnecessários.
Como a transferência da área de transferência é sempre adiada, os dados copiados geralmente são perdidos assim que você fecha o programa "fonte" (a menos que você esteja executando um "gerenciador de área de transferência" que armazena proativamente tudo o que é copiado). Portanto, se você copiar algo do Firefox e fechar o Firefox, não poderá mais colá-lo.
Ao colar, o programa procurará o proprietário atual da seleção 'CLIPBOARD' usando
XGetSelectionOwner()
. Semelhante ao Windows, é possível que a área de transferência do X11 contenha dados em vários tipos alternativos, de modo que o programa de destino solicite à fonte o tipo preferido usandoXConvertSelection()
.(Normalmente, um tipo especial chamado 'TARGETS' está disponível, que faz com que o programa de origem retorne uma lista ASCII de tipos de dados atualmente disponíveis.)
Veja neste link um exemplo prático.
Observação: quando você "copia" o texto selecionando-o e cola-o usando o botão do meio, o mecanismo é o mesmo, mas a seleção 'PRIMÁRIA' é usada. É daí que vem o termo 'seleção X11'.
Wayland
Na verdade, não entendo como funciona em Wayland, tudo o que tenho são os documentos do protocolo:
https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-data-sharing
https://wayland.freedesktop.org/docs/html/apa.html#protocol-spec-wl_data_device
Consulte https://github.com/bugaevc/wl-clipboard para obter uma ferramenta de linha de comando.
Programas não gráficos
Editores de texto tradicionais (Vim, emacs, nano) geralmente têm suas próprias pranchetas internas (também conhecidas como registradores/killrings).
Aplicativos baseados em terminal podem acessar as áreas de transferência do X11 ou Wayland se executados dentro de um emulador de terminal gráfico, por exemplo, o
"+
registro do Vim irá colar da área de transferência do X11 (enquanto outros registros do Vim são internos ao programa).macOS (Mac OS X)
No macOS, algo chamado "servidor de área de transferência" parece ser usado (o que eu acho que significa que os programas se comunicam com ele por meio de APIs do Mach). Fora isso, ele se comporta como a área de transferência do Windows e armazena os dados atualmente copiados.
https://developer.apple.com/documentation/appkit/nspasteboard
Existe um aplicativo de amostra: https://developer.apple.com/library/archive/samplecode/ClipboardViewer/Introduction/Intro.html
Não há nada de especial nas imagens - elas ainda são apenas blocos de dados binários que podem ser representados como bytes, portanto, se puderem ser salvos em um arquivo (por exemplo, no formato PNG ou JPEG), também poderão ser armazenados na área de transferência usando o mesmo formato.
Os aplicativos do Windows normalmente armazenam imagens copiadas nos formatos BMP/DIB (o mesmo que em um arquivo .bmp), enquanto no Linux é comum que os aplicativos ofereçam PNG (ou seja, destino "imagem/png").