Eu estava lendo um livro chamado Low Level X Window Programming
Ross Maloney. Ele estava falando sobre um dos aspectos-chave de um sistema de janelas empilhadas, ou seja, restauração de conteúdo "oculto" quando você "remove" uma janela.
Normalmente, você esperaria que o conteúdo "atrás" fosse imediatamente visível. No entanto, aparentemente, isso não é algo que uma x
implementação tenha que fornecer, embora alguns o façam.
Os serviços save under e backing store diferem ligeiramente. Em save under, o conteúdo da tela na qual uma janela é mapeada é salvo pelo servidor na instância antes da janela ser mapeada, usando a memória do servidor.
- Se isso não é algo que o
x
servidor fornece, deve ser implementado no lado do cliente? - Como alguns gerenciadores de janelas típicos implementam o empilhamento?
- Se
xorg
fornecer esse recurso, existe algum algoritmo específico que possa ser usado especialmente para "salvar em"? Eu não entendi como salvar uma cópia da área de sobreposição pode ser usado mais tarde, especialmente quando você tem várias sobreposições =) Minha mente já está explodindo! Esses deltas podem ser usados para reconstruir a pilha?
Se não, ele redesenha cada uma das janelas empilhadas uma a uma no caso de uma remoção aleatória da janela? A Wikipédia diz o seguinte:
O empilhamento é um processo relativamente lento, exigindo o redesenho de cada janela uma a uma, desde a mais traseira e externa até a frontal e interna. Muitos gerenciadores de janelas de empilhamento nem sempre redesenham as janelas de fundo. Outros podem detectar quando um redesenho de todas as janelas é necessário, pois alguns aplicativos solicitam empilhamento quando sua saída é alterada. O re-empilhamento geralmente é feito por meio de uma chamada de função para o gerenciador de janelas, que redesenha seletivamente as janelas conforme necessário. Por exemplo, se uma janela de fundo for trazida para a frente, apenas essa janela deverá ser redesenhada.
PS: Eu sei que esta é uma grande pergunta, mas seria útil obter algumas dicas.
Ambos backing store e save under são atributos/sinalizadores que podem ser definidos ao criar uma janela com
XCreateWindow()
. No entanto, eles são apenas dicas para o servidor X11, não estão ativados por padrão e não valem a pena com hardware moderno.Geralmente, quando (parte de) uma janela de fundo se torna visível, o servidor X11 envia um
Expose
evento para o cliente X11, o que deve fazer com que ele seja redesenhado. Como essas são apenas dicas, o servidor X11 ainda pode enviar umExpose
mesmo que o cliente tenha configurado tanto.backing_store = Always
na janela quantoCWSaveUnder
nas janelas pop-up que abriu em cima dele.Existem também interfaces que permitem que um cliente consulte se o servidor implementa o armazenamento de backup e salva em:
XDoesBackingStore()
eXDoesSaveUnders()
.O gerenciador de janelas não tem nada a ver com tudo isso; ele não redesenha nenhuma janela (além da sua própria: as barras de título, botões de fechamento).
Os desktops mais populares usam a extensão XCOMPOSITE mais recente. Todo o conteúdo da janela é renderizado para buffers fora da tela, para que todos estejam disponíveis para o gerenciador de composição sem a necessidade de solicitar aplicativos para redesenhá-los.
Aqui está um trecho do site oficial :